diff options
Diffstat (limited to 'net/dccp/proto.c')
| -rw-r--r-- | net/dccp/proto.c | 33 | 
1 files changed, 31 insertions, 2 deletions
diff --git a/net/dccp/proto.c b/net/dccp/proto.c index cc9bf1cb264..d8497392803 100644 --- a/net/dccp/proto.c +++ b/net/dccp/proto.c @@ -26,6 +26,7 @@  #include <net/sock.h>  #include <net/xfrm.h> +#include <asm/ioctls.h>  #include <asm/semaphore.h>  #include <linux/spinlock.h>  #include <linux/timer.h> @@ -378,8 +379,36 @@ EXPORT_SYMBOL_GPL(dccp_poll);  int dccp_ioctl(struct sock *sk, int cmd, unsigned long arg)  { -	dccp_pr_debug("entry\n"); -	return -ENOIOCTLCMD; +	int rc = -ENOTCONN; + +	lock_sock(sk); + +	if (sk->sk_state == DCCP_LISTEN) +		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: +	release_sock(sk); +	return rc;  }  EXPORT_SYMBOL_GPL(dccp_ioctl);  | 
