| 3762 | } |
| 3763 | |
| 3764 | int |
| 3765 | lwip_ioctl(int s, long cmd, void *argp) |
| 3766 | { |
| 3767 | struct lwip_sock *sock = get_socket(s); |
| 3768 | u8_t val; |
| 3769 | #if LWIP_SO_RCVBUF |
| 3770 | int recv_avail; |
| 3771 | #endif /* LWIP_SO_RCVBUF */ |
| 3772 | |
| 3773 | if (!sock) { |
| 3774 | return -1; |
| 3775 | } |
| 3776 | |
| 3777 | switch (cmd) { |
| 3778 | #if LWIP_SO_RCVBUF || LWIP_FIONREAD_LINUXMODE |
| 3779 | case FIONREAD: |
| 3780 | if (!argp) { |
| 3781 | sock_set_errno(sock, EINVAL); |
| 3782 | done_socket(sock); |
| 3783 | return -1; |
| 3784 | } |
| 3785 | #if LWIP_FIONREAD_LINUXMODE |
| 3786 | if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) { |
| 3787 | struct netbuf *nb; |
| 3788 | if (sock->lastdata.netbuf) { |
| 3789 | nb = sock->lastdata.netbuf; |
| 3790 | *((int *)argp) = nb->p->tot_len; |
| 3791 | } else { |
| 3792 | struct netbuf *rxbuf; |
| 3793 | err_t err = netconn_recv_udp_raw_netbuf_flags(sock->conn, &rxbuf, NETCONN_DONTBLOCK); |
| 3794 | if (err != ERR_OK) { |
| 3795 | *((int *)argp) = 0; |
| 3796 | } else { |
| 3797 | sock->lastdata.netbuf = rxbuf; |
| 3798 | *((int *)argp) = rxbuf->p->tot_len; |
| 3799 | } |
| 3800 | } |
| 3801 | done_socket(sock); |
| 3802 | return 0; |
| 3803 | } |
| 3804 | #endif /* LWIP_FIONREAD_LINUXMODE */ |
| 3805 | |
| 3806 | #if LWIP_SO_RCVBUF |
| 3807 | /* we come here if either LWIP_FIONREAD_LINUXMODE==0 or this is a TCP socket */ |
| 3808 | SYS_ARCH_GET(sock->conn->recv_avail, recv_avail); |
| 3809 | if (recv_avail < 0) { |
| 3810 | recv_avail = 0; |
| 3811 | } |
| 3812 | |
| 3813 | /* Check if there is data left from the last recv operation. /maq 041215 */ |
| 3814 | if (sock->lastdata.netbuf) { |
| 3815 | if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) { |
| 3816 | recv_avail += sock->lastdata.pbuf->tot_len; |
| 3817 | } else { |
| 3818 | recv_avail += sock->lastdata.netbuf->p->tot_len; |
| 3819 | } |
| 3820 | } |
| 3821 | *((int *)argp) = recv_avail; |