diff options
author | Justin M. Keyes <justinkz@gmail.com> | 2016-10-18 14:39:08 +0200 |
---|---|---|
committer | Justin M. Keyes <justinkz@gmail.com> | 2016-10-19 01:39:05 +0200 |
commit | 9706664b8827614817a43f3a4ac4b6ae8463a906 (patch) | |
tree | 9c0288adb64b6779b6e19dfc873f1ba0fe65b16f /src/nvim/event | |
parent | 16da3a6fe01de74eaebfd4750dabe27b3b7ab068 (diff) | |
download | rneovim-9706664b8827614817a43f3a4ac4b6ae8463a906.tar.gz rneovim-9706664b8827614817a43f3a4ac4b6ae8463a906.tar.bz2 rneovim-9706664b8827614817a43f3a4ac4b6ae8463a906.zip |
system('foo &', 'bar'): Show error, don't crash.
Closes #3529
Closes #5241
In Vim,
:echo system('cat - &', 'foo')
works because for both system() and :! Vim writes input to a temp file and uses
shell syntax to redirect the file to the backgrounded `cat` (get_cmd_output()
.. make_filter_cmd()).
In Nvim,
:echo system('cat - &', 'foo')
fails because we write the input directly via pipes (shell.c:do_os_system()),
but (per POSIX[1]) backgrounded process input stream is redirected from
/dev/null (unless overridden by shell redirection; supported only by some shells
[2]), so our writes are ignored, the process exits quickly, and if we are
writing data larger than the buffer size we'll see EPIPE.
This still works:
:%w !tee > foo1358.txt &
but this does not:
:%w !tee foo1358.txt &
though it *should* (why doesn't it?) because we still do the temp file dance
in do_bang() .. do_filter().
[1] http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_03_02
[2] http://unix.stackexchange.com/a/71218
Diffstat (limited to 'src/nvim/event')
-rw-r--r-- | src/nvim/event/rstream.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/src/nvim/event/rstream.c b/src/nvim/event/rstream.c index 5126dfd84e..92efc9fa2e 100644 --- a/src/nvim/event/rstream.c +++ b/src/nvim/event/rstream.c @@ -112,8 +112,8 @@ static void read_cb(uv_stream_t *uvstream, ssize_t cnt, const uv_buf_t *buf) // to `alloc_cb` will return the same unused pointer(`rbuffer_produced` // won't be called) && cnt != 0) { - DLOG("Closing Stream(%p) because of %s(%zd)", stream, - uv_strerror((int)cnt), cnt); + DLOG("Closing Stream (%p): %s (%s)", stream, + uv_err_name((int)cnt), os_strerror((int)cnt)); // Read error or EOF, either way stop the stream and invoke the callback // with eof == true uv_read_stop(uvstream); |