Add reread(), readall(), and xread() on the bus ride in to work...
authorlandley <landley@driftwood>
Mon, 30 Oct 2006 15:01:19 +0000 (10:01 -0500)
committerlandley <landley@driftwood>
Mon, 30 Oct 2006 15:01:19 +0000 (10:01 -0500)
lib/functions.c
lib/lib.h

index e01053b..44f21b5 100644 (file)
@@ -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)
 {
index acdfc99..28888a4 100644 (file)
--- 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);