venus: Remove dedebug
[openafs.git] / src / afs / afs_call.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 #include "afs/param.h"
12
13 #if defined(HAVE_LINUX_KTHREAD_RUN) && !defined(UKERNEL)
14 #  include "h/kthread.h"
15 #endif
16
17 #include "afs/sysincludes.h"    /* Standard vendor system headers */
18 #include "afsincludes.h"        /* Afs-based standard headers */
19 #include "afs/afs_stats.h"
20 #include "rx/rx_globals.h"
21 #if !defined(UKERNEL)
22 # if defined(AFS_LINUX_ENV)
23 #  include "osi_compat.h"
24 # else
25 #  include "net/if.h"
26 #  ifdef AFS_SGI_ENV
27 #   include "h/hashing.h"
28 #  endif
29 #  if !defined(AFS_HPUX110_ENV) && !defined(AFS_DARWIN_ENV)
30 #   include "netinet/in_var.h"
31 #  endif
32 # endif
33 #endif /* !defined(UKERNEL) */
34 #ifdef AFS_SUN510_ENV
35 #include "h/ksynch.h"
36 #include "h/sunddi.h"
37 #endif
38 #include <hcrypto/rand.h>
39
40 #if defined(AFS_DARWIN80_ENV)
41 # include <mach/thread_act.h>
42 #endif
43
44 #if defined(AFS_SUN5_ENV) || defined(AFS_AIX_ENV) || defined(AFS_SGI_ENV) || defined(AFS_HPUX_ENV)
45 #define AFS_MINBUFFERS  100
46 #else
47 #define AFS_MINBUFFERS  50
48 #endif
49
50 #if (defined(AFS_SUN5_ENV) || defined(AFS_LINUX_ENV) || defined(AFS_DARWIN80_ENV)) && !defined(UKERNEL)
51 /* If AFS_DAEMONOP_ENV is defined, it indicates we run "daemon" AFS syscalls by
52  * spawning a kernel thread to do the work, instead of running them in the
53  * calling process. */
54 # define AFS_DAEMONOP_ENV
55 #endif
56
57 struct afsop_cell {
58     afs_int32 hosts[AFS_MAXCELLHOSTS];
59     char cellName[100];
60 };
61
62 char afs_zeros[AFS_ZEROS];
63 char afs_rootVolumeName[64] = "";
64 afs_uint32 rx_bindhost;
65
66 #ifdef AFS_SUN510_ENV
67 ddi_taskq_t *afs_taskq;
68 krwlock_t afsifinfo_lock;
69 #endif
70
71 afs_int32 afs_initState = 0;
72 afs_int32 afs_termState = 0;
73 int afs_cold_shutdown = 0;
74 char afs_SynchronousCloses = '\0';
75 static int afs_CB_Running = 0;
76 static int AFS_Running = 0;
77 static int afs_CacheInit_Done = 0;
78 static int afs_Go_Done = 0;
79 extern struct interfaceAddr afs_cb_interface;
80 #ifdef RXK_LISTENER_ENV
81 static int afs_RX_Running = 0;
82 #endif
83 static int afs_InitSetup_done = 0;
84 afs_int32 afs_numcachefiles = -1;
85 afs_int32 afs_numfilesperdir = -1;
86 char afs_cachebasedir[1024];
87 afs_int32 afs_rmtsys_enable = 0;
88
89 afs_int32 afs_rx_deadtime = AFS_RXDEADTIME;
90 afs_int32 afs_rx_harddead = AFS_HARDDEADTIME;
91 afs_int32 afs_rx_idledead = AFS_IDLEDEADTIME;
92 afs_int32 afs_rx_idledead_rep = AFS_IDLEDEADTIME_REP;
93
94 static int afscall_set_rxpck_received = 0;
95
96 extern afs_int32 afs_volume_ttl;
97
98 /* From afs_util.c */
99 extern afs_int32 afs_md5inum;
100
101 /* This is code which needs to be called once when the first daemon enters
102  * the client. A non-zero return means an error and AFS should not start.
103  */
104 static int
105 afs_InitSetup(int preallocs)
106 {
107     static int afs_InitSetup_running;
108
109     int code;
110     afs_uint32 host;
111
112     while (afs_InitSetup_running) {
113         afs_osi_Sleep(&afs_InitSetup_running);
114     }
115
116     if (afs_InitSetup_done)
117         return EAGAIN;
118
119     afs_InitSetup_running = 1;
120
121 #ifdef AFS_SUN510_ENV
122     /* Initialize a RW lock for the ifinfo global array */
123     rw_init(&afsifinfo_lock, NULL, RW_DRIVER, NULL);
124
125     /* Create a taskq */
126     afs_taskq = ddi_taskq_create(NULL, "afs_taskq", 2, TASKQ_DEFAULTPRI, 0);
127
128     osi_StartNetIfPoller();
129 #endif
130
131 #ifndef AFS_NOSTATS
132     /*
133      * Set up all the AFS statistics variables.  This should be done
134      * exactly once, and it should be done here, the first resource-setting
135      * routine to be called by the CM/RX.
136      */
137     afs_InitStats();
138 #endif /* AFS_NOSTATS */
139
140     memset(afs_zeros, 0, AFS_ZEROS);
141
142     /* start RX */
143     if(!afscall_set_rxpck_received)
144     rx_extraPackets = AFS_NRXPACKETS;   /* smaller # of packets */
145
146     host = ntohl(rx_bindhost);
147     afs_warn("afs: Binding rx to %d.%d.%d.%d:%d\n",
148              (host >> 24),
149              (host >> 16) & 0xff,
150              (host >>  8) & 0xff,
151              (host)       & 0xff,
152              7001);
153     AFS_GUNLOCK();
154     code = rx_InitHost(rx_bindhost, htons(7001));
155     AFS_GLOCK();
156     if (code) {
157         afs_warn("AFS: RX failed to initialize %d).\n", code);
158         goto done;
159     }
160     rx_SetRxDeadTime(afs_rx_deadtime);
161     /* resource init creates the services */
162     afs_ResourceInit(preallocs);
163
164     afs_InitSetup_done = 1;
165     afs_osi_Wakeup(&afs_InitSetup_done);
166
167  done:
168     afs_InitSetup_running = 0;
169     afs_osi_Wakeup(&afs_InitSetup_running);
170     return code;
171 }
172
173 #ifdef AFS_DAEMONOP_ENV
174 static int
175 daemonOp_common(long parm, long parm2, long parm3, long parm4, long parm5,
176                 long parm6)
177 {
178     int code;
179     if (parm == AFSOP_START_RXCALLBACK) {
180         if (afs_CB_Running)
181             return -1;
182 # ifdef RXK_LISTENER_ENV
183     } else if (parm == AFSOP_RXLISTENER_DAEMON) {
184         if (afs_RX_Running)
185             return -1;
186         afs_RX_Running = 1;
187 # endif
188         code = afs_InitSetup(parm2);
189         if (parm3) {
190             rx_enablePeerRPCStats();
191         }
192         if (parm4) {
193             rx_enableProcessRPCStats();
194         }
195         if (code)
196             return -1;
197     } else if (parm == AFSOP_START_AFS) {
198         if (AFS_Running)
199             return -1;
200     }                           /* other functions don't need setup in the parent */
201     return 0;
202 }
203 #endif /* AFS_DAEMONOP_ENV */
204
205 #if defined(AFS_DARWIN80_ENV)
206 struct afsd_thread_info {
207     unsigned long parm;
208 };
209 static int
210 afsd_thread(int *rock)
211 {
212     struct afsd_thread_info *arg = (struct afsd_thread_info *)rock;
213     unsigned long parm = arg->parm;
214
215     switch (parm) {
216     case AFSOP_START_RXCALLBACK:
217         AFS_GLOCK();
218         wakeup(arg);
219         afs_CB_Running = 1;
220 #ifndef RXK_LISTENER_ENV
221         afs_initState = AFSOP_START_AFS;
222         afs_osi_Wakeup(&afs_initState);
223 #else
224         while (afs_RX_Running != 2)
225             afs_osi_Sleep(&afs_RX_Running);
226 #endif
227         afs_RXCallBackServer();
228         AFS_GUNLOCK();
229         thread_terminate(current_thread());
230         break;
231     case AFSOP_START_AFS:
232         AFS_GLOCK();
233         wakeup(arg);
234         AFS_Running = 1;
235         while (afs_initState < AFSOP_START_AFS)
236             afs_osi_Sleep(&afs_initState);
237         afs_initState = AFSOP_START_BKG;
238         afs_osi_Wakeup(&afs_initState);
239         afs_Daemon();
240         AFS_GUNLOCK();
241         thread_terminate(current_thread());
242         break;
243     case AFSOP_START_BKG:
244         afs_warn("Install matching afsd! Old background daemons not supported.\n");
245         thread_terminate(current_thread());
246         break;
247     case AFSOP_START_TRUNCDAEMON:
248         AFS_GLOCK();
249         wakeup(arg);
250         while (afs_initState < AFSOP_GO)
251             afs_osi_Sleep(&afs_initState);
252         afs_CacheTruncateDaemon();
253         AFS_GUNLOCK();
254         thread_terminate(current_thread());
255         break;
256     case AFSOP_START_CS:
257         AFS_GLOCK();
258         wakeup(arg);
259         afs_CheckServerDaemon();
260         AFS_GUNLOCK();
261         thread_terminate(current_thread());
262         break;
263     case AFSOP_RXEVENT_DAEMON:
264         AFS_GLOCK();
265         wakeup(arg);
266         while (afs_initState < AFSOP_START_BKG)
267             afs_osi_Sleep(&afs_initState);
268         afs_rxevent_daemon();
269         AFS_GUNLOCK();
270         thread_terminate(current_thread());
271         break;
272 #ifdef RXK_LISTENER_ENV
273     case AFSOP_RXLISTENER_DAEMON:
274         AFS_GLOCK();
275         wakeup(arg);
276         afs_initState = AFSOP_START_AFS;
277         afs_osi_Wakeup(&afs_initState);
278         afs_RX_Running = 2;
279         afs_osi_Wakeup(&afs_RX_Running);
280         afs_osi_RxkRegister();
281         rxk_Listener();
282         AFS_GUNLOCK();
283         thread_terminate(current_thread());
284         break;
285 #endif
286     default:
287         afs_warn("Unknown op %ld in StartDaemon()\n", (long)parm);
288         break;
289     }
290 }
291
292 static void
293 afs_DaemonOp(long parm, long parm2, long parm3, long parm4, long parm5,
294              long parm6)
295 {
296     struct afsd_thread_info info;
297     thread_t thread;
298     if (daemonOp_common(parm, parm2, parm3, parm4, parm5, parm6)) {
299         return;
300     }
301     info.parm = parm;
302     kernel_thread_start((thread_continue_t)afsd_thread, &info, &thread);
303     AFS_GUNLOCK();
304     /* we need to wait cause we passed stack pointers around.... */
305     msleep(&info, NULL, PVFS, "afs_DaemonOp", NULL);
306     AFS_GLOCK();
307     thread_deallocate(thread);
308 }
309 #endif
310
311
312 #if defined(AFS_LINUX_ENV)
313 struct afsd_thread_info {
314 # if !defined(INIT_WORK_HAS_DATA)
315     struct work_struct tq;
316 # endif
317     unsigned long parm;
318     struct completion *complete;
319 };
320
321 static int
322 afsd_thread(void *rock)
323 {
324     struct afsd_thread_info *arg = rock;
325     unsigned long parm = arg->parm;
326 # ifdef SYS_SETPRIORITY_EXPORTED
327     int (*sys_setpriority) (int, int, int) = sys_call_table[__NR_setpriority];
328 # endif
329 # if !defined(HAVE_LINUX_KTHREAD_RUN)
330 #  if defined(AFS_LINUX_ENV)
331     daemonize("afsd");
332 #  else
333     daemonize();
334 #  endif
335 # endif /* !HAVE_LINUX_KTHREAD_RUN */
336                                 /* doesn't do much, since we were forked from keventd, but
337                                  * does call mm_release, which wakes up our parent (since it
338                                  * used CLONE_VFORK) */
339 # if !defined(AFS_LINUX_ENV)
340     reparent_to_init();
341 # endif
342     afs_osi_MaskSignals();
343     switch (parm) {
344     case AFSOP_START_RXCALLBACK:
345         sprintf(current->comm, "afs_cbstart");
346         AFS_GLOCK();
347         complete(arg->complete);
348         afs_CB_Running = 1;
349 #if !defined(RXK_LISTENER_ENV)
350         afs_initState = AFSOP_START_AFS;
351         afs_osi_Wakeup(&afs_initState);
352 #else
353         while (afs_RX_Running != 2)
354             afs_osi_Sleep(&afs_RX_Running);
355 #endif
356         sprintf(current->comm, "afs_callback");
357         afs_RXCallBackServer();
358         AFS_GUNLOCK();
359         kthread_complete_and_exit(0, 0);
360         break;
361     case AFSOP_START_AFS:
362         sprintf(current->comm, "afs_afsstart");
363         AFS_GLOCK();
364         complete(arg->complete);
365         AFS_Running = 1;
366         while (afs_initState < AFSOP_START_AFS)
367             afs_osi_Sleep(&afs_initState);
368         afs_initState = AFSOP_START_BKG;
369         afs_osi_Wakeup(&afs_initState);
370         sprintf(current->comm, "afsd");
371         afs_Daemon();
372         AFS_GUNLOCK();
373         kthread_complete_and_exit(0, 0);
374         break;
375     case AFSOP_START_BKG:
376 #ifdef AFS_NEW_BKG
377         afs_warn("Install matching afsd! Old background daemons not supported.\n");
378 #else
379         sprintf(current->comm, "afs_bkgstart");
380         AFS_GLOCK();
381         complete(arg->complete);
382         while (afs_initState < AFSOP_START_BKG)
383             afs_osi_Sleep(&afs_initState);
384         if (afs_initState < AFSOP_GO) {
385             afs_initState = AFSOP_GO;
386             afs_osi_Wakeup(&afs_initState);
387         }
388         sprintf(current->comm, "afs_background");
389         afs_BackgroundDaemon();
390         AFS_GUNLOCK();
391 #endif
392         kthread_complete_and_exit(0, 0);
393         break;
394     case AFSOP_START_TRUNCDAEMON:
395         sprintf(current->comm, "afs_trimstart");
396         AFS_GLOCK();
397         complete(arg->complete);
398         while (afs_initState < AFSOP_GO)
399             afs_osi_Sleep(&afs_initState);
400         sprintf(current->comm, "afs_cachetrim");
401         afs_CacheTruncateDaemon();
402         AFS_GUNLOCK();
403         kthread_complete_and_exit(0, 0);
404         break;
405     case AFSOP_START_CS:
406         sprintf(current->comm, "afs_checkserver");
407         AFS_GLOCK();
408         complete(arg->complete);
409         afs_CheckServerDaemon();
410         AFS_GUNLOCK();
411         kthread_complete_and_exit(0, 0);
412         break;
413     case AFSOP_RXEVENT_DAEMON:
414         sprintf(current->comm, "afs_evtstart");
415 # ifdef SYS_SETPRIORITY_EXPORTED
416         sys_setpriority(PRIO_PROCESS, 0, -10);
417 # else
418 #  ifdef CURRENT_INCLUDES_NICE
419         current->nice = -10;
420 #  endif
421 # endif
422         AFS_GLOCK();
423         complete(arg->complete);
424         while (afs_initState < AFSOP_START_BKG)
425             afs_osi_Sleep(&afs_initState);
426         sprintf(current->comm, "afs_rxevent");
427         afs_rxevent_daemon();
428         AFS_GUNLOCK();
429         kthread_complete_and_exit(0, 0);
430         break;
431 #ifdef RXK_LISTENER_ENV
432     case AFSOP_RXLISTENER_DAEMON:
433         sprintf(current->comm, "afs_lsnstart");
434 # ifdef SYS_SETPRIORITY_EXPORTED
435         sys_setpriority(PRIO_PROCESS, 0, -10);
436 # else
437 #  ifdef CURRENT_INCLUDES_NICE
438         current->nice = -10;
439 #  endif
440 # endif
441         AFS_GLOCK();
442         complete(arg->complete);
443         afs_initState = AFSOP_START_AFS;
444         afs_osi_Wakeup(&afs_initState);
445         afs_RX_Running = 2;
446         afs_osi_Wakeup(&afs_RX_Running);
447         afs_osi_RxkRegister();
448         sprintf(current->comm, "afs_rxlistener");
449         rxk_Listener();
450         AFS_GUNLOCK();
451         kthread_complete_and_exit(0, 0);
452         break;
453 #endif
454     default:
455         afs_warn("Unknown op %ld in StartDaemon()\n", (long)parm);
456         break;
457     }
458     return 0;
459 }
460
461 static void
462 # if defined(AFS_LINUX_ENV) && !defined(INIT_WORK_HAS_DATA)
463 afsd_launcher(struct work_struct *work)
464 # else
465 afsd_launcher(void *rock)
466 # endif
467 {
468 # if defined(AFS_LINUX_ENV) && !defined(INIT_WORK_HAS_DATA)
469     struct afsd_thread_info *rock = container_of(work, struct afsd_thread_info, tq);
470 # endif
471
472 # if defined(HAVE_LINUX_KTHREAD_RUN)
473     if (IS_ERR(kthread_run(afsd_thread, (void *)rock, "afsd"))) {
474         afs_warn("kthread_run failed; afs startup will not complete\n");
475     }
476 # else /* !HAVE_LINUX_KTHREAD_RUN */
477     if (!kernel_thread(afsd_thread, (void *)rock, CLONE_VFORK | SIGCHLD))
478         afs_warn("kernel_thread failed. afs startup will not complete\n");
479 # endif /* !HAVE_LINUX_KTHREAD_RUN */
480 }
481
482 static void
483 afs_DaemonOp(long parm, long parm2, long parm3, long parm4, long parm5,
484              long parm6)
485 {
486     DECLARE_COMPLETION(c);
487 # if defined(AFS_LINUX_ENV)
488 #  if defined(INIT_WORK_HAS_DATA)
489     struct work_struct tq;
490 #  endif
491 # else
492     struct tq_struct tq;
493 # endif
494     struct afsd_thread_info info;
495     if (daemonOp_common(parm, parm2, parm3, parm4, parm5, parm6)) {
496         return;
497     }
498     info.complete = &c;
499     info.parm = parm;
500 # if defined(AFS_LINUX_ENV)
501 #  if !defined(INIT_WORK_HAS_DATA)
502     INIT_WORK(&info.tq, afsd_launcher);
503     schedule_work(&info.tq);
504 #  else
505     INIT_WORK(&tq, afsd_launcher, &info);
506     schedule_work(&tq);
507 #  endif
508 # else
509     tq.sync = 0;
510     INIT_LIST_HEAD(&tq.list);
511     tq.routine = afsd_launcher;
512     tq.data = &info;
513     schedule_task(&tq);
514 # endif
515     AFS_GUNLOCK();
516     /* we need to wait cause we passed stack pointers around.... */
517     wait_for_completion(&c);
518     AFS_GLOCK();
519 }
520 #endif
521
522 #ifdef AFS_SUN5_ENV
523 struct afs_daemonop_args {
524     kcondvar_t cv;
525     long parm;
526 };
527
528 static void
529 afsd_thread(struct afs_daemonop_args *args)
530 {
531     long parm = args->parm;
532
533     AFS_GLOCK();
534     cv_signal(&args->cv);
535
536     switch (parm) {
537     case AFSOP_START_RXCALLBACK:
538         if (afs_CB_Running)
539             goto out;
540         afs_CB_Running = 1;
541         while (afs_RX_Running != 2)
542             afs_osi_Sleep(&afs_RX_Running);
543         afs_RXCallBackServer();
544         AFS_GUNLOCK();
545         return;
546     case AFSOP_START_AFS:
547         if (AFS_Running)
548             goto out;
549         AFS_Running = 1;
550         while (afs_initState < AFSOP_START_AFS)
551             afs_osi_Sleep(&afs_initState);
552         afs_initState = AFSOP_START_BKG;
553         afs_osi_Wakeup(&afs_initState);
554         afs_Daemon();
555         AFS_GUNLOCK();
556         return;
557     case AFSOP_START_BKG:
558         while (afs_initState < AFSOP_START_BKG)
559             afs_osi_Sleep(&afs_initState);
560         if (afs_initState < AFSOP_GO) {
561             afs_initState = AFSOP_GO;
562             afs_osi_Wakeup(&afs_initState);
563         }
564         afs_BackgroundDaemon();
565         AFS_GUNLOCK();
566         return;
567     case AFSOP_START_TRUNCDAEMON:
568         while (afs_initState < AFSOP_GO)
569             afs_osi_Sleep(&afs_initState);
570         afs_CacheTruncateDaemon();
571         AFS_GUNLOCK();
572         return;
573     case AFSOP_START_CS:
574         afs_CheckServerDaemon();
575         AFS_GUNLOCK();
576         return;
577     case AFSOP_RXEVENT_DAEMON:
578         while (afs_initState < AFSOP_START_BKG)
579             afs_osi_Sleep(&afs_initState);
580         afs_rxevent_daemon();
581         AFS_GUNLOCK();
582         return;
583     case AFSOP_RXLISTENER_DAEMON:
584         afs_initState = AFSOP_START_AFS;
585         afs_osi_Wakeup(&afs_initState);
586         afs_RX_Running = 2;
587         afs_osi_Wakeup(&afs_RX_Running);
588         afs_osi_RxkRegister();
589         rxk_Listener();
590         AFS_GUNLOCK();
591         return;
592     default:
593         AFS_GUNLOCK();
594         afs_warn("Unknown op %ld in afsd_thread()\n", parm);
595         return;
596     }
597  out:
598     AFS_GUNLOCK();
599     return;
600 }
601
602 static void
603 afs_DaemonOp(long parm, long parm2, long parm3, long parm4, long parm5,
604              long parm6)
605 {
606     struct afs_daemonop_args args;
607
608     if (daemonOp_common(parm, parm2, parm3, parm4, parm5, parm6)) {
609         return;
610     }
611
612     args.parm = parm;
613
614     cv_init(&args.cv, "AFS DaemonOp cond var", CV_DEFAULT, NULL);
615
616     if (thread_create(NULL, 0, afsd_thread, &args, 0, &p0, TS_RUN,
617         minclsyspri) == NULL) {
618
619         afs_warn("thread_create failed: AFS startup will not complete\n");
620     }
621
622     /* we passed &args to the new thread, which is on the stack. wait until
623      * it has read the arguments so it doesn't try to read the args after we
624      * have returned */
625     cv_wait(&args.cv, &afs_global_lock);
626
627     cv_destroy(&args.cv);
628 }
629 #endif /* AFS_SUN5_ENV */
630
631 #ifdef AFS_SOCKPROXY_ENV
632 /**
633  * Deallocate packets.
634  *
635  * @param[inout]  a_pktlist  list of packets to be freed
636  * @param[in]     a_npkts    number of packets
637  */
638 static void
639 sockproxy_pkts_free(struct afs_pkt_hdr **a_pktlist, size_t a_npkts)
640 {
641     int pkt_i;
642     struct afs_pkt_hdr *pktlist = *a_pktlist;
643
644     if (pktlist == NULL) {
645         return;
646     }
647     *a_pktlist = NULL;
648
649     for (pkt_i = 0; pkt_i < a_npkts; pkt_i++) {
650         struct afs_pkt_hdr *pkt = &pktlist[pkt_i];
651         afs_osi_Free(pkt->payload, pkt->size);
652         pkt->payload = NULL;
653     }
654     afs_osi_Free(pktlist, a_npkts * sizeof(pktlist[0]));
655 }
656
657 /**
658  * Copy packets from user-space.
659  *
660  * @param[in]   a_uaddr    address of list of packets in user-space
661  * @param[out]  a_pktlist  packets copied from user-space
662  * @param[in]   a_npkts    number of packets to be copied
663  *
664  * @return errno error codes.
665  */
666 static int
667 sockproxy_pkts_copyin(user_addr_t a_uaddr, struct afs_pkt_hdr **a_pktlist,
668                       size_t a_npkts)
669 {
670     int code, pkt_i;
671     struct afs_pkt_hdr *pktlist_u;
672     struct afs_pkt_hdr *pktlist_k = NULL;
673
674     *a_pktlist = NULL;
675     if (a_npkts == 0) {
676         return 0;
677     }
678     if (a_npkts > AFS_SOCKPROXY_PKT_MAX) {
679         return E2BIG;
680     }
681
682     pktlist_u = afs_osi_Alloc(a_npkts * sizeof(pktlist_u[0]));
683     if (pktlist_u == NULL) {
684         code = ENOMEM;
685         goto done;
686     }
687
688     pktlist_k = afs_osi_Alloc(a_npkts * sizeof(pktlist_k[0]));
689     if (pktlist_k == NULL) {
690         code = ENOMEM;
691         goto done;
692     }
693     memset(pktlist_k, 0, a_npkts * sizeof(pktlist_k[0]));
694
695     AFS_COPYIN(a_uaddr, pktlist_u, a_npkts * sizeof(pktlist_u[0]), code);
696     if (code != 0) {
697         goto done;
698     }
699
700     for (pkt_i = 0; pkt_i < a_npkts; pkt_i++) {
701         struct afs_pkt_hdr *pkt_k = &pktlist_k[pkt_i];
702         struct afs_pkt_hdr *pkt_u = &pktlist_u[pkt_i];
703
704         if (pkt_u->size > AFS_SOCKPROXY_PAYLOAD_MAX) {
705             code = E2BIG;
706             goto done;
707         }
708         /*
709          * Notice that pkt_u->payload points to a user-space address. When
710          * copying the data from pkt_u to pkt_k, make sure that pkt_k->payload
711          * points to a valid address in kernel-space.
712          */
713         *pkt_k = *pkt_u;
714         pkt_k->payload = afs_osi_Alloc(pkt_k->size);
715         if (pkt_k->payload == NULL) {
716             code = ENOMEM;
717             goto done;
718         }
719
720         AFS_COPYIN((user_addr_t)pkt_u->payload, pkt_k->payload, pkt_k->size,
721                    code);
722         if (code != 0) {
723             goto done;
724         }
725     }
726
727     *a_pktlist = pktlist_k;
728     pktlist_k = NULL;
729     code = 0;
730
731  done:
732     sockproxy_pkts_free(&pktlist_k, a_npkts);
733     afs_osi_Free(pktlist_u, a_npkts * sizeof(pktlist_u[0]));
734
735     return code;
736 }
737
738 /**
739  * Copy packets to user-space.
740  *
741  * @param[in]  a_uaddr    dst address of list of packets in user-space
742  * @param[in]  a_pktlist  packets to be copied to user-space
743  * @param[in]  a_npkts    number of packets to be copied
744  *
745  * @return 0 on success; non-zero otherwise.
746  */
747 static int
748 sockproxy_pkts_copyout(user_addr_t a_uaddr, struct afs_pkt_hdr *a_pktlist,
749                        size_t a_npkts)
750 {
751     int code, pkt_i;
752     struct afs_pkt_hdr *pktlist_u = NULL;
753     struct afs_pkt_hdr *pktlist_k = a_pktlist;
754
755     if (a_npkts == 0) {
756         return 0;
757     }
758     if (a_npkts > AFS_SOCKPROXY_PKT_MAX) {
759         return E2BIG;
760     }
761     if (a_pktlist == NULL) {
762         return EINVAL;
763     }
764
765     pktlist_u = afs_osi_Alloc(a_npkts * sizeof(pktlist_u[0]));
766     if (pktlist_u == NULL) {
767         code = ENOMEM;
768         goto done;
769     }
770
771     AFS_COPYIN(a_uaddr, pktlist_u, a_npkts * sizeof(pktlist_u[0]), code);
772     if (code != 0) {
773         goto done;
774     }
775
776     for (pkt_i = 0; pkt_i < a_npkts; pkt_i++) {
777         struct afs_pkt_hdr *pkt_k = &pktlist_k[pkt_i];
778         struct afs_pkt_hdr *pkt_u = &pktlist_u[pkt_i];
779         void *payload_uaddr;
780
781         if (pkt_k->size > pkt_u->size) {
782             code = ENOSPC;
783             goto done;
784         }
785
786         /* Copy pkt_k -> pkt_u, but preserve pkt_u->payload */
787         payload_uaddr = pkt_u->payload;
788         *pkt_u = *pkt_k;
789         pkt_u->payload = payload_uaddr;
790
791         AFS_COPYOUT(pkt_k->payload, (user_addr_t)pkt_u->payload, pkt_k->size,
792                     code);
793         if (code != 0) {
794             goto done;
795         }
796     }
797
798     AFS_COPYOUT(pktlist_u, a_uaddr, a_npkts * sizeof(pktlist_u[0]), code);
799     if (code != 0) {
800         goto done;
801     }
802
803  done:
804     afs_osi_Free(pktlist_u, a_npkts * sizeof(pktlist_u[0]));
805     return code;
806 }
807
808 /**
809  * Receive / send packets from / to user-space.
810  *
811  * @param[in]  a_parm_uspc  afs_uspc_param struct
812  * @param[in]  a_parm_pkts  packets to be received / sent
813  *
814  * @return 0 on success; non-zero otherwise.
815  */
816 static int
817 sockproxy_handler(user_addr_t a_parm_uspc, user_addr_t a_parm_pkts)
818 {
819     int code;
820     size_t orig_npkts, npkts;
821     struct afs_uspc_param uspc;
822
823     struct afs_pkt_hdr *pkts_recv;
824     struct afs_pkt_hdr *pkts_send;
825
826     AFS_GUNLOCK();
827
828     orig_npkts = 0;
829     memset(&uspc, 0, sizeof(uspc));
830
831     pkts_recv = NULL;
832     pkts_send = NULL;
833
834     /* get response from user-space */
835     AFS_COPYIN(a_parm_uspc, &uspc, sizeof(uspc), code);
836     if (code != 0) {
837         afs_warn("afs: AFSOP_SOCKPROXY_HANDLER can't read uspc\n");
838         goto done;
839     }
840
841     npkts = uspc.req.usp.npkts;
842     orig_npkts = npkts;
843
844     if (uspc.reqtype == AFS_USPC_SOCKPROXY_RECV && npkts > 0) {
845         /* copyin packets in from user-space */
846         code = sockproxy_pkts_copyin(a_parm_pkts, &pkts_recv, npkts);
847         if (code) {
848             afs_warn("afs: AFSOP_SOCKPROXY_HANDLER can't read pkts\n");
849             goto done;
850         }
851     }
852
853     /*
854      * send response from user-space (if any) to the rx layer and wait for a
855      * new request.
856      */
857     code = rxk_SockProxyReply(&uspc, pkts_recv, &pkts_send);
858     if (code) {
859         afs_warn("afs: AFSOP_SOCKPROXY_HANDLER rxk_SockProxyReply failed\n");
860         goto done;
861     }
862
863     /* send request to user-space process */
864     AFS_COPYOUT(&uspc, a_parm_uspc, sizeof(uspc), code);
865     if (code) {
866         afs_warn("afs: AFSOP_SOCKPROXY_HANDLER can't write uspc\n");
867         goto done;
868     }
869
870     npkts = uspc.req.usp.npkts;
871     if (uspc.reqtype == AFS_USPC_SOCKPROXY_SEND && npkts > 0) {
872         /* check if process allocated enough memory to receive the packets */
873         if (npkts > orig_npkts) {
874             code = ENOSPC;
875             goto done;
876         }
877
878         /* copyout packets to user-space */
879         code = sockproxy_pkts_copyout(a_parm_pkts, pkts_send, npkts);
880         if (code != 0) {
881             afs_warn("afs: AFSOP_SOCKPROXY_HANDLER can't write pkts\n");
882             goto done;
883         }
884     }
885  done:
886     sockproxy_pkts_free(&pkts_recv, orig_npkts);
887     AFS_GLOCK();
888
889     return code;
890 }
891 #endif /* AFS_SOCKPROXY_ENV */
892
893 #ifdef AFS_DARWIN100_ENV
894 # define AFSKPTR(X) k ## X
895 int
896 afs_syscall_call(long parm, long parm2, long parm3,
897                  long parm4, long parm5, long parm6)
898 {
899     return afs_syscall64_call(CAST_USER_ADDR_T((parm)),
900                               CAST_USER_ADDR_T((parm2)),
901                               CAST_USER_ADDR_T((parm3)),
902                               CAST_USER_ADDR_T((parm4)),
903                               CAST_USER_ADDR_T((parm5)),
904                               CAST_USER_ADDR_T((parm6)));
905 }
906 #else
907 # define AFSKPTR(X) ((caddr_t)X)
908 #endif
909 int
910 #ifdef AFS_DARWIN100_ENV
911 afs_syscall64_call(user_addr_t kparm, user_addr_t kparm2, user_addr_t kparm3,
912                  user_addr_t kparm4, user_addr_t kparm5, user_addr_t kparm6)
913 #else
914 afs_syscall_call(long parm, long parm2, long parm3,
915                  long parm4, long parm5, long parm6)
916 #endif
917 {
918     afs_int32 code = 0;
919 #if defined(AFS_SGI_ENV) || defined(AFS_SUN5_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
920     size_t bufferSize;
921 #else /* AFS_SGI_ENV */
922     u_int bufferSize;
923 #endif /* AFS_SGI_ENV */
924 #ifdef AFS_DARWIN100_ENV
925     /* AFSKPTR macro relies on this name format/mapping */
926     afs_uint32 parm = (afs_uint32)kparm;
927     afs_uint32 parm2 = (afs_uint32)kparm2;
928     afs_uint32 parm3 = (afs_uint32)kparm3;
929     afs_uint32 parm4 = (afs_uint32)kparm4;
930     afs_uint32 parm5 = (afs_uint32)kparm5;
931     afs_uint32 parm6 = (afs_uint32)kparm6;
932 #endif
933
934     AFS_STATCNT(afs_syscall_call);
935     if (
936 #ifdef  AFS_SUN5_ENV
937         !afs_suser(CRED())
938 #else
939         !afs_suser(NULL)
940 #endif
941                     && (parm != AFSOP_GETMTU) && (parm != AFSOP_GETMASK)) {
942         /* only root can run this code */
943 #if defined(AFS_SUN5_ENV) || defined(KERNEL_HAVE_UERROR)
944 # if defined(KERNEL_HAVE_UERROR)
945         setuerror(EACCES);
946 # endif
947         code = EACCES;
948 #else
949         code = EPERM;
950 #endif
951         AFS_GLOCK();
952 #ifdef AFS_DARWIN80_ENV
953         put_vfs_context();
954 #endif
955         goto out;
956     }
957     AFS_GLOCK();
958 #ifdef AFS_DARWIN80_ENV
959     put_vfs_context();
960 #endif
961 #ifdef AFS_DAEMONOP_ENV
962 # if defined(AFS_NEW_BKG)
963     if (parm == AFSOP_BKG_HANDLER) {
964         /* if afs_uspc_param grows this should be checked */
965         struct afs_uspc_param *mvParam = osi_AllocSmallSpace(AFS_SMALLOCSIZ);
966         void *param2;
967         void *param1;
968         int namebufsz;
969
970         AFS_COPYIN(AFSKPTR(parm2), (caddr_t)mvParam,
971                    sizeof(struct afs_uspc_param), code);
972         namebufsz = mvParam->bufSz;
973         param1 = afs_osi_Alloc(namebufsz);
974         osi_Assert(param1 != NULL);
975         param2 = afs_osi_Alloc(namebufsz);
976         osi_Assert(param2 != NULL);
977
978         while (afs_initState < AFSOP_START_BKG)
979             afs_osi_Sleep(&afs_initState);
980         if (afs_initState < AFSOP_GO) {
981             afs_initState = AFSOP_GO;
982             afs_osi_Wakeup(&afs_initState);
983         }
984
985         code = afs_BackgroundDaemon(mvParam, param1, param2);
986
987         if (!code) {
988             mvParam->retval = 0;
989             /* for reqs where pointers are strings: */
990 #  ifdef AFS_DARWIN_ENV
991             if (mvParam->reqtype == AFS_USPC_UMV) {
992                 /* don't copy out random kernel memory */
993                 AFS_COPYOUT(param2, AFSKPTR(parm4),
994                             MIN(namebufsz, strlen((char *)param2)+1), code);
995                 AFS_COPYOUT(param1, AFSKPTR(parm3),
996                             MIN(namebufsz, strlen((char *)param1)+1), code);
997             }
998 #  endif /* AFS_DARWIN_ENV */
999             AFS_COPYOUT((caddr_t)mvParam, AFSKPTR(parm2),
1000                        sizeof(struct afs_uspc_param), code);
1001         }
1002
1003         afs_osi_Free(param1, namebufsz);
1004         afs_osi_Free(param2, namebufsz);
1005         osi_FreeSmallSpace(mvParam);
1006     } else
1007 # endif /* AFS_NEW_BKG */
1008     if (parm < AFSOP_ADDCELL || parm == AFSOP_RXEVENT_DAEMON
1009         || parm == AFSOP_RXLISTENER_DAEMON) {
1010         afs_DaemonOp(parm, parm2, parm3, parm4, parm5, parm6);
1011     }
1012 #else /* !AFS_DAEMONOP_ENV */
1013     if (parm == AFSOP_START_RXCALLBACK) {
1014         if (afs_CB_Running)
1015             goto out;
1016         afs_CB_Running = 1;
1017 # ifndef RXK_LISTENER_ENV
1018         code = afs_InitSetup(parm2);
1019         if (!code)
1020 # endif /* !RXK_LISTENER_ENV */
1021         {
1022 # ifdef RXK_LISTENER_ENV
1023             while (afs_RX_Running != 2)
1024                 afs_osi_Sleep(&afs_RX_Running);
1025 # else /* !RXK_LISTENER_ENV */
1026             if (parm3) {
1027                 rx_enablePeerRPCStats();
1028             }
1029             if (parm4) {
1030                 rx_enableProcessRPCStats();
1031             }
1032             afs_initState = AFSOP_START_AFS;
1033             afs_osi_Wakeup(&afs_initState);
1034 # endif /* RXK_LISTENER_ENV */
1035             afs_osi_Invisible();
1036             afs_RXCallBackServer();
1037             afs_osi_Visible();
1038         }
1039 # ifdef AFS_SGI_ENV
1040         AFS_GUNLOCK();
1041         exit(CLD_EXITED, code);
1042 # endif /* AFS_SGI_ENV */
1043     }
1044 # ifdef RXK_LISTENER_ENV
1045     else if (parm == AFSOP_RXLISTENER_DAEMON) {
1046         if (afs_RX_Running)
1047             goto out;
1048         afs_RX_Running = 1;
1049         code = afs_InitSetup(parm2);
1050         if (parm3) {
1051             rx_enablePeerRPCStats();
1052         }
1053         if (parm4) {
1054             rx_enableProcessRPCStats();
1055         }
1056         if (!code) {
1057             afs_initState = AFSOP_START_AFS;
1058             afs_osi_Wakeup(&afs_initState);
1059             afs_osi_Invisible();
1060             afs_RX_Running = 2;
1061             afs_osi_Wakeup(&afs_RX_Running);
1062 #  ifndef UKERNEL
1063             afs_osi_RxkRegister();
1064 #  endif /* !UKERNEL */
1065             rxk_Listener();
1066             afs_osi_Visible();
1067         }
1068 #  ifdef        AFS_SGI_ENV
1069         AFS_GUNLOCK();
1070         exit(CLD_EXITED, code);
1071 #  endif /* AFS_SGI_ENV */
1072     }
1073 # endif /* RXK_LISTENER_ENV */
1074     else if (parm == AFSOP_START_AFS) {
1075         /* afs daemon */
1076         if (AFS_Running)
1077             goto out;
1078         AFS_Running = 1;
1079         while (afs_initState < AFSOP_START_AFS)
1080             afs_osi_Sleep(&afs_initState);
1081
1082         afs_initState = AFSOP_START_BKG;
1083         afs_osi_Wakeup(&afs_initState);
1084         afs_osi_Invisible();
1085         afs_Daemon();
1086         afs_osi_Visible();
1087 # ifdef AFS_SGI_ENV
1088         AFS_GUNLOCK();
1089         exit(CLD_EXITED, 0);
1090 # endif /* AFS_SGI_ENV */
1091     } else if (parm == AFSOP_START_CS) {
1092         afs_osi_Invisible();
1093         afs_CheckServerDaemon();
1094         afs_osi_Visible();
1095 # ifdef AFS_SGI_ENV
1096         AFS_GUNLOCK();
1097         exit(CLD_EXITED, 0);
1098 # endif /* AFS_SGI_ENV */
1099 # ifndef AFS_NEW_BKG
1100     } else if (parm == AFSOP_START_BKG) {
1101         while (afs_initState < AFSOP_START_BKG)
1102             afs_osi_Sleep(&afs_initState);
1103         if (afs_initState < AFSOP_GO) {
1104             afs_initState = AFSOP_GO;
1105             afs_osi_Wakeup(&afs_initState);
1106         }
1107         /* start the bkg daemon */
1108         afs_osi_Invisible();
1109 #  ifdef AFS_AIX32_ENV
1110         if (parm2)
1111             afs_BioDaemon(parm2);
1112         else
1113 #  endif /* AFS_AIX32_ENV */
1114             afs_BackgroundDaemon();
1115         afs_osi_Visible();
1116 #  ifdef AFS_SGI_ENV
1117         AFS_GUNLOCK();
1118         exit(CLD_EXITED, 0);
1119 #  endif /* AFS_SGI_ENV */
1120 # endif /* ! AFS_NEW_BKG */
1121     } else if (parm == AFSOP_START_TRUNCDAEMON) {
1122         while (afs_initState < AFSOP_GO)
1123             afs_osi_Sleep(&afs_initState);
1124         /* start the bkg daemon */
1125         afs_osi_Invisible();
1126         afs_CacheTruncateDaemon();
1127         afs_osi_Visible();
1128 # ifdef AFS_SGI_ENV
1129         AFS_GUNLOCK();
1130         exit(CLD_EXITED, 0);
1131 # endif /* AFS_SGI_ENV */
1132     }
1133 # if defined(AFS_SUN5_ENV) || defined(RXK_LISTENER_ENV) || defined(RXK_UPCALL_ENV)
1134     else if (parm == AFSOP_RXEVENT_DAEMON) {
1135         while (afs_initState < AFSOP_START_BKG)
1136             afs_osi_Sleep(&afs_initState);
1137         afs_osi_Invisible();
1138         afs_rxevent_daemon();
1139         afs_osi_Visible();
1140 #  ifdef AFS_SGI_ENV
1141         AFS_GUNLOCK();
1142         exit(CLD_EXITED, 0);
1143 #  endif /* AFS_SGI_ENV */
1144     }
1145 # endif /* AFS_SUN5_ENV || RXK_LISTENER_ENV || RXK_UPCALL_ENV */
1146 #endif /* AFS_DAEMONOP_ENV */
1147     else if (parm == AFSOP_BASIC_INIT) {
1148         afs_int32 temp;
1149
1150         while (!afs_InitSetup_done)
1151             afs_osi_Sleep(&afs_InitSetup_done);
1152
1153 #if defined(AFS_SGI_ENV) || defined(AFS_HPUX_ENV) || defined(AFS_LINUX_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV) || defined(AFS_SUN5_ENV)
1154         temp = AFS_MINBUFFERS;  /* Should fix this soon */
1155 #else
1156         /* number of 2k buffers we could get from all of the buffer space */
1157         temp = ((afs_bufferpages * NBPG) >> 11);
1158         temp = temp >> 2;       /* don't take more than 25% (our magic parameter) */
1159         if (temp < AFS_MINBUFFERS)
1160             temp = AFS_MINBUFFERS;      /* though we really should have this many */
1161 #endif
1162         DInit(temp);
1163         afs_rootFid.Fid.Volume = 0;
1164         code = 0;
1165     } else if (parm == AFSOP_BUCKETPCT) {
1166         /* need to enable this now, will disable again before GO
1167            if we don't have 100% */
1168         splitdcache = 1;
1169         switch (parm2) {
1170         case 1:
1171             afs_tpct1 = parm3;
1172             break;
1173         case 2:
1174             afs_tpct2 = parm3;
1175             break;
1176         }
1177     } else if (parm == AFSOP_ADDCELL) {
1178         /* add a cell.  Parameter 2 is 8 hosts (in net order),  parm 3 is the null-terminated
1179          * name.  Parameter 4 is the length of the name, including the null.  Parm 5 is the
1180          * home cell flag (0x1 bit) and the nosuid flag (0x2 bit) */
1181         struct afsop_cell *tcell = afs_osi_Alloc(sizeof(struct afsop_cell));
1182
1183         osi_Assert(tcell != NULL);
1184         code = afs_InitDynroot();
1185         if (!code) {
1186             AFS_COPYIN(AFSKPTR(parm2), (caddr_t)tcell->hosts, sizeof(tcell->hosts),
1187                        code);
1188         }
1189         if (!code) {
1190             if (parm4 > sizeof(tcell->cellName))
1191                 code = EFAULT;
1192             else {
1193               AFS_COPYIN(AFSKPTR(parm3), (caddr_t)tcell->cellName, parm4, code);
1194                 if (!code)
1195                     afs_NewCell(tcell->cellName, tcell->hosts, parm5, NULL, 0,
1196                                 0, 0);
1197             }
1198         }
1199         afs_osi_Free(tcell, sizeof(struct afsop_cell));
1200     } else if (parm == AFSOP_ADDCELL2) {
1201         struct afsop_cell *tcell = afs_osi_Alloc(sizeof(struct afsop_cell));
1202         char *tbuffer = osi_AllocSmallSpace(AFS_SMALLOCSIZ), *lcnamep = 0;
1203         char *tbuffer1 = osi_AllocSmallSpace(AFS_SMALLOCSIZ);
1204         int cflags = parm4;
1205
1206         osi_Assert(tcell != NULL);
1207         osi_Assert(tbuffer != NULL);
1208         osi_Assert(tbuffer1 != NULL);
1209         code = afs_InitDynroot();
1210         if (!code) {
1211             AFS_COPYIN(AFSKPTR(parm2), (caddr_t)tcell->hosts, sizeof(tcell->hosts),
1212                        code);
1213         }
1214         if (!code) {
1215             AFS_COPYINSTR(AFSKPTR(parm3), tbuffer1, AFS_SMALLOCSIZ,
1216                           &bufferSize, code);
1217             if (!code) {
1218                 if (parm4 & 4) {
1219                     AFS_COPYINSTR(AFSKPTR(parm5), tbuffer, AFS_SMALLOCSIZ,
1220                                   &bufferSize, code);
1221                     if (!code) {
1222                         lcnamep = tbuffer;
1223                         cflags |= CLinkedCell;
1224                     }
1225                 }
1226                 if (parm4 & 8) {
1227                     cflags |= CHush;
1228                 }
1229                 if (!code)
1230                     code =
1231                         afs_NewCell(tbuffer1, tcell->hosts, cflags, lcnamep,
1232                                     0, 0, 0);
1233             }
1234         }
1235         afs_osi_Free(tcell, sizeof(struct afsop_cell));
1236         osi_FreeSmallSpace(tbuffer);
1237         osi_FreeSmallSpace(tbuffer1);
1238     } else if (parm == AFSOP_ADDCELLALIAS) {
1239         /*
1240          * Call arguments:
1241          * parm2 is the alias name
1242          * parm3 is the real cell name
1243          */
1244         char *aliasName = osi_AllocSmallSpace(AFS_SMALLOCSIZ);
1245         char *cellName = osi_AllocSmallSpace(AFS_SMALLOCSIZ);
1246
1247         code = afs_InitDynroot();
1248         if (!code) {
1249             AFS_COPYINSTR(AFSKPTR(parm2), aliasName, AFS_SMALLOCSIZ, &bufferSize,
1250                           code);
1251         }
1252         if (!code)
1253             AFS_COPYINSTR(AFSKPTR(parm3), cellName, AFS_SMALLOCSIZ,
1254                           &bufferSize, code);
1255         if (!code)
1256             afs_NewCellAlias(aliasName, cellName);
1257         osi_FreeSmallSpace(aliasName);
1258         osi_FreeSmallSpace(cellName);
1259     } else if (parm == AFSOP_SET_THISCELL) {
1260         /*
1261          * Call arguments:
1262          * parm2 is the primary cell name
1263          */
1264         char *cell = osi_AllocSmallSpace(AFS_SMALLOCSIZ);
1265
1266         afs_CellInit();
1267         AFS_COPYINSTR(AFSKPTR(parm2), cell, AFS_SMALLOCSIZ, &bufferSize, code);
1268         if (!code)
1269             afs_SetPrimaryCell(cell);
1270         osi_FreeSmallSpace(cell);
1271         if (!code) {
1272             code = afs_InitDynroot();
1273         }
1274     } else if (parm == AFSOP_CACHEINIT) {
1275         struct afs_cacheParams cparms;
1276
1277         if (afs_CacheInit_Done)
1278             goto out;
1279
1280         AFS_COPYIN(AFSKPTR(parm2), (caddr_t) & cparms, sizeof(cparms), code);
1281         if (code) {
1282 #if defined(KERNEL_HAVE_UERROR)
1283             setuerror(code);
1284             code = -1;
1285 #endif
1286             goto out;
1287         }
1288         afs_CacheInit_Done = 1;
1289         code = afs_icl_InitLogs();
1290         if (cparms.setTimeFlag) {
1291             afs_warn("afs: AFSOP_CACHEINIT setTimeFlag ignored; are you "
1292                      "running an old afsd?\n");
1293         }
1294
1295         code =
1296             afs_CacheInit(cparms.cacheScaches, cparms.cacheFiles,
1297                           cparms.cacheBlocks, cparms.cacheDcaches,
1298                           cparms.cacheVolumes, cparms.chunkSize,
1299                           cparms.memCacheFlag, cparms.inodes, cparms.users,
1300                           cparms.dynamic_vcaches);
1301
1302     } else if (parm == AFSOP_CACHEINODE) {
1303         ino_t ainode = parm2;
1304         /* wait for basic init */
1305         while (afs_initState < AFSOP_START_BKG)
1306             afs_osi_Sleep(&afs_initState);
1307
1308 #ifdef AFS_DARWIN80_ENV
1309         get_vfs_context();
1310 #endif
1311         /* do it by inode */
1312 #ifdef AFS_SGI_ENV
1313         ainode = (ainode << 32) | (parm3 & 0xffffffff);
1314 #endif
1315         code = afs_InitCacheFile(NULL, ainode);
1316 #ifdef AFS_DARWIN80_ENV
1317         put_vfs_context();
1318 #endif
1319     } else if (parm == AFSOP_CACHEDIRS) {
1320         afs_numfilesperdir = parm2;
1321         afs_osi_Wakeup(&afs_initState);
1322     } else if (parm == AFSOP_CACHEFILES) {
1323         afs_numcachefiles = parm2;
1324         afs_osi_Wakeup(&afs_initState);
1325     } else if (parm == AFSOP_ROOTVOLUME) {
1326         /* wait for basic init */
1327         while (afs_initState < AFSOP_START_BKG)
1328             afs_osi_Sleep(&afs_initState);
1329
1330         if (parm2) {
1331             AFS_COPYINSTR(AFSKPTR(parm2), afs_rootVolumeName,
1332                           sizeof(afs_rootVolumeName), &bufferSize, code);
1333             afs_rootVolumeName[sizeof(afs_rootVolumeName) - 1] = 0;
1334         } else
1335             code = 0;
1336     } else if (parm == AFSOP_CACHEFILE || parm == AFSOP_CACHEINFO
1337                || parm == AFSOP_VOLUMEINFO || parm == AFSOP_CELLINFO) {
1338         char *tbuffer = osi_AllocSmallSpace(AFS_SMALLOCSIZ);
1339
1340         code = 0;
1341         AFS_COPYINSTR(AFSKPTR(parm2), tbuffer, AFS_SMALLOCSIZ, &bufferSize,
1342                       code);
1343         if (!code) {
1344             tbuffer[AFS_SMALLOCSIZ - 1] = '\0'; /* null-terminate the name */
1345             /* We have the cache dir copied in.  Call the cache init routine */
1346 #ifdef AFS_DARWIN80_ENV
1347             get_vfs_context();
1348 #endif
1349             if (parm == AFSOP_CACHEFILE) {
1350                 code = afs_InitCacheFile(tbuffer, 0);
1351             } else if (parm == AFSOP_CACHEINFO) {
1352                 code = afs_InitCacheInfo(tbuffer);
1353             } else if (parm == AFSOP_VOLUMEINFO) {
1354                 code = afs_InitVolumeInfo(tbuffer);
1355             } else if (parm == AFSOP_CELLINFO) {
1356                 code = afs_InitCellInfo(tbuffer);
1357             }
1358 #ifdef AFS_DARWIN80_ENV
1359             put_vfs_context();
1360 #endif
1361         }
1362         osi_FreeSmallSpace(tbuffer);
1363     } else if (parm == AFSOP_GO) {
1364         /* the generic initialization calls come here.  One parameter: should we do the
1365          * set-time operation on this workstation */
1366         if (afs_Go_Done)
1367             goto out;
1368         afs_Go_Done = 1;
1369         while (afs_initState < AFSOP_GO)
1370             afs_osi_Sleep(&afs_initState);
1371         afs_initState = 101;
1372         if (parm2) {
1373             /* parm2 used to set afs_setTime */
1374             afs_warn("afs: AFSOP_GO setTime flag ignored; are you running an "
1375                      "old afsd?\n");
1376         }
1377         if (afs_tpct1 + afs_tpct2 != 100) {
1378             afs_tpct1 = 0;
1379             afs_tpct2 = 0;
1380             splitdcache = 0;
1381         } else {
1382             splitdcache = 1;
1383         }
1384         afs_osi_Wakeup(&afs_initState);
1385 #if     (!defined(AFS_NONFSTRANS)) || defined(AFS_AIX_IAUTH_ENV)
1386         afs_nfsclient_init();
1387 #endif
1388         if (afs_uuid_create(&afs_cb_interface.uuid) != 0)
1389             memset(&afs_cb_interface.uuid, 0, sizeof(afsUUID));
1390
1391 #if defined(AFS_SUN5_ENV)
1392         afs_kstat_init();
1393 #endif
1394
1395         printf("found %d non-empty cache files (%d%%).\n",
1396                afs_stats_cmperf.cacheFilesReused,
1397                (100 * afs_stats_cmperf.cacheFilesReused) /
1398                (afs_stats_cmperf.cacheNumEntries ? afs_stats_cmperf.
1399                 cacheNumEntries : 1));
1400     } else if (parm == AFSOP_ADVISEADDR) {
1401         /* pass in the host address to the rx package */
1402         int rxbind = 0;
1403         int refresh = 0;
1404
1405         afs_int32 count = parm2;
1406         afs_int32 *buffer =
1407             afs_osi_Alloc(sizeof(afs_int32) * AFS_MAX_INTERFACE_ADDR);
1408         afs_int32 *maskbuffer =
1409             afs_osi_Alloc(sizeof(afs_int32) * AFS_MAX_INTERFACE_ADDR);
1410         afs_int32 *mtubuffer =
1411             afs_osi_Alloc(sizeof(afs_int32) * AFS_MAX_INTERFACE_ADDR);
1412         int i;
1413
1414         osi_Assert(buffer != NULL);
1415         osi_Assert(maskbuffer != NULL);
1416         osi_Assert(mtubuffer != NULL);
1417         /* This is a refresh */
1418         if (count & 0x40000000) {
1419             count &= ~0x40000000;
1420             /* Can't bind after we start. Fix? */
1421             count &= ~0x80000000;
1422             refresh = 1;
1423         }
1424
1425         /* Bind, but only if there's only one address configured */
1426         if ( count & 0x80000000) {
1427             count &= ~0x80000000;
1428             if (count == 1)
1429                 rxbind=1;
1430         }
1431
1432         if (count > AFS_MAX_INTERFACE_ADDR) {
1433             code = ENOMEM;
1434             count = AFS_MAX_INTERFACE_ADDR;
1435         }
1436
1437         AFS_COPYIN(AFSKPTR(parm3), (caddr_t)buffer, count * sizeof(afs_int32),
1438                    code);
1439         if (parm4 && !code)
1440             AFS_COPYIN(AFSKPTR(parm4), (caddr_t)maskbuffer,
1441                        count * sizeof(afs_int32), code);
1442         if (parm5 && !code)
1443             AFS_COPYIN(AFSKPTR(parm5), (caddr_t)mtubuffer,
1444                        count * sizeof(afs_int32), code);
1445
1446         if (!code) {
1447             afs_cb_interface.numberOfInterfaces = count;
1448             for (i = 0; i < count; i++) {
1449                 afs_cb_interface.addr_in[i] = buffer[i];
1450 #ifdef AFS_USERSPACE_IP_ADDR
1451                 /* AFS_USERSPACE_IP_ADDR means we have no way of finding the
1452                  * machines IP addresses when in the kernel (the in_ifaddr
1453                  * struct is not available), so we pass the info in at
1454                  * startup. We also pass in the subnetmask and mtu size. The
1455                  * subnetmask is used when setting the rank:
1456                  * afsi_SetServerIPRank(); and the mtu size is used when
1457                  * finding the best mtu size. rxi_FindIfnet() is replaced
1458                  * with rxi_Findcbi().
1459                  */
1460                 afs_cb_interface.subnetmask[i] =
1461                     (parm4 ? maskbuffer[i] : 0xffffffff);
1462                 afs_cb_interface.mtu[i] = (parm5 ? mtubuffer[i] : htonl(1500));
1463 #endif
1464             }
1465             rxi_setaddr(buffer[0]);
1466             if (!refresh) {
1467                 if (rxbind)
1468                     rx_bindhost = buffer[0];
1469                 else
1470                     rx_bindhost = htonl(INADDR_ANY);
1471             }
1472         } else {
1473             refresh = 0;
1474         }
1475
1476         afs_osi_Free(buffer, sizeof(afs_int32) * AFS_MAX_INTERFACE_ADDR);
1477         afs_osi_Free(maskbuffer, sizeof(afs_int32) * AFS_MAX_INTERFACE_ADDR);
1478         afs_osi_Free(mtubuffer, sizeof(afs_int32) * AFS_MAX_INTERFACE_ADDR);
1479
1480         if (refresh) {
1481             afs_CheckServers(1, NULL);     /* check down servers */
1482             afs_CheckServers(0, NULL);     /* check up servers */
1483         }
1484     }
1485     else if (parm == AFSOP_SHUTDOWN) {
1486         if (afs_globalVFS != 0) {
1487             afs_warn("AFS isn't unmounted yet! Call aborted\n");
1488             code = EACCES;
1489         } else if (parm2 == AFS_COLD) {
1490             afs_shutdown(AFS_COLD);
1491         } else {
1492             afs_shutdown(AFS_WARM);
1493         }
1494     } else if (parm == AFSOP_AFS_VFSMOUNT) {
1495 #ifdef  AFS_HPUX_ENV
1496         vfsmount(parm2, parm3, parm4, parm5);
1497 #else /* defined(AFS_HPUX_ENV) */
1498 # if defined(KERNEL_HAVE_UERROR)
1499         setuerror(EINVAL);
1500 # else
1501         code = EINVAL;
1502 # endif
1503 #endif /* defined(AFS_HPUX_ENV) */
1504     } else if (parm == AFSOP_CLOSEWAIT) {
1505         afs_SynchronousCloses = 'S';
1506     } else if (parm == AFSOP_GETMTU) {
1507         afs_uint32 mtu = 0;
1508 #if     !defined(AFS_SUN5_ENV) && !defined(AFS_LINUX_ENV)
1509 # ifdef AFS_USERSPACE_IP_ADDR
1510         afs_int32 i;
1511         i = rxi_Findcbi(parm2);
1512         mtu = ((i == -1) ? htonl(1500) : afs_cb_interface.mtu[i]);
1513 # else /* AFS_USERSPACE_IP_ADDR */
1514         rx_ifnet_t tifnp;
1515         RX_NET_EPOCH_ENTER();
1516
1517         tifnp = rxi_FindIfnet(parm2, NULL);     /*  make iterative */
1518         mtu = (tifnp ? rx_ifnet_mtu(tifnp) : htonl(1500));
1519
1520         RX_NET_EPOCH_EXIT();
1521 # endif /* else AFS_USERSPACE_IP_ADDR */
1522 #endif /* !AFS_SUN5_ENV */
1523         if (!code)
1524             AFS_COPYOUT((caddr_t) & mtu, AFSKPTR(parm3),
1525                         sizeof(afs_int32), code);
1526     } else if (parm == AFSOP_GETMASK) { /* parm2 == addr in net order */
1527         afs_uint32 mask = 0;
1528 #if     !defined(AFS_SUN5_ENV)
1529 # ifdef AFS_USERSPACE_IP_ADDR
1530         afs_int32 i;
1531         i = rxi_Findcbi(parm2);
1532         if (i != -1) {
1533             mask = afs_cb_interface.subnetmask[i];
1534         } else {
1535             code = -1;
1536         }
1537 # else /* AFS_USERSPACE_IP_ADDR */
1538         rx_ifnet_t tifnp;
1539         RX_NET_EPOCH_ENTER();
1540
1541         tifnp = rxi_FindIfnet(parm2, &mask);    /* make iterative */
1542         if (!tifnp)
1543             code = -1;
1544
1545         RX_NET_EPOCH_EXIT();
1546 # endif /* else AFS_USERSPACE_IP_ADDR */
1547 #endif /* !AFS_SUN5_ENV */
1548         if (!code)
1549             AFS_COPYOUT((caddr_t) & mask, AFSKPTR(parm3),
1550                         sizeof(afs_int32), code);
1551     }
1552     else if (parm == AFSOP_AFSDB_HANDLER) {
1553         int sizeArg = (int)parm4;
1554         int kmsgLen = sizeArg & 0xffff;
1555         int cellLen = (sizeArg & 0xffff0000) >> 16;
1556         afs_int32 *kmsg = afs_osi_Alloc(kmsgLen);
1557         char *cellname = afs_osi_Alloc(cellLen);
1558
1559         osi_Assert(kmsg != NULL);
1560         osi_Assert(cellname != NULL);
1561 #ifndef UKERNEL
1562         afs_osi_MaskUserLoop();
1563 #endif
1564         AFS_COPYIN(AFSKPTR(parm2), cellname, cellLen, code);
1565         AFS_COPYIN(AFSKPTR(parm3), kmsg, kmsgLen, code);
1566         if (!code) {
1567             code = afs_AFSDBHandler(cellname, cellLen, kmsg);
1568             if (*cellname == 1)
1569                 *cellname = 0;
1570             if (code == -2) {   /* Shutting down? */
1571                 *cellname = 1;
1572                 code = 0;
1573             }
1574         }
1575         if (!code)
1576             AFS_COPYOUT(cellname, AFSKPTR(parm2), cellLen, code);
1577         afs_osi_Free(kmsg, kmsgLen);
1578         afs_osi_Free(cellname, cellLen);
1579     }
1580     else if (parm == AFSOP_SET_DYNROOT) {
1581         code = afs_SetDynrootEnable(parm2);
1582     } else if (parm == AFSOP_SET_FAKESTAT) {
1583         if (parm2 >= 0 && parm2 <= 2) {
1584             afs_fakestat_enable = parm2;
1585             code = 0;
1586         } else {
1587             afs_warn("afs: afsd gave us unknown fakestat value %ld (are afsd "
1588                      "and libafs running the same version?\n", parm2);
1589             code = EINVAL;
1590         }
1591     } else if (parm == AFSOP_SET_BACKUPTREE) {
1592         afs_bkvolpref = parm2;
1593     } else if (parm == AFSOP_SET_RXPCK) {
1594         rx_extraPackets = parm2;
1595         afscall_set_rxpck_received = 1;
1596     } else if (parm == AFSOP_SET_RXMAXMTU) {
1597         rx_MyMaxSendSize = rx_maxReceiveSizeUser = rx_maxReceiveSize = parm2;
1598     } else if (parm == AFSOP_SET_RXMAXFRAGS) {
1599         rxi_nSendFrags = rxi_nRecvFrags = parm2;
1600     } else if (parm == AFSOP_SET_RMTSYS_FLAG) {
1601         afs_rmtsys_enable = parm2;
1602         code = 0;
1603 #ifndef UKERNEL
1604     } else if (parm == AFSOP_SEED_ENTROPY) {
1605         unsigned char *seedbuf;
1606
1607         if (parm3 > 4096) {
1608             code = EFAULT;
1609         } else {
1610             seedbuf = afs_osi_Alloc(parm3);
1611             AFS_COPYIN(AFSKPTR(parm2), seedbuf, parm3, code);
1612             RAND_seed(seedbuf, parm3);
1613             memset(seedbuf, 0, parm3);
1614             afs_osi_Free(seedbuf, parm3);
1615         }
1616 #endif
1617     } else if (parm == AFSOP_SET_INUMCALC) {
1618         switch (parm2) {
1619         case AFS_INUMCALC_COMPAT:
1620             afs_md5inum = 0;
1621             code = 0;
1622             break;
1623         case AFS_INUMCALC_MD5:
1624             afs_md5inum = 1;
1625             code = 0;
1626             break;
1627         default:
1628             code = EINVAL;
1629         }
1630     } else if (parm == AFSOP_SET_VOLUME_TTL) {
1631         if ((parm2 < AFS_MIN_VOLUME_TTL) || (parm2 > AFS_MAX_VOLUME_TTL)) {
1632             code = EFAULT;
1633         } else {
1634             afs_volume_ttl = parm2;
1635             code = 0;
1636         }
1637 #ifdef AFS_SOCKPROXY_ENV
1638     } else if (parm == AFSOP_SOCKPROXY_HANDLER) {
1639         code = sockproxy_handler(AFSKPTR(parm2), AFSKPTR(parm3));
1640 #endif
1641     } else {
1642         code = EINVAL;
1643     }
1644
1645   out:
1646     AFS_GUNLOCK();
1647 #ifdef AFS_LINUX_ENV
1648     return -code;
1649 #else
1650     return code;
1651 #endif
1652 }
1653
1654 /*
1655  * Initstate in the range 0 < x < 100 are early initialization states.
1656  * Initstate of 100 means a AFSOP_START operation has been done.  After this,
1657  *  the cache may be initialized.
1658  * Initstate of 101 means a AFSOP_GO operation has been done.  This operation
1659  *  is done after all the cache initialization has been done.
1660  * Initstate of 200 means that the volume has been looked up once, possibly
1661  *  incorrectly.
1662  * Initstate of 300 means that the volume has been *successfully* looked up.
1663  */
1664 int
1665 afs_CheckInit(void)
1666 {
1667     int code = 0;
1668
1669     AFS_STATCNT(afs_CheckInit);
1670     if (afs_initState <= 100)
1671         code = ENXIO;           /* never finished init phase */
1672     else if (afs_initState == 101) {    /* init done, wait for afs_daemon */
1673         while (afs_initState < 200)
1674             afs_osi_Sleep(&afs_initState);
1675     } else if (afs_initState == 200)
1676         code = ETIMEDOUT;       /* didn't find root volume */
1677     return code;
1678 }
1679
1680 enum afs_shutdown_state afs_shuttingdown = AFS_RUNNING;
1681 void
1682 afs_shutdown(enum afs_shutdown_type cold_flag)
1683 {
1684     extern short afs_brsDaemons;
1685     extern afs_int32 afs_CheckServerDaemonStarted;
1686     extern struct afs_osi_WaitHandle AFS_WaitHandler, AFS_CSWaitHandler;
1687     extern struct osi_file *afs_cacheInodep;
1688
1689     AFS_STATCNT(afs_shutdown);
1690     if (afs_initState == 0) {
1691         afs_warn("AFS not initialized - not shutting down\n");
1692       return;
1693     }
1694
1695     if (afs_shuttingdown != AFS_RUNNING)
1696         return;
1697
1698     afs_cold_shutdown = ((cold_flag == AFS_COLD) ? 1 : 0);
1699
1700     afs_shuttingdown = AFS_FLUSHING_CB;
1701
1702     /* Give up all of our callbacks if we can. */
1703     afs_FlushVCBs(2);
1704
1705     afs_shuttingdown = AFS_SHUTDOWN;
1706
1707 #if defined(AFS_SUN5_ENV)
1708     afs_kstat_shutdown();
1709 #endif
1710
1711     if (afs_cold_shutdown)
1712         afs_warn("afs: COLD ");
1713     else
1714         afs_warn("afs: WARM ");
1715     afs_warn("shutting down of: vcaches... ");
1716
1717 #if !defined(AFS_FBSD_ENV)
1718     /* The FBSD afs_unmount() calls vflush(), which reclaims all vnodes
1719      * on the mountpoint, flushing them in the process.  In the presence
1720      * of bugs, flushing again here can cause panics. */
1721     afs_FlushAllVCaches();
1722 #endif
1723
1724     afs_termState = AFSOP_STOP_BKG;
1725
1726     afs_warn("BkG... ");
1727     /* Wake-up afs_brsDaemons so that we don't have to wait for a bkg job! */
1728     while (afs_termState == AFSOP_STOP_BKG) {
1729         afs_osi_Wakeup(&afs_brsDaemons);
1730         afs_osi_Sleep(&afs_termState);
1731     }
1732
1733     afs_warn("CB... ");
1734
1735     afs_termState = AFSOP_STOP_RXCALLBACK;
1736     AFS_GUNLOCK();
1737     rx_WakeupServerProcs();
1738     AFS_GLOCK();
1739 #ifdef AFS_AIX51_ENV
1740     shutdown_rxkernel();
1741 #endif
1742     /* close rx server connections here? */
1743     while (afs_termState == AFSOP_STOP_RXCALLBACK)
1744         afs_osi_Sleep(&afs_termState);
1745
1746     afs_warn("afs... ");
1747     while (afs_termState == AFSOP_STOP_AFS) {
1748         afs_osi_CancelWait(&AFS_WaitHandler);
1749         afs_osi_Sleep(&afs_termState);
1750     }
1751     if (afs_CheckServerDaemonStarted) {
1752         while (afs_termState == AFSOP_STOP_CS) {
1753             afs_osi_CancelWait(&AFS_CSWaitHandler);
1754             afs_osi_Sleep(&afs_termState);
1755         }
1756     }
1757     afs_warn("CTrunc... ");
1758     /* Cancel cache truncate daemon. */
1759     while (afs_termState == AFSOP_STOP_TRUNCDAEMON) {
1760         afs_osi_Wakeup((char *)&afs_CacheTruncateDaemon);
1761         afs_osi_Sleep(&afs_termState);
1762     }
1763     afs_warn("AFSDB... ");
1764     afs_StopAFSDB();
1765     while (afs_termState == AFSOP_STOP_AFSDB)
1766         afs_osi_Sleep(&afs_termState);
1767 #if     defined(AFS_SUN5_ENV) || defined(RXK_LISTENER_ENV) || defined(RXK_UPCALL_ENV)
1768     afs_warn("RxEvent... ");
1769     /* cancel rx event daemon */
1770     while (afs_termState == AFSOP_STOP_RXEVENT)
1771         afs_osi_Sleep(&afs_termState);
1772 # if defined(RXK_LISTENER_ENV)
1773 #  ifndef UKERNEL
1774     afs_warn("UnmaskRxkSignals... ");
1775     afs_osi_UnmaskRxkSignals();
1776 #  endif
1777     /* cancel rx listener */
1778     afs_warn("RxListener... ");
1779     osi_StopListener();         /* This closes rx_socket. */
1780     while (afs_termState == AFSOP_STOP_RXK_LISTENER) {
1781         afs_warn("Sleep... ");
1782         afs_osi_Sleep(&afs_termState);
1783     }
1784 # endif
1785 #endif
1786
1787 #if defined(AFS_SUN510_ENV) || defined(RXK_UPCALL_ENV)
1788     afs_warn("NetIfPoller... ");
1789     osi_StopNetIfPoller();
1790 #endif
1791     AFS_GUNLOCK();
1792     rxi_FreeAllPackets();
1793     AFS_GLOCK();
1794
1795     afs_termState = AFSOP_STOP_COMPLETE;
1796
1797 #ifdef AFS_AIX51_ENV
1798     shutdown_daemons();
1799 #endif
1800     shutdown_CB();
1801     shutdown_bufferpackage();
1802     shutdown_cache();
1803     shutdown_osi();
1804     /*
1805      * Close file only after daemons which can write to it are stopped.
1806      * Need to close before the osinet shutdown to avoid failing check
1807      * for dangling memory allocations.
1808      */
1809     if (afs_cacheInodep) {      /* memcache won't set this */
1810         osi_UFSClose(afs_cacheInodep);  /* Since we always leave it open */
1811         afs_cacheInodep = 0;
1812     }
1813     /*
1814      * Shutdown the ICL logs - needed to free allocated memory space and avoid
1815      * warnings from shutdown_osinet
1816      */
1817     shutdown_icl();
1818     shutdown_osinet();
1819     shutdown_osifile();
1820     shutdown_vnodeops();
1821     shutdown_memcache();
1822     shutdown_xscache();
1823 #if (!defined(AFS_NONFSTRANS) || defined(AFS_AIX_IAUTH_ENV))
1824     shutdown_exporter();
1825     shutdown_nfsclnt();
1826 #endif
1827     shutdown_afstest();
1828     shutdown_dynroot();
1829     shutdown_AFS();
1830     /* The following hold the cm stats */
1831     memset(&afs_cmstats, 0, sizeof(struct afs_CMStats));
1832     memset(&afs_stats_cmperf, 0, sizeof(struct afs_stats_CMPerf));
1833     memset(&afs_stats_cmfullperf, 0, sizeof(struct afs_stats_CMFullPerf));
1834     afs_warn(" ALL allocated tables... ");
1835
1836     afs_shuttingdown = AFS_RUNNING;
1837     afs_warn("done\n");
1838
1839     return;                     /* Just kill daemons for now */
1840 }
1841
1842 void
1843 shutdown_afstest(void)
1844 {
1845     AFS_STATCNT(shutdown_afstest);
1846     afs_initState = afs_termState = 0;
1847     AFS_Running = afs_CB_Running = 0;
1848     afs_CacheInit_Done = afs_Go_Done = 0;
1849     if (afs_cold_shutdown) {
1850         *afs_rootVolumeName = 0;
1851     }
1852 }