diff --git a/lib/system/io.nim b/lib/system/io.nim index 41716f9afe53b..77624944b282a 100644 --- a/lib/system/io.nim +++ b/lib/system/io.nim @@ -141,6 +141,7 @@ proc strerror(errnum: cint): cstring {.importc, header: "".} when not defined(NimScript): var errno {.importc, header: "".}: cint ## error variable + EINTR {.importc: "EINTR", header: "".}: cint proc checkErr(f: File) = when not defined(NimScript): @@ -158,8 +159,17 @@ proc readBuffer*(f: File, buffer: pointer, len: Natural): int {. ## reads `len` bytes into the buffer pointed to by `buffer`. Returns ## the actual number of bytes that have been read which may be less than ## `len` (if not as many bytes are remaining), but not greater. - result = cast[int](c_fread(buffer, 1, cast[csize_t](len), f)) - if result != len: checkErr(f) + while true: + result = cast[int](c_fread(buffer, 1, cast[csize_t](len), f)) + if result == len: return result + when not defined(NimScript): + if errno == EINTR: + errno = 0 + c_clearerr(f) + doAssert result == 0 # check whether we need to handle result > 0 (ie short read) + continue + checkErr(f) + break proc readBytes*(f: File, a: var openArray[int8|uint8], start, len: Natural): int {. tags: [ReadIOEffect], benign.} =