aboutsummaryrefslogtreecommitdiff
path: root/init
diff options
context:
space:
mode:
authorvapier <vapier@69ca8d6d-28ef-0310-b511-8ec308f3f277>2005-04-16 08:21:34 +0000
committervapier <vapier@69ca8d6d-28ef-0310-b511-8ec308f3f277>2005-04-16 08:21:34 +0000
commit70ebeba228b7a2a8318613aefc110e6f0eaf663e (patch)
tree79f812d48d525d48a9aec555f7544dbe5653306f /init
parent4d422c0c3d66ad351757ee7720bc1070c063b47a (diff)
downloadbusybox-w32-70ebeba228b7a2a8318613aefc110e6f0eaf663e.tar.gz
busybox-w32-70ebeba228b7a2a8318613aefc110e6f0eaf663e.tar.bz2
busybox-w32-70ebeba228b7a2a8318613aefc110e6f0eaf663e.zip
jfb2 writes in Bug 119:
The init applet will restart (re-exec) itsself when it receives a SIGHUP. However, just before it enters its main loop, it resets SIGHUP to either re-load the inittab (or ignore it if no inittab is used). Thus preventing the re-exec option from being triggerable. This patch adds a signal handler for SIGQUIT for init that always causes init to re-exec itsself (along with killing anything else that might be still running). git-svn-id: svn://busybox.net/trunk/busybox@10120 69ca8d6d-28ef-0310-b511-8ec308f3f277
Diffstat (limited to 'init')
-rw-r--r--init/init.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/init/init.c b/init/init.c
index 0c8dc89dc..850851173 100644
--- a/init/init.c
+++ b/init/init.c
@@ -453,6 +453,7 @@ static pid_t run(const struct init_action *a)
453 signal(SIGINT, SIG_DFL); 453 signal(SIGINT, SIG_DFL);
454 signal(SIGTERM, SIG_DFL); 454 signal(SIGTERM, SIG_DFL);
455 signal(SIGHUP, SIG_DFL); 455 signal(SIGHUP, SIG_DFL);
456 signal(SIGQUIT, SIG_DFL);
456 signal(SIGCONT, SIG_DFL); 457 signal(SIGCONT, SIG_DFL);
457 signal(SIGSTOP, SIG_DFL); 458 signal(SIGSTOP, SIG_DFL);
458 signal(SIGTSTP, SIG_DFL); 459 signal(SIGTSTP, SIG_DFL);
@@ -693,6 +694,7 @@ static void shutdown_system(void)
693 /* first disable all our signals */ 694 /* first disable all our signals */
694 sigemptyset(&block_signals); 695 sigemptyset(&block_signals);
695 sigaddset(&block_signals, SIGHUP); 696 sigaddset(&block_signals, SIGHUP);
697 sigaddset(&block_signals, SIGQUIT);
696 sigaddset(&block_signals, SIGCHLD); 698 sigaddset(&block_signals, SIGCHLD);
697 sigaddset(&block_signals, SIGUSR1); 699 sigaddset(&block_signals, SIGUSR1);
698 sigaddset(&block_signals, SIGUSR2); 700 sigaddset(&block_signals, SIGUSR2);
@@ -737,6 +739,7 @@ static void exec_signal(int sig)
737 /* unblock all signals, blocked in shutdown_system() */ 739 /* unblock all signals, blocked in shutdown_system() */
738 sigemptyset(&unblock_signals); 740 sigemptyset(&unblock_signals);
739 sigaddset(&unblock_signals, SIGHUP); 741 sigaddset(&unblock_signals, SIGHUP);
742 sigaddset(&unblock_signals, SIGQUIT);
740 sigaddset(&unblock_signals, SIGCHLD); 743 sigaddset(&unblock_signals, SIGCHLD);
741 sigaddset(&unblock_signals, SIGUSR1); 744 sigaddset(&unblock_signals, SIGUSR1);
742 sigaddset(&unblock_signals, SIGUSR2); 745 sigaddset(&unblock_signals, SIGUSR2);
@@ -1097,6 +1100,7 @@ extern int init_main(int argc, char **argv)
1097 /* Set up sig handlers -- be sure to 1100 /* Set up sig handlers -- be sure to
1098 * clear all of these in run() */ 1101 * clear all of these in run() */
1099 signal(SIGHUP, exec_signal); 1102 signal(SIGHUP, exec_signal);
1103 signal(SIGQUIT, exec_signal);
1100 signal(SIGUSR1, halt_signal); 1104 signal(SIGUSR1, halt_signal);
1101 signal(SIGUSR2, halt_signal); 1105 signal(SIGUSR2, halt_signal);
1102 signal(SIGINT, ctrlaltdel_signal); 1106 signal(SIGINT, ctrlaltdel_signal);