return 0;
}
+static int bus_process_wait(sd_bus *bus) {
+ int r;
+
+ for (;;) {
+ r = sd_bus_process(bus, NULL);
+ if (r < 0)
+ return r;
+ if (r > 0)
+ return 0;
+ r = sd_bus_wait(bus, (uint64_t) -1);
+ if (r < 0)
+ return r;
+ }
+}
+
+static int check_wait_response(WaitData *d) {
+ int r = 0;
+
+ assert(d->result);
+
+ if (!arg_quiet) {
+ if (streq(d->result, "timeout"))
+ log_error("Job for %s timed out.", strna(d->name));
+ else if (streq(d->result, "canceled"))
+ log_error("Job for %s canceled.", strna(d->name));
+ else if (streq(d->result, "dependency"))
+ log_error("A dependency job for %s failed. See 'journalctl -xn' for details.", strna(d->name));
+ else if (!streq(d->result, "done") && !streq(d->result, "skipped"))
+ log_error("Job for %s failed. See 'systemctl status %s' and 'journalctl -xn' for details.", strna(d->name), strna(d->name));
+ }
+
+ if (streq(d->result, "timeout"))
+ r = -ETIME;
+ else if (streq(d->result, "canceled"))
+ r = -ECANCELED;
+ else if (streq(d->result, "dependency"))
+ r = -EIO;
+ else if (!streq(d->result, "done") && !streq(d->result, "skipped"))
+ r = -EIO;
+
+ return r;
+}
+
static int wait_for_jobs(sd_bus *bus, Set *s) {
WaitData d = { .set = s };
- int r;
+ int r = 0, q;
assert(bus);
assert(s);
- r = sd_bus_add_filter(bus, wait_filter, &d);
- if (r < 0)
+ q = sd_bus_add_filter(bus, wait_filter, &d);
+ if (q < 0)
return log_oom();
while (!set_isempty(s)) {
- for (;;) {
- r = sd_bus_process(bus, NULL);
- if (r < 0)
- return r;
- if (r > 0)
- break;
- r = sd_bus_wait(bus, (uint64_t) -1);
- if (r < 0)
- return r;
- }
-
- if (!d.result)
- goto free_name;
+ q = bus_process_wait(bus);
+ if (q < 0)
+ return q;
- if (!arg_quiet) {
- if (streq(d.result, "timeout"))
- log_error("Job for %s timed out.", strna(d.name));
- else if (streq(d.result, "canceled"))
- log_error("Job for %s canceled.", strna(d.name));
- else if (streq(d.result, "dependency"))
- log_error("A dependency job for %s failed. See 'journalctl -xn' for details.", strna(d.name));
- else if (!streq(d.result, "done") && !streq(d.result, "skipped"))
- log_error("Job for %s failed. See 'systemctl status %s' and 'journalctl -xn' for details.", strna(d.name), strna(d.name));
+ if (d.result) {
+ q = check_wait_response(&d);
+ /* Return the first error as it is most likely to be
+ * meaningful. */
+ if (q < 0 && r == 0)
+ r = q;
}
- if (streq_ptr(d.result, "timeout"))
- r = -ETIME;
- else if (streq_ptr(d.result, "canceled"))
- r = -ECANCELED;
- else if (!streq_ptr(d.result, "done") && !streq_ptr(d.result, "skipped"))
- r = -EIO;
+ free(d.name);
+ d.name = NULL;
free(d.result);
d.result = NULL;
-
- free_name:
- free(d.name);
- d.name = NULL;
}
- return sd_bus_remove_filter(bus, wait_filter, &d);
+ q = sd_bus_remove_filter(bus, wait_filter, &d);
+ if (q < 0 && r == 0)
+ r = q;
+
+ return r;
}
static int check_one_unit(sd_bus *bus, const char *name, const char *good_states, bool quiet) {
" list-units [PATTERN...] List loaded units\n"
" list-sockets [PATTERN...] List loaded sockets ordered by address\n"
" list-timers [PATTERN...] List loaded timers ordered by next elapse\n"
- " start [NAME...] Start (activate) one or more units\n"
- " stop [NAME...] Stop (deactivate) one or more units\n"
- " reload [NAME...] Reload one or more units\n"
- " restart [NAME...] Start or restart one or more units\n"
- " try-restart [NAME...] Restart one or more units if active\n"
- " reload-or-restart [NAME...] Reload one or more units if possible,\n"
+ " start NAME... Start (activate) one or more units\n"
+ " stop NAME... Stop (deactivate) one or more units\n"
+ " reload NAME... Reload one or more units\n"
+ " restart NAME... Start or restart one or more units\n"
+ " try-restart NAME... Restart one or more units if active\n"
+ " reload-or-restart NAME... Reload one or more units if possible,\n"
" otherwise start or restart\n"
- " reload-or-try-restart [NAME...] Reload one or more units if possible,\n"
+ " reload-or-try-restart NAME... Reload one or more units if possible,\n"
" otherwise restart if active\n"
- " isolate [NAME] Start one unit and stop all others\n"
- " kill [NAME...] Send signal to processes of a unit\n"
- " is-active [NAME...] Check whether units are active\n"
- " is-failed [NAME...] Check whether units are failed\n"
+ " isolate NAME Start one unit and stop all others\n"
+ " kill NAME... Send signal to processes of a unit\n"
+ " is-active NAME... Check whether units are active\n"
+ " is-failed NAME... Check whether units are failed\n"
" status [NAME...|PID...] Show runtime status of one or more units\n"
" show [NAME...|JOB...] Show properties of one or more\n"
" units/jobs or the manager\n"
- " cat [NAME...] Show files and drop-ins of one or more units\n"
- " set-property [NAME] [ASSIGNMENT...]\n"
- " Sets one or more properties of a unit\n"
- " help [NAME...|PID...] Show manual for one or more units\n"
+ " cat NAME... Show files and drop-ins of one or more units\n"
+ " set-property NAME ASSIGNMENT... Sets one or more properties of a unit\n"
+ " help NAME...|PID... Show manual for one or more units\n"
" reset-failed [NAME...] Reset failed state for all, one, or more\n"
" units\n"
" list-dependencies [NAME] Recursively show units which are required\n"
" unit is required or wanted\n\n"
"Unit File Commands:\n"
" list-unit-files [PATTERN...] List installed unit files\n"
- " enable [NAME...] Enable one or more unit files\n"
- " disable [NAME...] Disable one or more unit files\n"
- " reenable [NAME...] Reenable one or more unit files\n"
- " preset [NAME...] Enable/disable one or more unit files\n"
+ " enable NAME... Enable one or more unit files\n"
+ " disable NAME... Disable one or more unit files\n"
+ " reenable NAME... Reenable one or more unit files\n"
+ " preset NAME... Enable/disable one or more unit files\n"
" based on preset configuration\n"
- " is-enabled [NAME...] Check whether unit files are enabled\n\n"
- " mask [NAME...] Mask one or more units\n"
- " unmask [NAME...] Unmask one or more units\n"
- " link [PATH...] Link one or more units files into\n"
+ " is-enabled NAME... Check whether unit files are enabled\n\n"
+ " mask NAME... Mask one or more units\n"
+ " unmask NAME... Unmask one or more units\n"
+ " link PATH... Link one or more units files into\n"
" the search path\n"
" get-default Get the name of the default target\n"
" set-default NAME Set the default target\n\n"
" cancel [JOB...] Cancel all, one, or more jobs\n\n"
"Snapshot Commands:\n"
" snapshot [NAME] Create a snapshot\n"
- " delete [NAME...] Remove one or more snapshots\n\n"
+ " delete NAME... Remove one or more snapshots\n\n"
"Environment Commands:\n"
" show-environment Dump environment\n"
- " set-environment [NAME=VALUE...] Set one or more environment variables\n"
- " unset-environment [NAME...] Unset one or more environment variables\n\n"
+ " set-environment NAME=VALUE... Set one or more environment variables\n"
+ " unset-environment NAME... Unset one or more environment variables\n\n"
"Manager Lifecycle Commands:\n"
" daemon-reload Reload systemd manager configuration\n"
" daemon-reexec Reexecute systemd manager\n\n"
" reboot [ARG] Shut down and reboot the system\n"
" kexec Shut down and reboot the system with kexec\n"
" exit Request user instance exit\n"
- " switch-root [ROOT] [INIT] Change to a different root file system\n"
+ " switch-root ROOT [INIT] Change to a different root file system\n"
" suspend Suspend the system\n"
" hibernate Hibernate the system\n"
" hybrid-sleep Hibernate and suspend the system\n",