ujail: stop using extern in elf.h
[project/procd.git] / signal.c
index a4b08c3..16824f7 100644 (file)
--- a/signal.c
+++ b/signal.c
 
 #include "procd.h"
 
+static void do_reboot(void)
+{
+       LOG("reboot\n");
+       fflush(stderr);
+       sync();
+       sleep(2);
+       reboot(RB_AUTOBOOT);
+       while (1)
+       ;
+}
+
 static void signal_shutdown(int signal, siginfo_t *siginfo, void *data)
 {
        int event = 0;
        char *msg = NULL;
 
        switch(signal) {
+       case SIGINT:
        case SIGTERM:
                event = RB_AUTOBOOT;
                msg = "reboot";
@@ -49,12 +61,7 @@ struct sigaction sa_shutdown = {
 static void signal_crash(int signal, siginfo_t *siginfo, void *data)
 {
        ERROR("Rebooting as procd has crashed\n");
-       fflush(stderr);
-       sync();
-       sleep(1);
-       reboot(RB_AUTOBOOT);
-       while (1)
-               ;
+       do_reboot();
 }
 
 struct sigaction sa_crash = {
@@ -74,10 +81,11 @@ struct sigaction sa_dummy = {
 
 void procd_signal(void)
 {
-       sigaction(SIGPIPE, &sa_dummy, NULL);
+       signal(SIGPIPE, SIG_IGN);
        if (getpid() != 1)
                return;
        sigaction(SIGTERM, &sa_shutdown, NULL);
+       sigaction(SIGINT, &sa_shutdown, NULL);
        sigaction(SIGUSR1, &sa_shutdown, NULL);
        sigaction(SIGUSR2, &sa_shutdown, NULL);
        sigaction(SIGSEGV, &sa_crash, NULL);
@@ -85,4 +93,5 @@ void procd_signal(void)
        sigaction(SIGHUP, &sa_dummy, NULL);
        sigaction(SIGKILL, &sa_dummy, NULL);
        sigaction(SIGSTOP, &sa_dummy, NULL);
+       reboot(RB_DISABLE_CAD);
 }