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-w32-97af2ff8caa782f623e79408f0dfe608c878d5a6.tar.gz busybox-w32-97af2ff8caa782f623e79408f0dfe608c878d5a6.tar.bz2 busybox-w32-97af2ff8caa782f623e79408f0dfe608c878d5a6.zip | |
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 | |||
| 93 | help | 93 | help |
| 94 | Stop all processes and either halt, reboot, or power off the system. | 94 | Stop all processes and either halt, reboot, or power off the system. |
| 95 | 95 | ||
| 96 | config FEATURE_CALL_TELINIT | ||
| 97 | bool "Call telinit on shutdown and reboot" | ||
| 98 | default n | ||
| 99 | depends on HALT && !INIT | ||
| 100 | help | ||
| 101 | Call an external program (normally telinit) to facilitate | ||
| 102 | a switch to a proper runlevel. | ||
| 103 | |||
| 104 | This option is only available if you selected halt and friends, | ||
| 105 | but did not select init. | ||
| 106 | |||
| 107 | config TELINIT_PATH | ||
| 108 | string "Path to telinit executable" | ||
| 109 | default "/sbin/telinit" | ||
| 110 | depends on FEATURE_CALL_TELINIT | ||
| 111 | help | ||
| 112 | When busybox halt and friends have to call external telinit | ||
| 113 | to facilitate proper shutdown, this path is to be used when | ||
| 114 | locating telinit executable. | ||
| 115 | |||
| 96 | config MESG | 116 | config MESG |
| 97 | bool "mesg" | 117 | bool "mesg" |
| 98 | default n | 118 | 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) | |||
| 85 | //TODO: I tend to think that signalling linuxrc is wrong | 85 | //TODO: I tend to think that signalling linuxrc is wrong |
| 86 | // pity original author didn't comment on it... | 86 | // pity original author didn't comment on it... |
| 87 | if (ENABLE_FEATURE_INITRD) { | 87 | if (ENABLE_FEATURE_INITRD) { |
| 88 | /* talk to linuxrc */ | ||
| 89 | /* bbox init/linuxrc assumed */ | ||
| 88 | pid_t *pidlist = find_pid_by_name("linuxrc"); | 90 | pid_t *pidlist = find_pid_by_name("linuxrc"); |
| 89 | if (pidlist[0] > 0) | 91 | if (pidlist[0] > 0) |
| 90 | rc = kill(pidlist[0], signals[which]); | 92 | rc = kill(pidlist[0], signals[which]); |
| @@ -92,7 +94,21 @@ int halt_main(int argc UNUSED_PARAM, char **argv) | |||
| 92 | free(pidlist); | 94 | free(pidlist); |
| 93 | } | 95 | } |
| 94 | if (rc) { | 96 | if (rc) { |
| 95 | rc = kill(1, signals[which]); | 97 | /* talk to init */ |
| 98 | if (!ENABLE_FEATURE_CALL_TELINIT) { | ||
| 99 | /* bbox init assumed */ | ||
| 100 | rc = kill(1, signals[which]); | ||
| 101 | } else { | ||
| 102 | /* SysV style init assumed */ | ||
| 103 | /* runlevels: | ||
| 104 | * 0 == shutdown | ||
| 105 | * 6 == reboot */ | ||
| 106 | rc = execlp(CONFIG_TELINIT_PATH, | ||
| 107 | CONFIG_TELINIT_PATH, | ||
| 108 | which == 2 ? "6" : "0", | ||
| 109 | (char *)NULL | ||
| 110 | ); | ||
| 111 | } | ||
| 96 | } | 112 | } |
| 97 | } else { | 113 | } else { |
| 98 | rc = reboot(magic[which]); | 114 | rc = reboot(magic[which]); |
