diff options
| author | Marc André Tanner <mat@brain-dump.org> | 2017-05-19 09:58:23 +0200 |
|---|---|---|
| committer | Marc André Tanner <mat@brain-dump.org> | 2017-05-19 09:58:23 +0200 |
| commit | 4a736a3eca287b208306d82c8a926999e61f99f6 (patch) | |
| tree | 5f4e97b564806cacc2c9b5a07b8f28fd91367887 | |
| parent | fbf4a58b75d997273b6e2b5ab471a986dbfd1151 (diff) | |
| download | vis-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.c | 16 |
1 files changed, 13 insertions, 3 deletions
@@ -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) { |
