diff options
author | Eric Andersen <andersen@codepoet.org> | 2002-09-17 08:40:12 +0000 |
---|---|---|
committer | Eric Andersen <andersen@codepoet.org> | 2002-09-17 08:40:12 +0000 |
commit | 34fd00af5f70b26562d509f6602fde2957633ea6 (patch) | |
tree | 61011987abbe67c8aa7f4ebeba570a1c67ac01ce | |
parent | 7365c58783bdc628889d26a30924e5c48660ac7c (diff) |
Patch from David McCullough <davidm@snapgear.com>
-rw-r--r-- | init/reboot.c | 77 |
1 files changed, 72 insertions, 5 deletions
diff --git a/init/reboot.c b/init/reboot.c index 001a3c7d2..1c9eedde5 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 } /* |