Hook __swbuf() on FreeBSD.

Coloring works fine now on FreeBSD (with some minor issues). Tests still
fail though.
This commit is contained in:
Simon Ruderich
2013-06-20 23:33:27 +02:00
parent ba2283bd37
commit 045ca46e79
2 changed files with 15 additions and 1 deletions

View 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])

View File

@@ -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,