chiark / gitweb /
systemctl: always disable color when output goes into a file
authorLennart Poettering <lennart@poettering.net>
Tue, 20 Jul 2010 19:04:32 +0000 (21:04 +0200)
committerLennart Poettering <lennart@poettering.net>
Tue, 20 Jul 2010 19:04:32 +0000 (21:04 +0200)
fixme
src/main.c
src/systemctl.c

diff --git a/fixme b/fixme
index 3fd02ed..3a17c62 100644 (file)
--- 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!
 
 * 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?
 
 
 * vielleicht implizit immer auf syslog dependen?
 
index aaddce8..964bb9c 100644 (file)
@@ -836,7 +836,7 @@ int main(int argc, char *argv[]) {
                 return 1;
         }
 
                 return 1;
         }
 
-        log_show_color(true);
+        log_show_color(isatty(STDERR_FILENO) > 0);
         log_show_location(false);
         log_set_max_level(LOG_INFO);
 
         log_show_location(false);
         log_set_max_level(LOG_INFO);
 
index bdfd0cd..d78294b 100644 (file)
@@ -86,6 +86,18 @@ static enum dot {
 
 static bool private_bus = false;
 
 
 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);
 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"))
                         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);
 
                         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"))
                         }
 
                         if (streq(active_state, "maintenance"))
-                                fputs(ANSI_HIGHLIGHT_OFF, stdout);
+                                fputs(ansi_highlight(false), stdout);
 
                         fputs("\n", stdout);
                         k++;
 
                         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"))
         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))
         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
                         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->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",
         } 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("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)
                 }
 
                 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)
         }
 
         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");
 }
 
                        arg_session ? "--session" : "--system");
 }