Skip to content

Commit

Permalink
sctp: implement SIOCINQ ioctl() (take 3)
Browse files Browse the repository at this point in the history
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.

Signed-off-by: Diego Elio Pettenò <flameeyes@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Diego Elio 'Flameeyes' Pettenò authored and David S. Miller committed Sep 8, 2010
1 parent 2edae08 commit 65040c3
Showing 1 changed file with 34 additions and 1 deletion.
35 changes: 34 additions & 1 deletion net/sctp/socket.c
Original file line number Diff line number Diff line change
Expand Up @@ -3592,7 +3592,40 @@ SCTP_STATIC struct sock *sctp_accept(struct sock *sk, int flags, int *err)
/* 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 int 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
Expand Down

0 comments on commit 65040c3

Please sign in to comment.