patch 7.4.1506
Problem: Job cannot read from a file.
Solution: Implement reading from a file for Unix.
diff --git a/src/os_unix.c b/src/os_unix.c
index ed2b129..565dbd0 100644
--- a/src/os_unix.c
+++ b/src/os_unix.c
@@ -5045,6 +5045,7 @@
int fd_out[2]; /* for stdout */
int fd_err[2]; /* for stderr */
channel_T *channel = NULL;
+ int use_file_for_in = options->jo_io[PART_IN] == JIO_FILE;
int use_out_for_err = options->jo_io[PART_ERR] == JIO_OUT;
/* default is to fail */
@@ -5055,8 +5056,22 @@
/* TODO: without the channel feature connect the child to /dev/null? */
/* Open pipes for stdin, stdout, stderr. */
- if (pipe(fd_in) < 0 || pipe(fd_out) < 0
- || (!use_out_for_err && pipe(fd_err) < 0))
+ if (use_file_for_in)
+ {
+ char_u *fname = options->jo_io_name[PART_IN];
+
+ fd_in[0] = mch_open((char *)fname, O_RDONLY, 0);
+ if (fd_in[0] < 0)
+ {
+ EMSG2(_(e_notopen), fname);
+ goto failed;
+ }
+ }
+ else if (pipe(fd_in) < 0)
+ goto failed;
+ if (pipe(fd_out) < 0)
+ goto failed;
+ if (!use_out_for_err && pipe(fd_err) < 0)
goto failed;
channel = add_channel();
@@ -5088,7 +5103,8 @@
/* TODO: re-enable this when pipes connect without a channel */
# ifdef FEAT_CHANNEL
/* set up stdin for the child */
- close(fd_in[1]);
+ if (!use_file_for_in)
+ close(fd_in[1]);
close(0);
ignored = dup(fd_in[0]);
close(fd_in[0]);
@@ -5130,12 +5146,15 @@
# ifdef FEAT_CHANNEL
/* child stdin, stdout and stderr */
- close(fd_in[0]);
+ if (!use_file_for_in)
+ close(fd_in[0]);
close(fd_out[1]);
if (!use_out_for_err)
close(fd_err[1]);
- channel_set_pipes(channel, fd_in[1], fd_out[0],
- use_out_for_err ? INVALID_FD : fd_err[0]);
+ channel_set_pipes(channel,
+ use_file_for_in ? INVALID_FD : fd_in[1],
+ fd_out[0],
+ use_out_for_err ? INVALID_FD : fd_err[0]);
channel_set_job(channel, job, options);
# ifdef FEAT_GUI
channel_gui_register(channel);
@@ -5151,7 +5170,8 @@
if (fd_in[0] >= 0)
{
close(fd_in[0]);
- close(fd_in[1]);
+ if (!use_file_for_in)
+ close(fd_in[1]);
}
if (fd_out[0] >= 0)
{