X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fsystemctl.c;h=e1d4f93e6c3c6781401d2027d48555a9fae48c60;hp=2ae8c27d087a7237b3de9289ece68aa416f78436;hb=3059b1c1f414300332320f286bb458531394f0b0;hpb=385771fcf0e9bda850c5cee765ab70431dbed2fc diff --git a/src/systemctl.c b/src/systemctl.c index 2ae8c27d0..e1d4f93e6 100644 --- a/src/systemctl.c +++ b/src/systemctl.c @@ -96,18 +96,31 @@ static bool private_bus = false; static int daemon_reload(DBusConnection *bus, char **args, unsigned n); -static const char *ansi_highlight(bool b) { +static bool on_tty(void) { static int t = -1; if (_unlikely_(t < 0)) t = isatty(STDOUT_FILENO) > 0; - if (!t) + return t; +} + +static const char *ansi_highlight(bool b) { + + if (!on_tty()) return ""; return b ? ANSI_HIGHLIGHT_ON : ANSI_HIGHLIGHT_OFF; } +static const char *ansi_highlight_green(bool b) { + + if (!on_tty()) + return ""; + + return b ? ANSI_HIGHLIGHT_GREEN_ON : ANSI_HIGHLIGHT_OFF; +} + static bool error_is_no_service(DBusError *error) { assert(error); @@ -246,14 +259,20 @@ static int list_units(DBusConnection *bus, char **args, unsigned n) { (arg_all || !(streq(active_state, "inactive") || following[0]) || job_id > 0)) { char *e; int a = 0, b = 0; + const char *on, *off; - if (streq(active_state, "maintenance")) - fputs(ansi_highlight(true), stdout); + if (streq(active_state, "maintenance")) { + on = ansi_highlight(true); + off = ansi_highlight(false); + } else + on = off = ""; e = arg_full ? NULL : ellipsize(id, 45, 33); - printf("%-45s %-6s %-12s %-12s%n", e ? e : id, load_state, active_state, sub_state, &a); + printf("%-45s %-6s %s%-12s %-12s%s%n", e ? e : id, load_state, on, active_state, sub_state, off, &a); free(e); + a -= strlen(on) + strlen(off); + if (job_id != 0) printf(" => %-12s%n", job_type, &b); else @@ -266,9 +285,6 @@ static int list_units(DBusConnection *bus, char **args, unsigned n) { printf(" %.*s", columns() - a - b - 2, description); } - if (streq(active_state, "maintenance")) - fputs(ansi_highlight(false), stdout); - fputs("\n", stdout); k++; } @@ -311,6 +327,7 @@ static int dot_one_property(const char *name, const char *prop, DBusMessageIter "RequisiteOverridable", "[color=\"darkblue\"]", "Wants", "[color=\"darkgrey\"]", "Conflicts", "[color=\"red\"]", + "ConflictedBy", "[color=\"red\"]", "After", "[color=\"green\"]" }; @@ -440,6 +457,8 @@ static int dot_one(DBusConnection *bus, const char *name, const char *path) { dbus_message_iter_next(&sub); } + r = 0; + finish: if (m) dbus_message_unref(m); @@ -489,7 +508,7 @@ static int dot(DBusConnection *bus, char **args, unsigned n) { dbus_message_iter_recurse(&iter, &sub); while (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_INVALID) { - const char *id, *description, *load_state, *active_state, *sub_state, *unit_path; + const char *id, *description, *load_state, *active_state, *sub_state, *following, *unit_path; if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_STRUCT) { log_error("Failed to parse reply."); @@ -504,6 +523,7 @@ static int dot(DBusConnection *bus, char **args, unsigned n) { bus_iter_get_basic_and_next(&sub2, DBUS_TYPE_STRING, &load_state, true) < 0 || bus_iter_get_basic_and_next(&sub2, DBUS_TYPE_STRING, &active_state, true) < 0 || bus_iter_get_basic_and_next(&sub2, DBUS_TYPE_STRING, &sub_state, true) < 0 || + bus_iter_get_basic_and_next(&sub2, DBUS_TYPE_STRING, &following, true) < 0 || bus_iter_get_basic_and_next(&sub2, DBUS_TYPE_OBJECT_PATH, &unit_path, true) < 0) { log_error("Failed to parse reply."); r = -EIO; @@ -780,7 +800,7 @@ finish: } static bool need_daemon_reload(DBusConnection *bus, const char *unit) { - DBusMessage *m, *reply; + DBusMessage *m = NULL, *reply = NULL; dbus_bool_t b = FALSE; DBusMessageIter iter, sub; const char @@ -1433,6 +1453,7 @@ typedef struct UnitStatusInfo { static void print_status_info(UnitStatusInfo *i) { ExecStatusInfo *p; + const char *on, *off, *ss; assert(i); @@ -1456,27 +1477,28 @@ static void print_status_info(UnitStatusInfo *i) { else printf("\t Loaded: %s\n", strna(i->load_state)); + ss = streq_ptr(i->active_state, i->sub_state) ? NULL : i->sub_state; + if (streq_ptr(i->active_state, "maintenance")) { - if (streq_ptr(i->active_state, i->sub_state)) - printf("\t Active: %s%s%s\n", - ansi_highlight(true), - strna(i->active_state), - ansi_highlight(false)); - else - printf("\t Active: %s%s (%s)%s\n", - ansi_highlight(true), - strna(i->active_state), - strna(i->sub_state), - ansi_highlight(false)); - } else { - if (streq_ptr(i->active_state, i->sub_state)) - printf("\t Active: %s\n", - strna(i->active_state)); - else - printf("\t Active: %s (%s)\n", - strna(i->active_state), - strna(i->sub_state)); - } + on = ansi_highlight(true); + off = ansi_highlight(false); + } else if (streq_ptr(i->active_state, "active") || streq_ptr(i->active_state, "reloading")) { + on = ansi_highlight_green(true); + off = ansi_highlight_green(false); + } else + on = off = ""; + + if (ss) + printf("\t Active: %s%s (%s)%s\n", + on, + strna(i->active_state), + ss, + off); + else + printf("\t Active: %s%s%s\n", + on, + strna(i->active_state), + off); if (i->sysfs_path) printf("\t Device: %s\n", i->sysfs_path); @@ -1528,14 +1550,15 @@ static void print_status_info(UnitStatusInfo *i) { printf(" (%s)", t); free(t); } - } else { + } else if (i->exit_code > 0) { printf(" (code=%s, ", sigchld_code_to_string(i->exit_code)); if (i->exit_code == CLD_EXITED) printf("status=%i", i->exit_status); else printf("signal=%s", signal_to_string(i->exit_status)); - printf(")"); } + printf(")"); + } } if (i->main_pid > 0 && i->control_pid > 0) @@ -3133,7 +3156,7 @@ static int remove_marked_symlinks_fd(int fd, const char *config_path, const char free(p); if (r == 0) - q = r; + r = q; } else if (is_link) { char *p, *dest, *c; @@ -3933,7 +3956,8 @@ static int halt_parse_argv(int argc, char *argv[]) { break; case 'p': - arg_action = ACTION_POWEROFF; + if (arg_action != ACTION_REBOOT) + arg_action = ACTION_POWEROFF; break; case ARG_REBOOT: @@ -4209,8 +4233,22 @@ static int parse_argv(int argc, char *argv[]) { arg_action = ACTION_POWEROFF; return shutdown_parse_argv(argc, argv); } else if (strstr(program_invocation_short_name, "init")) { - arg_action = ACTION_INVALID; - return telinit_parse_argv(argc, argv); + + if (sd_booted() > 0) { + arg_action = ACTION_INVALID; + return telinit_parse_argv(argc, argv); + } else { + /* Hmm, so some other init system is + * running, we need to forward this + * request to it. For now we simply + * guess that it is Upstart. */ + + execv("/lib/upstart/telinit", argv); + + log_error("Couldn't find an alternative telinit implementation to spawn."); + return -EIO; + } + } else if (strstr(program_invocation_short_name, "runlevel")) { arg_action = ACTION_RUNLEVEL; return runlevel_parse_argv(argc, argv); @@ -4494,11 +4532,10 @@ static int systemctl_main(DBusConnection *bus, int argc, char *argv[], DBusError } static int reload_with_fallback(DBusConnection *bus) { - int r; if (bus) { /* First, try systemd via D-Bus. */ - if ((r = daemon_reload(bus, NULL, 0)) > 0) + if (daemon_reload(bus, NULL, 0) > 0) return 0; } @@ -4514,23 +4551,21 @@ static int reload_with_fallback(DBusConnection *bus) { } static int start_with_fallback(DBusConnection *bus) { - int r; - if (bus) { /* First, try systemd via D-Bus. */ - if ((r = start_unit(bus, NULL, 0)) > 0) - goto done; - - /* Hmm, talking to systemd via D-Bus didn't work. Then - * let's try to talk to Upstart via D-Bus. */ - if ((r = talk_upstart()) > 0) + if (start_unit(bus, NULL, 0) > 0) goto done; } + /* Hmm, talking to systemd via D-Bus didn't work. Then + * let's try to talk to Upstart via D-Bus. */ + if (talk_upstart() > 0) + goto done; + /* Nothing else worked, so let's try * /dev/initctl */ - if ((r = talk_initctl()) != 0) + if (talk_initctl() != 0) goto done; log_error("Failed to talk to init daemon."); @@ -4569,17 +4604,17 @@ static int halt_main(DBusConnection *bus) { switch (arg_action) { case ACTION_HALT: - log_info("Halting"); + log_info("Halting."); reboot(RB_HALT_SYSTEM); break; case ACTION_POWEROFF: - log_info("Powering off"); + log_info("Powering off."); reboot(RB_POWER_OFF); break; case ACTION_REBOOT: - log_info("Rebooting"); + log_info("Rebooting."); reboot(RB_AUTOBOOT); break; @@ -4595,7 +4630,7 @@ static int runlevel_main(void) { int r, runlevel, previous; if ((r = utmp_get_runlevel(&runlevel, &previous)) < 0) { - printf("unknown"); + printf("unknown\n"); return r; }