From 8c9758ff2ee5c5b70e4eab5fe0396de2e21299b0 Mon Sep 17 00:00:00 2001
From: Damien George <damien.p.george@gmail.com>
Date: Tue, 28 May 2019 17:22:54 +1000
Subject: [PATCH] unix/modusocket: Raise ETIMEDOUT when connect or accept has
 timeout.

---
 ports/unix/modusocket.c | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/ports/unix/modusocket.c b/ports/unix/modusocket.c
index 8cbd3d077..9b82378bb 100644
--- a/ports/unix/modusocket.c
+++ b/ports/unix/modusocket.c
@@ -160,7 +160,12 @@ STATIC mp_obj_t socket_connect(mp_obj_t self_in, mp_obj_t addr_in) {
     mp_buffer_info_t bufinfo;
     mp_get_buffer_raise(addr_in, &bufinfo, MP_BUFFER_READ);
     int r = connect(self->fd, (const struct sockaddr *)bufinfo.buf, bufinfo.len);
-    RAISE_ERRNO(r, errno);
+    int err = errno;
+    if (r == -1 && self->blocking && err == EINPROGRESS) {
+        // EINPROGRESS on a blocking socket means the operation timed out
+        err = MP_ETIMEDOUT;
+    }
+    RAISE_ERRNO(r, err);
     return mp_const_none;
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_connect_obj, socket_connect);
@@ -190,7 +195,12 @@ STATIC mp_obj_t socket_accept(mp_obj_t self_in) {
     byte addr[32];
     socklen_t addr_len = sizeof(addr);
     int fd = accept(self->fd, (struct sockaddr*)&addr, &addr_len);
-    RAISE_ERRNO(fd, errno);
+    int err = errno;
+    if (fd == -1 && self->blocking && err == EAGAIN) {
+        // EAGAIN on a blocking socket means the operation timed out
+        err = MP_ETIMEDOUT;
+    }
+    RAISE_ERRNO(fd, err);
 
     mp_obj_tuple_t *t = MP_OBJ_TO_PTR(mp_obj_new_tuple(2, NULL));
     t->items[0] = MP_OBJ_FROM_PTR(socket_new(fd));
-- 
GitLab