Skip to content

Commit e5f8b2c

Browse files
gh-85302: Add support for BTPROTO_SCO on FreeBSD (GH-131981)
BTPROTO_SCO has been supported on FreeBSD since 2008.
1 parent 26ae05e commit e5f8b2c

File tree

4 files changed

+17
-15
lines changed

4 files changed

+17
-15
lines changed

Doc/library/socket.rst

+4-2
Original file line numberDiff line numberDiff line change
@@ -164,8 +164,10 @@ created. Socket addresses are represented as follows:
164164

165165
- :const:`BTPROTO_SCO` accepts ``bdaddr`` where ``bdaddr`` is a
166166
:class:`bytes` object containing the Bluetooth address in a
167-
string format. (ex. ``b'12:23:34:45:56:67'``) This protocol is not
168-
supported under FreeBSD.
167+
string format. (ex. ``b'12:23:34:45:56:67'``)
168+
169+
.. versionchanged:: next
170+
FreeBSD support added.
169171

170172
- :const:`AF_ALG` is a Linux-only socket based interface to Kernel
171173
cryptography. An algorithm socket is configured with a tuple of two to four

Lib/test/test_socket.py

+2-5
Original file line numberDiff line numberDiff line change
@@ -2620,9 +2620,7 @@ def testBluetoothConstants(self):
26202620
socket.BTPROTO_HCI
26212621
socket.SOL_HCI
26222622
socket.BTPROTO_L2CAP
2623-
2624-
if not sys.platform.startswith("freebsd"):
2625-
socket.BTPROTO_SCO
2623+
socket.BTPROTO_SCO
26262624

26272625
def testCreateRfcommSocket(self):
26282626
with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM) as s:
@@ -2638,8 +2636,7 @@ def testCreateHciSocket(self):
26382636
with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_RAW, socket.BTPROTO_HCI) as s:
26392637
pass
26402638

2641-
@unittest.skipIf(sys.platform == "win32" or sys.platform.startswith("freebsd"),
2642-
"windows and freebsd do not support SCO sockets")
2639+
@unittest.skipIf(sys.platform == "win32", "windows does not support SCO sockets")
26432640
def testCreateScoSocket(self):
26442641
with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_SCO) as s:
26452642
pass
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Add support for :data:`~socket.BTPROTO_SCO` in sockets on FreeBSD.

Modules/socketmodule.c

+10-8
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,7 @@ remove_unusable_flags(PyObject *m)
466466
#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
467467
#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
468468
#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
469+
#define BTPROTO_SCO BLUETOOTH_PROTO_SCO
469470
#define SOL_HCI SOL_HCI_RAW
470471
#define HCI_FILTER SO_HCI_RAW_FILTER
471472
#define sockaddr_l2 sockaddr_l2cap
@@ -474,6 +475,7 @@ remove_unusable_flags(PyObject *m)
474475
#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
475476
#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
476477
#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
478+
#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
477479
#elif defined(__NetBSD__) || defined(__DragonFly__)
478480
#define sockaddr_l2 sockaddr_bt
479481
#define sockaddr_rc sockaddr_bt
@@ -1536,15 +1538,15 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
15361538
return ret;
15371539
#endif
15381540
}
1541+
#endif /* BTPROTO_HCI */
15391542

1540-
#if !defined(__FreeBSD__)
1543+
#ifdef BTPROTO_SCO
15411544
case BTPROTO_SCO:
15421545
{
15431546
struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
15441547
return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
15451548
}
1546-
#endif /* !__FreeBSD__ */
1547-
#endif /* BTPROTO_HCI */
1549+
#endif /* BTPROTO_SCO */
15481550

15491551
default:
15501552
PyErr_SetString(PyExc_ValueError,
@@ -2156,7 +2158,8 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
21562158
*len_ret = sizeof *addr;
21572159
return 1;
21582160
}
2159-
#if !defined(__FreeBSD__)
2161+
#endif /* BTPROTO_HCI */
2162+
#ifdef BTPROTO_SCO
21602163
case BTPROTO_SCO:
21612164
{
21622165
const char *straddr;
@@ -2176,8 +2179,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
21762179
*len_ret = sizeof *addr;
21772180
return 1;
21782181
}
2179-
#endif /* !__FreeBSD__ */
2180-
#endif /* BTPROTO_HCI */
2182+
#endif /* BTPROTO_SCO */
21812183
default:
21822184
PyErr_Format(PyExc_OSError,
21832185
"%s(): unknown Bluetooth protocol", caller);
@@ -2732,11 +2734,11 @@ getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
27322734
case BTPROTO_HCI:
27332735
*len_ret = sizeof (struct sockaddr_hci);
27342736
return 1;
2735-
#if !defined(__FreeBSD__)
2737+
#endif /* BTPROTO_HCI */
2738+
#ifdef BTPROTO_SCO
27362739
case BTPROTO_SCO:
27372740
*len_ret = sizeof (struct sockaddr_sco);
27382741
return 1;
2739-
#endif /* !__FreeBSD__ */
27402742
#endif /* BTPROTO_HCI */
27412743
default:
27422744
PyErr_SetString(PyExc_OSError, "getsockaddrlen: "

0 commit comments

Comments
 (0)