Imported from ../bash-2.05b.tar.gz.
[platform/upstream/bash.git] / sig.c
diff --git a/sig.c b/sig.c
index 41b637b..21a57ae 100644 (file)
--- a/sig.c
+++ b/sig.c
@@ -54,7 +54,6 @@ extern int last_command_exit_value;
 extern int return_catch_flag;
 extern int loop_level, continuing, breaking;
 extern int parse_and_execute_level, shell_initialized;
-extern int interactive, interactive_shell, login_shell, startup_state;
 
 /* Non-zero after SIGINT. */
 int interrupt_state;
@@ -71,25 +70,20 @@ sigset_t top_level_mask;
 /* When non-zero, we throw_to_top_level (). */
 int interrupt_immediately = 0;
 
-static void initialize_shell_signals ();
+static void initialize_shell_signals __P((void));
 
 void
-initialize_signals ()
+initialize_signals (reinit)
+     int reinit;
 {
   initialize_shell_signals ();
   initialize_job_signals ();
 #if !defined (HAVE_SYS_SIGLIST) && !defined (HAVE_UNDER_SYS_SIGLIST) && !defined (HAVE_STRSIGNAL)
-  initialize_siglist ();
+  if (reinit == 0)
+    initialize_siglist ();
 #endif /* !HAVE_SYS_SIGLIST && !HAVE_UNDER_SYS_SIGLIST && !HAVE_STRSIGNAL */
 }
 
-void
-reinitialize_signals ()
-{
-  initialize_shell_signals (1);
-  initialize_job_signals ();
-}
-
 /* A structure describing a signal that terminates the shell if not
    caught.  The orig_handler member is present so children can reset
    these signals back to their original handlers. */
