From: Tom Yu Date: Thu, 9 Jun 1994 07:20:41 +0000 (+0000) Subject: adding krb5_get_realm_domain() X-Git-Tag: krb5-1.0-beta4~166 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=e007c64e82c6e6fc0a734e0057da57a95183c3e2;p=krb5.git adding krb5_get_realm_domain() git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@3685 dc483132-0cff-0310-8789-dd5450dbe970 --- diff --git a/src/lib/krb5/os/Imakefile b/src/lib/krb5/os/Imakefile index 39bc9e92b..e5a3985d6 100644 --- a/src/lib/krb5/os/Imakefile +++ b/src/lib/krb5/os/Imakefile @@ -47,6 +47,7 @@ OBJS= \ port2ip.o \ read_msg.o \ read_pwd.o \ + realm_dom.o \ sendto_kdc.o \ sn2princ.o \ timeofday.o \ @@ -76,6 +77,7 @@ SRCS= \ $(SRCDIR)osconfig.c \ $(SRCDIR)read_msg.c \ $(SRCDIR)read_pwd.c \ + $(SRCDIR)realm_dom.c \ $(SRCDIR)port2ip.c \ $(SRCDIR)sendto_kdc.c \ $(SRCDIR)sn2princ.c \ diff --git a/src/lib/krb5/os/realm_dom.c b/src/lib/krb5/os/realm_dom.c new file mode 100644 index 000000000..e7142b1d9 --- /dev/null +++ b/src/lib/krb5/os/realm_dom.c @@ -0,0 +1,129 @@ +/* + * $Source$ + * $Author$ + * + * Copyright 1990,1991 by the Massachusetts Institute of Technology. + * All Rights Reserved. + * + * Export of this software from the United States of America may + * require a specific license from the United States Government. + * It is the responsibility of any person or organization contemplating + * export to obtain such a license before exporting. + * + * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and + * distribute this software and its documentation for any purpose and + * without fee is hereby granted, provided that the above copyright + * notice appear in all copies and that both that copyright notice and + * this permission notice appear in supporting documentation, and that + * the name of M.I.T. not be used in advertising or publicity pertaining + * to distribution of the software without specific, written prior + * permission. M.I.T. makes no representations about the suitability of + * this software for any purpose. It is provided "as is" without express + * or implied warranty. + * + * + * krb5_get_realm_domain() + */ + +#if !defined(lint) && !defined(SABER) +static char rcsid_hst_realm_c[] = +"$Id$"; +#endif /* !lint & !SABER */ + +/* + * Determines the proper domain name for a realm. This is mainly so that + * a krb4 principal can be converted properly into a krb5 principal. + * Currently, the same style of mapping file used in krb4. + * + * If realm is NULL, this function will assume the default realm + * of the local host. + * + * The returned domain is allocated, and must be freed by the caller. + * + * This was hacked together from krb5_get_host_realm(). + */ + +#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_realm_domain(realm, domain) + const char *realm; + char **domain; +{ + char **realmlist = NULL; + char *retdomain = NULL; + char trans_host[MAXHOSTNAMELEN+1]; + char trans_realm[DEF_REALMNAME_SIZE]; + krb5_error_code retval; + FILE *trans_file; + int scanval; + char scanstring[7+2*16]; /* 7 chars + 16 for each decimal + conversion */ + + if (realm == NULL) { + if (retval = krb5_get_host_realm(NULL, &realmlist)) + return retval; + realm = realmlist[0]; + } + if ((trans_file = fopen(krb5_trans_file, "r")) == (FILE *) 0) { + if (realmlist != NULL) { + krb5_xfree(realmlist[0]); + krb5_xfree(realmlist); + } + 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); + if (realmlist != NULL) { + krb5_xfree(realmlist[0]); + krb5_xfree(realmlist); + } + *domain = NULL; + return 0; + } + continue; + } + trans_host[sizeof(trans_host)-1] = '\0'; + trans_realm[sizeof(trans_realm)-1] = '\0'; + if (!strcmp(trans_realm, realm)) { + if (trans_host[0] == '.') { + if ((retdomain = malloc(strlen(trans_realm) + 1)) == NULL) { + if (realmlist != NULL) { + krb5_xfree(realmlist[0]); + krb5_xfree(realmlist); + } + return ENOMEM; + } + (void)strcpy(retdomain, trans_host); + fclose(trans_file); + if (realmlist != NULL) { + krb5_xfree(realmlist[0]); + krb5_xfree(realmlist); + } + *domain = retdomain; + return 0; + } else + continue; + } + } +}