From: Jo-Philipp Wich Date: Wed, 8 Sep 2021 19:23:49 +0000 (+0200) Subject: Retry splice() syscall on EINTR X-Git-Url: http://git.openwrt.org/feed/routing.git%5Ed11075cd40a88602bf4ba2b275f72100ddcb4767?a=commitdiff_plain;h=98cef9dda63623eff07bd574ad7c98ef282af18d;p=project%2Fcgi-io.git Retry splice() syscall on EINTR The invoked child process might end before the I/O loop finished outputting all data. In such a case, the splice() call might fail with -1/EINTR. Continue looping in such a case. Signed-off-by: Jo-Philipp Wich --- diff --git a/main.c b/main.c index 95a62b8..e55051e 100644 --- a/main.c +++ b/main.c @@ -672,7 +672,7 @@ main_backup(int argc, char **argv) do { len = splice(fds[0], NULL, 1, NULL, READ_BLOCK, SPLICE_F_MORE); - } while (len > 0); + } while (len > 0 || (len == -1 && errno == EINTR)); waitpid(pid, &status, 0); @@ -836,7 +836,7 @@ main_exec(int argc, char **argv) do { len = splice(fds[0], NULL, 1, NULL, READ_BLOCK, SPLICE_F_MORE); - } while (len > 0); + } while (len > 0 || (len == -1 && errno == EINTR)); waitpid(pid, &status, 0);