X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fsystemctl.c;h=667aeaeb9642cd4ee40891c745d96f522681b46c;hb=9d8a57fff160cc14873ebcbc79a4216a18b42f70;hp=bdfd0cdf87f52ac7e599727d94d6597e9a6b96d1;hpb=8fe914ec81d9f57bcc083036f528b00119ed2e3b;p=elogind.git diff --git a/src/systemctl.c b/src/systemctl.c index bdfd0cdf8..667aeaeb9 100644 --- a/src/systemctl.c +++ b/src/systemctl.c @@ -47,7 +47,7 @@ #include "list.h" static const char *arg_type = NULL; -static const char *arg_property = NULL; +static char **arg_property = NULL; static bool arg_all = false; static bool arg_fail = false; static bool arg_session = false; @@ -86,6 +86,18 @@ static enum dot { static bool private_bus = false; +static const char *ansi_highlight(bool b) { + static int t = -1; + + if (_unlikely_(t < 0)) + t = isatty(STDOUT_FILENO) > 0; + + if (!t) + return ""; + + return b ? ANSI_HIGHLIGHT_ON : ANSI_HIGHLIGHT_OFF; +} + static bool error_is_no_service(DBusError *error) { assert(error); @@ -226,7 +238,7 @@ static int list_units(DBusConnection *bus, char **args, unsigned n) { int a = 0, b = 0; if (streq(active_state, "maintenance")) - fputs(ANSI_HIGHLIGHT_ON, stdout); + fputs(ansi_highlight(true), stdout); e = arg_full ? NULL : ellipsize(id, 45, 33); printf("%-45s %-6s %-12s %-12s%n", e ? e : id, load_state, active_state, sub_state, &a); @@ -245,7 +257,7 @@ static int list_units(DBusConnection *bus, char **args, unsigned n) { } if (streq(active_state, "maintenance")) - fputs(ANSI_HIGHLIGHT_OFF, stdout); + fputs(ansi_highlight(false), stdout); fputs("\n", stdout); k++; @@ -1075,7 +1087,9 @@ static int start_unit(DBusConnection *bus, char **args, unsigned n) { streq(args[0], "restart") ? "RestartUnit" : streq(args[0], "try-restart") ? "TryRestartUnit" : streq(args[0], "reload-or-restart") ? "ReloadOrRestartUnit" : - streq(args[0], "reload-or-try-restart") ? "ReloadOrTryRestartUnit" : + streq(args[0], "reload-or-try-restart") || + streq(args[0], "force-reload") || + streq(args[0], "condrestart") ? "ReloadOrTryRestartUnit" : "StartUnit"; mode = @@ -1422,18 +1436,25 @@ static void print_status_info(UnitStatusInfo *i) { if (i->fragment_path) printf("\t Loaded: %s (%s)\n", strna(i->load_state), i->fragment_path); else if (streq_ptr(i->load_state, "failed")) - printf("\t Loaded: " ANSI_HIGHLIGHT_ON "%s" ANSI_HIGHLIGHT_OFF "\n", strna(i->load_state)); + printf("\t Loaded: %s%s%s\n", + ansi_highlight(true), + strna(i->load_state), + ansi_highlight(false)); else printf("\t Loaded: %s\n", strna(i->load_state)); if (streq_ptr(i->active_state, "maintenance")) { if (streq_ptr(i->active_state, i->sub_state)) - printf("\t Active: " ANSI_HIGHLIGHT_ON "%s" ANSI_HIGHLIGHT_OFF "\n", - strna(i->active_state)); + printf("\t Active: %s%s%s\n", + ansi_highlight(true), + strna(i->active_state), + ansi_highlight(false)); else - printf("\t Active: " ANSI_HIGHLIGHT_ON "%s (%s)" ANSI_HIGHLIGHT_OFF "\n", + printf("\t Active: %s%s (%s)%s\n", + ansi_highlight(true), strna(i->active_state), - strna(i->sub_state)); + strna(i->sub_state), + ansi_highlight(false)); } else { if (streq_ptr(i->active_state, i->sub_state)) printf("\t Active: %s\n", @@ -1501,8 +1522,7 @@ static void print_status_info(UnitStatusInfo *i) { 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) @@ -1540,7 +1560,9 @@ static void print_status_info(UnitStatusInfo *i) { } if (i->need_daemon_reload) - printf("\n" ANSI_HIGHLIGHT_ON "Warning:" ANSI_HIGHLIGHT_OFF " Unit file changed on disk, 'systemctl %s daemon-reload' recommended.\n", + printf("\n%sWarning:%s Unit file changed on disk, 'systemctl %s daemon-reload' recommended.\n", + ansi_highlight(true), + ansi_highlight(false), arg_session ? "--session" : "--system"); } @@ -1682,7 +1704,7 @@ static int print_property(const char *name, DBusMessageIter *iter) { /* This is a low-level property printer, see * print_status_info() for the nicer output */ - if (arg_property && !streq(name, arg_property)) + if (arg_property && !strv_find(arg_property, name)) return 0; switch (dbus_message_iter_get_arg_type(iter)) { @@ -3069,14 +3091,21 @@ static int systemctl_parse_argv(int argc, char *argv[]) { arg_type = optarg; break; - case 'p': - arg_property = optarg; + case 'p': { + char **l; + + if (!(l = strv_append(arg_property, optarg))) + return -ENOMEM; + + strv_free(arg_property); + arg_property = l; /* If the user asked for a particular * property, show it to him, even if it is * empty. */ arg_all = true; break; + } case 'a': arg_all = true; @@ -3633,6 +3662,8 @@ static int systemctl_main(DBusConnection *bus, int argc, char *argv[]) { { "try-restart", MORE, 2, start_unit }, { "reload-or-restart", MORE, 2, start_unit }, { "reload-or-try-restart", MORE, 2, start_unit }, + { "force-reload", MORE, 2, start_unit }, /* For compatibility with SysV */ + { "condrestart", MORE, 2, start_unit }, /* For compatibility with RH */ { "isolate", EQUAL, 2, start_unit }, { "check", MORE, 2, check_unit }, { "show", MORE, 1, show }, @@ -3907,5 +3938,7 @@ finish: dbus_shutdown(); + strv_free(arg_property); + return retval; }