From 9870b77f9000c55bbe507bbb11d6d20fac2e8da0 Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Thu, 15 Apr 2021 14:34:55 -0400 Subject: util: Tweak the safe read/write functions --- util.c | 71 +++++++++++++++++++++++++++++------------------------------------- 1 file changed, 31 insertions(+), 40 deletions(-) (limited to 'util.c') diff --git a/util.c b/util.c index 00f5b78..19656e9 100644 --- a/util.c +++ b/util.c @@ -369,57 +369,48 @@ int bfs_minor(dev_t dev) { #endif } -ssize_t safe_read(int fd, void *buf, size_t nbytes) { - for (;;) { - ssize_t ret = read(fd, buf, nbytes); - if (ret < 0 && errno == EINTR) { - continue; - } - return ret; - } -} - -ssize_t safe_read_all(int fd, void *buf, size_t nbytes) { +size_t xread(int fd, void *buf, size_t nbytes) { size_t count = 0; - for (;;) { + + while (count < nbytes) { ssize_t ret = read(fd, (char *)buf + count, nbytes - count); - if (ret < 0 && errno == EINTR) { - continue; - } if (ret < 0) { - return ret; // always return error < 0 - } - count += ret; - if (ret == 0 || count == nbytes) { // EOF or success - return count; + if (errno == EINTR) { + continue; + } else { + break; + } + } else if (ret == 0) { + // EOF + errno = 0; + break; + } else { + count += ret; } } -} -ssize_t safe_write(int fd, const void *buf, size_t nbytes) { - for (;;) { - ssize_t ret = write(fd, buf, nbytes); - if (ret < 0 && errno == EINTR) { - continue; - } - return ret; - } + return count; } -ssize_t safe_write_all(int fd, const void *buf, size_t nbytes) -{ +size_t xwrite(int fd, const void *buf, size_t nbytes) { size_t count = 0; - for (;;) { + + while (count < nbytes) { ssize_t ret = write(fd, (const char *)buf + count, nbytes - count); - if (ret < 0 && errno == EINTR) { - continue; - } if (ret < 0) { - return ret; // always return error < 0 - } - count += ret; - if (ret == 0 || count == nbytes) { // EOF (should never happen with write) or success - return count; + if (errno == EINTR) { + continue; + } else { + break; + } + } else if (ret == 0) { + // EOF? + errno = 0; + break; + } else { + count += ret; } } + + return count; } -- cgit v1.2.3