+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.
#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
#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)
{
}
}
-#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
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;
|| (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,