adding krb5_get_realm_domain()
authorTom Yu <tlyu@mit.edu>
Thu, 9 Jun 1994 07:20:41 +0000 (07:20 +0000)
committerTom Yu <tlyu@mit.edu>
Thu, 9 Jun 1994 07:20:41 +0000 (07:20 +0000)
git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@3685 dc483132-0cff-0310-8789-dd5450dbe970

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

index 39bc9e92b3f5a0c38f3d29c2e4a3ebb29e1e9a5d..e5a3985d6bffcee17ed3ae7047fb64ea9a5e77ca 100644 (file)
@@ -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 (file)
index 0000000..e7142b1
--- /dev/null
@@ -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 <krb5/krb5.h>
+#include <krb5/ext-proto.h>
+#include <krb5/los-proto.h>
+#include <krb5/sysincl.h>
+#include <ctype.h>
+
+#include <stdio.h>
+
+/* 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;
+       }
+    }
+}