Deleted Added
full compact
btsockstat.c (107120) btsockstat.c (114878)
1/*
2 * btsockstat.c
3 *
4 * Copyright (c) 2001-2002 Maksim Yevmenkin <m_evmenkin@yahoo.com>
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions

--- 11 unchanged lines hidden (view full) ---

20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 *
1/*
2 * btsockstat.c
3 *
4 * Copyright (c) 2001-2002 Maksim Yevmenkin <m_evmenkin@yahoo.com>
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions

--- 11 unchanged lines hidden (view full) ---

20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 *
28 * $Id: btsockstat.c,v 1.2 2002/09/16 19:40:14 max Exp $
29 * $FreeBSD: head/usr.bin/bluetooth/btsockstat/btsockstat.c 107120 2002-11-20 23:01:59Z julian $
28 * $Id: btsockstat.c,v 1.4 2003/03/29 22:28:18 max Exp $
29 * $FreeBSD: head/usr.bin/bluetooth/btsockstat/btsockstat.c 114878 2003-05-10 21:44:42Z julian $
30 */
31
32#include <sys/types.h>
33#include <sys/callout.h>
34#include <sys/param.h>
35#include <sys/queue.h>
36#include <sys/socket.h>
37#include <sys/socketvar.h>
38
39#include <net/if.h>
40#include <net/if_var.h>
41
42#include <bitstring.h>
43#include <err.h>
44#include <fcntl.h>
45#include <kvm.h>
46#include <limits.h>
47
30 */
31
32#include <sys/types.h>
33#include <sys/callout.h>
34#include <sys/param.h>
35#include <sys/queue.h>
36#include <sys/socket.h>
37#include <sys/socketvar.h>
38
39#include <net/if.h>
40#include <net/if_var.h>
41
42#include <bitstring.h>
43#include <err.h>
44#include <fcntl.h>
45#include <kvm.h>
46#include <limits.h>
47
48#include <ng_bluetooth.h>
48#include <ng_hci.h>
49#include <ng_l2cap.h>
50#include <ng_btsocket.h>
51#include <ng_btsocket_hci_raw.h>
52#include <ng_btsocket_l2cap.h>
49#include <ng_hci.h>
50#include <ng_l2cap.h>
51#include <ng_btsocket.h>
52#include <ng_btsocket_hci_raw.h>
53#include <ng_btsocket_l2cap.h>
54#include <ng_btsocket_rfcomm.h>
53
54#include <stdio.h>
55#include <stdlib.h>
56#include <string.h>
57#include <unistd.h>
58
59static void hcirawpr (kvm_t *kvmd, u_long addr);
60static void l2caprawpr (kvm_t *kvmd, u_long addr);
61static void l2cappr (kvm_t *kvmd, u_long addr);
62static void l2caprtpr (kvm_t *kvmd, u_long addr);
55
56#include <stdio.h>
57#include <stdlib.h>
58#include <string.h>
59#include <unistd.h>
60
61static void hcirawpr (kvm_t *kvmd, u_long addr);
62static void l2caprawpr (kvm_t *kvmd, u_long addr);
63static void l2cappr (kvm_t *kvmd, u_long addr);
64static void l2caprtpr (kvm_t *kvmd, u_long addr);
65static void rfcommpr (kvm_t *kvmd, u_long addr);
66static void rfcommpr_s (kvm_t *kvmd, u_long addr);
63
64static kvm_t * kopen (char const *memf);
65static int kread (kvm_t *kvmd, u_long addr, char *buffer, int size);
66
67static void usage (void);
68
69/*
70 * List of symbols

--- 5 unchanged lines hidden (view full) ---

76#define N_L2CAP_RAW 1
77 { "_ng_btsocket_l2cap_raw_sockets" },
78#define N_L2CAP 2
79 { "_ng_btsocket_l2cap_sockets" },
80#define N_L2CAP_RAW_RT 3
81 { "_ng_btsocket_l2cap_raw_rt" },
82#define N_L2CAP_RT 4
83 { "_ng_btsocket_l2cap_rt" },
67
68static kvm_t * kopen (char const *memf);
69static int kread (kvm_t *kvmd, u_long addr, char *buffer, int size);
70
71static void usage (void);
72
73/*
74 * List of symbols

--- 5 unchanged lines hidden (view full) ---

80#define N_L2CAP_RAW 1
81 { "_ng_btsocket_l2cap_raw_sockets" },
82#define N_L2CAP 2
83 { "_ng_btsocket_l2cap_sockets" },
84#define N_L2CAP_RAW_RT 3
85 { "_ng_btsocket_l2cap_raw_rt" },
86#define N_L2CAP_RT 4
87 { "_ng_btsocket_l2cap_rt" },
88#define N_RFCOMM 5
89 { "_ng_btsocket_rfcomm_sockets" },
90#define N_RFCOMM_S 6
91 { "_ng_btsocket_rfcomm_sessions" },
84 { "" },
85};
86
92 { "" },
93};
94
95#define state2str(x) \
96 (((x) >= sizeof(states)/sizeof(states[0]))? "UNKNOWN" : states[(x)])
97
87/*
88 * Main
89 */
90
91int
92main(int argc, char *argv[])
93{
94 int opt, proto = -1, route = 0;

--- 8 unchanged lines hidden (view full) ---

103
104 case 'p':
105 if (strcasecmp(optarg, "hci_raw") == 0)
106 proto = N_HCI_RAW;
107 else if (strcasecmp(optarg, "l2cap_raw") == 0)
108 proto = N_L2CAP_RAW;
109 else if (strcasecmp(optarg, "l2cap") == 0)
110 proto = N_L2CAP;
98/*
99 * Main
100 */
101
102int
103main(int argc, char *argv[])
104{
105 int opt, proto = -1, route = 0;

--- 8 unchanged lines hidden (view full) ---

114
115 case 'p':
116 if (strcasecmp(optarg, "hci_raw") == 0)
117 proto = N_HCI_RAW;
118 else if (strcasecmp(optarg, "l2cap_raw") == 0)
119 proto = N_L2CAP_RAW;
120 else if (strcasecmp(optarg, "l2cap") == 0)
121 proto = N_L2CAP;
122 else if (strcasecmp(optarg, "rfcomm") == 0)
123 proto = N_RFCOMM;
124 else if (strcasecmp(optarg, "rfcomm_s") == 0)
125 proto = N_RFCOMM_S;
111 else
112 usage();
113 /* NOT REACHED */
114 break;
115
116 case 'r':
117 route = 1;
118 break;
119
120 case 'h':
121 default:
122 usage();
123 /* NOT REACHED */
124 }
125 }
126
126 else
127 usage();
128 /* NOT REACHED */
129 break;
130
131 case 'r':
132 route = 1;
133 break;
134
135 case 'h':
136 default:
137 usage();
138 /* NOT REACHED */
139 }
140 }
141
127 if (proto == N_HCI_RAW && route)
142 if ((proto == N_HCI_RAW || proto == N_RFCOMM || proto == N_RFCOMM_S) && route)
128 usage();
129 /* NOT REACHED */
130
143 usage();
144 /* NOT REACHED */
145
146 /*
147 * Discard setgid privileges if not the running kernel so that
148 * bad guys can't print interesting stuff from kernel memory.
149 */
150
151 if (memf != NULL)
152 setgid(getgid());
153
131 kvmd = kopen(memf);
132 if (kvmd == NULL)
133 return (1);
134
135 switch (proto) {
136 case N_HCI_RAW:
137 hcirawpr(kvmd, nl[N_HCI_RAW].n_value);
138 break;

--- 7 unchanged lines hidden (view full) ---

146
147 case N_L2CAP:
148 if (route)
149 l2caprtpr(kvmd, nl[N_L2CAP_RT].n_value);
150 else
151 l2cappr(kvmd, nl[N_L2CAP].n_value);
152 break;
153
154 kvmd = kopen(memf);
155 if (kvmd == NULL)
156 return (1);
157
158 switch (proto) {
159 case N_HCI_RAW:
160 hcirawpr(kvmd, nl[N_HCI_RAW].n_value);
161 break;

--- 7 unchanged lines hidden (view full) ---

169
170 case N_L2CAP:
171 if (route)
172 l2caprtpr(kvmd, nl[N_L2CAP_RT].n_value);
173 else
174 l2cappr(kvmd, nl[N_L2CAP].n_value);
175 break;
176
177 case N_RFCOMM:
178 rfcommpr(kvmd, nl[N_RFCOMM].n_value);
179 break;
180
181 case N_RFCOMM_S:
182 rfcommpr_s(kvmd, nl[N_RFCOMM_S].n_value);
183 break;
184
154 default:
155 if (route) {
156 l2caprtpr(kvmd, nl[N_L2CAP_RAW_RT].n_value);
157 l2caprtpr(kvmd, nl[N_L2CAP_RT].n_value);
158 } else {
159 hcirawpr(kvmd, nl[N_HCI_RAW].n_value);
160 l2caprawpr(kvmd, nl[N_L2CAP_RAW].n_value);
161 l2cappr(kvmd, nl[N_L2CAP].n_value);
185 default:
186 if (route) {
187 l2caprtpr(kvmd, nl[N_L2CAP_RAW_RT].n_value);
188 l2caprtpr(kvmd, nl[N_L2CAP_RT].n_value);
189 } else {
190 hcirawpr(kvmd, nl[N_HCI_RAW].n_value);
191 l2caprawpr(kvmd, nl[N_L2CAP_RAW].n_value);
192 l2cappr(kvmd, nl[N_L2CAP].n_value);
193 rfcommpr_s(kvmd, nl[N_RFCOMM_S].n_value);
194 rfcommpr(kvmd, nl[N_RFCOMM].n_value);
162 }
163 break;
164 }
165
166 return (kvm_close(kvmd));
167} /* main */
168
169/*

--- 77 unchanged lines hidden (view full) ---

247 return;
248
249 next = LIST_NEXT(&pcb, next);
250
251 if (first) {
252 first = 0;
253 fprintf(stdout,
254"Active raw L2CAP sockets\n" \
195 }
196 break;
197 }
198
199 return (kvm_close(kvmd));
200} /* main */
201
202/*

--- 77 unchanged lines hidden (view full) ---

280 return;
281
282 next = LIST_NEXT(&pcb, next);
283
284 if (first) {
285 first = 0;
286 fprintf(stdout,
287"Active raw L2CAP sockets\n" \
255"%-8.8s %-8.8s %-6.6s %-6.6s %-18.18s\n",
288"%-8.8s %-8.8s %-6.6s %-6.6s %-17.17s\n",
256 "Socket",
257 "PCB",
258 "Recv-Q",
259 "Send-Q",
260 "Local address");
261 }
262
263 if (memcmp(&pcb.src, NG_HCI_BDADDR_ANY, sizeof(pcb.src)) == 0) {
264 bdaddr[0] = '*';
265 bdaddr[1] = 0;
266 } else
267 snprintf(bdaddr, sizeof(bdaddr),
268"%02x:%02x:%02x:%02x:%02x:%02x",
269 pcb.src.b[5], pcb.src.b[4], pcb.src.b[3],
270 pcb.src.b[2], pcb.src.b[1], pcb.src.b[0]);
271
272 fprintf(stdout,
289 "Socket",
290 "PCB",
291 "Recv-Q",
292 "Send-Q",
293 "Local address");
294 }
295
296 if (memcmp(&pcb.src, NG_HCI_BDADDR_ANY, sizeof(pcb.src)) == 0) {
297 bdaddr[0] = '*';
298 bdaddr[1] = 0;
299 } else
300 snprintf(bdaddr, sizeof(bdaddr),
301"%02x:%02x:%02x:%02x:%02x:%02x",
302 pcb.src.b[5], pcb.src.b[4], pcb.src.b[3],
303 pcb.src.b[2], pcb.src.b[1], pcb.src.b[0]);
304
305 fprintf(stdout,
273"%-8.8x %-8.8x %6d %6d %-18.18s\n",
306"%-8.8x %-8.8x %6d %6d %-17.17s\n",
274 (int) pcb.so,
275 (int) this,
276 so.so_rcv.sb_cc,
277 so.so_snd.sb_cc,
278 bdaddr);
279 }
280} /* l2caprawpr */
281

--- 6 unchanged lines hidden (view full) ---

288{
289 static char const * const states[] = {
290 /* NG_BTSOCKET_L2CAP_CLOSED */ "CLOSED",
291 /* NG_BTSOCKET_L2CAP_CONNECTING */ "CON",
292 /* NG_BTSOCKET_L2CAP_CONFIGURING */ "CONFIG",
293 /* NG_BTSOCKET_L2CAP_OPEN */ "OPEN",
294 /* NG_BTSOCKET_L2CAP_DISCONNECTING */ "DISCON"
295 };
307 (int) pcb.so,
308 (int) this,
309 so.so_rcv.sb_cc,
310 so.so_snd.sb_cc,
311 bdaddr);
312 }
313} /* l2caprawpr */
314

