init,halt: portability improvements
authorJeremie Koenig <jk@jk.fr.eu.org>
Thu, 27 May 2010 13:38:44 +0000 (15:38 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sun, 18 Jul 2010 22:45:51 +0000 (00:45 +0200)
* make init and halt use the same RB_* constants for reboot()
* conditionalize the Linux-specific code

Inspired by init.init.diff from the Debian kFreeBSD patches at:
http://svn.debian.org/viewsvn/d-i/people/slackydeb/kfreebsd/busybox/1.14/debian

Signed-off-by: Jeremie Koenig <jk@jk.fr.eu.org>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
init/Config.src
init/halt.c
init/init.c
init/reboot.h [new file with mode: 0644]

index a5e76be6a4fbf37bbcf6883285e9efb4bb45e542..590e2989064ff2140891d45bf3cdca81aea1cf90 100644 (file)
@@ -10,7 +10,6 @@ INSERT
 config INIT
        bool "init"
        default y
-       depends on PLATFORM_LINUX
        select FEATURE_SYSLOG
        help
          init is the first program run when the system boots.
@@ -93,7 +92,6 @@ config FEATURE_INITRD
 config HALT
        bool "poweroff, halt, and reboot"
        default y
-       depends on PLATFORM_LINUX
        help
          Stop all processes and either halt, reboot, or power off the system.
 
index f1bb2c4a85fee769a90b0b76bba19000c4d0bc32..abd801fdad383054e7b80f319be4086f2d00a862 100644 (file)
@@ -8,7 +8,7 @@
  */
 
 #include "libbb.h"
-#include <sys/reboot.h>
+#include "reboot.h"
 
 #if ENABLE_FEATURE_WTMP
 #include <sys/utsname.h>
@@ -36,18 +36,6 @@ static void write_wtmp(void)
 #define write_wtmp() ((void)0)
 #endif
 
-#ifndef RB_HALT_SYSTEM
-#define RB_HALT_SYSTEM RB_HALT
-#endif
-
-#ifndef RB_POWERDOWN
-/* Stop system and switch power off if possible.  */
-# define RB_POWERDOWN   0x4321fedc
-#endif
-#ifndef RB_POWER_OFF
-# define RB_POWER_OFF RB_POWERDOWN
-#endif
-
 
 int halt_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int halt_main(int argc UNUSED_PARAM, char **argv)
index 1388c75ccb1dcb9d20c673a92d1d999d26d149dc..d8bf15894539cda3a914d58bbc6382729ec7e46d 100644 (file)
@@ -12,7 +12,6 @@
 #include "libbb.h"
 #include <syslog.h>
 #include <paths.h>
-#include <sys/reboot.h>
 #include <sys/resource.h>
 #ifdef __linux__
 #include <linux/vt.h>
@@ -20,6 +19,7 @@
 #if ENABLE_FEATURE_UTMP
 # include <utmp.h> /* DEAD_PROCESS */
 #endif
+#include "reboot.h" /* reboot() constants */
 
 /* Used only for sanitizing purposes in set_sane_term() below. On systems where
  * the baud rate is stored in a separate field, we can safely disable them. */
@@ -97,13 +97,6 @@ static const char *log_console = VC_5;
 enum {
        L_LOG = 0x1,
        L_CONSOLE = 0x2,
-#ifndef RB_HALT_SYSTEM
-       RB_HALT_SYSTEM = 0xcdef0123, /* FIXME: this overflows enum */
-       RB_ENABLE_CAD = 0x89abcdef,
-       RB_DISABLE_CAD = 0,
-       RB_POWER_OFF = 0x4321fedc,
-       RB_AUTOBOOT = 0x01234567,
-#endif
 };
 
 /* Print a message to the specified device.
@@ -724,10 +717,12 @@ static void restart_handler(int sig UNUSED_PARAM)
 
                run_shutdown_and_kill_processes();
 
+#ifdef RB_ENABLE_CAD
                /* Allow Ctrl-Alt-Del to reboot the system.
                 * This is how kernel sets it up for init, we follow suit.
                 */
                reboot(RB_ENABLE_CAD); /* misnomer */
+#endif
 
                if (open_stdio_to_tty(a->terminal)) {
                        dbg_message(L_CONSOLE, "Trying to re-exec %s", a->command);
@@ -870,9 +865,11 @@ int init_main(int argc UNUSED_PARAM, char **argv)
                ) {
                        bb_show_usage();
                }
+#ifdef RB_DISABLE_CAD
                /* Turn off rebooting via CTL-ALT-DEL - we get a
                 * SIGINT on CAD so we can shut things down gracefully... */
                reboot(RB_DISABLE_CAD); /* misnomer */
+#endif
        }
 
        /* Figure out where the default console should be */
@@ -895,6 +892,8 @@ int init_main(int argc UNUSED_PARAM, char **argv)
        message(L_CONSOLE | L_LOG, "init started: %s", bb_banner);
 #endif
 
+/* struct sysinfo is linux-specific */
+#ifdef __linux__
        /* Make sure there is enough memory to do something useful. */
        if (ENABLE_SWAPONOFF) {
                struct sysinfo info;
@@ -910,6 +909,7 @@ int init_main(int argc UNUSED_PARAM, char **argv)
                        run_actions(SYSINIT);   /* wait and removing */
                }
        }
+#endif
 
        /* Check if we are supposed to be in single user mode */
        if (argv[1]
diff --git a/init/reboot.h b/init/reboot.h
new file mode 100644 (file)
index 0000000..ff045fd
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Definitions related to the reboot() system call,
+ * shared between init.c and halt.c.
+ */
+
+#include <sys/reboot.h>
+
+#ifndef RB_HALT_SYSTEM
+# if defined(__linux__)
+#  define RB_HALT_SYSTEM  0xcdef0123
+#  define RB_ENABLE_CAD   0x89abcdef
+#  define RB_DISABLE_CAD  0
+#  define RB_POWER_OFF    0x4321fedc
+#  define RB_AUTOBOOT     0x01234567
+# elif defined(RB_HALT)
+#  define RB_HALT_SYSTEM  RB_HALT
+# endif
+#endif
+
+/* Stop system and switch power off if possible.  */
+#ifndef RB_POWER_OFF
+# if defined(RB_POWERDOWN)
+#  define RB_POWER_OFF  RB_POWERDOWN
+# elif defined(__linux__)
+#  define RB_POWER_OFF  0x4321fedc
+# else
+#  warning "poweroff unsupported, using halt as fallback"
+#  define RB_POWER_OFF  RB_HALT_SYSTEM
+# endif
+#endif
+