aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarco Hinz <mh.codebro+github@gmail.com>2018-02-28 23:37:05 +0100
committerGitHub <noreply@github.com>2018-02-28 23:37:05 +0100
commitba87a2cde7795081bc1b956de0f9f978c44788fd (patch)
tree81e5038853ae7c4041775e0db0d02bffb74e05d1
parent611351677dba450fc1a312061572c44c7e3d6482 (diff)
downloadrneovim-ba87a2cde7795081bc1b956de0f9f978c44788fd.tar.gz
rneovim-ba87a2cde7795081bc1b956de0f9f978c44788fd.tar.bz2
rneovim-ba87a2cde7795081bc1b956de0f9f978c44788fd.zip
cscope: ignore EINTR while reading the prompt (#8079)
The following code.. au VimEnter,DirChanged * if filereadable('.git/cscope.out') | \ exe 'cs add .git/cscope.out' | endif ..would lead to this issue: Error detected while processing VimEnter Auto commands for "*": cs_read_prompt EOF: Interrupted system call Error detected while processing VimEnter Auto commands for "*": E262: error reading cscope connection 0 A signal, in this case SIGCHLD, during a system call leads to errno being set to EINTR. Ignore it. This is merely a workaround for the time being. We don't block SIGCHLD signals, since they're needed by libuv. The proper fix would be to rewrite if_cscope.c to use libuv for handling processes.
-rw-r--r--src/nvim/if_cscope.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/src/nvim/if_cscope.c b/src/nvim/if_cscope.c
index 773e29693c..793142f153 100644
--- a/src/nvim/if_cscope.c
+++ b/src/nvim/if_cscope.c
@@ -1685,8 +1685,15 @@ static int cs_read_prompt(size_t i)
assert(IOSIZE >= cs_emsg_len);
size_t maxlen = IOSIZE - cs_emsg_len;
- for (;; ) {
- while ((ch = getc(csinfo[i].fr_fp)) != EOF && ch != CSCOPE_PROMPT[0]) {
+ while (1) {
+ while (1) {
+ do {
+ errno = 0;
+ ch = fgetc(csinfo[i].fr_fp);
+ } while (ch == EOF && errno == EINTR && ferror(csinfo[i].fr_fp));
+ if (ch == EOF || ch == CSCOPE_PROMPT[0]) {
+ break;
+ }
// if there is room and char is printable
if (bufpos < maxlen - 1 && vim_isprintc(ch)) {
// lazy buffer allocation
@@ -1715,9 +1722,13 @@ static int cs_read_prompt(size_t i)
}
}
- for (size_t n = 0; n < strlen(CSCOPE_PROMPT); ++n) {
- if (n > 0)
- ch = (char)getc(csinfo[i].fr_fp);
+ for (size_t n = 0; n < strlen(CSCOPE_PROMPT); n++) {
+ if (n > 0) {
+ do {
+ errno = 0;
+ ch = fgetc(csinfo[i].fr_fp);
+ } while (ch == EOF && errno == EINTR && ferror(csinfo[i].fr_fp));
+ }
if (ch == EOF) {
PERROR("cs_read_prompt EOF");
if (buf != NULL && buf[0] != NUL)