svn commit: r265229 - head/bin/ps
Bryan Drewery
bdrewery at FreeBSD.org
Fri May 2 15:05:48 UTC 2014
Author: bdrewery
Date: Fri May 2 15:05:47 2014
New Revision: 265229
URL: http://svnweb.freebsd.org/changeset/base/265229
Log:
Add -J to filter by matching jail IDs and names.
-J 0 can be used to show only host processes.
Patch partially based on work by bz@
PR: bin/78763
MFC after: 2 weeks
Relnotes: yes
Modified:
head/bin/ps/Makefile
head/bin/ps/ps.1
head/bin/ps/ps.c
Modified: head/bin/ps/Makefile
==============================================================================
--- head/bin/ps/Makefile Fri May 2 14:47:53 2014 (r265228)
+++ head/bin/ps/Makefile Fri May 2 15:05:47 2014 (r265229)
@@ -11,7 +11,7 @@ SRCS= fmt.c keyword.c nlist.c print.c ps
# on large systems.
#
CFLAGS+=-DLAZY_PS
-DPADD= ${LIBM} ${LIBKVM}
-LDADD= -lm -lkvm
+DPADD= ${LIBM} ${LIBKVM} ${LIBJAIL}
+LDADD= -lm -lkvm -ljail
.include <bsd.prog.mk>
Modified: head/bin/ps/ps.1
==============================================================================
--- head/bin/ps/ps.1 Fri May 2 14:47:53 2014 (r265228)
+++ head/bin/ps/ps.1 Fri May 2 15:05:47 2014 (r265229)
@@ -29,7 +29,7 @@
.\" @(#)ps.1 8.3 (Berkeley) 4/18/94
.\" $FreeBSD$
.\"
-.Dd December 27, 2013
+.Dd May 2, 2014
.Dt PS 1
.Os
.Sh NAME
@@ -40,6 +40,7 @@
.Op Fl aCcdefHhjlmrSTuvwXxZ
.Op Fl O Ar fmt | Fl o Ar fmt
.Op Fl G Ar gid Ns Op , Ns Ar gid Ns Ar ...
+.Op Fl J Ar jid Ns Op , Ns Ar jid Ns Ar ...
.Op Fl M Ar core
.Op Fl N Ar system
.Op Fl p Ar pid Ns Op , Ns Ar pid Ns Ar ...
@@ -62,7 +63,7 @@ will also display processes that do not
.Pp
A different set of processes can be selected for display by using any
combination of the
-.Fl a , G , p , T , t ,
+.Fl a , G , J , p , T , t ,
and
.Fl U
options.
@@ -152,6 +153,20 @@ Print information associated with the fo
.Cm user , pid , ppid , pgid , sid , jobc , state , tt , time ,
and
.Cm command .
+.It Fl J
+Display information about processes which match the specified jail IDs.
+This may be either the
+.Cm jid
+or
+.Cm name
+of the jail.
+Use
+.Fl J
+.Sy 0
+to display only host processes.
+This flag implies
+.Fl x
+by default.
.It Fl L
List the set of keywords available for the
.Fl O
Modified: head/bin/ps/ps.c
==============================================================================
--- head/bin/ps/ps.c Fri May 2 14:47:53 2014 (r265228)
+++ head/bin/ps/ps.c Fri May 2 15:05:47 2014 (r265229)
@@ -50,6 +50,7 @@ static char sccsid[] = "@(#)ps.c 8.4 (Be
__FBSDID("$FreeBSD$");
#include <sys/param.h>
+#include <sys/jail.h>
#include <sys/proc.h>
#include <sys/user.h>
#include <sys/stat.h>
@@ -62,6 +63,7 @@ __FBSDID("$FreeBSD$");
#include <errno.h>
#include <fcntl.h>
#include <grp.h>
+#include <jail.h>
#include <kvm.h>
#include <limits.h>
#include <locale.h>
@@ -124,6 +126,7 @@ struct listinfo {
const char *lname;
union {
gid_t *gids;
+ int *jids;
pid_t *pids;
dev_t *ttys;
uid_t *uids;
@@ -132,6 +135,7 @@ struct listinfo {
};
static int addelem_gid(struct listinfo *, const char *);
+static int addelem_jid(struct listinfo *, const char *);
static int addelem_pid(struct listinfo *, const char *);
static int addelem_tty(struct listinfo *, const char *);
static int addelem_uid(struct listinfo *, const char *);
@@ -163,12 +167,12 @@ static char vfmt[] = "pid,state,time,sl,
"%cpu,%mem,command";
static char Zfmt[] = "label";
-#define PS_ARGS "AaCcde" OPT_LAZY_f "G:gHhjLlM:mN:O:o:p:rSTt:U:uvwXxZ"
+#define PS_ARGS "AaCcde" OPT_LAZY_f "G:gHhjJ:LlM:mN:O:o:p:rSTt:U:uvwXxZ"
int
main(int argc, char *argv[])
{
- struct listinfo gidlist, pgrplist, pidlist;
+ struct listinfo gidlist, jidlist, pgrplist, pidlist;
struct listinfo ruidlist, sesslist, ttylist, uidlist;
struct kinfo_proc *kp;
KINFO *kinfo = NULL, *next_KINFO;
@@ -208,6 +212,7 @@ main(int argc, char *argv[])
prtheader = showthreads = wflag = xkeep_implied = 0;
xkeep = -1; /* Neither -x nor -X. */
init_list(&gidlist, addelem_gid, sizeof(gid_t), "group");
+ init_list(&jidlist, addelem_jid, sizeof(int), "jail id");
init_list(&pgrplist, addelem_pid, sizeof(pid_t), "process group");
init_list(&pidlist, addelem_pid, sizeof(pid_t), "process id");
init_list(&ruidlist, addelem_uid, sizeof(uid_t), "ruser");
@@ -275,6 +280,11 @@ main(int argc, char *argv[])
case 'h':
prtheader = ws.ws_row > 5 ? ws.ws_row : 22;
break;
+ case 'J':
+ add_list(&jidlist, optarg);
+ xkeep_implied = 1;
+ nselectors++;
+ break;
case 'j':
parsefmt(jfmt, 0);
_fmt = 1;
@@ -538,6 +548,11 @@ main(int argc, char *argv[])
if (kp->ki_rgid == gidlist.l.gids[elem])
goto keepit;
}
+ if (jidlist.count > 0) {
+ for (elem = 0; elem < jidlist.count; elem++)
+ if (kp->ki_jid == jidlist.l.jids[elem])
+ goto keepit;
+ }
if (pgrplist.count > 0) {
for (elem = 0; elem < pgrplist.count; elem++)
if (kp->ki_pgid ==
@@ -666,6 +681,7 @@ main(int argc, char *argv[])
}
}
free_list(&gidlist);
+ free_list(&jidlist);
free_list(&pidlist);
free_list(&pgrplist);
free_list(&ruidlist);
@@ -727,6 +743,30 @@ addelem_gid(struct listinfo *inf, const
}
static int
+addelem_jid(struct listinfo *inf, const char *elem)
+{
+ int tempid;
+
+ if (*elem == '\0') {
+ warnx("Invalid (zero-length) jail id");
+ optfatal = 1;
+ return (0); /* Do not add this value. */
+ }
+
+ tempid = jail_getid(elem);
+ if (tempid < 0) {
+ warnx("Invalid %s: %s", inf->lname, elem);
+ optfatal = 1;
+ return (0);
+ }
+
+ if (inf->count >= inf->maxcount)
+ expand_list(inf);
+ inf->l.jids[(inf->count)++] = tempid;
+ return (1);
+}
+
+static int
addelem_pid(struct listinfo *inf, const char *elem)
{
char *endp;
@@ -1373,7 +1413,7 @@ usage(void)
(void)fprintf(stderr, "%s\n%s\n%s\n%s\n",
"usage: ps " SINGLE_OPTS " [-O fmt | -o fmt] [-G gid[,gid...]]",
- " [-M core] [-N system]",
+ " [-J jid[,jid...]] [-M core] [-N system]",
" [-p pid[,pid...]] [-t tty[,tty...]] [-U user[,user...]]",
" ps [-L]");
exit(1);
More information about the svn-src-head
mailing list