From: Simon Ruderich <simon@ruderich.org>
Date: Thu, 20 Jun 2013 21:33:27 +0000 (+0200)
Subject: Hook __swbuf() on FreeBSD.
X-Git-Tag: 0.1~25
X-Git-Url: https://ruderich.org/simon/gitweb/?a=commitdiff_plain;h=045ca46e7929c27c3c408324aaae02499b1eae81;p=coloredstderr%2Fcoloredstderr.git

Hook __swbuf() on FreeBSD.

Coloring works fine now on FreeBSD (with some minor issues). Tests still
fail though.
---

diff --git a/configure.ac b/configure.ac
index ef95ae9..4b513c3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -59,7 +59,7 @@ AC_CHECK_FUNCS([execvpe])
 dnl These are not in POSIX.
 AC_CHECK_FUNCS([fwrite_unlocked fputs_unlocked fputc_unlocked])
 dnl Internal functions in libc implementations which must be hooked.
-AC_CHECK_FUNCS([__overflow])
+AC_CHECK_FUNCS([__overflow __swbuf])
 
 dnl Thanks to gperftools' configure.ac (https://code.google.com/p/gperftools).
 AC_MSG_CHECKING([for __builtin_expect])
diff --git a/src/coloredstderr.c b/src/coloredstderr.c
index 22c3767..00de8a5 100644
--- a/src/coloredstderr.c
+++ b/src/coloredstderr.c
@@ -59,6 +59,13 @@
 /* In Clang when compiling with hardening flags (fortify) on Debian Wheezy. */
 #undef printf
 #undef fprintf
+/* On FreeBSD (9.1), __swbuf() is used instead of these macros. */
+#ifdef HAVE___SWBUF
+# undef putc
+# undef putc_unlocked
+# undef putchar
+# undef putchar_unlocked
+#endif
 
 
 /* Used by various functions, including debug(). */
@@ -279,6 +286,13 @@ HOOK_FILE1(int, putchar_unlocked, stdout,
 /* _IO_FILE is glibc's representation of FILE. */
 HOOK_FILE2(int, __overflow, f, _IO_FILE *, f, int, ch)
 #endif
+/* Same for FreeBSD's libc. However it's more aggressive: The inline writing
+ * and __swbuf() are also used for normal output (e.g. putc()). Writing to
+ * stderr is still fine; it always calls __swbuf() as stderr is always
+ * unbufferd. */
+#ifdef HAVE___SWBUF
+HOOK_FILE2(int, __swbuf, f, int, c, FILE *, f)
+#endif
 
 /* perror(3) */
 HOOK_VOID1(void, perror, STDERR_FILENO,