- /* Connect the pipe to STDOUT and STDERR */
- if (fd_pipe[1] != STDOUT_FILENO)
- dup2 (fd_pipe[1], STDOUT_FILENO);
- if (fd_pipe[1] != STDERR_FILENO)
- dup2 (fd_pipe[1], STDERR_FILENO);
- if ((fd_pipe[1] != STDOUT_FILENO) && (fd_pipe[1] != STDERR_FILENO))
- close (fd_pipe[1]);
+ /* If the `out' pipe has the filedescriptor STDIN we have to be careful
+ * with the `dup's below. So, if this is the case we have to handle the
+ * `out' pipe first. */
+ if (fd_pipe_out[1] == STDIN_FILENO)
+ {
+ int new_fileno = (fd_pipe_in[0] == STDOUT_FILENO)
+ ? STDERR_FILENO : STDOUT_FILENO;
+ dup2 (fd_pipe_out[1], new_fileno);
+ close (fd_pipe_out[1]);
+ fd_pipe_out[1] = new_fileno;
+ }
+ /* Now `fd_pipe_out[1]' is either `STDOUT' or `STDERR', but definitely not
+ * `STDIN_FILENO'. */
+
+ /* Connect the `in' pipe to STDIN */
+ if (fd_pipe_in[0] != STDIN_FILENO)
+ {
+ dup2 (fd_pipe_in[0], STDIN_FILENO);
+ close (fd_pipe_in[0]);
+ fd_pipe_in[0] = STDIN_FILENO;
+ }
+
+ /* Now connect the `out' pipe to STDOUT and STDERR */
+ if (fd_pipe_out[1] != STDOUT_FILENO)
+ dup2 (fd_pipe_out[1], STDOUT_FILENO);
+ if (fd_pipe_out[1] != STDERR_FILENO)
+ dup2 (fd_pipe_out[1], STDERR_FILENO);
+
+ /* If the pipe has some FD that's something completely different, close it
+ * now. */
+ if ((fd_pipe_out[1] != STDOUT_FILENO) && (fd_pipe_out[1] != STDERR_FILENO))
+ {
+ close (fd_pipe_out[1]);
+ fd_pipe_out[1] = STDOUT_FILENO;
+ }