Diego Elio 'Flameeyes' Pettenò wrote: > 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 | 31 ++++++++++++++++++++++++++++++- > 1 files changed, 30 insertions(+), 1 deletions(-) > > diff --git a/net/sctp/socket.c b/net/sctp/socket.c > index 44a1ab0..3135b4e 100644 > --- a/net/sctp/socket.c > +++ b/net/sctp/socket.c > @@ -3595,7 +3595,36 @@ 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); > + > + if (sctp_sstate(sk, LISTENING)) This should add a check for sctp_style(sk, TCP), since one can't read from a TCP style listening sockets, but can do so from UDP-style (SOCK_SEQPACKET). -vlad > + 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 -- To unsubscribe from this list: send the line "unsubscribe linux-sctp" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html