X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fpipe.c;h=d17c9bf6c6c9b561dec1e6492890e6ed06d39ef1;hb=ce8d6d06c84df409ebb0d71478a122f48cff3dc6;hp=f8e7dee104e9897be8bdfd2976cb3d321376d52b;hpb=a64a69d30a583fef8c245cd5988b35934e70bcec;p=gnulib.git diff --git a/lib/pipe.c b/lib/pipe.c index f8e7dee10..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 @@ -112,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 @@ -133,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: * @@ -151,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. */ @@ -183,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 @@ -216,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]); @@ -258,12 +258,10 @@ create_pipe (const char *progname, pid_t child; 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: *