summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichel Stam <m.stam@fugro.nl>2014-10-02 13:56:21 +0200
committerJohn Crispin <blogic@openwrt.org>2014-10-02 19:19:41 +0200
commit2c8176385a4f62b536303912ba508b9dc7931fad (patch)
tree8231a933f0d7cfadc021f476ecbb0bb1fe8a97fa
parent98975d54d405c45edf7bab2205d6ffb75ed90438 (diff)
downloadunitd-2c8176385a4f62b536303912ba508b9dc7931fad.tar
unitd-2c8176385a4f62b536303912ba508b9dc7931fad.zip
Reboot busybox style via procd
It has been observed that, very rarely, the system does not reboot when procd enters the shutdown state. Busybox seems to have an obscure fix in its shutdown, where the parent (procd) process is put in an infinite loop, and a special child is executed to execute reboot(). This may very well be the cause. Signed-off-by: Michel Stam <m.stam@fugro.nl>
-rw-r--r--state.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/state.c b/state.c
index b941634..c3d2303 100644
--- a/state.c
+++ b/state.c
@@ -86,7 +86,20 @@ static void state_enter(void)
sync();
sleep(1);
LOG("- reboot -\n");
- reboot(reboot_event);
+
+ /* Allow time for last message to reach serial console, etc */
+ sleep(1);
+
+ /* We have to fork here, since the kernel calls do_exit(EXIT_SUCCESS)
+ * in linux/kernel/sys.c, which can cause the machine to panic when
+ * the init process exits... */
+ if (!vfork( )) { /* child */
+ reboot(reboot_event);
+ _exit(EXIT_SUCCESS);
+ }
+
+ while (1)
+ sleep(1);
break;
default: