]> git.sesse.net Git - plocate/blobdiff - complete_pread.cpp
Release plocate 1.1.22.
[plocate] / complete_pread.cpp
index 49136747b94fb680a8fe4285771f75c6a98e018a..3b369455f920304958d9fb3dee0bf08ffc43cc0b 100644 (file)
@@ -3,7 +3,7 @@
 #include <stdlib.h>
 #include <unistd.h>
 
-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<char *>(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);
        }
 }