2 * Copyrigh 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"
14 #include "afs/sysincludes.h" /* Standard vendor system headers */
15 #include "afsincludes.h" /* Afs-based standard headers */
16 #include "afs/afs_stats.h" /* afs statistics */
18 #include <sys/adspace.h> /* for vm_att(), vm_det() */
21 /* osi_Init -- do once per kernel installation initialization.
22 * -- On Solaris this is called from modload initialization.
23 * -- On AIX called from afs_config.
24 * -- On HP called from afsc_link.
25 * -- On SGI called from afs_init. */
27 afs_lock_t afs_ftf; /* flush text lock */
30 lock_t afs_event_lock;
37 afs_ucred_t *afs_osi_credp;
39 #if defined(AFS_SUN5_ENV) || defined(AFS_SGI_ENV)
40 kmutex_t afs_global_lock;
43 #if defined(AFS_SGI_ENV) && !defined(AFS_SGI64_ENV)
44 long afs_global_owner;
47 #if defined(AFS_DARWIN_ENV)
48 thread_t afs_global_owner;
49 #ifdef AFS_DARWIN80_ENV
50 lck_mtx_t *afs_global_lock;
52 struct lock__bsd__ afs_global_lock;
56 #if defined(AFS_XBSD_ENV) && !defined(AFS_FBSD_ENV)
57 # if defined(AFS_NBSD50_ENV)
58 kmutex_t afs_global_mtx;
60 struct lock afs_global_lock;
61 afs_proc_t *afs_global_owner;
63 #elif defined(AFS_FBSD_ENV)
64 struct mtx afs_global_mtx;
65 struct thread *afs_global_owner;
68 #if defined(AFS_AIX41_ENV)
69 simple_lock_data afs_global_lock;
76 if (once++ > 0) /* just in case */
81 if (!afs_osicred_initialized) {
82 #if defined(AFS_DARWIN80_ENV)
83 afs_osi_ctxtp_initialized = 0;
84 afs_osi_ctxtp = NULL; /* initialized in afs_Daemon since it has
85 a proc reference that cannot be changed */
87 #if defined(AFS_XBSD_ENV)
88 /* Can't just invent one, must use crget() because of mutex */
91 #elif defined(AFS_SUN5_ENV)
92 afs_osi_credp = kcred;
94 memset(&afs_osi_cred, 0, sizeof(afs_ucred_t));
95 #if defined(AFS_LINUX26_ENV)
96 afs_set_cr_group_info(&afs_osi_cred, groups_alloc(0));
98 #if defined(AFS_DARWIN80_ENV)
99 afs_osi_cred.cr_ref = 1; /* kauth_cred_get_ref needs 1 existing ref */
101 # if !(defined(AFS_LINUX26_ENV) && defined(STRUCT_TASK_STRUCT_HAS_CRED))
102 crhold(&afs_osi_cred); /* don't let it evaporate */
106 afs_osi_credp = &afs_osi_cred;
108 afs_osicred_initialized = 1;
111 osi_flid.fl_pid = osi_flid.fl_sysid = 0;
114 init_et_to_sys_error();
117 /* mask signals in afsds */
119 afs_osi_MaskSignals(void)
121 #ifdef AFS_LINUX22_ENV
126 /* unmask signals in rxk listener */
128 afs_osi_UnmaskRxkSignals(void)
132 /* Two hacks to try and fix afsdb */
134 afs_osi_MaskUserLoop(void)
136 #ifdef AFS_DARWIN_ENV
138 afs_osi_fullSigMask();
140 afs_osi_MaskSignals();
145 afs_osi_UnmaskUserLoop(void)
147 #ifdef AFS_DARWIN_ENV
148 afs_osi_fullSigRestore();
152 /* register rxk listener proc info */
154 afs_osi_RxkRegister(void)
158 /* procedure for making our processes as invisible as we can */
160 afs_osi_Invisible(void)
162 #ifdef AFS_LINUX22_ENV
163 afs_osi_MaskSignals();
164 #elif defined(AFS_SUN5_ENV)
165 curproc->p_flag |= SSYS;
166 #elif defined(AFS_HPUX101_ENV) && !defined(AFS_HPUX1123_ENV)
167 set_system_proc(u.u_procp);
168 #elif defined(AFS_DARWIN80_ENV)
169 #elif defined(AFS_DARWIN_ENV)
170 /* maybe call init_process instead? */
171 current_proc()->p_flag |= P_SYSTEM;
172 #elif defined(AFS_NBSD50_ENV)
173 /* XXX in netbsd a system thread is more than invisible */
174 #elif defined(AFS_XBSD_ENV)
175 curproc->p_flag |= P_SYSTEM;
176 #elif defined(AFS_SGI_ENV)
180 AFS_STATCNT(osi_Invisible);
184 afs_osi_Visible(void)
186 #if defined(AFS_SUN5_ENV)
187 curproc->p_flag &= ~SSYS;
188 #elif defined(AFS_DARWIN80_ENV)
189 #elif defined(AFS_DARWIN_ENV)
190 /* maybe call init_process instead? */
191 current_proc()->p_flag &= ~P_SYSTEM;
192 #elif defined(AFS_NBSD50_ENV)
193 /* XXX in netbsd a system thread is more than invisible */
194 #elif defined(AFS_XBSD_ENV)
195 curproc->p_flag &= ~P_SYSTEM;
199 #if !defined(AFS_LINUX20_ENV) && !defined(AFS_XBSD_ENV)
200 /* set the real time */
202 afs_osi_SetTime(osi_timeval_t * atv)
204 #if defined(AFS_AIX32_ENV)
205 struct timestruc_t t;
207 t.tv_sec = atv->tv_sec;
208 t.tv_nsec = atv->tv_usec * 1000;
209 ksettimer(&t); /* Was -> settimer(TIMEOFDAY, &t); */
210 #elif defined(AFS_SUN5_ENV)
212 #elif defined(AFS_SGI_ENV)
218 sta.time = atv->tv_sec;
221 #elif defined(AFS_DARWIN_ENV)
222 #ifndef AFS_DARWIN80_ENV
228 /* stolen from kern_time.c */
230 boottime.tv_sec += atv->tv_sec - time.tv_sec;
234 #if !defined(AFS_HPUX1122_ENV)
235 /* drop the setting of the clock for now. spl7 is not
240 t.tv_sec = atv->tv_sec;
241 t.tv_usec = atv->tv_usec;
258 logtchg(atv->tv_sec);
260 #endif /* AFS_DARWIN_ENV */
261 AFS_STATCNT(osi_SetTime);
263 #endif /* AFS_LINUX20_ENV */
269 AFS_STATCNT(shutdown_osi);
270 #ifdef AFS_DARWIN80_ENV
271 if (afs_osi_ctxtp_initialized && afs_osi_ctxtp) {
272 vfs_context_rele(afs_osi_ctxtp);
273 afs_osi_ctxtp = NULL;
274 afs_osi_ctxtp_initialized = 0;
277 #if !defined(AFS_HPUX_ENV) && !defined(UKERNEL) && !defined(AFS_DFBSD_ENV) && !defined(AFS_LINUX26_ENV)
278 /* LINUX calls this from afs_cleanup() which hooks into module_exit */
281 if (afs_cold_shutdown) {
282 LOCK_INIT(&afs_ftf, "afs_ftf");
286 #if !defined(AFS_HPUX_ENV) && !defined(UKERNEL) && !defined(AFS_DFBSD_ENV) && !defined(AFS_DARWIN_ENV)
287 /* DARWIN uses locking, and so must provide its own */
289 shutdown_osisleep(void)
294 for (i=0;i<AFS_EVHASHSIZE;i++) {
295 while ((tmp = afs_evhasht[i]) != NULL) {
296 afs_evhasht[i] = tmp->next;
297 if (tmp->refcount > 0) {
298 afs_warn("nonzero refcount in shutdown_osisleep()\n");
300 #if defined(AFS_AIX_ENV)
302 #elif defined(AFS_FBSD_ENV)
303 afs_osi_Free(tmp, sizeof(*tmp));
304 #elif defined(AFS_SGI_ENV) || defined(AFS_XBSD_ENV) || defined(AFS_SUN5_ENV)
305 osi_FreeSmallSpace(tmp);
306 #elif defined(AFS_LINUX26_ENV)
308 #elif defined(AFS_LINUX20_ENV)
317 #if !defined(AFS_OBSD_ENV) && !defined(AFS_NBSD40_ENV)
319 afs_osi_suser(void *cr)
321 #if defined(AFS_SUN510_ENV)
322 return (priv_policy(cr, PRIV_SYS_SUSER_COMPAT, B_FALSE, EPERM, NULL) == 0);
323 #elif defined(AFS_SUN5_ENV)
324 return afs_suser(cr);
326 return afs_suser(NULL);