diff -ruN /usr/src/sys/sys/sysctl.h.orig sys/sys/sysctl.h --- /usr/src/sys/sys/sysctl.h.orig Fri Apr 7 10:40:38 2006 +++ sys/sys/sysctl.h Mon Jun 5 20:53:21 2006 @@ -430,6 +430,7 @@ #define KERN_PROC_RGID 10 /* by real group id */ #define KERN_PROC_GID 11 /* by effective group id */ #define KERN_PROC_PATHNAME 12 /* path to executable */ +#define KERN_PROC_JID 13 /* by effective jail id */ #define KERN_PROC_INC_THREAD 0x10 /* * modifier for pid, pgrp, tty, * uid, ruid, gid, rgid and proc diff -ruN /usr/src/sys/kern/kern_proc.c.orig sys/kern/kern_proc.c --- /usr/src/sys/kern/kern_proc.c.orig Tue Jan 17 15:24:37 2006 +++ sys/kern/kern_proc.c Tue Jun 6 10:19:28 2006 @@ -1084,6 +1084,15 @@ } break; + case KERN_PROC_JID: + if (p->p_ucred == NULL || !jailed(p->p_ucred) || + jailed(curthread->td_ucred) || + p->p_ucred->cr_prison->pr_id != (int)name[0]) { + PROC_UNLOCK(p); + continue; + } + break; + case KERN_PROC_PROC: break; @@ -1300,6 +1309,9 @@ static SYSCTL_NODE(_kern_proc, KERN_PROC_PID, pid, CTLFLAG_RD, sysctl_kern_proc, "Process table"); +static SYSCTL_NODE(_kern_proc, KERN_PROC_JID, jid, CTLFLAG_RD, + sysctl_kern_proc, "Process table"); + static SYSCTL_NODE(_kern_proc, KERN_PROC_PROC, proc, CTLFLAG_RD, sysctl_kern_proc, "Return process table, no threads"); @@ -1335,6 +1347,9 @@ CTLFLAG_RD, sysctl_kern_proc, "Process table"); static SYSCTL_NODE(_kern_proc, (KERN_PROC_PID | KERN_PROC_INC_THREAD), pid_td, + CTLFLAG_RD, sysctl_kern_proc, "Process table"); + +static SYSCTL_NODE(_kern_proc, (KERN_PROC_JID | KERN_PROC_INC_THREAD), jid_td, CTLFLAG_RD, sysctl_kern_proc, "Process table"); static SYSCTL_NODE(_kern_proc, (KERN_PROC_PROC | KERN_PROC_INC_THREAD), proc_td, diff -ruN /usr/src/usr.bin/fstat/fstat.c.orig usr.bin/fstat/fstat.c --- /usr/src/usr.bin/fstat/fstat.c.orig Tue Jan 17 15:24:43 2006 +++ usr.bin/fstat/fstat.c Tue Jun 6 07:59:06 2006 @@ -119,6 +119,7 @@ int fsflg, /* show files on same filesystem as file(s) argument */ pflg, /* show files open by a particular pid */ + jflg, /* show files open by a particular jid */ uflg; /* show files open by a particular (effective) user */ int checkfile; /* true if restricting to particular files or filesystems */ int nflg; /* (numerical) display f.s. and rdev as dev_t */ @@ -166,7 +167,7 @@ arg = 0; what = KERN_PROC_ALL; nlistf = memf = NULL; - while ((ch = getopt(argc, argv, "fmnp:u:vN:M:")) != -1) + while ((ch = getopt(argc, argv, "fmnp:u:vN:M:j:")) != -1) switch((char)ch) { case 'f': fsflg = 1; @@ -201,6 +202,16 @@ what = KERN_PROC_UID; arg = passwd->pw_uid; break; + case 'j': + if (jflg++) + usage(); + if (!isdigit(*optarg)) { + warnx("-j requires a jail id"); + usage(); + } + what = KERN_PROC_JID; + arg = atoi(optarg); + break; case 'v': vflg = 1; break; @@ -942,6 +953,6 @@ usage(void) { (void)fprintf(stderr, - "usage: fstat [-fmnv] [-M core] [-N system] [-p pid] [-u user] [file ...]\n"); + "usage: fstat [-fmnv] [-M core] [-N system] [-p pid] [-j jid] [-u user] [file ...]\n"); exit(1); } diff -ruN /usr/src/lib/libkvm/kvm_proc.c.orig lib/libkvm/kvm_proc.c --- /usr/src/lib/libkvm/kvm_proc.c.orig Fri Jun 24 08:37:04 2005 +++ lib/libkvm/kvm_proc.c Mon Jun 5 21:00:49 2006 @@ -203,6 +203,11 @@ if (kp->ki_ruid != (uid_t)arg) continue; break; + + case KERN_PROC_JID: + if (kp->ki_jid != (int)arg) + continue; + break; } /* * We're going to add another proc to the set. If this