/* 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"
/* 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;
}
#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"
* 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;
}