Mercurial > hg > toybox
changeset 63:69efffcacd70
Add fdprintf(). Remove reread() and rewrite() which handle -EINTR, which
shouldn't be a problem if we register signal handlers with sigaction(SA_RESTART)
Straighten out count and len (I generally consistently use "count" for the
current progress and "len" for the total, but this time I got them backwards
for some reason and don't want to confuse myself in future.)
author | Rob Landley <rob@landley.net> |
---|---|
date | Thu, 18 Jan 2007 21:54:08 -0500 |
parents | f41f997c1e73 |
children | 67ee3a0b76e1 |
files | lib/functions.c lib/lib.h lib/portability.h toys.h toys/catv.c |
diffstat | 5 files changed, 36 insertions(+), 46 deletions(-) [+] |
line wrap: on
line diff
--- a/lib/functions.c Thu Jan 18 18:16:11 2007 -0500 +++ b/lib/functions.c Thu Jan 18 21:54:08 2007 -0500 @@ -174,30 +174,12 @@ return f; } -// Read from file handle, retrying if interrupted. -ssize_t reread(int fd, void *buf, size_t count) -{ - for (;;) { - ssize_t len = read(fd, buf, count); - if (len >= 0 || errno != EINTR) return len; - } -} - -// Write to file handle, retrying if interrupted. -ssize_t rewrite(int fd, void *buf, size_t count) +// Keep reading until full or EOF +ssize_t readall(int fd, void *buf, size_t len) { - for (;;) { - ssize_t len = write(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); + size_t count = 0; + while (count<len) { + int i = read(fd, buf+count, len-count); if (!i) return len; if (i<0) return i; count += i; @@ -207,13 +189,12 @@ } // Keep writing until done or EOF -ssize_t writeall(int fd, void *buf, size_t count) +ssize_t writeall(int fd, void *buf, size_t len) { - size_t len = 0; - while (len<count) { - int i = rewrite(fd, buf, count); - if (!i) return len; - if (i<0) return i; + size_t count = 0; + while (count<len) { + int i = write(fd, buf+count, len-count); + if (i<1) return i; count += i; } @@ -221,22 +202,26 @@ } // Die if there's an error other than EOF. -size_t xread(int fd, void *buf, size_t count) +size_t xread(int fd, void *buf, size_t len) { - count = reread(fd, buf, count); - if (count < 0) perror_exit("xread"); + len = read(fd, buf, len); + if (len < 0) perror_exit("xread"); - return count; + return len; } -void xreadall(int fd, void *buf, size_t count) +void xreadall(int fd, void *buf, size_t len) { - if (count != readall(fd, buf, count)) perror_exit("xreadall"); + if (len != readall(fd, buf, len)) perror_exit("xreadall"); } -void xwrite(int fd, void *buf, size_t count) +// There's no xwriteall(), just xwrite(). When we read, there may or may not +// be more data waiting. When we write, there is data and it had better go +// somewhere. + +void xwrite(int fd, void *buf, size_t len) { - if (count != writeall(fd, buf, count)) perror_exit("xwrite"); + if (len != writeall(fd, buf, len)) perror_exit("xwrite"); } char *xgetcwd(void)
--- a/lib/lib.h Thu Jan 18 18:16:11 2007 -0500 +++ b/lib/lib.h Thu Jan 18 21:54:08 2007 -0500 @@ -43,13 +43,11 @@ int xcreate(char *path, int flags, int mode); int xopen(char *path, int flags); FILE *xfopen(char *path, char *mode); -ssize_t reread(int fd, void *buf, size_t count); -ssize_t rewrite(int fd, void *buf, size_t count); -ssize_t readall(int fd, void *buf, size_t count); -ssize_t writeall(int fd, void *buf, size_t count); -size_t xread(int fd, void *buf, size_t count); -void xreadall(int fd, void *buf, size_t count); -void xwrite(int fd, void *buf, size_t count); +ssize_t readall(int fd, void *buf, size_t len); +ssize_t writeall(int fd, void *buf, size_t len); +size_t xread(int fd, void *buf, size_t len); +void xreadall(int fd, void *buf, size_t len); +void xwrite(int fd, void *buf, size_t len); char *xgetcwd(void); char *xabspath(char *path); struct string_list *find_in_path(char *path, char *filename);
--- a/lib/portability.h Thu Jan 18 18:16:11 2007 -0500 +++ b/lib/portability.h Thu Jan 18 21:54:08 2007 -0500 @@ -1,3 +1,9 @@ + +// Humor glibc to get dprintf, then #define it to something more portable. +#define _GNU_SOURCE +#include <stdio.h> +#define fdprintf(...) dprintf(__VA_ARGS__) + #include <endian.h> #if __BYTE_ORDER == __BIG_ENDIAN
--- a/toys.h Thu Jan 18 18:16:11 2007 -0500 +++ b/toys.h Thu Jan 18 21:54:08 2007 -0500 @@ -6,6 +6,8 @@ * Licensed under GPL version 2, see file LICENSE in this tarball for details. */ +#include "lib/portability.h" + #include <ctype.h> #include <errno.h> #include <fcntl.h> @@ -26,7 +28,6 @@ #include <unistd.h> #include "lib/lib.h" -#include "lib/portability.h" #include "gen_config.h" #include "toys/toylist.h"
--- a/toys/catv.c Thu Jan 18 18:16:11 2007 -0500 +++ b/toys/catv.c Thu Jan 18 21:54:08 2007 -0500 @@ -27,7 +27,7 @@ else for(;;) { int i, res; - res = reread(fd, toybuf, sizeof(toybuf)); + res = read(fd, toybuf, sizeof(toybuf)); if (res < 0) retval = EXIT_FAILURE; if (res < 1) break; for (i=0; i<res; i++) {