}
if (circle_len > 0)
- printf("%s%s%s", on_circle, circle ? draw_special_char(DRAW_BLACK_CIRCLE) : " ", off_circle);
+ printf("%s%s%s ", on_circle, circle ? draw_special_char(DRAW_BLACK_CIRCLE) : " ", off_circle);
printf("%s%-*s%s %s%-*s%s %s%-*s %-*s%s %-*s",
on_active, id_len, id, off_active,
for (i = 0; i < n_changes; i++) {
if (changes[i].type == UNIT_FILE_SYMLINK)
- log_info("Created symlink from %s to %s.", changes[i].source, changes[i].path);
+ log_info("Created symlink from %s to %s.", changes[i].path, changes[i].source);
else
log_info("Removed symlink %s.", changes[i].path);
}
while ((r = sd_bus_message_read(m, "(sss)", &type, &path, &source)) > 0) {
if (!arg_quiet) {
if (streq(type, "symlink"))
- log_info("Created symlink from %s to %s.", source, path);
+ log_info("Created symlink from %s to %s.", path, source);
else
log_info("Removed symlink %s.", path);
}
const char *status_text;
const char *pid_file;
bool running:1;
+ int status_errno;
usec_t start_timestamp;
usec_t exit_timestamp;
if (i->status_text)
printf(" Status: \"%s\"\n", i->status_text);
+ if (i->status_errno > 0)
+ printf(" Error: %i (%s)\n", i->status_errno, strerror(i->status_errno));
if (i->control_group &&
(i->main_pid > 0 || i->control_pid > 0 ||
return;
}
- STRV_FOREACH(p, i->documentation) {
-
- if (startswith(*p, "man:")) {
- const char *args[4] = { "man", NULL, NULL, NULL };
- _cleanup_free_ char *page = NULL, *section = NULL;
- char *e = NULL;
- pid_t pid;
- size_t k;
-
- k = strlen(*p);
-
- if ((*p)[k-1] == ')')
- e = strrchr(*p, '(');
-
- if (e) {
- page = strndup((*p) + 4, e - *p - 4);
- section = strndup(e + 1, *p + k - e - 2);
- if (!page || !section) {
- log_oom();
- return;
- }
-
- args[1] = section;
- args[2] = page;
- } else
- args[1] = *p + 4;
-
- pid = fork();
- if (pid < 0) {
- log_error("Failed to fork: %m");
- continue;
- }
-
- if (pid == 0) {
- /* Child */
- execvp(args[0], (char**) args);
- log_error("Failed to execute man: %m");
- _exit(EXIT_FAILURE);
- }
-
- wait_for_terminate(pid, NULL);
- } else
+ STRV_FOREACH(p, i->documentation)
+ if (startswith(*p, "man:"))
+ show_man_page(*p + 4, false);
+ else
log_info("Can't show: %s", *p);
- }
}
static int status_property(const char *name, sd_bus_message *m, UnitStatusInfo *i, const char *contents) {
i->exit_code = (int) j;
else if (streq(name, "ExecMainStatus"))
i->exit_status = (int) j;
+ else if (streq(name, "StatusErrno"))
+ i->status_errno = (int) j;
break;
}
return !enabled;
}
+static int is_system_running(sd_bus *bus, char **args) {
+ _cleanup_free_ char *state = NULL;
+ int r;
+
+ r = sd_bus_get_property_string(
+ bus,
+ "org.freedesktop.systemd1",
+ "/org/freedesktop/systemd1",
+ "org.freedesktop.systemd1.Manager",
+ "SystemState",
+ NULL,
+ &state);
+ if (r < 0) {
+ if (!arg_quiet)
+ puts("unknown");
+ return 0;
+ }
+
+ if (!arg_quiet)
+ puts(state);
+
+ return streq(state, "running") ? EXIT_SUCCESS : EXIT_FAILURE;
+}
+
static int systemctl_help(void) {
pager_open_if_enabled();
" daemon-reload Reload systemd manager configuration\n"
" daemon-reexec Reexecute systemd manager\n\n"
"System Commands:\n"
+ " is-system-running Check whether system is fully running\n"
" default Enter system default mode\n"
" rescue Enter system rescue mode\n"
" emergency Enter system emergency mode\n"
{ "set-default", EQUAL, 2, set_default, NOBUS },
{ "get-default", EQUAL, 1, get_default, NOBUS },
{ "set-property", MORE, 3, set_property },
+ { "is-system-running", EQUAL, 1, is_system_running },
{}
}, *verb = verbs;