X-Git-Url: https://ruderich.org/simon/gitweb/?p=coloredstderr%2Fcoloredstderr.git;a=blobdiff_plain;f=src%2Fcoloredstderr.c;h=7c4a5f5010cc42163ca10e8de75a34cb1ea32da1;hp=cc588836817b4dfaad26713b7a3b24f77c145cff;hb=6d6ad4423ae87771bd44f90006a648ec03931961;hpb=779ba750f7faa68c594339399cb710ca362b3465 diff --git a/src/coloredstderr.c b/src/coloredstderr.c index cc58883..7c4a5f5 100644 --- a/src/coloredstderr.c +++ b/src/coloredstderr.c @@ -25,6 +25,12 @@ /* Must be loaded before the following headers. */ #include "ldpreload.h" +/* Disable assert()s if not compiled with --enable-debug. */ +#ifndef DEBUG +# define NDEBUG +#endif + +#include #include #include #include @@ -35,6 +41,9 @@ #ifdef HAVE_ERROR_H # include #endif +#ifdef HAVE_STRUCT__IO_FILE__FILENO +# include +#endif /* Conflicting declaration in glibc. */ #undef fwrite_unlocked @@ -75,6 +84,8 @@ static int force_write_to_non_tty; * additional call. */ static int isatty_noinline(int fd) noinline; static int isatty_noinline(int fd) { + assert(fd >= 0); + int saved_errno = errno; int result = isatty(fd); errno = saved_errno; @@ -88,6 +99,8 @@ static void dup_fd(int oldfd, int newfd) { debug("%3d -> %3d\t\t\t[%d]\n", oldfd, newfd, getpid()); #endif + assert(oldfd >= 0 && newfd >= 0); + if (unlikely(!initialized)) { init_from_environment(); } @@ -110,6 +123,8 @@ static void close_fd(int fd) { debug("%3d -> .\t\t\t[%d]\n", fd, getpid()); #endif + assert(fd >= 0); + if (unlikely(!initialized)) { init_from_environment(); } @@ -241,6 +256,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, @@ -389,14 +408,20 @@ static int (*real_close)(int); int close(int fd) { DLSYM_FUNCTION(real_close, "close"); - close_fd(fd); + if (fd >= 0) { + close_fd(fd); + } return real_close(fd); } static int (*real_fclose)(FILE *); int fclose(FILE *fp) { + int fd; + DLSYM_FUNCTION(real_fclose, "fclose"); - close_fd(fileno(fp)); + if (fp != NULL && (fd = fileno(fp)) >= 0) { + close_fd(fd); + } return real_fclose(fp); }