Initial import from FreeBSD RELENG_4:
[dragonfly.git] / crypto / kerberosIV / lib / krb / get_krbrlm.c
1 /*
2  * Copyright (c) 1995, 1996, 1997, 1998 Kungliga Tekniska Högskolan
3  * (Royal Institute of Technology, Stockholm, Sweden). 
4  * All rights reserved. 
5  *
6  * Redistribution and use in source and binary forms, with or without 
7  * modification, are permitted provided that the following conditions 
8  * are met: 
9  *
10  * 1. Redistributions of source code must retain the above copyright 
11  *    notice, this list of conditions and the following disclaimer. 
12  *
13  * 2. Redistributions in binary form must reproduce the above copyright 
14  *    notice, this list of conditions and the following disclaimer in the 
15  *    documentation and/or other materials provided with the distribution. 
16  *
17  * 3. Neither the name of the Institute nor the names of its contributors 
18  *    may be used to endorse or promote products derived from this software 
19  *    without specific prior written permission. 
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
31  * SUCH DAMAGE. 
32  */
33
34 #include "krb_locl.h"
35
36 RCSID("$Id: get_krbrlm.c,v 1.25 1999/12/02 16:58:41 joda Exp $");
37
38 /*
39  * krb_get_lrealm takes a pointer to a string, and a number, n.  It fills
40  * in the string, r, with the name of the nth realm specified on the
41  * first line of the kerberos config file (KRB_CONF, defined in "krb.h").
42  * It returns 0 (KSUCCESS) on success, and KFAILURE on failure.  If the
43  * config file does not exist, and if n=1, a successful return will occur
44  * with r = KRB_REALM (also defined in "krb.h").
45  *
46  * For the format of the KRB_CONF file, see comments describing the routine
47  * krb_get_krbhst().
48  */
49
50 static int
51 krb_get_lrealm_f(char *r, int n, const char *fname)
52 {
53     char buf[1024];
54     char *p;
55     int nchar;
56     FILE *f;
57     int ret = KFAILURE;
58
59     if (n < 0)
60         return KFAILURE;
61     if(n == 0)
62         n = 1;
63
64     f = fopen(fname, "r");
65     if (f == 0)
66         return KFAILURE;
67
68     for (; n > 0; n--)
69         if (fgets(buf, sizeof(buf), f) == 0)
70             goto done;
71
72     /* We now have the n:th line, remove initial white space. */
73     p = buf + strspn(buf, " \t");
74
75     /* Collect realmname. */
76     nchar    = strcspn(p, " \t\n");
77     if (nchar == 0 || nchar > REALM_SZ)
78         goto done;              /* No realmname */
79     strncpy(r, p, nchar);
80     r[nchar] = 0;
81
82     /* Does more junk follow? */
83     p += nchar;
84     nchar = strspn(p, " \t\n");
85     if (p[nchar] == 0)
86         ret = KSUCCESS;         /* This was a realm name only line. */
87
88   done:
89     fclose(f);
90     return ret;
91 }
92
93 static const char *no_default_realm = "NO.DEFAULT.REALM";
94
95 int
96 krb_get_lrealm(char *r, int n)
97 {
98     int i;
99     char file[MaxPathLen];
100
101     for (i = 0; krb_get_krbconf(i, file, sizeof(file)) == 0; i++)
102         if (krb_get_lrealm_f(r, n, file) == KSUCCESS)
103             return KSUCCESS;
104
105     /* When nothing else works try default realm */
106     if (n == 1) {
107       char *t = krb_get_default_realm();
108
109       if (strcmp(t, no_default_realm) == 0)
110         return KFAILURE;        /* Can't figure out default realm */
111
112       strcpy(r, t);
113       return KSUCCESS;
114     }
115     else
116         return(KFAILURE);
117 }
118
119 /* Returns local realm if that can be figured out else NO.DEFAULT.REALM */
120 char *
121 krb_get_default_realm(void)
122 {
123     static char local_realm[REALM_SZ]; /* Local kerberos realm */
124     
125     if (local_realm[0] == 0) {
126         char *t, hostname[MaxHostNameLen];
127
128         strlcpy(local_realm, no_default_realm, 
129                         sizeof(local_realm)); /* Provide default */
130
131         gethostname(hostname, sizeof(hostname));
132         t = krb_realmofhost(hostname);
133         if (t && strcmp(t, no_default_realm) != 0)
134             strlcpy(local_realm, t, sizeof(local_realm));
135     }
136     return local_realm;
137 }