2 * Copyright 2000, International Business Machines Corporation and others.
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
10 #include <afsconfig.h>
11 #include "afs/param.h"
16 #include "afs/sysincludes.h" /* Standard vendor system headers */
17 #include "afsincludes.h" /* Afs-based standard headers */
18 #include "afs/afs_stats.h" /* afs statistics */
20 #include <sys/adspace.h> /* for vm_att(), vm_det() */
23 /* osi_Init -- do once per kernel installation initialization.
24 * -- On Solaris this is called from modload initialization.
25 * -- On AIX called from afs_config.
26 * -- On HP called from afsc_link.
27 * -- On SGI called from afs_init. */
29 afs_lock_t afs_ftf; /* flush text lock */
32 lock_t afs_event_lock;
39 struct AFS_UCRED *afs_osi_credp;
41 #if defined(AFS_SUN5_ENV) || defined(AFS_SGI_ENV)
42 kmutex_t afs_global_lock;
43 kmutex_t afs_rxglobal_lock;
46 #if defined(AFS_SGI_ENV) && !defined(AFS_SGI64_ENV)
47 long afs_global_owner;
50 #if defined(AFS_OSF_ENV)
51 simple_lock_data_t afs_global_lock;
54 #if defined(AFS_DARWIN_ENV)
55 #ifdef AFS_DARWIN80_ENV
56 lck_mtx_t *afs_global_lock;
58 struct lock__bsd__ afs_global_lock;
62 #if defined(AFS_XBSD_ENV) && !defined(AFS_FBSD50_ENV)
63 struct lock afs_global_lock;
64 struct proc *afs_global_owner;
67 struct mtx afs_global_mtx;
70 #if defined(AFS_OSF_ENV) || defined(AFS_DARWIN_ENV)
71 thread_t afs_global_owner;
72 #endif /* AFS_OSF_ENV */
74 #if defined(AFS_AIX41_ENV)
75 simple_lock_data afs_global_lock;
82 if (once++ > 0) /* just in case */
84 #if defined(AFS_HPUX_ENV)
86 #else /* AFS_HPUX_ENV */
87 #if defined(AFS_GLOBAL_SUNLOCK)
88 #if defined(AFS_SGI62_ENV)
89 mutex_init(&afs_global_lock, MUTEX_DEFAULT, "afs_global_lock");
90 #elif defined(AFS_OSF_ENV)
91 usimple_lock_init(&afs_global_lock);
92 afs_global_owner = (thread_t) 0;
93 #elif defined(AFS_FBSD50_ENV)
94 mtx_init(&afs_global_mtx, "AFS global lock", NULL, MTX_DEF);
95 #elif defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
96 #if !defined(AFS_DARWIN80_ENV)
97 lockinit(&afs_global_lock, PLOCK, "afs global lock", 0, 0);
100 #elif defined(AFS_AIX41_ENV)
101 lock_alloc((void *)&afs_global_lock, LOCK_ALLOC_PIN, 1, 1);
102 simple_lock_init((void *)&afs_global_lock);
103 #elif !defined(AFS_LINUX22_ENV)
104 /* Linux initialization in osi directory. Should move the others. */
105 mutex_init(&afs_global_lock, "afs_global_lock", MUTEX_DEFAULT, NULL);
107 #endif /* AFS_GLOBAL_SUNLOCK */
108 #endif /* AFS_HPUX_ENV */
110 if (!afs_osicred_initialized) {
111 #if defined(AFS_DARWIN80_ENV)
112 afs_osi_ctxtp_initialized = 0;
113 afs_osi_ctxtp = NULL; /* initialized in afs_Daemon since it has
114 a proc reference that cannot be changed */
116 #if defined(AFS_XBSD_ENV)
117 /* Can't just invent one, must use crget() because of mutex */
118 afs_osi_credp = crdup(osi_curcred());
120 memset(&afs_osi_cred, 0, sizeof(struct AFS_UCRED));
121 #if defined(AFS_LINUX26_ENV)
122 afs_osi_cred.cr_group_info = groups_alloc(0);
124 #if defined(AFS_DARWIN80_ENV)
125 afs_osi_cred.cr_ref = 1; /* kauth_cred_get_ref needs 1 existing ref */
127 crhold(&afs_osi_cred); /* don't let it evaporate */
130 afs_osi_credp = &afs_osi_cred;
132 afs_osicred_initialized = 1;
135 osi_flid.fl_pid = osi_flid.fl_sysid = 0;
138 init_et_to_sys_error();
141 /* mask signals in afsds */
143 afs_osi_MaskSignals(void)
145 #ifdef AFS_LINUX22_ENV
150 /* unmask signals in rxk listener */
152 afs_osi_UnmaskRxkSignals(void)
156 /* Two hacks to try and fix afsdb */
158 afs_osi_MaskUserLoop()
160 #ifdef AFS_DARWIN_ENV
162 afs_osi_fullSigMask();
164 afs_osi_MaskSignals();
169 afs_osi_UnmaskUserLoop()
171 #ifdef AFS_DARWIN_ENV
172 afs_osi_fullSigRestore();
176 /* register rxk listener proc info */
178 afs_osi_RxkRegister(void)
180 #ifdef AFS_LINUX22_ENV
185 /* procedure for making our processes as invisible as we can */
187 afs_osi_Invisible(void)
189 #ifdef AFS_LINUX22_ENV
190 afs_osi_MaskSignals();
191 #elif defined(AFS_SUN5_ENV)
192 curproc->p_flag |= SSYS;
193 #elif defined(AFS_HPUX101_ENV) && !defined(AFS_HPUX1123_ENV)
194 set_system_proc(u.u_procp);
195 #elif defined(AFS_DARWIN80_ENV)
196 #elif defined(AFS_DARWIN_ENV)
197 /* maybe call init_process instead? */
198 current_proc()->p_flag |= P_SYSTEM;
199 #elif defined(AFS_XBSD_ENV)
200 curproc->p_flag |= P_SYSTEM;
201 #elif defined(AFS_SGI_ENV)
205 AFS_STATCNT(osi_Invisible);
209 #if !defined(AFS_LINUX20_ENV) && !defined(AFS_XBSD_ENV)
210 /* set the real time */
212 afs_osi_SetTime(osi_timeval_t * atv)
214 #if defined(AFS_AIX32_ENV)
215 struct timestruc_t t;
217 t.tv_sec = atv->tv_sec;
218 t.tv_nsec = atv->tv_usec * 1000;
219 ksettimer(&t); /* Was -> settimer(TIMEOFDAY, &t); */
220 #elif defined(AFS_SUN55_ENV)
222 #elif defined(AFS_SUN5_ENV)
224 * To get more than second resolution we can use adjtime. The problem
225 * is that the usecs from the server are wrong (by now) so it isn't
226 * worth complicating the following code.
232 sta.time = atv->tv_sec;
235 #elif defined(AFS_SGI_ENV)
241 sta.time = atv->tv_sec;
244 #elif defined(AFS_DARWIN_ENV)
245 #ifndef AFS_DARWIN80_ENV
251 /* stolen from kern_time.c */
253 boottime.tv_sec += atv->tv_sec - time.tv_sec;
257 #if !defined(AFS_HPUX1122_ENV)
258 /* drop the setting of the clock for now. spl7 is not
263 t.tv_sec = atv->tv_sec;
264 t.tv_usec = atv->tv_usec;
281 logtchg(atv->tv_sec);
283 #endif /* AFS_DARWIN_ENV */
284 AFS_STATCNT(osi_SetTime);
286 #endif /* AFS_LINUX20_ENV */
292 AFS_STATCNT(shutdown_osi);
293 #ifdef AFS_DARWIN80_ENV
294 if (afs_osi_ctxtp_initialized && afs_osi_ctxtp) {
295 vfs_context_rele(afs_osi_ctxtp);
296 afs_osi_ctxtp = NULL;
297 afs_osi_ctxtp_initialized = 0;
301 if (afs_cold_shutdown) {
302 LOCK_INIT(&afs_ftf, "afs_ftf");
308 afs_osi_suser(void *cr)
310 #if defined(AFS_SUN510_ENV)
311 return (priv_policy(cr, PRIV_SYS_SUSER_COMPAT, B_FALSE, EPERM, NULL) == 0);
312 #elif defined(AFS_SUN5_ENV)
313 return afs_suser(cr);
315 return afs_suser(NULL);