bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 15/21] freopen: workaround freopen() on OS/2 kLIBC


From: KO Myung-Hun
Subject: [PATCH 15/21] freopen: workaround freopen() on OS/2 kLIBC
Date: Sun, 30 Nov 2014 13:20:17 +0900

On OS/2 kLIBC, freopen() returns NULL even if it is successful if
filename is NULL.

* lib/freopen-safer.c (klibc_freopen): New.
* lib/freopen.c (orig_freopen): Workaround.
---
 lib/freopen-safer.c | 19 +++++++++++++++++++
 lib/freopen.c       | 11 +++++++++++
 2 files changed, 30 insertions(+)

diff --git a/lib/freopen-safer.c b/lib/freopen-safer.c
index 714dc1d..1cb7052 100644
--- a/lib/freopen-safer.c
+++ b/lib/freopen-safer.c
@@ -44,6 +44,25 @@ protect_fd (int fd)
   return true;
 }
 
+#ifdef __KLIBC__
+/* Workaround for freopen() on OS/2 kLIBC */
+static FILE *
+klibc_freopen (const char *filename, const char *mode, FILE *stream)
+{
+  FILE *result = freopen (filename, mode, stream);
+
+  /* On OS/2 kLIBC, freopen() returns NULL even if it is successful
+     if filename is NULL. */
+  if (!result && !errno)
+    result = stream;
+
+  return result;
+}
+
+# undef freopen
+# define freopen klibc_freopen
+#endif
+
 /* Like freopen, but guarantee that reopening stdin, stdout, or stderr
    preserves the invariant that STDxxx_FILENO==fileno(stdxxx), and
    that no other stream will interfere with the standard streams.
diff --git a/lib/freopen.c b/lib/freopen.c
index 384eba6..8b3ad1e 100644
--- a/lib/freopen.c
+++ b/lib/freopen.c
@@ -29,7 +29,18 @@
 static FILE *
 orig_freopen (const char *filename, const char *mode, FILE *stream)
 {
+#ifdef __KLIBC__
+  FILE *result = freopen (filename, mode, stream);
+
+  /* On OS/2 kLIBC, freopen() returns NULL even if it is successful
+     if filename is NULL. */
+  if (!result && !errno)
+    result = stream;
+
+  return result;
+#else
   return freopen (filename, mode, stream);
+#endif
 }
 
 /* Specification.  */
-- 
1.8.5.2




reply via email to

[Prev in Thread] Current Thread [Next in Thread]