patch-2_6_7-vs1_9_1_12
[linux-2.6.git] / net / bluetooth / hci_sock.c
index ceee707..348a82f 100644 (file)
    SOFTWARE IS DISCLAIMED.
 */
 
-/*
- * Bluetooth HCI socket layer.
- *
- * $Id: hci_sock.c,v 1.4 2002/04/18 22:26:14 maxk Exp $
- */
+/* Bluetooth HCI sockets. */
 
 #include <linux/config.h>
 #include <linux/module.h>
@@ -56,7 +52,7 @@
 
 #ifndef CONFIG_BT_HCI_SOCK_DEBUG
 #undef  BT_DBG
-#define BT_DBG( A... )
+#define BT_DBG(D...)
 #endif
 
 /* ----- HCI socket interface ----- */
@@ -139,7 +135,6 @@ void hci_send_to_sock(struct hci_dev *hdev, struct sk_buff *skb)
 
                if (sock_queue_rcv_skb(sk, nskb))
                        kfree_skb(nskb);
-               
        }
        read_unlock(&hci_sk_list.lock);
 }
@@ -191,7 +186,7 @@ static inline int hci_sock_bound_ioctl(struct sock *sk, unsigned int cmd, unsign
                return 0;
 
        case HCIGETCONNINFO:
-               return hci_get_conn_info(hdev, arg);
+               return hci_get_conn_info(hdev, (void __user *)arg);
 
        default:
                if (hdev->ioctl)
@@ -203,19 +198,20 @@ static inline int hci_sock_bound_ioctl(struct sock *sk, unsigned int cmd, unsign
 static int hci_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
 {
        struct sock *sk = sock->sk;
+       void __user *argp = (void __user *)arg;
        int err;
 
        BT_DBG("cmd %x arg %lx", cmd, arg);
 
        switch (cmd) {
        case HCIGETDEVLIST:
-               return hci_get_dev_list(arg);
+               return hci_get_dev_list(argp);
 
        case HCIGETDEVINFO:
-               return hci_get_dev_info(arg);
+               return hci_get_dev_info(argp);
 
        case HCIGETCONNLIST:
-               return hci_get_conn_list(arg);
+               return hci_get_conn_list(argp);
 
        case HCIDEVUP:
                if (!capable(CAP_NET_ADMIN))
@@ -247,10 +243,10 @@ static int hci_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long a
        case HCISETSCOMTU:
                if (!capable(CAP_NET_ADMIN))
                        return -EACCES;
-               return hci_dev_cmd(cmd, arg);
+               return hci_dev_cmd(cmd, argp);
 
        case HCIINQUIRY:
-               return hci_inquiry(arg);
+               return hci_inquiry(argp);
 
        default:
                lock_sock(sk);
@@ -318,14 +314,14 @@ static inline void hci_sock_cmsg(struct sock *sk, struct msghdr *msg, struct sk_
        __u32 mask = hci_pi(sk)->cmsg_mask;
 
        if (mask & HCI_CMSG_DIR)
-               put_cmsg(msg, SOL_HCI, HCI_CMSG_DIR, sizeof(int), &bt_cb(skb)->incoming);
+               put_cmsg(msg, SOL_HCI, HCI_CMSG_DIR, sizeof(int), &bt_cb(skb)->incoming);
 
        if (mask & HCI_CMSG_TSTAMP)
-               put_cmsg(msg, SOL_HCI, HCI_CMSG_TSTAMP, sizeof(skb->stamp), &skb->stamp);
+               put_cmsg(msg, SOL_HCI, HCI_CMSG_TSTAMP, sizeof(skb->stamp), &skb->stamp);
 }
  
 static int hci_sock_recvmsg(struct kiocb *iocb, struct socket *sock, 
-                           struct msghdr *msg, size_t len, int flags)
+                               struct msghdr *msg, size_t len, int flags)
 {
        int noblock = flags & MSG_DONTWAIT;
        struct sock *sk = sock->sk;
@@ -355,7 +351,7 @@ static int hci_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
        err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
 
        hci_sock_cmsg(sk, msg, skb);
-       
+
        skb_free_datagram(sk, skb);
 
        return err ? : copied;
@@ -406,7 +402,7 @@ static int hci_sock_sendmsg(struct kiocb *iocb, struct socket *sock,
 
                if (((ogf > HCI_SFLT_MAX_OGF) ||
                                !hci_test_bit(ocf & HCI_FLT_OCF_BITS, &hci_sec_filter.ocf_mask[ogf])) &&
-                                       !capable(CAP_NET_RAW)) {
+                                       !capable(CAP_NET_RAW)) {
                        err = -EPERM;
                        goto drop;
                }
@@ -439,7 +435,7 @@ drop:
        goto done;
 }
 
-int hci_sock_setsockopt(struct socket *sock, int level, int optname, char *optval, int len)
+int hci_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, int len)
 {
        struct hci_ufilter uf = { .opcode = 0 };
        struct sock *sk = sock->sk;
@@ -451,7 +447,7 @@ int hci_sock_setsockopt(struct socket *sock, int level, int optname, char *optva
 
        switch (optname) {
        case HCI_DATA_DIR:
-               if (get_user(opt, (int *)optval)) {
+               if (get_user(opt, (int __user *)optval)) {
                        err = -EFAULT;
                        break;
                }
@@ -463,7 +459,7 @@ int hci_sock_setsockopt(struct socket *sock, int level, int optname, char *optva
                break;
 
        case HCI_TIME_STAMP:
-               if (get_user(opt, (int *)optval)) {
+               if (get_user(opt, (int __user *)optval)) {
                        err = -EFAULT;
                        break;
                }
@@ -487,9 +483,9 @@ int hci_sock_setsockopt(struct socket *sock, int level, int optname, char *optva
                        uf.event_mask[1] &= *((u32 *) hci_sec_filter.event_mask + 1);
                }
 
-               {       
+               {
                        struct hci_filter *f = &hci_pi(sk)->filter;
-               
+
                        f->type_mask = uf.type_mask;
                        f->opcode    = uf.opcode;
                        *((u32 *) f->event_mask + 0) = uf.event_mask[0];
@@ -501,12 +497,12 @@ int hci_sock_setsockopt(struct socket *sock, int level, int optname, char *optva
                err = -ENOPROTOOPT;
                break;
        }
-       
+
        release_sock(sk);
        return err;
 }
 
-int hci_sock_getsockopt(struct socket *sock, int level, int optname, char *optval, int *optlen)
+int hci_sock_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen)
 {
        struct hci_ufilter uf;
        struct sock *sk = sock->sk;
@@ -539,7 +535,7 @@ int hci_sock_getsockopt(struct socket *sock, int level, int optname, char *optva
        case HCI_FILTER:
                {
                        struct hci_filter *f = &hci_pi(sk)->filter;
-               
+
                        uf.type_mask = f->type_mask;
                        uf.opcode    = f->opcode;
                        uf.event_mask[0] = *((u32 *) f->event_mask + 0);
@@ -560,23 +556,23 @@ int hci_sock_getsockopt(struct socket *sock, int level, int optname, char *optva
 }
 
 struct proto_ops hci_sock_ops = {
-       .family =       PF_BLUETOOTH,
-       .owner =        THIS_MODULE,
-       .release =      hci_sock_release,
-       .bind =         hci_sock_bind,
-       .getname =      hci_sock_getname,
-       .sendmsg =      hci_sock_sendmsg,
-       .recvmsg =      hci_sock_recvmsg,
-       .ioctl =        hci_sock_ioctl,
-       .poll =         datagram_poll,
-       .listen =       sock_no_listen,
-       .shutdown =     sock_no_shutdown,
-       .setsockopt =   hci_sock_setsockopt,
-       .getsockopt =   hci_sock_getsockopt,
-       .connect =      sock_no_connect,
-       .socketpair =   sock_no_socketpair,
-       .accept =       sock_no_accept,
-       .mmap =         sock_no_mmap
+       .family         = PF_BLUETOOTH,
+       .owner          = THIS_MODULE,
+       .release        = hci_sock_release,
+       .bind           = hci_sock_bind,
+       .getname        = hci_sock_getname,
+       .sendmsg        = hci_sock_sendmsg,
+       .recvmsg        = hci_sock_recvmsg,
+       .ioctl          = hci_sock_ioctl,
+       .poll           = datagram_poll,
+       .listen         = sock_no_listen,
+       .shutdown       = sock_no_shutdown,
+       .setsockopt     = hci_sock_setsockopt,
+       .getsockopt     = hci_sock_getsockopt,
+       .connect        = sock_no_connect,
+       .socketpair     = sock_no_socketpair,
+       .accept         = sock_no_accept,
+       .mmap           = sock_no_mmap
 };
 
 static int hci_sock_create(struct socket *sock, int protocol)
@@ -597,7 +593,7 @@ static int hci_sock_create(struct socket *sock, int protocol)
        sk_set_owner(sk, THIS_MODULE);
 
        sock->state = SS_UNCONNECTED;
-       sk->sk_state   = BT_OPEN;
+       sk->sk_state = BT_OPEN;
 
        bt_sock_link(&hci_sk_list, sk);
        return 0;
@@ -607,14 +603,14 @@ static int hci_sock_dev_event(struct notifier_block *this, unsigned long event,
 {
        struct hci_dev *hdev = (struct hci_dev *) ptr;
        struct hci_ev_si_device ev;
-       
+
        BT_DBG("hdev %s event %ld", hdev->name, event);
 
        /* Send event to sockets */
        ev.event  = event;
        ev.dev_id = hdev->id;
        hci_si_event(NULL, HCI_EV_SI_DEVICE, sizeof(ev), &ev);
-       
+
        if (event == HCI_DEV_UNREG) {
                struct sock *sk;
                struct hlist_node *node;
@@ -640,9 +636,9 @@ static int hci_sock_dev_event(struct notifier_block *this, unsigned long event,
 }
 
 struct net_proto_family hci_sock_family_ops = {
-       .family = PF_BLUETOOTH,
+       .family = PF_BLUETOOTH,
        .owner  = THIS_MODULE,
-       .create = hci_sock_create,
+       .create = hci_sock_create,
 };
 
 struct notifier_block hci_sock_nblock = {