(bug #30185): added LWIP_FIONREAD_LINUXMODE that makes ioctl/FIONREAD return the size of the next pending datagram.
This commit is contained in:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user