diff options
Diffstat (limited to 'src/systemctl/systemctl-start-unit.c')
-rw-r--r-- | src/systemctl/systemctl-start-unit.c | 63 |
1 files changed, 43 insertions, 20 deletions
diff --git a/src/systemctl/systemctl-start-unit.c b/src/systemctl/systemctl-start-unit.c index 6927e97..8068d77 100644 --- a/src/systemctl/systemctl-start-unit.c +++ b/src/systemctl/systemctl-start-unit.c @@ -35,20 +35,24 @@ static const struct { { "force-reload", "ReloadOrTryRestartUnit", "reload-or-try-restart" }, /* legacy alias */ }; -static const char *verb_to_method(const char *verb) { - for (size_t i = 0; i < ELEMENTSOF(unit_actions); i++) - if (streq_ptr(unit_actions[i].verb, verb)) - return unit_actions[i].method; +static const char* verb_to_method(const char *verb) { + assert(verb); - return "StartUnit"; + FOREACH_ELEMENT(i, unit_actions) + if (streq(i->verb, verb)) + return i->method; + + return "StartUnit"; } -static const char *verb_to_job_type(const char *verb) { - for (size_t i = 0; i < ELEMENTSOF(unit_actions); i++) - if (streq_ptr(unit_actions[i].verb, verb)) - return unit_actions[i].job_type; +static const char* verb_to_job_type(const char *verb) { + assert(verb); + + FOREACH_ELEMENT(i, unit_actions) + if (streq(i->verb, verb)) + return i->job_type; - return "start"; + return "start"; } static int start_unit_one( @@ -236,9 +240,12 @@ const struct action_metadata action_table[_ACTION_MAX] = { [ACTION_HIBERNATE] = { SPECIAL_HIBERNATE_TARGET, "hibernate", "replace-irreversibly" }, [ACTION_HYBRID_SLEEP] = { SPECIAL_HYBRID_SLEEP_TARGET, "hybrid-sleep", "replace-irreversibly" }, [ACTION_SUSPEND_THEN_HIBERNATE] = { SPECIAL_SUSPEND_THEN_HIBERNATE_TARGET, "suspend-then-hibernate", "replace-irreversibly" }, + [ACTION_SLEEP] = { NULL, /* handled only by logind */ "sleep", NULL }, }; enum action verb_to_action(const char *verb) { + assert(verb); + for (enum action i = 0; i < _ACTION_MAX; i++) if (streq_ptr(action_table[i].verb, verb)) return i; @@ -254,14 +261,29 @@ static const char** make_extra_args(const char *extra_args[static 4]) { if (arg_runtime_scope != RUNTIME_SCOPE_SYSTEM) extra_args[n++] = "--user"; - if (arg_transport == BUS_TRANSPORT_REMOTE) { + switch (arg_transport) { + + case BUS_TRANSPORT_REMOTE: extra_args[n++] = "-H"; extra_args[n++] = arg_host; - } else if (arg_transport == BUS_TRANSPORT_MACHINE) { + break; + + case BUS_TRANSPORT_MACHINE: extra_args[n++] = "-M"; extra_args[n++] = arg_host; - } else - assert(arg_transport == BUS_TRANSPORT_LOCAL); + break; + + case BUS_TRANSPORT_CAPSULE: + extra_args[n++] = "-C"; + extra_args[n++] = arg_host; + break; + + case BUS_TRANSPORT_LOCAL: + break; + + default: + assert_not_reached(); + } extra_args[n] = NULL; return extra_args; @@ -294,6 +316,8 @@ int verb_start(int argc, char *argv[], void *userdata) { action = verb_to_action(argv[0]); + assert(action != ACTION_SLEEP); + if (action != _ACTION_INVALID) { /* A command in style "systemctl reboot", "systemctl poweroff", … */ method = "StartUnit"; @@ -357,10 +381,6 @@ int verb_start(int argc, char *argv[], void *userdata) { } if (arg_wait) { - r = bus_call_method_async(bus, NULL, bus_systemd_mgr, "Subscribe", NULL, NULL, NULL); - if (r < 0) - return log_error_errno(r, "Failed to enable subscription: %m"); - r = bus_wait_for_units_new(bus, &wu); if (r < 0) return log_error_errno(r, "Failed to allocate unit watch context: %m"); @@ -384,9 +404,12 @@ int verb_start(int argc, char *argv[], void *userdata) { } if (!arg_no_block) { - const char* extra_args[4]; + const char *extra_args[4]; + WaitJobsFlags flags = 0; - r = bus_wait_for_jobs(w, arg_quiet, make_extra_args(extra_args)); + SET_FLAG(flags, BUS_WAIT_JOBS_LOG_ERROR, !arg_quiet); + SET_FLAG(flags, BUS_WAIT_JOBS_LOG_SUCCESS, arg_show_transaction); + r = bus_wait_for_jobs(w, flags, make_extra_args(extra_args)); if (r < 0) return r; |