From 43be8ab919db3b13861f0cd6f04fc51e6cf35cf1 Mon Sep 17 00:00:00 2001 From: John Kohl Date: Thu, 19 Apr 1990 18:10:48 +0000 Subject: [PATCH] *** empty log message *** git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@531 dc483132-0cff-0310-8789-dd5450dbe970 --- src/lib/krb5/os/free_hstrl.c | 35 ++++++++ src/lib/krb5/os/hst_realm.c | 167 +++++++++++++++++++++++++++++++++++ 2 files changed, 202 insertions(+) create mode 100644 src/lib/krb5/os/free_hstrl.c create mode 100644 src/lib/krb5/os/hst_realm.c diff --git a/src/lib/krb5/os/free_hstrl.c b/src/lib/krb5/os/free_hstrl.c new file mode 100644 index 000000000..fa9f73495 --- /dev/null +++ b/src/lib/krb5/os/free_hstrl.c @@ -0,0 +1,35 @@ +/* + * $Source$ + * $Author$ + * + * Copyright 1990 by the Massachusetts Institute of Technology. + * + * For copying and distribution information, please see the file + * . + * + * krb5_free_host_realm() + */ + +#if !defined(lint) && !defined(SABER) +static char rcsid_free_hstrl_c[] = +"$Id$"; +#endif /* !lint & !SABER */ + +#include +#include + +#include +#include +#include + +/* + Frees the storage taken by a realm list returned by krb5_get_local_realm. + */ + +krb5_error_code +krb5_free_host_realm(realmlist) +char * const *realmlist; +{ + /* same format, so why duplicate code? */ + return krb5_free_krbhst(realmlist); +} diff --git a/src/lib/krb5/os/hst_realm.c b/src/lib/krb5/os/hst_realm.c new file mode 100644 index 000000000..92540d631 --- /dev/null +++ b/src/lib/krb5/os/hst_realm.c @@ -0,0 +1,167 @@ +/* + * $Source$ + * $Author$ + * + * Copyright 1990 by the Massachusetts Institute of Technology. + * + * For copying and distribution information, please see the file + * . + * + * krb5_get_host_realm() + */ + +#if !defined(lint) && !defined(SABER) +static char rcsid_hst_realm_c[] = +"$Id$"; +#endif /* !lint & !SABER */ + +#include + +/* + Figures out the Kerberos realm names for host, filling in a + pointer to an argv[] style list of names, terminated with a null pointer. + + If host is NULL, the local host's realms are determined. + + If there are no known realms for the host, the filled-in pointer is set + to NULL. + + The pointer array and strings pointed to are all in allocated storage, + and should be freed by the caller when finished. + + returns system errors +*/ + +/* + * Implementation notes: + * + * this implementation only provides one realm per host, using the same + * mapping file used in kerberos v4. + + * 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 krb5_get_default_realm(). + * 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) + */ + + +#include +#include +#include +#include +#include +#include +#include +#include + +/* for old Unixes and friends ... */ +#ifndef MAXHOSTNAMELEN +#define MAXHOSTNAMELEN 64 +#endif + +#define DEF_REALMNAME_SIZE 256 + +extern char *krb5_trans_file; + +krb5_error_code +krb5_get_host_realm(host, realmsp) +const char *host; +char ***realmsp; +{ + char **retrealms; + char *domain; + FILE *trans_file; + char trans_host[MAXHOSTNAMELEN+1]; + char trans_realm[DEF_REALMNAME_SIZE]; + krb5_error_code retval; + int scanval; + char scanstring[7+2*16]; /* 7 chars + 16 for each decimal + conversion */ + + if (!(retrealms = (char **)calloc(2, sizeof(*retrealms)))) + return ENOMEM; + domain = index(host, '.'); + + /* prepare default */ + if (domain) { + char *cp; + + if (!(retrealms[0] = malloc(strlen(&domain[1])+1))) { + xfree(retrealms); + return ENOMEM; + } + strcpy(retrealms[0], &domain[1]); + /* Upper-case realm */ + for (cp = retrealms[0]; *cp; cp++) + if (islower(*cp)) + *cp = toupper(*cp); + } else { + if (!(retrealms[0] = malloc(DEF_REALMNAME_SIZE))) { + xfree(retrealms); + return ENOMEM; + } + if (retval = krb5_get_default_realm(DEF_REALMNAME_SIZE-1, + retrealms[0])) { + xfree(retrealms[0]); + xfree(retrealms); + return retval; + } + } + + if ((trans_file = fopen(krb5_trans_file, "r")) == (FILE *) 0) { + xfree(retrealms[0]); + xfree(retrealms); + return KRB5_TRANS_CANTOPEN; + } + (void) sprintf(scanstring, "%%%ds %%%ds", + sizeof(trans_host)-1,sizeof(trans_realm)-1); + while (1) { + if ((scanval = fscanf(trans_file, scanstring, + trans_host, trans_realm)) != 2) { + if (scanval == EOF) { + fclose(trans_file); + goto out; + } + continue; /* ignore broken lines */ + } + trans_host[sizeof(trans_host)-1] = '\0'; + trans_realm[sizeof(trans_realm)-1] = '\0'; + if (!strcasecmp(trans_host, host)) { + /* exact match of hostname, so return the realm */ + if (!(retrealms[0] = realloc(retrealms[0], + strlen(trans_realm)+1))) { + xfree(retrealms); + return ENOMEM; + } + (void) strcpy(retrealms[0], trans_realm); + fclose(trans_file); + goto out; + } + if ((trans_host[0] == '.') && domain) { + /* this is a possible domain match */ + if (!strcasecmp(trans_host, domain)) { + /* domain match, save for later */ + if (!(retrealms[0] = realloc(retrealms[0], + strlen(trans_realm)+1))) { + xfree(retrealms); + return ENOMEM; + } + (void) strcpy(retrealms[0], trans_realm); + continue; + } + } + } + out: + *realmsp = retrealms; + return 0; +} -- 2.26.2