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>
|
2004-03-29 01:27:13 +00:00
|
|
|
#include <sys/proc.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
|
|
|
|
2004-03-29 00:12:03 +00:00
|
|
|
#ifdef LAZY_PS
|
2004-03-29 03:03:28 +00:00
|
|
|
#define DEF_UREAD 0
|
2004-03-29 00:12:03 +00:00
|
|
|
#define OPT_LAZY_f "f"
|
|
|
|
#else
|
2004-03-29 03:03:28 +00:00
|
|
|
#define DEF_UREAD 1 /* Always do the more-expensive read. */
|
2004-03-29 00:12:03 +00:00
|
|
|
#define OPT_LAZY_f /* I.e., the `-f' option is not added. */
|
|
|
|
#endif
|
|
|
|
|
|
|
|
int cflag; /* -c */
|
|
|
|
int eval; /* Exit value */
|
|
|
|
time_t now; /* Current time(3) value */
|
|
|
|
int rawcpu; /* -C */
|
|
|
|
int sumrusage; /* -S */
|
|
|
|
int termwidth; /* Width of the screen (0 == infinity). */
|
|
|
|
int totwidth; /* Calculated-width of requested variables. */
|
|
|
|
|
2002-02-03 14:43:04 +00:00
|
|
|
struct varent *vhead;
|
1994-05-26 06:18:55 +00:00
|
|
|
|
2004-03-29 00:12:03 +00:00
|
|
|
static int forceuread = DEF_UREAD; /* Do extra work to get u-area. */
|
|
|
|
static kvm_t *kd;
|
|
|
|
static KINFO *kinfo;
|
|
|
|
static int needcomm; /* -o "command" */
|
|
|
|
static int needenv; /* -e */
|
|
|
|
static int needuser; /* -o "user" */
|
|
|
|
static int optfatal; /* Fatal error parsing some list-option. */
|
1994-05-26 06:18:55 +00:00
|
|
|
|
2004-03-29 00:12:03 +00:00
|
|
|
static enum sort { DEFAULT, SORTMEM, SORTCPU } sortby = DEFAULT;
|
2002-06-06 21:21:25 +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;
|
2004-03-29 00:12:03 +00:00
|
|
|
typedef int addelem_rtn(struct listinfo *_inf, const char *_elem);
|
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 {
|
|
|
|
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;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
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 *);
|
2004-03-28 23:44:29 +00:00
|
|
|
static void dynsizevars(KINFO *);
|
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 *);
|
2004-03-28 23:44:29 +00:00
|
|
|
static const char *fmt(char **(*)(kvm_t *, const struct kinfo_proc *, int),
|
|
|
|
KINFO *, char *, int);
|
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 free_list(struct listinfo *);
|
|
|
|
static void init_list(struct listinfo *, addelem_rtn, int, const char *);
|
2004-03-28 23:44:29 +00:00
|
|
|
static char *kludge_oldps_options(char *);
|
|
|
|
static int pscomp(const void *, const void *);
|
|
|
|
static void saveuser(KINFO *);
|
|
|
|
static void scanvars(void);
|
|
|
|
static void sizevars(void);
|
|
|
|
static void usage(void);
|
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";
|
2004-03-29 00:16:19 +00:00
|
|
|
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";
|
2004-03-29 00:16:19 +00:00
|
|
|
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
|
|
|
|
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;
|
2004-03-29 00:25:09 +00:00
|
|
|
const char *cp, *nlistf, *memf;
|
|
|
|
char *cols;
|
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-02-03 14:43:04 +00:00
|
|
|
char errbuf[_POSIX2_LINE_MAX];
|
1994-05-26 06:18:55 +00:00
|
|
|
|
1995-10-26 10:57:52 +00:00
|
|
|
(void) setlocale(LC_ALL, "");
|
2004-03-29 01:15:27 +00:00
|
|
|
time(&now); /* Used by routines in print.c. */
|
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
|
|
|
|
2004-03-29 01:15:27 +00:00
|
|
|
all = dropgid = _fmt = nselectors = optfatal = 0;
|
|
|
|
prtheader = showthreads = wflag = xkeep_implied = 0;
|
|
|
|
xkeep = -1; /* Neither -x nor -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
|
|
|
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");
|
2002-01-28 09:43:26 +00:00
|
|
|
memf = nlistf = _PATH_DEVNULL;
|
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)
|
2004-03-29 01:15:27 +00:00
|
|
|
forceuread = 1;
|
2004-03-27 21:40:04 +00:00
|
|
|
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;
|
1994-05-26 06:18:55 +00:00
|
|
|
case 'g':
|
2004-03-29 01:15:27 +00:00
|
|
|
#if 0
|
|
|
|
/*
|
|
|
|
* XXX - This SUSv3 behavior is still under debate
|
|
|
|
* since it conflicts with the (undocumented)
|
|
|
|
* `-g' option. So we skip it for now.
|
|
|
|
*/
|
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
|
2004-03-29 01:15:27 +00:00
|
|
|
/* The historical BSD-ish (from SunOS) behavior. */
|
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
|
|
|
|
case 'R':
|
2004-03-29 01:15:27 +00:00
|
|
|
/*
|
|
|
|
* XXX - This un-standard option is still under
|
|
|
|
* debate. This is what SUSv3 defines as
|
|
|
|
* the `-U' option, and while it would be
|
|
|
|
* nice to have, it could cause even more
|
|
|
|
* confusion to implement it as `-R'.
|
|
|
|
*/
|
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(&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
|
|
|
|
case 's':
|
2004-03-29 01:15:27 +00:00
|
|
|
/*
|
|
|
|
* XXX - This non-standard option is still under
|
|
|
|
* debate. This *is* supported on Solaris,
|
|
|
|
* Linux, and IRIX, but conflicts with `-s'
|
|
|
|
* on NetBSD and maybe some older BSD's.
|
|
|
|
*/
|
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(&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)
|
2004-03-29 01:15:27 +00:00
|
|
|
exit(1); /* Error messages already printed. */
|
|
|
|
if (xkeep < 0) /* Neither -X nor -x was specified. */
|
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 = xkeep_implied;
|
|
|
|
|
1994-05-26 06:18:55 +00:00
|
|
|
#define BACKWARD_COMPATIBILITY
|
|
|
|
#ifdef BACKWARD_COMPATIBILITY
|
|
|
|
if (*argv) {
|
|
|
|
nlistf = *argv;
|
2004-03-29 01:15:27 +00:00
|
|
|
if (*++argv)
|
1994-05-26 06:18:55 +00:00
|
|
|
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;
|
2004-03-29 01:15:27 +00:00
|
|
|
#if 0
|
|
|
|
/*
|
|
|
|
* XXX - KERN_PROC_SESSION causes error in kvm_getprocs?
|
|
|
|
* For now, always do sid-matching in this routine.
|
|
|
|
*/
|
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
|
|
|
} 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);
|
2004-03-29 01:18:13 +00:00
|
|
|
if ((kp == NULL && nentries > 0) || (kp != NULL && 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;
|
|
|
|
const char *nameorID;
|
|
|
|
char *endp;
|
2004-03-29 00:25:09 +00:00
|
|
|
intmax_t ltemp;
|
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;
|
2004-03-29 01:15:27 +00:00
|
|
|
return (0); /* Do not add this 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
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* 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;
|
2004-03-29 01:15:27 +00:00
|
|
|
return (0); /* Do not add this 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
|
|
|
}
|
|
|
|
|
|
|
|
if (inf->count >= inf->maxcount)
|
|
|
|
expand_list(inf);
|
|
|
|
inf->gids[(inf->count)++] = grp->gr_gid;
|
|
|
|
return (1);
|
|
|
|
}
|
|
|
|
|
2004-03-29 01:15:27 +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
|
|
|
{
|
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-29 00:25:09 +00:00
|
|
|
long tempid;
|
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;
|
2004-03-29 01:15:27 +00:00
|
|
|
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)
|
|
|
|
{
|
|
|
|
const char *ttypath;
|
2004-03-29 00:25:09 +00:00
|
|
|
struct stat sb;
|
|
|
|
char pathbuf[PATH_MAX];
|
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;
|
2004-03-29 01:15:27 +00:00
|
|
|
return (0); /* Do not add this 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
|
|
|
}
|
|
|
|
if (!S_ISCHR(sb.st_mode)) {
|
|
|
|
warn("%s: Not a terminal", ttypath);
|
|
|
|
optfatal = 1;
|
2004-03-29 01:15:27 +00:00
|
|
|
return (0); /* Do not add this 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
|
|
|
}
|
|
|
|
|
|
|
|
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
|
|
|
char *endp;
|
2004-03-29 00:25:09 +00:00
|
|
|
intmax_t ltemp;
|
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;
|
2004-03-29 01:15:27 +00:00
|
|
|
return (0); /* Do not add this 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
|
|
|
}
|
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
|
|
|
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) {
|
2004-03-27 22:14:42 +00:00
|
|
|
/*
|
|
|
|
* These used to be treated as minor warnings (and the
|
|
|
|
* option was simply ignored), but now they are fatal
|
|
|
|
* errors (and the command will be aborted).
|
|
|
|
*/
|
|
|
|
optfatal = 1;
|
2004-03-29 01:15:27 +00:00
|
|
|
return (0); /* Do not add this 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
|
|
|
}
|
|
|
|
|
|
|
|
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)
|
|
|
|
{
|
|
|
|
const char *savep;
|
|
|
|
char *cp, *endp;
|
|
|
|
int toolong;
|
2004-03-29 00:25:09 +00:00
|
|
|
char elemcopy[PATH_MAX];
|
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
|
|
|
|
|
|
|
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
|
2004-03-29 01:15:27 +00:00
|
|
|
/*
|
|
|
|
* This is how the standard expects lists to
|
|
|
|
* be handled.
|
|
|
|
*/
|
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->addelem(inf, elemcopy);
|
|
|
|
#else
|
2004-03-29 01:15:27 +00:00
|
|
|
/*
|
|
|
|
* This would add a simple non-standard-but-convienent
|
|
|
|
* feature.
|
|
|
|
*
|
|
|
|
* XXX - The first time I tried to add this check,
|
|
|
|
* it 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%. I have not had time
|
|
|
|
* to investigate, so skip the feature for now.
|
|
|
|
*/
|
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
|
|
|
/*
|
|
|
|
* 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)
|
|
|
|
{
|
|
|
|
void *newlist;
|
2004-03-29 00:25:09 +00:00
|
|
|
int newmax;
|
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
|
|
|
|
|
|
|
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,
|
2004-03-29 01:15:27 +00:00
|
|
|
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
|
|
|
{
|
2004-03-30 01:45:23 +00:00
|
|
|
const KINFO *ka, *kb;
|
|
|
|
double cpua, cpub;
|
|
|
|
segsz_t sizea, sizeb;
|
|
|
|
|
|
|
|
ka = a;
|
|
|
|
kb = b;
|
|
|
|
/* SORTCPU and SORTMEM are sorted in descending order. */
|
|
|
|
if (sortby == SORTCPU) {
|
|
|
|
cpua = getpcpu(ka);
|
|
|
|
cpub = getpcpu(kb);
|
|
|
|
if (cpua < cpub)
|
|
|
|
return (1);
|
|
|
|
if (cpua > cpub)
|
|
|
|
return (-1);
|
|
|
|
}
|
|
|
|
if (sortby == SORTMEM) {
|
|
|
|
sizea = ka->ki_p->ki_tsize + ka->ki_p->ki_dsize +
|
|
|
|
ka->ki_p->ki_ssize;
|
|
|
|
sizeb = kb->ki_p->ki_tsize + kb->ki_p->ki_dsize +
|
|
|
|
kb->ki_p->ki_ssize;
|
|
|
|
if (sizea < sizeb)
|
|
|
|
return (1);
|
|
|
|
if (sizea > sizeb)
|
|
|
|
return (-1);
|
|
|
|
}
|
|
|
|
/*
|
|
|
|
* TTY's are sorted in ascending order, except that all NODEV
|
|
|
|
* processes come before all processes with a device.
|
|
|
|
*/
|
|
|
|
if (ka->ki_p->ki_tdev == NODEV && kb->ki_p->ki_tdev != NODEV)
|
|
|
|
return (-1);
|
|
|
|
if (ka->ki_p->ki_tdev != NODEV && kb->ki_p->ki_tdev == NODEV)
|
|
|
|
return (1);
|
|
|
|
if (ka->ki_p->ki_tdev < kb->ki_p->ki_tdev)
|
|
|
|
return (-1);
|
|
|
|
if (ka->ki_p->ki_tdev > kb->ki_p->ki_tdev)
|
|
|
|
return (1);
|
|
|
|
/* PID's are sorted in ascending order. */
|
|
|
|
if (ka->ki_p->ki_pid < kb->ki_p->ki_pid)
|
|
|
|
return (-1);
|
|
|
|
if (ka->ki_p->ki_pid > kb->ki_p->ki_pid)
|
|
|
|
return (1);
|
|
|
|
return (0);
|
1994-05-26 06:18:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* 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);
|
|
|
|
}
|