Skip site navigation (1)Skip section navigation (2)
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>