diff src/signal.c @ 280:7df0dd720c89 r21-0b38

Import from CVS: tag r21-0b38
author cvs
date Mon, 13 Aug 2007 10:32:22 +0200
parents 90d73dddcdc4
children 8626e4521993
line wrap: on
line diff
--- a/src/signal.c	Mon Aug 13 10:31:30 2007 +0200
+++ b/src/signal.c	Mon Aug 13 10:32:22 2007 +0200
@@ -631,119 +631,132 @@
 /*                            initialization                            */
 /************************************************************************/
 
+/* If we've been nohup'ed, keep it that way.
+   This allows `nohup xemacs &' to work.
+   More generally, if a normally fatal signal has been redirected
+   to SIG_IGN by our invocation environment, trust the environment.
+   This keeps xemacs from being killed by a SIGQUIT intended for a
+   different process after having been backgrounded under a
+   non-job-control shell! */
+static void
+handle_signal_if_fatal (int signo)
+{
+  if (signal (signo,  fatal_error_signal) == SIG_IGN)
+    signal (signo, SIG_IGN);
+}
+
 void
 init_signals_very_early (void)
 {
-  /* Catch all signals that would kill us. */
-  if (! noninteractive || initialized)
-    {
-      /* Don't catch these signals in batch mode if not initialized.
-	 On some machines, this sets static data that would make
-	 signal fail to work right when the dumped Emacs is run.  */
+  /* Catch all signals that would kill us.
+     Don't catch these signals in batch mode if not initialized.
+     On some machines, this sets static data that would make
+     signal fail to work right when the dumped Emacs is run.  */
+  if (noninteractive && !initialized)
+    return;
+
+  handle_signal_if_fatal (SIGILL);  /* ANSI */
+  handle_signal_if_fatal (SIGABRT); /* ANSI */
+  handle_signal_if_fatal (SIGFPE);  /* ANSI */
+  handle_signal_if_fatal (SIGSEGV); /* ANSI */
+  handle_signal_if_fatal (SIGTERM); /* ANSI */
+
+
 #ifdef SIGHUP
-      /* If we've been nohup'ed, keep it that way.  */
-      if (signal (SIGHUP,  fatal_error_signal) == SIG_IGN)
-	signal (SIGHUP, SIG_IGN);
+  handle_signal_if_fatal (SIGHUP);  /* POSIX */
 #endif
 #ifdef SIGQUIT
-      signal (SIGQUIT, fatal_error_signal);
-#endif
-#ifdef SIGILL
-      signal (SIGILL,  fatal_error_signal);
+  handle_signal_if_fatal (SIGQUIT); /* POSIX */
 #endif
 #ifdef SIGTRAP
-      signal (SIGTRAP, fatal_error_signal);
+  handle_signal_if_fatal (SIGTRAP); /* POSIX */
+#endif
+#ifdef SIGUSR1
+  handle_signal_if_fatal (SIGUSR1); /* POSIX */
+#endif
+#ifdef SIGUSR2
+  handle_signal_if_fatal (SIGUSR2); /* POSIX */
+#endif
+#ifdef SIGPIPE
+  handle_signal_if_fatal (SIGPIPE); /* POSIX */
+#endif
+#ifdef SIGALRM
+  /* This will get reset later, once we're
+     capable of handling it properly. */
+  handle_signal_if_fatal (SIGALRM); /* POSIX */
+#endif
+
+
+#ifdef SIGBUS
+  handle_signal_if_fatal (SIGBUS);  /* XPG5 */
 #endif
-#ifdef SIGABRT
-      signal (SIGABRT, fatal_error_signal);
+#ifdef SIGSYS
+  handle_signal_if_fatal (SIGSYS);  /* XPG5 */
+#endif
+#ifdef SIGXCPU
+  handle_signal_if_fatal (SIGXCPU); /* XPG5 */
+#endif
+#ifdef SIGXFSZ
+  handle_signal_if_fatal (SIGXFSZ); /* XPG5 */
 #endif
+#ifdef SIGVTALRM
+  handle_signal_if_fatal (SIGVTALRM); /* XPG5 */
+#endif
+#ifdef SIGPROF
+  /* Messes up the REAL profiler */
+  /* handle_signal_if_fatal (SIGPROF); */ /* XPG5 */
+#endif
+
+
 #ifdef SIGHWE
-      signal (SIGHWE, fatal_error_signal);
+  handle_signal_if_fatal (SIGHWE);
 #endif
 #ifdef SIGPRE
-      signal (SIGPRE, fatal_error_signal);
+  handle_signal_if_fatal (SIGPRE);
 #endif
 #ifdef SIGORE
-      signal (SIGORE, fatal_error_signal);
+  handle_signal_if_fatal (SIGORE);
 #endif
 #ifdef SIGUME
-      signal (SIGUME, fatal_error_signal);
+  handle_signal_if_fatal (SIGUME);
 #endif
 #ifdef SIGDLK
-      signal (SIGDLK, fatal_error_signal);
+  handle_signal_if_fatal (SIGDLK);
 #endif
 #ifdef SIGCPULIM
-      signal (SIGCPULIM, fatal_error_signal);
+  handle_signal_if_fatal (SIGCPULIM);
 #endif
 #ifdef SIGIOT
-      signal (SIGIOT, fatal_error_signal);
+  handle_signal_if_fatal (SIGIOT);
 #endif
 #ifdef SIGEMT
-      signal (SIGEMT, fatal_error_signal);
-#endif
-      signal (SIGFPE, fatal_error_signal);
-#ifdef SIGBUS
-      signal (SIGBUS, fatal_error_signal);
-#endif
-      signal (SIGSEGV, fatal_error_signal);
-#ifdef SIGSYS
-      signal (SIGSYS, fatal_error_signal);
-#endif
-#ifdef SIGPIPE
-      signal (SIGPIPE, fatal_error_signal);
+  handle_signal_if_fatal (SIGEMT);
 #endif
-      signal (SIGTERM, fatal_error_signal);
-#ifdef SIGXCPU
-      signal (SIGXCPU, fatal_error_signal);
-#endif
-#ifdef SIGXFSZ
-      signal (SIGXFSZ, fatal_error_signal);
-#endif /* SIGXFSZ */
-
-#ifdef SIGDANGER
-      /* This just means available memory is getting low.  */
-      signal (SIGDANGER, memory_warning_signal);
-#endif
-
 #ifdef SIGLOST
-      signal (SIGLOST, fatal_error_signal);
+  handle_signal_if_fatal (SIGLOST);
 #endif
 #ifdef SIGSTKFLT /* coprocessor stack fault under Linux */
-      signal (SIGSTKFLT, fatal_error_signal);
-#endif
-#ifdef SIGUSR1
-      signal (SIGUSR1, fatal_error_signal);
-#endif
-#ifdef SIGUSR2
-      signal (SIGUSR2, fatal_error_signal);
-#endif
-#ifdef SIGALRM
-      /* This will get reset later, once we're capable of handling
-	 this properly. */
-      signal (SIGALRM, fatal_error_signal);
-#endif
-#ifdef SIGVTALRM
-      signal (SIGVTALRM, fatal_error_signal);
-#endif
-#ifdef SIGPROF
-      /* Messes up the REAL profiler */
-      /* signal (SIGPROF, fatal_error_signal); */
+  handle_signal_if_fatal (SIGSTKFLT);
 #endif
 #ifdef SIGUNUSED /* exists under Linux, and will kill process! */
-      signal (SIGUNUSED, fatal_error_signal);
+  handle_signal_if_fatal (SIGUNUSED);
 #endif
 
 #ifdef AIX
 /* 20 is SIGCHLD, 21 is SIGTTIN, 22 is SIGTTOU.  */
 #ifndef _I386
-      signal (SIGIOINT, fatal_error_signal);
+  handle_signal_if_fatal (SIGIOINT);
 #endif
-      signal (SIGGRANT,   fatal_error_signal);
-      signal (SIGRETRACT, fatal_error_signal);
-      signal (SIGSOUND,   fatal_error_signal);
-      signal (SIGMSG,     fatal_error_signal);
+  handle_signal_if_fatal (SIGGRANT);
+  handle_signal_if_fatal (SIGRETRACT);
+  handle_signal_if_fatal (SIGSOUND);
+  handle_signal_if_fatal (SIGMSG);
 #endif /* AIX */
-    }
+
+#ifdef SIGDANGER
+  /* This just means available memory is getting low.  */
+  signal (SIGDANGER, memory_warning_signal);
+#endif
 }
 
 void
@@ -766,7 +779,7 @@
       init_async_timeouts ();
 #ifdef SIGIO
       signal (SIGIO, input_available_signal);
-# ifdef SIGPOLL
+# ifdef SIGPOLL /* XPG5 */
       /* Some systems (e.g. Motorola SVR4) losingly have different
 	 values for SIGIO and SIGPOLL, and send SIGPOLL instead of
 	 SIGIO.  On those same systems, an uncaught SIGPOLL kills the