*** empty log message ***
authorJohn Kohl <jtkohl@mit.edu>
Thu, 21 Mar 1991 13:26:06 +0000 (13:26 +0000)
committerJohn Kohl <jtkohl@mit.edu>
Thu, 21 Mar 1991 13:26:06 +0000 (13:26 +0000)
git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@1937 dc483132-0cff-0310-8789-dd5450dbe970

src/lib/krb5/os/sn2princ.c [new file with mode: 0644]

diff --git a/src/lib/krb5/os/sn2princ.c b/src/lib/krb5/os/sn2princ.c
new file mode 100644 (file)
index 0000000..cd9dcc7
--- /dev/null
@@ -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
+ * <krb5/copyright.h>.
+ *
+ * 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 <krb5/krb5.h>
+#include <krb5/ext-proto.h>
+#include <krb5/los-proto.h>
+#include <netdb.h>
+#include <ctype.h>
+
+#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;
+}
+