From: Jan Synacek <jsyna...@redhat.com> --- man/systemctl.xml | 26 ++++++++++++++++++++++++++ src/systemctl/systemctl.c | 40 ++++++++++++++++++++++++++++++++++------ 2 files changed, 60 insertions(+), 6 deletions(-)
diff --git a/man/systemctl.xml b/man/systemctl.xml index 4dbdfe1..51c19e1 100644 --- a/man/systemctl.xml +++ b/man/systemctl.xml @@ -432,6 +432,26 @@ </varlistentry> <varlistentry> + <term><option>-e</option></term> + <term><option>--enable</option></term> + + <listitem> + <para>When used with <command>start</command>, additionally + enable unit after it has been successfully started.</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><option>-d</option></term> + <term><option>--disable</option></term> + + <listitem> + <para>When used with <command>stop</command>, additionally + disable unit after it has been successfully stopped.</para> + </listitem> + </varlistentry> + + <varlistentry> <term><option>-f</option></term> <term><option>--force</option></term> @@ -633,6 +653,9 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service instance name until the instance has been started. Therefore, using glob patterns with <command>start</command> has limited usefulness.</para> + + <para>When used with <option>-e</option>, additional <command>enable</command> + operation is performed.</para> </listitem> </varlistentry> <varlistentry> @@ -641,6 +664,9 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service <listitem> <para>Stop (deactivate) one or more units specified on the command line.</para> + + <para>When used with <option>-d</option>, additional <command>disable</command> + operation is performed.</para> </listitem> </varlistentry> <varlistentry> diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c index 1f18f9c..5655c57 100644 --- a/src/systemctl/systemctl.c +++ b/src/systemctl/systemctl.c @@ -136,12 +136,15 @@ 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_startenable = false; +static bool arg_stopdisable = false; static bool original_stdout_is_tty; static int daemon_reload(sd_bus *bus, char **args); static int halt_now(enum action a); static int check_one_unit(sd_bus *bus, const char *name, const char *good_states, bool quiet); +static int enable_unit(sd_bus *bus, char **args); static char** strv_skip_first(char **strv) { if (strv_length(strv) > 0) @@ -2677,7 +2680,7 @@ static int start_unit(sd_bus *bus, char **args) { const char *method, *mode, *one_name, *suffix = NULL; _cleanup_strv_free_ char **names = NULL; char **name; - int r = 0; + int r = 0, start_rc = 0; assert(bus); @@ -2722,11 +2725,26 @@ static int start_unit(sd_bus *bus, char **args) { STRV_FOREACH(name, names) { _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL; - int q; - q = start_unit_one(bus, method, *name, mode, &error, w); - if (r >= 0 && q < 0) - r = translate_bus_error_to_exit_status(q, &error); + start_rc = start_unit_one(bus, method, *name, mode, &error, w); + if (r >= 0 && start_rc < 0) + r = translate_bus_error_to_exit_status(start_rc, &error); + } + + if (((streq(args[0], "start") && arg_startenable) + || (streq(args[0], "stop") && arg_stopdisable)) + && start_rc >= 0) { + _cleanup_strv_free_ char **newargs; + + newargs = strv_copy(args); + if (!newargs) + return -ENOMEM; + free(newargs[0]); + newargs[0] = streq(args[0], "start") ? strdup("enable") : strdup("disable"); + if (!newargs[0]) + return -ENOMEM; + + r = enable_unit(bus, newargs); } if (!arg_no_block) { @@ -6257,6 +6275,8 @@ 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 }, + { "enable", no_argument, NULL, 'e' }, + { "disable", no_argument, NULL, 'd' }, {} }; @@ -6265,7 +6285,7 @@ static int systemctl_parse_argv(int argc, char *argv[]) { assert(argc >= 0); assert(argv); - while ((c = getopt_long(argc, argv, "ht:p:alqfs:H:M:n:o:ir", options, NULL)) >= 0) + while ((c = getopt_long(argc, argv, "ht:p:alqfs:H:M:n:o:ired", options, NULL)) >= 0) switch (c) { @@ -6537,6 +6557,14 @@ static int systemctl_parse_argv(int argc, char *argv[]) { break; + case 'e': + arg_startenable = true; + break; + + case 'd': + arg_stopdisable = true; + break; + case '?': return -EINVAL; -- 2.1.0 _______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel