Author: thompsa
Date: Thu May 24 01:31:10 2012
New Revision: 235870
URL: http://svn.freebsd.org/changeset/base/235870

Log:
  Allow the socket list to be limited to a specific jail id.
  
  No objections:        current@

Modified:
  head/usr.bin/sockstat/sockstat.1
  head/usr.bin/sockstat/sockstat.c

Modified: head/usr.bin/sockstat/sockstat.1
==============================================================================
--- head/usr.bin/sockstat/sockstat.1    Thu May 24 01:30:17 2012        
(r235869)
+++ head/usr.bin/sockstat/sockstat.1    Thu May 24 01:31:10 2012        
(r235870)
@@ -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

Modified: head/usr.bin/sockstat/sockstat.c
==============================================================================
--- head/usr.bin/sockstat/sockstat.c    Thu May 24 01:30:17 2012        
(r235869)
+++ head/usr.bin/sockstat/sockstat.c    Thu May 24 01:31:10 2012        
(r235870)
@@ -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;
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to