chiark / gitweb /
systemctl: make sure daemon-reload returns success
[elogind.git] / src / systemctl / systemctl.c
index 63800864ad8fe9e08c3aefe236a6fa9694ad3aed..df4bd2147cb328b1987b22c2a181fbb2f175d0cf 100644 (file)
@@ -135,7 +135,7 @@ static OutputMode arg_output = OUTPUT_SHORT;
 static bool arg_plain = false;
 
 static int daemon_reload(sd_bus *bus, char **args);
-static void halt_now(enum action a);
+static int halt_now(enum action a);
 
 static void pager_open_if_enabled(void) {
 
@@ -2033,7 +2033,7 @@ static int start_special(sd_bus *bus, char **args) {
             (a == ACTION_HALT ||
              a == ACTION_POWEROFF ||
              a == ACTION_REBOOT))
-                halt_now(a);
+                return halt_now(a);
 
         if (arg_force >= 1 &&
             (a == ACTION_HALT ||
@@ -2917,8 +2917,11 @@ static int print_property(const char *name, sd_bus_message *m, const char *conte
         /* This is a low-level property printer, see
          * print_status_info() for the nicer output */
 
-        if (arg_properties && !strv_find(arg_properties, name))
-                return 0;
+        if (arg_properties && !strv_find(arg_properties, name)) {
+                /* skip what we didn't read */
+                r = sd_bus_message_skip(m, contents);
+                return r;
+        }
 
         switch (contents[0]) {
 
@@ -3759,7 +3762,7 @@ static int daemon_reload(sd_bus *bus, char **args) {
         else if (r < 0)
                 log_error("Failed to execute operation: %s", bus_error_message(&error, r));
 
-        return r;
+        return r < 0 ? r : 0;
 }
 
 static int reset_failed(sd_bus *bus, char **args) {
@@ -5609,11 +5612,9 @@ done:
         return 0;
 }
 
-static _noreturn_ void halt_now(enum action a) {
+static int halt_now(enum action a) {
 
-        _cleanup_free_ char *param = NULL;
-
-       /* Make sure C-A-D is handled by the kernel from this
+/* Make sure C-A-D is handled by the kernel from this
          * point on... */
         reboot(RB_ENABLE_CAD);
 
@@ -5622,30 +5623,30 @@ static _noreturn_ void halt_now(enum action a) {
         case ACTION_HALT:
                 log_info("Halting.");
                 reboot(RB_HALT_SYSTEM);
-                break;
+                return -errno;
 
         case ACTION_POWEROFF:
                 log_info("Powering off.");
                 reboot(RB_POWER_OFF);
-                break;
+                return -errno;
 
-        case ACTION_REBOOT:
+        case ACTION_REBOOT: {
+                _cleanup_free_ char *param = NULL;
 
-                if (read_one_line_file(REBOOT_PARAM_FILE, &param) == 0) {
-                        log_info("Rebooting with arg '%s'.", param);
+                if (read_one_line_file(REBOOT_PARAM_FILE, &param) >= 0) {
+                        log_info("Rebooting with argument '%s'.", param);
                         syscall(SYS_reboot, LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2,
                                 LINUX_REBOOT_CMD_RESTART2, param);
-                } else {
-                        log_info("Rebooting.");
-                        reboot(RB_AUTOBOOT);
                 }
-                break;
 
-        default:
-                assert_not_reached("Unknown halt action.");
+                log_info("Rebooting.");
+                reboot(RB_AUTOBOOT);
+                return -errno;
         }
 
-        assert_not_reached("Uh? This shouldn't happen.");
+        default:
+                assert_not_reached("Unknown action.");
+        }
 }
 
 static int halt_main(sd_bus *bus) {
@@ -5717,9 +5718,10 @@ static int halt_main(sd_bus *bus) {
         if (arg_dry)
                 return 0;
 
-        halt_now(arg_action);
-        /* We should never reach this. */
-        return -ENOSYS;
+        r = halt_now(arg_action);
+        log_error("Failed to reboot: %s", strerror(-r));
+
+        return r;
 }
 
 static int runlevel_main(void) {