From 7a1a4e293e7b3497346eee99294fe24658cbf145 Mon Sep 17 00:00:00 2001 From: lvgx Date: Fri, 19 Jun 2020 03:40:37 +0200 Subject: [PATCH] Avoid SIGWINCH interruptions of NNN_PIPE IO (#659) Fixes #656 --- src/nnn.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/nnn.c b/src/nnn.c index 5c893462..5bd7d6a6 100644 --- a/src/nnn.c +++ b/src/nnn.c @@ -4300,11 +4300,20 @@ static void rmlistpath() } } +static ssize_t read_nointr(int fd, void *buf, size_t count) +{ + ssize_t len; + do{ + len = read(fd, buf, count); + } while (len == -1 && errno == EINTR); + return len; +} + static void readpipe(int fd, char **path, char **lastname, char **lastdir) { int r; char ctx, *nextpath = NULL; - ssize_t len = read(fd, g_buf, 1); + ssize_t len = read_nointr(fd, g_buf, 1); if (len != 1) return; @@ -4317,14 +4326,14 @@ static void readpipe(int fd, char **path, char **lastname, char **lastdir) return; } - len = read(fd, g_buf, 1); + len = read_nointr(fd, g_buf, 1); if (len != 1) return; char op = g_buf[0]; if (op == 'c') { - len = read(fd, g_buf, PATH_MAX); + len = read_nointr(fd, g_buf, PATH_MAX); if (len <= 0) return; @@ -4415,7 +4424,10 @@ static bool run_selected_plugin(char **path, const char *file, char *runfile, ch _exit(EXIT_SUCCESS); } - int rfd = open(g_pipepath, O_RDONLY); + int rfd; + do { + rfd = open(g_pipepath, O_RDONLY); + } while (rfd == -1 && errno == EINTR); readpipe(rfd, path, lastname, lastdir); close(rfd);