summaryrefslogtreecommitdiffstats
path: root/src/lib
diff options
context:
space:
mode:
authorJohn Kohl <jtkohl@mit.edu>1990-04-19 18:10:48 +0000
committerJohn Kohl <jtkohl@mit.edu>1990-04-19 18:10:48 +0000
commit43be8ab919db3b13861f0cd6f04fc51e6cf35cf1 (patch)
tree4c9ebc7bb171a0cdfa821e1da0957a274b2e4ba4 /src/lib
parent18374d84d59b357e287da1ad036268c5d2e4dc5f (diff)
downloadkrb5-43be8ab919db3b13861f0cd6f04fc51e6cf35cf1.tar.gz
krb5-43be8ab919db3b13861f0cd6f04fc51e6cf35cf1.tar.xz
krb5-43be8ab919db3b13861f0cd6f04fc51e6cf35cf1.zip
*** empty log message ***
git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@531 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/krb5/os/free_hstrl.c35
-rw-r--r--src/lib/krb5/os/hst_realm.c167
2 files changed, 202 insertions, 0 deletions
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/copyright.h>.
+ *
+ * krb5_free_host_realm()
+ */
+
+#if !defined(lint) && !defined(SABER)
+static char rcsid_free_hstrl_c[] =
+"$Id$";
+#endif /* !lint & !SABER */
+
+#include <krb5/copyright.h>
+#include <krb5/krb5.h>
+
+#include <krb5/ext-proto.h>
+#include <stdio.h>
+#include <krb5/libos-proto.h>
+
+/*
+ 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/copyright.h>.
+ *
+ * krb5_get_host_realm()
+ */
+
+#if !defined(lint) && !defined(SABER)
+static char rcsid_hst_realm_c[] =
+"$Id$";
+#endif /* !lint & !SABER */
+
+#include <krb5/copyright.h>
+
+/*
+ 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 <krb5/krb5.h>
+#include <krb5/krb5_err.h>
+#include <krb5/ext-proto.h>
+#include <stdio.h>
+#include <krb5/libos-proto.h>
+#include <errno.h>
+#include <ctype.h>
+#include <sys/param.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_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;
+}