From: Bruno Haible Date: Tue, 31 Jan 2012 11:15:46 +0000 (+0100) Subject: popen: Make more robust on Windows. X-Git-Tag: v0.1~1187 X-Git-Url: http://erislabs.org.uk/gitweb/?a=commitdiff_plain;h=ae2b15bacfbcc6cc3eaaedead0ae73b0eb8ba19c;p=gnulib.git 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. --- diff --git a/ChangeLog b/ChangeLog index 3771ec128..2a0b728b0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2012-01-31 Bruno Haible + + 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 pclose: Fix typo. diff --git a/doc/posix-functions/popen.texi b/doc/posix-functions/popen.texi index e9fac3be8..51822141e 100644 --- a/doc/posix-functions/popen.texi +++ b/doc/posix-functions/popen.texi @@ -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: diff --git a/lib/popen.c b/lib/popen.c index 7b82bcede..1460e9edb 100644 --- a/lib/popen.c +++ b/lib/popen.c @@ -21,7 +21,24 @@ /* Specification. */ #include -#if HAVE_POPEN +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ +/* Native Windows API. */ + +# include + +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 # include @@ -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 - -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