diff options
author | ZyX <kp-pav@yandex.ru> | 2017-03-19 16:09:48 +0300 |
---|---|---|
committer | ZyX <kp-pav@yandex.ru> | 2017-03-19 16:09:48 +0300 |
commit | fdfa1ed578afd41a68f05c88dc419d88051b7240 (patch) | |
tree | 6eac36009c75cb33b211a48d7cc043c0df1a3b86 /src | |
parent | d2268d5ebbbd472c9c4f303404dc5640208d3b3b (diff) | |
download | rneovim-fdfa1ed578afd41a68f05c88dc419d88051b7240.tar.gz rneovim-fdfa1ed578afd41a68f05c88dc419d88051b7240.tar.bz2 rneovim-fdfa1ed578afd41a68f05c88dc419d88051b7240.zip |
main: Temporary fix assertion error
This variant uses `fdopen()` which is not standard, but it fixes problem on my
system. In next commit `scriptin` will use `FileDescriptor*` from os/fileio in
place of `FILE*`.
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/main.c | 4 | ||||
-rw-r--r-- | src/nvim/os/fs.c | 23 |
2 files changed, 26 insertions, 1 deletions
diff --git a/src/nvim/main.c b/src/nvim/main.c index 99dd9fc18f..ce0426bd8e 100644 --- a/src/nvim/main.c +++ b/src/nvim/main.c @@ -1057,7 +1057,9 @@ scripterror: mch_exit(2); } if (STRCMP(argv[0], "-") == 0) { - scriptin[0] = stdin; + const int stdin_dup_fd = os_dup(STDIN_FILENO); + FILE *const stdin_dup = fdopen(stdin_dup_fd, "r"); + scriptin[0] = stdin_dup; } else if ((scriptin[0] = mch_fopen(argv[0], READBIN)) == NULL) { mch_errmsg(_("Cannot open for reading: \"")); mch_errmsg(argv[0]); diff --git a/src/nvim/os/fs.c b/src/nvim/os/fs.c index 2beeae7ec6..9ce50d4afd 100644 --- a/src/nvim/os/fs.c +++ b/src/nvim/os/fs.c @@ -430,6 +430,29 @@ int os_close(const int fd) return r; } +/// Duplicate file descriptor +/// +/// @param[in] fd File descriptor to duplicate. +/// +/// @return New file descriptor or libuv error code (< 0). +int os_dup(const int fd) + FUNC_ATTR_WARN_UNUSED_RESULT +{ + int ret; +os_dup_dup: + ret = dup(fd); + if (ret < 0) { + const int error = os_translate_sys_error(errno); + errno = 0; + if (error == UV_EINTR) { + goto os_dup_dup; + } else { + return error; + } + } + return ret; +} + /// Read from a file /// /// Handles EINTR and ENOMEM, but not other errors. |