1994-05-26 06:18:55 +00:00
|
|
|
/*-
|
|
|
|
* Copyright (c) 1990, 1993, 1994
|
|
|
|
* The Regents of the University of California. All rights reserved.
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
* 3. All advertising materials mentioning features or use of this software
|
|
|
|
* must display the following acknowledgement:
|
|
|
|
* This product includes software developed by the University of
|
|
|
|
* California, Berkeley and its contributors.
|
|
|
|
* 4. Neither the name of the University nor the names of its contributors
|
|
|
|
* may be used to endorse or promote products derived from this software
|
|
|
|
* without specific prior written permission.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
|
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
|
|
* SUCH DAMAGE.
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
* ------+---------+---------+-------- + --------+---------+---------+---------*
|
|
|
|
* Copyright (c) 2004 - Garance Alistair Drosehn <gad@FreeBSD.org>.
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* Significant modifications made to bring `ps' options somewhat closer
|
|
|
|
* to the standard for `ps' as described in SingleUnixSpec-v3.
|
|
|
|
* ------+---------+---------+-------- + --------+---------+---------+---------*
|
1994-05-26 06:18:55 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef lint
|
2002-02-03 14:43:04 +00:00
|
|
|
static const char copyright[] =
|
1994-05-26 06:18:55 +00:00
|
|
|
"@(#) Copyright (c) 1990, 1993, 1994\n\
|
|
|
|
The Regents of the University of California. All rights reserved.\n";
|
|
|
|
#endif /* not lint */
|
|
|
|
|
1998-05-15 06:30:58 +00:00
|
|
|
#if 0
|
2002-02-03 14:43:04 +00:00
|
|
|
#ifndef lint
|
1998-05-15 06:30:58 +00:00
|
|
|
static char sccsid[] = "@(#)ps.c 8.4 (Berkeley) 4/2/94";
|
1994-05-26 06:18:55 +00:00
|
|
|
#endif /* not lint */
|
2002-02-03 14:43:04 +00:00
|
|
|
#endif
|
2003-02-05 13:18:17 +00:00
|
|
|
|
2002-06-30 05:15:05 +00:00
|
|
|
#include <sys/cdefs.h>
|
|
|
|
__FBSDID("$FreeBSD$");
|
1994-05-26 06:18:55 +00:00
|
|
|
|
|
|
|
#include <sys/param.h>
|
1994-10-02 08:33:31 +00:00
|
|
|
#include <sys/user.h>
|
1994-05-26 06:18:55 +00:00
|
|
|
#include <sys/stat.h>
|
|
|
|
#include <sys/ioctl.h>
|
|
|
|
#include <sys/sysctl.h>
|
|
|
|
|
|
|
|
#include <ctype.h>
|
|
|
|
#include <err.h>
|
2004-03-17 22:46:58 +00:00
|
|
|
#include <errno.h>
|
1994-05-26 06:18:55 +00:00
|
|
|
#include <fcntl.h>
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
#include <grp.h>
|
1994-05-26 06:18:55 +00:00
|
|
|
#include <kvm.h>
|
1996-01-20 10:43:54 +00:00
|
|
|
#include <limits.h>
|
2001-03-02 23:53:36 +00:00
|
|
|
#include <locale.h>
|
1994-05-26 06:18:55 +00:00
|
|
|
#include <paths.h>
|
2002-02-03 14:43:04 +00:00
|
|
|
#include <pwd.h>
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
#include <stdint.h>
|
1994-05-26 06:18:55 +00:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
|
|
|
|
#include "ps.h"
|
|
|
|
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
#define W_SEP " \t" /* "Whitespace" list separators */
|
|
|
|
#define T_SEP "," /* "Terminate-element" list separators */
|
2000-09-26 01:03:16 +00:00
|
|
|
|
2002-02-03 14:43:04 +00:00
|
|
|
static KINFO *kinfo;
|
|
|
|
struct varent *vhead;
|
1994-05-26 06:18:55 +00:00
|
|
|
|
|
|
|
int eval; /* exit value */
|
1996-10-21 07:30:26 +00:00
|
|
|
int cflag; /* -c */
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
int optfatal; /* Fatal error parsing some list-option */
|
1994-05-26 06:18:55 +00:00
|
|
|
int rawcpu; /* -C */
|
|
|
|
int sumrusage; /* -S */
|
|
|
|
int termwidth; /* width of screen (0 == infinity) */
|
|
|
|
int totwidth; /* calculated width of requested variables */
|
|
|
|
|
2002-06-06 21:21:25 +00:00
|
|
|
time_t now; /* current time(3) value */
|
|
|
|
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
struct listinfo;
|
|
|
|
typedef int addelem_rtn(struct listinfo *_inf, const char *elem);
|
|
|
|
|
|
|
|
struct listinfo {
|
|
|
|
int count;
|
|
|
|
int maxcount;
|
|
|
|
int elemsize;
|
|
|
|
addelem_rtn *addelem;
|
|
|
|
const char *lname;
|
|
|
|
union {
|
|
|
|
gid_t *gids;
|
|
|
|
pid_t *pids;
|
|
|
|
dev_t *ttys;
|
|
|
|
uid_t *uids;
|
|
|
|
void *ptr;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
1994-05-26 06:18:55 +00:00
|
|
|
static int needuser, needcomm, needenv;
|
2004-03-27 21:56:49 +00:00
|
|
|
|
|
|
|
#ifdef LAZY_PS
|
|
|
|
static int forceuread = 0;
|
|
|
|
#define OPT_LAZY_f "f"
|
1997-12-05 07:33:40 +00:00
|
|
|
#else
|
2004-03-27 21:56:49 +00:00
|
|
|
static int forceuread = 1;
|
|
|
|
#define OPT_LAZY_f /* Ie, the `-f' option is not added. */
|
1997-12-05 07:33:40 +00:00
|
|
|
#endif
|
1994-05-26 06:18:55 +00:00
|
|
|
|
2002-02-03 14:43:04 +00:00
|
|
|
static enum sort { DEFAULT, SORTMEM, SORTCPU } sortby = DEFAULT;
|
1994-05-26 06:18:55 +00:00
|
|
|
|
2002-02-03 14:43:04 +00:00
|
|
|
static const char *fmt(char **(*)(kvm_t *, const struct kinfo_proc *, int),
|
2002-02-02 06:48:10 +00:00
|
|
|
KINFO *, char *, int);
|
|
|
|
static char *kludge_oldps_options(char *);
|
|
|
|
static int pscomp(const void *, const void *);
|
|
|
|
static void saveuser(KINFO *);
|
|
|
|
static void scanvars(void);
|
|
|
|
static void dynsizevars(KINFO *);
|
|
|
|
static void sizevars(void);
|
|
|
|
static void usage(void);
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
|
|
|
|
static int addelem_gid(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 *);
|
|
|
|
static void add_list(struct listinfo *, const char *);
|
|
|
|
static void *expand_list(struct listinfo *);
|
|
|
|
static void free_list(struct listinfo *);
|
|
|
|
static void init_list(struct listinfo *, addelem_rtn, int, const char *);
|
1994-05-26 06:18:55 +00:00
|
|
|
|
2002-06-05 17:31:44 +00:00
|
|
|
static char dfmt[] = "pid,tt,state,time,command";
|
|
|
|
static char jfmt[] = "user,pid,ppid,pgid,jobc,state,tt,time,command";
|
|
|
|
static char lfmt[] = "uid,pid,ppid,cpu,pri,nice,vsz,rss,mwchan,state,tt,time,command";
|
2002-02-03 14:43:04 +00:00
|
|
|
static char o1[] = "pid";
|
2002-06-05 17:31:44 +00:00
|
|
|
static char o2[] = "tt,state,time,command";
|
|
|
|
static char ufmt[] = "user,pid,%cpu,%mem,vsz,rss,tt,state,start,time,command";
|
|
|
|
static char vfmt[] = "pid,state,time,sl,re,pagein,vsz,rss,lim,tsiz,%cpu,%mem,command";
|
2002-10-24 00:00:57 +00:00
|
|
|
static char Zfmt[] = "label";
|
1994-05-26 06:18:55 +00:00
|
|
|
|
2002-02-03 14:43:04 +00:00
|
|
|
static kvm_t *kd;
|
1994-05-26 06:18:55 +00:00
|
|
|
|
2004-03-27 21:56:49 +00:00
|
|
|
#define PS_ARGS "AaCc" OPT_LAZY_f "G:gHhjLlM:mN:O:o:p:rSTt:U:uvwXxZ"
|
2002-06-20 14:55:53 +00:00
|
|
|
|
1994-05-26 06:18:55 +00:00
|
|
|
int
|
2002-02-02 06:48:10 +00:00
|
|
|
main(int argc, char *argv[])
|
1994-05-26 06:18:55 +00:00
|
|
|
{
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
struct listinfo gidlist, pgrplist, pidlist;
|
|
|
|
struct listinfo ruidlist, sesslist, ttylist, uidlist;
|
1994-05-26 06:18:55 +00:00
|
|
|
struct kinfo_proc *kp;
|
|
|
|
struct varent *vent;
|
|
|
|
struct winsize ws;
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
int all, ch, dropgid, elem, flag, _fmt, i, lineno;
|
|
|
|
int nentries, nocludge, nkept, nselectors;
|
|
|
|
int prtheader, showthreads, wflag, what, xkeep, xkeep_implied;
|
2002-06-04 10:20:10 +00:00
|
|
|
char *cols;
|
2002-02-03 14:43:04 +00:00
|
|
|
char errbuf[_POSIX2_LINE_MAX];
|
2002-06-20 14:55:53 +00:00
|
|
|
const char *cp, *nlistf, *memf;
|
1994-05-26 06:18:55 +00:00
|
|
|
|
1995-10-26 10:57:52 +00:00
|
|
|
(void) setlocale(LC_ALL, "");
|
2002-06-06 21:21:25 +00:00
|
|
|
/* Set the time to what it is right now. */
|
|
|
|
time(&now);
|
1995-10-26 10:57:52 +00:00
|
|
|
|
2002-06-04 10:20:10 +00:00
|
|
|
if ((cols = getenv("COLUMNS")) != NULL && *cols != '\0')
|
|
|
|
termwidth = atoi(cols);
|
|
|
|
else if ((ioctl(STDOUT_FILENO, TIOCGWINSZ, (char *)&ws) == -1 &&
|
1994-05-26 06:18:55 +00:00
|
|
|
ioctl(STDERR_FILENO, TIOCGWINSZ, (char *)&ws) == -1 &&
|
|
|
|
ioctl(STDIN_FILENO, TIOCGWINSZ, (char *)&ws) == -1) ||
|
|
|
|
ws.ws_col == 0)
|
|
|
|
termwidth = 79;
|
|
|
|
else
|
|
|
|
termwidth = ws.ws_col - 1;
|
|
|
|
|
2002-06-20 14:55:53 +00:00
|
|
|
/*
|
|
|
|
* Don't apply a kludge if the first argument is an option taking an
|
|
|
|
* argument
|
|
|
|
*/
|
|
|
|
if (argc > 1) {
|
|
|
|
nocludge = 0;
|
|
|
|
if (argv[1][0] == '-') {
|
|
|
|
for (cp = PS_ARGS; *cp != '\0'; cp++) {
|
|
|
|
if (*cp != ':')
|
|
|
|
continue;
|
|
|
|
if (*(cp - 1) == argv[1][1]) {
|
|
|
|
nocludge = 1;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (nocludge == 0)
|
|
|
|
argv[1] = kludge_oldps_options(argv[1]);
|
|
|
|
}
|
1994-05-26 06:18:55 +00:00
|
|
|
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
xkeep = -1; /* Neither -x nor -X */
|
|
|
|
all = _fmt = nselectors = prtheader = wflag = xkeep_implied = 0;
|
|
|
|
init_list(&gidlist, addelem_gid, sizeof(gid_t), "group");
|
|
|
|
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");
|
|
|
|
init_list(&sesslist, addelem_pid, sizeof(pid_t), "session id");
|
|
|
|
init_list(&ttylist, addelem_tty, sizeof(dev_t), "tty");
|
|
|
|
init_list(&uidlist, addelem_uid, sizeof(uid_t), "user");
|
1998-06-30 21:34:14 +00:00
|
|
|
dropgid = 0;
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
optfatal = 0;
|
2002-01-28 09:43:26 +00:00
|
|
|
memf = nlistf = _PATH_DEVNULL;
|
2003-06-12 16:53:55 +00:00
|
|
|
showthreads = 0;
|
2002-06-20 14:55:53 +00:00
|
|
|
while ((ch = getopt(argc, argv, PS_ARGS)) != -1)
|
1994-05-26 06:18:55 +00:00
|
|
|
switch((char)ch) {
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
case 'A':
|
|
|
|
/*
|
|
|
|
* Exactly the same as `-ax'. This has been
|
|
|
|
* added for compatability with SUSv3, but for
|
|
|
|
* now it will not be described in the man page.
|
|
|
|
*/
|
|
|
|
nselectors++;
|
|
|
|
all = xkeep = 1;
|
|
|
|
break;
|
1994-05-26 06:18:55 +00:00
|
|
|
case 'a':
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
nselectors++;
|
1994-05-26 06:18:55 +00:00
|
|
|
all = 1;
|
|
|
|
break;
|
|
|
|
case 'C':
|
|
|
|
rawcpu = 1;
|
|
|
|
break;
|
1996-10-21 07:30:26 +00:00
|
|
|
case 'c':
|
|
|
|
cflag = 1;
|
|
|
|
break;
|
|
|
|
case 'e': /* XXX set ufmt */
|
|
|
|
needenv = 1;
|
|
|
|
break;
|
2004-03-27 21:40:04 +00:00
|
|
|
#ifdef LAZY_PS
|
|
|
|
case 'f':
|
|
|
|
if (getuid() == 0 || getgid() == 0)
|
|
|
|
forceuread = 1;
|
|
|
|
break;
|
|
|
|
#endif
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
case 'G':
|
|
|
|
add_list(&gidlist, optarg);
|
|
|
|
xkeep_implied = 1;
|
|
|
|
nselectors++;
|
|
|
|
break;
|
|
|
|
#if 0
|
|
|
|
/* XXX - This SUSv3 option is still under debate. */
|
|
|
|
/* (it conflicts with the undocumented `-g' option) */
|
1994-05-26 06:18:55 +00:00
|
|
|
case 'g':
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
add_list(&pgrplist, optarg);
|
|
|
|
xkeep_implied = 1;
|
|
|
|
nselectors++;
|
|
|
|
break;
|
|
|
|
#else
|
|
|
|
case 'g':
|
|
|
|
/* Historical BSD-ish (from SunOS) option */
|
1994-05-26 06:18:55 +00:00
|
|
|
break; /* no-op */
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
#endif
|
2003-06-12 16:53:55 +00:00
|
|
|
case 'H':
|
2004-02-22 17:59:31 +00:00
|
|
|
showthreads = KERN_PROC_INC_THREAD;
|
2003-06-12 16:53:55 +00:00
|
|
|
break;
|
1994-05-26 06:18:55 +00:00
|
|
|
case 'h':
|
|
|
|
prtheader = ws.ws_row > 5 ? ws.ws_row : 22;
|
|
|
|
break;
|
|
|
|
case 'j':
|
2003-01-19 00:22:34 +00:00
|
|
|
parsefmt(jfmt, 0);
|
2002-02-03 14:43:04 +00:00
|
|
|
_fmt = 1;
|
1994-05-26 06:18:55 +00:00
|
|
|
jfmt[0] = '\0';
|
|
|
|
break;
|
|
|
|
case 'L':
|
|
|
|
showkey();
|
|
|
|
exit(0);
|
|
|
|
case 'l':
|
2003-01-19 00:22:34 +00:00
|
|
|
parsefmt(lfmt, 0);
|
2002-02-03 14:43:04 +00:00
|
|
|
_fmt = 1;
|
1994-05-26 06:18:55 +00:00
|
|
|
lfmt[0] = '\0';
|
|
|
|
break;
|
|
|
|
case 'M':
|
|
|
|
memf = optarg;
|
1998-06-30 21:34:14 +00:00
|
|
|
dropgid = 1;
|
1994-05-26 06:18:55 +00:00
|
|
|
break;
|
|
|
|
case 'm':
|
|
|
|
sortby = SORTMEM;
|
|
|
|
break;
|
|
|
|
case 'N':
|
|
|
|
nlistf = optarg;
|
1998-06-30 21:34:14 +00:00
|
|
|
dropgid = 1;
|
1994-05-26 06:18:55 +00:00
|
|
|
break;
|
|
|
|
case 'O':
|
2003-01-19 00:22:34 +00:00
|
|
|
parsefmt(o1, 1);
|
|
|
|
parsefmt(optarg, 1);
|
|
|
|
parsefmt(o2, 1);
|
1994-05-26 06:18:55 +00:00
|
|
|
o1[0] = o2[0] = '\0';
|
2002-02-03 14:43:04 +00:00
|
|
|
_fmt = 1;
|
1994-05-26 06:18:55 +00:00
|
|
|
break;
|
|
|
|
case 'o':
|
2003-01-19 00:22:34 +00:00
|
|
|
parsefmt(optarg, 1);
|
2002-02-03 14:43:04 +00:00
|
|
|
_fmt = 1;
|
1994-05-26 06:18:55 +00:00
|
|
|
break;
|
|
|
|
case 'p':
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
add_list(&pidlist, optarg);
|
|
|
|
/*
|
|
|
|
* Note: `-p' does not *set* xkeep, but any values
|
|
|
|
* from pidlist are checked before xkeep is. That
|
|
|
|
* way they are always matched, even if the user
|
|
|
|
* specifies `-X'.
|
|
|
|
*/
|
|
|
|
nselectors++;
|
|
|
|
break;
|
|
|
|
#if 0
|
|
|
|
/* XXX - This un-standard option is still under debate. */
|
|
|
|
case 'R':
|
|
|
|
/* This is what SUSv3 defines as the `-U' option. */
|
|
|
|
add_list(&ruidlist, optarg);
|
|
|
|
xkeep_implied = 1;
|
|
|
|
nselectors++;
|
1994-05-26 06:18:55 +00:00
|
|
|
break;
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
#endif
|
1994-05-26 06:18:55 +00:00
|
|
|
case 'r':
|
|
|
|
sortby = SORTCPU;
|
|
|
|
break;
|
|
|
|
case 'S':
|
|
|
|
sumrusage = 1;
|
|
|
|
break;
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
#if 0
|
|
|
|
/* XXX - This non-standard option is still under debate. */
|
|
|
|
/* (it conflicts with `-s' in NetBSD) */
|
|
|
|
case 's':
|
|
|
|
/* As seen on Solaris, Linux, IRIX. */
|
|
|
|
add_list(&sesslist, optarg);
|
|
|
|
xkeep_implied = 1;
|
|
|
|
nselectors++;
|
|
|
|
break;
|
|
|
|
#endif
|
1994-05-26 06:18:55 +00:00
|
|
|
case 'T':
|
|
|
|
if ((optarg = ttyname(STDIN_FILENO)) == NULL)
|
|
|
|
errx(1, "stdin: not a terminal");
|
|
|
|
/* FALLTHROUGH */
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
case 't':
|
|
|
|
add_list(&ttylist, optarg);
|
|
|
|
xkeep_implied = 1;
|
|
|
|
nselectors++;
|
1994-05-26 06:18:55 +00:00
|
|
|
break;
|
1995-12-26 03:38:55 +00:00
|
|
|
case 'U':
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
/* This is what SUSv3 defines as the `-u' option. */
|
|
|
|
add_list(&uidlist, optarg);
|
|
|
|
xkeep_implied = 1;
|
|
|
|
nselectors++;
|
1995-12-26 03:38:55 +00:00
|
|
|
break;
|
1994-05-26 06:18:55 +00:00
|
|
|
case 'u':
|
2003-01-19 00:22:34 +00:00
|
|
|
parsefmt(ufmt, 0);
|
1994-05-26 06:18:55 +00:00
|
|
|
sortby = SORTCPU;
|
2002-02-03 14:43:04 +00:00
|
|
|
_fmt = 1;
|
1994-05-26 06:18:55 +00:00
|
|
|
ufmt[0] = '\0';
|
|
|
|
break;
|
|
|
|
case 'v':
|
2003-01-19 00:22:34 +00:00
|
|
|
parsefmt(vfmt, 0);
|
1994-05-26 06:18:55 +00:00
|
|
|
sortby = SORTMEM;
|
2002-02-03 14:43:04 +00:00
|
|
|
_fmt = 1;
|
1994-05-26 06:18:55 +00:00
|
|
|
vfmt[0] = '\0';
|
|
|
|
break;
|
|
|
|
case 'w':
|
|
|
|
if (wflag)
|
|
|
|
termwidth = UNLIMITED;
|
|
|
|
else if (termwidth < 131)
|
|
|
|
termwidth = 131;
|
|
|
|
wflag++;
|
|
|
|
break;
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
case 'X':
|
|
|
|
/*
|
|
|
|
* Note that `-X' and `-x' are not standard "selector"
|
|
|
|
* options. For most selector-options, we check *all*
|
|
|
|
* processes to see if any are matched by the given
|
|
|
|
* value(s). After we have a set of all the matched
|
|
|
|
* processes, then `-X' and `-x' govern whether we
|
|
|
|
* modify that *matched* set for processes which do
|
|
|
|
* not have a controlling terminal. `-X' causes
|
|
|
|
* those processes to be deleted from the matched
|
|
|
|
* set, while `-x' causes them to be kept.
|
|
|
|
*/
|
|
|
|
xkeep = 0;
|
|
|
|
break;
|
1994-05-26 06:18:55 +00:00
|
|
|
case 'x':
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
xkeep = 1;
|
1994-05-26 06:18:55 +00:00
|
|
|
break;
|
2001-11-26 22:21:15 +00:00
|
|
|
case 'Z':
|
2003-01-19 00:22:34 +00:00
|
|
|
parsefmt(Zfmt, 0);
|
2001-11-26 22:21:15 +00:00
|
|
|
Zfmt[0] = '\0';
|
|
|
|
break;
|
1994-05-26 06:18:55 +00:00
|
|
|
case '?':
|
|
|
|
default:
|
|
|
|
usage();
|
|
|
|
}
|
|
|
|
argc -= optind;
|
|
|
|
argv += optind;
|
|
|
|
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
if (optfatal)
|
|
|
|
exit(1); /* Error messages already printed */
|
|
|
|
|
|
|
|
if (xkeep < 0) /* Neither -X nor -x was specified */
|
|
|
|
xkeep = xkeep_implied;
|
|
|
|
|
1994-05-26 06:18:55 +00:00
|
|
|
#define BACKWARD_COMPATIBILITY
|
|
|
|
#ifdef BACKWARD_COMPATIBILITY
|
|
|
|
if (*argv) {
|
|
|
|
nlistf = *argv;
|
|
|
|
if (*++argv) {
|
|
|
|
memf = *argv;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
/*
|
|
|
|
* Discard setgid privileges if not the running kernel so that bad
|
|
|
|
* guys can't print interesting stuff from kernel memory.
|
|
|
|
*/
|
1998-06-30 21:34:14 +00:00
|
|
|
if (dropgid) {
|
1994-05-26 06:18:55 +00:00
|
|
|
setgid(getgid());
|
1998-06-30 21:34:14 +00:00
|
|
|
setuid(getuid());
|
|
|
|
}
|
1994-05-26 06:18:55 +00:00
|
|
|
|
2002-01-28 09:43:26 +00:00
|
|
|
kd = kvm_openfiles(nlistf, memf, NULL, O_RDONLY, errbuf);
|
1994-05-26 06:18:55 +00:00
|
|
|
if (kd == 0)
|
|
|
|
errx(1, "%s", errbuf);
|
|
|
|
|
2002-02-03 14:43:04 +00:00
|
|
|
if (!_fmt)
|
2003-01-19 00:22:34 +00:00
|
|
|
parsefmt(dfmt, 0);
|
1994-05-26 06:18:55 +00:00
|
|
|
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
if (nselectors == 0) {
|
|
|
|
uidlist.ptr = malloc(sizeof(uid_t));
|
|
|
|
if (uidlist.ptr == NULL)
|
2002-06-05 18:11:25 +00:00
|
|
|
errx(1, "malloc failed");
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
nselectors = 1;
|
|
|
|
uidlist.count = uidlist.maxcount = 1;
|
|
|
|
*uidlist.uids = getuid();
|
2000-09-26 01:03:16 +00:00
|
|
|
}
|
1994-05-26 06:18:55 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* scan requested variables, noting what structures are needed,
|
1999-11-15 03:37:57 +00:00
|
|
|
* and adjusting header widths as appropriate.
|
1994-05-26 06:18:55 +00:00
|
|
|
*/
|
|
|
|
scanvars();
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
|
1994-05-26 06:18:55 +00:00
|
|
|
/*
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
* Get process list. If the user requested just one selector-
|
|
|
|
* option, then kvm_getprocs can be asked to return just those
|
|
|
|
* processes. Otherwise, have it return all processes, and
|
|
|
|
* then this routine will search that full list and select the
|
|
|
|
* processes which match any of the user's selector-options.
|
1994-05-26 06:18:55 +00:00
|
|
|
*/
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
what = showthreads != 0 ? KERN_PROC_ALL : KERN_PROC_PROC;
|
|
|
|
flag = 0;
|
|
|
|
if (nselectors == 1) {
|
|
|
|
/* XXX - Apparently there's no KERN_PROC_GID flag. */
|
|
|
|
if (pgrplist.count == 1) {
|
|
|
|
what = KERN_PROC_PGRP | showthreads;
|
|
|
|
flag = *pgrplist.pids;
|
|
|
|
nselectors = 0;
|
|
|
|
} else if (pidlist.count == 1) {
|
|
|
|
what = KERN_PROC_PID | showthreads;
|
|
|
|
flag = *pidlist.pids;
|
|
|
|
nselectors = 0;
|
|
|
|
} else if (ruidlist.count == 1) {
|
|
|
|
what = KERN_PROC_RUID | showthreads;
|
|
|
|
flag = *ruidlist.uids;
|
|
|
|
nselectors = 0;
|
|
|
|
#if 0 /* XXX - KERN_PROC_SESSION causes error in kvm_getprocs? */
|
|
|
|
} else if (sesslist.count == 1) {
|
|
|
|
what = KERN_PROC_SESSION | showthreads;
|
|
|
|
flag = *sesslist.pids;
|
|
|
|
nselectors = 0;
|
|
|
|
#endif
|
|
|
|
} else if (ttylist.count == 1) {
|
|
|
|
what = KERN_PROC_TTY | showthreads;
|
|
|
|
flag = *ttylist.ttys;
|
|
|
|
nselectors = 0;
|
|
|
|
} else if (uidlist.count == 1) {
|
|
|
|
what = KERN_PROC_UID | showthreads;
|
|
|
|
flag = *uidlist.uids;
|
|
|
|
nselectors = 0;
|
|
|
|
} else if (all) {
|
|
|
|
/* No need for this routine to select processes. */
|
|
|
|
nselectors = 0;
|
|
|
|
}
|
1994-05-26 06:18:55 +00:00
|
|
|
}
|
2004-02-22 17:59:31 +00:00
|
|
|
|
1994-05-26 06:18:55 +00:00
|
|
|
/*
|
|
|
|
* select procs
|
|
|
|
*/
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
nentries = -1;
|
2004-03-17 22:46:58 +00:00
|
|
|
kp = kvm_getprocs(kd, what, flag, &nentries);
|
|
|
|
if ((kp == 0 && nentries != 0) || nentries < 0)
|
1994-05-26 06:18:55 +00:00
|
|
|
errx(1, "%s", kvm_geterr(kd));
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
nkept = 0;
|
2004-03-17 22:46:58 +00:00
|
|
|
if (nentries > 0) {
|
|
|
|
if ((kinfo = malloc(nentries * sizeof(*kinfo))) == NULL)
|
|
|
|
errx(1, "malloc failed");
|
|
|
|
for (i = nentries; --i >= 0; ++kp) {
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
/*
|
|
|
|
* If the user specified multiple selection-criteria,
|
|
|
|
* then keep any process matched by the inclusive OR
|
|
|
|
* of all the selection-criteria given.
|
|
|
|
*/
|
|
|
|
if (pidlist.count > 0) {
|
|
|
|
for (elem = 0; elem < pidlist.count; elem++)
|
|
|
|
if (kp->ki_pid == pidlist.pids[elem])
|
|
|
|
goto keepit;
|
|
|
|
}
|
|
|
|
/*
|
|
|
|
* Note that we had to process pidlist before
|
|
|
|
* filtering out processes which do not have
|
|
|
|
* a controlling terminal.
|
|
|
|
*/
|
|
|
|
if (xkeep == 0) {
|
|
|
|
if ((kp->ki_tdev == NODEV ||
|
|
|
|
(kp->ki_flag & P_CONTROLT) == 0))
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if (nselectors == 0)
|
|
|
|
goto keepit;
|
|
|
|
if (gidlist.count > 0) {
|
|
|
|
for (elem = 0; elem < gidlist.count; elem++)
|
|
|
|
if (kp->ki_rgid == gidlist.gids[elem])
|
|
|
|
goto keepit;
|
|
|
|
}
|
|
|
|
if (pgrplist.count > 0) {
|
|
|
|
for (elem = 0; elem < pgrplist.count; elem++)
|
|
|
|
if (kp->ki_pgid == pgrplist.pids[elem])
|
|
|
|
goto keepit;
|
|
|
|
}
|
|
|
|
if (ruidlist.count > 0) {
|
|
|
|
for (elem = 0; elem < ruidlist.count; elem++)
|
|
|
|
if (kp->ki_ruid == ruidlist.uids[elem])
|
|
|
|
goto keepit;
|
|
|
|
}
|
|
|
|
if (sesslist.count > 0) {
|
|
|
|
for (elem = 0; elem < sesslist.count; elem++)
|
|
|
|
if (kp->ki_sid == sesslist.pids[elem])
|
|
|
|
goto keepit;
|
|
|
|
}
|
|
|
|
if (ttylist.count > 0) {
|
|
|
|
for (elem = 0; elem < ttylist.count; elem++)
|
|
|
|
if (kp->ki_tdev == ttylist.ttys[elem])
|
|
|
|
goto keepit;
|
|
|
|
}
|
|
|
|
if (uidlist.count > 0) {
|
|
|
|
for (elem = 0; elem < uidlist.count; elem++)
|
|
|
|
if (kp->ki_uid == uidlist.uids[elem])
|
|
|
|
goto keepit;
|
|
|
|
}
|
|
|
|
/*
|
|
|
|
* This process did not match any of the user's
|
|
|
|
* selector-options, so skip the process.
|
|
|
|
*/
|
|
|
|
continue;
|
|
|
|
|
|
|
|
keepit:
|
|
|
|
kinfo[nkept].ki_p = kp;
|
2004-03-17 22:46:58 +00:00
|
|
|
if (needuser)
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
saveuser(&kinfo[nkept]);
|
|
|
|
dynsizevars(&kinfo[nkept]);
|
|
|
|
nkept++;
|
2004-03-17 22:46:58 +00:00
|
|
|
}
|
1994-05-26 06:18:55 +00:00
|
|
|
}
|
1997-04-29 05:26:05 +00:00
|
|
|
|
|
|
|
sizevars();
|
|
|
|
|
1994-05-26 06:18:55 +00:00
|
|
|
/*
|
|
|
|
* print header
|
|
|
|
*/
|
|
|
|
printheader();
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
if (nkept == 0)
|
2000-07-08 05:13:10 +00:00
|
|
|
exit(1);
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
|
1994-05-26 06:18:55 +00:00
|
|
|
/*
|
|
|
|
* sort proc list
|
|
|
|
*/
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
qsort(kinfo, nkept, sizeof(KINFO), pscomp);
|
1994-05-26 06:18:55 +00:00
|
|
|
/*
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
* For each process, call each variable output function.
|
1994-05-26 06:18:55 +00:00
|
|
|
*/
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
for (i = lineno = 0; i < nkept; i++) {
|
1994-05-26 06:18:55 +00:00
|
|
|
for (vent = vhead; vent; vent = vent->next) {
|
|
|
|
(vent->var->oproc)(&kinfo[i], vent);
|
|
|
|
if (vent->next != NULL)
|
|
|
|
(void)putchar(' ');
|
|
|
|
}
|
|
|
|
(void)putchar('\n');
|
|
|
|
if (prtheader && lineno++ == prtheader - 4) {
|
|
|
|
(void)putchar('\n');
|
|
|
|
printheader();
|
|
|
|
lineno = 0;
|
|
|
|
}
|
|
|
|
}
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
free_list(&gidlist);
|
|
|
|
free_list(&pidlist);
|
|
|
|
free_list(&pgrplist);
|
|
|
|
free_list(&ruidlist);
|
|
|
|
free_list(&sesslist);
|
|
|
|
free_list(&ttylist);
|
|
|
|
free_list(&uidlist);
|
2000-09-26 01:03:16 +00:00
|
|
|
|
1994-05-26 06:18:55 +00:00
|
|
|
exit(eval);
|
|
|
|
}
|
|
|
|
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
static int
|
|
|
|
addelem_gid(struct listinfo *inf, const char *elem)
|
|
|
|
{
|
|
|
|
struct group *grp;
|
|
|
|
intmax_t ltemp;
|
|
|
|
const char *nameorID;
|
|
|
|
char *endp;
|
|
|
|
|
|
|
|
if (*elem == '\0' || strlen(elem) >= MAXLOGNAME) {
|
|
|
|
if (*elem == '\0')
|
|
|
|
warnx("Invalid (zero-length) %s name", inf->lname);
|
|
|
|
else
|
|
|
|
warnx("%s name too long: %s", inf->lname, elem);
|
|
|
|
optfatal = 1;
|
|
|
|
return (0); /* Do not add this value */
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SUSv3 states that `ps -G grouplist' should match "real-group
|
|
|
|
* ID numbers", and does not mention group-names. I do want to
|
|
|
|
* also support group-names, so this tries for a group-id first,
|
|
|
|
* and only tries for a name if that doesn't work. This is the
|
|
|
|
* opposite order of what is done in addelem_uid(), but in
|
|
|
|
* practice the order would only matter for group-names which
|
|
|
|
* are all-numeric.
|
|
|
|
*/
|
|
|
|
grp = NULL;
|
|
|
|
nameorID = "named";
|
|
|
|
errno = 0;
|
|
|
|
ltemp = strtol(elem, &endp, 10);
|
|
|
|
if (errno == 0 && *endp == '\0' && ltemp >= 0 && ltemp <= GID_MAX) {
|
|
|
|
nameorID = "name or ID matches";
|
|
|
|
grp = getgrgid((gid_t)ltemp);
|
|
|
|
}
|
|
|
|
if (grp == NULL)
|
|
|
|
grp = getgrnam(elem);
|
|
|
|
if (grp == NULL) {
|
|
|
|
warnx("No %s %s '%s'", inf->lname, nameorID, elem);
|
|
|
|
optfatal = 1;
|
|
|
|
return (0); /* Do not add this value */
|
|
|
|
}
|
|
|
|
|
|
|
|
if (inf->count >= inf->maxcount)
|
|
|
|
expand_list(inf);
|
|
|
|
inf->gids[(inf->count)++] = grp->gr_gid;
|
|
|
|
return (1);
|
|
|
|
}
|
|
|
|
|
2004-03-17 22:46:58 +00:00
|
|
|
#define BSD_PID_MAX 99999 /* Copy of PID_MAX from sys/proc.h */
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
static int
|
|
|
|
addelem_pid(struct listinfo *inf, const char *elem)
|
2004-03-17 22:46:58 +00:00
|
|
|
{
|
|
|
|
long tempid;
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
char *endp;
|
2004-03-17 22:46:58 +00:00
|
|
|
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
if (*elem == '\0')
|
|
|
|
tempid = 0L;
|
|
|
|
else {
|
|
|
|
errno = 0;
|
|
|
|
tempid = strtol(elem, &endp, 10);
|
|
|
|
if (*endp != '\0' || tempid < 0 || elem == endp) {
|
|
|
|
warnx("Invalid %s: %s", inf->lname, elem);
|
|
|
|
errno = ERANGE;
|
|
|
|
} else if (errno != 0 || tempid > BSD_PID_MAX) {
|
|
|
|
warnx("%s too large: %s", inf->lname, elem);
|
|
|
|
errno = ERANGE;
|
2004-03-17 22:46:58 +00:00
|
|
|
}
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
if (errno == ERANGE) {
|
|
|
|
optfatal = 1;
|
|
|
|
return (0); /* Do not add this value */
|
2004-03-17 22:46:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
if (inf->count >= inf->maxcount)
|
|
|
|
expand_list(inf);
|
|
|
|
inf->pids[(inf->count)++] = tempid;
|
|
|
|
return (1);
|
|
|
|
}
|
|
|
|
#undef BSD_PID_MAX
|
|
|
|
|
|
|
|
static int
|
|
|
|
addelem_tty(struct listinfo *inf, const char *elem)
|
|
|
|
{
|
|
|
|
char pathbuf[PATH_MAX];
|
|
|
|
struct stat sb;
|
|
|
|
const char *ttypath;
|
2004-03-17 22:46:58 +00:00
|
|
|
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
if (strcmp(elem, "co") == 0)
|
|
|
|
ttypath = strdup(_PATH_CONSOLE);
|
|
|
|
else if (*elem == '/')
|
|
|
|
ttypath = elem;
|
|
|
|
else {
|
|
|
|
strlcpy(pathbuf, _PATH_TTY, sizeof(pathbuf));
|
|
|
|
strlcat(pathbuf, elem, sizeof(pathbuf));
|
|
|
|
ttypath = pathbuf;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (stat(ttypath, &sb) == -1) {
|
|
|
|
warn("%s", ttypath);
|
|
|
|
optfatal = 1;
|
|
|
|
return (0); /* Do not add this value */
|
|
|
|
}
|
|
|
|
if (!S_ISCHR(sb.st_mode)) {
|
|
|
|
warn("%s: Not a terminal", ttypath);
|
|
|
|
optfatal = 1;
|
|
|
|
return (0); /* Do not add this value */
|
|
|
|
}
|
|
|
|
|
|
|
|
if (inf->count >= inf->maxcount)
|
|
|
|
expand_list(inf);
|
|
|
|
inf->ttys[(inf->count)++] = sb.st_rdev;
|
|
|
|
return (1);
|
2004-03-17 22:46:58 +00:00
|
|
|
}
|
|
|
|
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
static int
|
|
|
|
addelem_uid(struct listinfo *inf, const char *elem)
|
2000-09-26 01:03:16 +00:00
|
|
|
{
|
|
|
|
struct passwd *pwd;
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
intmax_t ltemp;
|
|
|
|
char *endp;
|
2000-09-26 01:03:16 +00:00
|
|
|
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
if (*elem == '\0' || strlen(elem) >= MAXLOGNAME) {
|
|
|
|
if (*elem == '\0')
|
|
|
|
warnx("Invalid (zero-length) %s name", inf->lname);
|
|
|
|
else
|
|
|
|
warnx("%s name too long: %s", inf->lname, elem);
|
|
|
|
optfatal = 1;
|
|
|
|
return (0); /* Do not add this value */
|
|
|
|
}
|
2000-09-26 01:03:16 +00:00
|
|
|
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
/*
|
|
|
|
* XXX - In the following, should the warnings be fatal errors?
|
|
|
|
* Historically they have been warnings, but I expect errors
|
|
|
|
* would be more appropriate. A warning message might be
|
|
|
|
* missed in a long `ps' listing, and the user would not
|
|
|
|
* realize that they had mistyped a userid. Also, Solaris
|
|
|
|
* and Linux treat these as errors. On the other hand, I
|
|
|
|
* can imagine that some users *might* be used to the
|
|
|
|
* present behavior.
|
|
|
|
*/
|
|
|
|
pwd = getpwnam(elem);
|
|
|
|
if (pwd == NULL) {
|
|
|
|
errno = 0;
|
|
|
|
ltemp = strtol(elem, &endp, 10);
|
|
|
|
if (errno != 0 || *endp != '\0' || ltemp < 0 ||
|
|
|
|
ltemp > UID_MAX)
|
|
|
|
warnx("No %s named '%s'", inf->lname, elem);
|
|
|
|
else {
|
|
|
|
/* The string is all digits, so it might be a userID. */
|
|
|
|
pwd = getpwuid((uid_t)ltemp);
|
|
|
|
if (pwd == NULL)
|
|
|
|
warnx("No %s name or ID matches '%s'",
|
|
|
|
inf->lname, elem);
|
2000-09-26 01:03:16 +00:00
|
|
|
}
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
}
|
|
|
|
if (pwd == NULL) {
|
|
|
|
/* XXX: optfatal = 1; -- (see the above XXX) */
|
|
|
|
return (0); /* Do not add this value */
|
|
|
|
}
|
|
|
|
|
|
|
|
if (inf->count >= inf->maxcount)
|
|
|
|
expand_list(inf);
|
|
|
|
inf->uids[(inf->count)++] = pwd->pw_uid;
|
|
|
|
return (1);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
add_list(struct listinfo *inf, const char *argp)
|
|
|
|
{
|
|
|
|
char elemcopy[PATH_MAX];
|
|
|
|
const char *savep;
|
|
|
|
char *cp, *endp;
|
|
|
|
int toolong;
|
|
|
|
|
|
|
|
while (*argp != '\0') {
|
|
|
|
while (*argp != '\0' && strchr(W_SEP, *argp) != NULL)
|
|
|
|
argp++;
|
|
|
|
savep = argp;
|
|
|
|
toolong = 0;
|
|
|
|
cp = elemcopy;
|
|
|
|
if (strchr(T_SEP, *argp) == NULL) {
|
|
|
|
endp = elemcopy + sizeof(elemcopy) - 1;
|
|
|
|
while (*argp != '\0' && cp <= endp &&
|
|
|
|
strchr(W_SEP T_SEP, *argp) == NULL)
|
|
|
|
*cp++ = *argp++;
|
|
|
|
if (cp > endp)
|
|
|
|
toolong = 1;
|
2000-09-26 01:03:16 +00:00
|
|
|
}
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
if (!toolong) {
|
|
|
|
*cp = '\0';
|
|
|
|
#ifndef ADD_PS_LISTRESET
|
|
|
|
/* This is how the standard expects lists to be handled. */
|
|
|
|
inf->addelem(inf, elemcopy);
|
|
|
|
#else
|
|
|
|
/*
|
|
|
|
* This would add a simple non-standard-but-convienent feature.
|
|
|
|
*
|
|
|
|
* XXX - Adding this check increased the total size of `ps' by
|
|
|
|
* 3940 bytes on i386! That's 12% of the entire program!
|
|
|
|
* The `ps.o' file grew by only about 40 bytes, but the
|
|
|
|
* final (stripped) executable in /bin/ps grew by 12%.
|
|
|
|
*/
|
|
|
|
/*
|
|
|
|
* We now have a single element. Add it to the
|
|
|
|
* list, unless the element is ":". In that case,
|
|
|
|
* reset the list so previous entries are ignored.
|
|
|
|
*/
|
|
|
|
if (strcmp(elemcopy, ":") == 0)
|
|
|
|
inf->count = 0;
|
|
|
|
else
|
|
|
|
inf->addelem(inf, elemcopy);
|
|
|
|
#endif
|
|
|
|
} else {
|
|
|
|
/*
|
|
|
|
* The string is too long to copy. Find the end
|
|
|
|
* of the string to print out the warning message.
|
|
|
|
*/
|
|
|
|
while (*argp != '\0' && strchr(W_SEP T_SEP,
|
|
|
|
*argp) == NULL)
|
|
|
|
argp++;
|
|
|
|
warnx("Value too long: %.*s", (int)(argp - savep),
|
|
|
|
savep);
|
|
|
|
optfatal = 1;
|
|
|
|
}
|
|
|
|
/*
|
|
|
|
* Skip over any number of trailing whitespace characters,
|
|
|
|
* but only one (at most) trailing element-terminating
|
|
|
|
* character.
|
|
|
|
*/
|
|
|
|
while (*argp != '\0' && strchr(W_SEP, *argp) != NULL)
|
|
|
|
argp++;
|
|
|
|
if (*argp != '\0' && strchr(T_SEP, *argp) != NULL) {
|
|
|
|
argp++;
|
|
|
|
/* Catch case where string ended with a comma. */
|
|
|
|
if (*argp == '\0')
|
|
|
|
inf->addelem(inf, argp);
|
2000-09-26 01:03:16 +00:00
|
|
|
}
|
|
|
|
}
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void *
|
|
|
|
expand_list(struct listinfo *inf)
|
|
|
|
{
|
|
|
|
int newmax;
|
|
|
|
void *newlist;
|
|
|
|
|
|
|
|
newmax = (inf->maxcount + 1) << 1;
|
|
|
|
newlist = realloc(inf->ptr, newmax * inf->elemsize);
|
|
|
|
if (newlist == NULL) {
|
|
|
|
free(inf->ptr);
|
|
|
|
errx(1, "realloc to %d %ss failed", newmax,
|
|
|
|
inf->lname);
|
|
|
|
}
|
|
|
|
inf->maxcount = newmax;
|
|
|
|
inf->ptr = newlist;
|
|
|
|
|
|
|
|
return (newlist);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
free_list(struct listinfo *inf)
|
|
|
|
{
|
2000-09-26 01:03:16 +00:00
|
|
|
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
inf->count = inf->elemsize = inf->maxcount = 0;
|
|
|
|
if (inf->ptr != NULL)
|
|
|
|
free(inf->ptr);
|
|
|
|
inf->addelem = NULL;
|
|
|
|
inf->lname = NULL;
|
|
|
|
inf->ptr = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
init_list(struct listinfo *inf, addelem_rtn artn, int elemsize,
|
|
|
|
const char *lname)
|
|
|
|
{
|
2000-09-26 01:03:16 +00:00
|
|
|
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
inf->count = inf->maxcount = 0;
|
|
|
|
inf->elemsize = elemsize;
|
|
|
|
inf->addelem = artn;
|
|
|
|
inf->lname = lname;
|
|
|
|
inf->ptr = NULL;
|
2000-09-26 01:03:16 +00:00
|
|
|
}
|
|
|
|
|
2003-01-19 00:22:34 +00:00
|
|
|
VARENT *
|
|
|
|
find_varentry(VAR *v)
|
|
|
|
{
|
|
|
|
struct varent *vent;
|
|
|
|
|
|
|
|
for (vent = vhead; vent; vent = vent->next) {
|
|
|
|
if (strcmp(vent->var->name, v->name) == 0)
|
|
|
|
return vent;
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
1994-05-26 06:18:55 +00:00
|
|
|
static void
|
2002-02-02 06:48:10 +00:00
|
|
|
scanvars(void)
|
1997-04-29 05:26:05 +00:00
|
|
|
{
|
|
|
|
struct varent *vent;
|
|
|
|
VAR *v;
|
|
|
|
|
|
|
|
for (vent = vhead; vent; vent = vent->next) {
|
|
|
|
v = vent->var;
|
|
|
|
if (v->flag & DSIZ) {
|
|
|
|
v->dwidth = v->width;
|
|
|
|
v->width = 0;
|
|
|
|
}
|
|
|
|
if (v->flag & USER)
|
|
|
|
needuser = 1;
|
|
|
|
if (v->flag & COMM)
|
|
|
|
needcomm = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2002-02-02 06:48:10 +00:00
|
|
|
dynsizevars(KINFO *ki)
|
1997-04-29 05:26:05 +00:00
|
|
|
{
|
|
|
|
struct varent *vent;
|
|
|
|
VAR *v;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (vent = vhead; vent; vent = vent->next) {
|
|
|
|
v = vent->var;
|
|
|
|
if (!(v->flag & DSIZ))
|
|
|
|
continue;
|
|
|
|
i = (v->sproc)( ki);
|
|
|
|
if (v->width < i)
|
|
|
|
v->width = i;
|
|
|
|
if (v->width > v->dwidth)
|
|
|
|
v->width = v->dwidth;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2002-02-02 06:48:10 +00:00
|
|
|
sizevars(void)
|
1994-05-26 06:18:55 +00:00
|
|
|
{
|
|
|
|
struct varent *vent;
|
|
|
|
VAR *v;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (vent = vhead; vent; vent = vent->next) {
|
|
|
|
v = vent->var;
|
2003-01-19 00:31:16 +00:00
|
|
|
i = strlen(vent->header);
|
1994-05-26 06:18:55 +00:00
|
|
|
if (v->width < i)
|
|
|
|
v->width = i;
|
|
|
|
totwidth += v->width + 1; /* +1 for space */
|
|
|
|
}
|
|
|
|
totwidth--;
|
|
|
|
}
|
|
|
|
|
2002-02-03 14:43:04 +00:00
|
|
|
static const char *
|
2002-02-02 06:48:10 +00:00
|
|
|
fmt(char **(*fn)(kvm_t *, const struct kinfo_proc *, int), KINFO *ki,
|
|
|
|
char *comm, int maxlen)
|
1994-05-26 06:18:55 +00:00
|
|
|
{
|
2002-02-03 14:43:04 +00:00
|
|
|
const char *s;
|
1994-05-26 06:18:55 +00:00
|
|
|
|
2002-02-03 14:43:04 +00:00
|
|
|
s = fmt_argv((*fn)(kd, ki->ki_p, termwidth), comm, maxlen);
|
1994-05-26 06:18:55 +00:00
|
|
|
return (s);
|
|
|
|
}
|
|
|
|
|
2001-01-24 12:59:50 +00:00
|
|
|
#define UREADOK(ki) (forceuread || (ki->ki_p->ki_sflag & PS_INMEM))
|
1997-12-05 07:33:40 +00:00
|
|
|
|
1994-05-26 06:18:55 +00:00
|
|
|
static void
|
2002-02-02 06:48:10 +00:00
|
|
|
saveuser(KINFO *ki)
|
1994-05-26 06:18:55 +00:00
|
|
|
{
|
|
|
|
|
2001-01-24 12:59:50 +00:00
|
|
|
if (ki->ki_p->ki_sflag & PS_INMEM) {
|
1994-05-26 06:18:55 +00:00
|
|
|
/*
|
|
|
|
* The u-area might be swapped out, and we can't get
|
|
|
|
* at it because we have a crashdump and no swap.
|
|
|
|
* If it's here fill in these fields, otherwise, just
|
|
|
|
* leave them 0.
|
|
|
|
*/
|
Change the proc information returned from the kernel so that it
no longer contains kernel specific data structures, but rather
only scalar values and structures that are already part of the
kernel/user interface, specifically rusage and rtprio. It no
longer contains proc, session, pcred, ucred, procsig, vmspace,
pstats, mtx, sigiolst, klist, callout, pasleep, or mdproc. If
any of these changed in size, ps, w, fstat, gcore, systat, and
top would all stop working. The new structure has over 200 bytes
of unassigned space for future values to be added, yet is nearly
100 bytes smaller per entry than the structure that it replaced.
2000-12-12 07:25:57 +00:00
|
|
|
ki->ki_valid = 1;
|
1994-05-26 06:18:55 +00:00
|
|
|
} else
|
Change the proc information returned from the kernel so that it
no longer contains kernel specific data structures, but rather
only scalar values and structures that are already part of the
kernel/user interface, specifically rusage and rtprio. It no
longer contains proc, session, pcred, ucred, procsig, vmspace,
pstats, mtx, sigiolst, klist, callout, pasleep, or mdproc. If
any of these changed in size, ps, w, fstat, gcore, systat, and
top would all stop working. The new structure has over 200 bytes
of unassigned space for future values to be added, yet is nearly
100 bytes smaller per entry than the structure that it replaced.
2000-12-12 07:25:57 +00:00
|
|
|
ki->ki_valid = 0;
|
1994-05-26 06:18:55 +00:00
|
|
|
/*
|
|
|
|
* save arguments if needed
|
|
|
|
*/
|
Change the proc information returned from the kernel so that it
no longer contains kernel specific data structures, but rather
only scalar values and structures that are already part of the
kernel/user interface, specifically rusage and rtprio. It no
longer contains proc, session, pcred, ucred, procsig, vmspace,
pstats, mtx, sigiolst, klist, callout, pasleep, or mdproc. If
any of these changed in size, ps, w, fstat, gcore, systat, and
top would all stop working. The new structure has over 200 bytes
of unassigned space for future values to be added, yet is nearly
100 bytes smaller per entry than the structure that it replaced.
2000-12-12 07:25:57 +00:00
|
|
|
if (needcomm && (UREADOK(ki) || (ki->ki_p->ki_args != NULL))) {
|
2002-02-03 14:43:04 +00:00
|
|
|
ki->ki_args = strdup(fmt(kvm_getargv, ki, ki->ki_p->ki_comm,
|
|
|
|
MAXCOMLEN));
|
1997-12-05 07:33:40 +00:00
|
|
|
} else if (needcomm) {
|
2002-02-03 14:43:04 +00:00
|
|
|
asprintf(&ki->ki_args, "(%s)", ki->ki_p->ki_comm);
|
1999-11-17 12:52:42 +00:00
|
|
|
} else {
|
|
|
|
ki->ki_args = NULL;
|
|
|
|
}
|
|
|
|
if (needenv && UREADOK(ki)) {
|
2002-02-03 14:43:04 +00:00
|
|
|
ki->ki_env = strdup(fmt(kvm_getenvv, ki, (char *)NULL, 0));
|
1999-11-17 12:52:42 +00:00
|
|
|
} else if (needenv) {
|
|
|
|
ki->ki_env = malloc(3);
|
|
|
|
strcpy(ki->ki_env, "()");
|
|
|
|
} else {
|
|
|
|
ki->ki_env = NULL;
|
|
|
|
}
|
1994-05-26 06:18:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2002-02-02 06:48:10 +00:00
|
|
|
pscomp(const void *a, const void *b)
|
1994-05-26 06:18:55 +00:00
|
|
|
{
|
|
|
|
int i;
|
Change the proc information returned from the kernel so that it
no longer contains kernel specific data structures, but rather
only scalar values and structures that are already part of the
kernel/user interface, specifically rusage and rtprio. It no
longer contains proc, session, pcred, ucred, procsig, vmspace,
pstats, mtx, sigiolst, klist, callout, pasleep, or mdproc. If
any of these changed in size, ps, w, fstat, gcore, systat, and
top would all stop working. The new structure has over 200 bytes
of unassigned space for future values to be added, yet is nearly
100 bytes smaller per entry than the structure that it replaced.
2000-12-12 07:25:57 +00:00
|
|
|
#define VSIZE(k) ((k)->ki_p->ki_dsize + (k)->ki_p->ki_ssize + \
|
|
|
|
(k)->ki_p->ki_tsize)
|
1994-05-26 06:18:55 +00:00
|
|
|
|
|
|
|
if (sortby == SORTCPU)
|
2002-02-03 14:43:04 +00:00
|
|
|
return (getpcpu((const KINFO *)b) - getpcpu((const KINFO *)a));
|
1994-05-26 06:18:55 +00:00
|
|
|
if (sortby == SORTMEM)
|
2002-02-03 14:43:04 +00:00
|
|
|
return (VSIZE((const KINFO *)b) - VSIZE((const KINFO *)a));
|
|
|
|
i = (int)((const KINFO *)a)->ki_p->ki_tdev - (int)((const KINFO *)b)->ki_p->ki_tdev;
|
1994-05-26 06:18:55 +00:00
|
|
|
if (i == 0)
|
2002-02-03 14:43:04 +00:00
|
|
|
i = ((const KINFO *)a)->ki_p->ki_pid - ((const KINFO *)b)->ki_p->ki_pid;
|
1994-05-26 06:18:55 +00:00
|
|
|
return (i);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* ICK (all for getopt), would rather hide the ugliness
|
|
|
|
* here than taint the main code.
|
|
|
|
*
|
|
|
|
* ps foo -> ps -foo
|
|
|
|
* ps 34 -> ps -p34
|
|
|
|
*
|
|
|
|
* The old convention that 't' with no trailing tty arg means the users
|
|
|
|
* tty, is only supported if argv[1] doesn't begin with a '-'. This same
|
|
|
|
* feature is available with the option 'T', which takes no argument.
|
|
|
|
*/
|
|
|
|
static char *
|
2002-02-02 06:48:10 +00:00
|
|
|
kludge_oldps_options(char *s)
|
1994-05-26 06:18:55 +00:00
|
|
|
{
|
2002-09-03 05:44:00 +00:00
|
|
|
int have_fmt;
|
1994-05-26 06:18:55 +00:00
|
|
|
size_t len;
|
|
|
|
char *newopts, *ns, *cp;
|
|
|
|
|
2002-09-03 05:44:00 +00:00
|
|
|
/*
|
|
|
|
* If we have an 'o' option, then note it, since we don't want to do
|
|
|
|
* some types of munging.
|
|
|
|
*/
|
|
|
|
have_fmt = index(s, 'o') != NULL;
|
|
|
|
|
1994-05-26 06:18:55 +00:00
|
|
|
len = strlen(s);
|
|
|
|
if ((newopts = ns = malloc(len + 2)) == NULL)
|
2002-06-05 18:11:25 +00:00
|
|
|
errx(1, "malloc failed");
|
1994-05-26 06:18:55 +00:00
|
|
|
/*
|
|
|
|
* options begin with '-'
|
|
|
|
*/
|
|
|
|
if (*s != '-')
|
|
|
|
*ns++ = '-'; /* add option flag */
|
|
|
|
/*
|
|
|
|
* gaze to end of argv[1]
|
|
|
|
*/
|
|
|
|
cp = s + len - 1;
|
|
|
|
/*
|
|
|
|
* if last letter is a 't' flag with no argument (in the context
|
|
|
|
* of the oldps options -- option string NOT starting with a '-' --
|
|
|
|
* then convert to 'T' (meaning *this* terminal, i.e. ttyname(0)).
|
2001-08-16 02:41:42 +00:00
|
|
|
*
|
|
|
|
* However, if a flag accepting a string argument is found in the
|
|
|
|
* option string, the remainder of the string is the argument to
|
|
|
|
* that flag; do not modify that argument.
|
1994-05-26 06:18:55 +00:00
|
|
|
*/
|
2002-01-28 09:43:26 +00:00
|
|
|
if (strcspn(s, "MNOoU") == len && *cp == 't' && *s != '-')
|
1994-05-26 06:18:55 +00:00
|
|
|
*cp = 'T';
|
|
|
|
else {
|
|
|
|
/*
|
|
|
|
* otherwise check for trailing number, which *may* be a
|
|
|
|
* pid.
|
|
|
|
*/
|
|
|
|
while (cp >= s && isdigit(*cp))
|
|
|
|
--cp;
|
|
|
|
}
|
|
|
|
cp++;
|
|
|
|
memmove(ns, s, (size_t)(cp - s)); /* copy up to trailing number */
|
|
|
|
ns += cp - s;
|
|
|
|
/*
|
|
|
|
* if there's a trailing number, and not a preceding 'p' (pid) or
|
|
|
|
* 't' (tty) flag, then assume it's a pid and insert a 'p' flag.
|
|
|
|
*/
|
1995-05-30 00:07:29 +00:00
|
|
|
if (isdigit(*cp) &&
|
1995-03-19 13:29:28 +00:00
|
|
|
(cp == s || (cp[-1] != 't' && cp[-1] != 'p')) &&
|
2002-09-03 05:44:00 +00:00
|
|
|
(cp - 1 == s || cp[-2] != 't') && !have_fmt)
|
1994-05-26 06:18:55 +00:00
|
|
|
*ns++ = 'p';
|
|
|
|
(void)strcpy(ns, cp); /* and append the number */
|
|
|
|
|
|
|
|
return (newopts);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2002-02-02 06:48:10 +00:00
|
|
|
usage(void)
|
1994-05-26 06:18:55 +00:00
|
|
|
{
|
2004-03-27 21:56:49 +00:00
|
|
|
#define SINGLE_OPTS "[-aC" OPT_LAZY_f "HhjlmrSTuvwXxZ]"
|
1994-05-26 06:18:55 +00:00
|
|
|
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
(void)fprintf(stderr, "%s\n%s\n%s\n%s\n",
|
2004-03-27 21:56:49 +00:00
|
|
|
"usage: ps " SINGLE_OPTS " [-G gid[,gid]] [-O|o fmt]",
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
" [-p pid[,pid]] [-t tty[,tty]] [-U user[,user]]",
|
|
|
|
" [-M core] [-N system]",
|
1997-06-06 06:40:06 +00:00
|
|
|
" ps [-L]");
|
1994-05-26 06:18:55 +00:00
|
|
|
exit(1);
|
|
|
|
}
|