blob: 0023b8f8b6160cf141a69696e317aed41dedcb12 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#include <errno.h>
#include <unistd.h>
#include "utils.h"
ssize_t xread(int fd, void *buf, size_t count)
{
// Read some bytes. Retry on EINTR and when we don't get as many bytes as we requested.
size_t alreadyRead = 0;
start:;
ssize_t res = read(fd, buf, count);
if (res == -1 && errno == EINTR) goto start;
if (res > 0) {
buf = ((char*)buf)+res;
count -= res;
alreadyRead += res;
}
if (res == -1) return -1;
if (count == 0 || res == 0) return alreadyRead;
goto start;
}
|