1998-11-11 Roland McGrath <roland@baalperazim.frob.com>
authorRoland McGrath <roland@gnu.org>
Wed, 11 Nov 1998 09:56:51 +0000 (09:56 +0000)
committerRoland McGrath <roland@gnu.org>
Wed, 11 Nov 1998 09:56:51 +0000 (09:56 +0000)
* hurd/hurdsig.c (_hurdsig_init): Take new args, INTARRAY and
INTARRAYSIZE.  Initialize main thread's sigstate from INIT_SIG* ints.
* hurd/hurd/signal.h: Update _hurdsig_init decl.
* hurd/hurdinit.c (_hurd_proc_init): Take new args, INTARRAY and
INTARRAYSIZE, pass them down to _hurdsig_init.
* hurd/hurd.h: Update _hurd_proc_init decl.

hurd/hurd.h
hurd/hurd/signal.h
hurd/hurdinit.c
hurd/hurdsig.c

index eb445d4..98d726a 100644 (file)
@@ -1,4 +1,4 @@
-/* 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
@@ -235,9 +235,12 @@ extern void _hurd_init (int flags, char **argv,
                        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
index 468599c..3057963 100644 (file)
@@ -1,5 +1,5 @@
 /* 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
@@ -216,9 +216,10 @@ _hurd_critical_section_unlock (void *our_lock)
 #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.  */
 
index 0d0f4b4..cd0d6e5 100644 (file)
@@ -1,4 +1,4 @@
-/* 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
@@ -42,8 +42,6 @@ _hurd_ports_use (int which, error_t (*operate) (mach_port_t))
   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
@@ -84,7 +82,7 @@ _hurd_init (int flags, char **argv,
 
   /* 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 (),
@@ -120,14 +118,15 @@ DEFINE_HOOK (_hurd_proc_subinit, (void));
    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.  */
index 6597198..67f5bd0 100644 (file)
@@ -1,4 +1,4 @@
-/* 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
@@ -1167,10 +1167,11 @@ extern void __mig_init (void *);
    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);
 
@@ -1186,9 +1187,26 @@ _hurdsig_init (void)
                                  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.  */
 
@@ -1215,8 +1233,6 @@ _hurdsig_init (void)
   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);