diff --git a/src/api/api_lib.c b/src/api/api_lib.c index 570e9bf2..ec1bd746 100644 --- a/src/api/api_lib.c +++ b/src/api/api_lib.c @@ -424,6 +424,7 @@ netconn_recv(struct netconn *conn) #if LWIP_SO_RCVTIMEO if (sys_arch_mbox_fetch(conn->recvmbox, (void *)&p, conn->recv_timeout)==SYS_ARCH_TIMEOUT) { + conn->err = ERR_TIMEOUT; p = NULL; } #else @@ -444,7 +445,10 @@ netconn_recv(struct netconn *conn) /* If we are closed, we indicate that we no longer wish to use the socket */ if (p == NULL) { memp_free(MEMP_NETBUF, buf); - conn->err = ERR_CLSD; + /* Avoid to lost any previous error code */ + if (conn->err == ERR_OK) { + conn->err = ERR_CLSD; + } return NULL; } diff --git a/src/api/sockets.c b/src/api/sockets.c index bce8b8cd..74ee6086 100644 --- a/src/api/sockets.c +++ b/src/api/sockets.c @@ -417,7 +417,7 @@ lwip_recvfrom(int s, void *mem, int len, unsigned int flags, if (!buf) { /* We should really do some error checking here. */ LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom(%d): buf == NULL!\n", s)); - sock_set_errno(sock, (sock->conn->type==NETCONN_UDP)?ETIMEDOUT:0); + sock_set_errno(sock, (((sock->conn->pcb.ip!=NULL) && (sock->conn->err==ERR_OK))?ETIMEDOUT:err_to_errno(sock->conn->err))); return 0; } }