From e895aa71a436ae22934cd03e9ea4f400c89111f5 Mon Sep 17 00:00:00 2001 From: jifl Date: Thu, 3 May 2007 19:13:27 +0000 Subject: [PATCH] * sockets.c: Fix ioctl FIONREAD when some data remains from last recv. (patch #3574). --- CHANGELOG | 4 ++++ src/api/sockets.c | 11 ++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index c6044eaa..7f32a03b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -117,6 +117,10 @@ HISTORY ++ Bug fixes: + 2007-05-03 "maq" + * sockets.c: Fix ioctl FIONREAD when some data remains from last recv. + (patch #3574). + 2007-04-23 Simon Goldschmidt * loopif.c, loopif.h, opt.h, src/netif/FILES: fix bug #2595: "loopif results in NULL reference for incoming TCP packets". Loopif has to be configured diff --git a/src/api/sockets.c b/src/api/sockets.c index d003c62d..61a8e520 100644 --- a/src/api/sockets.c +++ b/src/api/sockets.c @@ -1406,6 +1406,7 @@ int lwip_setsockopt (int s, int level, int optname, const void *optval, socklen_ int lwip_ioctl(int s, long cmd, void *argp) { struct lwip_socket *sock = get_socket(s); + u16_t buflen = 0; if (!sock) return -1; @@ -1419,7 +1420,15 @@ int lwip_ioctl(int s, long cmd, void *argp) *((u16_t*)argp) = sock->conn->recv_avail; - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_ioctl(%d, FIONREAD, %p) = %u\n", s, argp, *((u16_t*)argp))); + /* Check if there is data left from the last recv operation. /maq 041215 */ + if (sock->lastdata) { + buflen = netbuf_len(sock->lastdata); + buflen -= sock->lastoffset; + + *((u16_t*)argp) += buflen; + } + + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_ioctl(%d, FIONREAD, %p) = %u\n", s, argp, *((u16_t*)argp))); sock_set_errno(sock, 0); return 0;