summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruno Haible <bruno@clisp.org>2020-12-25 02:16:22 +0100
committerBruno Haible <bruno@clisp.org>2020-12-25 02:18:55 +0100
commit1504c11f8a5cca19eae97afb71644a4123c343ab (patch)
tree9b233eca3dc5d0711c7ca81d9830aca67edc9a0d
parent8fede4db2de4fd41ddf7e57b2d2c0e23f5deef67 (diff)
downloadgnulib-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--ChangeLog7
-rw-r--r--lib/spawn-pipe.c31
-rw-r--r--modules/spawn-pipe1
3 files changed, 34 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 3d8478aebd..8f27b286ef 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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