aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/functions.c32
-rw-r--r--lib/lib.h3
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)
{
diff --git a/lib/lib.h b/lib/lib.h
index acdfc998..28888a49 100644
--- a/lib/lib.h
+++ b/lib/lib.h
@@ -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);