summaryrefslogtreecommitdiffstats
path: root/src/systemctl/systemctl-start-unit.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/systemctl/systemctl-start-unit.c')
-rw-r--r--src/systemctl/systemctl-start-unit.c63
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;