diff options
Diffstat (limited to 'src/systemctl')
-rw-r--r-- | src/systemctl/systemctl.c | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c index 1f18f9cb0b..a5b3660be5 100644 --- a/src/systemctl/systemctl.c +++ b/src/systemctl/systemctl.c @@ -136,6 +136,7 @@ static unsigned arg_lines = 10; static OutputMode arg_output = OUTPUT_SHORT; static bool arg_plain = false; static bool arg_firmware_setup = false; +static bool arg_now = false; static bool original_stdout_is_tty; @@ -1973,7 +1974,7 @@ static int set_default(sd_bus *bus, char **args) { return r; } - r = bus_deserialize_and_dump_unit_file_changes(reply, arg_quiet); + r = bus_deserialize_and_dump_unit_file_changes(reply, arg_quiet, NULL, NULL); if (r < 0) return r; @@ -5388,7 +5389,7 @@ static int enable_unit(sd_bus *bus, char **args) { return bus_log_parse_error(r); } - r = bus_deserialize_and_dump_unit_file_changes(reply, arg_quiet); + r = bus_deserialize_and_dump_unit_file_changes(reply, arg_quiet, &changes, &n_changes); if (r < 0) return r; @@ -5410,6 +5411,18 @@ static int enable_unit(sd_bus *bus, char **args) { "3) A unit may be started when needed via activation (socket, path, timer,\n" " D-Bus, udev, scripted systemctl call, ...).\n"); + if (arg_now && n_changes > 0 && STR_IN_SET(args[0], "enable", "disable", "mask")) { + char *new_args[n_changes + 2]; + unsigned i; + + new_args[0] = streq(args[0], "enable") ? (char *)"start" : (char *)"stop"; + for (i = 0; i < n_changes; i++) + new_args[i + 1] = basename(changes[i].path); + new_args[i + 1] = NULL; + + r = start_unit(bus, new_args); + } + finish: unit_file_changes_free(changes, n_changes); @@ -5485,7 +5498,7 @@ static int add_dependency(sd_bus *bus, char **args) { return r; } - r = bus_deserialize_and_dump_unit_file_changes(reply, arg_quiet); + r = bus_deserialize_and_dump_unit_file_changes(reply, arg_quiet, NULL, NULL); if (r < 0) return r; @@ -5539,7 +5552,7 @@ static int preset_all(sd_bus *bus, char **args) { return r; } - r = bus_deserialize_and_dump_unit_file_changes(reply, arg_quiet); + r = bus_deserialize_and_dump_unit_file_changes(reply, arg_quiet, NULL, NULL); if (r < 0) return r; @@ -6015,6 +6028,7 @@ static void systemctl_help(void) { " When shutting down or sleeping, ignore inhibitors\n" " --kill-who=WHO Who to send signal to\n" " -s --signal=SIGNAL Which signal to send\n" + " --now Start or stop unit in addition to enabling or disabling it\n" " -q --quiet Suppress output\n" " --no-block Do not wait until operation finished\n" " --no-wall Don't send wall message before halt/power-off/reboot\n" @@ -6214,6 +6228,7 @@ static int systemctl_parse_argv(int argc, char *argv[]) { ARG_JOB_MODE, ARG_PRESET_MODE, ARG_FIRMWARE_SETUP, + ARG_NOW, }; static const struct option options[] = { @@ -6257,6 +6272,7 @@ static int systemctl_parse_argv(int argc, char *argv[]) { { "recursive", no_argument, NULL, 'r' }, { "preset-mode", required_argument, NULL, ARG_PRESET_MODE }, { "firmware-setup", no_argument, NULL, ARG_FIRMWARE_SETUP }, + { "now", no_argument, NULL, ARG_NOW }, {} }; @@ -6537,6 +6553,10 @@ static int systemctl_parse_argv(int argc, char *argv[]) { break; + case ARG_NOW: + arg_now = true; + break; + case '?': return -EINVAL; |