Skip to content

Commit 5be7505

Browse files
[3.13] gh-132429: Fix support of Bluetooth sockets on NetBSD and DragonFly BSD (GH-132431) (GH-132458)
Also fix a compiler warning on FreeBSD. (cherry picked from commit f2f86d3)
1 parent 67b1c76 commit 5be7505

File tree

3 files changed

+78
-67
lines changed

3 files changed

+78
-67
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix support of Bluetooth sockets on NetBSD and DragonFly BSD.

Modules/socketmodule.c

+62-59
Original file line numberDiff line numberDiff line change
@@ -473,37 +473,42 @@ remove_unusable_flags(PyObject *m)
473473
# define SOCKETCLOSE close
474474
#endif
475475

476-
#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
477-
#define USE_BLUETOOTH 1
478-
#if defined(__FreeBSD__)
479-
#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
480-
#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
481-
#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
482-
#define SOL_HCI SOL_HCI_RAW
483-
#define HCI_FILTER SO_HCI_RAW_FILTER
484-
#define sockaddr_l2 sockaddr_l2cap
485-
#define sockaddr_rc sockaddr_rfcomm
486-
#define hci_dev hci_node
487-
#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
488-
#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
489-
#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
490-
#elif defined(__NetBSD__) || defined(__DragonFly__)
491-
#define sockaddr_l2 sockaddr_bt
492-
#define sockaddr_rc sockaddr_bt
493-
#define sockaddr_hci sockaddr_bt
494-
#define sockaddr_sco sockaddr_bt
495-
#define SOL_HCI BTPROTO_HCI
496-
#define HCI_DATA_DIR SO_HCI_DIRECTION
497-
#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
498-
#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
499-
#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
500-
#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
501-
#else
502-
#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
503-
#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
504-
#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
505-
#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
506-
#endif
476+
#if defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)
477+
# define USE_BLUETOOTH 1
478+
# if defined(HAVE_BLUETOOTH_BLUETOOTH_H) // Linux
479+
# define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
480+
# define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
481+
# define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
482+
# define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
483+
# elif defined(__FreeBSD__)
484+
# define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
485+
# define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
486+
# define BTPROTO_HCI BLUETOOTH_PROTO_HCI
487+
# define SOL_HCI SOL_HCI_RAW
488+
# define HCI_FILTER SO_HCI_RAW_FILTER
489+
# define sockaddr_l2 sockaddr_l2cap
490+
# define sockaddr_rc sockaddr_rfcomm
491+
# define hci_dev hci_node
492+
# define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
493+
# define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
494+
# define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
495+
# else // NetBSD, DragonFly BSD
496+
# define sockaddr_l2 sockaddr_bt
497+
# define sockaddr_rc sockaddr_bt
498+
# define sockaddr_hci sockaddr_bt
499+
# define sockaddr_sco sockaddr_bt
500+
# define bt_l2 bt
501+
# define bt_rc bt
502+
# define bt_sco bt
503+
# define bt_hci bt
504+
# define bt_cid bt_channel
505+
# define SOL_HCI BTPROTO_HCI
506+
# define HCI_DATA_DIR SO_HCI_DIRECTION
507+
# define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
508+
# define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
509+
# define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
510+
# define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
511+
# endif
507512
#endif
508513

509514
#ifdef MS_WINDOWS_DESKTOP
@@ -1483,16 +1488,16 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
14831488
case BTPROTO_HCI:
14841489
{
14851490
struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
1486-
#if defined(__NetBSD__) || defined(__DragonFly__)
1487-
return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1491+
#if defined(HAVE_BLUETOOTH_BLUETOOTH_H)
1492+
PyObject *ret = NULL;
1493+
ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1494+
return ret;
14881495
#elif defined(__FreeBSD__)
1489-
char *node = _BT_HCI_MEMB(a, node);
1496+
const char *node = _BT_HCI_MEMB(a, node);
14901497
size_t len = strnlen(node, sizeof(_BT_HCI_MEMB(a, node)));
14911498
return PyBytes_FromStringAndSize(node, (Py_ssize_t)len);
14921499
#else
1493-
PyObject *ret = NULL;
1494-
ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1495-
return ret;
1500+
return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
14961501
#endif
14971502
}
14981503

