freebsd-nq/eBones/lib/libkrb/getrealm.c
1997-02-22 14:40:44 +00:00

107 lines
2.5 KiB
C

/*
* Copyright 1988 by the Massachusetts Institute of Technology.
* For copying and distribution information, please see the file
* <Copyright.MIT>.
*
* routine to convert hostname into realm name.
*
* from: getrealm.c,v 4.6 90/01/02 13:35:56 jtkohl Exp $
* $Id$
*/
#if 0
#ifndef lint
static char rcsid[] =
"$Id$";
#endif lint
#endif
#include <strings.h>
#include <stdio.h>
#include <ctype.h>
#include <krb.h>
#include <sys/param.h>
/* for Ultrix and friends ... */
#ifndef MAXHOSTNAMELEN
#define MAXHOSTNAMELEN 64
#endif
/*
* krb_realmofhost.
* Given a fully-qualified domain-style primary host name,
* return the name of the Kerberos realm for the host.
* If the hostname contains no discernable domain, or an error occurs,
* return the local realm name, as supplied by get_krbrlm().
* If the hostname contains a domain, but no translation is found,
* the hostname's domain is converted to upper-case and returned.
*
* The format of each line of the translation file is:
* domain_name kerberos_realm
* -or-
* host_name kerberos_realm
*
* domain_name should be of the form .XXX.YYY (e.g. .LCS.MIT.EDU)
* host names should be in the usual form (e.g. FOO.BAR.BAZ)
*/
static char ret_realm[REALM_SZ+1];
char *
krb_realmofhost(host)
char *host;
{
char *domain;
FILE *trans_file;
char trans_host[MAXHOSTNAMELEN+1];
char trans_realm[REALM_SZ+1];
int retval;
domain = index(host, '.');
/* prepare default */
if (domain) {
char *cp;
strncpy(ret_realm, &domain[1], REALM_SZ);
ret_realm[REALM_SZ] = '\0';
/* Upper-case realm */
for (cp = ret_realm; *cp; cp++)
if (islower(*cp))
*cp = toupper(*cp);
} else {
krb_get_lrealm(ret_realm, 1);
}
if ((trans_file = fopen(KRB_RLM_TRANS, "r")) == (FILE *) 0) {
/* krb_errno = KRB_NO_TRANS */
return(ret_realm);
}
while (1) {
if ((retval = fscanf(trans_file, "%s %s",
trans_host, trans_realm)) != 2) {
if (retval == EOF) {
fclose(trans_file);
return(ret_realm);
}
continue; /* ignore broken lines */
}
trans_host[MAXHOSTNAMELEN] = '\0';
trans_realm[REALM_SZ] = '\0';
if (!strcasecmp(trans_host, host)) {
/* exact match of hostname, so return the realm */
(void) strcpy(ret_realm, trans_realm);
fclose(trans_file);
return(ret_realm);
}
if ((trans_host[0] == '.') && domain) {
/* this is a domain match */
if (!strcasecmp(trans_host, domain)) {
/* domain match, save for later */
(void) strcpy(ret_realm, trans_realm);
continue;
}
}
}
}