From f8f9e5fdc0630c81bba12e8888dbfb4a43b83734 Mon Sep 17 00:00:00 2001 From: "Chris West (Faux)" Date: Tue, 3 Dec 2019 20:40:36 +0000 Subject: [PATCH] feat: retry reads for EAGAIN --- src/net.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/net.c b/src/net.c index 75916f78..4b158c10 100644 --- a/src/net.c +++ b/src/net.c @@ -15,9 +15,28 @@ status sock_close(connection *c) { } status sock_read(connection *c, size_t *n) { - ssize_t r = read(c->fd, c->buf, sizeof(c->buf)); - *n = (size_t) r; - return r >= 0 ? OK : ERROR; + size_t had = 0; + status exit; + for (;;) { + ssize_t r = read(c->fd, c->buf + had, sizeof(c->buf) - had); + if (r < 0) { + if (EAGAIN == errno || EWOULDBLOCK == errno) { + exit = OK; + break; + } + exit = ERROR; + break; + } + + had += r; + if (had == sizeof(c->buf)) { + exit = OK; + break; + } + } + *n = (size_t) had; + + return exit; } status sock_write(connection *c, char *buf, size_t len, size_t *n) {