File: complete_pread.cpp

package info (click to toggle)
plocate 1.1.24-1
  • links: PTS
  • area: main
  • in suites: forky, sid
  • size: 460 kB
  • sloc: cpp: 5,390; sh: 84; makefile: 4
file content (37 lines) | stat: -rw-r--r-- 768 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

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);
		if (ret == -1 && errno == EINTR) {
			continue;
		}
		if (ret == 0) {
			errno = 0;
			return false;
		}
		if (ret <= 0) {
			return false;
		}
		ptr = reinterpret_cast<char *>(ptr) + ret;
		len -= ret;
		offset += ret;
	}
	return true;
}

void complete_pread(int fd, void *ptr, size_t len, off_t offset, const char *filename_for_errors)
{
	if (!try_complete_pread(fd, ptr, len, offset)) {
		if (errno == 0) {
			fprintf(stderr, "%s: Short read (file corrupted?)\n", filename_for_errors);
		} else {
			perror(filename_for_errors);
		}
		exit(1);
	}
}