halt/reboot/poweroff: add a CONFIG_xxx to act SysV compatibly

Signed-off-by: Alexander Shishkin <virtuoso@slind.org>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Alexander Shishkin 2009-07-27 02:49:35 +02:00 committed by Denys Vlasenko
parent d1090c91cc
commit 97af2ff8ca
2 changed files with 37 additions and 1 deletions

View File

@ -93,6 +93,26 @@ config HALT
help help
Stop all processes and either halt, reboot, or power off the system. Stop all processes and either halt, reboot, or power off the system.
config FEATURE_CALL_TELINIT
bool "Call telinit on shutdown and reboot"
default n
depends on HALT && !INIT
help
Call an external program (normally telinit) to facilitate
a switch to a proper runlevel.
This option is only available if you selected halt and friends,
but did not select init.
config TELINIT_PATH
string "Path to telinit executable"
default "/sbin/telinit"
depends on FEATURE_CALL_TELINIT
help
When busybox halt and friends have to call external telinit
to facilitate proper shutdown, this path is to be used when
locating telinit executable.
config MESG config MESG
bool "mesg" bool "mesg"
default n default n

View File

@ -85,6 +85,8 @@ int halt_main(int argc UNUSED_PARAM, char **argv)
//TODO: I tend to think that signalling linuxrc is wrong //TODO: I tend to think that signalling linuxrc is wrong
// pity original author didn't comment on it... // pity original author didn't comment on it...
if (ENABLE_FEATURE_INITRD) { if (ENABLE_FEATURE_INITRD) {
/* talk to linuxrc */
/* bbox init/linuxrc assumed */
pid_t *pidlist = find_pid_by_name("linuxrc"); pid_t *pidlist = find_pid_by_name("linuxrc");
if (pidlist[0] > 0) if (pidlist[0] > 0)
rc = kill(pidlist[0], signals[which]); rc = kill(pidlist[0], signals[which]);
@ -92,7 +94,21 @@ int halt_main(int argc UNUSED_PARAM, char **argv)
free(pidlist); free(pidlist);
} }
if (rc) { if (rc) {
rc = kill(1, signals[which]); /* talk to init */
if (!ENABLE_FEATURE_CALL_TELINIT) {
/* bbox init assumed */
rc = kill(1, signals[which]);
} else {
/* SysV style init assumed */
/* runlevels:
* 0 == shutdown
* 6 == reboot */
rc = execlp(CONFIG_TELINIT_PATH,
CONFIG_TELINIT_PATH,
which == 2 ? "6" : "0",
(char *)NULL
);
}
} }
} else { } else {
rc = reboot(magic[which]); rc = reboot(magic[which]);