]> granicus.if.org Git - python/commitdiff
Patch #1432399: Add HCI sockets.
authorMartin v. Löwis <martin@v.loewis.de>
Wed, 14 Feb 2007 10:07:37 +0000 (10:07 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Wed, 14 Feb 2007 10:07:37 +0000 (10:07 +0000)
Misc/NEWS
Modules/socketmodule.c
Modules/socketmodule.h

index 9cd7070e9bc81027d7496288b6f925a96a8b5722..4a1481b03d0192847d0480143996acbb2fac16b4 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -366,6 +366,8 @@ Library
 Extension Modules
 -----------------
 
+- Patch #1432399: Support the HCI protocol for bluetooth sockets
+
 - Patch #1657276: Make NETLINK_DNRTMSG conditional.
 
 - Bug #1653736: Complain about keyword arguments to time.isoformat.
index 7ef2e0431e86178e1ff6c753f9e09c77eae2dc65..d79db2735c8c7aaa1a679932cbe7df73019c7481 100644 (file)
@@ -362,20 +362,25 @@ const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
 #if defined(__FreeBSD__)
 #define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
 #define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
+#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
 #define sockaddr_l2 sockaddr_l2cap
 #define sockaddr_rc sockaddr_rfcomm
 #define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
 #define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
+#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
 #elif defined(__NetBSD__)
 #define sockaddr_l2 sockaddr_bt
 #define sockaddr_rc sockaddr_bt
+#define sockaddr_hci sockaddr_bt
 #define sockaddr_sco sockaddr_bt
 #define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
 #define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
+#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
 #define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
 #else
 #define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
 #define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
+#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
 #define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
 #endif
 #endif
@@ -1119,6 +1124,14 @@ makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto)
                        return ret;
                }
 
+               case BTPROTO_HCI:
+               {
+                       struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
+                       PyObject *ret = NULL;
+                       ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
+                       return ret;
+               }
+
 #if !defined(__FreeBSD__)
                case BTPROTO_SCO:
                {
@@ -1347,6 +1360,19 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
                        *len_ret = sizeof *addr;
                        return 1;
                }
+               case BTPROTO_HCI:
+               {
+                       struct sockaddr_hci *addr = (struct sockaddr_hci *) _BT_SOCKADDR_MEMB(s, hci);
+                       _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
+                       if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
+                               PyErr_SetString(socket_error, "getsockaddrarg: "
+                                               "wrong format");
+                               return 0;
+                       }
+                       *addr_ret = (struct sockaddr *) addr;
+                       *len_ret = sizeof *addr;
+                       return 1;
+               }
 #if !defined(__FreeBSD__)
                case BTPROTO_SCO:
                {
@@ -1485,6 +1511,9 @@ getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
                case BTPROTO_RFCOMM:
                        *len_ret = sizeof (struct sockaddr_rc);
                        return 1;
+               case BTPROTO_HCI:
+                       *len_ret = sizeof (struct sockaddr_hci);
+                       return 1;
 #if !defined(__FreeBSD__)
                case BTPROTO_SCO:
                        *len_ret = sizeof (struct sockaddr_sco);
@@ -4430,6 +4459,11 @@ init_socket(void)
 #ifdef USE_BLUETOOTH
        PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
        PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
+       PyModule_AddIntConstant(m, "BTPROTO_HCI", BTPROTO_HCI);
+       PyModule_AddIntConstant(m, "SOL_HCI", SOL_HCI);
+       PyModule_AddIntConstant(m, "HCI_TIME_STAMP", HCI_TIME_STAMP);
+       PyModule_AddIntConstant(m, "HCI_DATA_DIR", HCI_DATA_DIR);
+       PyModule_AddIntConstant(m, "HCI_FILTER", HCI_FILTER);
 #if !defined(__FreeBSD__)
        PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
 #endif
index 84f2422f418283c57d5a82e473431982705e1f08..a4382abd91d31d680c1d3cb715ae0e125c8e67bb 100644 (file)
@@ -46,6 +46,7 @@
 #include <bluetooth/rfcomm.h>
 #include <bluetooth/l2cap.h>
 #include <bluetooth/sco.h>
+#include <bluetooth/hci.h>
 #endif
 
 #ifdef HAVE_BLUETOOTH_H
@@ -98,6 +99,7 @@ typedef union sock_addr {
        struct sockaddr_l2 bt_l2;
        struct sockaddr_rc bt_rc;
        struct sockaddr_sco bt_sco;
+       struct sockaddr_hci bt_hci;
 #endif
 #ifdef HAVE_NETPACKET_PACKET_H
        struct sockaddr_ll ll;