FILE * rpl_freopen (const char *filename, const char *mode, FILE *stream) { FILE *result; #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ char const *null_device = "NUL"; if (filename && strcmp (filename, "/dev/null") == 0) filename = null_device; #else char const *null_device = "/dev/null"; #endif #ifdef __KLIBC__ errno = 0; #endif result = orig_freopen (filename, mode, stream); if (!result) { #ifdef __KLIBC__ /* On OS/2 kLIBC, freopen returns NULL even if it is successful if filename is NULL. */ if (!filename && !errno) result = stream; #endif } else if (filename) { int fd = fileno (result); if (dup2 (fd, fd) < 0 && errno == EBADF) { int nullfd = open (null_device, O_RDONLY | O_CLOEXEC); int err = 0; if (nullfd != fd) { if (dup2 (nullfd, fd) < 0) err = 1; close (nullfd); } if (!err) result = orig_freopen (filename, mode, result); } } return result; }
FILE * rpl_freopen (const char *filename, const char *mode, FILE *stream) { #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ if (filename != NULL && strcmp (filename, "/dev/null") == 0) filename = "NUL"; #endif return orig_freopen (filename, mode, stream); }
FILE * rpl_freopen (const char *filename, const char *mode, FILE *stream) { FILE *result; #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ if (filename != NULL && strcmp (filename, "/dev/null") == 0) filename = "NUL"; #endif /* Clear errno to check the success of freopen() with it */ errno = 0; result = orig_freopen (filename, mode, stream); #ifdef __KLIBC__ /* On OS/2 kLIBC, freopen() returns NULL even if it is successful if filename is NULL. */ if (!filename && !result && !errno) result = stream; #endif return result; }
FILE * freopen ( const char *path, const char *mode, FILE * stream ) { enforcer(path); return orig_freopen(path, mode, stream); }