Formerly ../hurd/hurdinit.c.~6~
[kopensolaris-gnu/glibc.git] / hurd / hurdinit.c
1 /* Copyright (C) 1992, 1993 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   _hurd_ports = malloc (portarraysize * sizeof (*_hurd_ports));
35   if (_hurd_ports == NULL)
36     __libc_fatal ("Can't allocate _hurd_ports\n");
37   _hurd_nports = portarraysize;
38
39   /* See what ports we were passed.  */
40   for (i = 0; i < portarraysize; ++i)
41     {
42       _hurd_port_init (&_hurd_ports[i], portarray[i]);
43
44       switch (i)
45         {
46         case INIT_PORT_PROC:
47           /* Tell the proc server we exist.  */
48           _hurd_proc_init (argv);
49           break;
50
51         case INIT_PORT_BOOTSTRAP:
52           /* When the user asks for the bootstrap port,
53              he will get the one the exec server passed us.  */
54           __task_set_special_port (__mach_task_self (),
55                                    TASK_BOOTSTRAP_PORT, portarray[i]);
56           break;
57         }
58     }
59
60   if (intarraysize > INIT_UMASK)
61     _hurd_umask = intarray[INIT_UMASK] & 0777;
62   else
63     _hurd_umask = 0022;         /* XXX */
64
65   /* All done with init ints and ports.  */
66   __vm_deallocate (__mach_task_self (), intarray, nints * sizeof (int));
67   __vm_deallocate (__mach_task_self (),
68                    portarray, nports * sizeof (mach_port_t));
69 }
70 \f
71 /* The user can do "int _hide_arguments = 1;" to make
72    sure the arguments are never visible with `ps'.  */
73 int _hide_arguments, _hide_environment;
74
75 /* Do startup handshaking with the proc server just installed in _hurd_ports.
76    Call _hurdsig_init to set up signal processing.  */
77
78 void
79 _hurd_proc_init (char **argv)
80 {
81   mach_port_t oldmsg, oldtask;
82   int dealloc;
83   process_t procserver;
84
85   /* Initialize the signal code; Mach exceptions will become signals.
86      This function will be a no-op on calls after the first.
87      On the first call, it sets up the message port and the signal thread.  */
88   _hurdsig_init ();
89
90   /* The signal thread is now prepared to receive messages.
91      It is safe to give the port to the proc server.  */
92
93   procserver = _hurd_port_get (&_hurd_ports[INIT_PORT_PROC], &dealloc);
94
95   /* Give the proc server our task and message ports.  */
96   __proc_setports (procserver,
97                    _hurd_msgport, __mach_task_self (),
98                    &oldmsg, &oldtask);
99
100   /* Tell the proc server where our args and environment are.  */
101   __proc_setprocargs (procserver,
102                       _hide_arguments ? 0 : argv,
103                       _hide_environment ? 0 : __environ);
104
105   _hurd_port_free (&_hurd_ports[INIT_PORT_PROC], &dealloc, procserver);
106
107   /* Initialize proc server-assisted fault recovery for the signal thread.  */
108   _hurdsig_fault_init ();
109
110   if (oldmsg != MACH_PORT_NULL)
111     __mach_port_deallocate (__mach_task_self (), oldmsg);
112   if (oldtask != MACH_PORT_NULL)
113     __mach_port_deallocate (__mach_task_self (), oldtask);
114 }