# HG changeset patch # User KO Myung-Hun # Date 1417759296 -32400 # Node ID 68470530f583f39ecfa354fefec85660df861378 # Parent 37e2854ec84cd730793e14b1fc70bef45e344bc4 freopen: workaround freopen() on OS/2 kLIBC On OS/2 kLIBC, freopen() returns NULL even if it is successful if filename is NULL. * lib/freopen.c (rpl_freopen): Workaround. * m4/freopen.m4: Add os2* case. diff --git a/ChangeLog b/ChangeLog --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2014-12-08 KO Myung-Hun + freopen: workaround freopen() on OS/2 kLIBC + * lib/freopen.c (rpl_freopen): Workaround. + * m4/freopen.m4: Add os2* case. + get_shared_library_fullname: port to EMX * lib/relocatable.c: Define strcmp and strncmp to stricmp and strnicmp on EMX, respectively. diff --git a/lib/freopen.c b/lib/freopen.c --- a/lib/freopen.c +++ b/lib/freopen.c @@ -26,6 +26,8 @@ #include #undef __need_FILE +#include + static FILE * orig_freopen (const char *filename, const char *mode, FILE *stream) { @@ -42,10 +44,24 @@ 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 - return orig_freopen (filename, mode, stream); + /* 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; } diff --git a/m4/freopen.m4 b/m4/freopen.m4 --- a/m4/freopen.m4 +++ b/m4/freopen.m4 @@ -1,4 +1,4 @@ -# freopen.m4 serial 4 +# freopen.m4 serial 5 dnl Copyright (C) 2007-2014 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -9,7 +9,7 @@ AC_REQUIRE([gl_STDIO_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) case "$host_os" in - mingw* | pw*) + mingw* | pw* | os2*) REPLACE_FREOPEN=1 ;; esac