Date: Wed, 16 May 2012 15:12:50 +1200 From: Andrew Thompson <thompsa@FreeBSD.org> To: "current@freebsd.org Current" <current@freebsd.org> Subject: sockstat & jid patch Message-ID: <CAFAOGNSFT_pAsj_vfsWQSv1V3SiJq55y%2BKmWqaftuZwi%2B0Sr5A@mail.gmail.com>
next in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
Hi,
Here is a quick patch to limit the sockstat output to a specific jail
id, this is useful to verify which sockets a jail has open. A jid of 0
will show the host system.
This will result in an extra syscall per socket when -j is set but I
do not think warrants a process cache.
Any objections?
Andrew
[-- Attachment #2 --]
Index: sockstat.1
===================================================================
--- sockstat.1 (revision 235453)
+++ sockstat.1 (working copy)
@@ -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
Index: sockstat.c
===================================================================
--- sockstat.c (revision 235453)
+++ sockstat.c (working copy)
@@ -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;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAFAOGNSFT_pAsj_vfsWQSv1V3SiJq55y%2BKmWqaftuZwi%2B0Sr5A>
