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;
41 kmutex_t afs_rxglobal_lock;
44 #if defined(AFS_SGI_ENV) && !defined(AFS_SGI64_ENV)
45 long afs_global_owner;
48 #if defined(AFS_DARWIN_ENV)
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_FBSD50_ENV)
57 struct lock afs_global_lock;
58 afs_proc_t *afs_global_owner;
61 struct mtx afs_global_mtx;
64 #if defined(AFS_DARWIN_ENV)
65 thread_t afs_global_owner;
66 #endif /* AFS_DARWIN_ENV */
68 #if defined(AFS_AIX41_ENV)
69 simple_lock_data afs_global_lock;
76 if (once++ > 0) /* just in case */
78 #if defined(AFS_HPUX_ENV)
80 #else /* AFS_HPUX_ENV */
81 #if defined(AFS_GLOBAL_SUNLOCK)
82 #if defined(AFS_SGI62_ENV)
83 mutex_init(&afs_global_lock, MUTEX_DEFAULT, "afs_global_lock");
84 #elif defined(AFS_FBSD50_ENV)
85 #if defined(AFS_FBSD80_ENV) && defined(WITNESS)
86 /* "lock_initalized" (sic) can panic, checks a flag bit
87 * is unset _before_ init */
88 memset(&afs_global_mtx, 0, sizeof(struct mtx));
90 mtx_init(&afs_global_mtx, "AFS global lock", NULL, MTX_DEF);
91 #elif defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
92 #if !defined(AFS_DARWIN80_ENV)
93 lockinit(&afs_global_lock, PLOCK, "afs global lock", 0, 0);
96 #elif defined(AFS_AIX41_ENV)
97 lock_alloc((void *)&afs_global_lock, LOCK_ALLOC_PIN, 1, 1);
98 simple_lock_init((void *)&afs_global_lock);
99 #elif !defined(AFS_LINUX22_ENV)
100 /* Linux initialization in osi directory. Should move the others. */
101 mutex_init(&afs_global_lock, "afs_global_lock", MUTEX_DEFAULT, NULL);
103 #endif /* AFS_GLOBAL_SUNLOCK */
104 #endif /* AFS_HPUX_ENV */
106 if (!afs_osicred_initialized) {
107 #if defined(AFS_DARWIN80_ENV)
108 afs_osi_ctxtp_initialized = 0;
109 afs_osi_ctxtp = NULL; /* initialized in afs_Daemon since it has
110 a proc reference that cannot be changed */
112 #if defined(AFS_XBSD_ENV)
113 /* Can't just invent one, must use crget() because of mutex */
114 afs_osi_credp = crdup(osi_curcred());
116 memset(&afs_osi_cred, 0, sizeof(afs_ucred_t));
117 #if defined(AFS_LINUX26_ENV)
118 set_cr_group_info(&afs_osi_cred, groups_alloc(0));
120 #if defined(AFS_DARWIN80_ENV)
121 afs_osi_cred.cr_ref = 1; /* kauth_cred_get_ref needs 1 existing ref */
123 crhold(&afs_osi_cred); /* don't let it evaporate */
126 afs_osi_credp = &afs_osi_cred;
128 afs_osicred_initialized = 1;
131 osi_flid.fl_pid = osi_flid.fl_sysid = 0;
134 init_et_to_sys_error();
137 /* mask signals in afsds */
139 afs_osi_MaskSignals(void)
141 #ifdef AFS_LINUX22_ENV
146 /* unmask signals in rxk listener */
148 afs_osi_UnmaskRxkSignals(void)
152 /* Two hacks to try and fix afsdb */
154 afs_osi_MaskUserLoop()
156 #ifdef AFS_DARWIN_ENV
158 afs_osi_fullSigMask();
160 afs_osi_MaskSignals();
165 afs_osi_UnmaskUserLoop(void)
167 #ifdef AFS_DARWIN_ENV
168 afs_osi_fullSigRestore();
172 /* register rxk listener proc info */
174 afs_osi_RxkRegister(void)
178 /* procedure for making our processes as invisible as we can */
180 afs_osi_Invisible(void)
182 #ifdef AFS_LINUX22_ENV
183 afs_osi_MaskSignals();
184 #elif defined(AFS_SUN5_ENV)
185 curproc->p_flag |= SSYS;
186 #elif defined(AFS_HPUX101_ENV) && !defined(AFS_HPUX1123_ENV)
187 set_system_proc(u.u_procp);
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_XBSD_ENV)
193 curproc->p_flag |= P_SYSTEM;
194 #elif defined(AFS_SGI_ENV)
198 AFS_STATCNT(osi_Invisible);
202 afs_osi_Visible(void)
204 #if defined(AFS_SUN5_ENV)
205 curproc->p_flag &= ~SSYS;
206 #elif defined(AFS_DARWIN80_ENV)
207 #elif defined(AFS_DARWIN_ENV)
208 /* maybe call init_process instead? */
209 current_proc()->p_flag &= ~P_SYSTEM;
210 #elif defined(AFS_XBSD_ENV)
211 curproc->p_flag &= ~P_SYSTEM;
215 #if !defined(AFS_LINUX20_ENV) && !defined(AFS_XBSD_ENV)
216 /* set the real time */
218 afs_osi_SetTime(osi_timeval_t * atv)
220 #if defined(AFS_AIX32_ENV)
221 struct timestruc_t t;
223 t.tv_sec = atv->tv_sec;
224 t.tv_nsec = atv->tv_usec * 1000;
225 ksettimer(&t); /* Was -> settimer(TIMEOFDAY, &t); */
226 #elif defined(AFS_SUN55_ENV)
228 #elif defined(AFS_SUN5_ENV)
230 * To get more than second resolution we can use adjtime. The problem
231 * is that the usecs from the server are wrong (by now) so it isn't
232 * worth complicating the following code.
238 sta.time = atv->tv_sec;
241 #elif defined(AFS_SGI_ENV)
247 sta.time = atv->tv_sec;
250 #elif defined(AFS_DARWIN_ENV)
251 #ifndef AFS_DARWIN80_ENV
257 /* stolen from kern_time.c */
259 boottime.tv_sec += atv->tv_sec - time.tv_sec;
263 #if !defined(AFS_HPUX1122_ENV)
264 /* drop the setting of the clock for now. spl7 is not
269 t.tv_sec = atv->tv_sec;
270 t.tv_usec = atv->tv_usec;
287 logtchg(atv->tv_sec);
289 #endif /* AFS_DARWIN_ENV */
290 AFS_STATCNT(osi_SetTime);
292 #endif /* AFS_LINUX20_ENV */
298 AFS_STATCNT(shutdown_osi);
299 #ifdef AFS_DARWIN80_ENV
300 if (afs_osi_ctxtp_initialized && afs_osi_ctxtp) {
301 vfs_context_rele(afs_osi_ctxtp);
302 afs_osi_ctxtp = NULL;
303 afs_osi_ctxtp_initialized = 0;
307 if (afs_cold_shutdown) {
308 LOCK_INIT(&afs_ftf, "afs_ftf");
314 afs_osi_suser(void *cr)
316 #if defined(AFS_SUN510_ENV)
317 return (priv_policy(cr, PRIV_SYS_SUSER_COMPAT, B_FALSE, EPERM, NULL) == 0);
318 #elif defined(AFS_SUN5_ENV)
319 return afs_suser(cr);
321 return afs_suser(NULL);