X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fprocd.git;a=blobdiff_plain;f=signal.c;h=b62da0a8c1ce1016f0051959390e25ac88b030cb;hp=a4b08c32de5ec8cf9c312c44b228d7cc08812831;hb=7edfbb45edcf275a855f5e1f5cc24cac81e382ff;hpb=f1bf99b09f664dce09f55e7102ce8e6ef77ef10a;ds=sidebyside diff --git a/signal.c b/signal.c index a4b08c3..b62da0a 100644 --- a/signal.c +++ b/signal.c @@ -19,11 +19,27 @@ #include "procd.h" +static int preinit; + +static void do_reboot(void) +{ + LOG("reboot\n"); + fflush(stderr); + sync(); + sleep(1); + reboot(RB_AUTOBOOT); + while (1) + ; +} + static void signal_shutdown(int signal, siginfo_t *siginfo, void *data) { int event = 0; char *msg = NULL; + if (preinit) + do_reboot(); + switch(signal) { case SIGTERM: event = RB_AUTOBOOT; @@ -49,12 +65,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,7 +85,7 @@ 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); @@ -86,3 +97,11 @@ void procd_signal(void) sigaction(SIGKILL, &sa_dummy, NULL); sigaction(SIGSTOP, &sa_dummy, NULL); } + +void procd_signal_preinit(void) +{ + preinit = 1; + sigaction(SIGTERM, &sa_shutdown, NULL); + sigaction(SIGUSR1, &sa_shutdown, NULL); + sigaction(SIGUSR2, &sa_shutdown, NULL); +}