From: Tobias Ulmer Date: Wed, 13 Feb 2019 14:11:11 +0000 (+0100) Subject: e2lib: handle EINTR in poll() and wait() X-Git-Tag: e2factory-2.3.18rc1~53 X-Git-Url: https://git.e2factory.org/?a=commitdiff_plain;h=919a6829bb3720a275bd93b5f0720751bcbfcf80;p=e2factory.git e2lib: handle EINTR in poll() and wait() Signed-off-by: Tobias Ulmer --- diff --git a/generic/e2lib.lua b/generic/e2lib.lua index aec3579..3daaae7 100644 --- a/generic/e2lib.lua +++ b/generic/e2lib.lua @@ -228,7 +228,19 @@ end -- @return Process ID of the terminated child or error object on failure. -- @return Number of signal that killed the process, if any. function e2lib.wait(pid) - local rc, childpid, sig = le2lib.wait(pid) + while true do + local rc, childpid, sig = le2lib.wait(pid) + if not rc then + if sig ~= errno.def2errnum("EINTR") then + return false, + err.new("waiting for child %d failed: %s", pid, childpid) + end + e2lib.log(4, "wait(%d) returned EINTR", childpid) + else + return rc, childpid, sig + end + end +end if not rc then return false, err.new("waiting for child %d failed: %s", pid, childpid) @@ -250,14 +262,16 @@ end -- fd in the fdvec table. -- @return Error object on failure. function e2lib.poll(timeout, fdvec) - local pollvec, errstring - - pollvec, errstring = le2lib.poll(timeout, fdvec) - if not pollvec then - return false, err.new("poll() failed: %s", errstring) + while true do + local pollvec, errstring, e = le2lib.poll(timeout, fdvec) + if not pollvec then + if e ~= errno.def2errnum("EINTR") then + return false, err.new("poll() failed: %s", errstring) + end + else + return pollvec + end end - - return pollvec end --- Rename file or directory using the rename syscall.