]> ruderich.org/simon Gitweb - coloredstderr/coloredstderr.git/blobdiff - src/coloredstderr.c
Hook perror(3).
[coloredstderr/coloredstderr.git] / src / coloredstderr.c
index f54b765109687b7a3201663f5defe105ba08fcef..b16633f8534b8b7d9a1e4fdc64532a185497c598 100644 (file)
@@ -39,6 +39,12 @@ static ssize_t (*real_write)(int, const void *, size_t);
 static int (*real_close)(int);
 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"
 #ifdef DEBUG
@@ -52,16 +58,17 @@ static size_t (*real_fwrite)(const void *, size_t, size_t, FILE *);
 
 /* 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 (!tracked_fds) {
+    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;
     }
@@ -73,7 +80,7 @@ static void dup_fd(int oldfd, int newfd) {
     debug("%d -> %d\t\t\t[%d]\n", oldfd, newfd, getpid());
 #endif
 
-    if (!tracked_fds) {
+    if (!initialized) {
         init_from_environment();
     }
     if (tracked_fds_count == 0) {
@@ -101,7 +108,7 @@ static void close_fd(int fd) {
     debug("%d -> .\t\t\t[%d]\n", fd, getpid());
 #endif
 
-    if (!tracked_fds) {
+    if (!initialized) {
         init_from_environment();
     }
 
@@ -223,6 +230,10 @@ HOOK_FILE1(int, putchar_unlocked, stdout,
 HOOK_FILE1(int, puts_unlocked, stdout,
            const char *, s)
 
+/* perror(3) */
+HOOK_VOID1(void, perror, STDERR_FILENO,
+           const char *, s)
+
 
 /* Hook functions which duplicate file descriptors to track them. */