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