diff --git a/CHANGELOG b/CHANGELOG index 7c5a0f14..66cf1bb3 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -19,6 +19,9 @@ HISTORY ++ New features: + 2007-06-30 Frédéric Bernon + * sockets.h, sockets.c: Implement MSG_PEEK flag for recv/recvfrom functions. + 2007-06-21 Simon Goldschmidt * etharp.h, etharp.c: Combined etharp_request with etharp_raw for both LWIP_AUTOIP =0 and =1 to remove redundant code. diff --git a/src/api/sockets.c b/src/api/sockets.c index 695bfeb7..a6580a67 100644 --- a/src/api/sockets.c +++ b/src/api/sockets.c @@ -381,7 +381,6 @@ lwip_recvfrom(int s, void *mem, int len, unsigned int flags, struct ip_addr *addr; u16_t port; - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom(%d, %p, %d, 0x%x, ..)\n", s, mem, len, flags)); sock = get_socket(s); if (!sock) @@ -397,11 +396,11 @@ lwip_recvfrom(int s, void *mem, int len, unsigned int flags, sock_set_errno(sock, EWOULDBLOCK); return -1; } - + /* No data was left from the previous operation, so we try to get some from the network. */ - buf = netconn_recv(sock->conn); - + sock->lastdata = buf = netconn_recv(sock->conn); + if (!buf) { /* We should really do some error checking here. */ LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom(%d): buf == NULL!\n", s)); @@ -413,13 +412,13 @@ lwip_recvfrom(int s, void *mem, int len, unsigned int flags, buflen = netbuf_len(buf); buflen -= sock->lastoffset; - + if (len > buflen) { copylen = buflen; } else { copylen = len; } - + /* copy the contents of the received buffer into the supplied memory pointer mem */ netbuf_copy_partial(buf, mem, copylen, sock->lastoffset); @@ -454,19 +453,21 @@ lwip_recvfrom(int s, void *mem, int len, unsigned int flags, ip_addr_debug_print(SOCKETS_DEBUG, addr); LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%u len=%u\n", port, copylen)); #endif - } - /* If this is a TCP socket, check if there is data left in the - buffer. If so, it should be saved in the sock structure for next - time around. */ - if ((sock->conn->type == NETCONN_TCP) && (buflen - copylen > 0)) { - sock->lastdata = buf; - sock->lastoffset += copylen; - } else { - sock->lastdata = NULL; - sock->lastoffset = 0; - netbuf_delete(buf); + /* If we don't peek the incoming message... */ + if ((flags & MSG_PEEK)==0) { + /* If this is a TCP socket, check if there is data left in the + buffer. If so, it should be saved in the sock structure for next + time around. */ + if ((sock->conn->type == NETCONN_TCP) && (buflen - copylen > 0)) { + sock->lastdata = buf; + sock->lastoffset += copylen; + } else { + sock->lastdata = NULL; + sock->lastoffset = 0; + netbuf_delete(buf); + } } sock_set_errno(sock, 0); diff --git a/src/include/lwip/sockets.h b/src/include/lwip/sockets.h index 938be4f8..12046643 100644 --- a/src/include/lwip/sockets.h +++ b/src/include/lwip/sockets.h @@ -121,11 +121,14 @@ struct linger { #define IPPROTO_UDP 17 #define IPPROTO_UDPLITE 136 -#define INADDR_ANY 0 +#define INADDR_ANY 0 #define INADDR_BROADCAST 0xffffffff /* Flags we can use with send and recv. */ -#define MSG_DONTWAIT 0x40 /* Nonblocking i/o for this operation only */ +#define MSG_PEEK 0x01 /* Peeks at an incoming message */ +#define MSG_WAITALL 0x02 /* Requests that the function block until the full amount of data requested can be returned */ +#define MSG_OOB 0x04 /* Requests out-of-band data. The significance and semantics of out-of-band data are protocol-specific */ +#define MSG_DONTWAIT 0x08 /* Nonblocking i/o for this operation only */ /* @@ -140,7 +143,7 @@ struct linger { */ #define TCP_NODELAY 0x01 /* don't delay send to coalesce packets */ #define TCP_KEEPALIVE 0x02 /* send KEEPALIVE probes when idle for pcb->keep_idle milliseconds */ -#define TCP_KEEPIDLE 0x03 /* set pcb->keep_idle - Same as TCP_KEEPALIVE, but use seconds for get/setsockopt*/ +#define TCP_KEEPIDLE 0x03 /* set pcb->keep_idle - Same as TCP_KEEPALIVE, but use seconds for get/setsockopt */ #define TCP_KEEPINTVL 0x04 /* set pcb->keep_intvl - Use seconds for get/setsockopt */ #define TCP_KEEPCNT 0x05 /* set pcb->keep_cnt - Use number of probes sent for get/setsockopt */ #endif /* LWIP_TCP */