From 974a45c804a60ce6159db67581e94f4a03f9b2ff Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Mon, 16 Nov 2020 16:42:09 -0600 Subject: [PATCH] When reading from a stream, EPIPE is considered EOS. Before, EPIPE caused an error, but in most cases it is better to consider it an end of stream. In the future, we may want to allow cusomtization of this behavior with flags on the stream but for now let's keep it simpler. --- src/core/ev.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/core/ev.c b/src/core/ev.c index 92b1667b..e95c324b 100644 --- a/src/core/ev.c +++ b/src/core/ev.c @@ -1317,9 +1317,16 @@ JanetAsyncStatus ev_machine_read(JanetListenerState *s, JanetAsyncEvent event) { /* Check for errors - special case errors that can just be waited on to fix */ if (nread == -1) { - if (errno == EAGAIN || errno == EWOULDBLOCK) break; - janet_cancel(s->fiber, janet_ev_lasterr()); - return JANET_ASYNC_STATUS_DONE; + if (errno == EAGAIN || errno == EWOULDBLOCK) { + return JANET_ASYNC_STATUS_NOT_DONE; + } + /* In stream protocols, a pipe error is end of stream */ + if (errno == EPIPE && (state->mode != JANET_ASYNC_READMODE_RECVFROM)) { + nread = 0; + } else { + janet_cancel(s->fiber, janet_ev_lasterr()); + return JANET_ASYNC_STATUS_DONE; + } } /* Only allow 0-length packets in recv-from. In stream protocols, a zero length packet is EOS. */