@@ -105,89 +99,89 @@ struct termsig {
    and so forth. */
 static struct termsig terminating_signals[] = {
 #ifdef SIGHUP
-  SIGHUP, NULL_HANDLER,
+{  SIGHUP, NULL_HANDLER },
 #endif
 
 #ifdef SIGINT
-  SIGINT, NULL_HANDLER,
+{  SIGINT, NULL_HANDLER },
 #endif
 
 #ifdef SIGILL
-  SIGILL, NULL_HANDLER,
+{  SIGILL, NULL_HANDLER },
 #endif
 
 #ifdef SIGTRAP
-  SIGTRAP, NULL_HANDLER,
+{  SIGTRAP, NULL_HANDLER },
 #endif
 
 #ifdef SIGIOT
-  SIGIOT, NULL_HANDLER,
+{  SIGIOT, NULL_HANDLER },
 #endif
 
 #ifdef SIGDANGER
-  SIGDANGER, NULL_HANDLER,
+{  SIGDANGER, NULL_HANDLER },
 #endif
 
 #ifdef SIGEMT
-  SIGEMT, NULL_HANDLER,
+{  SIGEMT, NULL_HANDLER },
 #endif
 
 #ifdef SIGFPE
-  SIGFPE, NULL_HANDLER,
+{  SIGFPE, NULL_HANDLER },
 #endif
 
 #ifdef SIGBUS
-  SIGBUS, NULL_HANDLER,
+{  SIGBUS, NULL_HANDLER },
 #endif
 
 #ifdef SIGSEGV
-  SIGSEGV, NULL_HANDLER,
+{  SIGSEGV, NULL_HANDLER },
 #endif
 
 #ifdef SIGSYS
-  SIGSYS, NULL_HANDLER,
+{  SIGSYS, NULL_HANDLER },
 #endif
 
 #ifdef SIGPIPE
-  SIGPIPE, NULL_HANDLER,
+{  SIGPIPE, NULL_HANDLER },
 #endif
 
 #ifdef SIGALRM
-  SIGALRM, NULL_HANDLER,
+{  SIGALRM, NULL_HANDLER },
 #endif
 
 #ifdef SIGTERM
-  SIGTERM, NULL_HANDLER,
+{  SIGTERM, NULL_HANDLER },
 #endif
 
 #ifdef SIGXCPU
-  SIGXCPU, NULL_HANDLER,
+{  SIGXCPU, NULL_HANDLER },
 #endif
 
 #ifdef SIGXFSZ
-  SIGXFSZ, NULL_HANDLER,
+{  SIGXFSZ, NULL_HANDLER },
 #endif
 
 #ifdef SIGVTALRM
-  SIGVTALRM, NULL_HANDLER,
+{  SIGVTALRM, NULL_HANDLER },
 #endif
 
 #if 0
 #ifdef SIGPROF
-  SIGPROF, NULL_HANDLER,
+{  SIGPROF, NULL_HANDLER },
 #endif
 #endif
 
 #ifdef SIGLOST
-  SIGLOST, NULL_HANDLER,
+{  SIGLOST, NULL_HANDLER },
 #endif
 
 #ifdef SIGUSR1
-  SIGUSR1, NULL_HANDLER,
+{  SIGUSR1, NULL_HANDLER },
 #endif
 
 #ifdef SIGUSR2
-  SIGUSR2, NULL_HANDLER,
+{  SIGUSR2, NULL_HANDLER },
 #endif
 };
 
@@ -225,18 +219,22 @@ initialize_terminating_signals ()
     sigaddset (&act.sa_mask, XSIG (i));
   for (i = 0; i < TERMSIGS_LENGTH; i++)
     {
+      /* If we've already trapped it, don't do anything. */
+      if (signal_is_trapped (XSIG (i)))
+       continue;
+
       sigaction (XSIG (i), &act, &oact);
       XHANDLER(i) = oact.sa_handler;
       /* Don't do anything with signals that are ignored at shell entry
         if the shell is not interactive. */
       if (!interactive_shell && XHANDLER (i) == SIG_IGN)
-        {
+       {
          sigaction (XSIG (i), &oact, &act);
          set_signal_ignored (XSIG (i));
-        }
+       }
 #if defined (SIGPROF) && !defined (_MINIX)
       if (XSIG (i) == SIGPROF && XHANDLER (i) != SIG_DFL && XHANDLER (i) != SIG_IGN)
-        sigaction (XSIG (i), &oact, (struct sigaction *)NULL);
+       sigaction (XSIG (i), &oact, (struct sigaction *)NULL);
 #endif /* SIGPROF && !_MINIX */
     }
 
@@ -244,17 +242,21 @@ initialize_terminating_signals ()
 
   for (i = 0; i < TERMSIGS_LENGTH; i++)
     {
+      /* If we've already trapped it, don't do anything. */
+      if (signal_is_trapped (XSIG (i)))
+       continue;
+
       XHANDLER(i) = signal (XSIG (i), termination_unwind_protect);
       /* Don't do anything with signals that are ignored at shell entry
         if the shell is not interactive. */
       if (!interactive_shell && XHANDLER (i) == SIG_IGN)
        {
-          signal (XSIG (i), SIG_IGN);
-          set_signal_ignored (XSIG (i));
+         signal (XSIG (i), SIG_IGN);
+         set_signal_ignored (XSIG (i));
        }
 #ifdef SIGPROF
       if (XSIG (i) == SIGPROF && XHANDLER (i) != SIG_DFL && XHANDLER (i) != SIG_IGN)
-        signal (XSIG (i), XHANDLER (i));
+       signal (XSIG (i), XHANDLER (i));
 #endif
     }
 
@@ -351,7 +353,7 @@ throw_to_top_level ()
     parse_and_execute_cleanup ();
 
 #if defined (JOB_CONTROL)
-  give_terminal_to (shell_pgrp);
+  give_terminal_to (shell_pgrp, 0);
 #endif /* JOB_CONTROL */
 
 #if defined (JOB_CONTROL) || defined (HAVE_POSIX_SIGNALS)