Formerly ../hurd/hurdinit.c.~4~
[kopensolaris-gnu/glibc.git] / hurd / hurdinit.c
1 /* Copyright (C) 1992 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
3
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public License as
6 published by the Free Software Foundation; either version 2 of the
7 License, or (at your option) any later version.
8
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 Library General Public License for more details.
13
14 You should have received a copy of the GNU Library General Public
15 License along with the GNU C Library; see the file COPYING.LIB.  If
16 not, write to the Free Software Foundation, Inc., 675 Mass Ave,
17 Cambridge, MA 02139, USA.  */
18
19 #include <hurd.h>
20
21
22 /* Initialize the library data structures from the
23    ints and ports passed to us by the exec server.
24
25    PORTARRAY and INTARRAY are vm_deallocate'd.  */
26
27 void
28 _hurd_init (char **argv,
29             mach_port_t *portarray, size_t portarraysize,
30             int *intarray, size_t intarraysize)
31 {
32   int i;
33
34   /* See what ports we were passed.  */
35   for (i = 0; i < portarraysize; ++i)
36     switch (i)
37       {
38 #define initport(upper, lower) \
39       case INIT_PORT_##upper: \
40         _hurd_port_init (&_hurd_##lower, portarray[i]); \
41         break
42
43           /* Install the standard ports in their cells.  */
44         initport (CCDIR, ccdir);
45         initport (CWDIR, cwdir);
46         initport (CRDIR, crdir);
47         initport (AUTH, auth);
48
49       case INIT_PORT_PROC:
50         /* Install the proc port and tell the proc server we exist.  */
51         _hurd_proc_init (portarray[i], argv);
52         break;
53
54       case INIT_PORT_BOOTSTRAP:
55         /* When the user asks for the bootstrap port,
56            he will get the one the exec server passed us.  */
57         __task_set_special_port (__mach_task_self (),
58                                  TASK_BOOTSTRAP_PORT, portarray[i]);
59         /* FALLTHROUGH */
60
61       default:
62         /* Wonder what that could be.  */
63         __mach_port_deallocate (__mach_task_self (), portarray[i]);
64         break;
65       }
66
67   if (intarraysize > INIT_UMASK)
68     _hurd_umask = intarray[INIT_UMASK] & 0777;
69   else
70     _hurd_umask = 0022;         /* XXX */
71   if (intarraysize > INIT_CTTY_FILEID) /* Knows that these are sequential.  */
72     {
73       _hurd_ctty_fstype = intarray[INIT_CTTY_FSTYPE];
74       _hurd_ctty_fsid.val[0] = intarray[INIT_CTTY_FSID1];
75       _hurd_ctty_fsid.val[1] = intarray[INIT_CTTY_FSID2];
76       _hurd_ctty_fileid = intarray[INIT_CTTY_FILEID];
77     }
78
79
80   /* All done with init ints and ports.  */
81   __vm_deallocate (__mach_task_self (), intarray, nints * sizeof (int));
82   __vm_deallocate (__mach_task_self (),
83                    portarray, nports * sizeof (mach_port_t));
84 }
85 \f
86 /* The user can do "int _hide_arguments = 1;" to make sure the
87    arguments are never visible with `ps'.  */
88 int _hide_arguments;
89
90 /* Make PROCSERVER be our proc server port.
91    Tell the proc server that we exist.  */
92
93 void
94 _hurd_proc_init (process_t procserver, char **argv)
95 {
96   mach_port_t oldsig, oldtask;
97
98   _hurd_port_init (&_hurd_proc, procserver);
99
100   /* Tell the proc server where our args and environment are.  */
101   __proc_setprocargs (procserver, _hide_arguments ? 0 : argv, __environ);
102
103   /* Initialize the signal code; Mach exceptions will become signals.
104      This sets _hurd_msgport; it must be run before _hurd_proc_init.  */
105   _hurdsig_init ();
106
107   /* Give the proc server our task and signal ports.  */
108   __proc_setports (procserver,
109                    _hurd_msgport, __mach_task_self (),
110                    &oldsig, &oldtask);
111   if (oldsig != MACH_PORT_NULL)
112     __mach_port_deallocate (__mach_task_self (), oldsig);
113   if (oldtask != MACH_PORT_NULL)
114     __mach_port_deallocate (__mach_task_self (), oldtask);
115 }