From 7728ee809d8e3dff17b5bfa1b5a58caa090a665f Mon Sep 17 00:00:00 2001 From: antirez Date: Wed, 22 Oct 2014 15:58:13 +0200 Subject: [PATCH] Translate rio fdset target EWOULDBLOCK error into ETIMEDOUT. EWOULDBLOCK with the fdset rio target is returned when we try to write but the send timeout socket option triggered an error. Better to translate the error in something the user can actually recognize as a timeout. --- src/rio.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/rio.c b/src/rio.c index 2083486c..738e56fd 100644 --- a/src/rio.c +++ b/src/rio.c @@ -203,7 +203,14 @@ static size_t rioFdsetWrite(rio *r, const void *buf, size_t len) { size_t nwritten = 0; while(nwritten != count) { retval = write(r->io.fdset.fds[j],p+nwritten,count-nwritten); - if (retval <= 0) break; + if (retval <= 0) { + /* With blocking sockets, which is the sole user of this + * rio target, EWOULDBLOCK is returned only because of + * the SO_SNDTIMEO socket option, so we translate the error + * into one more recognizable by the user. */ + if (retval == -1 && errno == EWOULDBLOCK) errno = ETIMEDOUT; + break; + } nwritten += retval; }