>From 12eb804c672742f9b92d5204116e198919a8a585 Mon Sep 17 00:00:00 2001 From: KO Myung-Hun Date: Wed, 3 Sep 2014 20:47:02 +0900 Subject: [PATCH] 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. --- lib/freopen.c | 18 +++++++++++++++++- m4/freopen.m4 | 4 ++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/lib/freopen.c b/lib/freopen.c index 384eba6..0d582bf 100644 --- 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 @@ orig_freopen (const char *filename, const char *mode, FILE *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 - 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 index 69e4523..cc53f9c 100644 --- 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_DEFUN([gl_FUNC_FREOPEN], AC_REQUIRE([gl_STDIO_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) case "$host_os" in - mingw* | pw*) + mingw* | pw* | os2*) REPLACE_FREOPEN=1 ;; esac -- 1.8.5.2