-/* Copyright (C) 1993, 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 94, 95, 96, 97, 98 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
mach_port_t *portarray, size_t portarraysize,
int *intarray, size_t intarraysize);
-/* Do startup handshaking with the proc server. */
+/* Do startup handshaking with the proc server, and initialize library data
+ structures that require proc server interaction. This includes
+ initializing signals; see _hurdsig_init in <hurd/signal.h>. */
-extern void _hurd_proc_init (char **argv);
+extern void _hurd_proc_init (char **argv,
+ const int *intarray, size_t intarraysize);
/* Return the socket server for sockaddr domain DOMAIN. If DEAD is
/* Implementing POSIX.1 signals under the Hurd.
- Copyright (C) 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
+ Copyright (C) 1993, 94, 95, 96, 98 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
#define HURD_CRITICAL_END \
_hurd_critical_section_unlock (__hurd_critical__); } while (0)
\f
-/* Initialize the signal code, and start the signal thread. */
+/* Initialize the signal code, and start the signal thread.
+ Arguments give the "init ints" from exec_startup. */
-extern void _hurdsig_init (void);
+extern void _hurdsig_init (const int *intarray, size_t intarraysize);
/* Initialize proc server-assisted fault recovery for the signal thread. */
-/* Copyright (C) 1992, 93, 94, 95, 96, 97 Free Software Foundation, Inc.
+/* Copyright (C) 1992, 93, 94, 95, 96, 97, 98 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
return HURD_PORT_USE (&_hurd_ports[which], (*operate) (port));
}
-void _hurd_proc_init (char **argv);
-
DEFINE_HOOK (_hurd_subinit, (void));
/* Initialize the library data structures from the
/* Tell the proc server we exist, if it does. */
if (portarray[INIT_PORT_PROC] != MACH_PORT_NULL)
- _hurd_proc_init (argv);
+ _hurd_proc_init (argv, intarray, intarraysize);
/* All done with init ints and ports. */
__vm_deallocate (__mach_task_self (),
Call _hurdsig_init to set up signal processing. */
void
-_hurd_proc_init (char **argv)
+_hurd_proc_init (char **argv,
+ const int *intarray, size_t intarraysize)
{
mach_port_t oldmsg;
struct hurd_userlink ulink;
process_t procserver;
/* Initialize the signal code; Mach exceptions will become signals. */
- _hurdsig_init ();
+ _hurdsig_init (intarray, intarraysize);
/* The signal thread is now prepared to receive messages.
It is safe to give the port to the proc server. */
-/* Copyright (C) 1991, 92, 93, 94, 95, 96, 97 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 98 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
thread. */
void
-_hurdsig_init (void)
+_hurdsig_init (const int *intarray, size_t intarraysize)
{
error_t err;
vm_size_t stacksize;
+ struct hurd_sigstate *ss;
__mutex_init (&_hurd_siglock);
MACH_MSG_TYPE_MAKE_SEND);
assert_perror (err);
+ /* Initialize the main thread's signal state. */
+ ss = _hurd_self_sigstate ();
+
+ /* Copy inherited values from our parent (or pre-exec process state)
+ into the signal settings of the main thread. */
+ if (intarraysize > INIT_SIGMASK)
+ ss->blocked = intarray[INIT_SIGMASK];
+ if (intarraysize > INIT_SIGPENDING)
+ ss->blocked = intarray[INIT_SIGPENDING];
+ if (intarraysize > INIT_SIGIGN && intarray[INIT_SIGIGN] != 0)
+ {
+ int signo;
+ for (signo = 1; signo < NSIG; ++signo)
+ if (intarray[INIT_SIGIGN] & __sigmask(signo))
+ ss->actions[signo].sa_handler = SIG_IGN;
+ }
+
/* Set the default thread to receive task-global signals
to this one, the main (first) user thread. */
- _hurd_sigthread = __mach_thread_self ();
+ _hurd_sigthread = ss->thread;
/* Start the signal thread listening on the message port. */
err = __thread_resume (_hurd_msgport_thread);
assert_perror (err);
- (void) _hurd_self_sigstate ();
-
/* Receive exceptions on the signal port. */
__task_set_special_port (__mach_task_self (),
TASK_EXCEPTION_PORT, _hurd_msgport);