From 2cc59dbfe08e92496b242aed3f2b3cf130beb203 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 20 Jul 2010 21:04:32 +0200 Subject: [PATCH] systemctl: always disable color when output goes into a file --- fixme | 1 - src/main.c | 2 +- src/systemctl.c | 40 ++++++++++++++++++++++++++++++---------- 3 files changed, 31 insertions(+), 12 deletions(-) diff --git a/fixme b/fixme index 3fd02eda7..3a17c629c 100644 --- a/fixme +++ b/fixme @@ -39,7 +39,6 @@ * In command lines, support both "$FOO" and $FOO * /etc must always take precedence even if we follow symlinks! -* color aus bei stdout auf !tty * vielleicht implizit immer auf syslog dependen? diff --git a/src/main.c b/src/main.c index aaddce86e..964bb9cc3 100644 --- a/src/main.c +++ b/src/main.c @@ -836,7 +836,7 @@ int main(int argc, char *argv[]) { return 1; } - log_show_color(true); + log_show_color(isatty(STDERR_FILENO) > 0); log_show_location(false); log_set_max_level(LOG_INFO); diff --git a/src/systemctl.c b/src/systemctl.c index bdfd0cdf8..d78294b6d 100644 --- a/src/systemctl.c +++ b/src/systemctl.c @@ -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++; @@ -1422,18 +1434,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 +1520,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 +1558,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"); } -- 2.30.2