/*
* 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>
+ * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.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 <stdlib.h>
#include <unistd.h>
#include <getopt.h>
-
+#include <sys/reboot.h>
#include "busybox.h"
+#include "init_shared.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;
+ char *delay; /* delay in seconds before rebooting */
- while ((rc = getopt(argc, argv, "d:")) > 0) {
- switch (rc) {
- case 'd':
- delay = atoi(optarg);
- break;
-
- default:
- show_usage();
- break;
- }
+ if(bb_getopt_ulflags(argc, argv, "d:", &delay)) {
+ sleep(atoi(delay));
}
- 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");
- if (!pid || *pid<=0)
- error_msg_and_die("no process killed");
- fflush(stdout);
- return(kill(*pid, SIGTERM));
- }
-#else
- return(kill(1, SIGTERM));
+#ifndef CONFIG_INIT
+#ifndef RB_AUTOBOOT
+#define RB_AUTOBOOT 0x01234567
#endif
+ return(bb_shutdown_system(RB_AUTOBOOT));
+#else
+ return kill_init(SIGTERM);
#endif
}