--- 6 unchanged lines hidden (view full) ---

321{
322 static char const * const states[] = {
323 /* NG_BTSOCKET_L2CAP_CLOSED */ "CLOSED",
324 /* NG_BTSOCKET_L2CAP_CONNECTING */ "CON",
325 /* NG_BTSOCKET_L2CAP_CONFIGURING */ "CONFIG",
326 /* NG_BTSOCKET_L2CAP_OPEN */ "OPEN",
327 /* NG_BTSOCKET_L2CAP_DISCONNECTING */ "DISCON"
328 };
296#define state2str(x) \
297 (((x) >= sizeof(states)/sizeof(states[0]))? "UNKNOWN" : states[(x)])
298
299 ng_btsocket_l2cap_pcb_p this = NULL, next = NULL;
300 ng_btsocket_l2cap_pcb_t pcb;
301 struct socket so;
302 int first = 1;
303 char local[32], remote[32];
304
329
330 ng_btsocket_l2cap_pcb_p this = NULL, next = NULL;
331 ng_btsocket_l2cap_pcb_t pcb;
332 struct socket so;
333 int first = 1;
334 char local[32], remote[32];
335
305
306 if (addr == 0)
307 return;
308
309 if (kread(kvmd, addr, (char *) &this, sizeof(this)) < 0)
310 return;
311
312 for ( ; this != NULL; this = next) {
313 if (kread(kvmd, (u_long) this, (char *) &pcb, sizeof(pcb)) < 0)
314 return;
315 if (kread(kvmd, (u_long) pcb.so, (char *) &so, sizeof(so)) < 0)
316 return;
317
318 next = LIST_NEXT(&pcb, next);
319
320 if (first) {
321 first = 0;
322 fprintf(stdout,
323"Active L2CAP sockets\n" \
336 if (addr == 0)
337 return;
338
339 if (kread(kvmd, addr, (char *) &this, sizeof(this)) < 0)
340 return;
341
342 for ( ; this != NULL; this = next) {
343 if (kread(kvmd, (u_long) this, (char *) &pcb, sizeof(pcb)) < 0)
344 return;
345 if (kread(kvmd, (u_long) pcb.so, (char *) &so, sizeof(so)) < 0)
346 return;
347
348 next = LIST_NEXT(&pcb, next);
349
350 if (first) {
351 first = 0;
352 fprintf(stdout,
353"Active L2CAP sockets\n" \
324"%-8.8s %-6.6s %-6.6s %-24.24s %-18.18s %-5.5s %s\n",
354"%-8.8s %-6.6s %-6.6s %-23.23s %-17.17s %-5.5s %s\n",
325 "PCB",
326 "Recv-Q",
327 "Send-Q",
328 "Local address/PSM",
329 "Foreign address",
330 "CID",
331 "State");
332 }

--- 12 unchanged lines hidden (view full) ---

345 remote[1] = 0;
346 } else
347 snprintf(remote, sizeof(remote),
348"%02x:%02x:%02x:%02x:%02x:%02x",
349 pcb.dst.b[5], pcb.dst.b[4], pcb.dst.b[3],
350 pcb.dst.b[2], pcb.dst.b[1], pcb.dst.b[0]);
351
352 fprintf(stdout,
355 "PCB",
356 "Recv-Q",
357 "Send-Q",
358 "Local address/PSM",
359 "Foreign address",
360 "CID",
361 "State");
362 }

--- 12 unchanged lines hidden (view full) ---

375 remote[1] = 0;
376 } else
377 snprintf(remote, sizeof(remote),
378"%02x:%02x:%02x:%02x:%02x:%02x",
379 pcb.dst.b[5], pcb.dst.b[4], pcb.dst.b[3],
380 pcb.dst.b[2], pcb.dst.b[1], pcb.dst.b[0]);
381
382 fprintf(stdout,
353"%-8.8x %6d %6d %-24.24s %-18.18s %-5d %s\n",
383"%-8.8x %6d %6d %-23.23s %-17.17s %-5d %s\n",
354 (int) this,
355 so.so_rcv.sb_cc,
356 so.so_snd.sb_cc,
357 local,
358 remote,
359 pcb.cid,
360 (so.so_options & SO_ACCEPTCONN)?
361 "LISTEN" : state2str(pcb.state));

--- 24 unchanged lines hidden (view full) ---

386
387 next = LIST_NEXT(&rt, next);
388
389 if (first) {
390 first = 0;
391 fprintf(stdout,
392"Known %sL2CAP routes\n", (addr == nl[N_L2CAP_RAW_RT].n_value)? "raw " : "");
393 fprintf(stdout,
384 (int) this,
385 so.so_rcv.sb_cc,
386 so.so_snd.sb_cc,
387 local,
388 remote,
389 pcb.cid,
390 (so.so_options & SO_ACCEPTCONN)?
391 "LISTEN" : state2str(pcb.state));

--- 24 unchanged lines hidden (view full) ---

416
417 next = LIST_NEXT(&rt, next);
418
419 if (first) {
420 first = 0;
421 fprintf(stdout,
422"Known %sL2CAP routes\n", (addr == nl[N_L2CAP_RAW_RT].n_value)? "raw " : "");
423 fprintf(stdout,
394"%-8.8s %-8.8s %-18.18s\n", "RTentry",
424"%-8.8s %-8.8s %-17.17s\n", "RTentry",
395 "Hook",
396 "BD_ADDR");
397 }
398
399 if (memcmp(&rt.src, NG_HCI_BDADDR_ANY, sizeof(rt.src)) == 0) {
400 bdaddr[0] = '-';
401 bdaddr[1] = 0;
402 } else
403 snprintf(bdaddr, sizeof(bdaddr),
404"%02x:%02x:%02x:%02x:%02x:%02x", rt.src.b[5], rt.src.b[4], rt.src.b[3],
405 rt.src.b[2], rt.src.b[1], rt.src.b[0]);
406
407 fprintf(stdout,
425 "Hook",
426 "BD_ADDR");
427 }
428
429 if (memcmp(&rt.src, NG_HCI_BDADDR_ANY, sizeof(rt.src)) == 0) {
430 bdaddr[0] = '-';
431 bdaddr[1] = 0;
432 } else
433 snprintf(bdaddr, sizeof(bdaddr),
434"%02x:%02x:%02x:%02x:%02x:%02x", rt.src.b[5], rt.src.b[4], rt.src.b[3],
435 rt.src.b[2], rt.src.b[1], rt.src.b[0]);
436
437 fprintf(stdout,
408"%-8.8x %-8.8x %-18.18s\n",
438"%-8.8x %-8.8x %-17.17s\n",
409 (int) this,
410 (int) rt.hook,
411 bdaddr);
412 }
413} /* l2caprtpr */
414
415/*
439 (int) this,
440 (int) rt.hook,
441 bdaddr);
442 }
443} /* l2caprtpr */
444
445/*
446 * Print RFCOMM sockets
447 */
448
449static void
450rfcommpr(kvm_t *kvmd, u_long addr)
451{
452 static char const * const states[] = {
453 /* NG_BTSOCKET_RFCOMM_DLC_CLOSED */ "CLOSED",
454 /* NG_BTSOCKET_RFCOMM_DLC_W4_CONNECT */ "W4CON",
455 /* NG_BTSOCKET_RFCOMM_DLC_CONFIGURING */ "CONFIG",
456 /* NG_BTSOCKET_RFCOMM_DLC_CONNECTING */ "CONN",
457 /* NG_BTSOCKET_RFCOMM_DLC_CONNECTED */ "OPEN",
458 /* NG_BTSOCKET_RFCOMM_DLC_DISCONNECTING */ "DISCON"
459 };
460
461 ng_btsocket_rfcomm_pcb_p this = NULL, next = NULL;
462 ng_btsocket_rfcomm_pcb_t pcb;
463 struct socket so;
464 int first = 1;
465 char local[32], remote[32];
466
467 if (addr == 0)
468 return;
469
470 if (kread(kvmd, addr, (char *) &this, sizeof(this)) < 0)
471 return;
472
473 for ( ; this != NULL; this = next) {
474 if (kread(kvmd, (u_long) this, (char *) &pcb, sizeof(pcb)) < 0)
475 return;
476 if (kread(kvmd, (u_long) pcb.so, (char *) &so, sizeof(so)) < 0)
477 return;
478
479 next = LIST_NEXT(&pcb, next);
480
481 if (first) {
482 first = 0;
483 fprintf(stdout,
484"Active RFCOMM sockets\n" \
485"%-8.8s %-6.6s %-6.6s %-17.17s %-17.17s %-4.4s %-4.4s %s\n",
486 "PCB",
487 "Recv-Q",
488 "Send-Q",
489 "Local address",
490 "Foreign address",
491 "Chan",
492 "DLCI",
493 "State");
494 }
495
496 if (memcmp(&pcb.src, NG_HCI_BDADDR_ANY, sizeof(pcb.src)) == 0) {
497 local[0] = '*';
498 local[1] = 0;
499 } else
500 snprintf(local, sizeof(local),
501"%02x:%02x:%02x:%02x:%02x:%02x",
502 pcb.src.b[5], pcb.src.b[4], pcb.src.b[3],
503 pcb.src.b[2], pcb.src.b[1], pcb.src.b[0]);
504
505 if (memcmp(&pcb.dst, NG_HCI_BDADDR_ANY, sizeof(pcb.dst)) == 0) {
506 remote[0] = '*';
507 remote[1] = 0;
508 } else
509 snprintf(remote, sizeof(remote),
510"%02x:%02x:%02x:%02x:%02x:%02x",
511 pcb.dst.b[5], pcb.dst.b[4], pcb.dst.b[3],
512 pcb.dst.b[2], pcb.dst.b[1], pcb.dst.b[0]);
513
514 fprintf(stdout,
515"%-8.8x %6d %6d %-17.17s %-17.17s %-4d %-4d %s\n",
516 (int) this,
517 so.so_rcv.sb_cc,
518 so.so_snd.sb_cc,
519 local,
520 remote,
521 pcb.channel,
522 pcb.dlci,
523 (so.so_options & SO_ACCEPTCONN)?
524 "LISTEN" : state2str(pcb.state));
525 }
526} /* rfcommpr */
527
528/*
529 * Print RFCOMM sessions
530 */
531
532static void
533rfcommpr_s(kvm_t *kvmd, u_long addr)
534{
535 static char const * const states[] = {
536 /* NG_BTSOCKET_RFCOMM_SESSION_CLOSED */ "CLOSED",
537 /* NG_BTSOCKET_RFCOMM_SESSION_LISTENING */ "LISTEN",
538 /* NG_BTSOCKET_RFCOMM_SESSION_CONNECTING */ "CONNECTING",
539 /* NG_BTSOCKET_RFCOMM_SESSION_CONNECTED */ "CONNECTED",
540 /* NG_BTSOCKET_RFCOMM_SESSION_OPEN */ "OPEN",
541 /* NG_BTSOCKET_RFCOMM_SESSION_DISCONNECTING */ "DISCONNECTING"
542 };
543
544 ng_btsocket_rfcomm_session_p this = NULL, next = NULL;
545 ng_btsocket_rfcomm_session_t s;
546 struct socket so;
547 int first = 1;
548
549 if (addr == 0)
550 return;
551
552 if (kread(kvmd, addr, (char *) &this, sizeof(this)) < 0)
553 return;
554
555 for ( ; this != NULL; this = next) {
556 if (kread(kvmd, (u_long) this, (char *) &s, sizeof(s)) < 0)
557 return;
558 if (kread(kvmd, (u_long) s.l2so, (char *) &so, sizeof(so)) < 0)
559 return;
560
561 next = LIST_NEXT(&s, next);
562
563 if (first) {
564 first = 0;
565 fprintf(stdout,
566"Active RFCOMM sessions\n" \
567"%-8.8s %-8.8s %-4.4s %-5.5s %-5.5s %-4.4s %s\n",
568 "L2PCB",
569 "PCB",
570 "Flags",
571 "MTU",
572 "Out-Q",
573 "DLCs",
574 "State");
575 }
576
577 fprintf(stdout,
578"%-8.8x %-8.8x %-4x %-5d %-5d %-4s %s\n",
579 (int) so.so_pcb,
580 (int) this,
581 s.flags,
582 s.mtu,
583 s.outq.len,
584 LIST_EMPTY(&s.dlcs)? "No" : "Yes",
585 state2str(s.state));
586 }
587} /* rfcommpr_s */
588
589/*
416 * Open kvm
417 */
418
419static kvm_t *
420kopen(char const *memf)
421{
422 kvm_t *kvmd = NULL;
423 char errbuf[_POSIX2_LINE_MAX];

--- 61 unchanged lines hidden ---
590 * Open kvm
591 */
592
593static kvm_t *
594kopen(char const *memf)
595{
596 kvm_t *kvmd = NULL;
597 char errbuf[_POSIX2_LINE_MAX];

--- 61 unchanged lines hidden ---