Browse Source

make reboot work without -f in failsafe

Singed-off-by: John Crispin <blogic@openwrt.org>
John Crispin 11 years ago
parent
commit
9961e88dd8
3 changed files with 27 additions and 6 deletions
  1. 1 0
      main.c
  2. 1 0
      procd.h
  3. 25 6
      signal.c

+ 1 - 0
main.c

@@ -36,6 +36,7 @@ static int usage(const char *prog)
 
 static int main_procd_init(int argc, char **argv)
 {
+	procd_signal_preinit();
 	procd_early();
 	debug_init();
 	watchdog_init();

+ 1 - 0
procd.h

@@ -58,6 +58,7 @@ void procd_early(void);
 void procd_preinit(void);
 void procd_coldplug(void);
 void procd_signal(void);
+void procd_signal_preinit(void);
 void procd_inittab(void);
 void procd_inittab_run(const char *action);
 

+ 25 - 6
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 = {
@@ -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);
+}