From: WaLyong Cho <walyong....@samsung.com> reboot syscall can be performed with additional argument. In some of system, this functionality can be useful to ask next boot mode to bootloader. --- src/systemctl/systemctl.c | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-)
diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c index a635891..5b46350 100644 --- a/src/systemctl/systemctl.c +++ b/src/systemctl/systemctl.c @@ -19,6 +19,8 @@ along with systemd; If not, see <http://www.gnu.org/licenses/>. ***/ +#include <linux/reboot.h> +#include <sys/syscall.h> #include <sys/reboot.h> #include <stdio.h> #include <getopt.h> @@ -133,6 +135,7 @@ static char *arg_user = NULL; static unsigned arg_lines = 10; static OutputMode arg_output = OUTPUT_SHORT; static bool arg_plain = false; +static char *arg_reboot = NULL; static bool private_bus = false; @@ -4703,7 +4706,7 @@ static int systemctl_help(void) { static int halt_help(void) { - printf("%s [OPTIONS...]\n\n" + printf("%s [OPTIONS...]%s\n\n" "%s the system.\n\n" " --help Show this help\n" " --halt Halt the machine\n" @@ -4714,6 +4717,7 @@ static int halt_help(void) { " -d --no-wtmp Don't write wtmp record\n" " --no-wall Don't send wall message before halt/power-off/reboot\n", program_invocation_short_name, + arg_action == ACTION_REBOOT ? " <command>" : "", arg_action == ACTION_REBOOT ? "Reboot" : arg_action == ACTION_POWEROFF ? "Power off" : "Halt"); @@ -5200,9 +5204,19 @@ static int halt_parse_argv(int argc, char *argv[]) { } } - if (optind < argc) { - log_error("Too many arguments."); - return -EINVAL; + if (arg_action == ACTION_REBOOT) { + /* reboot allow just one argument for his command string */ + if (optind+1 == argc) + arg_reboot = strdup(argv[argc-1]); + else if (optind+1 < argc) { + log_error("Too many arguments."); + return -EINVAL; + } + } else { + if (optind < argc) { + log_error("Too many arguments."); + return -EINVAL; + } } return 1; @@ -5949,7 +5963,11 @@ static _noreturn_ void halt_now(enum action a) { case ACTION_REBOOT: log_info("Rebooting."); - reboot(RB_AUTOBOOT); + if (arg_reboot) + syscall(SYS_reboot, LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, + LINUX_REBOOT_CMD_RESTART2, arg_reboot); + else + reboot(RB_AUTOBOOT); break; default: -- 1.7.9.5 _______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel