X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=liblttng-ust-fd%2Flttng-ust-fd.c;h=02c40d8cc3c0dd604226ebeb89fc240841a8ea1f;hb=867942fdcdf016a65df7165b4b8135801e2832c2;hp=6a095db60803e1cd45f50dce805faaba4d915716;hpb=95e6d2685eec83a144f533a447ffd355fadf9d79;p=lttng-ust.git diff --git a/liblttng-ust-fd/lttng-ust-fd.c b/liblttng-ust-fd/lttng-ust-fd.c index 6a095db6..02c40d8c 100644 --- a/liblttng-ust-fd/lttng-ust-fd.c +++ b/liblttng-ust-fd/lttng-ust-fd.c @@ -16,7 +16,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#define _GNU_SOURCE #define _LGPL_SOURCE #include #include @@ -28,9 +27,8 @@ #include #include "usterr-signal-safe.h" -volatile enum ust_loglevel ust_loglevel; - static int (*__lttng_ust_fd_plibc_close)(int fd); +static int (*__lttng_ust_fd_plibc_fclose)(FILE *stream); static int _lttng_ust_fd_libc_close(int fd) @@ -45,22 +43,46 @@ int _lttng_ust_fd_libc_close(int fd) return lttng_ust_safe_close_fd(fd, __lttng_ust_fd_plibc_close); } +static +int _lttng_ust_fd_libc_fclose(FILE *stream) +{ + if (!__lttng_ust_fd_plibc_fclose) { + __lttng_ust_fd_plibc_fclose = dlsym(RTLD_NEXT, "fclose"); + if (!__lttng_ust_fd_plibc_fclose) { + fprintf(stderr, "%s\n", dlerror()); + return -1; + } + } + return lttng_ust_safe_fclose_stream(stream, + __lttng_ust_fd_plibc_fclose); +} + int close(int fd) { return _lttng_ust_fd_libc_close(fd); } +/* + * Note: fcloseall() is not an issue because it fcloses only the + * streams it knows about, which differs from the problems caused by + * gnulib close_stdout(), which does an explicit fclose(stdout). + */ +int fclose(FILE *stream) +{ + return _lttng_ust_fd_libc_fclose(stream); +} + #if defined(__sun__) || defined(__FreeBSD__) /* Solaris and FreeBSD. */ void closefrom(int lowfd) { - (void) lttng_ust_safe_closefrom(lowfd, __lttng_ust_fd_plibc_close); + (void) lttng_ust_safe_closefrom_fd(lowfd, __lttng_ust_fd_plibc_close); } #elif defined(__NetBSD__) || defined(__OpenBSD__) /* NetBSD and OpenBSD. */ int closefrom(int lowfd) { - return lttng_ust_safe_closefrom(lowfd, __lttng_ust_fd_plibc_close); + return lttng_ust_safe_closefrom_fd(lowfd, __lttng_ust_fd_plibc_close); } #else /* As far as we know, this OS does not implement closefrom. */