Remove gratuitous and unnecessary "BusyBox" refernece in login prompt
[oweals/busybox.git] / init / reboot.c
index 6f71536d8fdb8bf7f0d984a72515b861a52c76f0..1c9eedde53c52fa886a18bc5ba69055ad985dab3 100644 (file)
@@ -2,8 +2,8 @@
 /*
  * Mini reboot implementation for busybox
  *
- *
  * Copyright (C) 1995, 1996 by Bruce Perens <bruce@pixar.com>.
+ * Copyright (C) 1999-2002 by Erik Andersen <andersee@debian.org>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
 
 #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
 }
 
 /*