diff options
author | Bruno Haible <bruno@clisp.org> | 2020-12-25 02:16:22 +0100 |
---|---|---|
committer | Bruno Haible <bruno@clisp.org> | 2020-12-25 02:18:55 +0100 |
commit | 1504c11f8a5cca19eae97afb71644a4123c343ab (patch) | |
tree | 9b233eca3dc5d0711c7ca81d9830aca67edc9a0d | |
parent | 8fede4db2de4fd41ddf7e57b2d2c0e23f5deef67 (diff) | |
download | gnulib-1504c11f8a5cca19eae97afb71644a4123c343ab.tar.gz |
spawn-pipe: Use posix_spawn by default on native Windows.
* lib/spawn-pipe.c (SPAWN_PIPE_IMPL_AVOID_POSIX_SPAWN): New macro.
(create_pipe): Use it to decide among the two possible implementations.
* modules/spawn-pipe (Depends-on): Add posix_spawnattr_setpgroup.
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | lib/spawn-pipe.c | 31 | ||||
-rw-r--r-- | modules/spawn-pipe | 1 |
3 files changed, 34 insertions, 5 deletions
@@ -1,5 +1,12 @@ 2020-12-24 Bruno Haible <bruno@clisp.org> + spawn-pipe: Use posix_spawn by default on native Windows. + * lib/spawn-pipe.c (SPAWN_PIPE_IMPL_AVOID_POSIX_SPAWN): New macro. + (create_pipe): Use it to decide among the two possible implementations. + * modules/spawn-pipe (Depends-on): Add posix_spawnattr_setpgroup. + +2020-12-24 Bruno Haible <bruno@clisp.org> + unistd-safer: Implement pipe_safer on native Windows. * lib/pipe-safer.c (pipe_safer): Don't test HAVE_PIPE. * modules/unistd-safer (Depends-on): Add pipe-posix. diff --git a/lib/spawn-pipe.c b/lib/spawn-pipe.c index aedbcb2ae5..768c8b67a8 100644 --- a/lib/spawn-pipe.c +++ b/lib/spawn-pipe.c @@ -44,7 +44,20 @@ #define _(str) gettext (str) -#if defined _WIN32 && ! defined __CYGWIN__ + +/* Choice of implementation for native Windows. + - Define to 0 to use the posix_spawn facility (modules 'posix_spawn' and + 'posix_spawnp'), that is based on the module 'windows-spawn'. + - Define to 1 to use the older code, that uses the module 'windows-spawn' + directly. + You can set this macro from a Makefile or at configure time, from the + CPPFLAGS. */ +#ifndef SPAWN_PIPE_IMPL_AVOID_POSIX_SPAWN +# define SPAWN_PIPE_IMPL_AVOID_POSIX_SPAWN 0 +#endif + + +#if (defined _WIN32 && !defined __CYGWIN__) && SPAWN_PIPE_IMPL_AVOID_POSIX_SPAWN /* Native Windows API. */ # if GNULIB_MSVC_NOTHROW @@ -89,7 +102,7 @@ nonintr_close (int fd) #undef close /* avoid warning related to gnulib module unistd */ #define close nonintr_close -#if defined _WIN32 && ! defined __CYGWIN__ +#if (defined _WIN32 && !defined __CYGWIN__) && SPAWN_PIPE_IMPL_AVOID_POSIX_SPAWN static int nonintr_open (const char *pathname, int oflag, mode_t mode) { @@ -181,7 +194,7 @@ create_pipe (const char *progname, } } -#if (defined _WIN32 && ! defined __CYGWIN__) || defined __KLIBC__ +#if ((defined _WIN32 && !defined __CYGWIN__) && SPAWN_PIPE_IMPL_AVOID_POSIX_SPAWN) || defined __KLIBC__ /* Native Windows API. This uses _pipe(), dup2(), and _spawnv(). It could also be implemented @@ -217,7 +230,7 @@ create_pipe (const char *progname, child = -1; -# if defined _WIN32 && ! defined __CYGWIN__ +# if (defined _WIN32 && !defined __CYGWIN__) && SPAWN_PIPE_IMPL_AVOID_POSIX_SPAWN bool must_close_ifd1 = pipe_stdout; bool must_close_ofd0 = pipe_stdin; @@ -512,12 +525,20 @@ create_pipe (const char *progname, || (slave_process && ((err = posix_spawnattr_init (&attrs)) != 0 || (attrs_allocated = true, +# if defined _WIN32 && !defined __CYGWIN__ + (err = posix_spawnattr_setpgroup (&attrs, 0)) != 0 + || (err = posix_spawnattr_setflags (&attrs, + POSIX_SPAWN_SETPGROUP)) + != 0 +# else (err = posix_spawnattr_setsigmask (&attrs, &blocked_signals)) != 0 || (err = posix_spawnattr_setflags (&attrs, POSIX_SPAWN_SETSIGMASK)) - != 0))) + != 0 +# endif + ) ) ) || (err = (directory != NULL ? posix_spawn (&child, prog_path, &actions, attrs_allocated ? &attrs : NULL, diff --git a/modules/spawn-pipe b/modules/spawn-pipe index 7ad384b524..f0e8dafc17 100644 --- a/modules/spawn-pipe +++ b/modules/spawn-pipe @@ -31,6 +31,7 @@ posix_spawn_file_actions_addopen posix_spawn_file_actions_addchdir posix_spawn_file_actions_destroy posix_spawnattr_init +posix_spawnattr_setpgroup posix_spawnattr_setsigmask posix_spawnattr_setflags posix_spawnattr_destroy |