sctp: implement SIOCINQ ioctl() (take 2)
Subsystems (2)
PATCH 1/1 sctp: implement SIOCINQ ioctl() (take 2)
This simple patch copies the current approach for SIOCINQ ioctl() from DCCP into SCTP so that the userland code working with SCTP can use a similar interface across different protocols to know how much space to allocate for a buffer.
--- net/sctp/socket.c | 35 ++++++++++++++++++++++++++++++++++- 1 files changed, 34 insertions(+), 1 deletions(-)
net/sctp/socket.c +34 -1
@@ -3595,7 +3595,40 @@ out:/* The SCTP ioctl handler. */ SCTP_STATIC int sctp_ioctl(struct sock *sk, int cmd, unsigned long arg) { -return -ENOIOCTLCMD ; +int rc = -ENOTCONN ; + +sctp_lock_sock (sk); + +/* +* SEQPACKET-style sockets in LISTENING state are valid, for +* SCTP, so only discard TCP-style sockets in LISTENING state. +*/ +if (sctp_style (sk,TCP ) &&sctp_sstate (sk,LISTENING )) + goto out; + +switch (cmd) { +case SIOCINQ : { +struct sk_buff *skb; +unsigned long amount =0 ; + + skb =skb_peek (&sk->sk_receive_queue); +if (skb !=NULL ) { +/* +* We will only return the amount of this packet since +* that is all that will be read. +*/ + amount = skb->len; + } + rc =put_user (amount, (int __user *)arg); + } +break ; +default : + rc = -ENOIOCTLCMD ; +break ; + } +out: +sctp_release_sock (sk); +return rc; }/* This is the function which gets called during socket creation to
Signature · 1 line
1.7.1