[Bluetooth] Add support for TIOCOUTQ and TIOCINQ ioctls
authorMarcel Holtmann <marcel@holtmann.org>
Mon, 14 Jul 2008 18:13:51 +0000 (20:13 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Mon, 14 Jul 2008 18:13:51 +0000 (20:13 +0200)
Almost every protocol family supports the TIOCOUTQ and TIOCINQ ioctls
and even Bluetooth could make use of them. When implementing audio
streaming and integration with GStreamer or PulseAudio they will allow
a better timing and synchronization.

Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
net/bluetooth/af_bluetooth.c

index 88afe25003d89cd42d4aa0306f3a55c96166b8aa..77fe9b868fee0b97d6c3949c789962dc7fa0d58b 100644 (file)
@@ -335,11 +335,34 @@ EXPORT_SYMBOL(bt_sock_poll);
 int bt_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
 {
        struct sock *sk = sock->sk;
+       struct sk_buff *skb;
+       long amount;
        int err;
 
        BT_DBG("sk %p cmd %x arg %lx", sk, cmd, arg);
 
        switch (cmd) {
+       case TIOCOUTQ:
+               if (sk->sk_state == BT_LISTEN)
+                       return -EINVAL;
+
+               amount = sk->sk_sndbuf - atomic_read(&sk->sk_wmem_alloc);
+               if (amount < 0)
+                       amount = 0;
+               err = put_user(amount, (int __user *) arg);
+               break;
+
+       case TIOCINQ:
+               if (sk->sk_state == BT_LISTEN)
+                       return -EINVAL;
+
+               lock_sock(sk);
+               skb = skb_peek(&sk->sk_receive_queue);
+               amount = skb ? skb->len : 0;
+               release_sock(sk);
+               err = put_user(amount, (int __user *) arg);
+               break;
+
        case SIOCGSTAMP:
                err = sock_get_timestamp(sk, (struct timeval __user *) arg);
                break;