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.
|
|
|
|
* 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>
|
2004-11-14 19:30:02 +00:00
|
|
|
#include <sys/mount.h>
|
1994-05-26 06:18:55 +00:00
|
|
|
|
|
|
|
#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>
|
1994-05-26 06:18:55 +00:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
|
|
|
|
#include "ps.h"
|
|
|
|
|
2007-11-08 22:31:28 +00:00
|
|
|
#define _PATH_PTS "/dev/pts/"
|
|
|
|
|
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
|
|
|
|
|
2004-06-01 02:03:21 +00:00
|
|
|
/*
|
2004-06-01 23:27:11 +00:00
|
|
|
* isdigit takes an `int', but expects values in the range of unsigned char.
|
|
|
|
* This wrapper ensures that values from a 'char' end up in the correct range.
|
2004-06-01 02:03:21 +00:00
|
|
|
*/
|
2004-06-01 23:27:11 +00:00
|
|
|
#define isdigitch(Anychar) isdigit((u_char)(Anychar))
|
2004-06-01 02:03:21 +00:00
|
|
|
|
2004-03-29 00:12:03 +00:00
|
|
|
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). */
|
2007-10-26 08:00:41 +00:00
|
|
|
int showthreads; /* will threads be shown? */
|
2004-03-29 00:12:03 +00:00
|
|
|
|
2004-06-23 23:48:09 +00:00
|
|
|
struct velisthead varlist = STAILQ_HEAD_INITIALIZER(varlist);
|
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 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;
|
2004-04-04 04:41:51 +00:00
|
|
|
} l;
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
static int addelem_gid(struct listinfo *, const char *);
|
|
|
|
static int addelem_pid(struct listinfo *, const char *);
|
|
|
|
static int addelem_tty(struct listinfo *, const char *);
|
|
|
|
static int addelem_uid(struct listinfo *, const char *);
|
|
|
|
static void add_list(struct listinfo *, const char *);
|
2009-05-17 04:00:43 +00:00
|
|
|
static void descendant_sort(KINFO *, int);
|
2011-09-29 06:31:42 +00:00
|
|
|
static void format_output(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-30 02:02:40 +00:00
|
|
|
static const char *
|
|
|
|
fmt(char **(*)(kvm_t *, const struct kinfo_proc *, int),
|
2004-03-28 23:44:29 +00:00
|
|
|
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-06-01 18:12:04 +00:00
|
|
|
static char *kludge_oldps_options(const char *, char *, const char *);
|
2004-03-28 23:44:29 +00:00
|
|
|
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";
|
2004-05-23 21:35:35 +00:00
|
|
|
static char jfmt[] = "user,pid,ppid,pgid,sid,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
|
|
|
|
2009-05-17 04:00:43 +00:00
|
|
|
#define PS_ARGS "AaCcde" 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;
|
2011-09-29 06:31:42 +00:00
|
|
|
KINFO *kinfo = NULL, *next_KINFO;
|
|
|
|
KINFO_STR *ks;
|
1994-05-26 06:18:55 +00:00
|
|
|
struct varent *vent;
|
|
|
|
struct winsize ws;
|
2011-09-29 06:31:42 +00:00
|
|
|
const char *nlistf, *memf, *fmtstr, *str;
|
2004-03-29 00:25:09 +00:00
|
|
|
char *cols;
|
2011-09-29 06:31:42 +00:00
|
|
|
int all, ch, elem, flag, _fmt, i, lineno, linelen, left;
|
2009-05-17 04:00:43 +00:00
|
|
|
int descendancy, nentries, nkept, nselectors;
|
2007-10-26 08:00:41 +00:00
|
|
|
int prtheader, 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
|
|
|
/*
|
2004-06-01 02:03:21 +00:00
|
|
|
* Hide a number of option-processing kludges in a separate routine,
|
|
|
|
* to support some historical BSD behaviors, such as `ps axu'.
|
2002-06-20 14:55:53 +00:00
|
|
|
*/
|
2004-06-01 02:03:21 +00:00
|
|
|
if (argc > 1)
|
2004-06-01 02:31:44 +00:00
|
|
|
argv[1] = kludge_oldps_options(PS_ARGS, argv[1], argv[2]);
|
1994-05-26 06:18:55 +00:00
|
|
|
|
2009-05-17 04:00:43 +00:00
|
|
|
all = descendancy = _fmt = nselectors = optfatal = 0;
|
2004-03-29 01:15:27 +00:00
|
|
|
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");
|
2010-02-08 21:23:48 +00:00
|
|
|
memf = _PATH_DEVNULL;
|
|
|
|
nlistf = NULL;
|
2002-06-20 14:55:53 +00:00
|
|
|
while ((ch = getopt(argc, argv, PS_ARGS)) != -1)
|
2008-07-18 14:55:22 +00:00
|
|
|
switch (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
|
2011-05-22 14:03:46 +00:00
|
|
|
* added for compatibility with SUSv3, but for
|
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
|
|
|
* 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;
|
2009-05-17 04:00:43 +00:00
|
|
|
case 'd':
|
|
|
|
descendancy = 1;
|
|
|
|
break;
|
1996-10-21 07:30:26 +00:00
|
|
|
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
|
2004-03-30 01:59:22 +00:00
|
|
|
/*-
|
2004-03-29 01:15:27 +00:00
|
|
|
* 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;
|
|
|
|
break;
|
|
|
|
case 'm':
|
|
|
|
sortby = SORTMEM;
|
|
|
|
break;
|
|
|
|
case 'N':
|
|
|
|
nlistf = optarg;
|
|
|
|
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-30 01:59:22 +00:00
|
|
|
/*-
|
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-30 01:59:22 +00:00
|
|
|
/*-
|
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;
|
2004-06-01 02:03:21 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* If there arguments after processing all the options, attempt
|
|
|
|
* to treat them as a list of process ids.
|
|
|
|
*/
|
|
|
|
while (*argv) {
|
|
|
|
if (!isdigitch(**argv))
|
|
|
|
break;
|
|
|
|
add_list(&pidlist, *argv);
|
|
|
|
argv++;
|
|
|
|
}
|
|
|
|
if (*argv) {
|
|
|
|
fprintf(stderr, "%s: illegal argument: %s\n",
|
|
|
|
getprogname(), *argv);
|
|
|
|
usage();
|
|
|
|
}
|
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;
|
|
|
|
|
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) {
|
2004-04-04 04:41:51 +00:00
|
|
|
uidlist.l.ptr = malloc(sizeof(uid_t));
|
|
|
|
if (uidlist.l.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;
|
2004-04-04 04:41:51 +00:00
|
|
|
*uidlist.l.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) {
|
2004-05-22 23:13:58 +00:00
|
|
|
if (gidlist.count == 1) {
|
|
|
|
what = KERN_PROC_RGID | showthreads;
|
|
|
|
flag = *gidlist.l.gids;
|
|
|
|
nselectors = 0;
|
|
|
|
} else if (pgrplist.count == 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
|
|
|
what = KERN_PROC_PGRP | showthreads;
|
2004-04-04 04:41:51 +00:00
|
|
|
flag = *pgrplist.l.pids;
|
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 = 0;
|
|
|
|
} else if (pidlist.count == 1) {
|
|
|
|
what = KERN_PROC_PID | showthreads;
|
2004-04-04 04:41:51 +00:00
|
|
|
flag = *pidlist.l.pids;
|
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 = 0;
|
|
|
|
} else if (ruidlist.count == 1) {
|
|
|
|
what = KERN_PROC_RUID | showthreads;
|
2004-04-04 04:41:51 +00:00
|
|
|
flag = *ruidlist.l.uids;
|
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 = 0;
|
|
|
|
} else if (sesslist.count == 1) {
|
|
|
|
what = KERN_PROC_SESSION | showthreads;
|
2004-04-04 04:41:51 +00:00
|
|
|
flag = *sesslist.l.pids;
|
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 = 0;
|
|
|
|
} else if (ttylist.count == 1) {
|
|
|
|
what = KERN_PROC_TTY | showthreads;
|
2004-04-04 04:41:51 +00:00
|
|
|
flag = *ttylist.l.ttys;
|
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 = 0;
|
|
|
|
} else if (uidlist.count == 1) {
|
|
|
|
what = KERN_PROC_UID | showthreads;
|
2004-04-04 04:41:51 +00:00
|
|
|
flag = *uidlist.l.uids;
|
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 = 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++)
|
2004-04-04 04:41:51 +00:00
|
|
|
if (kp->ki_pid == pidlist.l.pids[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
|
|
|
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++)
|
2004-04-04 04:41:51 +00:00
|
|
|
if (kp->ki_rgid == gidlist.l.gids[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
|
|
|
goto keepit;
|
|
|
|
}
|
|
|
|
if (pgrplist.count > 0) {
|
|
|
|
for (elem = 0; elem < pgrplist.count; elem++)
|
2004-04-04 04:41:51 +00:00
|
|
|
if (kp->ki_pgid ==
|
|
|
|
pgrplist.l.pids[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
|
|
|
goto keepit;
|
|
|
|
}
|
|
|
|
if (ruidlist.count > 0) {
|
|
|
|
for (elem = 0; elem < ruidlist.count; elem++)
|
2004-04-04 04:41:51 +00:00
|
|
|
if (kp->ki_ruid ==
|
|
|
|
ruidlist.l.uids[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
|
|
|
goto keepit;
|
|
|
|
}
|
|
|
|
if (sesslist.count > 0) {
|
|
|
|
for (elem = 0; elem < sesslist.count; elem++)
|
2004-04-04 04:41:51 +00:00
|
|
|
if (kp->ki_sid == sesslist.l.pids[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
|
|
|
goto keepit;
|
|
|
|
}
|
|
|
|
if (ttylist.count > 0) {
|
|
|
|
for (elem = 0; elem < ttylist.count; elem++)
|
2004-04-04 04:41:51 +00:00
|
|
|
if (kp->ki_tdev == ttylist.l.ttys[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
|
|
|
goto keepit;
|
|
|
|
}
|
|
|
|
if (uidlist.count > 0) {
|
|
|
|
for (elem = 0; elem < uidlist.count; elem++)
|
2004-04-04 04:41:51 +00:00
|
|
|
if (kp->ki_uid == uidlist.l.uids[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
|
|
|
goto keepit;
|
|
|
|
}
|
|
|
|
/*
|
|
|
|
* This process did not match any of the user's
|
|
|
|
* selector-options, so skip the process.
|
|
|
|
*/
|
|
|
|
continue;
|
|
|
|
|
|
|
|
keepit:
|
2004-06-20 21:25:10 +00:00
|
|
|
next_KINFO = &kinfo[nkept];
|
|
|
|
next_KINFO->ki_p = kp;
|
2009-05-17 04:00:43 +00:00
|
|
|
next_KINFO->ki_d.level = 0;
|
|
|
|
next_KINFO->ki_d.prefix = NULL;
|
2004-06-20 21:25:10 +00:00
|
|
|
next_KINFO->ki_pcpu = getpcpu(next_KINFO);
|
|
|
|
if (sortby == SORTMEM)
|
|
|
|
next_KINFO->ki_memsize = kp->ki_tsize +
|
|
|
|
kp->ki_dsize + kp->ki_ssize;
|
2004-03-17 22:46:58 +00:00
|
|
|
if (needuser)
|
2004-06-20 21:25:10 +00:00
|
|
|
saveuser(next_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
|
|
|
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();
|
|
|
|
|
2011-09-29 06:31:42 +00:00
|
|
|
if (nkept == 0) {
|
|
|
|
printheader();
|
2000-07-08 05:13:10 +00:00
|
|
|
exit(1);
|
2011-09-29 06:31:42 +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
|
|
|
|
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);
|
2009-05-17 04:00:43 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* We want things in descendant order
|
|
|
|
*/
|
|
|
|
if (descendancy)
|
|
|
|
descendant_sort(kinfo, nkept);
|
|
|
|
|
2011-09-29 06:31:42 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Prepare formatted output.
|
|
|
|
*/
|
|
|
|
for (i = 0; i < nkept; i++)
|
|
|
|
format_output(&kinfo[i]);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Print header.
|
|
|
|
*/
|
|
|
|
printheader();
|
|
|
|
|
1994-05-26 06:18:55 +00:00
|
|
|
/*
|
2011-09-29 06:31:42 +00:00
|
|
|
* Output formatted lines.
|
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++) {
|
2011-09-29 06:31:42 +00:00
|
|
|
linelen = 0;
|
2004-06-23 23:48:09 +00:00
|
|
|
STAILQ_FOREACH(vent, &varlist, next_ve) {
|
2011-09-29 06:31:42 +00:00
|
|
|
if (vent->var->flag & LJUST)
|
|
|
|
fmtstr = "%-*s";
|
|
|
|
else
|
|
|
|
fmtstr = "%*s";
|
|
|
|
|
|
|
|
ks = STAILQ_FIRST(&kinfo[i].ki_ks);
|
|
|
|
STAILQ_REMOVE_HEAD(&kinfo[i].ki_ks, ks_next);
|
|
|
|
/* Truncate rightmost column if neccessary. */
|
|
|
|
if (STAILQ_NEXT(vent, next_ve) == NULL &&
|
|
|
|
termwidth != UNLIMITED && ks->ks_str != NULL) {
|
|
|
|
left = termwidth - linelen;
|
|
|
|
if (left > 0 && left < (int)strlen(ks->ks_str))
|
|
|
|
ks->ks_str[left] = '\0';
|
|
|
|
}
|
|
|
|
str = ks->ks_str;
|
|
|
|
if (str == NULL)
|
|
|
|
str = "-";
|
|
|
|
/* No padding for the last column, if it's LJUST. */
|
|
|
|
if (STAILQ_NEXT(vent, next_ve) == NULL &&
|
|
|
|
vent->var->flag & LJUST)
|
|
|
|
linelen += printf(fmtstr, 0, str);
|
|
|
|
else
|
|
|
|
linelen += printf(fmtstr, vent->var->width, str);
|
|
|
|
|
|
|
|
if (ks->ks_str != NULL) {
|
|
|
|
free(ks->ks_str);
|
|
|
|
ks->ks_str = NULL;
|
|
|
|
}
|
|
|
|
free(ks);
|
|
|
|
ks = NULL;
|
|
|
|
|
|
|
|
if (STAILQ_NEXT(vent, next_ve) != NULL) {
|
1994-05-26 06:18:55 +00:00
|
|
|
(void)putchar(' ');
|
2011-09-29 06:31:42 +00:00
|
|
|
linelen++;
|
|
|
|
}
|
1994-05-26 06:18:55 +00:00
|
|
|
}
|
|
|
|
(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);
|
2009-05-17 04:00:43 +00:00
|
|
|
for (i = 0; i < nkept; i++)
|
|
|
|
free(kinfo[i].ki_d.prefix);
|
|
|
|
free(kinfo);
|
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-30 04:20:33 +00:00
|
|
|
u_long bigtemp;
|
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;
|
2004-03-30 04:20:33 +00:00
|
|
|
bigtemp = strtoul(elem, &endp, 10);
|
|
|
|
if (errno == 0 && *endp == '\0' && bigtemp <= GID_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
|
|
|
nameorID = "name or ID matches";
|
2004-03-30 04:20:33 +00:00
|
|
|
grp = getgrgid((gid_t)bigtemp);
|
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 (grp == NULL)
|
|
|
|
grp = getgrnam(elem);
|
|
|
|
if (grp == NULL) {
|
|
|
|
warnx("No %s %s '%s'", inf->lname, nameorID, elem);
|
|
|
|
optfatal = 1;
|
2004-06-01 22:19:16 +00:00
|
|
|
return (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
|
|
|
}
|
|
|
|
if (inf->count >= inf->maxcount)
|
|
|
|
expand_list(inf);
|
2004-04-04 04:41:51 +00:00
|
|
|
inf->l.gids[(inf->count)++] = grp->gr_gid;
|
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
|
|
|
return (1);
|
|
|
|
}
|
|
|
|
|
2004-03-30 01:59:22 +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
|
|
|
|
2004-06-01 03:01:51 +00:00
|
|
|
if (*elem == '\0') {
|
|
|
|
warnx("Invalid (zero-length) process id");
|
|
|
|
optfatal = 1;
|
|
|
|
return (0); /* Do not add this value. */
|
2004-06-01 18:12:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
if (errno == ERANGE) {
|
|
|
|
optfatal = 1;
|
2004-06-01 22:19:16 +00:00
|
|
|
return (0);
|
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);
|
2004-04-04 04:41:51 +00:00
|
|
|
inf->l.pids[(inf->count)++] = tempid;
|
Support more POSIX/SUSv3 options:
- Change `-p' to allow a list of process IDs, and `-t' to allow a list
of terminal names, instead of only a single value for each.
- Add the `-A' option of SUSv3, which is exactly the same as `-ax'.
- Add the `-G gidlist' (group id).
- Allow any of these "selector options" to be specified multiple times,
and have `ps' keep adding to a given list -- instead of replacing the
previously-specified values.
- Fix interactions between selector-options, so that: "If any are
specified, ... ps shall select the processes represented by the
inclusive OR of all the selection-criteria options." (from SUSv3)
- Add a `-X' option, which is the reverse of the `-x' option.
- various minor improvements in parsing and error handling.
This does not get us to match POSIX/SUSv3, but it gets us closer. The
`-g pgidlist', `-R ruserlist' and `-s sidlist' options mentioned in
freebsd-standards are still under debate, so they skipped for now.
It should be true that this introduces no user-visible incompatible
changes, except to support "new stuff" that was not supported before.
2004-03-27 18:22:17 +00:00
|
|
|
return (1);
|
|
|
|
}
|
|
|
|
#undef BSD_PID_MAX
|
|
|
|
|
2004-06-24 01:57:59 +00:00
|
|
|
/*-
|
|
|
|
* The user can specify a device via one of three formats:
|
2007-11-08 22:31:28 +00:00
|
|
|
* 1) fully qualified, e.g.: /dev/ttyp0 /dev/console /dev/pts/0
|
|
|
|
* 2) missing "/dev", e.g.: ttyp0 console pts/0
|
|
|
|
* 3) two-letters, e.g.: p0 co 0
|
2004-06-24 01:57:59 +00:00
|
|
|
* (matching letters that would be seen in the "TT" column)
|
|
|
|
*/
|
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_tty(struct listinfo *inf, const char *elem)
|
|
|
|
{
|
|
|
|
const char *ttypath;
|
2004-03-29 00:25:09 +00:00
|
|
|
struct stat sb;
|
2007-11-08 22:31:28 +00:00
|
|
|
char pathbuf[PATH_MAX], pathbuf2[PATH_MAX], pathbuf3[PATH_MAX];
|
2004-03-17 22:46:58 +00:00
|
|
|
|
2004-06-24 01:57:59 +00:00
|
|
|
ttypath = NULL;
|
2004-06-27 22:56:58 +00:00
|
|
|
pathbuf2[0] = '\0';
|
2007-11-08 22:31:28 +00:00
|
|
|
pathbuf3[0] = '\0';
|
2004-06-24 01:57:59 +00:00
|
|
|
switch (*elem) {
|
|
|
|
case '/':
|
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
|
|
|
ttypath = elem;
|
2004-06-24 01:57:59 +00:00
|
|
|
break;
|
|
|
|
case 'c':
|
|
|
|
if (strcmp(elem, "co") == 0) {
|
|
|
|
ttypath = _PATH_CONSOLE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
/* FALLTHROUGH */
|
|
|
|
default:
|
|
|
|
strlcpy(pathbuf, _PATH_DEV, sizeof(pathbuf));
|
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
|
|
|
strlcat(pathbuf, elem, sizeof(pathbuf));
|
|
|
|
ttypath = pathbuf;
|
2004-06-27 22:56:58 +00:00
|
|
|
if (strncmp(pathbuf, _PATH_TTY, strlen(_PATH_TTY)) == 0)
|
2004-06-24 01:57:59 +00:00
|
|
|
break;
|
2007-11-08 22:31:28 +00:00
|
|
|
if (strncmp(pathbuf, _PATH_PTS, strlen(_PATH_PTS)) == 0)
|
|
|
|
break;
|
2004-06-24 01:57:59 +00:00
|
|
|
if (strcmp(pathbuf, _PATH_CONSOLE) == 0)
|
|
|
|
break;
|
2004-06-27 22:56:58 +00:00
|
|
|
/* Check to see if /dev/tty${elem} exists */
|
|
|
|
strlcpy(pathbuf2, _PATH_TTY, sizeof(pathbuf2));
|
|
|
|
strlcat(pathbuf2, elem, sizeof(pathbuf2));
|
|
|
|
if (stat(pathbuf2, &sb) == 0 && S_ISCHR(sb.st_mode)) {
|
2004-06-24 01:57:59 +00:00
|
|
|
/* No need to repeat stat() && S_ISCHR() checks */
|
2009-05-18 01:45:52 +00:00
|
|
|
ttypath = NULL;
|
2004-06-24 01:57:59 +00:00
|
|
|
break;
|
|
|
|
}
|
2007-11-08 22:31:28 +00:00
|
|
|
/* Check to see if /dev/pts/${elem} exists */
|
|
|
|
strlcpy(pathbuf3, _PATH_PTS, sizeof(pathbuf3));
|
|
|
|
strlcat(pathbuf3, elem, sizeof(pathbuf3));
|
|
|
|
if (stat(pathbuf3, &sb) == 0 && S_ISCHR(sb.st_mode)) {
|
|
|
|
/* No need to repeat stat() && S_ISCHR() checks */
|
2009-05-18 01:45:52 +00:00
|
|
|
ttypath = NULL;
|
2007-11-08 22:31:28 +00:00
|
|
|
break;
|
|
|
|
}
|
2004-06-24 01:57:59 +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
|
|
|
}
|
2004-06-24 01:57:59 +00:00
|
|
|
if (ttypath) {
|
|
|
|
if (stat(ttypath, &sb) == -1) {
|
2007-11-08 22:31:28 +00:00
|
|
|
if (pathbuf3[0] != '\0')
|
|
|
|
warn("%s, %s, and %s", pathbuf3, pathbuf2,
|
|
|
|
ttypath);
|
2004-06-27 22:56:58 +00:00
|
|
|
else
|
|
|
|
warn("%s", ttypath);
|
2004-06-24 01:57:59 +00:00
|
|
|
optfatal = 1;
|
|
|
|
return (0);
|
|
|
|
}
|
|
|
|
if (!S_ISCHR(sb.st_mode)) {
|
2007-11-08 22:31:28 +00:00
|
|
|
if (pathbuf3[0] != '\0')
|
|
|
|
warnx("%s, %s, and %s: Not a terminal",
|
|
|
|
pathbuf3, pathbuf2, ttypath);
|
2004-06-27 22:56:58 +00:00
|
|
|
else
|
|
|
|
warnx("%s: Not a terminal", ttypath);
|
2004-06-24 01:57:59 +00:00
|
|
|
optfatal = 1;
|
|
|
|
return (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
|
|
|
}
|
|
|
|
if (inf->count >= inf->maxcount)
|
|
|
|
expand_list(inf);
|
2004-04-04 04:41:51 +00:00
|
|
|
inf->l.ttys[(inf->count)++] = sb.st_rdev;
|
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
|
|
|
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-30 04:20:33 +00:00
|
|
|
u_long bigtemp;
|
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;
|
2004-03-30 04:20:33 +00:00
|
|
|
bigtemp = strtoul(elem, &endp, 10);
|
|
|
|
if (errno != 0 || *endp != '\0' || bigtemp > UID_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
|
|
|
warnx("No %s named '%s'", inf->lname, elem);
|
|
|
|
else {
|
|
|
|
/* The string is all digits, so it might be a userID. */
|
2004-03-30 04:20:33 +00:00
|
|
|
pwd = getpwuid((uid_t)bigtemp);
|
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)
|
|
|
|
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-06-01 22:19:16 +00:00
|
|
|
return (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
|
|
|
}
|
|
|
|
if (inf->count >= inf->maxcount)
|
|
|
|
expand_list(inf);
|
2004-04-04 04:41:51 +00:00
|
|
|
inf->l.uids[(inf->count)++] = pwd->pw_uid;
|
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
|
|
|
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
|
|
|
|
2004-06-01 03:01:51 +00:00
|
|
|
if (*argp == 0)
|
2004-06-01 22:19:16 +00:00
|
|
|
inf->addelem(inf, elemcopy);
|
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';
|
2004-03-29 01:15:27 +00:00
|
|
|
/*
|
2004-06-01 19:00:42 +00:00
|
|
|
* Add this single element to the given list.
|
2004-03-29 01:15:27 +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->addelem(inf, elemcopy);
|
|
|
|
} 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
|
|
|
}
|
|
|
|
|
2009-05-17 04:00:43 +00:00
|
|
|
static void
|
|
|
|
descendant_sort(KINFO *ki, int items)
|
|
|
|
{
|
|
|
|
int dst, lvl, maxlvl, n, ndst, nsrc, siblings, src;
|
|
|
|
unsigned char *path;
|
|
|
|
KINFO kn;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* First, sort the entries by descendancy, tracking the descendancy
|
|
|
|
* depth in the ki_d.level field.
|
|
|
|
*/
|
|
|
|
src = 0;
|
|
|
|
maxlvl = 0;
|
|
|
|
while (src < items) {
|
|
|
|
if (ki[src].ki_d.level) {
|
|
|
|
src++;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
for (nsrc = 1; src + nsrc < items; nsrc++)
|
|
|
|
if (!ki[src + nsrc].ki_d.level)
|
|
|
|
break;
|
|
|
|
|
|
|
|
for (dst = 0; dst < items; dst++) {
|
|
|
|
if (ki[dst].ki_p->ki_pid == ki[src].ki_p->ki_pid)
|
|
|
|
continue;
|
|
|
|
if (ki[dst].ki_p->ki_pid == ki[src].ki_p->ki_ppid)
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (dst == items) {
|
|
|
|
src += nsrc;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (ndst = 1; dst + ndst < items; ndst++)
|
|
|
|
if (ki[dst + ndst].ki_d.level <= ki[dst].ki_d.level)
|
|
|
|
break;
|
|
|
|
|
|
|
|
for (n = src; n < src + nsrc; n++) {
|
|
|
|
ki[n].ki_d.level += ki[dst].ki_d.level + 1;
|
|
|
|
if (maxlvl < ki[n].ki_d.level)
|
|
|
|
maxlvl = ki[n].ki_d.level;
|
|
|
|
}
|
|
|
|
|
|
|
|
while (nsrc) {
|
|
|
|
if (src < dst) {
|
|
|
|
kn = ki[src];
|
|
|
|
memmove(ki + src, ki + src + 1,
|
|
|
|
(dst - src + ndst - 1) * sizeof *ki);
|
|
|
|
ki[dst + ndst - 1] = kn;
|
|
|
|
nsrc--;
|
|
|
|
dst--;
|
|
|
|
ndst++;
|
|
|
|
} else if (src != dst + ndst) {
|
|
|
|
kn = ki[src];
|
|
|
|
memmove(ki + dst + ndst + 1, ki + dst + ndst,
|
|
|
|
(src - dst - ndst) * sizeof *ki);
|
|
|
|
ki[dst + ndst] = kn;
|
|
|
|
ndst++;
|
|
|
|
nsrc--;
|
|
|
|
src++;
|
|
|
|
} else {
|
|
|
|
ndst += nsrc;
|
|
|
|
src += nsrc;
|
|
|
|
nsrc = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Now populate ki_d.prefix (instead of ki_d.level) with the command
|
|
|
|
* prefix used to show descendancies.
|
|
|
|
*/
|
|
|
|
path = malloc((maxlvl + 7) / 8);
|
|
|
|
memset(path, '\0', (maxlvl + 7) / 8);
|
|
|
|
for (src = 0; src < items; src++) {
|
|
|
|
if ((lvl = ki[src].ki_d.level) == 0) {
|
|
|
|
ki[src].ki_d.prefix = NULL;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if ((ki[src].ki_d.prefix = malloc(lvl * 2 + 1)) == NULL)
|
|
|
|
errx(1, "malloc failed");
|
|
|
|
for (n = 0; n < lvl - 2; n++) {
|
|
|
|
ki[src].ki_d.prefix[n * 2] =
|
|
|
|
path[n / 8] & 1 << (n % 8) ? '|' : ' ';
|
|
|
|
ki[src].ki_d.prefix[n * 2 + 1] = ' ';
|
|
|
|
}
|
|
|
|
if (n == lvl - 2) {
|
|
|
|
/* Have I any more siblings? */
|
|
|
|
for (siblings = 0, dst = src + 1; dst < items; dst++) {
|
|
|
|
if (ki[dst].ki_d.level > lvl)
|
|
|
|
continue;
|
|
|
|
if (ki[dst].ki_d.level == lvl)
|
|
|
|
siblings = 1;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (siblings)
|
|
|
|
path[n / 8] |= 1 << (n % 8);
|
|
|
|
else
|
|
|
|
path[n / 8] &= ~(1 << (n % 8));
|
|
|
|
ki[src].ki_d.prefix[n * 2] = siblings ? '|' : '`';
|
|
|
|
ki[src].ki_d.prefix[n * 2 + 1] = '-';
|
|
|
|
n++;
|
|
|
|
}
|
|
|
|
strcpy(ki[src].ki_d.prefix + n * 2, "- ");
|
|
|
|
}
|
|
|
|
free(path);
|
|
|
|
}
|
|
|
|
|
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;
|
2004-04-04 04:41:51 +00:00
|
|
|
newlist = realloc(inf->l.ptr, newmax * inf->elemsize);
|
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 (newlist == NULL) {
|
2004-04-04 04:41:51 +00:00
|
|
|
free(inf->l.ptr);
|
2004-06-01 22:19:16 +00:00
|
|
|
errx(1, "realloc to %d %ss failed", newmax, inf->lname);
|
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->maxcount = newmax;
|
2004-04-04 04:41:51 +00:00
|
|
|
inf->l.ptr = newlist;
|
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
|
|
|
|
|
|
|
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;
|
2004-04-04 04:41:51 +00:00
|
|
|
if (inf->l.ptr != NULL)
|
|
|
|
free(inf->l.ptr);
|
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 = NULL;
|
|
|
|
inf->lname = NULL;
|
2004-04-04 04:41:51 +00:00
|
|
|
inf->l.ptr = NULL;
|
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
|
|
|
|
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;
|
2004-04-04 04:41:51 +00:00
|
|
|
inf->l.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;
|
|
|
|
|
2004-06-23 23:48:09 +00:00
|
|
|
STAILQ_FOREACH(vent, &varlist, next_ve) {
|
2003-01-19 00:22:34 +00:00
|
|
|
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;
|
|
|
|
|
2004-06-23 23:48:09 +00:00
|
|
|
STAILQ_FOREACH(vent, &varlist, next_ve) {
|
1997-04-29 05:26:05 +00:00
|
|
|
v = vent->var;
|
|
|
|
if (v->flag & USER)
|
|
|
|
needuser = 1;
|
|
|
|
if (v->flag & COMM)
|
|
|
|
needcomm = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2011-09-29 06:31:42 +00:00
|
|
|
format_output(KINFO *ki)
|
1997-04-29 05:26:05 +00:00
|
|
|
{
|
|
|
|
struct varent *vent;
|
|
|
|
VAR *v;
|
2011-09-29 06:31:42 +00:00
|
|
|
KINFO_STR *ks;
|
|
|
|
char *str;
|
|
|
|
int len;
|
1997-04-29 05:26:05 +00:00
|
|
|
|
2011-09-29 06:31:42 +00:00
|
|
|
STAILQ_INIT(&ki->ki_ks);
|
2004-06-23 23:48:09 +00:00
|
|
|
STAILQ_FOREACH(vent, &varlist, next_ve) {
|
1997-04-29 05:26:05 +00:00
|
|
|
v = vent->var;
|
2011-09-29 06:31:42 +00:00
|
|
|
str = (v->oproc)(ki, vent);
|
|
|
|
ks = malloc(sizeof(*ks));
|
|
|
|
if (ks == NULL)
|
|
|
|
errx(1, "malloc failed");
|
|
|
|
ks->ks_str = str;
|
|
|
|
STAILQ_INSERT_TAIL(&ki->ki_ks, ks, ks_next);
|
|
|
|
if (str != NULL) {
|
|
|
|
len = strlen(str);
|
|
|
|
} else
|
|
|
|
len = 1; /* "-" */
|
|
|
|
if (v->width < len)
|
|
|
|
v->width = len;
|
1997-04-29 05:26:05 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
2004-06-23 23:48:09 +00:00
|
|
|
STAILQ_FOREACH(vent, &varlist, next_ve) {
|
1994-05-26 06:18:55 +00:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
2007-09-17 05:31:39 +00:00
|
|
|
#define UREADOK(ki) (forceuread || (ki->ki_p->ki_flag & P_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
|
|
|
{
|
|
|
|
|
2007-09-17 05:31:39 +00:00
|
|
|
if (ki->ki_p->ki_flag & P_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
|
|
|
|
*/
|
2004-06-23 21:17:25 +00:00
|
|
|
if (needcomm) {
|
|
|
|
if (ki->ki_p->ki_stat == SZOMB)
|
|
|
|
ki->ki_args = strdup("<defunct>");
|
|
|
|
else if (UREADOK(ki) || (ki->ki_p->ki_args != NULL))
|
|
|
|
ki->ki_args = strdup(fmt(kvm_getargv, ki,
|
|
|
|
ki->ki_p->ki_comm, MAXCOMLEN));
|
|
|
|
else
|
|
|
|
asprintf(&ki->ki_args, "(%s)", ki->ki_p->ki_comm);
|
2004-06-24 03:15:18 +00:00
|
|
|
if (ki->ki_args == NULL)
|
2004-06-23 21:17:25 +00:00
|
|
|
errx(1, "malloc failed");
|
1999-11-17 12:52:42 +00:00
|
|
|
} else {
|
|
|
|
ki->ki_args = NULL;
|
|
|
|
}
|
2004-06-23 21:17:25 +00:00
|
|
|
if (needenv) {
|
|
|
|
if (UREADOK(ki))
|
|
|
|
ki->ki_env = strdup(fmt(kvm_getenvv, ki,
|
|
|
|
(char *)NULL, 0));
|
|
|
|
else
|
|
|
|
ki->ki_env = strdup("()");
|
|
|
|
if (ki->ki_env == NULL)
|
|
|
|
errx(1, "malloc failed");
|
1999-11-17 12:52:42 +00:00
|
|
|
} else {
|
|
|
|
ki->ki_env = NULL;
|
|
|
|
}
|
1994-05-26 06:18:55 +00:00
|
|
|
}
|
|
|
|
|
2004-06-20 21:25:10 +00:00
|
|
|
/* A macro used to improve the readability of pscomp(). */
|
|
|
|
#define DIFF_RETURN(a, b, field) do { \
|
|
|
|
if ((a)->field != (b)->field) \
|
|
|
|
return (((a)->field < (b)->field) ? -1 : 1); \
|
|
|
|
} while (0)
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
ka = a;
|
|
|
|
kb = b;
|
|
|
|
/* SORTCPU and SORTMEM are sorted in descending order. */
|
2004-06-20 21:25:10 +00:00
|
|
|
if (sortby == SORTCPU)
|
|
|
|
DIFF_RETURN(kb, ka, ki_pcpu);
|
|
|
|
if (sortby == SORTMEM)
|
|
|
|
DIFF_RETURN(kb, ka, ki_memsize);
|
2004-03-30 01:45:23 +00:00
|
|
|
/*
|
|
|
|
* TTY's are sorted in ascending order, except that all NODEV
|
|
|
|
* processes come before all processes with a device.
|
|
|
|
*/
|
2004-06-20 21:25:10 +00:00
|
|
|
if (ka->ki_p->ki_tdev != kb->ki_p->ki_tdev) {
|
|
|
|
if (ka->ki_p->ki_tdev == NODEV)
|
|
|
|
return (-1);
|
|
|
|
if (kb->ki_p->ki_tdev == NODEV)
|
|
|
|
return (1);
|
|
|
|
DIFF_RETURN(ka, kb, ki_p->ki_tdev);
|
|
|
|
}
|
|
|
|
|
2004-06-23 11:28:17 +00:00
|
|
|
/* PID's and TID's (threads) are sorted in ascending order. */
|
2004-06-20 21:25:10 +00:00
|
|
|
DIFF_RETURN(ka, kb, ki_p->ki_pid);
|
2004-06-23 11:28:17 +00:00
|
|
|
DIFF_RETURN(ka, kb, ki_p->ki_tid);
|
2004-03-30 01:45:23 +00:00
|
|
|
return (0);
|
1994-05-26 06:18:55 +00:00
|
|
|
}
|
2004-06-20 21:25:10 +00:00
|
|
|
#undef DIFF_RETURN
|
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 *
|
2004-06-01 02:31:44 +00:00
|
|
|
kludge_oldps_options(const char *optlist, char *origval, const char *nextarg)
|
1994-05-26 06:18:55 +00:00
|
|
|
{
|
|
|
|
size_t len;
|
2004-06-01 02:03:21 +00:00
|
|
|
char *argp, *cp, *newopts, *ns, *optp, *pidp;
|
1994-05-26 06:18:55 +00:00
|
|
|
|
2002-09-03 05:44:00 +00:00
|
|
|
/*
|
2004-06-01 02:03:21 +00:00
|
|
|
* See if the original value includes any option which takes an
|
|
|
|
* argument (and will thus use up the remainder of the string).
|
2002-09-03 05:44:00 +00:00
|
|
|
*/
|
2004-06-01 02:03:21 +00:00
|
|
|
argp = NULL;
|
|
|
|
if (optlist != NULL) {
|
|
|
|
for (cp = origval; *cp != '\0'; cp++) {
|
|
|
|
optp = strchr(optlist, *cp);
|
|
|
|
if ((optp != NULL) && *(optp + 1) == ':') {
|
|
|
|
argp = cp;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (argp != NULL && *origval == '-')
|
|
|
|
return (origval);
|
2002-09-03 05:44:00 +00:00
|
|
|
|
1994-05-26 06:18:55 +00:00
|
|
|
/*
|
|
|
|
* 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
|
|
|
*
|
2004-05-23 21:21:07 +00:00
|
|
|
* However, if a flag accepting a string argument is found earlier
|
|
|
|
* in the option string (including a possible `t' flag), then the
|
|
|
|
* remainder of the string must be the argument to that flag; so
|
2004-06-01 02:03:21 +00:00
|
|
|
* do not modify that argument. Note that a trailing `t' would
|
|
|
|
* cause argp to be set, if argp was not already set by some
|
|
|
|
* earlier option.
|
1994-05-26 06:18:55 +00:00
|
|
|
*/
|
2004-06-01 02:03:21 +00:00
|
|
|
len = strlen(origval);
|
|
|
|
cp = origval + len - 1;
|
|
|
|
pidp = NULL;
|
2004-06-01 02:31:44 +00:00
|
|
|
if (*cp == 't' && *origval != '-' && cp == argp) {
|
|
|
|
if (nextarg == NULL || *nextarg == '-' || isdigitch(*nextarg))
|
|
|
|
*cp = 'T';
|
|
|
|
} else if (argp == NULL) {
|
1994-05-26 06:18:55 +00:00
|
|
|
/*
|
2004-06-01 02:03:21 +00:00
|
|
|
* The original value did not include any option which takes
|
|
|
|
* an argument (and that would include `p' and `t'), so check
|
|
|
|
* the value for trailing number, or comma-separated list of
|
|
|
|
* numbers, which we will treat as a pid request.
|
1994-05-26 06:18:55 +00:00
|
|
|
*/
|
2004-06-01 02:03:21 +00:00
|
|
|
if (isdigitch(*cp)) {
|
|
|
|
while (cp >= origval && (*cp == ',' || isdigitch(*cp)))
|
|
|
|
--cp;
|
|
|
|
pidp = cp + 1;
|
|
|
|
}
|
1994-05-26 06:18:55 +00:00
|
|
|
}
|
2004-06-01 02:03:21 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* If nothing needs to be added to the string, then return
|
|
|
|
* the "original" (although possibly modified) value.
|
|
|
|
*/
|
|
|
|
if (*origval == '-' && pidp == NULL)
|
|
|
|
return (origval);
|
|
|
|
|
1994-05-26 06:18:55 +00:00
|
|
|
/*
|
2004-06-01 02:03:21 +00:00
|
|
|
* Create a copy of the string to add '-' and/or 'p' to the
|
|
|
|
* original value.
|
1994-05-26 06:18:55 +00:00
|
|
|
*/
|
2004-06-01 02:03:21 +00:00
|
|
|
if ((newopts = ns = malloc(len + 3)) == NULL)
|
|
|
|
errx(1, "malloc failed");
|
|
|
|
|
|
|
|
if (*origval != '-')
|
|
|
|
*ns++ = '-'; /* add option flag */
|
|
|
|
|
|
|
|
if (pidp == NULL)
|
|
|
|
strcpy(ns, origval);
|
|
|
|
else {
|
|
|
|
/*
|
|
|
|
* Copy everything before the pid string, add the `p',
|
|
|
|
* and then copy the pid string.
|
|
|
|
*/
|
|
|
|
len = pidp - origval;
|
|
|
|
memcpy(ns, origval, len);
|
|
|
|
ns += len;
|
1994-05-26 06:18:55 +00:00
|
|
|
*ns++ = 'p';
|
2004-06-01 02:03:21 +00:00
|
|
|
strcpy(ns, pidp);
|
|
|
|
}
|
1994-05-26 06:18:55 +00:00
|
|
|
|
|
|
|
return (newopts);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2002-02-02 06:48:10 +00:00
|
|
|
usage(void)
|
1994-05-26 06:18:55 +00:00
|
|
|
{
|
2009-07-23 10:20:12 +00:00
|
|
|
#define SINGLE_OPTS "[-aCcde" 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",
|
2005-02-09 17:37:39 +00:00
|
|
|
"usage: ps " SINGLE_OPTS " [-O fmt | -o fmt] [-G gid[,gid...]]",
|
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
|
|
|
" [-M core] [-N system]",
|
2005-02-09 17:37:39 +00:00
|
|
|
" [-p pid[,pid...]] [-t tty[,tty...]] [-U user[,user...]]",
|
1997-06-06 06:40:06 +00:00
|
|
|
" ps [-L]");
|
1994-05-26 06:18:55 +00:00
|
|
|
exit(1);
|
|
|
|
}
|