bug-gnulib
[Top][All Lists]
Advanced

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

popen on native Windows


From: Bruno Haible
Subject: popen on native Windows
Date: Tue, 31 Jan 2012 12:20:12 +0100
User-agent: KMail/4.7.4 (Linux/3.1.0-1.2-desktop; KDE/4.7.4; x86_64; ; )

On native Windows, the popen() or _popen() function terminates the current
process with exit code 127 if getenv("COMSPEC") returns NULL.

In one of my mingw environments, this triggered a failure of the
autoconf test in m4/popen.m4, so that HAVE_POPEN and REPLACE_POPEN were
set to 1, leading to this compilation failure:

popen.c: In function ‘rpl_popen’:
popen.c:64:35: error: ‘F_SETFD’ undeclared (first use in this function)
popen.c:64:35: note: each undeclared identifier is reported only once for each 
function it appears in
make[4]: *** [popen.o] Error 1

This fixes it.


2012-01-31  Bruno Haible  <address@hidden>

        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.

--- doc/posix-functions/popen.texi.orig Tue Jan 31 12:10:42 2012
+++ doc/posix-functions/popen.texi      Tue Jan 31 12:02:16 2012
@@ -20,6 +20,9 @@
 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.
address@hidden
 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:
--- lib/popen.c.orig    Tue Jan 31 12:10:42 2012
+++ lib/popen.c Tue Jan 31 12:09:24 2012
@@ -21,7 +21,24 @@
 /* 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 @@
   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




reply via email to

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