9047d12eb1beae67ce8d21569575fb8d204f616d
[openafs.git] / src / kauth / kalocalcell.c
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 #include <afsconfig.h>
11 #if defined(UKERNEL)
12 #include "../afs/param.h"
13 #else
14 #include <afs/param.h>
15 #endif
16
17 RCSID("$Header$");
18
19 #if defined(UKERNEL)
20 #include "../afs/pthread_glock.h"
21 #include "../afs/sysincludes.h"
22 #include "../afs/afsincludes.h"
23 #include "../afs/afs_usrops.h"
24 #include "../afs/cellconfig.h"
25 #include "../afs/pthread_glock.h"
26 #include "../rx/xdr.h"
27 #include "../rx/rx.h"
28 #include "../afsint/kauth.h"
29 #include "../afs/kautils.h"
30 #include "../afs/afsutil.h"
31 #else /* defined(UKERNEL) */
32 #include <afs/pthread_glock.h>
33 #include <sys/types.h>
34 #ifdef AFS_NT40_ENV
35 #include <winsock2.h>
36 #else
37 #include <netinet/in.h>
38 #endif
39 #include <afs/cellconfig.h>
40 #include <rx/xdr.h>
41 #include <rx/rx.h>
42 #include "kauth.h"
43 #include "kautils.h"
44 #include <afs/afsutil.h>
45 #endif /* defined(UKERNEL) */
46
47 /* This is a utility routine that many parts of kauth use but it invokes the
48    afsconf package so its best to have it in a separate .o file to make the
49    linker happy. */
50
51 static struct afsconf_dir *conf = 0;
52 static char cell_name[MAXCELLCHARS];
53
54 int ka_CellConfig (const char *dir)
55 {
56     int code;
57 #ifdef UKERNEL
58     conf = afs_cdir;
59     strcpy(cell_name, afs_LclCellName);
60     return 0;
61 #else /* UKERNEL */
62     LOCK_GLOBAL_MUTEX
63     if (conf) afsconf_Close(conf);
64     conf = afsconf_Open (dir);
65     if (!conf) {
66         UNLOCK_GLOBAL_MUTEX
67         return KANOCELLS;
68     }
69     code = afsconf_GetLocalCell (conf, cell_name, sizeof(cell_name));
70     UNLOCK_GLOBAL_MUTEX
71     return code;
72 #endif /* UKERNEL */
73 }
74
75 char *ka_LocalCell (void)
76 {   
77   int code;
78
79     LOCK_GLOBAL_MUTEX
80     if (conf) {
81         UNLOCK_GLOBAL_MUTEX
82         return cell_name;
83     }
84
85 #ifdef UKERNEL
86     conf = afs_cdir;
87     strcpy(cell_name, afs_LclCellName);
88 #else /* UKERNEL */
89     if (conf = afsconf_Open (AFSDIR_CLIENT_ETC_DIRPATH)) {
90         code = afsconf_GetLocalCell (conf, cell_name, sizeof(cell_name));
91 /* leave conf open so we can lookup other cells */
92 /* afsconf_Close (conf); */
93     }
94     if (!conf || code) {
95         printf("** Can't determine local cell name!\n");
96         conf = 0;
97         UNLOCK_GLOBAL_MUTEX
98         return 0;
99     }
100 #endif /* UKERNEL */
101     UNLOCK_GLOBAL_MUTEX
102     return cell_name;
103 }
104
105 int ka_ExpandCell (
106   char *cell,
107   char *fullCell,
108   int  *alocal)
109 {
110     int  local = 0;
111     int  code;
112     char cellname[MAXKTCREALMLEN];
113     struct afsconf_cell cellinfo;       /* storage for cell info */
114
115     LOCK_GLOBAL_MUTEX
116     ka_LocalCell();                     /* initialize things */
117     if (!conf) {
118         UNLOCK_GLOBAL_MUTEX
119         return KANOCELLS;
120     }
121
122     if ((cell == 0) || (strlen(cell) == 0)) {
123         local = 1;
124         cell = cell_name;
125     } else {
126         cell = lcstring (cellname, cell, sizeof(cellname));
127         code = afsconf_GetCellInfo (conf, cell, 0, &cellinfo);
128         if (code) {
129             UNLOCK_GLOBAL_MUTEX
130             return KANOCELL;
131         }
132         cell = cellinfo.name;
133     }
134     if (strcmp (cell, cell_name) == 0) local = 1;
135
136     if (fullCell) strcpy (fullCell, cell);
137     if (alocal) *alocal = local;
138     UNLOCK_GLOBAL_MUTEX
139     return 0;
140 }    
141
142 int ka_CellToRealm (
143   char *cell,
144   char *realm,
145   int  *local)
146 {
147     int code;
148
149     LOCK_GLOBAL_MUTEX
150     code = ka_ExpandCell (cell, realm, local);
151     ucstring (realm, realm, MAXKTCREALMLEN);
152     UNLOCK_GLOBAL_MUTEX
153     return code;
154 }