Line 0
Link Here
|
|
|
1 |
--- common/devices/unixbluetooth.c.orig 2008-10-05 12:14:31.000000000 +0200 |
2 |
+++ common/devices/unixbluetooth.c 2008-11-04 22:30:35.000000000 +0100 |
3 |
@@ -54,6 +54,8 @@ |
4 |
#include <netgraph/bluetooth/include/ng_hci.h> |
5 |
#include <netgraph/bluetooth/include/ng_l2cap.h> |
6 |
#include <netgraph/bluetooth/include/ng_btsocket.h> |
7 |
+#include <bluetooth.h> |
8 |
+#include <sdp.h> |
9 |
|
10 |
#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM |
11 |
#define BDADDR_ANY NG_HCI_BDADDR_ANY |
12 |
@@ -86,11 +88,6 @@ |
13 |
|
14 |
#endif /* HAVE_BT_ATON */ |
15 |
|
16 |
-static int str2ba(const char *str, bdaddr_t *ba) |
17 |
-{ |
18 |
- return !bt_aton(str, ba); |
19 |
-} |
20 |
- |
21 |
#else /* Linux / BlueZ support */ |
22 |
|
23 |
#include <bluetooth/bluetooth.h> |
24 |
@@ -100,6 +97,272 @@ |
25 |
|
26 |
#endif |
27 |
|
28 |
+#ifdef HAVE_BLUETOOTH_NETGRAPH /* FreeBSD / netgraph */ |
29 |
+ |
30 |
+/* |
31 |
+** FreeBSD version of the find_service_channel function. |
32 |
+** Written by Guido Falsi <mad@madpilot.net>. |
33 |
+** Contains code taken from FreeBSD's sdpcontrol and rfcomm_sppd |
34 |
+** programs, which are Copyright (c) 2001-2003 Maksim Yevmenkin |
35 |
+** <m_evmenkin@yahoo.com>. |
36 |
+*/ |
37 |
+ |
38 |
+static int find_service_channel(bdaddr_t *adapter, bdaddr_t *device, int only_gnapplet, uint16_t svclass_id) |
39 |
+{ |
40 |
+ uint8_t getchan = 0; |
41 |
+ uint32_t i, good = 0; |
42 |
+ char name[64]; |
43 |
+ void *ss = NULL; |
44 |
+ |
45 |
+ uint32_t attrs[] = |
46 |
+ { |
47 |
+ SDP_ATTR_RANGE( SDP_ATTR_PRIMARY_LANGUAGE_BASE_ID + SDP_ATTR_SERVICE_NAME_OFFSET, |
48 |
+ SDP_ATTR_PRIMARY_LANGUAGE_BASE_ID + SDP_ATTR_SERVICE_NAME_OFFSET), |
49 |
+ SDP_ATTR_RANGE( SDP_ATTR_PROTOCOL_DESCRIPTOR_LIST, |
50 |
+ SDP_ATTR_PROTOCOL_DESCRIPTOR_LIST), |
51 |
+ }; |
52 |
+ #define attrs_len (sizeof(attrs)/sizeof(attrs[0])) |
53 |
+ |
54 |
+ /* Buffer for the attributes */ |
55 |
+ #define NRECS 25 /* request this much records from the SDP server */ |
56 |
+ #define BSIZE 256 /* one attribute buffer size */ |
57 |
+ static uint8_t buffer[NRECS * attrs_len][BSIZE]; |
58 |
+ |
59 |
+ /* SDP attributes */ |
60 |
+ static sdp_attr_t values[NRECS * attrs_len]; |
61 |
+ #define values_len (sizeof(values)/sizeof(values[0])) |
62 |
+ |
63 |
+ /* Initialize attribute values array */ |
64 |
+ for (i = 0; i < values_len; i ++) { |
65 |
+ values[i].flags = SDP_ATTR_INVALID; |
66 |
+ values[i].attr = 0; |
67 |
+ values[i].vlen = BSIZE; |
68 |
+ values[i].value = buffer[i]; |
69 |
+ } |
70 |
+ |
71 |
+ if ((ss = sdp_open(adapter, device)) == NULL) |
72 |
+ return -1; |
73 |
+ |
74 |
+ if (sdp_error(ss) != 0) |
75 |
+ { |
76 |
+ sdp_close(ss); |
77 |
+ return -1; |
78 |
+ } |
79 |
+ |
80 |
+ if (sdp_search(ss, 1, &svclass_id, attrs_len, attrs, values_len, values) != 0) |
81 |
+ { |
82 |
+ sdp_close(ss); |
83 |
+ return -1; |
84 |
+ } |
85 |
+ |
86 |
+ for (i = 0; i < values_len; i++) |
87 |
+ { |
88 |
+ if (values[i].flags != SDP_ATTR_OK) |
89 |
+ break; |
90 |
+ |
91 |
+ union { |
92 |
+ uint8_t uint8; |
93 |
+ uint16_t uint16; |
94 |
+ uint32_t uint32; |
95 |
+ uint64_t uint64; |
96 |
+ int128_t int128; |
97 |
+ } value; |
98 |
+ uint8_t *start, *end; |
99 |
+ uint32_t type, len; |
100 |
+ |
101 |
+ start = values[i].value; |
102 |
+ end = values[i].value + values[i].vlen; |
103 |
+ |
104 |
+ switch (values[i].attr) { |
105 |
+ case SDP_ATTR_PROTOCOL_DESCRIPTOR_LIST: |
106 |
+ if(getchan) { |
107 |
+ SDP_GET8(type, start); |
108 |
+ switch (type) { |
109 |
+ case SDP_DATA_SEQ8: |
110 |
+ SDP_GET8(len, start); |
111 |
+ break; |
112 |
+ |
113 |
+ case SDP_DATA_SEQ16: |
114 |
+ SDP_GET16(len, start); |
115 |
+ break; |
116 |
+ |
117 |
+ case SDP_DATA_SEQ32: |
118 |
+ SDP_GET32(len, start); |
119 |
+ break; |
120 |
+ |
121 |
+ default: |
122 |
+ sdp_close(ss); |
123 |
+ return -1; |
124 |
+ break; |
125 |
+ } |
126 |
+ |
127 |
+ SDP_GET8(type, start); |
128 |
+ switch (type) { |
129 |
+ case SDP_DATA_SEQ8: |
130 |
+ SDP_GET8(len, start); |
131 |
+ break; |
132 |
+ |
133 |
+ case SDP_DATA_SEQ16: |
134 |
+ SDP_GET16(len, start); |
135 |
+ break; |
136 |
+ |
137 |
+ case SDP_DATA_SEQ32: |
138 |
+ SDP_GET32(len, start); |
139 |
+ break; |
140 |
+ |
141 |
+ default: |
142 |
+ sdp_close(ss); |
143 |
+ return -1; |
144 |
+ break; |
145 |
+ } |
146 |
+ |
147 |
+ while (start < end) { |
148 |
+ SDP_GET8(type, start); |
149 |
+ switch (type) { |
150 |
+ case SDP_DATA_UUID16: |
151 |
+ SDP_GET16(value.uint16, start); |
152 |
+ break; |
153 |
+ |
154 |
+ case SDP_DATA_UUID32: |
155 |
+ SDP_GET32(value.uint32, start); |
156 |
+ break; |
157 |
+ |
158 |
+ case SDP_DATA_UUID128: |
159 |
+ SDP_GET_UUID128(&value.int128, start); |
160 |
+ break; |
161 |
+ |
162 |
+ default: |
163 |
+ sdp_close(ss); |
164 |
+ return -1; |
165 |
+ break; |
166 |
+ } |
167 |
+ if(value.uint16 == 3) { |
168 |
+ SDP_GET8(type, start); |
169 |
+ switch (type) { |
170 |
+ case SDP_DATA_UINT8: |
171 |
+ case SDP_DATA_INT8: |
172 |
+ SDP_GET8(value.uint8, start); |
173 |
+ return value.uint8; |
174 |
+ break; |
175 |
+ |
176 |
+ case SDP_DATA_UINT16: |
177 |
+ case SDP_DATA_INT16: |
178 |
+ SDP_GET16(value.uint16, start); |
179 |
+ return value.uint16; |
180 |
+ break; |
181 |
+ |
182 |
+ case SDP_DATA_UINT32: |
183 |
+ case SDP_DATA_INT32: |
184 |
+ SDP_GET32(value.uint32, start); |
185 |
+ return value.uint32; |
186 |
+ break; |
187 |
+ |
188 |
+ default: |
189 |
+ sdp_close(ss); |
190 |
+ return -1; |
191 |
+ break; |
192 |
+ } |
193 |
+ } else { |
194 |
+ SDP_GET8(type, start); |
195 |
+ switch (type) { |
196 |
+ case SDP_DATA_SEQ8: |
197 |
+ case SDP_DATA_UINT8: |
198 |
+ case SDP_DATA_INT8: |
199 |
+ case SDP_DATA_BOOL: |
200 |
+ SDP_GET8(value.uint8, start); |
201 |
+ break; |
202 |
+ |
203 |
+ case SDP_DATA_SEQ16: |
204 |
+ case SDP_DATA_UINT16: |
205 |
+ case SDP_DATA_INT16: |
206 |
+ case SDP_DATA_UUID16: |
207 |
+ SDP_GET16(value.uint16, start); |
208 |
+ break; |
209 |
+ |
210 |
+ case SDP_DATA_SEQ32: |
211 |
+ case SDP_DATA_UINT32: |
212 |
+ case SDP_DATA_INT32: |
213 |
+ case SDP_DATA_UUID32: |
214 |
+ SDP_GET32(value.uint32, start); |
215 |
+ break; |
216 |
+ |
217 |
+ case SDP_DATA_UINT64: |
218 |
+ case SDP_DATA_INT64: |
219 |
+ SDP_GET64(value.uint64, start); |
220 |
+ break; |
221 |
+ |
222 |
+ case SDP_DATA_UINT128: |
223 |
+ case SDP_DATA_INT128: |
224 |
+ SDP_GET128(&value.int128, start); |
225 |
+ break; |
226 |
+ |
227 |
+ default: |
228 |
+ sdp_close(ss); |
229 |
+ return -1; |
230 |
+ break; |
231 |
+ } |
232 |
+ } |
233 |
+ } |
234 |
+ } |
235 |
+ start += len; |
236 |
+ break; |
237 |
+ |
238 |
+ case SDP_ATTR_PRIMARY_LANGUAGE_BASE_ID + SDP_ATTR_SERVICE_NAME_OFFSET: |
239 |
+ SDP_GET8(type, start); |
240 |
+ switch (type) { |
241 |
+ case SDP_DATA_STR8: |
242 |
+ case SDP_DATA_URL8: |
243 |
+ SDP_GET8(len, start); |
244 |
+ snprintf(name, sizeof(name), "%*.*s", len, len, (char *) start); |
245 |
+ start += len; |
246 |
+ break; |
247 |
+ |
248 |
+ case SDP_DATA_STR16: |
249 |
+ case SDP_DATA_URL16: |
250 |
+ SDP_GET16(len, start); |
251 |
+ snprintf(name, sizeof(name), "%*.*s", len, len, (char *) start); |
252 |
+ start += len; |
253 |
+ break; |
254 |
+ |
255 |
+ case SDP_DATA_STR32: |
256 |
+ case SDP_DATA_URL32: |
257 |
+ SDP_GET32(len, start); |
258 |
+ snprintf(name, sizeof(name), "%*.*s", len, len, (char *) start); |
259 |
+ start += len; |
260 |
+ break; |
261 |
+ |
262 |
+ default: |
263 |
+ sdp_close(ss); |
264 |
+ return -1; |
265 |
+ } |
266 |
+ if (name == NULL) |
267 |
+ return -1; |
268 |
+ |
269 |
+ if (strcmp(name, "gnapplet") == 0) { |
270 |
+ if (only_gnapplet != 0) |
271 |
+ getchan = 1; |
272 |
+ break; |
273 |
+ } |
274 |
+ |
275 |
+ if (strstr(name, "Nokia PC Suite") != NULL) |
276 |
+ break; |
277 |
+ |
278 |
+ if (strstr(name, "Bluetooth Serial Port") != NULL) |
279 |
+ break; |
280 |
+ |
281 |
+ if (strstr(name, "m-Router Connectivity") != NULL) |
282 |
+ break; |
283 |
+ |
284 |
+ getchan = 1; |
285 |
+ break; |
286 |
+ } |
287 |
+ } |
288 |
+ |
289 |
+ sdp_close(ss); |
290 |
+ return -1; |
291 |
+} |
292 |
+ |
293 |
+#else |
294 |
/* |
295 |
* Taken from gnome-phone-manager |
296 |
*/ |
297 |
@@ -204,6 +467,8 @@ |
298 |
return channel; |
299 |
} |
300 |
|
301 |
+#endif |
302 |
+ |
303 |
static int get_serial_channel(bdaddr_t *device) |
304 |
{ |
305 |
bdaddr_t src; |
306 |
@@ -211,9 +476,15 @@ |
307 |
|
308 |
bacpy(&src, BDADDR_ANY); |
309 |
|
310 |
+#ifdef HAVE_BLUETOOTH_NETGRAPH /* FreeBSD / netgraph */ |
311 |
+ channel = find_service_channel(&src, device, 0, SDP_SERVICE_CLASS_SERIAL_PORT); |
312 |
+ if (channel < 0) |
313 |
+ channel = find_service_channel(&src, device, 0, SDP_SERVICE_CLASS_DIALUP_NETWORKING); |
314 |
+#else |
315 |
channel = find_service_channel(&src, device, 0, SERIAL_PORT_SVCLASS_ID); |
316 |
if (channel < 0) |
317 |
channel = find_service_channel(&src, device, 0, DIALUP_NET_SVCLASS_ID); |
318 |
+#endif |
319 |
|
320 |
return channel; |
321 |
} |