1
0
mirror of https://git.savannah.gnu.org/git/gnulib.git synced 2025-08-17 12:41:05 +03:00

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.
This commit is contained in:
Bruno Haible
2012-01-31 12:15:46 +01:00
parent 8473e51127
commit ae2b15bacf
3 changed files with 30 additions and 19 deletions

View File

@@ -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.

View 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:

View File

@@ -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 @@ 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