summaryrefslogtreecommitdiff
path: root/src/systemctl/systemctl.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/systemctl/systemctl.c')
-rw-r--r--src/systemctl/systemctl.c56
1 files changed, 33 insertions, 23 deletions
diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
index 5bcea28411..56852fdb92 100644
--- a/src/systemctl/systemctl.c
+++ b/src/systemctl/systemctl.c
@@ -3054,6 +3054,30 @@ static int prepare_firmware_setup(void) {
return logind_prepare_firmware_setup();
}
+static int set_exit_code(uint8_t code) {
+ _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
+ sd_bus *bus;
+ int r;
+
+ r = acquire_bus(BUS_MANAGER, &bus);
+ if (r < 0)
+ return r;
+
+ r = sd_bus_call_method(
+ bus,
+ "org.freedesktop.systemd1",
+ "/org/freedesktop/systemd1",
+ "org.freedesktop.systemd1.Manager",
+ "SetExitCode",
+ &error,
+ NULL,
+ "y", code);
+ if (r < 0)
+ return log_error_errno(r, "Failed to execute operation: %s", bus_error_message(&error, r));
+
+ return 0;
+}
+
static int start_special(char **args) {
enum action a;
int r;
@@ -3075,39 +3099,25 @@ static int start_special(char **args) {
if (r < 0)
return r;
- if (a == ACTION_REBOOT && args[1]) {
+ if (a == ACTION_REBOOT && strv_length(args) > 1) {
r = update_reboot_param_file(args[1]);
if (r < 0)
return r;
+
} else if (a == ACTION_EXIT && strv_length(args) > 1) {
- _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
- /* If the exit code is not given on the command line, don't
- * reset it to zero: just keep it as it might have been set
- * previously. */
uint8_t code = 0;
- sd_bus *bus;
- r = safe_atou8(args[1], &code);
- if (r < 0) {
- log_error("Invalid exit code.");
- return -EINVAL;
- }
+ /* If the exit code is not given on the command line,
+ * don't reset it to zero: just keep it as it might
+ * have been set previously. */
- r = acquire_bus(BUS_MANAGER, &bus);
+ r = safe_atou8(args[1], &code);
if (r < 0)
- return r;
+ return log_error_errno(r, "Invalid exit code.");
- r = sd_bus_call_method(
- bus,
- "org.freedesktop.systemd1",
- "/org/freedesktop/systemd1",
- "org.freedesktop.systemd1.Manager",
- "SetExitCode",
- &error,
- NULL,
- "y", code);
+ r = set_exit_code(code);
if (r < 0)
- return log_error_errno(r, "Failed to execute operation: %s", bus_error_message(&error, r));
+ return r;
}
if (arg_force >= 2 &&