X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fprocd.git;a=blobdiff_plain;f=signal.c;h=07dda9a4c890e9106a56ec089c6f8bfcdefb22a0;hp=a4b08c32de5ec8cf9c312c44b228d7cc08812831;hb=3c771f9e4ba46d3e39334cb20eab98221043f1e2;hpb=f1bf99b09f664dce09f55e7102ce8e6ef77ef10a diff --git a/signal.c b/signal.c index a4b08c3..07dda9a 100644 --- a/signal.c +++ b/signal.c @@ -19,12 +19,25 @@ #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; +#ifndef DISABLE_INIT switch(signal) { + case SIGINT: case SIGTERM: event = RB_AUTOBOOT; msg = "reboot"; @@ -35,6 +48,7 @@ static void signal_shutdown(int signal, siginfo_t *siginfo, void *data) msg = "poweroff"; break; } +#endif DEBUG(1, "Triggering %s\n", msg); if (event) @@ -49,12 +63,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 +83,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 +95,7 @@ void procd_signal(void) sigaction(SIGHUP, &sa_dummy, NULL); sigaction(SIGKILL, &sa_dummy, NULL); sigaction(SIGSTOP, &sa_dummy, NULL); +#ifndef DISABLE_INIT + reboot(RB_DISABLE_CAD); +#endif }