summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorWaLyong Cho <walyong.cho@samsung.com>2013-11-06 17:02:41 +0900
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2013-11-07 01:23:54 -0500
commit37185ec80ad372907a2a9388735655a7334babb6 (patch)
tree9fa29d5bacf8da53b1ac0ef300fc81784b6eb5f6 /src/core
parent3f09ee19690730cd69e4986d72da2d9bb7c04a6a (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')
-rw-r--r--src/core/shutdown.c15
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, &param);
+ } 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