diff options
author | Justin M. Keyes <justinkz@gmail.com> | 2017-11-26 21:17:35 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-11-26 21:17:35 +0100 |
commit | a043899ba255524b7421579b9bd6112801f09247 (patch) | |
tree | e4dc3cc54e327310ab661de5125ce37313670aa1 /src/nvim/fileio.c | |
parent | 207b7ca4bc16d52641eaa5244eef25a0dba91dbc (diff) | |
parent | bab2f8200aea09ad32bbcb2e83404bbd4076a227 (diff) | |
download | rneovim-a043899ba255524b7421579b9bd6112801f09247.tar.gz rneovim-a043899ba255524b7421579b9bd6112801f09247.tar.bz2 rneovim-a043899ba255524b7421579b9bd6112801f09247.zip |
Merge #7633 'Retry fgets on EINTR'
closes #7632
Diffstat (limited to 'src/nvim/fileio.c')
-rw-r--r-- | src/nvim/fileio.c | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/src/nvim/fileio.c b/src/nvim/fileio.c index ae6c3f96e3..1f4cd22754 100644 --- a/src/nvim/fileio.c +++ b/src/nvim/fileio.c @@ -4443,22 +4443,32 @@ char *modname(const char *fname, const char *ext, bool prepend_dot) /// @return true for end-of-file. bool vim_fgets(char_u *buf, int size, FILE *fp) FUNC_ATTR_NONNULL_ALL { - char *eof; -#define FGETS_SIZE 200 - char tbuf[FGETS_SIZE]; + char *retval; + assert(size > 0); buf[size - 2] = NUL; - eof = fgets((char *)buf, size, fp); + + do { + errno = 0; + retval = fgets((char *)buf, size, fp); + } while (retval == NULL && errno == EINTR); + if (buf[size - 2] != NUL && buf[size - 2] != '\n') { - buf[size - 1] = NUL; /* Truncate the line */ + char tbuf[200]; - /* Now throw away the rest of the line: */ + buf[size - 1] = NUL; // Truncate the line. + + // Now throw away the rest of the line: do { - tbuf[FGETS_SIZE - 2] = NUL; - ignoredp = fgets((char *)tbuf, FGETS_SIZE, fp); - } while (tbuf[FGETS_SIZE - 2] != NUL && tbuf[FGETS_SIZE - 2] != '\n'); + tbuf[sizeof(tbuf) - 2] = NUL; + errno = 0; + retval = fgets((char *)tbuf, sizeof(tbuf), fp); + if (retval == NULL && errno != EINTR) { + break; + } + } while (tbuf[sizeof(tbuf) - 2] != NUL && tbuf[sizeof(tbuf) - 2] != '\n'); } - return eof == NULL; + return retval ? false : feof(fp); } /// Read 2 bytes from "fd" and turn them into an int, MSB first. |