diff options
author | WaLyong Cho <walyong.cho@samsung.com> | 2013-11-06 17:02:41 +0900 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2013-11-07 01:23:54 -0500 |
commit | 37185ec80ad372907a2a9388735655a7334babb6 (patch) | |
tree | 9fa29d5bacf8da53b1ac0ef300fc81784b6eb5f6 /src/core/shutdown.c | |
parent | 3f09ee19690730cd69e4986d72da2d9bb7c04a6a (diff) |
Support additional argument in reboot
reboot syscall can be performed with an additional argument. In some
systems this functionality can be useful to modify the mode of the
next boot performed by the bootloader.
Diffstat (limited to 'src/core/shutdown.c')
-rw-r--r-- | src/core/shutdown.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/src/core/shutdown.c b/src/core/shutdown.c index aa9548e2a4..377c1971a3 100644 --- a/src/core/shutdown.c +++ b/src/core/shutdown.c @@ -47,6 +47,7 @@ #include "watchdog.h" #include "killall.h" #include "cgroup-util.h" +#include "def.h" #define FINALIZE_ATTEMPTS 50 @@ -134,7 +135,7 @@ static int pivot_to_new_root(void) { int main(int argc, char *argv[]) { bool need_umount = true, need_swapoff = true, need_loop_detach = true, need_dm_detach = true; bool in_container, use_watchdog = false; - _cleanup_free_ char *line = NULL, *cgroup = NULL; + _cleanup_free_ char *line = NULL, *cgroup = NULL, *param = NULL; char *arguments[3]; unsigned retries; int cmd, r; @@ -173,9 +174,11 @@ int main(int argc, char *argv[]) { in_container = detect_container(NULL) > 0; - if (streq(argv[1], "reboot")) + if (streq(argv[1], "reboot")) { cmd = RB_AUTOBOOT; - else if (streq(argv[1], "poweroff")) + /* if this fails, that's OK */ + read_one_line_file(REBOOT_PARAM_FILE, ¶m); + } else if (streq(argv[1], "poweroff")) cmd = RB_POWER_OFF; else if (streq(argv[1], "halt")) cmd = RB_HALT_SYSTEM; @@ -337,7 +340,11 @@ int main(int argc, char *argv[]) { cmd = RB_AUTOBOOT; } - reboot(cmd); + if (param) + syscall(SYS_reboot, LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, + LINUX_REBOOT_CMD_RESTART2, param); + else + reboot(cmd); if (errno == EPERM && in_container) { /* If we are in a container, and we lacked |