From 2debf1e61fd32c40487a8f3c719c670900b33dba Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Tue, 1 Apr 2025 18:20:48 +0300 Subject: [PATCH 1/3] gh-85302: Add support for BTPROTO_SCO on FreeBSD BTPROTO_SCO has been supported on FreeBSD since 2008. --- Doc/library/socket.rst | 6 ++++-- Lib/test/test_socket.py | 7 ++----- ...2025-04-01-18-24-58.gh-issue-85302.7knfUf.rst | 1 + Modules/socketmodule.c | 16 ++++++++-------- 4 files changed, 15 insertions(+), 15 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-04-01-18-24-58.gh-issue-85302.7knfUf.rst diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst index 1bc7f76b5ba694..970698c5f644a2 100644 --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -164,8 +164,10 @@ created. Socket addresses are represented as follows: - :const:`BTPROTO_SCO` accepts ``bdaddr`` where ``bdaddr`` is a :class:`bytes` object containing the Bluetooth address in a - string format. (ex. ``b'12:23:34:45:56:67'``) This protocol is not - supported under FreeBSD. + string format. (ex. ``b'12:23:34:45:56:67'``) + + .. versionchanged:: next + FreeBSD support added. - :const:`AF_ALG` is a Linux-only socket based interface to Kernel cryptography. An algorithm socket is configured with a tuple of two to four diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index cd3497f0274cd6..5019ce58cee50a 100644 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -2619,9 +2619,7 @@ def testBluetoothConstants(self): socket.BTPROTO_HCI socket.SOL_HCI socket.BTPROTO_L2CAP - - if not sys.platform.startswith("freebsd"): - socket.BTPROTO_SCO + socket.BTPROTO_SCO def testCreateRfcommSocket(self): with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM) as s: @@ -2637,8 +2635,7 @@ def testCreateHciSocket(self): with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_RAW, socket.BTPROTO_HCI) as s: pass - @unittest.skipIf(sys.platform == "win32" or sys.platform.startswith("freebsd"), - "windows and freebsd do not support SCO sockets") + @unittest.skipIf(sys.platform == "win32", "windows does not support SCO sockets") def testCreateScoSocket(self): with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_SCO) as s: pass diff --git a/Misc/NEWS.d/next/Library/2025-04-01-18-24-58.gh-issue-85302.7knfUf.rst b/Misc/NEWS.d/next/Library/2025-04-01-18-24-58.gh-issue-85302.7knfUf.rst new file mode 100644 index 00000000000000..aa5c4dfdc72684 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-04-01-18-24-58.gh-issue-85302.7knfUf.rst @@ -0,0 +1 @@ +Add support for :data:`~socket.BTPROTO_SCO` in sockets on FreeBSD. diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 6e44a7ebfd10ae..1145eb189fe115 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -1536,15 +1536,15 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto) return ret; #endif } +#endif /* BTPROTO_HCI */ -#if !defined(__FreeBSD__) +#ifdef BTPROTO_SCO case BTPROTO_SCO: { struct sockaddr_sco *a = (struct sockaddr_sco *) addr; return makebdaddr(&_BT_SCO_MEMB(a, bdaddr)); } -#endif /* !__FreeBSD__ */ -#endif /* BTPROTO_HCI */ +#endif /* BTPROTO_SCO */ default: PyErr_SetString(PyExc_ValueError, @@ -2149,7 +2149,8 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, *len_ret = sizeof *addr; return 1; } -#if !defined(__FreeBSD__) +#endif /* BTPROTO_HCI */ +#ifdef BTPROTO_SCO case BTPROTO_SCO: { const char *straddr; @@ -2168,8 +2169,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, *len_ret = sizeof *addr; return 1; } -#endif /* !__FreeBSD__ */ -#endif /* BTPROTO_HCI */ +#endif /* BTPROTO_SCO */ default: PyErr_Format(PyExc_OSError, "%s(): unknown Bluetooth protocol", caller); @@ -2719,11 +2719,11 @@ 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 */ default: PyErr_SetString(PyExc_OSError, "getsockaddrlen: " From a62570a8439f8918441a872a02cc799adaafab53 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Fri, 4 Apr 2025 17:28:12 +0300 Subject: [PATCH 2/3] Define BTPROTO_SCO. --- Modules/socketmodule.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index e24309e3bfdacf..c1f25e7a4f1525 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -466,6 +466,7 @@ remove_unusable_flags(PyObject *m) #define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP #define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM #define BTPROTO_HCI BLUETOOTH_PROTO_HCI +#define BTPROTO_SCO BLUETOOTH_PROTO_SCO #define SOL_HCI SOL_HCI_RAW #define HCI_FILTER SO_HCI_RAW_FILTER #define sockaddr_l2 sockaddr_l2cap From 10ee7ae7f3769fbf328a1dccd08d4b5a33d4dfa0 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Fri, 4 Apr 2025 18:18:27 +0300 Subject: [PATCH 3/3] Define _BT_SCO_MEMB on FreeBSD. --- Modules/socketmodule.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index c1f25e7a4f1525..22a3a2effe2962 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -475,6 +475,7 @@ remove_unusable_flags(PyObject *m) #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) +#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb) #elif defined(__NetBSD__) || defined(__DragonFly__) #define sockaddr_l2 sockaddr_bt #define sockaddr_rc sockaddr_bt