From 4a736a3eca287b208306d82c8a926999e61f99f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Fri, 19 May 2017 09:58:23 +0200 Subject: 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 --- vis.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) (limited to 'vis.c') 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) { -- cgit v1.2.3