In case our init is not a busybox applet, but an external program
like SysV init or upstart, we'd want to be able to call telinit
(or somesuch) to switch to an appropriate runlevel instead of
simply rebooting (or otherwise shutting down).

function                                             old     new   delta
halt_main                                            149     186     +37
.rodata                                           125022  125038     +16
static.signals                                         3       -      -3
------------------------------------------------------------------------------
(add/remove: 0/1 grow/shrink: 2/0 up/down: 53/-3)              Total: 50 bytes

Signed-off-by: Alexander Shishkin <[email protected]>
---
 init/Config.in |   18 ++++++++++++++++++
 init/halt.c    |   17 ++++++++++++++---
 2 files changed, 32 insertions(+), 3 deletions(-)

diff --git a/init/Config.in b/init/Config.in
index 1a1be4a..ab89afc 100644
--- a/init/Config.in
+++ b/init/Config.in
@@ -93,6 +93,24 @@ 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
+         In case when halt and friends are provided by busybox, but init
+         is not, call an external program (normally telinit) to facilitate
+         a switch to a proper runlevel.
+
+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 3a23eca..cde7fc7 100644
--- a/init/halt.c
+++ b/init/halt.c
@@ -90,9 +90,20 @@ int halt_main(int argc UNUSED_PARAM, char **argv)
                                rc = kill(pidlist[0], signals[which]);
                        if (ENABLE_FEATURE_CLEAN_UP)
                                free(pidlist);
-               }
-               if (rc) {
-                       rc = kill(1, signals[which]);
+
+                       if (rc)
+                               rc = kill(1, signals[which]);
+               } else if (ENABLE_FEATURE_CALL_TELINIT) {
+                       /* runlevels:
+                        * 0 == shutdown
+                        * 6 == reboot */
+                       const char *const args[] = {
+                               "telinit",
+                               which == 2 ? "6" : "0",
+                               NULL
+                       };
+
+                       rc = execvp(CONFIG_TELINIT_PATH, (char **)args);
                }
        } else {
                rc = reboot(magic[which]);
-- 
1.6.3.3

_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to