@@ -460,39 +460,44 @@ remove_unusable_flags(PyObject *m) |
460 | 460 | # define SOCKETCLOSE close |
461 | 461 | #endif |
462 | 462 |
|
463 | | -#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__) |
464 | | -#define USE_BLUETOOTH 1 |
465 | | -#if defined(__FreeBSD__) |
466 | | -#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP |
467 | | -#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM |
468 | | -#define BTPROTO_HCI BLUETOOTH_PROTO_HCI |
469 | | -#define BTPROTO_SCO BLUETOOTH_PROTO_SCO |
470 | | -#define SOL_HCI SOL_HCI_RAW |
471 | | -#define HCI_FILTER SO_HCI_RAW_FILTER |
472 | | -#define sockaddr_l2 sockaddr_l2cap |
473 | | -#define sockaddr_rc sockaddr_rfcomm |
474 | | -#define hci_dev hci_node |
475 | | -#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb) |
476 | | -#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb) |
477 | | -#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb) |
478 | | -#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb) |
479 | | -#elif defined(__NetBSD__) || defined(__DragonFly__) |
480 | | -#define sockaddr_l2 sockaddr_bt |
481 | | -#define sockaddr_rc sockaddr_bt |
482 | | -#define sockaddr_hci sockaddr_bt |
483 | | -#define sockaddr_sco sockaddr_bt |
484 | | -#define SOL_HCI BTPROTO_HCI |
485 | | -#define HCI_DATA_DIR SO_HCI_DIRECTION |
486 | | -#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb) |
487 | | -#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb) |
488 | | -#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb) |
489 | | -#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb) |
490 | | -#else |
491 | | -#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb) |
492 | | -#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb) |
493 | | -#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb) |
494 | | -#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb) |
495 | | -#endif |
| 463 | +#if defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H) |
| 464 | +# define USE_BLUETOOTH 1 |
| 465 | +# if defined(HAVE_BLUETOOTH_BLUETOOTH_H) // Linux |
| 466 | +# define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb) |
| 467 | +# define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb) |
| 468 | +# define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb) |
| 469 | +# define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb) |
| 470 | +# elif defined(__FreeBSD__) |
| 471 | +# define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP |
| 472 | +# define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM |
| 473 | +# define BTPROTO_HCI BLUETOOTH_PROTO_HCI |
| 474 | +# define BTPROTO_SCO BLUETOOTH_PROTO_SCO |
| 475 | +# define SOL_HCI SOL_HCI_RAW |
| 476 | +# define HCI_FILTER SO_HCI_RAW_FILTER |
| 477 | +# define sockaddr_l2 sockaddr_l2cap |
| 478 | +# define sockaddr_rc sockaddr_rfcomm |
| 479 | +# define hci_dev hci_node |
| 480 | +# define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb) |
| 481 | +# define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb) |
| 482 | +# define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb) |
| 483 | +# define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb) |
| 484 | +# else // NetBSD, DragonFly BSD |
| 485 | +# define sockaddr_l2 sockaddr_bt |
| 486 | +# define sockaddr_rc sockaddr_bt |
| 487 | +# define sockaddr_hci sockaddr_bt |
| 488 | +# define sockaddr_sco sockaddr_bt |
| 489 | +# define bt_l2 bt |
| 490 | +# define bt_rc bt |
| 491 | +# define bt_sco bt |
| 492 | +# define bt_hci bt |
| 493 | +# define bt_cid bt_channel |
| 494 | +# define SOL_HCI BTPROTO_HCI |
| 495 | +# define HCI_DATA_DIR SO_HCI_DIRECTION |
| 496 | +# define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb) |
| 497 | +# define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb) |
| 498 | +# define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb) |
| 499 | +# define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb) |
| 500 | +# endif |
496 | 501 | #endif |
497 | 502 |
|
498 | 503 | #ifdef MS_WINDOWS_DESKTOP |
@@ -1487,20 +1492,28 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto) |
1487 | 1492 | PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr)); |
1488 | 1493 | PyObject *ret = NULL; |
1489 | 1494 | if (addrobj) { |
1490 | | - /* Retain old format for non-LE address. |
1491 | | - (cid may be set for BR/EDR, but we're discarding it for now) |
1492 | | - */ |
1493 | | - if (_BT_L2_MEMB(a, bdaddr_type) == BDADDR_BREDR) { |
1494 | | - ret = Py_BuildValue("Oi", |
1495 | | - addrobj, |
1496 | | - _BT_L2_MEMB(a, psm)); |
1497 | | - } else { |
| 1495 | +#if defined(BDADDR_BREDR) // Linux, FreeBSD |
| 1496 | + if (_BT_L2_MEMB(a, bdaddr_type) != BDADDR_BREDR) { |
1498 | 1497 | ret = Py_BuildValue("OiiB", |
1499 | 1498 | addrobj, |
1500 | 1499 | _BT_L2_MEMB(a, psm), |
1501 | 1500 | _BT_L2_MEMB(a, cid), |
1502 | 1501 | _BT_L2_MEMB(a, bdaddr_type)); |
1503 | 1502 | } |
| 1503 | + else |
| 1504 | +#endif |
| 1505 | + if (_BT_L2_MEMB(a, cid) != 0) { |
| 1506 | + ret = Py_BuildValue("Oii", |
| 1507 | + addrobj, |
| 1508 | + _BT_L2_MEMB(a, psm), |
| 1509 | + _BT_L2_MEMB(a, cid)); |
| 1510 | + } |
| 1511 | + else { |
| 1512 | + /* Retain old format for non-LE address. */ |
| 1513 | + ret = Py_BuildValue("Oi", |
| 1514 | + addrobj, |
| 1515 | + _BT_L2_MEMB(a, psm)); |
| 1516 | + } |
1504 | 1517 | Py_DECREF(addrobj); |
1505 | 1518 | } |
1506 | 1519 | return ret; |
@@ -1526,16 +1539,16 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto) |
1526 | 1539 | case BTPROTO_HCI: |
1527 | 1540 | { |
1528 | 1541 | struct sockaddr_hci *a = (struct sockaddr_hci *) addr; |
1529 | | -#if defined(__NetBSD__) || defined(__DragonFly__) |
1530 | | - return makebdaddr(&_BT_HCI_MEMB(a, bdaddr)); |
| 1542 | +#if defined(HAVE_BLUETOOTH_BLUETOOTH_H) |
| 1543 | + PyObject *ret = NULL; |
| 1544 | + ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev)); |
| 1545 | + return ret; |
1531 | 1546 | #elif defined(__FreeBSD__) |
1532 | | - char *node = _BT_HCI_MEMB(a, node); |
| 1547 | + const char *node = _BT_HCI_MEMB(a, node); |
1533 | 1548 | size_t len = strnlen(node, sizeof(_BT_HCI_MEMB(a, node))); |
1534 | 1549 | return PyBytes_FromStringAndSize(node, (Py_ssize_t)len); |
1535 | 1550 | #else |
1536 | | - PyObject *ret = NULL; |
1537 | | - ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev)); |
1538 | | - return ret; |
| 1551 | + return makebdaddr(&_BT_HCI_MEMB(a, bdaddr)); |
1539 | 1552 | #endif |
1540 | 1553 | } |
1541 | 1554 | #endif /* BTPROTO_HCI */ |
@@ -2060,6 +2073,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, |
2060 | 2073 | memset(addr, 0, sizeof(struct sockaddr_l2)); |
2061 | 2074 | _BT_L2_MEMB(addr, family) = AF_BLUETOOTH; |
2062 | 2075 | unsigned short psm; |
| 2076 | +#if defined(BDADDR_BREDR) // Linux, FreeBSD |
2063 | 2077 | unsigned short cid = 0; |
2064 | 2078 | unsigned char bdaddr_type = BDADDR_BREDR; |
2065 | 2079 | if (!PyArg_ParseTuple(args, "sH|HB", &straddr, |
@@ -2070,9 +2084,18 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, |
2070 | 2084 | "%s(): wrong format", caller); |
2071 | 2085 | return 0; |
2072 | 2086 | } |
| 2087 | + _BT_L2_MEMB(addr, bdaddr_type) = bdaddr_type; |
| 2088 | +#else |
| 2089 | + unsigned char cid = 0; |
| 2090 | + if (!PyArg_ParseTuple(args, "sH|B", &straddr, |
| 2091 | + &psm, &cid)) { |
| 2092 | + PyErr_Format(PyExc_OSError, |
| 2093 | + "%s(): wrong format", caller); |
| 2094 | + return 0; |
| 2095 | + } |
| 2096 | +#endif |
2073 | 2097 | _BT_L2_MEMB(addr, psm) = psm; |
2074 | 2098 | _BT_L2_MEMB(addr, cid) = cid; |
2075 | | - _BT_L2_MEMB(addr, bdaddr_type) = bdaddr_type; |
2076 | 2099 |
|
2077 | 2100 | if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0) |
2078 | 2101 | return 0; |
@@ -2113,19 +2136,16 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, |
2113 | 2136 | { |
2114 | 2137 | struct sockaddr_hci *addr = &addrbuf->bt_hci; |
2115 | 2138 | memset(addr, 0, sizeof(struct sockaddr_hci)); |
2116 | | -#if defined(__NetBSD__) || defined(__DragonFly__) |
2117 | | - const char *straddr; |
2118 | 2139 | _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH; |
2119 | | - if (!PyBytes_Check(args)) { |
2120 | | - PyErr_Format(PyExc_OSError, "%s: " |
2121 | | - "wrong format", caller); |
| 2140 | +#if defined(HAVE_BLUETOOTH_BLUETOOTH_H) |
| 2141 | + unsigned short dev = _BT_HCI_MEMB(addr, dev); |
| 2142 | + if (!PyArg_ParseTuple(args, "H", &dev)) { |
| 2143 | + PyErr_Format(PyExc_OSError, |
| 2144 | + "%s(): wrong format", caller); |
2122 | 2145 | return 0; |
2123 | 2146 | } |
2124 | | - straddr = PyBytes_AS_STRING(args); |
2125 | | - if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0) |
2126 | | - return 0; |
| 2147 | + _BT_HCI_MEMB(addr, dev) = dev; |
2127 | 2148 | #elif defined(__FreeBSD__) |
2128 | | - _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH; |
2129 | 2149 | if (!PyBytes_Check(args)) { |
2130 | 2150 | PyErr_Format(PyExc_OSError, "%s: " |
2131 | 2151 | "wrong node format", caller); |
@@ -2146,14 +2166,15 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, |
2146 | 2166 | strncpy(_BT_HCI_MEMB(addr, node), straddr, |
2147 | 2167 | sizeof(_BT_HCI_MEMB(addr, node))); |
2148 | 2168 | #else |
2149 | | - _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH; |
2150 | | - unsigned short dev = _BT_HCI_MEMB(addr, dev); |
2151 | | - if (!PyArg_ParseTuple(args, "H", &dev)) { |
2152 | | - PyErr_Format(PyExc_OSError, |
2153 | | - "%s(): wrong format", caller); |
| 2169 | + const char *straddr; |
| 2170 | + if (!PyBytes_Check(args)) { |
| 2171 | + PyErr_Format(PyExc_OSError, "%s: " |
| 2172 | + "wrong format", caller); |
2154 | 2173 | return 0; |
2155 | 2174 | } |
2156 | | - _BT_HCI_MEMB(addr, dev) = dev; |
| 2175 | + straddr = PyBytes_AS_STRING(args); |
| 2176 | + if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0) |
| 2177 | + return 0; |
2157 | 2178 | #endif |
2158 | 2179 | *len_ret = sizeof *addr; |
2159 | 2180 | return 1; |
@@ -2739,7 +2760,7 @@ getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret) |
2739 | 2760 | case BTPROTO_SCO: |
2740 | 2761 | *len_ret = sizeof (struct sockaddr_sco); |
2741 | 2762 | return 1; |
2742 | | -#endif /* BTPROTO_HCI */ |
| 2763 | +#endif /* BTPROTO_SCO */ |
2743 | 2764 | default: |
2744 | 2765 | PyErr_SetString(PyExc_OSError, "getsockaddrlen: " |
2745 | 2766 | "unknown BT protocol"); |
@@ -7845,20 +7866,22 @@ socket_exec(PyObject *m) |
7845 | 7866 | ADD_INT_MACRO(m, AF_BLUETOOTH); |
7846 | 7867 | #ifdef BTPROTO_L2CAP |
7847 | 7868 | ADD_INT_MACRO(m, BTPROTO_L2CAP); |
| 7869 | +#if defined(BDADDR_BREDR) |
7848 | 7870 | ADD_INT_MACRO(m, BDADDR_BREDR); |
7849 | 7871 | ADD_INT_MACRO(m, BDADDR_LE_PUBLIC); |
7850 | 7872 | ADD_INT_MACRO(m, BDADDR_LE_RANDOM); |
| 7873 | +#endif |
7851 | 7874 | #endif /* BTPROTO_L2CAP */ |
7852 | 7875 | #ifdef BTPROTO_HCI |
7853 | 7876 | ADD_INT_MACRO(m, BTPROTO_HCI); |
7854 | 7877 | ADD_INT_MACRO(m, SOL_HCI); |
7855 | | -#if !defined(__NetBSD__) && !defined(__DragonFly__) |
| 7878 | +#if defined(HCI_FILTER) |
7856 | 7879 | ADD_INT_MACRO(m, HCI_FILTER); |
7857 | | -#if !defined(__FreeBSD__) |
| 7880 | +#endif |
| 7881 | +#if defined(HCI_TIME_STAMP) |
7858 | 7882 | ADD_INT_MACRO(m, HCI_TIME_STAMP); |
7859 | 7883 | ADD_INT_MACRO(m, HCI_DATA_DIR); |
7860 | | -#endif /* !__FreeBSD__ */ |
7861 | | -#endif /* !__NetBSD__ && !__DragonFly__ */ |
| 7884 | +#endif |
7862 | 7885 | #endif /* BTPROTO_HCI */ |
7863 | 7886 | #ifdef BTPROTO_RFCOMM |
7864 | 7887 | ADD_INT_MACRO(m, BTPROTO_RFCOMM); |
|