diff options
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; } |