get_admhst.c revision 7c478bd95313f5f23a4c958a745db2134aa03244
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov#pragma ident "%Z%%M% %I% %E% SMI"
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov/*
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov *
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov * Openvision retains the copyright to derivative works of
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov * this source code. Do *NOT* create a derivative of this
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov * source code before consulting with your legal department.
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov * Do *NOT* integrate *ANY* of this source code into another
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov * product before consulting with your legal department.
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov *
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov * For further information, read the top-level Openvision
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov * copyright which is contained in the top-level MIT Kerberos
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov * copyright.
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov *
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov *
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov */
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov/*
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov * $Source: /afs/athena.mit.edu/astaff/project/krbdev/.cvsroot/src/lib/kadm5/get_admhst.c,v $
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov * $Author: marc $
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov *
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov * Copyright 1985, 1986, 1987, 1988 by the Massachusetts Institute
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov * of Technology.
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov *
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov * For copying and distribution information, please see the file
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov * <mit-copyright.h>.
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov */
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov#ifndef lint
62dadd654b88164ac263978699c78aa01647a39bYuri Pankovstatic char *rcsid =
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov"$Header: /cvs/krbdev/krb5/src/lib/kadm5/get_admhst.c,v 1.8 1996/07/22 20:36:00 marc Exp $";
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov#endif /* lint */
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov#include <stdio.h>
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov#include <krb5/osconf.h>
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov#include <string.h>
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov/*
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov * Given a Kerberos realm, find a host on which the Kerberos database
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov * administration server can be found.
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov *
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov * krb5_get_admhst takes a pointer to be filled in, a pointer to the name
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov * of the realm for which a server is desired, and an integer n, and
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov * returns (in h) the nth administrative host entry from the configuration
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov * file DEFAULT_CONFIG_FILENAME.
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov *
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov * If the realm is NULL, the default realm is used.
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov *
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov * On error, get_admhst returns 0. If all goes well, the routine
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov * returns 1.
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov *
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov * This is a temporary hack to allow us to find the nearest system running
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov * a Kerberos admin server. In the long run, this functionality will be
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov * provided by a nameserver.
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov */
62dadd654b88164ac263978699c78aa01647a39bYuri Pankovint
62dadd654b88164ac263978699c78aa01647a39bYuri Pankovkrb5_get_admhst(char *h, char *r, int n)
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov{
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov FILE *cnffile;
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov char *realm = NULL;
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov char tr[BUFSIZ];
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov char linebuf[BUFSIZ];
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov char scratch[64];
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov register int i;
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov int ret;
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov if(r == NULL) {
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov if((ret = krb5_get_default_realm(&realm)) != 0)
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov return ret;
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov r = realm;
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov }
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov if ((cnffile = fopen(DEFAULT_CONFIG_FILENAME, "r")) == NULL) {
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov return(0);
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov }
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov if (fgets(linebuf, BUFSIZ, cnffile) == NULL) {
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov /* error reading */
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov (void) fclose(cnffile);
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov return(0);
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov }
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov if (!strchr(linebuf, '\n')) {
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov /* didn't all fit into buffer, punt */
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov (void) fclose(cnffile);
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov if(realm)
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov free(realm);
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov return(0);
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov }
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov for (i = 0; i < n; ) {
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov /* run through the file, looking for admin host */
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov if (fgets(linebuf, BUFSIZ, cnffile) == NULL) {
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov (void) fclose(cnffile);
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov if(realm)
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov free(realm);
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov return(0);
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov }
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov /* need to scan for a token after 'admin' to make sure that
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov admin matched correctly */
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov if (sscanf(linebuf, "%s %s admin %s", tr, h, scratch) != 3)
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov continue;
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov if (!strcmp(tr,r))
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov i++;
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov }
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov (void) fclose(cnffile);
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov if(realm)
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov free(realm);
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov return(1);
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov}
62dadd654b88164ac263978699c78aa01647a39bYuri Pankov