xref: /kvmtool/util/read-write.c (revision c4d7847b220c2cccfc0cf6c4d78da631b3edcd6b)
1 #include "kvm/read-write.h"
2 
3 #include <sys/types.h>
4 #include <unistd.h>
5 #include <string.h>
6 #include <errno.h>
7 
8 /* Same as read(2) except that this function never returns EAGAIN or EINTR. */
9 ssize_t xread(int fd, void *buf, size_t count)
10 {
11 	ssize_t nr;
12 
13 restart:
14 	nr = read(fd, buf, count);
15 	if ((nr < 0) && ((errno == EAGAIN) || (errno == EINTR)))
16 		goto restart;
17 
18 	return nr;
19 }
20 
21 /* Same as write(2) except that this function never returns EAGAIN or EINTR. */
22 ssize_t xwrite(int fd, const void *buf, size_t count)
23 {
24 	ssize_t nr;
25 
26 restart:
27 	nr = write(fd, buf, count);
28 	if ((nr < 0) && ((errno == EAGAIN) || (errno == EINTR)))
29 		goto restart;
30 
31 	return nr;
32 }
33 
34 ssize_t read_in_full(int fd, void *buf, size_t count)
35 {
36 	ssize_t total = 0;
37 	char *p = buf;
38 
39 	while (count > 0) {
40 		ssize_t nr;
41 
42 		nr = xread(fd, p, count);
43 		if (nr <= 0) {
44 			if (total > 0)
45 				return total;
46 
47 			return -1;
48 		}
49 
50 		count -= nr;
51 		total += nr;
52 		p += nr;
53 	}
54 
55 	return total;
56 }
57 
58 ssize_t write_in_full(int fd, const void *buf, size_t count)
59 {
60 	const char *p = buf;
61 	ssize_t total = 0;
62 
63 	while (count > 0) {
64 		ssize_t nr;
65 
66 		nr = xwrite(fd, p, count);
67 		if (nr < 0)
68 			return -1;
69 		if (nr == 0) {
70 			errno = ENOSPC;
71 			return -1;
72 		}
73 		count -= nr;
74 		total += nr;
75 		p += nr;
76 	}
77 
78 	return total;
79 }
80