X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fpipe.c;h=d17c9bf6c6c9b561dec1e6492890e6ed06d39ef1;hb=ba4000b09804294e46373afb2003744612096a20;hp=d842c77f9c31bc71d6b4fbdfc1cb5abd93aa9121;hpb=ae5dae6fd1caa993e969b869e42820a119385cbc;p=gnulib.git diff --git a/lib/pipe.c b/lib/pipe.c index d842c77f9..d17c9bf6c 100644 --- a/lib/pipe.c +++ b/lib/pipe.c @@ -35,7 +35,7 @@ #define _(str) gettext (str) -#if defined _MSC_VER || defined __MINGW32__ +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ /* Native Woe32 API. */ # include @@ -44,13 +44,7 @@ #else /* Unix API. */ -# if HAVE_POSIX_SPAWN -# include -# else -# if HAVE_VFORK_H -# include -# endif -# endif +# include #endif @@ -118,7 +112,7 @@ create_pipe (const char *progname, bool slave_process, bool exit_on_error, int fd[2]) { -#if defined _MSC_VER || defined __MINGW32__ +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ /* Native Woe32 API. This uses _pipe(), dup2(), and spawnv(). It could also be implemented @@ -139,12 +133,14 @@ create_pipe (const char *progname, prog_argv = prepare_spawn (prog_argv); if (pipe_stdout) - if (_pipe (ifd, 4096, O_BINARY | O_NOINHERIT) < 0 - || (ifd[0] = fd_safer (ifd[0])) < 0) + if (pipe2 (ifd, O_BINARY | O_NOINHERIT) < 0 + || (ifd[0] = fd_safer_noinherit (ifd[0])) < 0 + || (ifd[1] = fd_safer_noinherit (ifd[1])) < 0) error (EXIT_FAILURE, errno, _("cannot create pipe")); if (pipe_stdin) - if (_pipe (ofd, 4096, O_BINARY | O_NOINHERIT) < 0 - || (ofd[1] = fd_safer (ofd[1])) < 0) + if (pipe2 (ofd, O_BINARY | O_NOINHERIT) < 0 + || (ofd[0] = fd_safer_noinherit (ofd[0])) < 0 + || (ofd[1] = fd_safer_noinherit (ofd[1])) < 0) error (EXIT_FAILURE, errno, _("cannot create pipe")); /* Data flow diagram: * @@ -157,11 +153,11 @@ create_pipe (const char *progname, /* Save standard file handles of parent process. */ if (pipe_stdin || prog_stdin != NULL) - orig_stdin = dup_noinherit (STDIN_FILENO); + orig_stdin = dup_safer_noinherit (STDIN_FILENO); if (pipe_stdout || prog_stdout != NULL) - 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); child = -1; /* Create standard file handles of child process. */ @@ -189,9 +185,7 @@ create_pipe (const char *progname, && close (stdoutfd) >= 0))))) /* The child process doesn't inherit ifd[0], ifd[1], ofd[0], ofd[1], but it inherits all open()ed or dup2()ed file handles (which is what - we want in the case of STD*_FILENO) and also orig_stdin, - orig_stdout, orig_stderr (which is not explicitly wanted but - harmless). */ + we want in the case of STD*_FILENO). */ /* Use spawnvpe and pass the environment explicitly. This is needed if the program has modified the environment using putenv() or [un]setenv(). On Windows, programs have two environments, one in the "environment @@ -201,14 +195,16 @@ create_pipe (const char *progname, copy of the environment block - ignoring the effects of putenv() and [un]setenv(). */ { - child = spawnvpe (P_NOWAIT, prog_path, prog_argv, environ); + child = spawnvpe (P_NOWAIT, prog_path, (const char **) prog_argv, + (const char **) environ); if (child < 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; - child = spawnvpe (P_NOWAIT, prog_argv[0], prog_argv, environ); + child = spawnvpe (P_NOWAIT, prog_argv[0], (const char **) prog_argv, + (const char **) environ); } } if (stdinfd >= 0) @@ -220,11 +216,11 @@ create_pipe (const char *progname, /* 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 (pipe_stdout || prog_stdout != NULL) - dup2 (orig_stdout, STDOUT_FILENO), close (orig_stdout); + undup_safer_noinherit (orig_stdout, STDOUT_FILENO); if (pipe_stdin || prog_stdin != NULL) - dup2 (orig_stdin, STDIN_FILENO), close (orig_stdin); + undup_safer_noinherit (orig_stdin, STDIN_FILENO); if (pipe_stdin) close (ofd[0]); @@ -253,7 +249,6 @@ create_pipe (const char *progname, /* Unix API. */ int ifd[2]; int ofd[2]; -# if HAVE_POSIX_SPAWN sigset_t blocked_signals; posix_spawn_file_actions_t actions; bool actions_allocated; @@ -261,17 +256,12 @@ create_pipe (const char *progname, bool attrs_allocated; int err; pid_t child; -# else - int child; -# endif if (pipe_stdout) - if (pipe (ifd) < 0 - || (ifd[0] = fd_safer (ifd[0])) < 0) + if (pipe_safer (ifd) < 0) error (EXIT_FAILURE, errno, _("cannot create pipe")); if (pipe_stdin) - if (pipe (ofd) < 0 - || (ofd[1] = fd_safer (ofd[1])) < 0) + if (pipe_safer (ofd) < 0) error (EXIT_FAILURE, errno, _("cannot create pipe")); /* Data flow diagram: * @@ -282,7 +272,6 @@ create_pipe (const char *progname, * */ -# if HAVE_POSIX_SPAWN if (slave_process) { sigprocmask (SIG_SETMASK, NULL, &blocked_signals); @@ -370,64 +359,6 @@ create_pipe (const char *progname, 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 nulloutfd; - int stdinfd; - int stdoutfd; - - if ((!pipe_stdin || dup2 (ofd[0], STDIN_FILENO) >= 0) - && (!pipe_stdout || dup2 (ifd[1], STDOUT_FILENO) >= 0) - && (!pipe_stdin || close (ofd[0]) >= 0) - && (!pipe_stdout || close (ifd[1]) >= 0) - && (!pipe_stdin || close (ofd[1]) >= 0) - && (!pipe_stdout || close (ifd[0]) >= 0) - && (!null_stderr - || ((nulloutfd = open ("/dev/null", O_RDWR, 0)) >= 0 - && (nulloutfd == STDERR_FILENO - || (dup2 (nulloutfd, STDERR_FILENO) >= 0 - && close (nulloutfd) >= 0)))) - && (pipe_stdin - || prog_stdin == NULL - || ((stdinfd = open (prog_stdin, O_RDONLY, 0)) >= 0 - && (stdinfd == STDIN_FILENO - || (dup2 (stdinfd, STDIN_FILENO) >= 0 - && close (stdinfd) >= 0)))) - && (pipe_stdout - || prog_stdout == NULL - || ((stdoutfd = open (prog_stdout, O_WRONLY, 0)) >= 0 - && (stdoutfd == STDOUT_FILENO - || (dup2 (stdoutfd, STDOUT_FILENO) >= 0 - && close (stdoutfd) >= 0)))) - && (!slave_process || (unblock_fatal_signals (), true))) - execvp (prog_path, prog_argv); - _exit (127); - } - if (child == -1) - { - if (slave_process) - unblock_fatal_signals (); - if (exit_on_error || !null_stderr) - error (exit_on_error ? EXIT_FAILURE : 0, errno, - _("%s subprocess failed"), progname); - if (pipe_stdout) - { - close (ifd[0]); - close (ifd[1]); - } - if (pipe_stdin) - { - close (ofd[0]); - close (ofd[1]); - } - return -1; - } -# endif if (slave_process) { register_slave_subprocess (child);