diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/functions.c | 32 | ||||
-rw-r--r-- | lib/lib.h | 3 |
2 files changed, 32 insertions, 3 deletions
diff --git a/lib/functions.c b/lib/functions.c index e01053ba..44f21b55 100644 --- a/lib/functions.c +++ b/lib/functions.c @@ -150,9 +150,35 @@ FILE *xfopen(char *path, char *mode) return f; } -// int xread(int fd, char *buf, int len) // Die if can't fill buffer -// int readall(int fd, char *buf, int len) // Keep reading until full or EOF -// int toy_read(int fd, char *buf, int len) // retry if interrupted +// Read from file handle, retrying if interrupted. +ssize_t reread(int fd, void *buf, size_t count) +{ + ssize_t len; + for (;;) { + len = read(fd, buf, count); + if (len >= 0 || errno != EINTR) return len; + } +} + +// Keep reading until full or EOF +ssize_t readall(int fd, void *buf, size_t count) +{ + size_t len = 0; + while (len<count) { + int i = reread(fd, buf, count); + if (!i) return len; + if (i<0) return i; + count += i; + } + + return count; +} + +// Die if we can't fill a buffer +void xread(int fd, char *buf, size_t count) +{ + if (count != readall(fd, buf, count)) perror_exit("xread"); +} char *xgetcwd(void) { @@ -19,6 +19,9 @@ char *xmsprintf(char *format, ...); void xexec(char **argv); int xopen(char *path, int flags, int mode); FILE *xfopen(char *path, char *mode); +ssize_t reread(int fd, void *buf, size_t count); +ssize_t readall(int fd, void *buf, size_t count); +void xread(int fd, char *buf, size_t count); char *xgetcwd(void); char *find_in_path(char *path, char *filename); void utoa_to_buf(unsigned n, char *buf, unsigned buflen); |