]> git.sesse.net Git - plocate/blob - complete_pread.cpp
Release plocate 1.1.22.
[plocate] / complete_pread.cpp
1 #include <errno.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <unistd.h>
5
6 bool try_complete_pread(int fd, void *ptr, size_t len, off_t offset)
7 {
8         while (len > 0) {
9                 ssize_t ret = pread(fd, ptr, len, offset);
10                 if (ret == -1 && errno == EINTR) {
11                         continue;
12                 }
13                 if (ret <= 0) {
14                         return false;
15                 }
16                 ptr = reinterpret_cast<char *>(ptr) + ret;
17                 len -= ret;
18                 offset += ret;
19         }
20         return true;
21 }
22
23 void complete_pread(int fd, void *ptr, size_t len, off_t offset)
24 {
25         if (!try_complete_pread(fd, ptr, len, offset)) {
26                 if (errno == 0) {
27                         fprintf(stderr, "pread: Short read (file corrupted?)\n");
28                 } else {
29                         perror("pread");
30                 }
31                 exit(1);
32         }
33 }