Fix hook for putc_unlocked() with glibc.

putc_unlocked() is a macro which expands to __overflow() in some cases.
This commit is contained in:
Simon Ruderich
2013-06-13 12:59:12 +02:00
parent d8be625da9
commit 7adfbfd2cf
5 changed files with 24 additions and 0 deletions

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

View File

@@ -117,6 +117,13 @@
_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) { \