@@ -5045,6 +5045,7 @@ mch_start_job(char **argv, job_T *job, jobopt_T *options)
50455045 int fd_err [2 ]; /* for stderr */
50465046# ifdef FEAT_CHANNEL
50475047 channel_T * channel = NULL ;
5048+ int use_out_for_err = options -> jo_io [PART_ERR ] == JIO_OUT ;
50485049#endif
50495050
50505051 /* default is to fail */
@@ -5056,7 +5057,8 @@ mch_start_job(char **argv, job_T *job, jobopt_T *options)
50565057 /* TODO: without the channel feature connect the child to /dev/null? */
50575058# ifdef FEAT_CHANNEL
50585059 /* Open pipes for stdin, stdout, stderr. */
5059- if ((pipe (fd_in ) < 0 ) || (pipe (fd_out ) < 0 ) || (pipe (fd_err ) < 0 ))
5060+ if (pipe (fd_in ) < 0 || pipe (fd_out ) < 0
5061+ || (!use_out_for_err && pipe (fd_err ) < 0 ))
50605062 goto failed ;
50615063
50625064 channel = add_channel ();
@@ -5093,17 +5095,26 @@ mch_start_job(char **argv, job_T *job, jobopt_T *options)
50935095 ignored = dup (fd_in [0 ]);
50945096 close (fd_in [0 ]);
50955097
5098+ /* set up stderr for the child */
5099+ if (use_out_for_err )
5100+ {
5101+ close (2 );
5102+ ignored = dup (fd_out [1 ]);
5103+ }
5104+ else
5105+ {
5106+ close (fd_err [0 ]);
5107+ close (2 );
5108+ ignored = dup (fd_err [1 ]);
5109+ close (fd_err [1 ]);
5110+ }
5111+
50965112 /* set up stdout for the child */
50975113 close (fd_out [0 ]);
50985114 close (1 );
50995115 ignored = dup (fd_out [1 ]);
51005116 close (fd_out [1 ]);
51015117
5102- /* set up stderr for the child */
5103- close (fd_err [0 ]);
5104- close (2 );
5105- ignored = dup (fd_err [1 ]);
5106- close (fd_err [1 ]);
51075118# endif
51085119
51095120 /* See above for type of argv. */
@@ -5123,9 +5134,13 @@ mch_start_job(char **argv, job_T *job, jobopt_T *options)
51235134 /* child stdin, stdout and stderr */
51245135 close (fd_in [0 ]);
51255136 close (fd_out [1 ]);
5126- close (fd_err [1 ]);
51275137# ifdef FEAT_CHANNEL
5128- channel_set_pipes (channel , fd_in [1 ], fd_out [0 ], fd_err [0 ]);
5138+ if (!use_out_for_err )
5139+ # endif
5140+ close (fd_err [1 ]);
5141+ # ifdef FEAT_CHANNEL
5142+ channel_set_pipes (channel , fd_in [1 ], fd_out [0 ],
5143+ use_out_for_err ? INVALID_FD : fd_err [0 ]);
51295144 channel_set_job (channel , job );
51305145 channel_set_options (channel , options );
51315146# ifdef FEAT_GUI
0 commit comments