X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fsystemctl.c;h=8ef1adda5e3126bc1bc5f820b944c9a39836b21b;hp=3ca146447aa4c181b9c2e127aaaa2766f206a6e4;hb=2ee68f721168378a037a112a5400af0b92805432;hpb=a042efad57741e90ee78b69c57310858295bf3fc diff --git a/src/systemctl.c b/src/systemctl.c index 3ca146447..8ef1adda5 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\"]" }; @@ -489,7 +506,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 +521,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; @@ -1433,6 +1451,7 @@ typedef struct UnitStatusInfo { static void print_status_info(UnitStatusInfo *i) { ExecStatusInfo *p; + const char *on, *off, *ss; assert(i); @@ -1456,27 +1475,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 +1548,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) @@ -4609,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; }