neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

commit 4bd0611d7b07b56fc5a9e121669a313166ba540f
parent bfa0bc7df0ca527fcec49dbd2055f1bac438663e
Author: zeertzjq <zeertzjq@outlook.com>
Date:   Tue, 28 Feb 2023 19:23:28 +0800

vim-patch:9.0.0803: readblob() cannot read from character device

Problem:    readblob() cannot read from character device.
Solution:   Use S_ISCHR() to not check the size. (Ken Takata, closes vim/vim#11407)

https://github.com/vim/vim/commit/43625762a9751cc6e6e4d8f54fbc8b82d98fb20d

S_ISCHR is always defined in Nvim.

Co-authored-by: K.Takata <kentkt@csc.jp>

Diffstat:
Mruntime/doc/builtin.txt | 7++++++-
Msrc/nvim/eval.c | 5+++--
Msrc/nvim/testdir/test_blob.vim | 5+++++
3 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt @@ -6164,7 +6164,12 @@ readblob({fname} [, {offset} [, {size}]]) *readblob()* readblob('file.bin', 0, 100) < If {size} is -1 or omitted, the whole data starting from {offset} will be read. - When the file can't be opened an error message is given and + This can be also used to read the data from a character device + on Unix when {size} is explicitly set. Only if the device + supports seeking {offset} can be used. Otherwise it should be + zero. E.g. to read 10 bytes from a serial console: > + readblob('/dev/ttyS0', 0, 10) +< When the file can't be opened an error message is given and the result is an empty |Blob|. When trying to read bytes beyond the end of the file the result is an empty blob. diff --git a/src/nvim/eval.c b/src/nvim/eval.c @@ -5893,10 +5893,11 @@ int read_blob(FILE *const fd, typval_T *rettv, off_T offset, off_T size_arg) } // Trying to read bytes that aren't there results in an empty blob, not an // error. - if (size < 0 || size > (off_T)os_fileinfo_size(&file_info)) { + if (size < 0 || (!S_ISCHR(file_info.stat.st_mode) + && size > (off_T)os_fileinfo_size(&file_info))) { return OK; } - if (vim_fseek(fd, offset, whence) != 0) { + if (offset != 0 && vim_fseek(fd, offset, whence) != 0) { return OK; } diff --git a/src/nvim/testdir/test_blob.vim b/src/nvim/testdir/test_blob.vim @@ -459,6 +459,11 @@ func Test_blob_read_write() END call CheckLegacyAndVim9Success(lines) + if filereadable('/dev/random') + let b = readblob('/dev/random', 0, 10) + call assert_equal(10, len(b)) + endif + call assert_fails("call readblob('notexist')", 'E484:') " TODO: How do we test for the E485 error?