]> Savannah Git Hosting - gnulib.git/commitdiff
popen: Make more robust on Windows.
authorBruno Haible <bruno@clisp.org>
Tue, 31 Jan 2012 11:15:46 +0000 (12:15 +0100)
committerBruno Haible <bruno@clisp.org>
Tue, 31 Jan 2012 11:15:46 +0000 (12:15 +0100)
* lib/popen.c: On native Windows, use the _popen based code even if
HAVE_POPEN is set.
* doc/posix-functions/popen.texi: Mention necessity of COMSPEC
environment variable on native Windows.

ChangeLog
doc/posix-functions/popen.texi
lib/popen.c

index 3771ec128d97e1c3a6f9c6f0fe4cadc3b2042772..2a0b728b0b96d8b523ad8527dca9d8c5903432a9 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2012-01-31  Bruno Haible  <bruno@clisp.org>
+
+       popen: Make more robust on Windows.
+       * lib/popen.c: On native Windows, use the _popen based code even if
+       HAVE_POPEN is set.
+       * doc/posix-functions/popen.texi: Mention necessity of COMSPEC
+       environment variable on native Windows.
+
 2012-01-30  Bruno Haible  <bruno@clisp.org>
 
        pclose: Fix typo.
index e9fac3be8e081cf65de220c47ba13709b2dd82d6..51822141e2398e6e33d563e6f4726e53503c7999 100644 (file)
@@ -20,6 +20,9 @@ Cygwin 1.5.x.
 Portability problems not fixed by Gnulib:
 @itemize
 @item
+On native Windows platforms, this functions terminates the current process
+with exit code 127 if the environment variable @code{COMSPEC} is not set.
+@item
 Some platforms mistakenly set the close-on-exec bit, then if it is
 cleared by the application, the platform then leaks file descriptors
 from earlier @code{popen} calls into subsequent @code{popen} children:
index 7b82bcede2031d2415455d29f8c398538e88ca2b..1460e9edbb818a9bdea37a42fb242d1b8b44f706 100644 (file)
 /* Specification.  */
 #include <stdio.h>
 
-#if HAVE_POPEN
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+/* Native Windows API.  */
+
+# include <string.h>
+
+FILE *
+popen (const char *filename, const char *mode)
+{
+  /* Use binary mode by default.  */
+  if (strcmp (mode, "r") == 0)
+    mode = "rb";
+  else if (strcmp (mode, "w") == 0)
+    mode = "wb";
+
+  return _popen (filename, mode);
+}
+
+#else
 
 # include <errno.h>
 # include <fcntl.h>
@@ -33,7 +50,7 @@
 FILE *
 rpl_popen (const char *filename, const char *mode)
 {
-  /* The mingw popen works fine, and all other platforms have fcntl.
+  /* All other platforms have popen and fcntl.
      The bug of the child clobbering its own file descriptors if stdin
      or stdout was closed in the parent can be worked around by
      opening those two fds as close-on-exec to begin with.  */
@@ -83,21 +100,4 @@ rpl_popen (const char *filename, const char *mode)
   return result;
 }
 
-#else
-/* Native Windows API.  */
-
-# include <string.h>
-
-FILE *
-popen (const char *filename, const char *mode)
-{
-  /* Use binary mode by default.  */
-  if (strcmp (mode, "r") == 0)
-    mode = "rb";
-  else if (strcmp (mode, "w") == 0)
-    mode = "wb";
-
-  return _popen (filename, mode);
-}
-
 #endif