changeset 330:2a003d86d805

Teach oneit to reboot on exit more reliably.
author Rob Landley <rob@landley.net>
date Sun, 14 Dec 2008 02:12:07 -0600
parents 6773399539aa
children 9de39991c080
files toys/oneit.c
diffstat 1 files changed, 6 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/toys/oneit.c	Sun Dec 14 01:08:37 2008 -0600
+++ b/toys/oneit.c	Sun Dec 14 02:12:07 2008 -0600
@@ -58,7 +58,12 @@
     // pid 1 just reaps zombies until it gets its child, then halts the system.
     while (pid!=wait(&i));
     sync();
-    reboot(toys.optflags ? RB_POWER_OFF : RB_AUTOBOOT);
+
+	// PID 1 can't call reboot() because it kills the task that calls it,
+	// which causes the kernel to panic before the actual reboot happens.
+	if (!vfork()) reboot((toys.optflags&1) ? RB_POWER_OFF : RB_AUTOBOOT);
+	sleep(5);
+	_exit(1);
   }
 
   // Redirect stdio to /dev/tty0, with new session ID, so ctrl-c works.