summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--usr.bin/sockstat/sockstat.15
-rw-r--r--usr.bin/sockstat/sockstat.c32
2 files changed, 35 insertions, 2 deletions
diff --git a/usr.bin/sockstat/sockstat.1 b/usr.bin/sockstat/sockstat.1
index f38d9d7..8f744ed 100644
--- a/usr.bin/sockstat/sockstat.1
+++ b/usr.bin/sockstat/sockstat.1
@@ -27,7 +27,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd January 24, 2012
+.Dd May 16, 2012
.Dt SOCKSTAT 1
.Os
.Sh NAME
@@ -36,6 +36,7 @@
.Sh SYNOPSIS
.Nm
.Op Fl 46cLlu
+.Op Fl j Ar jid
.Op Fl p Ar ports
.Op Fl P Ar protocols
.Sh DESCRIPTION
@@ -57,6 +58,8 @@ Show
(IPv6) sockets.
.It Fl c
Show connected sockets.
+.It Fl j Ar jid
+Show only sockets belonging to the specified jail ID.
.It Fl L
Only show Internet sockets if the local or foreign addresses are not
in the loopback network prefix
diff --git a/usr.bin/sockstat/sockstat.c b/usr.bin/sockstat/sockstat.c
index 0114cc4..334fb93 100644
--- a/usr.bin/sockstat/sockstat.c
+++ b/usr.bin/sockstat/sockstat.c
@@ -62,6 +62,7 @@ __FBSDID("$FreeBSD$");
static int opt_4; /* Show IPv4 sockets */
static int opt_6; /* Show IPv6 sockets */
static int opt_c; /* Show connected sockets */
+static int opt_j; /* Show specified jail */
static int opt_L; /* Don't show IPv4 or IPv6 loopback sockets */
static int opt_l; /* Show listening sockets */
static int opt_u; /* Show Unix domain sockets */
@@ -549,6 +550,27 @@ getprocname(pid_t pid)
}
static int
+getprocjid(pid_t pid)
+{
+ static struct kinfo_proc proc;
+ size_t len;
+ int mib[4];
+
+ mib[0] = CTL_KERN;
+ mib[1] = KERN_PROC;
+ mib[2] = KERN_PROC_PID;
+ mib[3] = (int)pid;
+ len = sizeof proc;
+ if (sysctl(mib, 4, &proc, &len, NULL, 0) == -1) {
+ /* Do not warn if the process exits before we get its jid. */
+ if (errno != ESRCH)
+ warn("sysctl()");
+ return (-1);
+ }
+ return (proc.ki_jid);
+}
+
+static int
check_ports(struct sock *s)
{
int port;
@@ -643,6 +665,8 @@ display(void)
for (xf = xfiles, n = 0; n < nxfiles; ++n, ++xf) {
if (xf->xf_data == NULL)
continue;
+ if (opt_j >= 0 && opt_j != getprocjid(xf->xf_pid))
+ continue;
hash = (int)((uintptr_t)xf->xf_data % HASHSIZE);
for (s = sockhash[hash]; s != NULL; s = s->next)
if ((void *)s->socket == xf->xf_data)
@@ -668,6 +692,8 @@ display(void)
pos += xprintf("%d ", xf->xf_fd);
displaysock(s, pos);
}
+ if (opt_j >= 0)
+ return;
for (hash = 0; hash < HASHSIZE; hash++) {
for (s = sockhash[hash]; s != NULL; s = s->next) {
if (s->shown)
@@ -716,7 +742,8 @@ main(int argc, char *argv[])
int protos_defined = -1;
int o, i;
- while ((o = getopt(argc, argv, "46cLlp:P:uv")) != -1)
+ opt_j = -1;
+ while ((o = getopt(argc, argv, "46cj:Llp:P:uv")) != -1)
switch (o) {
case '4':
opt_4 = 1;
@@ -727,6 +754,9 @@ main(int argc, char *argv[])
case 'c':
opt_c = 1;
break;
+ case 'j':
+ opt_j = atoi(optarg);
+ break;
case 'L':
opt_L = 1;
break;
OpenPOWER on IntegriCloud