diff --git a/src/util.c b/src/util.c index 7c4005b..d44296e 100644 --- a/src/util.c +++ b/src/util.c @@ -38,13 +38,14 @@ void strip_crlf(const char *text) { #define XIO(name, func, ...) ssize_t name(__VA_ARGS__) { \ ssize_t ret = 0; \ - size_t rem = len; \ + size_t rem = len, done = 0; \ while (rem > 0) { \ ret = func(fd, &line[len - rem], rem); \ + if (ret == 0) break; \ if (ret < 0 && errno != EINTR && errno != EAGAIN && errno != EWOULDBLOCK) return ret; \ - if (ret > 0) rem -= ret; \ + if (ret > 0) { rem -= ret; done += ret; } \ } \ - return len; \ + return done; \ } XIO(xread, read, int fd, void *line, size_t len); XIO(xwrite, write, int fd, const char *line, size_t len);