|
|
1.1 ! root 1: /* ! 2: * $Source: /usr/src/kerberosIV/krb/RCS/get_admhst.c,v $ ! 3: * $Author: kfall $ ! 4: * ! 5: * Copyright 1985, 1986, 1987, 1988 by the Massachusetts Institute ! 6: * of Technology. ! 7: * ! 8: * For copying and distribution information, please see the file ! 9: * <mit-copyright.h>. ! 10: */ ! 11: ! 12: #ifndef lint ! 13: static char *rcsid_get_admhst_c = ! 14: "$Header: /usr/src/kerberosIV/krb/RCS/get_admhst.c,v 4.1 90/06/25 20:55:48 kfall Exp $"; ! 15: #endif /* lint */ ! 16: ! 17: #include <mit-copyright.h> ! 18: #include <stdio.h> ! 19: #include <des.h> ! 20: #include <krb.h> ! 21: #include <string.h> ! 22: ! 23: /* ! 24: * Given a Kerberos realm, find a host on which the Kerberos database ! 25: * administration server can be found. ! 26: * ! 27: * krb_get_admhst takes a pointer to be filled in, a pointer to the name ! 28: * of the realm for which a server is desired, and an integer n, and ! 29: * returns (in h) the nth administrative host entry from the configuration ! 30: * file (KRB_CONF, defined in "krb.h") associated with the specified realm. ! 31: * ! 32: * On error, get_admhst returns KFAILURE. If all goes well, the routine ! 33: * returns KSUCCESS. ! 34: * ! 35: * For the format of the KRB_CONF file, see comments describing the routine ! 36: * krb_get_krbhst(). ! 37: * ! 38: * This is a temporary hack to allow us to find the nearest system running ! 39: * a Kerberos admin server. In the long run, this functionality will be ! 40: * provided by a nameserver. ! 41: */ ! 42: ! 43: krb_get_admhst(h, r, n) ! 44: char *h; ! 45: char *r; ! 46: int n; ! 47: { ! 48: FILE *cnffile; ! 49: char tr[REALM_SZ]; ! 50: char linebuf[BUFSIZ]; ! 51: char scratch[64]; ! 52: register int i; ! 53: ! 54: if ((cnffile = fopen(KRB_CONF,"r")) == NULL) { ! 55: return(KFAILURE); ! 56: } ! 57: if (fgets(linebuf, BUFSIZ, cnffile) == NULL) { ! 58: /* error reading */ ! 59: (void) fclose(cnffile); ! 60: return(KFAILURE); ! 61: } ! 62: if (!index(linebuf, '\n')) { ! 63: /* didn't all fit into buffer, punt */ ! 64: (void) fclose(cnffile); ! 65: return(KFAILURE); ! 66: } ! 67: for (i = 0; i < n; ) { ! 68: /* run through the file, looking for admin host */ ! 69: if (fgets(linebuf, BUFSIZ, cnffile) == NULL) { ! 70: (void) fclose(cnffile); ! 71: return(KFAILURE); ! 72: } ! 73: /* need to scan for a token after 'admin' to make sure that ! 74: admin matched correctly */ ! 75: if (sscanf(linebuf, "%s %s admin %s", tr, h, scratch) != 3) ! 76: continue; ! 77: if (!strcmp(tr,r)) ! 78: i++; ! 79: } ! 80: (void) fclose(cnffile); ! 81: return(KSUCCESS); ! 82: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.