Hi/2.

Paul Eggert wrote:
> KO Myung-Hun wrote:
>> Unfortunately, if freopen is not replaced by gnulib, freopen-safer also
>> has a bug.
> 
> In that case, gnulib should be fixed so that freopen is replaced on
> kLIBC, since kLIBC freopen doesn't work correctly here.

Fixed.

-- 
KO Myung-Hun

Using Mozilla SeaMonkey 2.7.2
Under OS/2 Warp 4 for Korean with FixPak #15
In VirtualBox v4.1.32 on Intel Core i7-3615QM 2.30GHz with 8GB RAM

Korean OS/2 User Community : http://www.ecomstation.co.kr

From bd16142e55babe52d0d082174ca147f2e5bd056d Mon Sep 17 00:00:00 2001
From: KO Myung-Hun <k...@chollian.net>
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 (orig_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..953fe1a 100644
--- a/lib/freopen.c
+++ b/lib/freopen.c
@@ -26,10 +26,26 @@
 #include <stdio.h>
 #undef __need_FILE
 
+#include <errno.h>
+
 static FILE *
 orig_freopen (const char *filename, const char *mode, FILE *stream)
 {
-  return freopen (filename, mode, stream);
+  FILE *result;
+
+  /* Clear errno to check the success of freopen() with it */
+  errno = 0;
+
+  result = 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;
 }
 
 /* Specification.  */
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

Reply via email to