]> ruderich.org/simon Gitweb - coloredstderr/coloredstderr.git/commitdiff
Add ENV_NAME_FORCE_WRITE to force writes to non-tty devices.
authorSimon Ruderich <simon@ruderich.org>
Sat, 1 Jun 2013 19:13:23 +0000 (21:13 +0200)
committerSimon Ruderich <simon@ruderich.org>
Sat, 1 Jun 2013 19:13:23 +0000 (21:13 +0200)
src/coloredstderr.c
src/constants.h
src/trackfds.h

index 3e5dac2c770ca1f44481529911effab60a7b092c..10b83be2db01d074bb5b5f5255ecbc5aeda1a805 100644 (file)
@@ -42,6 +42,8 @@ static size_t (*real_fwrite)(const void *, size_t, size_t, FILE *);
 /* Did we already (try to) parse the environment and setup the necessary
  * variables? */
 static int initialized;
+/* Force hooked writes even when not writing to a tty. Used for tests. */
+static int force_write_to_non_tty;
 
 
 #include "constants.h"
@@ -56,16 +58,17 @@ static int initialized;
 
 /* Should the "action" handler be invoked for this file descriptor? */
 static int check_handle_fd(int fd) {
-    /* Never touch anything not going to a terminal. */
-    if (!isatty(fd)) {
-        return 0;
-    }
-
     /* Load state from environment. Only necessary once per process. */
     if (!initialized) {
         init_from_environment();
     }
 
+    /* Never touch anything not going to a terminal - unless we are explicitly
+     * asked to do so. */
+    if (!force_write_to_non_tty && !isatty(fd)) {
+        return 0;
+    }
+
     if (tracked_fds_count == 0) {
         return 0;
     }
index 103ca6378e0bcfa89e6de877e39cef5d035cb78d..d577cb263b372a017471a75b3f0b3dfd186a02da 100644 (file)
@@ -24,6 +24,7 @@
 #define ENV_NAME_FDS "COLORED_STDERR_FDS"
 #define ENV_NAME_PRE_STRING "COLORED_STDERR_PRE"
 #define ENV_NAME_POST_STRING "COLORED_STDERR_POST"
+#define ENV_NAME_FORCE_WRITE "COLORED_STDERR_FORCE_WRITE"
 
 /* Strings written before/after each matched function. */
 #define DEFAULT_PRE_STRING "\e[91m"
index e342b1223394e1a8fc9b4c28178ac44f478ddc3b..614b4bf8a0fb1d3181a57199133761339959f455 100644 (file)
@@ -34,10 +34,19 @@ static size_t tracked_fds_space;
  * ENV_NAME_FDS has the following format: Each descriptor as string followed
  * by a comma; there's a trailing comma. Example: "2,4,". */
 static void init_from_environment(void) {
+    const char *env;
+
     initialized = 1;
     tracked_fds_count = 0;
 
-    const char *env = getenv(ENV_NAME_FDS);
+    /* If ENV_NAME_FORCE_WRITE is set and not empty, allow writes to a non-tty
+     * device. Use with care! Mainly used for the test suite. */
+    env = getenv(ENV_NAME_FORCE_WRITE);
+    if (env && env[0] != '\0') {
+        force_write_to_non_tty = 1;
+    }
+
+    env = getenv(ENV_NAME_FDS);
     if (!env) {
         return;
     }