X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fsystemctl%2Fsystemctl.c;h=599d5907478408e4910880c738dd6f86b0e65b01;hp=fc6329cdd0921d0da6b615914f116105e360a6f7;hb=0c6ea3a4e2ac3f350dcb58e8f08bb74b030cd624;hpb=749ebb2da4933de68bfaa4d6f6ffd9e4692ee547 diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c index fc6329cdd..599d59074 100644 --- a/src/systemctl/systemctl.c +++ b/src/systemctl/systemctl.c @@ -456,7 +456,7 @@ static int output_units_list(const UnitInfo *unit_infos, unsigned c) { } 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, @@ -1928,7 +1928,7 @@ static void dump_unit_file_changes(const UnitFileChange *changes, unsigned n_cha 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); } @@ -1945,7 +1945,7 @@ static int deserialize_and_dump_unit_file_changes(sd_bus_message *m) { 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); } @@ -3170,6 +3170,7 @@ typedef struct UnitStatusInfo { const char *status_text; const char *pid_file; bool running:1; + int status_errno; usec_t start_timestamp; usec_t exit_timestamp; @@ -3441,6 +3442,8 @@ static void print_status_info( 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 || @@ -3500,50 +3503,11 @@ static void show_unit_help(UnitStatusInfo *i) { 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) { @@ -3661,6 +3625,8 @@ static int status_property(const char *name, sd_bus_message *m, UnitStatusInfo * 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; } @@ -5032,15 +4998,9 @@ static int enable_sysv_units(const char *verb, char **args) { STRV_FOREACH(k, paths.unit_path) { _cleanup_free_ char *path = NULL; - if (!isempty(arg_root)) - asprintf(&path, "%s/%s/%s", arg_root, *k, name); - else - asprintf(&path, "%s/%s", *k, name); - - if (!path) { - r = log_oom(); - goto finish; - } + path = path_join(arg_root, *k, name); + if (!path) + return log_oom(); found_native = access(path, F_OK) >= 0; if (found_native) @@ -5050,14 +5010,9 @@ static int enable_sysv_units(const char *verb, char **args) { if (found_native) continue; - if (!isempty(arg_root)) - asprintf(&p, "%s/" SYSTEM_SYSVINIT_PATH "/%s", arg_root, name); - else - asprintf(&p, SYSTEM_SYSVINIT_PATH "/%s", name); - if (!p) { - r = log_oom(); - goto finish; - } + p = path_join(arg_root, SYSTEM_SYSVINIT_PATH, name); + if (!p) + return log_oom(); p[strlen(p) - strlen(".service")] = 0; found_sysv = access(p, F_OK) >= 0; @@ -5079,18 +5034,15 @@ static int enable_sysv_units(const char *verb, char **args) { argv[c] = NULL; l = strv_join((char**)argv, " "); - if (!l) { - r = log_oom(); - goto finish; - } + if (!l) + return log_oom(); log_info("Executing %s", l); pid = fork(); if (pid < 0) { log_error("Failed to fork: %m"); - r = -errno; - goto finish; + return -errno; } else if (pid == 0) { /* Child */ @@ -5101,8 +5053,7 @@ static int enable_sysv_units(const char *verb, char **args) { j = wait_for_terminate(pid, &status); if (j < 0) { log_error("Failed to wait for child: %s", strerror(-r)); - r = j; - goto finish; + return j; } if (status.si_code == CLD_EXITED) { @@ -5116,17 +5067,12 @@ static int enable_sysv_units(const char *verb, char **args) { puts("disabled"); } - } else if (status.si_status != 0) { - r = -EINVAL; - goto finish; - } - } else { - r = -EPROTO; - goto finish; - } + } else if (status.si_status != 0) + return -EINVAL; + } else + return -EPROTO; } -finish: /* Drop all SysV units */ for (f = 0, t = 0; args[f]; f++) { @@ -5462,6 +5408,30 @@ static int unit_is_enabled(sd_bus *bus, char **args) { 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(); @@ -5573,6 +5543,7 @@ static int systemctl_help(void) { " 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" @@ -6576,6 +6547,7 @@ static int systemctl_main(sd_bus *bus, int argc, char *argv[], int bus_error) { { "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;