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