https://github.com/python/cpython/commit/e5f8b2c7038cb7e84fd657ed90fedf60ae796d2d
commit: e5f8b2c7038cb7e84fd657ed90fedf60ae796d2d
branch: main
author: Serhiy Storchaka <storch...@gmail.com>
committer: serhiy-storchaka <storch...@gmail.com>
date: 2025-04-11T19:38:17+03:00
summary:

gh-85302: Add support for BTPROTO_SCO on FreeBSD (GH-131981)

BTPROTO_SCO has been supported on FreeBSD since 2008.

files:
A Misc/NEWS.d/next/Library/2025-04-01-18-24-58.gh-issue-85302.7knfUf.rst
M Doc/library/socket.rst
M Lib/test/test_socket.py
M Modules/socketmodule.c

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 41885406ec3409..cf46acbaab4b9e 100644
--- a/Lib/test/test_socket.py
+++ b/Lib/test/test_socket.py
@@ -2620,9 +2620,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:
@@ -2638,8 +2636,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 8f66573d8629cb..22a3a2effe2962 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
@@ -474,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
@@ -1536,15 +1538,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,
@@ -2156,7 +2158,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;
@@ -2176,8 +2179,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);
@@ -2732,11 +2734,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: "

_______________________________________________
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

Reply via email to