From a77b4f39708306d44058d7ca1683f448f51c5fce Mon Sep 17 00:00:00 2001
From: Mike Frysinger <vapier@gentoo.org>
Date: Sat, 16 Apr 2005 08:21:34 +0000
Subject: 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).
---
 init/init.c | 4 ++++
 1 file changed, 4 insertions(+)

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)
 		signal(SIGINT, SIG_DFL);
 		signal(SIGTERM, SIG_DFL);
 		signal(SIGHUP, SIG_DFL);
+		signal(SIGQUIT, SIG_DFL);
 		signal(SIGCONT, SIG_DFL);
 		signal(SIGSTOP, SIG_DFL);
 		signal(SIGTSTP, SIG_DFL);
@@ -693,6 +694,7 @@ static void shutdown_system(void)
 	/* first disable all our signals */
 	sigemptyset(&block_signals);
 	sigaddset(&block_signals, SIGHUP);
+	sigaddset(&block_signals, SIGQUIT);
 	sigaddset(&block_signals, SIGCHLD);
 	sigaddset(&block_signals, SIGUSR1);
 	sigaddset(&block_signals, SIGUSR2);
@@ -737,6 +739,7 @@ static void exec_signal(int sig)
 			/* unblock all signals, blocked in shutdown_system() */
 			sigemptyset(&unblock_signals);
 			sigaddset(&unblock_signals, SIGHUP);
+			sigaddset(&unblock_signals, SIGQUIT);
 			sigaddset(&unblock_signals, SIGCHLD);
 			sigaddset(&unblock_signals, SIGUSR1);
 			sigaddset(&unblock_signals, SIGUSR2);
@@ -1097,6 +1100,7 @@ extern int init_main(int argc, char **argv)
 	/* Set up sig handlers  -- be sure to
 	 * clear all of these in run() */
 	signal(SIGHUP, exec_signal);
+	signal(SIGQUIT, exec_signal);
 	signal(SIGUSR1, halt_signal);
 	signal(SIGUSR2, halt_signal);
 	signal(SIGINT, ctrlaltdel_signal);
-- 
cgit v1.2.3