Re-add initrd support, unify halt/reboot/poweroff, add -n and -f options.
No binary (build failed)
—
(log yok)
| @@ -517,8 +517,8 @@ | |
| #ifdef CONFIG_PIVOT_ROOT | |
| APPLET(pivot_root, pivot_root_main, _BB_DIR_SBIN, _BB_SUID_NEVER) | |
| #endif | |
| - | #ifdef CONFIG_POWEROFF |
| - | APPLET(poweroff, poweroff_main, _BB_DIR_SBIN, _BB_SUID_NEVER) |
| + | #ifdef CONFIG_HALT |
| + | APPLET(poweroff, halt_main, _BB_DIR_SBIN, _BB_SUID_NEVER) |
| #endif | |
| #ifdef CONFIG_PRINTENV | |
| APPLET(printenv, printenv_main, _BB_DIR_BIN, _BB_SUID_NEVER) | |
| @@ -544,8 +544,8 @@ | |
| #ifdef CONFIG_REALPATH | |
| APPLET(realpath, realpath_main, _BB_DIR_USR_BIN, _BB_SUID_NEVER) | |
| #endif | |
| - | #ifdef CONFIG_REBOOT |
| - | APPLET(reboot, reboot_main, _BB_DIR_SBIN, _BB_SUID_NEVER) |
| + | #ifdef CONFIG_HALT |
| + | APPLET(reboot, halt_main, _BB_DIR_SBIN, _BB_SUID_NEVER) |
| #endif | |
| #ifdef CONFIG_RENICE | |
| APPLET(renice, renice_main, _BB_DIR_USR_BIN, _BB_SUID_NEVER) | |
| @@ -1010,11 +1010,13 @@ | |
| "-rw-rw-r-- 1 andersen andersen 554058 Apr 14 17:49 /tmp/busybox.tar.gz\n" | |
| #define halt_trivial_usage \ | |
| - | "[-d<delay>]" |
| + | "[-d<delay>] [-n<nosync>] [-f<force>]" |
| #define halt_full_usage \ | |
| "Halt the system.\n" \ | |
| "Options:\n" \ | |
| - | "\t-d\t\tdelay interval for halting" |
| + | "\t-d\t\tdelay interval for halting\n" \ |
| + | "\t-n\t\tno call to sync()\n" \ |
| + | "\t-f\t\tforce halt (don't go through init)\n" |
| #ifdef CONFIG_FEATURE_HDPARM_GET_IDENTITY | |
| #define USAGE_HDPARM_IDENT(a) a | |
| @@ -2372,11 +2374,13 @@ | |
| "the new root file system." | |
| #define poweroff_trivial_usage \ | |
| - | "[-d<delay>]" |
| + | "[-d<delay>] [-n<nosync>] [-f<force>]" |
| #define poweroff_full_usage \ | |
| - | "Halt the system and request that the kernel shut off the power.\n" \ |
| + | "Halt and shut off power.\n" \ |
| "Options:\n" \ | |
| - | "\t-d\t\tdelay interval for shutting off" |
| + | "\t-d\t\tdelay interval for halting\n" \ |
| + | "\t-n\t\tno call to sync()\n" \ |
| + | "\t-f\t\tforce power off (don't go through init)\n" |
| #define printenv_trivial_usage \ | |
| "[VARIABLES...]" | |
| @@ -2475,11 +2479,13 @@ | |
| "Returns the absolute pathnames of given argument." | |
| #define reboot_trivial_usage \ | |
| - | "[-d<delay>]" |
| + | "[-d<delay>] [-n<nosync>] [-f<force>]" |
| #define reboot_full_usage \ | |
| "Reboot the system.\n" \ | |
| "Options:\n" \ | |
| - | "\t-d\t\tdelay interval for rebooting" |
| + | "\t-d\t\tdelay interval for rebooting\n" \ |
| + | "\t-n\t\tno call to sync()\n" \ |
| + | "\t-f\t\tforce reboot (don't go through init)\n" |
| #define renice_trivial_usage \ | |
| "{{-n INCREMENT} | PRIORITY} [[ -p | -g | -u ] ID ...]" | |
| @@ -12,21 +12,32 @@ config CONFIG_INIT | |
| init is the first program run when the system boots. | |
| config CONFIG_FEATURE_USE_INITTAB | |
| - | bool " Support reading an inittab file?" |
| + | bool " Support reading an inittab file" |
| default y | |
| depends on CONFIG_INIT | |
| help | |
| Allow init to read an inittab file when the system boot. | |
| - | config CONFIG_FEATURE_INITRD |
| - | bool " Support running init from within an initrd?" |
| + | config CONFIG_FEATURE_INIT_SCTTY |
| + | bool " Support running commands with a controlling-tty" |
| + | default n |
| + | depends on CONFIG_INIT |
| + | help |
| + | If this option is enabled a command starting with hyphen (-) |
| + | is run in its own session (setsid(2)) and possibly with a |
| + | controlling tty (TIOCSCTTY). This is not the traditional init |
| + | behavour, but is often what you want in an embedded system where |
| + | the console is only accessed during development or for maintenance. |
| + | |
| + | config CONFIG_FEATURE_EXTRA_QUIET |
| + | bool " Be _extra_ quiet on boot" |
| default y | |
| depends on CONFIG_INIT | |
| help | |
| - | Allow init to be called from an initrd as linuxrc. |
| + | Prevent init from logging some messages to the console during boot. |
| config CONFIG_FEATURE_INIT_COREDUMPS | |
| - | bool " Support dumping core for child processes (debugging only)?" |
| + | bool " Support dumping core for child processes (debugging only)" |
| default n | |
| depends on CONFIG_INIT | |
| help | |
| @@ -35,30 +46,24 @@ config CONFIG_FEATURE_INIT_COREDUMPS | |
| core file sizes. If this option is disabled, processes | |
| will not generate any core files. | |
| - | config CONFIG_FEATURE_INIT_SCTTY |
| - | bool " Support running commands with a controlling-tty?" |
| - | default n |
| - | depends on CONFIG_INIT |
| - | help |
| - | If this option is enabled a command starting with hyphen (-) |
| - | is run in its own session (setsid(2)) and possibly with a |
| - | controlling tty (TIOCSCTTY). This is not the traditional init |
| - | behavour, but is often what you want in an embedded system where |
| - | the console is only accessed during development or for maintenance. |
| - | config CONFIG_FEATURE_EXTRA_QUIET |
| - | bool " Should init be _extra_ quiet on boot?" |
| + | |
| + | config CONFIG_FEATURE_INITRD |
| + | bool " Support running init from within an initrd (not initramfs)" |
| default y | |
| depends on CONFIG_INIT | |
| help | |
| - | Prevent init from logging some messages to the console |
| - | during boot. |
| + | Legacy support for running init under the old-style initrd. Allows |
| + | the name linuxrc to act as init, and it doesn't assume init is PID 1. |
| + | |
| + | This does not apply to initramfs, which runs /init as PID 1 and |
| + | requires no special support. |
| config CONFIG_HALT | |
| - | bool "halt" |
| + | bool "poweroff, halt, and reboot" |
| default y | |
| help | |
| - | Stop all processes and halt the system. |
| + | Stop all processes and either halt, reboot, or power off the system. |
| config CONFIG_MESG | |
| bool "mesg" | |
| @@ -67,17 +72,9 @@ config CONFIG_MESG | |
| Mesg controls access to your terminal by others. It is typically | |
| used to allow or disallow other users to write to your terminal | |
| - | config CONFIG_POWEROFF |
| - | bool "poweroff" |
| default y | |
| help | |
| Stop all processes and (try to) power off the system. | |
| - | config CONFIG_REBOOT |
| - | bool "reboot" |
| - | default y |
| - | help |
| - | Stop all processes and reboot the system. |
| - | |
| endmenu | |
| @@ -1,28 +1,42 @@ | |
| /* vi: set sw=4 ts=4: */ | |
| /* | |
| - | * Mini halt implementation for busybox |
| + | * Poweroff reboot and halt, oh my. |
| * | |
| - | * Copyright (C) 1999-2004 by Erik Andersen <[email protected]> |
| + | * Copyright 2006 by Rob Landley <[email protected]> |
| * | |
| * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. | |
| */ | |
| #include <signal.h> | |
| - | #include <stdlib.h> |
| - | #include <unistd.h> |
| - | #include <getopt.h> |
| #include <sys/reboot.h> | |
| #include "busybox.h" | |
| - | #include "init_shared.h" |
| + | #include <unistd.h> |
| - | extern int halt_main(int argc, char **argv) |
| + | int halt_main(int argc, char *argv[]) |
| { | |
| - | char *delay; /* delay in seconds before rebooting */ |
| + | char *delay = "hpr"; |
| + | int which, flags, magic[] = {RB_HALT_SYSTEM, RB_POWER_OFF, RB_AUTOBOOT}, |
| + | signals[] = {SIGUSR1, SIGUSR2, SIGTERM}, rc = 1; |
| + | |
| + | /* Figure out which applet we're running */ |
| + | for(which=0;delay[which]!=*bb_applet_name;which++); |
| - | if(bb_getopt_ulflags(argc, argv, "d:", &delay)) { |
| - | sleep(atoi(delay)); |
| - | } |
| + | /* Parse and handle arguments */ |
| + | flags = bb_getopt_ulflags(argc, argv, "d:nf", &delay); |
| + | if (flags&1) sleep(atoi(delay)); |
| + | if (!(flags&2)) sync(); |
| + | |
| + | /* Perform action. */ |
| + | if (ENABLE_INIT && !(flags & 4)) { |
| + | if (ENABLE_FEATURE_INITRD) { |
| + | long *pidlist=find_pid_by_name("linuxrc"); |
| + | if (*pidlist>0) rc = kill(*pidlist,signals[which]); |
| + | if (ENABLE_FEATURE_CLEAN_UP) free(pidlist); |
| + | } |
| + | if (rc) rc = kill(1,signals[which]); |
| + | } else rc = reboot(magic[which]); |
| - | return ENABLE_INIT ? kill(1,SIGUSR1) : bb_shutdown_system(RB_HALT_SYSTEM); |
| + | if (rc) bb_error_msg("No."); |
| + | return rc; |
| } | |
| @@ -751,14 +751,7 @@ static void exec_signal(int sig) | |
| static void halt_signal(int sig) | |
| { | |
| shutdown_system(); | |
| - | message(CONSOLE | LOG, |
| - | #if #cpu(s390) |
| - | /* Seems the s390 console is Wierd(tm). */ |
| - | "The system is halted. You may reboot now." |
| - | #else |
| - | "The system is halted. Press Reset or turn off power" |
| - | #endif |
| - | ); |
| + | message(CONSOLE | LOG, "The system is halted."); |
| sync(); | |
| /* allow time for last message to reach serial console */ | |
| @@ -1024,11 +1017,9 @@ extern int init_main(int argc, char **argv) | |
| } | |
| #ifndef DEBUG_INIT | |
| /* Expect to be invoked as init with PID=1 or be invoked as linuxrc */ | |
| - | if (getpid() != 1 |
| - | #ifdef CONFIG_FEATURE_INITRD |
| - | && strstr(bb_applet_name, "linuxrc") == NULL |
| - | #endif |
| - | ) { |
| + | if (getpid() != 1 && |
| + | (!ENABLE_FEATURE_INITRD || !strstr(bb_applet_name, "linuxrc"))) |
| + | { |
| bb_show_usage(); | |
| } | |
| /* Set up sig handlers -- be sure to | |
| @@ -1,28 +0,0 @@ | |
| - | /* vi: set sw=4 ts=4: */ |
| - | /* |
| - | * Mini poweroff implementation for busybox |
| - | * |
| - | * Copyright (C) 1999-2004 by Erik Andersen <[email protected]> |
| - | * |
| - | * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. |
| - | */ |
| - | |
| - | #include <signal.h> |
| - | #include <stdlib.h> |
| - | #include <unistd.h> |
| - | #include <getopt.h> |
| - | #include <sys/reboot.h> |
| - | #include "busybox.h" |
| - | #include "init_shared.h" |
| - | |
| - | |
| - | extern int poweroff_main(int argc, char **argv) |
| - | { |
| - | char *delay; /* delay in seconds before rebooting */ |
| - | |
| - | if(bb_getopt_ulflags(argc, argv, "d:", &delay)) { |
| - | sleep(atoi(delay)); |
| - | } |
| - | |
| - | return ENABLE_INIT ? kill(1,SIGUSR2) : bb_shutdown_system(RB_POWER_OFF); |
| - | } |
| @@ -1,28 +0,0 @@ | |
| - | /* vi: set sw=4 ts=4: */ |
| - | /* |
| - | * Mini reboot implementation for busybox |
| - | * |
| - | * Copyright (C) 1999-2004 by Erik Andersen <[email protected]> |
| - | * |
| - | * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. |
| - | */ |
| - | |
| - | #include <signal.h> |
| - | #include <stdlib.h> |
| - | #include <unistd.h> |
| - | #include <getopt.h> |
| - | #include <sys/reboot.h> |
| - | #include "busybox.h" |
| - | #include "init_shared.h" |
| - | |
| - | |
| - | extern int reboot_main(int argc, char **argv) |
| - | { |
| - | char *delay; /* delay in seconds before rebooting */ |
| - | |
| - | if(bb_getopt_ulflags(argc, argv, "d:", &delay)) { |
| - | sleep(atoi(delay)); |
| - | } |
| - | |
| - | return ENABLE_INIT ? kill(1,SIGTERM) : bb_shutdown_system(RB_AUTOBOOT); |
| - | } |