From 98cef9dda63623eff07bd574ad7c98ef282af18d Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Wed, 8 Sep 2021 21:23:49 +0200 Subject: [PATCH] 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 --- main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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); -- 2.30.2