#define _(str) gettext (str)
-#if defined _MSC_VER || defined __MINGW32__
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
/* Native Woe32 API. */
# include <process.h>
#else
/* Unix API. */
-# if HAVE_POSIX_SPAWN
-# include <spawn.h>
-# else
-# if HAVE_VFORK_H
-# include <vfork.h>
-# endif
-# endif
+# include <spawn.h>
#endif
bool slave_process, bool exit_on_error,
int *termsigp)
{
-#if defined _MSC_VER || defined __MINGW32__
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
/* Native Woe32 API. */
int orig_stdin;
/* Save standard file handles of parent process. */
if (null_stdin)
- orig_stdin = dup_noinherit (STDIN_FILENO);
+ orig_stdin = dup_safer_noinherit (STDIN_FILENO);
if (null_stdout)
- orig_stdout = dup_noinherit (STDOUT_FILENO);
+ orig_stdout = dup_safer_noinherit (STDOUT_FILENO);
if (null_stderr)
- orig_stderr = dup_noinherit (STDERR_FILENO);
+ orig_stderr = dup_safer_noinherit (STDERR_FILENO);
exitcode = -1;
/* Create standard file handles of child process. */
copy of the environment block - ignoring the effects of putenv() and
[un]setenv(). */
{
- exitcode = spawnvpe (P_WAIT, prog_path, prog_argv, environ);
+ exitcode = spawnvpe (P_WAIT, prog_path, (const char **) prog_argv,
+ (const char **) environ);
if (exitcode < 0 && errno == ENOEXEC)
{
/* prog is not an native executable. Try to execute it as a
shell script. Note that prepare_spawn() has already prepended
a hidden element "sh.exe" to prog_argv. */
--prog_argv;
- exitcode = spawnvpe (P_WAIT, prog_argv[0], prog_argv, environ);
+ exitcode = spawnvpe (P_WAIT, prog_argv[0], (const char **) prog_argv,
+ (const char **) environ);
}
}
if (nulloutfd >= 0)
/* Restore standard file handles of parent process. */
if (null_stderr)
- dup2 (orig_stderr, STDERR_FILENO), close (orig_stderr);
+ undup_safer_noinherit (orig_stderr, STDERR_FILENO);
if (null_stdout)
- dup2 (orig_stdout, STDOUT_FILENO), close (orig_stdout);
+ undup_safer_noinherit (orig_stdout, STDOUT_FILENO);
if (null_stdin)
- dup2 (orig_stdin, STDIN_FILENO), close (orig_stdin);
+ undup_safer_noinherit (orig_stdin, STDIN_FILENO);
if (termsigp != NULL)
*termsigp = 0;
subprocess to exit with return code 127. It is implementation
dependent which error is reported which way. We treat both cases as
equivalent. */
-#if HAVE_POSIX_SPAWN
sigset_t blocked_signals;
posix_spawn_file_actions_t actions;
bool actions_allocated;
bool attrs_allocated;
int err;
pid_t child;
-#else
- int child;
-#endif
-#if HAVE_POSIX_SPAWN
if (slave_process)
{
sigprocmask (SIG_SETMASK, NULL, &blocked_signals);
posix_spawn_file_actions_destroy (&actions);
if (attrs_allocated)
posix_spawnattr_destroy (&attrs);
-#else
- if (slave_process)
- block_fatal_signals ();
- /* Use vfork() instead of fork() for efficiency. */
- if ((child = vfork ()) == 0)
- {
- /* Child process code. */
- int nullinfd;
- int nulloutfd;
-
- if ((!null_stdin
- || ((nullinfd = open ("/dev/null", O_RDONLY, 0)) >= 0
- && (nullinfd == STDIN_FILENO
- || (dup2 (nullinfd, STDIN_FILENO) >= 0
- && close (nullinfd) >= 0))))
- && (!(null_stdout || null_stderr)
- || ((nulloutfd = open ("/dev/null", O_RDWR, 0)) >= 0
- && (!null_stdout
- || nulloutfd == STDOUT_FILENO
- || dup2 (nulloutfd, STDOUT_FILENO) >= 0)
- && (!null_stderr
- || nulloutfd == STDERR_FILENO
- || dup2 (nulloutfd, STDERR_FILENO) >= 0)
- && ((null_stdout && nulloutfd == STDOUT_FILENO)
- || (null_stderr && nulloutfd == STDERR_FILENO)
- || close (nulloutfd) >= 0)))
- && (!slave_process || (unblock_fatal_signals (), true)))
- execvp (prog_path, prog_argv);
- _exit (127);
- }
- if (child == -1)
- {
- if (slave_process)
- unblock_fatal_signals ();
- if (termsigp != NULL)
- *termsigp = 0;
- if (exit_on_error || !null_stderr)
- error (exit_on_error ? EXIT_FAILURE : 0, errno,
- _("%s subprocess failed"), progname);
- return 127;
- }
-#endif
if (slave_process)
{
register_slave_subprocess (child);