aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorZyX <kp-pav@yandex.ru>2017-03-19 16:09:48 +0300
committerZyX <kp-pav@yandex.ru>2017-03-19 16:09:48 +0300
commitfdfa1ed578afd41a68f05c88dc419d88051b7240 (patch)
tree6eac36009c75cb33b211a48d7cc043c0df1a3b86 /src
parentd2268d5ebbbd472c9c4f303404dc5640208d3b3b (diff)
downloadrneovim-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.c4
-rw-r--r--src/nvim/os/fs.c23
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.