X-Git-Url: https://git.sesse.net/?p=plocate;a=blobdiff_plain;f=complete_pread.cpp;h=3b369455f920304958d9fb3dee0bf08ffc43cc0b;hp=49136747b94fb680a8fe4285771f75c6a98e018a;hb=HEAD;hpb=acce03bb32917e21f2d1d49c5a460d3cd2f72a11 diff --git a/complete_pread.cpp b/complete_pread.cpp index 4913674..3b36945 100644 --- a/complete_pread.cpp +++ b/complete_pread.cpp @@ -3,7 +3,7 @@ #include #include -void complete_pread(int fd, void *ptr, size_t len, off_t offset) +bool try_complete_pread(int fd, void *ptr, size_t len, off_t offset) { while (len > 0) { ssize_t ret = pread(fd, ptr, len, offset); @@ -11,11 +11,23 @@ void complete_pread(int fd, void *ptr, size_t len, off_t offset) continue; } if (ret <= 0) { - perror("pread"); - exit(1); + return false; } ptr = reinterpret_cast(ptr) + ret; len -= ret; - offset -= ret; + offset += ret; + } + return true; +} + +void complete_pread(int fd, void *ptr, size_t len, off_t offset) +{ + if (!try_complete_pread(fd, ptr, len, offset)) { + if (errno == 0) { + fprintf(stderr, "pread: Short read (file corrupted?)\n"); + } else { + perror("pread"); + } + exit(1); } }