summaryrefslogtreecommitdiff
path: root/init/reboot.c
diff options
context:
space:
mode:
authorEric Andersen2002-09-17 08:40:12 +0000
committerEric Andersen2002-09-17 08:40:12 +0000
commit34fd00af5f70b26562d509f6602fde2957633ea6 (patch)
tree61011987abbe67c8aa7f4ebeba570a1c67ac01ce /init/reboot.c
parent7365c58783bdc628889d26a30924e5c48660ac7c (diff)
downloadbusybox-34fd00af5f70b26562d509f6602fde2957633ea6.zip
busybox-34fd00af5f70b26562d509f6602fde2957633ea6.tar.gz
Patch from David McCullough <davidm@snapgear.com>
Diffstat (limited to 'init/reboot.c')
-rw-r--r--init/reboot.c77
1 files changed, 72 insertions, 5 deletions
diff --git a/init/reboot.c b/init/reboot.c
index 001a3c7..1c9eedd 100644
--- a/init/reboot.c
+++ b/init/reboot.c
@@ -23,21 +23,88 @@
#include "busybox.h"
#include <signal.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <getopt.h>
+
+#if (__GNU_LIBRARY__ > 5) || defined(__dietlibc__)
+ #include <sys/reboot.h>
+ #define init_reboot(magic) reboot(magic)
+#else
+ #define init_reboot(magic) reboot(0xfee1dead, 672274793, magic)
+#endif
+#ifndef RB_ENABLE_CAD
+static const int RB_ENABLE_CAD = 0x89abcdef;
+static const int RB_AUTOBOOT = 0x01234567;
+#endif
extern int reboot_main(int argc, char **argv)
{
+ int delay = 0; /* delay in seconds before rebooting */
+ int rc;
+
+ while ((rc = getopt(argc, argv, "d:")) > 0) {
+ switch (rc) {
+ case 'd':
+ delay = atoi(optarg);
+ break;
+
+ default:
+ show_usage();
+ break;
+ }
+ }
+
+ if(delay > 0)
+ sleep(delay);
+
+#ifdef CONFIG_USER_INIT
+ /* Don't kill ourself */
+ signal(SIGTERM,SIG_IGN);
+ signal(SIGHUP,SIG_IGN);
+ setpgrp();
+
+ /* Allow Ctrl-Alt-Del to reboot system. */
+ init_reboot(RB_ENABLE_CAD);
+
+ message(CONSOLE|LOG, "\n\rThe system is going down NOW !!\n");
+ sync();
+
+ /* Send signals to every process _except_ pid 1 */
+ message(CONSOLE|LOG, "\rSending SIGTERM to all processes.\n");
+ kill(-1, SIGTERM);
+ sleep(1);
+ sync();
+
+ message(CONSOLE|LOG, "\rSending SIGKILL to all processes.\n");
+ kill(-1, SIGKILL);
+ sleep(1);
+
+ sync();
+ if (kernelVersion > 0 && kernelVersion <= KERNEL_VERSION(2,2,11)) {
+ /* bdflush, kupdate not needed for kernels >2.2.11 */
+ bdflush(1, 0);
+ sync();
+ }
+
+ init_reboot(RB_AUTOBOOT);
+ exit(0); /* Shrug */
+#else
#ifdef CONFIG_FEATURE_INITRD
- /* don't assume init's pid == 1 */
- long *pid = find_pid_by_name("init");
- if (!pid || *pid<=0) {
- pid = find_pid_by_name("linuxrc");
+ {
+ /* don't assume init's pid == 1 */
+ long *pid = find_pid_by_name("init");
+ if (!pid || *pid<=0)
+ pid = find_pid_by_name("linuxrc");
if (!pid || *pid<=0)
error_msg_and_die("no process killed");
+ fflush(stdout);
+ return(kill(*pid, SIGTERM));
}
- return(kill(*pid, SIGTERM));
#else
return(kill(1, SIGTERM));
#endif
+#endif
}
/*