]> git.sesse.net Git - plocate/blob - complete_pread.cpp
Bump version number.
[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                 perror("pread");
27                 exit(1);
28         }
29 }