Hook __swbuf() on FreeBSD.
authorSimon Ruderich <simon@ruderich.org>
Thu, 20 Jun 2013 21:33:27 +0000 (23:33 +0200)
committerSimon Ruderich <simon@ruderich.org>
Thu, 20 Jun 2013 21:33:27 +0000 (23:33 +0200)
Coloring works fine now on FreeBSD (with some minor issues). Tests still
fail though.

configure.ac
src/coloredstderr.c

index ef95ae95025c420b98cb2d2a13e45e43f87bdb55..4b513c3366de705a4486ad6ef77f989e0c09fbb0 100644 (file)
@@ -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])
index 22c37675eaaf0fa660480ccb329549ce1e913c3b..00de8a588b080cee6b37d968f8641df954bd0544 100644 (file)
 /* 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,