X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=src%2Fcoloredstderr.c;h=eaeebd30801aff421096ecd801140721ddd26841;hb=b6d1dc09b620742b1877935f9f21a90a13ca5ee1;hp=4664f0d1a8d0efb033fb11bf28814fc4a730d12c;hpb=2241f5278e786c429b8d657c807ead792b4b5b36;p=coloredstderr%2Fcoloredstderr.git diff --git a/src/coloredstderr.c b/src/coloredstderr.c index 4664f0d..eaeebd3 100644 --- a/src/coloredstderr.c +++ b/src/coloredstderr.c @@ -2,7 +2,7 @@ * Hook output functions (like printf(3)) with LD_PRELOAD to color stderr (or * other file descriptors). * - * Copyright (C) 2013 Simon Ruderich + * Copyright (C) 2013-2014 Simon Ruderich * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -30,6 +30,10 @@ # define NDEBUG #endif +#ifndef TLS +# define TLS +#endif + #include #include #include @@ -85,8 +89,8 @@ static int used_fds_set_by_user; * If so don't print the pre/post string for the recursive calls. This is * necessary on some systems (e.g. FreeBSD 9.1) which call multiple hooked * functions while printing a string (e.g. a FILE * and a fd hook function is - * called). */ -static int handle_recursive; + * called). This is not thread-safe if TLS is not available. */ +static TLS int handle_recursive; #include "constants.h" @@ -193,7 +197,7 @@ static void handle_fd_pre(int fd) { int saved_errno = errno; - if (unlikely(!pre_string || !post_string)) { + if (unlikely(!pre_string)) { init_pre_post_string(); } @@ -222,7 +226,7 @@ static void handle_file_pre(FILE *stream) { int saved_errno = errno; - if (unlikely(!pre_string || !post_string)) { + if (unlikely(!pre_string)) { init_pre_post_string(); } @@ -371,7 +375,7 @@ static void error_vararg(int status, int errnum, if (error_one_per_line && filename != NULL && linenum != 0 && filename == last_filename && linenum == last_linenum) { - return; + goto out; } last_filename = filename; last_linenum = linenum; @@ -404,6 +408,7 @@ static void error_vararg(int status, int errnum, fprintf(stderr, "\n"); +out: if (status != 0) { exit(status); }