@@ -1526,11 +1526,15 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
1526
1526
struct sockaddr_hci * a = (struct sockaddr_hci * ) addr ;
1527
1527
#if defined(__NetBSD__ ) || defined(__DragonFly__ )
1528
1528
return makebdaddr (& _BT_HCI_MEMB (a , bdaddr ));
1529
- #else /* __NetBSD__ || __DragonFly__ */
1529
+ #elif defined(__FreeBSD__ )
1530
+ char * node = _BT_HCI_MEMB (a , node );
1531
+ size_t len = strnlen (node , sizeof (_BT_HCI_MEMB (a , node )));
1532
+ return PyBytes_FromStringAndSize (node , (Py_ssize_t )len );
1533
+ #else
1530
1534
PyObject * ret = NULL ;
1531
1535
ret = Py_BuildValue ("i" , _BT_HCI_MEMB (a , dev ));
1532
1536
return ret ;
1533
- #endif /* !(__NetBSD__ || __DragonFly__) */
1537
+ #endif
1534
1538
}
1535
1539
1536
1540
#if !defined(__FreeBSD__ )
@@ -2048,15 +2052,21 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
2048
2052
struct sockaddr_l2 * addr = & addrbuf -> bt_l2 ;
2049
2053
memset (addr , 0 , sizeof (struct sockaddr_l2 ));
2050
2054
_BT_L2_MEMB (addr , family ) = AF_BLUETOOTH ;
2051
- _BT_L2_MEMB (addr , bdaddr_type ) = BDADDR_BREDR ;
2052
- if (!PyArg_ParseTuple (args , "si|iB" , & straddr ,
2053
- & _BT_L2_MEMB (addr , psm ),
2054
- & _BT_L2_MEMB (addr , cid ),
2055
- & _BT_L2_MEMB (addr , bdaddr_type ))) {
2055
+ unsigned short psm ;
2056
+ unsigned short cid = 0 ;
2057
+ unsigned char bdaddr_type = BDADDR_BREDR ;
2058
+ if (!PyArg_ParseTuple (args , "sH|HB" , & straddr ,
2059
+ & psm ,
2060
+ & cid ,
2061
+ & bdaddr_type )) {
2056
2062
PyErr_Format (PyExc_OSError ,
2057
2063
"%s(): wrong format" , caller );
2058
2064
return 0 ;
2059
2065
}
2066
+ _BT_L2_MEMB (addr , psm ) = psm ;
2067
+ _BT_L2_MEMB (addr , cid ) = cid ;
2068
+ _BT_L2_MEMB (addr , bdaddr_type ) = bdaddr_type ;
2069
+
2060
2070
if (setbdaddr (straddr , & _BT_L2_MEMB (addr , bdaddr )) < 0 )
2061
2071
return 0 ;
2062
2072
@@ -2069,12 +2079,21 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
2069
2079
const char * straddr ;
2070
2080
struct sockaddr_rc * addr = & addrbuf -> bt_rc ;
2071
2081
_BT_RC_MEMB (addr , family ) = AF_BLUETOOTH ;
2072
- if (!PyArg_ParseTuple (args , "si" , & straddr ,
2073
- & _BT_RC_MEMB (addr , channel ))) {
2074
- PyErr_Format (PyExc_OSError ,
2075
- "%s(): wrong format" , caller );
2082
+ #ifdef MS_WINDOWS
2083
+ unsigned long channel ;
2084
+ # define FORMAT_CHANNEL "k"
2085
+ #else
2086
+ unsigned char channel ;
2087
+ # define FORMAT_CHANNEL "B"
2088
+ #endif
2089
+ if (!PyArg_ParseTuple (args , "s" FORMAT_CHANNEL ,
2090
+ & straddr , & channel )) {
2091
+ PyErr_Format (PyExc_OSError , "%s(): wrong format" , caller );
2076
2092
return 0 ;
2077
2093
}
2094
+ #undef FORMAT_CHANNEL
2095
+ _BT_RC_MEMB (addr , channel ) = channel ;
2096
+
2078
2097
if (setbdaddr (straddr , & _BT_RC_MEMB (addr , bdaddr )) < 0 )
2079
2098
return 0 ;
2080
2099
@@ -2096,14 +2115,37 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
2096
2115
straddr = PyBytes_AS_STRING (args );
2097
2116
if (setbdaddr (straddr , & _BT_HCI_MEMB (addr , bdaddr )) < 0 )
2098
2117
return 0 ;
2099
- #else /* __NetBSD__ || __DragonFly__ */
2118
+ #elif defined(__FreeBSD__ )
2119
+ _BT_HCI_MEMB (addr , family ) = AF_BLUETOOTH ;
2120
+ if (!PyBytes_Check (args )) {
2121
+ PyErr_Format (PyExc_OSError , "%s: "
2122
+ "wrong node format" , caller );
2123
+ return 0 ;
2124
+ }
2125
+ const char * straddr = PyBytes_AS_STRING (args );
2126
+ size_t len = PyBytes_GET_SIZE (args );
2127
+ if (strlen (straddr ) != len ) {
2128
+ PyErr_Format (PyExc_ValueError , "%s: "
2129
+ "node contains embedded null character" , caller );
2130
+ return 0 ;
2131
+ }
2132
+ if (len > sizeof (_BT_HCI_MEMB (addr , node ))) {
2133
+ PyErr_Format (PyExc_ValueError , "%s: "
2134
+ "node too long" , caller );
2135
+ return 0 ;
2136
+ }
2137
+ strncpy (_BT_HCI_MEMB (addr , node ), straddr ,
2138
+ sizeof (_BT_HCI_MEMB (addr , node )));
2139
+ #else
2100
2140
_BT_HCI_MEMB (addr , family ) = AF_BLUETOOTH ;
2101
- if (!PyArg_ParseTuple (args , "i" , & _BT_HCI_MEMB (addr , dev ))) {
2141
+ unsigned short dev = _BT_HCI_MEMB (addr , dev );
2142
+ if (!PyArg_ParseTuple (args , "H" , & dev )) {
2102
2143
PyErr_Format (PyExc_OSError ,
2103
2144
"%s(): wrong format" , caller );
2104
2145
return 0 ;
2105
2146
}
2106
- #endif /* !(__NetBSD__ || __DragonFly__) */
2147
+ _BT_HCI_MEMB (addr , dev ) = dev ;
2148
+ #endif
2107
2149
* len_ret = sizeof * addr ;
2108
2150
return 1 ;
2109
2151
}
0 commit comments