diff options
author | Alexander Shishkin <virtuoso@slind.org> | 2009-07-27 02:49:35 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2009-07-27 02:55:02 +0200 |
commit | 97af2ff8caa782f623e79408f0dfe608c878d5a6 (patch) | |
tree | 7961767258bd73c421f5b219221462efae1a1f0c | |
parent | d1090c91ccbd75b30f30a70dbbb2e0f7b129f083 (diff) | |
download | busybox-97af2ff8caa782f623e79408f0dfe608c878d5a6.tar.gz |
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>
-rw-r--r-- | init/Config.in | 20 | ||||
-rw-r--r-- | init/halt.c | 18 |
2 files changed, 37 insertions, 1 deletions
diff --git a/init/Config.in b/init/Config.in index 1a1be4a9b..3d99d4792 100644 --- a/init/Config.in +++ b/init/Config.in @@ -93,6 +93,26 @@ config HALT help 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 bool "mesg" default n diff --git a/init/halt.c b/init/halt.c index 3a23ecabb..c88c333e7 100644 --- a/init/halt.c +++ b/init/halt.c @@ -85,6 +85,8 @@ int halt_main(int argc UNUSED_PARAM, char **argv) //TODO: I tend to think that signalling linuxrc is wrong // pity original author didn't comment on it... if (ENABLE_FEATURE_INITRD) { + /* talk to linuxrc */ + /* bbox init/linuxrc assumed */ pid_t *pidlist = find_pid_by_name("linuxrc"); if (pidlist[0] > 0) rc = kill(pidlist[0], signals[which]); @@ -92,7 +94,21 @@ int halt_main(int argc UNUSED_PARAM, char **argv) free(pidlist); } 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 { rc = reboot(magic[which]); |