diff options
author | Tavian Barnes <tavianator@tavianator.com> | 2021-04-15 14:34:55 -0400 |
---|---|---|
committer | Tavian Barnes <tavianator@tavianator.com> | 2021-04-15 14:36:39 -0400 |
commit | 9870b77f9000c55bbe507bbb11d6d20fac2e8da0 (patch) | |
tree | 6dd24948300c2b1bd5cbca40ba52e4ac9178650c /util.c | |
parent | b7111f2f01dce9516aea5250e765124300f2fa3a (diff) | |
download | bfs-9870b77f9000c55bbe507bbb11d6d20fac2e8da0.tar.xz |
util: Tweak the safe read/write functions
Diffstat (limited to 'util.c')
-rw-r--r-- | util.c | 71 |
1 files changed, 31 insertions, 40 deletions
@@ -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; } |