summaryrefslogtreecommitdiffstats
path: root/crypto/kerberosIV/lib/krb/get_krbrlm.c
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/kerberosIV/lib/krb/get_krbrlm.c')
-rw-r--r--crypto/kerberosIV/lib/krb/get_krbrlm.c182
1 files changed, 104 insertions, 78 deletions
diff --git a/crypto/kerberosIV/lib/krb/get_krbrlm.c b/crypto/kerberosIV/lib/krb/get_krbrlm.c
index 8c5b0c9..9c675f6 100644
--- a/crypto/kerberosIV/lib/krb/get_krbrlm.c
+++ b/crypto/kerberosIV/lib/krb/get_krbrlm.c
@@ -1,27 +1,44 @@
-/*
- Copyright (C) 1989 by the Massachusetts Institute of Technology
-
- Export of this software from the United States of America is assumed
- to 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.
-
- */
+/*
+ * Copyright (c) 1995, 1996, 1997, 1998 Kungliga Tekniska Högskolan
+ * (Royal Institute of Technology, Stockholm, Sweden).
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Kungliga Tekniska
+ * Högskolan and its contributors.
+ *
+ * 4. Neither the name of the Institute nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
#include "krb_locl.h"
-RCSID("$Id: get_krbrlm.c,v 1.16 1997/05/02 01:26:22 assar Exp $");
+RCSID("$Id: get_krbrlm.c,v 1.22.2.1 1999/09/02 08:51:04 joda Exp $");
/*
* krb_get_lrealm takes a pointer to a string, and a number, n. It fills
@@ -31,9 +48,6 @@ RCSID("$Id: get_krbrlm.c,v 1.16 1997/05/02 01:26:22 assar Exp $");
* config file does not exist, and if n=1, a successful return will occur
* with r = KRB_REALM (also defined in "krb.h").
*
- * NOTE: for archaic & compatibility reasons, this routine will only return
- * valid results when n = 1.
- *
* For the format of the KRB_CONF file, see comments describing the routine
* krb_get_krbhst().
*/
@@ -41,76 +55,88 @@ RCSID("$Id: get_krbrlm.c,v 1.16 1997/05/02 01:26:22 assar Exp $");
static int
krb_get_lrealm_f(char *r, int n, const char *fname)
{
+ char buf[1024];
+ char *p;
+ int nchar;
FILE *f;
int ret = KFAILURE;
+
+ if (n < 0)
+ return KFAILURE;
+ if(n == 0)
+ n = 1;
+
f = fopen(fname, "r");
- if(f){
- char buf[REALM_SZ];
- if(fgets(buf, sizeof(buf), f)){
- char *p = buf + strspn(buf, " \t");
- p[strcspn(p, " \t\r\n")] = 0;
- p[REALM_SZ - 1] = 0;
- strcpy(r, p);
- ret = KSUCCESS;
- }
- fclose(f);
- }
+ if (f == 0)
+ return KFAILURE;
+
+ for (; n > 0; n--)
+ if (fgets(buf, sizeof(buf), f) == 0)
+ goto done;
+
+ /* We now have the n:th line, remove initial white space. */
+ p = buf + strspn(buf, " \t");
+
+ /* Collect realmname. */
+ nchar = strcspn(p, " \t\n");
+ if (nchar == 0 || nchar > REALM_SZ)
+ goto done; /* No realmname */
+ strncpy(r, p, nchar);
+ r[nchar] = 0;
+
+ /* Does more junk follow? */
+ p += nchar;
+ nchar = strspn(p, " \t\n");
+ if (p[nchar] == 0)
+ ret = KSUCCESS; /* This was a realm name only line. */
+
+ done:
+ fclose(f);
return ret;
}
+static const char *no_default_realm = "NO.DEFAULT.REALM";
+
int
krb_get_lrealm(char *r, int n)
{
- static const char *const files[] = KRB_CNF_FILES;
- int i;
-
- const char *dir = getenv("KRBCONFDIR");
-
- if (n > 1)
- return(KFAILURE); /* Temporary restriction */
-
- /* First try user specified file */
- if (dir != 0) {
- char fname[MaxPathLen];
- if(k_concat(fname, sizeof(fname), dir, "/krb.conf", NULL) == 0)
- if (krb_get_lrealm_f(r, n, fname) == KSUCCESS)
+ int i;
+ char file[MaxPathLen];
+
+ for (i = 0; krb_get_krbconf(i, file, sizeof(file)) == 0; i++)
+ if (krb_get_lrealm_f(r, n, file) == KSUCCESS)
return KSUCCESS;
- }
- for (i = 0; files[i] != 0; i++)
- if (krb_get_lrealm_f(r, n, files[i]) == KSUCCESS)
- return KSUCCESS;
+ /* When nothing else works try default realm */
+ if (n == 1) {
+ char *t = krb_get_default_realm();
+
+ if (strcmp(t, no_default_realm) == 0)
+ return KFAILURE; /* Can't figure out default realm */
- /* If nothing else works try LOCALDOMAIN, if it exists */
- if (n == 1)
- {
- char *t, hostname[MaxHostNameLen];
- k_gethostname(hostname, sizeof(hostname));
- t = krb_realmofhost(hostname);
- if (t) {
- strcpy (r, t);
- return KSUCCESS;
- }
- t = strchr(hostname, '.');
- if (t == 0)
- return KFAILURE; /* No domain part, you loose */
-
- t++; /* Skip leading dot and upcase the rest */
- for (; *t; t++, r++)
- *r = toupper(*t);
- *r = 0;
- return(KSUCCESS);
+ strcpy(r, t);
+ return KSUCCESS;
}
- else
- return(KFAILURE);
+ else
+ return(KFAILURE);
}
-/* For SunOS5 compat. */
+/* Returns local realm if that can be figured out else NO.DEFAULT.REALM */
char *
krb_get_default_realm(void)
{
- static char local_realm[REALM_SZ]; /* local kerberos realm */
- if (krb_get_lrealm(local_realm, 1) != KSUCCESS)
- strcpy(local_realm, "NO.DEFAULT.REALM");
- return local_realm;
+ static char local_realm[REALM_SZ]; /* Local kerberos realm */
+
+ if (local_realm[0] == 0) {
+ char *t, hostname[MaxHostNameLen];
+
+ strcpy_truncate(local_realm, no_default_realm,
+ sizeof(local_realm)); /* Provide default */
+
+ gethostname(hostname, sizeof(hostname));
+ t = krb_realmofhost(hostname);
+ if (t && strcmp(t, no_default_realm) != 0)
+ strcpy_truncate(local_realm, t, sizeof(local_realm));
+ }
+ return local_realm;
}
OpenPOWER on IntegriCloud