summaryrefslogtreecommitdiffstats
path: root/usr.bin/bluetooth/btsockstat
diff options
context:
space:
mode:
authorjulian <julian@FreeBSD.org>2003-05-10 21:44:42 +0000
committerjulian <julian@FreeBSD.org>2003-05-10 21:44:42 +0000
commitdc5734d94b071df224b65d45b95d9ae7c5d563ab (patch)
treeed7d8caf163274b56933e0b801c52beb10b3260d /usr.bin/bluetooth/btsockstat
parent9e09746efa5431d5af0baf849575917d37cfdb76 (diff)
downloadFreeBSD-src-dc5734d94b071df224b65d45b95d9ae7c5d563ab.zip
FreeBSD-src-dc5734d94b071df224b65d45b95d9ae7c5d563ab.tar.gz
Part one of undating the bluetooth code to the newest version
Submitted by: Maksim Yevmenkin <m_evmenkin@yahoo.com> Approved by: re@
Diffstat (limited to 'usr.bin/bluetooth/btsockstat')
-rw-r--r--usr.bin/bluetooth/btsockstat/Makefile6
-rw-r--r--usr.bin/bluetooth/btsockstat/btsockstat.135
-rw-r--r--usr.bin/bluetooth/btsockstat/btsockstat.c196
3 files changed, 207 insertions, 30 deletions
diff --git a/usr.bin/bluetooth/btsockstat/Makefile b/usr.bin/bluetooth/btsockstat/Makefile
index ea78892..7614881 100644
--- a/usr.bin/bluetooth/btsockstat/Makefile
+++ b/usr.bin/bluetooth/btsockstat/Makefile
@@ -1,14 +1,16 @@
-# $Id: Makefile,v 1.1.1.1 2002/09/09 16:12:49 max Exp $
+# $Id: Makefile,v 1.3 2003/03/24 23:59:49 max Exp $
# $FreeBSD$
PROG= btsockstat
+BINGRP= kmem
+BINMODE= 2555
MAN1= btsockstat.1
DESTDIR= /usr/bin/
MANDIR= ../share/man/man
WARNS?= 2
-CFLAGS+= -g -I../../../sys/netgraph/bluetooth/include/
+CFLAGS+= -g -I${.CURDIR}/../../../sys/netgraph/bluetooth/include/
SRCS= btsockstat.c
DPADD= ${LIBKVM}
diff --git a/usr.bin/bluetooth/btsockstat/btsockstat.1 b/usr.bin/bluetooth/btsockstat/btsockstat.1
index 357edd2..608958d 100644
--- a/usr.bin/bluetooth/btsockstat/btsockstat.1
+++ b/usr.bin/bluetooth/btsockstat/btsockstat.1
@@ -1,3 +1,5 @@
+.\" btsockstat.1
+.\"
.\" Copyright (c) 2001-2002 Maksim Yevmenkin <m_evmenkin@yahoo.com>
.\" All rights reserved.
.\"
@@ -22,8 +24,8 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
+.\" $Id: btsockstat.1,v 1.4 2003/04/27 19:25:15 max Exp $
.\" $FreeBSD$
-.\"
.Dd August 31, 2002
.Dt BTSOCKSTAT 1
.Os
@@ -33,43 +35,42 @@
.Sh SYNOPSIS
.Nm
.Op Fl p Ar protocol
-.Op Fl r
+.Op Fl r
.Op Fl M Ar core
+.Op Fl h
.Sh DESCRIPTION
The
-.Nm
-utility symbolically displays the contents of various Bluetooth sockets
-related data structures.
-There are few output formats, depending on the
+.Nm
+command symbolically displays the contents of various Bluetooth sockets
+related data structures. There are few output formats, depending on the
options for the information presented.
-The
.Nm
-utility
-will print results to the standard output and error messages to the
+will print results to the standard output and error messages to the
standard error.
.Pp
The options are as follows:
.Bl -tag -width indent
.It Fl p Ar protocol
-Display a list of active sockets (protocol control blocks) for each
-specified protocol.
-Supported protocols are:
-.Cm hci_raw , l2cap_raw
+Display a list of active sockets (protocol control blocks) for each
+specified protocol. Supported protocols are:
+.Cm hci_raw , l2cap_raw , l2cap, rfcomm
and
-.Cm l2cap .
+.Cm rfcomm_s .
.It Fl r
Display a list of active routing entries (if any) for specified protocol.
.It Fl M Ar core
-Extract values associated with the name list from the specified core
+Extract values associated with the name list from the specified core
instead of the default
.Pa /dev/kmem .
+.It Fl h
+Display usage message and exit.
.El
.Sh BUGS
-Most likely.
-Please report if found.
+Most likely. Please report if found.
.Sh DIAGNOSTICS
.Ex -std
.Sh SEE ALSO
.Xr ng_btsocket 4
.Sh AUTHORS
.An Maksim Yevmenkin Aq m_evmenkin@yahoo.com
+
diff --git a/usr.bin/bluetooth/btsockstat/btsockstat.c b/usr.bin/bluetooth/btsockstat/btsockstat.c
index d123502..7911f40 100644
--- a/usr.bin/bluetooth/btsockstat/btsockstat.c
+++ b/usr.bin/bluetooth/btsockstat/btsockstat.c
@@ -25,7 +25,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: btsockstat.c,v 1.2 2002/09/16 19:40:14 max Exp $
+ * $Id: btsockstat.c,v 1.4 2003/03/29 22:28:18 max Exp $
* $FreeBSD$
*/
@@ -45,11 +45,13 @@
#include <kvm.h>
#include <limits.h>
+#include <ng_bluetooth.h>
#include <ng_hci.h>
#include <ng_l2cap.h>
#include <ng_btsocket.h>
#include <ng_btsocket_hci_raw.h>
#include <ng_btsocket_l2cap.h>
+#include <ng_btsocket_rfcomm.h>
#include <stdio.h>
#include <stdlib.h>
@@ -60,6 +62,8 @@ static void hcirawpr (kvm_t *kvmd, u_long addr);
static void l2caprawpr (kvm_t *kvmd, u_long addr);
static void l2cappr (kvm_t *kvmd, u_long addr);
static void l2caprtpr (kvm_t *kvmd, u_long addr);
+static void rfcommpr (kvm_t *kvmd, u_long addr);
+static void rfcommpr_s (kvm_t *kvmd, u_long addr);
static kvm_t * kopen (char const *memf);
static int kread (kvm_t *kvmd, u_long addr, char *buffer, int size);
@@ -81,9 +85,16 @@ static struct nlist nl[] = {
{ "_ng_btsocket_l2cap_raw_rt" },
#define N_L2CAP_RT 4
{ "_ng_btsocket_l2cap_rt" },
+#define N_RFCOMM 5
+ { "_ng_btsocket_rfcomm_sockets" },
+#define N_RFCOMM_S 6
+ { "_ng_btsocket_rfcomm_sessions" },
{ "" },
};
+#define state2str(x) \
+ (((x) >= sizeof(states)/sizeof(states[0]))? "UNKNOWN" : states[(x)])
+
/*
* Main
*/
@@ -108,6 +119,10 @@ main(int argc, char *argv[])
proto = N_L2CAP_RAW;
else if (strcasecmp(optarg, "l2cap") == 0)
proto = N_L2CAP;
+ else if (strcasecmp(optarg, "rfcomm") == 0)
+ proto = N_RFCOMM;
+ else if (strcasecmp(optarg, "rfcomm_s") == 0)
+ proto = N_RFCOMM_S;
else
usage();
/* NOT REACHED */
@@ -124,10 +139,18 @@ main(int argc, char *argv[])
}
}
- if (proto == N_HCI_RAW && route)
+ if ((proto == N_HCI_RAW || proto == N_RFCOMM || proto == N_RFCOMM_S) && route)
usage();
/* NOT REACHED */
+ /*
+ * Discard setgid privileges if not the running kernel so that
+ * bad guys can't print interesting stuff from kernel memory.
+ */
+
+ if (memf != NULL)
+ setgid(getgid());
+
kvmd = kopen(memf);
if (kvmd == NULL)
return (1);
@@ -151,6 +174,14 @@ main(int argc, char *argv[])
l2cappr(kvmd, nl[N_L2CAP].n_value);
break;
+ case N_RFCOMM:
+ rfcommpr(kvmd, nl[N_RFCOMM].n_value);
+ break;
+
+ case N_RFCOMM_S:
+ rfcommpr_s(kvmd, nl[N_RFCOMM_S].n_value);
+ break;
+
default:
if (route) {
l2caprtpr(kvmd, nl[N_L2CAP_RAW_RT].n_value);
@@ -159,6 +190,8 @@ main(int argc, char *argv[])
hcirawpr(kvmd, nl[N_HCI_RAW].n_value);
l2caprawpr(kvmd, nl[N_L2CAP_RAW].n_value);
l2cappr(kvmd, nl[N_L2CAP].n_value);
+ rfcommpr_s(kvmd, nl[N_RFCOMM_S].n_value);
+ rfcommpr(kvmd, nl[N_RFCOMM].n_value);
}
break;
}
@@ -252,7 +285,7 @@ l2caprawpr(kvm_t *kvmd, u_long addr)
first = 0;
fprintf(stdout,
"Active raw L2CAP sockets\n" \
-"%-8.8s %-8.8s %-6.6s %-6.6s %-18.18s\n",
+"%-8.8s %-8.8s %-6.6s %-6.6s %-17.17s\n",
"Socket",
"PCB",
"Recv-Q",
@@ -270,7 +303,7 @@ l2caprawpr(kvm_t *kvmd, u_long addr)
pcb.src.b[2], pcb.src.b[1], pcb.src.b[0]);
fprintf(stdout,
-"%-8.8x %-8.8x %6d %6d %-18.18s\n",
+"%-8.8x %-8.8x %6d %6d %-17.17s\n",
(int) pcb.so,
(int) this,
so.so_rcv.sb_cc,
@@ -293,8 +326,6 @@ l2cappr(kvm_t *kvmd, u_long addr)
/* NG_BTSOCKET_L2CAP_OPEN */ "OPEN",
/* NG_BTSOCKET_L2CAP_DISCONNECTING */ "DISCON"
};
-#define state2str(x) \
- (((x) >= sizeof(states)/sizeof(states[0]))? "UNKNOWN" : states[(x)])
ng_btsocket_l2cap_pcb_p this = NULL, next = NULL;
ng_btsocket_l2cap_pcb_t pcb;
@@ -302,7 +333,6 @@ l2cappr(kvm_t *kvmd, u_long addr)
int first = 1;
char local[32], remote[32];
-
if (addr == 0)
return;
@@ -321,7 +351,7 @@ l2cappr(kvm_t *kvmd, u_long addr)
first = 0;
fprintf(stdout,
"Active L2CAP sockets\n" \
-"%-8.8s %-6.6s %-6.6s %-24.24s %-18.18s %-5.5s %s\n",
+"%-8.8s %-6.6s %-6.6s %-23.23s %-17.17s %-5.5s %s\n",
"PCB",
"Recv-Q",
"Send-Q",
@@ -350,7 +380,7 @@ l2cappr(kvm_t *kvmd, u_long addr)
pcb.dst.b[2], pcb.dst.b[1], pcb.dst.b[0]);
fprintf(stdout,
-"%-8.8x %6d %6d %-24.24s %-18.18s %-5d %s\n",
+"%-8.8x %6d %6d %-23.23s %-17.17s %-5d %s\n",
(int) this,
so.so_rcv.sb_cc,
so.so_snd.sb_cc,
@@ -391,7 +421,7 @@ l2caprtpr(kvm_t *kvmd, u_long addr)
fprintf(stdout,
"Known %sL2CAP routes\n", (addr == nl[N_L2CAP_RAW_RT].n_value)? "raw " : "");
fprintf(stdout,
-"%-8.8s %-8.8s %-18.18s\n", "RTentry",
+"%-8.8s %-8.8s %-17.17s\n", "RTentry",
"Hook",
"BD_ADDR");
}
@@ -405,7 +435,7 @@ l2caprtpr(kvm_t *kvmd, u_long addr)
rt.src.b[2], rt.src.b[1], rt.src.b[0]);
fprintf(stdout,
-"%-8.8x %-8.8x %-18.18s\n",
+"%-8.8x %-8.8x %-17.17s\n",
(int) this,
(int) rt.hook,
bdaddr);
@@ -413,6 +443,150 @@ l2caprtpr(kvm_t *kvmd, u_long addr)
} /* l2caprtpr */
/*
+ * Print RFCOMM sockets
+ */
+
+static void
+rfcommpr(kvm_t *kvmd, u_long addr)
+{
+ static char const * const states[] = {
+ /* NG_BTSOCKET_RFCOMM_DLC_CLOSED */ "CLOSED",
+ /* NG_BTSOCKET_RFCOMM_DLC_W4_CONNECT */ "W4CON",
+ /* NG_BTSOCKET_RFCOMM_DLC_CONFIGURING */ "CONFIG",
+ /* NG_BTSOCKET_RFCOMM_DLC_CONNECTING */ "CONN",
+ /* NG_BTSOCKET_RFCOMM_DLC_CONNECTED */ "OPEN",
+ /* NG_BTSOCKET_RFCOMM_DLC_DISCONNECTING */ "DISCON"
+ };
+
+ ng_btsocket_rfcomm_pcb_p this = NULL, next = NULL;
+ ng_btsocket_rfcomm_pcb_t pcb;
+ struct socket so;
+ int first = 1;
+ char local[32], remote[32];
+
+ if (addr == 0)
+ return;
+
+ if (kread(kvmd, addr, (char *) &this, sizeof(this)) < 0)
+ return;
+
+ for ( ; this != NULL; this = next) {
+ if (kread(kvmd, (u_long) this, (char *) &pcb, sizeof(pcb)) < 0)
+ return;
+ if (kread(kvmd, (u_long) pcb.so, (char *) &so, sizeof(so)) < 0)
+ return;
+
+ next = LIST_NEXT(&pcb, next);
+
+ if (first) {
+ first = 0;
+ fprintf(stdout,
+"Active RFCOMM sockets\n" \
+"%-8.8s %-6.6s %-6.6s %-17.17s %-17.17s %-4.4s %-4.4s %s\n",
+ "PCB",
+ "Recv-Q",
+ "Send-Q",
+ "Local address",
+ "Foreign address",
+ "Chan",
+ "DLCI",
+ "State");
+ }
+
+ if (memcmp(&pcb.src, NG_HCI_BDADDR_ANY, sizeof(pcb.src)) == 0) {
+ local[0] = '*';
+ local[1] = 0;
+ } else
+ snprintf(local, sizeof(local),
+"%02x:%02x:%02x:%02x:%02x:%02x",
+ pcb.src.b[5], pcb.src.b[4], pcb.src.b[3],
+ pcb.src.b[2], pcb.src.b[1], pcb.src.b[0]);
+
+ if (memcmp(&pcb.dst, NG_HCI_BDADDR_ANY, sizeof(pcb.dst)) == 0) {
+ remote[0] = '*';
+ remote[1] = 0;
+ } else
+ snprintf(remote, sizeof(remote),
+"%02x:%02x:%02x:%02x:%02x:%02x",
+ pcb.dst.b[5], pcb.dst.b[4], pcb.dst.b[3],
+ pcb.dst.b[2], pcb.dst.b[1], pcb.dst.b[0]);
+
+ fprintf(stdout,
+"%-8.8x %6d %6d %-17.17s %-17.17s %-4d %-4d %s\n",
+ (int) this,
+ so.so_rcv.sb_cc,
+ so.so_snd.sb_cc,
+ local,
+ remote,
+ pcb.channel,
+ pcb.dlci,
+ (so.so_options & SO_ACCEPTCONN)?
+ "LISTEN" : state2str(pcb.state));
+ }
+} /* rfcommpr */
+
+/*
+ * Print RFCOMM sessions
+ */
+
+static void
+rfcommpr_s(kvm_t *kvmd, u_long addr)
+{
+ static char const * const states[] = {
+ /* NG_BTSOCKET_RFCOMM_SESSION_CLOSED */ "CLOSED",
+ /* NG_BTSOCKET_RFCOMM_SESSION_LISTENING */ "LISTEN",
+ /* NG_BTSOCKET_RFCOMM_SESSION_CONNECTING */ "CONNECTING",
+ /* NG_BTSOCKET_RFCOMM_SESSION_CONNECTED */ "CONNECTED",
+ /* NG_BTSOCKET_RFCOMM_SESSION_OPEN */ "OPEN",
+ /* NG_BTSOCKET_RFCOMM_SESSION_DISCONNECTING */ "DISCONNECTING"
+ };
+
+ ng_btsocket_rfcomm_session_p this = NULL, next = NULL;
+ ng_btsocket_rfcomm_session_t s;
+ struct socket so;
+ int first = 1;
+
+ if (addr == 0)
+ return;
+
+ if (kread(kvmd, addr, (char *) &this, sizeof(this)) < 0)
+ return;
+
+ for ( ; this != NULL; this = next) {
+ if (kread(kvmd, (u_long) this, (char *) &s, sizeof(s)) < 0)
+ return;
+ if (kread(kvmd, (u_long) s.l2so, (char *) &so, sizeof(so)) < 0)
+ return;
+
+ next = LIST_NEXT(&s, next);
+
+ if (first) {
+ first = 0;
+ fprintf(stdout,
+"Active RFCOMM sessions\n" \
+"%-8.8s %-8.8s %-4.4s %-5.5s %-5.5s %-4.4s %s\n",
+ "L2PCB",
+ "PCB",
+ "Flags",
+ "MTU",
+ "Out-Q",
+ "DLCs",
+ "State");
+ }
+
+ fprintf(stdout,
+"%-8.8x %-8.8x %-4x %-5d %-5d %-4s %s\n",
+ (int) so.so_pcb,
+ (int) this,
+ s.flags,
+ s.mtu,
+ s.outq.len,
+ LIST_EMPTY(&s.dlcs)? "No" : "Yes",
+ state2str(s.state));
+ }
+} /* rfcommpr_s */
+
+/*
* Open kvm
*/
OpenPOWER on IntegriCloud