From 1d2804d6a210fefce8aae6942d80daf7617c4259 Mon Sep 17 00:00:00 2001 From: jifl Date: Thu, 2 Oct 2008 13:59:18 +0000 Subject: [PATCH] * sockets.c (lwip_accept): Return EWOULDBLOCK if would block on non-blocking socket. --- CHANGELOG | 4 ++++ src/api/sockets.c | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index 2e8efbc1..0ed73a00 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -19,6 +19,10 @@ HISTORY ++ New features: + 2008-10-02 Jonathan Larmour and Rishi Khan + * sockets.c (lwip_accept): Return EWOULDBLOCK if would block on non-blocking + socket. + 2008-06-30 Simon Goldschmidt * mem.c, opt.h, stats.h: fixed bug #21433: Calling mem_free/pbuf_free from interrupt context isn't safe: LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT allows diff --git a/src/api/sockets.c b/src/api/sockets.c index 4a3d55a0..a03fe0de 100644 --- a/src/api/sockets.c +++ b/src/api/sockets.c @@ -258,6 +258,12 @@ lwip_accept(int s, struct sockaddr *addr, socklen_t *addrlen) if (!sock) return -1; + if ((sock->flags & O_NONBLOCK) && !sock->rcvevent) { + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d): returning EWOULDBLOCK\n", s)); + sock_set_errno(sock, EWOULDBLOCK); + return -1; + } + newconn = netconn_accept(sock->conn); if (!newconn) { LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d) failed, err=%d\n", s, sock->conn->err));