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); |
