aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2017-05-19 09:58:23 +0200
committerMarc André Tanner <mat@brain-dump.org>2017-05-19 09:58:23 +0200
commit4a736a3eca287b208306d82c8a926999e61f99f6 (patch)
tree5f4e97b564806cacc2c9b5a07b8f28fd91367887
parentfbf4a58b75d997273b6e2b5ab471a986dbfd1151 (diff)
downloadvis-4a736a3eca287b208306d82c8a926999e61f99f6.tar.gz
vis-4a736a3eca287b208306d82c8a926999e61f99f6.tar.xz
vis: improve `:<` command implementation
When we have nothing to write to an external process, redirect stdin to /dev/null instead of using a pipe which is immediately closed. Some commands change their behavior when used in a shell pipeline. As an example the following did not work as expected: :< ag pattern Fix #556
-rw-r--r--vis.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/vis.c b/vis.c
index e4a706c..376c0e4 100644
--- a/vis.c
+++ b/vis.c
@@ -1724,14 +1724,24 @@ int vis_pipe(Vis *vis, File *file, Filerange *range, const char *argv[],
exit(EXIT_FAILURE);
}
- int null = open("/dev/null", O_WRONLY);
+ int null = open("/dev/null", O_RDWR);
if (null == -1) {
fprintf(stderr, "failed to open /dev/null");
exit(EXIT_FAILURE);
}
- if (!interactive)
- dup2(pin[0], STDIN_FILENO);
+ if (!interactive) {
+ /* If we have nothing to write, let stdin point to
+ * /dev/null instead of a pipe which is immediately
+ * closed. Some programs behave differently when used
+ * in a pipeline.
+ */
+ if (text_range_size(range) == 0)
+ dup2(null, STDIN_FILENO);
+ else
+ dup2(pin[0], STDIN_FILENO);
+ }
+
close(pin[0]);
close(pin[1]);
if (interactive) {