(bug #30185): added LWIP_FIONREAD_LINUXMODE that makes ioctl/FIONREAD return the size of the next pending datagram.

This commit is contained in:
Simon Goldschmidt
2011-07-21 20:15:39 +02:00
parent fc280c7cd6
commit bd69890ccd
3 changed files with 49 additions and 4 deletions

View File

@@ -2330,13 +2330,38 @@ lwip_ioctl(int s, long cmd, void *argp)
}
switch (cmd) {
#if LWIP_SO_RCVBUF
#if LWIP_SO_RCVBUF || LWIP_FIONREAD_LINUXMODE
case FIONREAD:
if (!argp) {
sock_set_errno(sock, EINVAL);
return -1;
}
#if LWIP_FIONREAD_LINUXMODE
if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) {
struct pbuf *p;
if (sock->lastdata) {
p = ((struct netbuf *)sock->lastdata)->p;
} else {
struct netbuf *rxbuf;
err_t err;
if (sock->rcvevent <= 0) {
*((u16_t*)argp) = 0;
} else {
err = netconn_recv(sock->conn, &rxbuf);
if (err != ERR_OK) {
*((u16_t*)argp) = 0;
} else {
sock->lastdata = rxbuf;
*((u16_t*)argp) = rxbuf->p->tot_len;
}
}
}
return 0;
}
#endif /* LWIP_FIONREAD_LINUXMODE */
#if LWIP_SO_RCVBUF
/* we come here if either LWIP_FIONREAD_LINUXMODE==0 or this is a TCP socket */
SYS_ARCH_GET(sock->conn->recv_avail, recv_avail);
if (recv_avail < 0) {
recv_avail = 0;
@@ -2358,7 +2383,10 @@ lwip_ioctl(int s, long cmd, void *argp)
LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_ioctl(%d, FIONREAD, %p) = %"U16_F"\n", s, argp, *((u16_t*)argp)));
sock_set_errno(sock, 0);
return 0;
#else /* LWIP_SO_RCVBUF */
break;
#endif /* LWIP_SO_RCVBUF */
#endif /* LWIP_SO_RCVBUF || LWIP_FIONREAD_LINUXMODE */
case FIONBIO:
val = 0;
@@ -2371,10 +2399,11 @@ lwip_ioctl(int s, long cmd, void *argp)
return 0;
default:
LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_ioctl(%d, UNIMPL: 0x%lx, %p)\n", s, cmd, argp));
sock_set_errno(sock, ENOSYS); /* not yet implemented */
return -1;
break;
} /* switch (cmd) */
LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_ioctl(%d, UNIMPL: 0x%lx, %p)\n", s, cmd, argp));
sock_set_errno(sock, ENOSYS); /* not yet implemented */
return -1;
}
/** A minimal implementation of fcntl.