summaryrefslogtreecommitdiff
path: root/kerberosIV/krb/get_krbrlm.c
blob: 3498f486750996ff3a80e5e1019d72be57fbe468 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/*	$OpenBSD: get_krbrlm.c,v 1.12 1997/12/22 15:02:06 art Exp $	*/
/* $KTH: get_krbrlm.c,v 1.16 1997/05/02 01:26:22 assar Exp $ */

/*
 * This software may now be redistributed outside the US.
 *
 */

/* 
 *  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.
 *
 */

#include "krb_locl.h"

/*
 * krb_get_lrealm takes a pointer to a string, and a number, n.  It fills
 * in the string, r, with the name of the nth realm specified on the
 * first line of the kerberos config file (KRB_CONF, defined in "krb.h").
 * It returns 0 (KSUCCESS) on success, and KFAILURE on failure.  If the
 * 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().
 */

static int
krb_get_lrealm_f(char *r, int n, const char *fname)
{
    FILE *f;
    int ret = KFAILURE;
    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;
	    strncpy(r, p, REALM_SZ);
	    r[REALM_SZ-1] = '\0';
	    if (*p != '#')
		ret = KSUCCESS;
	}
	fclose(f);
    }
    return ret;
}

int
krb_get_lrealm(char *r, int n)
{
    int i;
    char file[MAXPATHLEN];
    
    if (n > 1)
	return(KFAILURE);		/* Temporary restriction */
    
    for (i = 0; krb_get_krbconf(i, file, sizeof(file)) == 0; i++)
	if (krb_get_lrealm_f(r, n, file) == KSUCCESS)
	    return KSUCCESS;
    
    if (r[0] == '#')
	return(KFAILURE);
    
    /* If nothing else works try LOCALDOMAIN, if it exists */
    if (n == 1) {
	char *t, hostname[MAXHOSTNAMELEN];
	gethostname(hostname, sizeof(hostname));
	t = krb_realmofhost(hostname);
	if (t != NULL) {
	    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 != '\0'; t++, r++)
	    *r = toupper(*t);
	*r = 0;
	return(KSUCCESS);
    }
    else
	return(KFAILURE);
}

/* For SunOS5 compat. */
char *
krb_get_default_realm(void)
{
    static char local_realm[REALM_SZ]; /* local kerberos realm */
    if (krb_get_lrealm(local_realm, 1) != KSUCCESS){
	strncpy(local_realm, "NO.DEFAULT.REALM", REALM_SZ);
	local_realm[REALM_SZ-1] = '\0';
    }
    return local_realm;
}