aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--hurd/hurdinit.c36
-rw-r--r--sysdeps/hurd/include/hurd.h3
-rw-r--r--sysdeps/mach/hurd/i386/init-first.c3
3 files changed, 31 insertions, 11 deletions
diff --git a/hurd/hurdinit.c b/hurd/hurdinit.c
index a884b78..e4ec005 100644
--- a/hurd/hurdinit.c
+++ b/hurd/hurdinit.c
@@ -34,6 +34,10 @@ sigset_t _hurdsig_traced;
char **__libc_argv;
int __libc_argc;
+static int *_hurd_intarray;
+static size_t _hurd_intarraysize;
+static mach_port_t *_hurd_portarray;
+static size_t _hurd_portarraysize;
error_t
_hurd_ports_use (int which, error_t (*operate) (mach_port_t))
@@ -87,17 +91,10 @@ _hurd_init (int flags, char **argv,
if (intarraysize > INIT_TRACEMASK)
_hurdsig_traced = intarray[INIT_TRACEMASK];
- /* Tell the proc server we exist, if it does. */
- if (portarray[INIT_PORT_PROC] != MACH_PORT_NULL)
- _hurd_new_proc_init (argv, intarray, intarraysize);
-
- /* All done with init ints and ports. */
- __vm_deallocate (__mach_task_self (),
- (vm_address_t) intarray,
- intarraysize * sizeof (int));
- __vm_deallocate (__mach_task_self (),
- (vm_address_t) portarray,
- portarraysize * sizeof (mach_port_t));
+ _hurd_intarray = intarray;
+ _hurd_intarraysize = intarraysize;
+ _hurd_portarray = portarray;
+ _hurd_portarraysize = portarraysize;
if (flags & EXEC_SECURE)
{
@@ -113,6 +110,23 @@ _hurd_init (int flags, char **argv,
RUN_HOOK (_hurd_subinit, ());
}
libc_hidden_def (_hurd_init)
+
+void
+_hurd_libc_proc_init (char **argv)
+{
+ /* Tell the proc server we exist, if it does. */
+ if (_hurd_portarray[INIT_PORT_PROC] != MACH_PORT_NULL)
+ _hurd_new_proc_init (argv, _hurd_intarray, _hurd_intarraysize);
+
+ /* All done with init ints and ports. */
+ __vm_deallocate (__mach_task_self (),
+ (vm_address_t) _hurd_intarray,
+ _hurd_intarraysize * sizeof (int));
+ __vm_deallocate (__mach_task_self (),
+ (vm_address_t) _hurd_portarray,
+ _hurd_portarraysize * sizeof (mach_port_t));
+}
+libc_hidden_def (_hurd_libc_proc_init)
#include <hurd/signal.h>
diff --git a/sysdeps/hurd/include/hurd.h b/sysdeps/hurd/include/hurd.h
index dc87717..7da9af2 100644
--- a/sysdeps/hurd/include/hurd.h
+++ b/sysdeps/hurd/include/hurd.h
@@ -1,6 +1,8 @@
#ifndef _HURD_H
#include_next <hurd.h>
+void _hurd_libc_proc_init (char **argv);
+
/* Like __USEPORT, but cleans fd on cancel. */
#define __USEPORT_CANCEL(which, expr) \
HURD_PORT_USE_CANCEL (&_hurd_ports[INIT_PORT_##which], (expr))
@@ -8,5 +10,6 @@
#ifndef _ISOMAC
libc_hidden_proto (_hurd_exec_paths)
libc_hidden_proto (_hurd_init)
+libc_hidden_proto (_hurd_libc_proc_init)
#endif
#endif
diff --git a/sysdeps/mach/hurd/i386/init-first.c b/sysdeps/mach/hurd/i386/init-first.c
index 6c35dc8..a3d2fda 100644
--- a/sysdeps/mach/hurd/i386/init-first.c
+++ b/sysdeps/mach/hurd/i386/init-first.c
@@ -63,6 +63,9 @@ posixland_init (int argc, char **argv, char **envp)
{
/* Set the FPU control word to the proper default value. */
__setfpucw (__fpu_control);
+
+ /* Now we have relocations etc. we can start signals etc. */
+ _hurd_libc_proc_init (argv);
}
else
{