diff options
author | vapier <vapier@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 2005-04-16 08:21:34 +0000 |
---|---|---|
committer | vapier <vapier@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 2005-04-16 08:21:34 +0000 |
commit | 70ebeba228b7a2a8318613aefc110e6f0eaf663e (patch) | |
tree | 79f812d48d525d48a9aec555f7544dbe5653306f /init | |
parent | 4d422c0c3d66ad351757ee7720bc1070c063b47a (diff) | |
download | busybox-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.c | 4 |
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); |