runsvdir: if pid==1, also intercept SIGINT for -s SCRIPT
authorDenys Vlasenko <vda.linux@googlemail.com>
Mon, 2 Mar 2015 16:39:13 +0000 (17:39 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Mon, 2 Mar 2015 16:39:13 +0000 (17:39 +0100)
function                                             old     new   delta
runsvdir_main                                       1057    1064      +7

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
runit/runsvdir.c

index a08af3baedd60b67c55c912beb9233560579f100..b4c0b2ef00bf712f58d948daae1e6665e70c4604 100644 (file)
@@ -222,6 +222,7 @@ int runsvdir_main(int argc UNUSED_PARAM, char **argv)
        unsigned stampcheck;
        int i;
        int need_rescan;
+       bool i_am_init;
        char *opt_s_argv[3];
 
        INIT_G();
@@ -232,18 +233,21 @@ int runsvdir_main(int argc UNUSED_PARAM, char **argv)
        getopt32(argv, "Ps:", &opt_s_argv[0]);
        argv += optind;
 
+       i_am_init = (getpid() == 1);
        bb_signals(0
                | (1 << SIGTERM)
                | (1 << SIGHUP)
                /* For busybox's init, SIGTERM == reboot,
-                * SIGUSR1 == halt
-                * SIGUSR2 == poweroff
-                * so we need to intercept SIGUSRn too.
+                * SIGUSR1 == halt,
+                * SIGUSR2 == poweroff,
+                * Ctlr-ALt-Del sends SIGINT to init,
+                * so we need to intercept SIGUSRn and SIGINT too.
                 * Note that we do not implement actual reboot
                 * (killall(TERM) + umount, etc), we just pause
                 * respawing and avoid exiting (-> making kernel oops).
-                * The user is responsible for the rest. */
-               | (getpid() == 1 ? ((1 << SIGUSR1) | (1 << SIGUSR2)) : 0)
+                * The user is responsible for the rest.
+                */
+               | (i_am_init ? ((1 << SIGUSR1) | (1 << SIGUSR2) | (1 << SIGINT)) : 0)
                , record_signo);
        svdir = *argv++;
 
@@ -394,7 +398,7 @@ int runsvdir_main(int argc UNUSED_PARAM, char **argv)
                }
                /* SIGHUP or SIGTERM (or SIGUSRn if we are init) */
                /* Exit unless we are init */
-               if (getpid() != 1)
+               if (!i_am_init)
                        return (SIGHUP == sig) ? 111 : EXIT_SUCCESS;
 
                /* init continues to monitor services forever */