]> ruderich.org/simon Gitweb - coloredstderr/coloredstderr.git/commitdiff
Fix hook for putc_unlocked() with glibc.
authorSimon Ruderich <simon@ruderich.org>
Thu, 13 Jun 2013 10:59:12 +0000 (12:59 +0200)
committerSimon Ruderich <simon@ruderich.org>
Thu, 13 Jun 2013 10:59:12 +0000 (12:59 +0200)
putc_unlocked() is a macro which expands to __overflow() in some cases.

configure.ac
src/coloredstderr.c
src/hookmacros.h
tests/example.c
tests/example.expected

index 7ef71f9f72eba81b7e117d8dccabd1cf3a364df3..09d90a0364268f355c4711f1aa5b53b8c1cc4790 100644 (file)
@@ -47,6 +47,11 @@ AC_TYPE_SSIZE_T
 AC_C_INLINE
 AX_C___ATTRIBUTE__
 
+AC_CHECK_MEMBER([struct _IO_FILE._fileno],
+                [AC_DEFINE([HAVE_STRUCT__IO_FILE__FILENO], 1,
+                           [Define to 1 if `_fileno' is a member of `struct _IO_FILE'.])],
+                [],[[#include <libio.h>]])
+
 AC_FUNC_FORK
 AC_CHECK_FUNCS([memmove setenv],
                [],[AC_MSG_ERROR([function is required])])
index cc588836817b4dfaad26713b7a3b24f77c145cff..db6cb27e9f14771a70581222ece7704b816c8d7e 100644 (file)
@@ -35,6 +35,9 @@
 #ifdef HAVE_ERROR_H
 # include <error.h>
 #endif
+#ifdef HAVE_STRUCT__IO_FILE__FILENO
+# include <libio.h>
+#endif
 
 /* Conflicting declaration in glibc. */
 #undef fwrite_unlocked
@@ -241,6 +244,10 @@ HOOK_FILE2(int, putc_unlocked, stream,
            int, c, FILE *, stream)
 HOOK_FILE1(int, putchar_unlocked, stdout,
            int, c)
+/* glibc defines (_IO_)putc_unlocked() to __overflow() in some cases. */
+#ifdef HAVE_STRUCT__IO_FILE__FILENO
+HOOK_FD2(int, __overflow, f->_fileno, _IO_FILE *, f, int, ch)
+#endif
 
 /* perror(3) */
 HOOK_VOID1(void, perror, STDERR_FILENO,
index b5e2cb0b1fdb93d7ab95cb58012b6d5177ec3a00..b8b70ec03bf035fc26c927de13e5caaaa7331daa 100644 (file)
         _HOOK_POST_FD_(fd) \
     }
 
+#define HOOK_FD2(type, name, fd, type1, arg1, type2, arg2) \
+    static type (*real_ ## name)(type1, type2); \
+    type name(type1 arg1, type2 arg2) { \
+        _HOOK_PRE_FD(type, name, fd) \
+        result = real_ ## name(arg1, arg2); \
+        _HOOK_POST_FD(fd) \
+    }
 #define HOOK_FD3(type, name, fd, type1, arg1, type2, arg2, type3, arg3) \
     static type (*real_ ## name)(type1, type2, type3); \
     type name(type1 arg1, type2 arg2, type3 arg3) { \
index 7f7d2ad99e4e88114968ceb6eb5aa6312ca13e31..0fee9733f100a28dba8f0226a8aada01059acef4 100644 (file)
@@ -52,5 +52,9 @@ int main(int argc, char **argv unused) {
     write(42, "stderr ...\n", 11);
     write(471, "more on stdout\n", 15);
 
+    /* Glibc uses __overflow() for this ... */
+    putc_unlocked('x', stderr);
+    putc_unlocked('\n', stdout);
+
     return EXIT_SUCCESS;
 }
index edb9c584661e28f63458baa9ac172244ac54d074..ecd246139f55b9c696d2616dc08f007d3a730f5f 100644 (file)
@@ -6,3 +6,4 @@
 >STDERR>more on stderr
 <STDERR<>STDERR>stderr ...
 <STDERR<more on stdout
+>STDERR>x<STDERR<