https://github.com/python/cpython/commit/5be7505730460c12c723f64e850fe947773ca89b commit: 5be7505730460c12c723f64e850fe947773ca89b branch: 3.13 author: Serhiy Storchaka <storch...@gmail.com> committer: serhiy-storchaka <storch...@gmail.com> date: 2025-04-13T01:22:41+03:00 summary:
[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 f2f86d3f459a89273ea22389bb57eed402908302) files: A Misc/NEWS.d/next/Library/2025-04-12-12-59-51.gh-issue-132429.OEIdlW.rst M Modules/socketmodule.c M Modules/socketmodule.h diff --git a/Misc/NEWS.d/next/Library/2025-04-12-12-59-51.gh-issue-132429.OEIdlW.rst b/Misc/NEWS.d/next/Library/2025-04-12-12-59-51.gh-issue-132429.OEIdlW.rst new file mode 100644 index 00000000000000..2fde45288ae8b4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-04-12-12-59-51.gh-issue-132429.OEIdlW.rst @@ -0,0 +1 @@ +Fix support of Bluetooth sockets on NetBSD and DragonFly BSD. diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index e2afe508f5a78b..0f480086ccda55 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -473,37 +473,42 @@ remove_unusable_flags(PyObject *m) # define SOCKETCLOSE close #endif -#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__) -#define USE_BLUETOOTH 1 -#if defined(__FreeBSD__) -#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP -#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM -#define BTPROTO_HCI BLUETOOTH_PROTO_HCI -#define SOL_HCI SOL_HCI_RAW -#define HCI_FILTER SO_HCI_RAW_FILTER -#define sockaddr_l2 sockaddr_l2cap -#define sockaddr_rc sockaddr_rfcomm -#define hci_dev hci_node -#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__) || defined(__DragonFly__) -#define sockaddr_l2 sockaddr_bt -#define sockaddr_rc sockaddr_bt -#define sockaddr_hci sockaddr_bt -#define sockaddr_sco sockaddr_bt -#define SOL_HCI BTPROTO_HCI -#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) -#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 +#if defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H) +# define USE_BLUETOOTH 1 +# if defined(HAVE_BLUETOOTH_BLUETOOTH_H) // Linux +# 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) +# elif defined(__FreeBSD__) +# define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP +# define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM +# define BTPROTO_HCI BLUETOOTH_PROTO_HCI +# define SOL_HCI SOL_HCI_RAW +# define HCI_FILTER SO_HCI_RAW_FILTER +# define sockaddr_l2 sockaddr_l2cap +# define sockaddr_rc sockaddr_rfcomm +# define hci_dev hci_node +# 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) +# else // NetBSD, DragonFly BSD +# define sockaddr_l2 sockaddr_bt +# define sockaddr_rc sockaddr_bt +# define sockaddr_hci sockaddr_bt +# define sockaddr_sco sockaddr_bt +# define bt_l2 bt +# define bt_rc bt +# define bt_sco bt +# define bt_hci bt +# define bt_cid bt_channel +# define SOL_HCI BTPROTO_HCI +# 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 #ifdef MS_WINDOWS_DESKTOP @@ -1483,16 +1488,16 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto) case BTPROTO_HCI: { struct sockaddr_hci *a = (struct sockaddr_hci *) addr; -#if defined(__NetBSD__) || defined(__DragonFly__) - return makebdaddr(&_BT_HCI_MEMB(a, bdaddr)); +#if defined(HAVE_BLUETOOTH_BLUETOOTH_H) + PyObject *ret = NULL; + ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev)); + return ret; #elif defined(__FreeBSD__) - char *node = _BT_HCI_MEMB(a, node); + 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 - PyObject *ret = NULL; - ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev)); - return ret; + return makebdaddr(&_BT_HCI_MEMB(a, bdaddr)); #endif } @@ -2061,19 +2066,16 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, { struct sockaddr_hci *addr = &addrbuf->bt_hci; memset(addr, 0, sizeof(struct sockaddr_hci)); -#if defined(__NetBSD__) || defined(__DragonFly__) - const char *straddr; _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH; - if (!PyBytes_Check(args)) { - PyErr_Format(PyExc_OSError, "%s: " - "wrong format", caller); +#if defined(HAVE_BLUETOOTH_BLUETOOTH_H) + unsigned short dev = _BT_HCI_MEMB(addr, dev); + if (!PyArg_ParseTuple(args, "H", &dev)) { + PyErr_Format(PyExc_OSError, + "%s(): wrong format", caller); return 0; } - straddr = PyBytes_AS_STRING(args); - if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0) - return 0; + _BT_HCI_MEMB(addr, dev) = dev; #elif defined(__FreeBSD__) - _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH; if (!PyBytes_Check(args)) { PyErr_Format(PyExc_OSError, "%s: " "wrong node format", caller); @@ -2094,14 +2096,15 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, strncpy(_BT_HCI_MEMB(addr, node), straddr, sizeof(_BT_HCI_MEMB(addr, node))); #else - _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH; - unsigned short dev = _BT_HCI_MEMB(addr, dev); - if (!PyArg_ParseTuple(args, "H", &dev)) { - PyErr_Format(PyExc_OSError, - "%s(): wrong format", caller); + const char *straddr; + if (!PyBytes_Check(args)) { + PyErr_Format(PyExc_OSError, "%s: " + "wrong format", caller); 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 *len_ret = sizeof *addr; return 1; @@ -2679,12 +2682,12 @@ getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret) case BTPROTO_HCI: *len_ret = sizeof (struct sockaddr_hci); return 1; -#if !defined(__FreeBSD__) +#endif /* BTPROTO_HCI */ +#ifdef BTPROTO_SCO case BTPROTO_SCO: *len_ret = sizeof (struct sockaddr_sco); return 1; -#endif /* !__FreeBSD__ */ -#endif /* BTPROTO_HCI */ +#endif /* BTPROTO_SCO */ default: PyErr_SetString(PyExc_OSError, "getsockaddrlen: " "unknown BT protocol"); @@ -7724,13 +7727,13 @@ socket_exec(PyObject *m) #ifdef BTPROTO_HCI ADD_INT_MACRO(m, BTPROTO_HCI); ADD_INT_MACRO(m, SOL_HCI); -#if !defined(__NetBSD__) && !defined(__DragonFly__) +#if defined(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_DATA_DIR); -#endif /* !__FreeBSD__ */ -#endif /* !__NetBSD__ && !__DragonFly__ */ +#endif #endif /* BTPROTO_HCI */ #ifdef BTPROTO_RFCOMM ADD_INT_MACRO(m, BTPROTO_RFCOMM); diff --git a/Modules/socketmodule.h b/Modules/socketmodule.h index 09fd70f351f1d8..8480590222cc36 100644 --- a/Modules/socketmodule.h +++ b/Modules/socketmodule.h @@ -122,6 +122,9 @@ typedef int socklen_t; #endif #ifdef HAVE_BLUETOOTH_H +#ifdef __FreeBSD__ +#define L2CAP_SOCKET_CHECKED +#endif #include <bluetooth.h> #endif @@ -270,18 +273,22 @@ typedef union sock_addr { struct sockaddr_in6 in6; struct sockaddr_storage storage; #endif -#if defined(HAVE_BLUETOOTH_H) && defined(__FreeBSD__) - struct sockaddr_l2cap bt_l2; - struct sockaddr_rfcomm bt_rc; - struct sockaddr_sco bt_sco; - struct sockaddr_hci bt_hci; -#elif defined(HAVE_BLUETOOTH_BLUETOOTH_H) +#if defined(MS_WINDOWS) + struct SOCKADDR_BTH_REDEF bt_rc; +#elif defined(HAVE_BLUETOOTH_BLUETOOTH_H) // Linux struct sockaddr_l2 bt_l2; struct sockaddr_rc bt_rc; struct sockaddr_sco bt_sco; struct sockaddr_hci bt_hci; -#elif defined(MS_WINDOWS) - struct SOCKADDR_BTH_REDEF bt_rc; +#elif defined(HAVE_BLUETOOTH_H) +# 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 #ifdef HAVE_NETPACKET_PACKET_H struct sockaddr_ll ll; _______________________________________________ Python-checkins mailing list -- python-checkins@python.org To unsubscribe send an email to python-checkins-le...@python.org https://mail.python.org/mailman3/lists/python-checkins.python.org/ Member address: arch...@mail-archive.com