Allow the socket list to be limited to a specific jail id.

No objections:	current@
This commit is contained in:
Andrew Thompson 2012-05-24 01:31:10 +00:00
parent 41d25f72a0
commit 00feaafdf8
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=235870
2 changed files with 35 additions and 2 deletions

View File

@ -27,7 +27,7 @@
.\" .\"
.\" $FreeBSD$ .\" $FreeBSD$
.\" .\"
.Dd January 24, 2012 .Dd May 16, 2012
.Dt SOCKSTAT 1 .Dt SOCKSTAT 1
.Os .Os
.Sh NAME .Sh NAME
@ -36,6 +36,7 @@
.Sh SYNOPSIS .Sh SYNOPSIS
.Nm .Nm
.Op Fl 46cLlu .Op Fl 46cLlu
.Op Fl j Ar jid
.Op Fl p Ar ports .Op Fl p Ar ports
.Op Fl P Ar protocols .Op Fl P Ar protocols
.Sh DESCRIPTION .Sh DESCRIPTION
@ -57,6 +58,8 @@ Show
(IPv6) sockets. (IPv6) sockets.
.It Fl c .It Fl c
Show connected sockets. Show connected sockets.
.It Fl j Ar jid
Show only sockets belonging to the specified jail ID.
.It Fl L .It Fl L
Only show Internet sockets if the local or foreign addresses are not Only show Internet sockets if the local or foreign addresses are not
in the loopback network prefix in the loopback network prefix

View File

@ -62,6 +62,7 @@ __FBSDID("$FreeBSD$");
static int opt_4; /* Show IPv4 sockets */ static int opt_4; /* Show IPv4 sockets */
static int opt_6; /* Show IPv6 sockets */ static int opt_6; /* Show IPv6 sockets */
static int opt_c; /* Show connected 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; /* Don't show IPv4 or IPv6 loopback sockets */
static int opt_l; /* Show listening sockets */ static int opt_l; /* Show listening sockets */
static int opt_u; /* Show Unix domain sockets */ static int opt_u; /* Show Unix domain sockets */
@ -548,6 +549,27 @@ getprocname(pid_t pid)
return (proc.ki_comm); return (proc.ki_comm);
} }
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 static int
check_ports(struct sock *s) check_ports(struct sock *s)
{ {
@ -643,6 +665,8 @@ display(void)
for (xf = xfiles, n = 0; n < nxfiles; ++n, ++xf) { for (xf = xfiles, n = 0; n < nxfiles; ++n, ++xf) {
if (xf->xf_data == NULL) if (xf->xf_data == NULL)
continue; continue;
if (opt_j >= 0 && opt_j != getprocjid(xf->xf_pid))
continue;
hash = (int)((uintptr_t)xf->xf_data % HASHSIZE); hash = (int)((uintptr_t)xf->xf_data % HASHSIZE);
for (s = sockhash[hash]; s != NULL; s = s->next) for (s = sockhash[hash]; s != NULL; s = s->next)
if ((void *)s->socket == xf->xf_data) if ((void *)s->socket == xf->xf_data)
@ -668,6 +692,8 @@ display(void)
pos += xprintf("%d ", xf->xf_fd); pos += xprintf("%d ", xf->xf_fd);
displaysock(s, pos); displaysock(s, pos);
} }
if (opt_j >= 0)
return;
for (hash = 0; hash < HASHSIZE; hash++) { for (hash = 0; hash < HASHSIZE; hash++) {
for (s = sockhash[hash]; s != NULL; s = s->next) { for (s = sockhash[hash]; s != NULL; s = s->next) {
if (s->shown) if (s->shown)
@ -716,7 +742,8 @@ main(int argc, char *argv[])
int protos_defined = -1; int protos_defined = -1;
int o, i; 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) { switch (o) {
case '4': case '4':
opt_4 = 1; opt_4 = 1;
@ -727,6 +754,9 @@ main(int argc, char *argv[])
case 'c': case 'c':
opt_c = 1; opt_c = 1;
break; break;
case 'j':
opt_j = atoi(optarg);
break;
case 'L': case 'L':
opt_L = 1; opt_L = 1;
break; break;