aboutsummaryrefslogtreecommitdiff
path: root/bin/ps/ps.c
diff options
context:
space:
mode:
Diffstat (limited to 'bin/ps/ps.c')
-rw-r--r--bin/ps/ps.c69
1 files changed, 45 insertions, 24 deletions
diff --git a/bin/ps/ps.c b/bin/ps/ps.c
index 89d90b78f2b0..cbee10c20d53 100644
--- a/bin/ps/ps.c
+++ b/bin/ps/ps.c
@@ -36,21 +36,6 @@
* ------+---------+---------+-------- + --------+---------+---------+---------*
*/
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1990, 1993, 1994\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)ps.c 8.4 (Berkeley) 4/2/94";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
#include <sys/param.h>
#include <sys/jail.h>
#include <sys/proc.h>
@@ -114,7 +99,7 @@ static int needcomm; /* -o "command" */
static int needenv; /* -e */
static int needuser; /* -o "user" */
static int optfatal; /* Fatal error parsing some list-option. */
-static int pid_max; /* kern.max_pid */
+static int pid_max; /* kern.pid_max */
static enum sort { DEFAULT, SORTMEM, SORTCPU } sortby = DEFAULT;
@@ -170,7 +155,7 @@ static char vfmt[] = "pid,state,time,sl,re,pagein,vsz,rss,lim,tsiz,"
"%cpu,%mem,command";
static char Zfmt[] = "label";
-#define PS_ARGS "AaCcde" OPT_LAZY_f "G:gHhjJ:LlM:mN:O:o:p:rSTt:U:uvwXxZ"
+#define PS_ARGS "AaCcD:de" OPT_LAZY_f "G:gHhjJ:LlM:mN:O:o:p:rSTt:U:uvwXxZ"
int
main(int argc, char *argv[])
@@ -190,6 +175,8 @@ main(int argc, char *argv[])
int fwidthmin, fwidthmax;
char errbuf[_POSIX2_LINE_MAX];
char fmtbuf[_POSIX2_LINE_MAX];
+ enum { NONE = 0, UP = 1, DOWN = 2, BOTH = 1 | 2 } directions = NONE;
+ struct { int traversed; int initial; } pid_count;
(void) setlocale(LC_ALL, "");
time(&now); /* Used by routines in print.c. */
@@ -264,6 +251,20 @@ main(int argc, char *argv[])
case 'c':
cflag = 1;
break;
+ case 'D': {
+ size_t len = strlen(optarg);
+
+ if (len <= 2 &&
+ strncasecmp(optarg, "up", len) == 0)
+ directions |= UP;
+ else if (len <= 4 &&
+ strncasecmp(optarg, "down", len) == 0)
+ directions |= DOWN;
+ else if (len <= 4 &&
+ strncasecmp(optarg, "both", len) == 0)
+ directions |= BOTH;
+ break;
+ }
case 'd':
descendancy = 1;
break;
@@ -504,7 +505,7 @@ main(int argc, char *argv[])
what = KERN_PROC_PGRP | showthreads;
flag = *pgrplist.l.pids;
nselectors = 0;
- } else if (pidlist.count == 1 && !descendancy) {
+ } else if (pidlist.count == 1 && directions == NONE) {
what = KERN_PROC_PID | showthreads;
flag = *pidlist.l.pids;
nselectors = 0;
@@ -539,14 +540,33 @@ main(int argc, char *argv[])
if ((kp == NULL && errno != ESRCH) || (kp != NULL && nentries < 0))
xo_errx(1, "%s", kvm_geterr(kd));
nkept = 0;
- if (descendancy)
+ pid_count.initial = pidlist.count;
+ if (directions & DOWN)
for (elem = 0; elem < pidlist.count; elem++)
- for (i = 0; i < nentries; i++)
+ for (i = 0; i < nentries; i++) {
+ if (kp[i].ki_ppid == kp[i].ki_pid)
+ continue;
if (kp[i].ki_ppid == pidlist.l.pids[elem]) {
if (pidlist.count >= pidlist.maxcount)
expand_list(&pidlist);
pidlist.l.pids[pidlist.count++] = kp[i].ki_pid;
}
+ }
+ pid_count.traversed = pidlist.count;
+ if (directions & UP)
+ for (elem = 0; elem < pidlist.count; elem++) {
+ if (elem >= pid_count.initial && elem < pid_count.traversed)
+ continue;
+ for (i = 0; i < nentries; i++) {
+ if (kp[i].ki_ppid == kp[i].ki_pid)
+ continue;
+ if (kp[i].ki_pid == pidlist.l.pids[elem]) {
+ if (pidlist.count >= pidlist.maxcount)
+ expand_list(&pidlist);
+ pidlist.l.pids[pidlist.count++] = kp[i].ki_ppid;
+ }
+ }
+ }
if (nentries > 0) {
if ((kinfo = malloc(nentries * sizeof(*kinfo))) == NULL)
xo_errx(1, "malloc failed");
@@ -1458,10 +1478,11 @@ usage(void)
{
#define SINGLE_OPTS "[-aCcde" OPT_LAZY_f "HhjlmrSTuvwXxZ]"
- (void)xo_error("%s\n%s\n%s\n%s\n",
- "usage: ps " SINGLE_OPTS " [-O fmt | -o fmt] [-G gid[,gid...]]",
- " [-J jid[,jid...]] [-M core] [-N system]",
+ (void)xo_error("%s\n%s\n%s\n%s\n%s\n",
+ "usage: ps [--libxo] " SINGLE_OPTS " [-O fmt | -o fmt]",
+ " [-G gid[,gid...]] [-J jid[,jid...]] [-M core] [-N system]",
" [-p pid[,pid...]] [-t tty[,tty...]] [-U user[,user...]]",
- " ps [-L]");
+ " [-D up | down | both]",
+ " ps [--libxo] -L");
exit(1);
}