>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