diff options
| author | Damien George <damien.p.george@gmail.com> | 2019-05-28 17:22:54 +1000 | 
|---|---|---|
| committer | Damien George <damien.p.george@gmail.com> | 2019-05-28 17:22:54 +1000 | 
| commit | 8c9758ff2ee5c5b70e4eab5fe0396de2e21299b0 (patch) | |
| tree | 0cb1b8a014ef2e50297eb3d352e317ab097798a2 | |
| parent | 887a6712c2a302bd0bdeceb8ee9bc33a6de64dae (diff) | |
unix/modusocket: Raise ETIMEDOUT when connect or accept has timeout.
| -rw-r--r-- | ports/unix/modusocket.c | 14 | 
1 files 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)); | 
