From: John Kohl Date: Thu, 21 Mar 1991 13:26:06 +0000 (+0000) Subject: *** empty log message *** X-Git-Tag: krb5-1.0-alpha4~36 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=60d6be4ef6caf2612548556be5db19afd761c0f1;p=krb5.git *** empty log message *** git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@1937 dc483132-0cff-0310-8789-dd5450dbe970 --- diff --git a/src/lib/krb5/os/sn2princ.c b/src/lib/krb5/os/sn2princ.c new file mode 100644 index 000000000..cd9dcc7f1 --- /dev/null +++ b/src/lib/krb5/os/sn2princ.c @@ -0,0 +1,106 @@ +/* + * $Source$ + * $Author$ + * + * Copyright 1991 by the Massachusetts Institute of Technology. + * All Rights Reserved. + * + * For copying and distribution information, please see the file + * . + * + * Convert a hostname and service name to a principal in the "standard" + * form. + */ + +#if !defined(lint) && !defined(SABER) +static char rcsid_modulsn2princ_c[] = +"$Id$"; +#endif /* !lint & !SABER */ + +#include +#include +#include +#include +#include + +#ifndef HAVE_STRDUP +static char * +strdup(s) +register char *s; +{ + register char *ret; + if (ret = (char *)malloc(strlen(s)+1)) + strcpy(ret, s); + return(ret); +} +#endif + +krb5_error_code +krb5_sname_to_principal(hostname, sname, ret_princ) +const char *hostname; +const char *sname; +krb5_principal *ret_princ; +{ + krb5_principal lprinc; + struct hostent *hp; + char **hrealms, *remote_host; + krb5_error_code retval; + register char **cpp, *cp; + + if (!(hp = gethostbyname(hostname))) + return KRB5_ERR_BAD_HOSTNAME; + + /* copy the hostname into non-volatile storage */ + remote_host = malloc(strlen(hp->h_name) + 1); + if (!remote_host) + return ENOMEM; + (void) strcpy(remote_host, hp->h_name); + + for (cp = remote_host; *cp; cp++) + if (isupper(*cp)) + *cp = tolower(*cp); + + if (retval = krb5_get_host_realm(remote_host, &hrealms)) { + free(remote_host); + return retval; + } + if (!hrealms[0]) { + free(remote_host); + xfree(hrealms); + return KRB5_ERR_HOST_REALM_UNKNOWN; + } + if (!(lprinc = (krb5_principal) calloc(4, sizeof(*lprinc)))) { + free(remote_host); + krb5_free_host_realm(hrealms); + return ENOMEM; + } + if (!(lprinc[0] = (krb5_data *)malloc(sizeof(*lprinc[0])))) { + krb5_free_host_realm(hrealms); + nomem: + free(remote_host); + krb5_free_principal(lprinc); + return ENOMEM; + } + lprinc[0]->data = hrealms[0]; + lprinc[0]->length = strlen(hrealms[0]); + + /* they're allocated; leave the first one alone, however */ + for (cpp = &hrealms[1]; *cpp; cpp++) + xfree(*cpp); + xfree(hrealms); + + if (!(lprinc[1] = (krb5_data *)malloc(sizeof(*lprinc[1])))) { + goto nomem; + } + lprinc[1]->length = strlen(sname); + lprinc[1]->data = strdup(sname); + if (!(lprinc[2] = (krb5_data *)malloc(sizeof(*lprinc[2])))) { + goto nomem; + } + lprinc[2]->length = strlen(remote_host); + lprinc[2]->data = remote_host; + + *ret_princ = lprinc; + return 0; +} +