@@ -2061,19 +2066,16 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
20612066
{
20622067
struct sockaddr_hci *addr = &addrbuf->bt_hci;
20632068
memset(addr, 0, sizeof(struct sockaddr_hci));
2064-
#if defined(__NetBSD__) || defined(__DragonFly__)
2065-
const char *straddr;
20662069
_BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
2067-
if (!PyBytes_Check(args)) {
2068-
PyErr_Format(PyExc_OSError, "%s: "
2069-
"wrong format", caller);
2070+
#if defined(HAVE_BLUETOOTH_BLUETOOTH_H)
2071+
unsigned short dev = _BT_HCI_MEMB(addr, dev);
2072+
if (!PyArg_ParseTuple(args, "H", &dev)) {
2073+
PyErr_Format(PyExc_OSError,
2074+
"%s(): wrong format", caller);
20702075
return 0;
20712076
}
2072-
straddr = PyBytes_AS_STRING(args);
2073-
if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
2074-
return 0;
2077+
_BT_HCI_MEMB(addr, dev) = dev;
20752078
#elif defined(__FreeBSD__)
2076-
_BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
20772079
if (!PyBytes_Check(args)) {
20782080
PyErr_Format(PyExc_OSError, "%s: "
20792081
"wrong node format", caller);
@@ -2094,14 +2096,15 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
20942096
strncpy(_BT_HCI_MEMB(addr, node), straddr,
20952097
sizeof(_BT_HCI_MEMB(addr, node)));
20962098
#else
2097-
_BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
2098-
unsigned short dev = _BT_HCI_MEMB(addr, dev);
2099-
if (!PyArg_ParseTuple(args, "H", &dev)) {
2100-
PyErr_Format(PyExc_OSError,
2101-
"%s(): wrong format", caller);
2099+
const char *straddr;
2100+
if (!PyBytes_Check(args)) {
2101+
PyErr_Format(PyExc_OSError, "%s: "
2102+
"wrong format", caller);
21022103
return 0;
21032104
}
2104-
_BT_HCI_MEMB(addr, dev) = dev;
2105+
straddr = PyBytes_AS_STRING(args);
2106+
if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
2107+
return 0;
21052108
#endif
21062109
*len_ret = sizeof *addr;
21072110
return 1;
@@ -2679,12 +2682,12 @@ getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
26792682
case BTPROTO_HCI:
26802683
*len_ret = sizeof (struct sockaddr_hci);
26812684
return 1;
2682-
#if !defined(__FreeBSD__)
2685+
#endif /* BTPROTO_HCI */
2686+
#ifdef BTPROTO_SCO
26832687
case BTPROTO_SCO:
26842688
*len_ret = sizeof (struct sockaddr_sco);
26852689
return 1;
2686-
#endif /* !__FreeBSD__ */
2687-
#endif /* BTPROTO_HCI */
2690+
#endif /* BTPROTO_SCO */
26882691
default:
26892692
PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
26902693
"unknown BT protocol");
@@ -7724,13 +7727,13 @@ socket_exec(PyObject *m)
77247727
#ifdef BTPROTO_HCI
77257728
ADD_INT_MACRO(m, BTPROTO_HCI);
77267729
ADD_INT_MACRO(m, SOL_HCI);
7727-
#if !defined(__NetBSD__) && !defined(__DragonFly__)
7730+
#if defined(HCI_FILTER)
77287731
ADD_INT_MACRO(m, HCI_FILTER);
7729-
#if !defined(__FreeBSD__)
7732+
#endif
7733+
#if defined(HCI_TIME_STAMP)
77307734
ADD_INT_MACRO(m, HCI_TIME_STAMP);
77317735
ADD_INT_MACRO(m, HCI_DATA_DIR);
7732-
#endif /* !__FreeBSD__ */
7733-
#endif /* !__NetBSD__ && !__DragonFly__ */
7736+
#endif
77347737
#endif /* BTPROTO_HCI */
77357738
#ifdef BTPROTO_RFCOMM
77367739
ADD_INT_MACRO(m, BTPROTO_RFCOMM);

Modules/socketmodule.h

+15-8
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,9 @@ typedef int socklen_t;
122122
#endif
123123

124124
#ifdef HAVE_BLUETOOTH_H
125+
#ifdef __FreeBSD__
126+
#define L2CAP_SOCKET_CHECKED
127+
#endif
125128
#include <bluetooth.h>
126129
#endif
127130

@@ -270,18 +273,22 @@ typedef union sock_addr {
270273
struct sockaddr_in6 in6;
271274
struct sockaddr_storage storage;
272275
#endif
273-
#if defined(HAVE_BLUETOOTH_H) && defined(__FreeBSD__)
274-
struct sockaddr_l2cap bt_l2;
275-
struct sockaddr_rfcomm bt_rc;
276-
struct sockaddr_sco bt_sco;
277-
struct sockaddr_hci bt_hci;
278-
#elif defined(HAVE_BLUETOOTH_BLUETOOTH_H)
276+
#if defined(MS_WINDOWS)
277+
struct SOCKADDR_BTH_REDEF bt_rc;
278+
#elif defined(HAVE_BLUETOOTH_BLUETOOTH_H) // Linux
279279
struct sockaddr_l2 bt_l2;
280280
struct sockaddr_rc bt_rc;
281281
struct sockaddr_sco bt_sco;
282282
struct sockaddr_hci bt_hci;
283-
#elif defined(MS_WINDOWS)
284-
struct SOCKADDR_BTH_REDEF bt_rc;
283+
#elif defined(HAVE_BLUETOOTH_H)
284+
# if defined(__FreeBSD__)
285+
struct sockaddr_l2cap bt_l2;
286+
struct sockaddr_rfcomm bt_rc;
287+
struct sockaddr_sco bt_sco;
288+
struct sockaddr_hci bt_hci;
289+
# else // NetBSD, DragonFly BSD
290+
struct sockaddr_bt bt;
291+
# endif
285292
#endif
286293
#ifdef HAVE_NETPACKET_PACKET_H
287294
struct sockaddr_ll ll;

0 commit comments

Comments
 (0)