mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
gh-132429: Fix support of Bluetooth sockets on NetBSD and DragonFly BSD (GH-132431)
* Also add support for cid and bdaddr_type in the BTPROTO_L2CAP address on FreeBSD. * Return cid in getsockname() for BTPROTO_L2CAP if it is not zero. * Fix a compiler warning on FreeBSD.
This commit is contained in:
parent
9634085af3
commit
f2f86d3f45
4 changed files with 125 additions and 84 deletions
|
@ -2643,36 +2643,44 @@ class BasicBluetoothTest(unittest.TestCase):
|
||||||
|
|
||||||
@unittest.skipUnless(HAVE_SOCKET_BLUETOOTH_L2CAP, 'Bluetooth L2CAP sockets required for this test')
|
@unittest.skipUnless(HAVE_SOCKET_BLUETOOTH_L2CAP, 'Bluetooth L2CAP sockets required for this test')
|
||||||
def testBindLeAttL2capSocket(self):
|
def testBindLeAttL2capSocket(self):
|
||||||
|
BDADDR_LE_PUBLIC = support.get_attribute(socket, 'BDADDR_LE_PUBLIC')
|
||||||
with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_L2CAP) as f:
|
with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_L2CAP) as f:
|
||||||
# ATT is the only CID allowed in userspace by the Linux kernel
|
# ATT is the only CID allowed in userspace by the Linux kernel
|
||||||
CID_ATT = 4
|
CID_ATT = 4
|
||||||
f.bind((socket.BDADDR_ANY, 0, CID_ATT, socket.BDADDR_LE_PUBLIC))
|
f.bind((socket.BDADDR_ANY, 0, CID_ATT, BDADDR_LE_PUBLIC))
|
||||||
addr = f.getsockname()
|
addr = f.getsockname()
|
||||||
self.assertEqual(addr, (socket.BDADDR_ANY, 0, CID_ATT, socket.BDADDR_LE_PUBLIC))
|
self.assertEqual(addr, (socket.BDADDR_ANY, 0, CID_ATT, BDADDR_LE_PUBLIC))
|
||||||
|
|
||||||
@unittest.skipUnless(HAVE_SOCKET_BLUETOOTH_L2CAP, 'Bluetooth L2CAP sockets required for this test')
|
@unittest.skipUnless(HAVE_SOCKET_BLUETOOTH_L2CAP, 'Bluetooth L2CAP sockets required for this test')
|
||||||
def testBindLePsmL2capSocket(self):
|
def testBindLePsmL2capSocket(self):
|
||||||
|
BDADDR_LE_RANDOM = support.get_attribute(socket, 'BDADDR_LE_RANDOM')
|
||||||
with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_L2CAP) as f:
|
with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_L2CAP) as f:
|
||||||
# First user PSM in LE L2CAP
|
# First user PSM in LE L2CAP
|
||||||
psm = 0x80
|
psm = 0x80
|
||||||
f.bind((socket.BDADDR_ANY, psm, 0, socket.BDADDR_LE_RANDOM))
|
f.bind((socket.BDADDR_ANY, psm, 0, BDADDR_LE_RANDOM))
|
||||||
addr = f.getsockname()
|
addr = f.getsockname()
|
||||||
self.assertEqual(addr, (socket.BDADDR_ANY, psm, 0, socket.BDADDR_LE_RANDOM))
|
self.assertEqual(addr, (socket.BDADDR_ANY, psm, 0, BDADDR_LE_RANDOM))
|
||||||
|
|
||||||
@unittest.skipUnless(HAVE_SOCKET_BLUETOOTH_L2CAP, 'Bluetooth L2CAP sockets required for this test')
|
@unittest.skipUnless(HAVE_SOCKET_BLUETOOTH_L2CAP, 'Bluetooth L2CAP sockets required for this test')
|
||||||
def testBindBrEdrL2capSocket(self):
|
def testBindBrEdrL2capSocket(self):
|
||||||
|
# First user PSM in BR/EDR L2CAP
|
||||||
|
psm = 0x1001
|
||||||
with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_L2CAP) as f:
|
with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_L2CAP) as f:
|
||||||
# First user PSM in BR/EDR L2CAP
|
|
||||||
psm = 0x1001
|
|
||||||
f.bind((socket.BDADDR_ANY, psm))
|
f.bind((socket.BDADDR_ANY, psm))
|
||||||
addr = f.getsockname()
|
addr = f.getsockname()
|
||||||
self.assertEqual(addr, (socket.BDADDR_ANY, psm))
|
self.assertEqual(addr, (socket.BDADDR_ANY, psm))
|
||||||
|
|
||||||
|
cid = 1
|
||||||
|
with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_L2CAP) as f:
|
||||||
|
f.bind((socket.BDADDR_ANY, psm, cid))
|
||||||
|
addr = f.getsockname()
|
||||||
|
self.assertEqual(addr, (socket.BDADDR_ANY, psm, cid))
|
||||||
|
|
||||||
@unittest.skipUnless(HAVE_SOCKET_BLUETOOTH_L2CAP, 'Bluetooth L2CAP sockets required for this test')
|
@unittest.skipUnless(HAVE_SOCKET_BLUETOOTH_L2CAP, 'Bluetooth L2CAP sockets required for this test')
|
||||||
def testBadL2capAddr(self):
|
def testBadL2capAddr(self):
|
||||||
with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_L2CAP) as f:
|
with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_L2CAP) as f:
|
||||||
with self.assertRaises(OSError):
|
with self.assertRaises(OSError):
|
||||||
f.bind((socket.BDADDR_ANY, 0, 0, socket.BDADDR_BREDR, 0))
|
f.bind((socket.BDADDR_ANY, 0, 0, 0, 0))
|
||||||
with self.assertRaises(OSError):
|
with self.assertRaises(OSError):
|
||||||
f.bind((socket.BDADDR_ANY,))
|
f.bind((socket.BDADDR_ANY,))
|
||||||
with self.assertRaises(OSError):
|
with self.assertRaises(OSError):
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
Fix support of Bluetooth sockets on NetBSD and DragonFly BSD. Add support
|
||||||
|
for *cid* and *bdaddr_type* in the BTPROTO_L2CAP address on FreeBSD. Return
|
||||||
|
*cid* in ``getsockname()`` for BTPROTO_L2CAP if it is not zero.
|
|
@ -460,39 +460,44 @@ remove_unusable_flags(PyObject *m)
|
||||||
# define SOCKETCLOSE close
|
# define SOCKETCLOSE close
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
|
#if defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)
|
||||||
#define USE_BLUETOOTH 1
|
# define USE_BLUETOOTH 1
|
||||||
#if defined(__FreeBSD__)
|
# if defined(HAVE_BLUETOOTH_BLUETOOTH_H) // Linux
|
||||||
#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
|
# define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
|
||||||
#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
|
# define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
|
||||||
#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
|
# define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
|
||||||
#define BTPROTO_SCO BLUETOOTH_PROTO_SCO
|
# define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
|
||||||
#define SOL_HCI SOL_HCI_RAW
|
# elif defined(__FreeBSD__)
|
||||||
#define HCI_FILTER SO_HCI_RAW_FILTER
|
# define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
|
||||||
#define sockaddr_l2 sockaddr_l2cap
|
# define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
|
||||||
#define sockaddr_rc sockaddr_rfcomm
|
# define BTPROTO_HCI BLUETOOTH_PROTO_HCI
|
||||||
#define hci_dev hci_node
|
# define BTPROTO_SCO BLUETOOTH_PROTO_SCO
|
||||||
#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
|
# define SOL_HCI SOL_HCI_RAW
|
||||||
#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
|
# define HCI_FILTER SO_HCI_RAW_FILTER
|
||||||
#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
|
# define sockaddr_l2 sockaddr_l2cap
|
||||||
#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
|
# define sockaddr_rc sockaddr_rfcomm
|
||||||
#elif defined(__NetBSD__) || defined(__DragonFly__)
|
# define hci_dev hci_node
|
||||||
#define sockaddr_l2 sockaddr_bt
|
# define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
|
||||||
#define sockaddr_rc sockaddr_bt
|
# define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
|
||||||
#define sockaddr_hci sockaddr_bt
|
# define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
|
||||||
#define sockaddr_sco sockaddr_bt
|
# define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
|
||||||
#define SOL_HCI BTPROTO_HCI
|
# else // NetBSD, DragonFly BSD
|
||||||
#define HCI_DATA_DIR SO_HCI_DIRECTION
|
# define sockaddr_l2 sockaddr_bt
|
||||||
#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
|
# define sockaddr_rc sockaddr_bt
|
||||||
#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
|
# define sockaddr_hci sockaddr_bt
|
||||||
#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
|
# define sockaddr_sco sockaddr_bt
|
||||||
#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
|
# define bt_l2 bt
|
||||||
#else
|
# define bt_rc bt
|
||||||
#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
|
# define bt_sco bt
|
||||||
#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
|
# define bt_hci bt
|
||||||
#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
|
# define bt_cid bt_channel
|
||||||
#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
|
# define SOL_HCI BTPROTO_HCI
|
||||||
#endif
|
# define HCI_DATA_DIR SO_HCI_DIRECTION
|
||||||
|
# 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)
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MS_WINDOWS_DESKTOP
|
#ifdef MS_WINDOWS_DESKTOP
|
||||||
|
@ -1487,20 +1492,28 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
|
||||||
PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
|
PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
|
||||||
PyObject *ret = NULL;
|
PyObject *ret = NULL;
|
||||||
if (addrobj) {
|
if (addrobj) {
|
||||||
/* Retain old format for non-LE address.
|
#if defined(BDADDR_BREDR) // Linux, FreeBSD
|
||||||
(cid may be set for BR/EDR, but we're discarding it for now)
|
if (_BT_L2_MEMB(a, bdaddr_type) != BDADDR_BREDR) {
|
||||||
*/
|
|
||||||
if (_BT_L2_MEMB(a, bdaddr_type) == BDADDR_BREDR) {
|
|
||||||
ret = Py_BuildValue("Oi",
|
|
||||||
addrobj,
|
|
||||||
_BT_L2_MEMB(a, psm));
|
|
||||||
} else {
|
|
||||||
ret = Py_BuildValue("OiiB",
|
ret = Py_BuildValue("OiiB",
|
||||||
addrobj,
|
addrobj,
|
||||||
_BT_L2_MEMB(a, psm),
|
_BT_L2_MEMB(a, psm),
|
||||||
_BT_L2_MEMB(a, cid),
|
_BT_L2_MEMB(a, cid),
|
||||||
_BT_L2_MEMB(a, bdaddr_type));
|
_BT_L2_MEMB(a, bdaddr_type));
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
if (_BT_L2_MEMB(a, cid) != 0) {
|
||||||
|
ret = Py_BuildValue("Oii",
|
||||||
|
addrobj,
|
||||||
|
_BT_L2_MEMB(a, psm),
|
||||||
|
_BT_L2_MEMB(a, cid));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* Retain old format for non-LE address. */
|
||||||
|
ret = Py_BuildValue("Oi",
|
||||||
|
addrobj,
|
||||||
|
_BT_L2_MEMB(a, psm));
|
||||||
|
}
|
||||||
Py_DECREF(addrobj);
|
Py_DECREF(addrobj);
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -1526,16 +1539,16 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
|
||||||
case BTPROTO_HCI:
|
case BTPROTO_HCI:
|
||||||
{
|
{
|
||||||
struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
|
struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
|
||||||
#if defined(__NetBSD__) || defined(__DragonFly__)
|
#if defined(HAVE_BLUETOOTH_BLUETOOTH_H)
|
||||||
return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
|
|
||||||
#elif defined(__FreeBSD__)
|
|
||||||
char *node = _BT_HCI_MEMB(a, node);
|
|
||||||
size_t len = strnlen(node, sizeof(_BT_HCI_MEMB(a, node)));
|
|
||||||
return PyBytes_FromStringAndSize(node, (Py_ssize_t)len);
|
|
||||||
#else
|
|
||||||
PyObject *ret = NULL;
|
PyObject *ret = NULL;
|
||||||
ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
|
ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
|
||||||
return ret;
|
return ret;
|
||||||
|
#elif defined(__FreeBSD__)
|
||||||
|
const char *node = _BT_HCI_MEMB(a, node);
|
||||||
|
size_t len = strnlen(node, sizeof(_BT_HCI_MEMB(a, node)));
|
||||||
|
return PyBytes_FromStringAndSize(node, (Py_ssize_t)len);
|
||||||
|
#else
|
||||||
|
return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#endif /* BTPROTO_HCI */
|
#endif /* BTPROTO_HCI */
|
||||||
|
@ -2060,6 +2073,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
|
||||||
memset(addr, 0, sizeof(struct sockaddr_l2));
|
memset(addr, 0, sizeof(struct sockaddr_l2));
|
||||||
_BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
|
_BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
|
||||||
unsigned short psm;
|
unsigned short psm;
|
||||||
|
#if defined(BDADDR_BREDR) // Linux, FreeBSD
|
||||||
unsigned short cid = 0;
|
unsigned short cid = 0;
|
||||||
unsigned char bdaddr_type = BDADDR_BREDR;
|
unsigned char bdaddr_type = BDADDR_BREDR;
|
||||||
if (!PyArg_ParseTuple(args, "sH|HB", &straddr,
|
if (!PyArg_ParseTuple(args, "sH|HB", &straddr,
|
||||||
|
@ -2070,9 +2084,18 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
|
||||||
"%s(): wrong format", caller);
|
"%s(): wrong format", caller);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
_BT_L2_MEMB(addr, bdaddr_type) = bdaddr_type;
|
||||||
|
#else
|
||||||
|
unsigned char cid = 0;
|
||||||
|
if (!PyArg_ParseTuple(args, "sH|B", &straddr,
|
||||||
|
&psm, &cid)) {
|
||||||
|
PyErr_Format(PyExc_OSError,
|
||||||
|
"%s(): wrong format", caller);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
_BT_L2_MEMB(addr, psm) = psm;
|
_BT_L2_MEMB(addr, psm) = psm;
|
||||||
_BT_L2_MEMB(addr, cid) = cid;
|
_BT_L2_MEMB(addr, cid) = cid;
|
||||||
_BT_L2_MEMB(addr, bdaddr_type) = bdaddr_type;
|
|
||||||
|
|
||||||
if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
|
if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -2113,19 +2136,16 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
|
||||||
{
|
{
|
||||||
struct sockaddr_hci *addr = &addrbuf->bt_hci;
|
struct sockaddr_hci *addr = &addrbuf->bt_hci;
|
||||||
memset(addr, 0, sizeof(struct sockaddr_hci));
|
memset(addr, 0, sizeof(struct sockaddr_hci));
|
||||||
#if defined(__NetBSD__) || defined(__DragonFly__)
|
|
||||||
const char *straddr;
|
|
||||||
_BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
|
_BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
|
||||||
if (!PyBytes_Check(args)) {
|
#if defined(HAVE_BLUETOOTH_BLUETOOTH_H)
|
||||||
PyErr_Format(PyExc_OSError, "%s: "
|
unsigned short dev = _BT_HCI_MEMB(addr, dev);
|
||||||
"wrong format", caller);
|
if (!PyArg_ParseTuple(args, "H", &dev)) {
|
||||||
|
PyErr_Format(PyExc_OSError,
|
||||||
|
"%s(): wrong format", caller);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
straddr = PyBytes_AS_STRING(args);
|
_BT_HCI_MEMB(addr, dev) = dev;
|
||||||
if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
|
|
||||||
return 0;
|
|
||||||
#elif defined(__FreeBSD__)
|
#elif defined(__FreeBSD__)
|
||||||
_BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
|
|
||||||
if (!PyBytes_Check(args)) {
|
if (!PyBytes_Check(args)) {
|
||||||
PyErr_Format(PyExc_OSError, "%s: "
|
PyErr_Format(PyExc_OSError, "%s: "
|
||||||
"wrong node format", caller);
|
"wrong node format", caller);
|
||||||
|
@ -2146,14 +2166,15 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
|
||||||
strncpy(_BT_HCI_MEMB(addr, node), straddr,
|
strncpy(_BT_HCI_MEMB(addr, node), straddr,
|
||||||
sizeof(_BT_HCI_MEMB(addr, node)));
|
sizeof(_BT_HCI_MEMB(addr, node)));
|
||||||
#else
|
#else
|
||||||
_BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
|
const char *straddr;
|
||||||
unsigned short dev = _BT_HCI_MEMB(addr, dev);
|
if (!PyBytes_Check(args)) {
|
||||||
if (!PyArg_ParseTuple(args, "H", &dev)) {
|
PyErr_Format(PyExc_OSError, "%s: "
|
||||||
PyErr_Format(PyExc_OSError,
|
"wrong format", caller);
|
||||||
"%s(): wrong format", caller);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
_BT_HCI_MEMB(addr, dev) = dev;
|
straddr = PyBytes_AS_STRING(args);
|
||||||
|
if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
|
||||||
|
return 0;
|
||||||
#endif
|
#endif
|
||||||
*len_ret = sizeof *addr;
|
*len_ret = sizeof *addr;
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -2739,7 +2760,7 @@ getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
|
||||||
case BTPROTO_SCO:
|
case BTPROTO_SCO:
|
||||||
*len_ret = sizeof (struct sockaddr_sco);
|
*len_ret = sizeof (struct sockaddr_sco);
|
||||||
return 1;
|
return 1;
|
||||||
#endif /* BTPROTO_HCI */
|
#endif /* BTPROTO_SCO */
|
||||||
default:
|
default:
|
||||||
PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
|
PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
|
||||||
"unknown BT protocol");
|
"unknown BT protocol");
|
||||||
|
@ -7845,20 +7866,22 @@ socket_exec(PyObject *m)
|
||||||
ADD_INT_MACRO(m, AF_BLUETOOTH);
|
ADD_INT_MACRO(m, AF_BLUETOOTH);
|
||||||
#ifdef BTPROTO_L2CAP
|
#ifdef BTPROTO_L2CAP
|
||||||
ADD_INT_MACRO(m, BTPROTO_L2CAP);
|
ADD_INT_MACRO(m, BTPROTO_L2CAP);
|
||||||
|
#if defined(BDADDR_BREDR)
|
||||||
ADD_INT_MACRO(m, BDADDR_BREDR);
|
ADD_INT_MACRO(m, BDADDR_BREDR);
|
||||||
ADD_INT_MACRO(m, BDADDR_LE_PUBLIC);
|
ADD_INT_MACRO(m, BDADDR_LE_PUBLIC);
|
||||||
ADD_INT_MACRO(m, BDADDR_LE_RANDOM);
|
ADD_INT_MACRO(m, BDADDR_LE_RANDOM);
|
||||||
|
#endif
|
||||||
#endif /* BTPROTO_L2CAP */
|
#endif /* BTPROTO_L2CAP */
|
||||||
#ifdef BTPROTO_HCI
|
#ifdef BTPROTO_HCI
|
||||||
ADD_INT_MACRO(m, BTPROTO_HCI);
|
ADD_INT_MACRO(m, BTPROTO_HCI);
|
||||||
ADD_INT_MACRO(m, SOL_HCI);
|
ADD_INT_MACRO(m, SOL_HCI);
|
||||||
#if !defined(__NetBSD__) && !defined(__DragonFly__)
|
#if defined(HCI_FILTER)
|
||||||
ADD_INT_MACRO(m, HCI_FILTER);
|
ADD_INT_MACRO(m, HCI_FILTER);
|
||||||
#if !defined(__FreeBSD__)
|
#endif
|
||||||
|
#if defined(HCI_TIME_STAMP)
|
||||||
ADD_INT_MACRO(m, HCI_TIME_STAMP);
|
ADD_INT_MACRO(m, HCI_TIME_STAMP);
|
||||||
ADD_INT_MACRO(m, HCI_DATA_DIR);
|
ADD_INT_MACRO(m, HCI_DATA_DIR);
|
||||||
#endif /* !__FreeBSD__ */
|
#endif
|
||||||
#endif /* !__NetBSD__ && !__DragonFly__ */
|
|
||||||
#endif /* BTPROTO_HCI */
|
#endif /* BTPROTO_HCI */
|
||||||
#ifdef BTPROTO_RFCOMM
|
#ifdef BTPROTO_RFCOMM
|
||||||
ADD_INT_MACRO(m, BTPROTO_RFCOMM);
|
ADD_INT_MACRO(m, BTPROTO_RFCOMM);
|
||||||
|
|
|
@ -122,6 +122,9 @@ typedef int socklen_t;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_BLUETOOTH_H
|
#ifdef HAVE_BLUETOOTH_H
|
||||||
|
#ifdef __FreeBSD__
|
||||||
|
#define L2CAP_SOCKET_CHECKED
|
||||||
|
#endif
|
||||||
#include <bluetooth.h>
|
#include <bluetooth.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -274,18 +277,22 @@ typedef union sock_addr {
|
||||||
struct sockaddr_in6 in6;
|
struct sockaddr_in6 in6;
|
||||||
struct sockaddr_storage storage;
|
struct sockaddr_storage storage;
|
||||||
#endif
|
#endif
|
||||||
#if defined(HAVE_BLUETOOTH_H) && defined(__FreeBSD__)
|
#if defined(MS_WINDOWS)
|
||||||
struct sockaddr_l2cap bt_l2;
|
struct SOCKADDR_BTH_REDEF bt_rc;
|
||||||
struct sockaddr_rfcomm bt_rc;
|
#elif defined(HAVE_BLUETOOTH_BLUETOOTH_H) // Linux
|
||||||
struct sockaddr_sco bt_sco;
|
|
||||||
struct sockaddr_hci bt_hci;
|
|
||||||
#elif defined(HAVE_BLUETOOTH_BLUETOOTH_H)
|
|
||||||
struct sockaddr_l2 bt_l2;
|
struct sockaddr_l2 bt_l2;
|
||||||
struct sockaddr_rc bt_rc;
|
struct sockaddr_rc bt_rc;
|
||||||
struct sockaddr_sco bt_sco;
|
struct sockaddr_sco bt_sco;
|
||||||
struct sockaddr_hci bt_hci;
|
struct sockaddr_hci bt_hci;
|
||||||
#elif defined(MS_WINDOWS)
|
#elif defined(HAVE_BLUETOOTH_H)
|
||||||
struct SOCKADDR_BTH_REDEF bt_rc;
|
# if defined(__FreeBSD__)
|
||||||
|
struct sockaddr_l2cap bt_l2;
|
||||||
|
struct sockaddr_rfcomm bt_rc;
|
||||||
|
struct sockaddr_sco bt_sco;
|
||||||
|
struct sockaddr_hci bt_hci;
|
||||||
|
# else // NetBSD, DragonFly BSD
|
||||||
|
struct sockaddr_bt bt;
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_NETPACKET_PACKET_H
|
#ifdef HAVE_NETPACKET_PACKET_H
|
||||||
struct sockaddr_ll ll;
|
struct sockaddr_ll ll;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue