From 96710bc3fa919e221338ef96686e80ba590d3b77 Mon Sep 17 00:00:00 2001 From: Simon Ruderich Date: Sat, 1 Jun 2013 21:13:23 +0200 Subject: [PATCH] Add ENV_NAME_FORCE_WRITE to force writes to non-tty devices. --- src/coloredstderr.c | 13 ++++++++----- src/constants.h | 1 + src/trackfds.h | 11 ++++++++++- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/coloredstderr.c b/src/coloredstderr.c index 3e5dac2..10b83be 100644 --- a/src/coloredstderr.c +++ b/src/coloredstderr.c @@ -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; } diff --git a/src/constants.h b/src/constants.h index 103ca63..d577cb2 100644 --- a/src/constants.h +++ b/src/constants.h @@ -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" diff --git a/src/trackfds.h b/src/trackfds.h index e342b12..614b4bf 100644 --- a/src/trackfds.h +++ b/src/trackfds.h @@ -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; } -- 2.45.2