@@ -460,39 +460,44 @@ remove_unusable_flags(PyObject *m)
460460# define SOCKETCLOSE close
461461#endif
462462
463- #if (defined(HAVE_BLUETOOTH_H ) || defined(HAVE_BLUETOOTH_BLUETOOTH_H )) && !defined(__NetBSD__ ) && !defined(__DragonFly__ )
464- #define USE_BLUETOOTH 1
465- #if defined(__FreeBSD__ )
466- #define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
467- #define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
468- #define BTPROTO_HCI BLUETOOTH_PROTO_HCI
469- #define BTPROTO_SCO BLUETOOTH_PROTO_SCO
470- #define SOL_HCI SOL_HCI_RAW
471- #define HCI_FILTER SO_HCI_RAW_FILTER
472- #define sockaddr_l2 sockaddr_l2cap
473- #define sockaddr_rc sockaddr_rfcomm
474- #define hci_dev hci_node
475- #define _BT_L2_MEMB (sa , memb ) ((sa)->l2cap_##memb)
476- #define _BT_RC_MEMB (sa , memb ) ((sa)->rfcomm_##memb)
477- #define _BT_HCI_MEMB (sa , memb ) ((sa)->hci_##memb)
478- #define _BT_SCO_MEMB (sa , memb ) ((sa)->sco_##memb)
479- #elif defined(__NetBSD__ ) || defined(__DragonFly__ )
480- #define sockaddr_l2 sockaddr_bt
481- #define sockaddr_rc sockaddr_bt
482- #define sockaddr_hci sockaddr_bt
483- #define sockaddr_sco sockaddr_bt
484- #define SOL_HCI BTPROTO_HCI
485- #define HCI_DATA_DIR SO_HCI_DIRECTION
486- #define _BT_L2_MEMB (sa , memb ) ((sa)->bt_##memb)
487- #define _BT_RC_MEMB (sa , memb ) ((sa)->bt_##memb)
488- #define _BT_HCI_MEMB (sa , memb ) ((sa)->bt_##memb)
489- #define _BT_SCO_MEMB (sa , memb ) ((sa)->bt_##memb)
490- #else
491- #define _BT_L2_MEMB (sa , memb ) ((sa)->l2_##memb)
492- #define _BT_RC_MEMB (sa , memb ) ((sa)->rc_##memb)
493- #define _BT_HCI_MEMB (sa , memb ) ((sa)->hci_##memb)
494- #define _BT_SCO_MEMB (sa , memb ) ((sa)->sco_##memb)
495- #endif
463+ #if defined(HAVE_BLUETOOTH_H ) || defined(HAVE_BLUETOOTH_BLUETOOTH_H )
464+ # define USE_BLUETOOTH 1
465+ # if defined(HAVE_BLUETOOTH_BLUETOOTH_H ) // Linux
466+ # define _BT_L2_MEMB (sa , memb ) ((sa)->l2_##memb)
467+ # define _BT_RC_MEMB (sa , memb ) ((sa)->rc_##memb)
468+ # define _BT_HCI_MEMB (sa , memb ) ((sa)->hci_##memb)
469+ # define _BT_SCO_MEMB (sa , memb ) ((sa)->sco_##memb)
470+ # elif defined(__FreeBSD__ )
471+ # define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
472+ # define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
473+ # define BTPROTO_HCI BLUETOOTH_PROTO_HCI
474+ # define BTPROTO_SCO BLUETOOTH_PROTO_SCO
475+ # define SOL_HCI SOL_HCI_RAW
476+ # define HCI_FILTER SO_HCI_RAW_FILTER
477+ # define sockaddr_l2 sockaddr_l2cap
478+ # define sockaddr_rc sockaddr_rfcomm
479+ # define hci_dev hci_node
480+ # define _BT_L2_MEMB (sa , memb ) ((sa)->l2cap_##memb)
481+ # define _BT_RC_MEMB (sa , memb ) ((sa)->rfcomm_##memb)
482+ # define _BT_HCI_MEMB (sa , memb ) ((sa)->hci_##memb)
483+ # define _BT_SCO_MEMB (sa , memb ) ((sa)->sco_##memb)
484+ # else // NetBSD, DragonFly BSD
485+ # define sockaddr_l2 sockaddr_bt
486+ # define sockaddr_rc sockaddr_bt
487+ # define sockaddr_hci sockaddr_bt
488+ # define sockaddr_sco sockaddr_bt
489+ # define bt_l2 bt
490+ # define bt_rc bt
491+ # define bt_sco bt
492+ # define bt_hci bt
493+ # define bt_cid bt_channel
494+ # define SOL_HCI BTPROTO_HCI
495+ # define HCI_DATA_DIR SO_HCI_DIRECTION
496+ # define _BT_L2_MEMB (sa , memb ) ((sa)->bt_##memb)
497+ # define _BT_RC_MEMB (sa , memb ) ((sa)->bt_##memb)
498+ # define _BT_HCI_MEMB (sa , memb ) ((sa)->bt_##memb)
499+ # define _BT_SCO_MEMB (sa , memb ) ((sa)->bt_##memb)
500+ # endif
496501#endif
497502
498503#ifdef MS_WINDOWS_DESKTOP
@@ -1487,20 +1492,28 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
14871492 PyObject * addrobj = makebdaddr (& _BT_L2_MEMB (a , bdaddr ));
14881493 PyObject * ret = NULL ;
14891494 if (addrobj ) {
1490- /* Retain old format for non-LE address.
1491- (cid may be set for BR/EDR, but we're discarding it for now)
1492- */
1493- if (_BT_L2_MEMB (a , bdaddr_type ) == BDADDR_BREDR ) {
1494- ret = Py_BuildValue ("Oi" ,
1495- addrobj ,
1496- _BT_L2_MEMB (a , psm ));
1497- } else {
1495+ #if defined(BDADDR_BREDR ) // Linux, FreeBSD
1496+ if (_BT_L2_MEMB (a , bdaddr_type ) != BDADDR_BREDR ) {
14981497 ret = Py_BuildValue ("OiiB" ,
14991498 addrobj ,
15001499 _BT_L2_MEMB (a , psm ),
15011500 _BT_L2_MEMB (a , cid ),
15021501 _BT_L2_MEMB (a , bdaddr_type ));
15031502 }
1503+ else
1504+ #endif
1505+ if (_BT_L2_MEMB (a , cid ) != 0 ) {
1506+ ret = Py_BuildValue ("Oii" ,
1507+ addrobj ,
1508+ _BT_L2_MEMB (a , psm ),
1509+ _BT_L2_MEMB (a , cid ));
1510+ }
1511+ else {
1512+ /* Retain old format for non-LE address. */
1513+ ret = Py_BuildValue ("Oi" ,
1514+ addrobj ,
1515+ _BT_L2_MEMB (a , psm ));
1516+ }
15041517 Py_DECREF (addrobj );
15051518 }
15061519 return ret ;
@@ -1526,16 +1539,16 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
15261539 case BTPROTO_HCI :
15271540 {
15281541 struct sockaddr_hci * a = (struct sockaddr_hci * ) addr ;
1529- #if defined(__NetBSD__ ) || defined(__DragonFly__ )
1530- return makebdaddr (& _BT_HCI_MEMB (a , bdaddr ));
1542+ #if defined(HAVE_BLUETOOTH_BLUETOOTH_H )
1543+ PyObject * ret = NULL ;
1544+ ret = Py_BuildValue ("i" , _BT_HCI_MEMB (a , dev ));
1545+ return ret ;
15311546#elif defined(__FreeBSD__ )
1532- char * node = _BT_HCI_MEMB (a , node );
1547+ const char * node = _BT_HCI_MEMB (a , node );
15331548 size_t len = strnlen (node , sizeof (_BT_HCI_MEMB (a , node )));
15341549 return PyBytes_FromStringAndSize (node , (Py_ssize_t )len );
15351550#else
1536- PyObject * ret = NULL ;
1537- ret = Py_BuildValue ("i" , _BT_HCI_MEMB (a , dev ));
1538- return ret ;
1551+ return makebdaddr (& _BT_HCI_MEMB (a , bdaddr ));
15391552#endif
15401553 }
15411554#endif /* BTPROTO_HCI */
@@ -2060,6 +2073,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
20602073 memset (addr , 0 , sizeof (struct sockaddr_l2 ));
20612074 _BT_L2_MEMB (addr , family ) = AF_BLUETOOTH ;
20622075 unsigned short psm ;
2076+ #if defined(BDADDR_BREDR ) // Linux, FreeBSD
20632077 unsigned short cid = 0 ;
20642078 unsigned char bdaddr_type = BDADDR_BREDR ;
20652079 if (!PyArg_ParseTuple (args , "sH|HB" , & straddr ,
@@ -2070,9 +2084,18 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
20702084 "%s(): wrong format" , caller );
20712085 return 0 ;
20722086 }
2087+ _BT_L2_MEMB (addr , bdaddr_type ) = bdaddr_type ;
2088+ #else
2089+ unsigned char cid = 0 ;
2090+ if (!PyArg_ParseTuple (args , "sH|B" , & straddr ,
2091+ & psm , & cid )) {
2092+ PyErr_Format (PyExc_OSError ,
2093+ "%s(): wrong format" , caller );
2094+ return 0 ;
2095+ }
2096+ #endif
20732097 _BT_L2_MEMB (addr , psm ) = psm ;
20742098 _BT_L2_MEMB (addr , cid ) = cid ;
2075- _BT_L2_MEMB (addr , bdaddr_type ) = bdaddr_type ;
20762099
20772100 if (setbdaddr (straddr , & _BT_L2_MEMB (addr , bdaddr )) < 0 )
20782101 return 0 ;
@@ -2113,19 +2136,16 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
21132136 {
21142137 struct sockaddr_hci * addr = & addrbuf -> bt_hci ;
21152138 memset (addr , 0 , sizeof (struct sockaddr_hci ));
2116- #if defined(__NetBSD__ ) || defined(__DragonFly__ )
2117- const char * straddr ;
21182139 _BT_HCI_MEMB (addr , family ) = AF_BLUETOOTH ;
2119- if (!PyBytes_Check (args )) {
2120- PyErr_Format (PyExc_OSError , "%s: "
2121- "wrong format" , caller );
2140+ #if defined(HAVE_BLUETOOTH_BLUETOOTH_H )
2141+ unsigned short dev = _BT_HCI_MEMB (addr , dev );
2142+ if (!PyArg_ParseTuple (args , "H" , & dev )) {
2143+ PyErr_Format (PyExc_OSError ,
2144+ "%s(): wrong format" , caller );
21222145 return 0 ;
21232146 }
2124- straddr = PyBytes_AS_STRING (args );
2125- if (setbdaddr (straddr , & _BT_HCI_MEMB (addr , bdaddr )) < 0 )
2126- return 0 ;
2147+ _BT_HCI_MEMB (addr , dev ) = dev ;
21272148#elif defined(__FreeBSD__ )
2128- _BT_HCI_MEMB (addr , family ) = AF_BLUETOOTH ;
21292149 if (!PyBytes_Check (args )) {
21302150 PyErr_Format (PyExc_OSError , "%s: "
21312151 "wrong node format" , caller );
@@ -2146,14 +2166,15 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
21462166 strncpy (_BT_HCI_MEMB (addr , node ), straddr ,
21472167 sizeof (_BT_HCI_MEMB (addr , node )));
21482168#else
2149- _BT_HCI_MEMB (addr , family ) = AF_BLUETOOTH ;
2150- unsigned short dev = _BT_HCI_MEMB (addr , dev );
2151- if (!PyArg_ParseTuple (args , "H" , & dev )) {
2152- PyErr_Format (PyExc_OSError ,
2153- "%s(): wrong format" , caller );
2169+ const char * straddr ;
2170+ if (!PyBytes_Check (args )) {
2171+ PyErr_Format (PyExc_OSError , "%s: "
2172+ "wrong format" , caller );
21542173 return 0 ;
21552174 }
2156- _BT_HCI_MEMB (addr , dev ) = dev ;
2175+ straddr = PyBytes_AS_STRING (args );
2176+ if (setbdaddr (straddr , & _BT_HCI_MEMB (addr , bdaddr )) < 0 )
2177+ return 0 ;
21572178#endif
21582179 * len_ret = sizeof * addr ;
21592180 return 1 ;
@@ -2739,7 +2760,7 @@ getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
27392760 case BTPROTO_SCO :
27402761 * len_ret = sizeof (struct sockaddr_sco );
27412762 return 1 ;
2742- #endif /* BTPROTO_HCI */
2763+ #endif /* BTPROTO_SCO */
27432764 default :
27442765 PyErr_SetString (PyExc_OSError , "getsockaddrlen: "
27452766 "unknown BT protocol" );
@@ -7845,20 +7866,22 @@ socket_exec(PyObject *m)
78457866 ADD_INT_MACRO (m , AF_BLUETOOTH );
78467867#ifdef BTPROTO_L2CAP
78477868 ADD_INT_MACRO (m , BTPROTO_L2CAP );
7869+ #if defined(BDADDR_BREDR )
78487870 ADD_INT_MACRO (m , BDADDR_BREDR );
78497871 ADD_INT_MACRO (m , BDADDR_LE_PUBLIC );
78507872 ADD_INT_MACRO (m , BDADDR_LE_RANDOM );
7873+ #endif
78517874#endif /* BTPROTO_L2CAP */
78527875#ifdef BTPROTO_HCI
78537876 ADD_INT_MACRO (m , BTPROTO_HCI );
78547877 ADD_INT_MACRO (m , SOL_HCI );
7855- #if ! defined(__NetBSD__ ) && !defined( __DragonFly__ )
7878+ #if defined(HCI_FILTER )
78567879 ADD_INT_MACRO (m , HCI_FILTER );
7857- #if !defined(__FreeBSD__ )
7880+ #endif
7881+ #if defined(HCI_TIME_STAMP )
78587882 ADD_INT_MACRO (m , HCI_TIME_STAMP );
78597883 ADD_INT_MACRO (m , HCI_DATA_DIR );
7860- #endif /* !__FreeBSD__ */
7861- #endif /* !__NetBSD__ && !__DragonFly__ */
7884+ #endif
78627885#endif /* BTPROTO_HCI */
78637886#ifdef BTPROTO_RFCOMM
78647887 ADD_INT_MACRO (m , BTPROTO_RFCOMM );
0 commit comments