[systemd-commits] src/systemctl.c
Kay Sievers
kay at kemper.freedesktop.org
Sun Feb 20 12:10:26 PST 2011
src/systemctl.c | 23 +++++++++++++++++++++--
1 file changed, 21 insertions(+), 2 deletions(-)
New commits:
commit 5622dde36deb414ab372a2d767584eaca73aec46
Author: Kay Sievers <kay.sievers at vrfy.org>
Date: Sun Feb 20 21:09:07 2011 +0100
systemctl: shutdown(8) - call kexec if kexec kernel is loaded
diff --git a/src/systemctl.c b/src/systemctl.c
index 4a8b9a1..eacc63e 100644
--- a/src/systemctl.c
+++ b/src/systemctl.c
@@ -4668,6 +4668,18 @@ static int parse_time_spec(const char *t, usec_t *_u) {
return 0;
}
+static bool kexec_loaded(void) {
+ bool loaded = false;
+ char *s;
+
+ if (read_one_line_file("/sys/kernel/kexec_loaded", &s) >= 0) {
+ if (s[0] == '1')
+ loaded = true;
+ free(s);
+ }
+ return loaded;
+}
+
static int shutdown_parse_argv(int argc, char *argv[]) {
enum {
@@ -4705,7 +4717,10 @@ static int shutdown_parse_argv(int argc, char *argv[]) {
break;
case 'r':
- arg_action = ACTION_REBOOT;
+ if (kexec_loaded())
+ arg_action = ACTION_KEXEC;
+ else
+ arg_action = ACTION_REBOOT;
break;
case 'h':
@@ -4898,7 +4913,10 @@ static int parse_argv(int argc, char *argv[]) {
arg_action = ACTION_POWEROFF;
return halt_parse_argv(argc, argv);
} else if (strstr(program_invocation_short_name, "reboot")) {
- arg_action = ACTION_REBOOT;
+ if (kexec_loaded())
+ arg_action = ACTION_KEXEC;
+ else
+ arg_action = ACTION_REBOOT;
return halt_parse_argv(argc, argv);
} else if (strstr(program_invocation_short_name, "shutdown")) {
arg_action = ACTION_POWEROFF;
@@ -5498,6 +5516,7 @@ int main(int argc, char*argv[]) {
case ACTION_HALT:
case ACTION_POWEROFF:
case ACTION_REBOOT:
+ case ACTION_KEXEC:
r = halt_main(bus);
break;
More information about the systemd-commits
mailing list