diff options
author | Kiyoshi Aman <kiyoshi.aman+adelie@gmail.com> | 2019-05-24 22:53:53 -0500 |
---|---|---|
committer | Kiyoshi Aman <kiyoshi.aman+adelie@gmail.com> | 2019-05-24 22:53:53 -0500 |
commit | ba1a8e3d1da08e05567ee6f83288cc5a993976f7 (patch) | |
tree | 95a26f6447d3cf7b1458418ad22cfcfa7cc47dae | |
parent | 2b6d352202dcdafeb03ddc7be9d45d54915afab4 (diff) | |
download | userland-ba1a8e3d1da08e05567ee6f83288cc5a993976f7.tar.gz userland-ba1a8e3d1da08e05567ee6f83288cc5a993976f7.tar.bz2 userland-ba1a8e3d1da08e05567ee6f83288cc5a993976f7.tar.xz userland-ba1a8e3d1da08e05567ee6f83288cc5a993976f7.zip |
bin: remove `kill` and `ps`; they are provided by procps
-rw-r--r-- | bin/kill/kill.1 | 156 | ||||
-rw-r--r-- | bin/kill/kill.c | 320 | ||||
-rw-r--r-- | bin/ps/extern.h | 99 | ||||
-rw-r--r-- | bin/ps/fmt.c | 60 | ||||
-rw-r--r-- | bin/ps/keyword.c | 415 | ||||
-rw-r--r-- | bin/ps/nlist.c | 234 | ||||
-rw-r--r-- | bin/ps/print.c | 1413 | ||||
-rw-r--r-- | bin/ps/ps.1 | 706 | ||||
-rw-r--r-- | bin/ps/ps.c | 947 | ||||
-rw-r--r-- | bin/ps/ps.h | 104 |
10 files changed, 0 insertions, 4454 deletions
diff --git a/bin/kill/kill.1 b/bin/kill/kill.1 deleted file mode 100644 index 86b05fd..0000000 --- a/bin/kill/kill.1 +++ /dev/null @@ -1,156 +0,0 @@ -.\" $NetBSD: kill.1,v 1.28 2017/04/22 23:01:36 christos Exp $ -.\" -.\" Copyright (c) 1980, 1990, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" This code is derived from software contributed to Berkeley by -.\" the Institute of Electrical and Electronics Engineers, Inc. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. 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. -.\" -.\" @(#)kill.1 8.2 (Berkeley) 4/28/95 -.\" -.Dd April 22, 2017 -.Dt KILL 1 -.Os -.Sh NAME -.Nm kill -.Nd terminate or signal a process -.Sh SYNOPSIS -.Nm -.Op Fl s Ar signal_name -.Ar pid -\&... -.Nm -.Fl l -.Op Ar exit_status -.Nm -.Fl signal_name -.Ar pid -\&... -.Nm -.Fl signal_number -.Ar pid -\&... -.Sh DESCRIPTION -The -.Nm -utility sends a signal to the process(es) specified -by the pid operand(s). -.Pp -Only the super-user may send signals to other users' processes. -.Pp -The options are as follows: -.Bl -tag -width Ds -.It Fl s Ar signal_name -A symbolic signal name specifying the signal to be sent instead of the -default -.Dv TERM . -.It Fl l Op Ar exit_status -Display the name of the signal corresponding to -.Ar exit_status . -.Ar exit_status -may be the exit status of a command killed by a signal -(see the -special -.Xr sh 1 -parameter -.Sq ?\& ) -or a signal number. -.Pp -If no operand is given, display the names of all the signals. -.It Fl signal_name -A symbolic signal name specifying the signal to be sent instead of the -default -.Dv TERM . -.It Fl signal_number -A non-negative decimal integer, specifying the signal to be sent instead -of the default -.Dv TERM . -.El -.Pp -The following pids have special meanings: -.Bl -tag -width Ds -compact -.It -1 -If superuser, broadcast the signal to all processes; otherwise broadcast -to all processes belonging to the user. -.It 0 -Broadcast the signal to all processes in the current process group -belonging to the user. -.El -.Pp -Some of the more commonly used signals: -.Bl -tag -width Ds -compact -.It 0 -0 (does not affect the process; can be used to test whether the -process exists) -.It 1 -HUP (hang up) -.It 2 -INT (interrupt) -.It 3 -QUIT (quit) -.It 6 -ABRT (abort) -.It 9 -KILL (non-catchable, non-ignorable kill) -.It 14 -ALRM (alarm clock) -.It 15 -TERM (software termination signal) -.El -.Pp -.Nm -is a built-in to -.Xr csh 1 ; -it allows job specifiers of the form ``%...'' as arguments -so process id's are not as often used as -.Nm -arguments. -See -.Xr csh 1 -for details. -.Sh DIAGNOSTICS -.Ex -std -.Sh SEE ALSO -.Xr csh 1 , -.Xr pgrep 1 , -.Xr pkill 1 , -.Xr ps 1 , -.Xr kill 2 , -.Xr sigaction 2 , -.Xr signal 7 -.Sh STANDARDS -The -.Nm -utility is expected to be -.St -p1003.2 -compatible. -.Sh HISTORY -A -.Nm -command appeared in -.At v3 -in section 8 of the manual. diff --git a/bin/kill/kill.c b/bin/kill/kill.c deleted file mode 100644 index 6c17cb3..0000000 --- a/bin/kill/kill.c +++ /dev/null @@ -1,320 +0,0 @@ -/* $NetBSD: kill.c,v 1.30 2018/12/12 20:22:43 kre Exp $ */ - -/* - * Copyright (c) 1988, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. 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. - */ - -#include <sys/cdefs.h> -#if !defined(lint) && !defined(SHELL) -__COPYRIGHT("@(#) Copyright (c) 1988, 1993, 1994\ - The Regents of the University of California. All rights reserved."); -#endif /* not lint */ - -#ifndef lint -#if 0 -static char sccsid[] = "@(#)kill.c 8.4 (Berkeley) 4/28/95"; -#else -__RCSID("$NetBSD: kill.c,v 1.30 2018/12/12 20:22:43 kre Exp $"); -#endif -#endif /* not lint */ - -#include <ctype.h> -#include <err.h> -#include <errno.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <limits.h> -#include <inttypes.h> -#include <string.h> -#include <termios.h> -#include <unistd.h> -#include <locale.h> -#include <sys/ioctl.h> - -#ifdef SHELL /* sh (aka ash) builtin */ -int killcmd(int, char *argv[]); -#define main killcmd -#include "../../bin/sh/bltin/bltin.h" -#endif /* SHELL */ - -__dead static void nosig(const char *); -void printsignals(FILE *, int); -static int signum(const char *); -static pid_t processnum(const char *); -__dead static void usage(void); - -int -main(int argc, char *argv[]) -{ - int errors; - int numsig; - pid_t pid; - const char *sn; - - setprogname(argv[0]); - setlocale(LC_ALL, ""); - if (argc < 2) - usage(); - - numsig = SIGTERM; - - argc--, argv++; - - /* - * Process exactly 1 option, if there is one. - */ - if (argv[0][0] == '-') { - switch (argv[0][1]) { - case 'l': - if (argv[0][2] != '\0') - sn = argv[0] + 2; - else { - argc--; argv++; - sn = argv[0]; - } - if (argc > 1) - usage(); - if (argc == 1) { - if (isdigit((unsigned char)*sn) == 0) - usage(); - numsig = signum(sn); - if (numsig >= 128) - numsig -= 128; - if (numsig == 0 || signalnext(numsig) == -1) - nosig(sn); - sn = signalname(numsig); - if (sn == NULL) - errx(EXIT_FAILURE, - "unknown signal number: %d", numsig); - printf("%s\n", sn); - exit(0); - } - printsignals(stdout, 0); - exit(0); - - case 's': - if (argv[0][2] != '\0') - sn = argv[0] + 2; - else { - argc--, argv++; - if (argc < 1) { - warnx( - "option requires an argument -- s"); - usage(); - } - sn = argv[0]; - } - if (strcmp(sn, "0") == 0) - numsig = 0; - else if ((numsig = signalnumber(sn)) == 0) { - if (sn != argv[0]) - goto trysignal; - nosig(sn); - } - argc--, argv++; - break; - - case '-': - if (argv[0][2] == '\0') { - /* process this one again later */ - break; - } - /* FALL THROUGH */ - case '\0': - usage(); - break; - - default: - trysignal: - sn = *argv + 1; - if (((numsig = signalnumber(sn)) == 0)) { - if (isdigit((unsigned char)*sn)) - numsig = signum(sn); - else - nosig(sn); - } - - if (numsig != 0 && signalnext(numsig) == -1) - nosig(sn); - argc--, argv++; - break; - } - } - - /* deal with the optional '--' end of options option */ - if (argc > 0 && strcmp(*argv, "--") == 0) - argc--, argv++; - - if (argc == 0) - usage(); - - for (errors = 0; argc; argc--, argv++) { -#ifdef SHELL - extern int getjobpgrp(const char *); - if (*argv[0] == '%') { - pid = getjobpgrp(*argv); - if (pid == 0) { - warnx("illegal job id: %s", *argv); - errors = 1; - continue; - } - } else -#endif - if ((pid = processnum(*argv)) == (pid_t)-1) { - errors = 1; - continue; - } - - if (kill(pid, numsig) == -1) { - warn("%s", *argv); - errors = 1; - } -#ifdef SHELL - /* - * Wakeup the process if it was suspended, so it can - * exit without an explicit 'fg'. - * (kernel handles this for SIGKILL) - */ - if (numsig == SIGTERM || numsig == SIGHUP) - kill(pid, SIGCONT); -#endif - } - - exit(errors); - /* NOTREACHED */ -} - -static int -signum(const char *sn) -{ - intmax_t n; - char *ep; - - n = strtoimax(sn, &ep, 10); - - /* check for correctly parsed number */ - if (*ep || n <= INT_MIN || n >= INT_MAX ) - errx(EXIT_FAILURE, "illegal signal number: %s", sn); - /* NOTREACHED */ - - return (int)n; -} - -static pid_t -processnum(const char *s) -{ - intmax_t n; - char *ep; - - n = strtoimax(s, &ep, 10); - - /* check for correctly parsed number */ - if (*ep || n == INTMAX_MIN || n == INTMAX_MAX || (pid_t)n != n || - n == -1) { - warnx("illegal process%s id: %s", (n < 0 ? " group" : ""), s); - n = -1; - } - - return (pid_t)n; -} - -static void -nosig(const char *name) -{ - - warnx("unknown signal %s; valid signals:", name); - printsignals(stderr, 0); - exit(1); - /* NOTREACHED */ -} - -#ifndef SHELL -/* - * Print the names of all the signals (neatly) to fp - * "len" gives the number of chars already printed to - * the current output line (in kill.c, always 0) - */ -void -printsignals(FILE *fp, int len) -{ - int sig; - int nl, pad; - const char *name; - int termwidth = 80; - - if ((name = getenv("COLUMNS")) != 0) - termwidth = atoi(name); - else if (isatty(fileno(fp))) { - struct winsize win; - - if (ioctl(fileno(fp), TIOCGWINSZ, &win) == 0 && win.ws_col > 0) - termwidth = win.ws_col; - } - - pad = (len | 7) + 1 - len; - - for (sig = 0; (sig = signalnext(sig)) != 0; ) { - name = signalname(sig); - if (name == NULL) - continue; - - nl = strlen(name); - - if (len > 0 && nl + len + pad >= termwidth) { - fprintf(fp, "\n"); - len = 0; - pad = 0; - } else if (pad > 0 && len != 0) - fprintf(fp, "%*s", pad, ""); - else - pad = 0; - - len += nl + pad; - pad = (nl | 7) + 1 - nl; - - fprintf(fp, "%s", name); - } - if (len != 0) - fprintf(fp, "\n"); -} -#endif - -static void -usage(void) -{ - const char *pn = getprogname(); - - fprintf(stderr, "usage: %s [-s signal_name] pid ...\n" - " %s -l [exit_status]\n" - " %s -signal_name pid ...\n" - " %s -signal_number pid ...\n", - pn, pn, pn, pn); - exit(1); - /* NOTREACHED */ -} diff --git a/bin/ps/extern.h b/bin/ps/extern.h deleted file mode 100644 index 6ec96ca..0000000 --- a/bin/ps/extern.h +++ /dev/null @@ -1,99 +0,0 @@ -/* $NetBSD: extern.h,v 1.39 2017/12/09 14:56:54 kamil Exp $ */ - -/*- - * Copyright (c) 1991, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. 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. - * - * @(#)extern.h 8.3 (Berkeley) 4/2/94 - */ - -/* - * We expect to be included by ps.h, which will already have - * defined the types we use. - */ - -extern double log_ccpu; -extern int eval, fscale, mempages, nlistread, maxslp, uspace; -extern int sumrusage, termwidth, totwidth; -extern int needenv, needcomm, commandonly; -extern uid_t myuid; -extern kvm_t *kd; -extern VAR var[]; -extern VARLIST displaylist; -extern VARLIST sortlist; - -void command(struct pinfo *, VARENT *, enum mode); -void cpuid(struct pinfo *, VARENT *, enum mode); -void cputime(struct pinfo *, VARENT *, enum mode); -void donlist(void); -void donlist_sysctl(void); -void fmt_puts(char *, int *); -void fmt_putc(int, int *); -void elapsed(struct pinfo *, VARENT *, enum mode); -double getpcpu(const struct kinfo_proc2 *); -double getpmem(const struct kinfo_proc2 *); -void gname(struct pinfo *, VARENT *, enum mode); -void groups(struct pinfo *, VARENT *, enum mode); -void groupnames(struct pinfo *, VARENT *, enum mode); -void lcputime(struct pinfo *, VARENT *, enum mode); -void logname(struct pinfo *, VARENT *, enum mode); -void longtname(struct pinfo *, VARENT *, enum mode); -void lname(struct pinfo *, VARENT *, enum mode); -void lstarted(struct pinfo *, VARENT *, enum mode); -void lstate(struct pinfo *, VARENT *, enum mode); -void maxrss(struct pinfo *, VARENT *, enum mode); -void nlisterr(struct nlist *); -void p_rssize(struct pinfo *, VARENT *, enum mode); -void pagein(struct pinfo *, VARENT *, enum mode); -void parsefmt(const char *); -void parsefmt_insert(const char *, VARENT **); -void parsesort(const char *); -VARENT * varlist_find(VARLIST *, const char *); -void emul(struct pinfo *, VARENT *, enum mode); -void pcpu(struct pinfo *, VARENT *, enum mode); -void pmem(struct pinfo *, VARENT *, enum mode); -void pnice(struct pinfo *, VARENT *, enum mode); -void pri(struct pinfo *, VARENT *, enum mode); -void printheader(void); -void putimeval(struct pinfo *, VARENT *, enum mode); -void pvar(struct pinfo *, VARENT *, enum mode); -void rgname(struct pinfo *, VARENT *, enum mode); -void rssize(struct pinfo *, VARENT *, enum mode); -void runame(struct pinfo *, VARENT *, enum mode); -void showkey(void); -void started(struct pinfo *, VARENT *, enum mode); -void state(struct pinfo *, VARENT *, enum mode); -void svgname(struct pinfo *, VARENT *, enum mode); -void svuname(struct pinfo *, VARENT *, enum mode); -void tdev(struct pinfo *, VARENT *, enum mode); -void tname(struct pinfo *, VARENT *, enum mode); -void tsize(struct pinfo *, VARENT *, enum mode); -void ucomm(struct pinfo *, VARENT *, enum mode); -void usrname(struct pinfo *, VARENT *, enum mode); -void uvar(struct pinfo *, VARENT *, enum mode); -void vsize(struct pinfo *, VARENT *, enum mode); -void wchan(struct pinfo *, VARENT *, enum mode); diff --git a/bin/ps/fmt.c b/bin/ps/fmt.c deleted file mode 100644 index 489a0ec..0000000 --- a/bin/ps/fmt.c +++ /dev/null @@ -1,60 +0,0 @@ -/* $NetBSD: fmt.c,v 1.21 2007/12/12 22:55:43 lukem Exp $ */ - -#include <sys/cdefs.h> -__RCSID("$NetBSD: fmt.c,v 1.21 2007/12/12 22:55:43 lukem Exp $"); - -#include <kvm.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <vis.h> -#include <sys/time.h> -#include <sys/resource.h> -#include "ps.h" - -void -fmt_puts(char *s, int *leftp) -{ - static char *v = 0; - static int maxlen = 0; - char *nv; - int len, nlen; - - if (*leftp == 0) - return; - len = strlen(s) * 4 + 1; - if (len > maxlen) { - if (maxlen == 0) - nlen = getpagesize(); - else - nlen = maxlen; - while (len > nlen) - nlen *= 2; - nv = realloc(v, nlen); - if (nv == 0) - return; - v = nv; - maxlen = nlen; - } - len = strvis(v, s, VIS_TAB | VIS_NL | VIS_CSTYLE); - if (*leftp != -1) { - if (len > *leftp) { - v[*leftp] = '\0'; - *leftp = 0; - } else - *leftp -= len; - } - (void)printf("%s", v); -} - -void -fmt_putc(int c, int *leftp) -{ - - if (*leftp == 0) - return; - if (*leftp != -1) - *leftp -= 1; - putchar(c); -} diff --git a/bin/ps/keyword.c b/bin/ps/keyword.c deleted file mode 100644 index f7504ca..0000000 --- a/bin/ps/keyword.c +++ /dev/null @@ -1,415 +0,0 @@ -/* $NetBSD: keyword.c,v 1.56 2018/04/11 18:52:05 christos Exp $ */ - -/*- - * Copyright (c) 1990, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. 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. - */ - -#include <sys/cdefs.h> -#ifndef lint -#if 0 -static char sccsid[] = "@(#)keyword.c 8.5 (Berkeley) 4/2/94"; -#else -__RCSID("$NetBSD: keyword.c,v 1.56 2018/04/11 18:52:05 christos Exp $"); -#endif -#endif /* not lint */ - -#include <sys/param.h> -#include <sys/time.h> -#include <sys/lwp.h> -#include <sys/proc.h> -#include <sys/resource.h> -#include <sys/sysctl.h> -#include <sys/ucred.h> - -#include <err.h> -#include <errno.h> -#include <kvm.h> -#include <stddef.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <signal.h> - -#include "ps.h" - -static VAR *findvar(const char *); -static int vcmp(const void *, const void *); - -#if 0 /* kernel doesn't calculate these */ - PUVAR("idrss", "IDRSS", 0, p_uru_idrss, UINT64, PRIu64), - PUVAR("isrss", "ISRSS", 0, p_uru_isrss, UINT64, PRId64), - PUVAR("ixrss", "IXRSS", 0, p_uru_ixrss, UINT64, PRId64), - PUVAR("maxrss", "MAXRSS", 0, p_uru_maxrss, UINT64, PRIu64), -#endif - -/* Compute offset in common structures. */ -#define POFF(x) offsetof(struct kinfo_proc2, x) -#define LOFF(x) offsetof(struct kinfo_lwp, x) - -#define UIDFMT "u" -#define UID(n1, n2, of) \ - { .name = n1, .header = n2, .flag = 0, .oproc = pvar, \ - .off = POFF(of), .type = UINT32, .fmt = UIDFMT } -#define GID(n1, n2, off) UID(n1, n2, off) - -#define PIDFMT "d" -#define PID(n1, n2, of) \ - { .name = n1, .header = n2, .flag = 0, .oproc = pvar, \ - .off = POFF(of), .type = INT32, .fmt = PIDFMT } - -#define LVAR(n1, n2, fl, of, ty, fm) \ - { .name = n1, .header = n2, .flag = (fl) | LWP, .oproc = pvar, \ - .off = LOFF(of), .type = ty, .fmt = fm } -#define PVAR(n1, n2, fl, of, ty, fm) \ - { .name = n1, .header = n2, .flag = (fl) | 0, .oproc = pvar, \ - .off = POFF(of), .type = ty, .fmt = fm } -#define PUVAR(n1, n2, fl, of, ty, fm) \ - { .name = n1, .header = n2, .flag = (fl) | UAREA, .oproc = pvar, \ - .off = POFF(of), .type = ty, .fmt = fm } -#define VAR3(n1, n2, fl) \ - { .name = n1, .header = n2, .flag = fl } -#define VAR4(n1, n2, fl, op) \ - { .name = n1, .header = n2, .flag = fl, .oproc = op, } -#define VAR6(n1, n2, fl, op, of, ty) \ - { .name = n1, .header = n2, .flag = fl, .oproc = op, \ - .off = of, .type = ty } - -/* NB: table must be sorted, in vi use: - * :/^VAR/,/end_sort/! sort -t\" +1 - * breaking long lines just makes the sort harder - * - * We support all the fields required by P1003.1-2004 (SUSv3), with - * the correct default headers, except for the "tty" field, where the - * standard says the header should be "TT", but we have "TTY". - */ -VAR var[] = { - VAR6("%cpu", "%CPU", 0, pcpu, 0, PCPU), - VAR6("%mem", "%MEM", 0, pmem, POFF(p_vm_rssize), INT32), - PVAR("acflag", "ACFLG", 0, p_acflag, USHORT, "x"), - VAR3("acflg", "acflag", ALIAS), - VAR3("args", "command", ALIAS), - VAR3("blocked", "sigmask", ALIAS), - VAR3("caught", "sigcatch", ALIAS), - VAR4("comm", "COMMAND", COMM|ARGV0|LJUST, command), - VAR4("command", "COMMAND", COMM|LJUST, command), - PVAR("cpu", "CPU", 0, p_estcpu, UINT, "u"), - VAR4("cpuid", "CPUID", LWP, cpuid), - VAR3("cputime", "time", ALIAS), - VAR6("ctime", "CTIME", 0, putimeval, POFF(p_uctime_sec), TIMEVAL), - GID("egid", "EGID", p_gid), - VAR4("egroup", "EGROUP", LJUST, gname), - VAR4("emul", "EMUL", LJUST, emul), - VAR6("etime", "ELAPSED", 0, elapsed, POFF(p_ustart_sec), TIMEVAL), - UID("euid", "EUID", p_uid), - VAR4("euser", "EUSER", LJUST, usrname), - PVAR("f", "F", 0, p_flag, INT, "x"), - VAR3("flags", "f", ALIAS), - GID("gid", "GID", p_gid), - VAR4("group", "GROUP", LJUST, gname), - VAR4("groupnames", "GROUPNAMES", LJUST, groupnames), - VAR4("groups", "GROUPS", LJUST, groups), - /* holdcnt: unused, left for compat. */ - LVAR("holdcnt", "HOLDCNT", 0, l_holdcnt, INT, "d"), - VAR3("ignored", "sigignore", ALIAS), - PUVAR("inblk", "INBLK", 0, p_uru_inblock, UINT64, PRIu64), - VAR3("inblock", "inblk", ALIAS), - PVAR("jobc", "JOBC", 0, p_jobc, SHORT, "d"), - PVAR("ktrace", "KTRACE", 0, p_traceflag, INT, "x"), -/*XXX*/ PVAR("ktracep", "KTRACEP", 0, p_tracep, KPTR, PRIx64), - LVAR("laddr", "LADDR", 0, l_laddr, KPTR, PRIx64), - LVAR("lid", "LID", 0, l_lid, INT32, "d"), - VAR4("lim", "LIM", 0, maxrss), - VAR4("lname", "LNAME", LJUST|LWP, lname), - VAR4("login", "LOGIN", LJUST, logname), - VAR3("logname", "login", ALIAS), - VAR6("lstart", "STARTED", LJUST, lstarted, POFF(p_ustart_sec), UINT32), - VAR4("lstate", "STAT", LJUST|LWP, lstate), - VAR6("ltime", "LTIME", LWP, lcputime, 0, CPUTIME), - PUVAR("majflt", "MAJFLT", 0, p_uru_majflt, UINT64, PRIu64), - PUVAR("minflt", "MINFLT", 0, p_uru_minflt, UINT64, PRIu64), - PUVAR("msgrcv", "MSGRCV", 0, p_uru_msgrcv, UINT64, PRIu64), - PUVAR("msgsnd", "MSGSND", 0, p_uru_msgsnd, UINT64, PRIu64), - VAR3("ni", "nice", ALIAS), - VAR6("nice", "NI", 0, pnice, POFF(p_nice), UCHAR), - PUVAR("nivcsw", "NIVCSW", 0, p_uru_nivcsw, UINT64, PRIu64), - PVAR("nlwp", "NLWP", 0, p_nlwps, UINT64, PRId64), - VAR3("nsignals", "nsigs", ALIAS), - PUVAR("nsigs", "NSIGS", 0, p_uru_nsignals, UINT64, PRIu64), - /* nswap: unused, left for compat. */ - PUVAR("nswap", "NSWAP", 0, p_uru_nswap, UINT64, PRIu64), - PUVAR("nvcsw", "NVCSW", 0, p_uru_nvcsw, UINT64, PRIu64), -/*XXX*/ LVAR("nwchan", "WCHAN", 0, l_wchan, KPTR, PRIx64), - PUVAR("oublk", "OUBLK", 0, p_uru_oublock, UINT64, PRIu64), - VAR3("oublock", "oublk", ALIAS), -/*XXX*/ PVAR("p_ru", "P_RU", 0, p_ru, KPTR, PRIx64), -/*XXX*/ PVAR("paddr", "PADDR", 0, p_paddr, KPTR, PRIx64), - PUVAR("pagein", "PAGEIN", 0, p_uru_majflt, UINT64, PRIu64), - VAR3("pcpu", "%cpu", ALIAS), - VAR3("pending", "sig", ALIAS), - PID("pgid", "PGID", p__pgid), - PID("pid", "PID", p_pid), - VAR3("pmem", "%mem", ALIAS), - PID("ppid", "PPID", p_ppid), - VAR4("pri", "PRI", LWP, pri), - LVAR("re", "RE", INF127, l_swtime, UINT, "u"), - GID("rgid", "RGID", p_rgid), - VAR4("rgroup", "RGROUP", LJUST, rgname), -/*XXX*/ LVAR("rlink", "RLINK", 0, l_back, KPTR, PRIx64), - PVAR("rlwp", "RLWP", 0, p_nrlwps, UINT64, PRId64), - VAR6("rss", "RSS", 0, p_rssize, POFF(p_vm_rssize), INT32), - VAR3("rssize", "rsz", ALIAS), - VAR6("rsz", "RSZ", 0, rssize, POFF(p_vm_rssize), INT32), - UID("ruid", "RUID", p_ruid), - VAR4("ruser", "RUSER", LJUST, runame), - PVAR("sess", "SESS", 0, p_sess, KPTR24, PRIx64), - PID("sid", "SID", p_sid), - PVAR("sig", "PENDING", 0, p_siglist, SIGLIST, "s"), - PVAR("sigcatch", "CAUGHT", 0, p_sigcatch, SIGLIST, "s"), - PVAR("sigignore", "IGNORED", 0, p_sigignore, SIGLIST, "s"), - PVAR("sigmask", "BLOCKED", 0, p_sigmask, SIGLIST, "s"), - LVAR("sl", "SL", INF127, l_slptime, UINT, "u"), - VAR6("start", "STARTED", 0, started, POFF(p_ustart_sec), UINT32), - VAR3("stat", "state", ALIAS), - VAR4("state", "STAT", LJUST, state), - VAR6("stime", "STIME", 0, putimeval, POFF(p_ustime_sec), TIMEVAL), - GID("svgid", "SVGID", p_svgid), - VAR4("svgroup", "SVGROUP", LJUST, svgname), - UID("svuid", "SVUID", p_svuid), - VAR4("svuser", "SVUSER", LJUST, svuname), - /* "tdev" is UINT32, but we do this for sorting purposes */ - VAR6("tdev", "TDEV", 0, tdev, POFF(p_tdev), INT32), - VAR6("time", "TIME", 0, cputime, 0, CPUTIME), - PID("tpgid", "TPGID", p_tpgid), - PVAR("tsess", "TSESS", 0, p_tsess, KPTR, PRIx64), - VAR6("tsiz", "TSIZ", 0, tsize, POFF(p_vm_tsize), INT32), - VAR6("tt", "TTY", LJUST, tname, POFF(p_tdev), INT32), - VAR6("tty", "TTY", LJUST, longtname, POFF(p_tdev), INT32), - LVAR("uaddr", "UADDR", 0, l_addr, KPTR, PRIx64), - VAR4("ucomm", "UCOMM", LJUST, ucomm), - UID("uid", "UID", p_uid), - LVAR("upr", "UPR", 0, l_usrpri, UCHAR, "u"), - VAR4("user", "USER", LJUST, usrname), - VAR3("usrpri", "upr", ALIAS), - VAR6("utime", "UTIME", 0, putimeval, POFF(p_uutime_sec), TIMEVAL), - VAR3("vsize", "vsz", ALIAS), - VAR6("vsz", "VSZ", 0, vsize, 0, VSIZE), - VAR4("wchan", "WCHAN", LJUST|LWP, wchan), - PVAR("xstat", "XSTAT", 0, p_xstat, USHORT, "x"), -/* "zzzz" end_sort */ - { .name = "" }, -}; - -void -showkey(void) -{ - VAR *v; - int i; - const char *p; - const char *sep; - - i = 0; - sep = ""; - for (v = var; *(p = v->name); ++v) { - int len = strlen(p); - if (termwidth && (i += len + 1) > termwidth) { - i = len; - sep = "\n"; - } - (void)printf("%s%s", sep, p); - sep = " "; - } - (void)printf("\n"); -} - -/* - * Parse the string pp, and insert or append entries to the list - * referenced by listptr. If pos in non-null and *pos is non-null, then - * *pos specifies where to insert (instead of appending). If pos is - * non-null, then a new value is returned through *pos referring to the - * last item inserted. - */ -static void -parsevarlist(const char *pp, struct varlist *listptr, struct varent **pos) -{ - char *p, *sp, *equalsp; - - /* dup to avoid zapping arguments. We will free sp later. */ - p = sp = strdup(pp); - - /* - * Everything after the first '=' is part of a custom header. - * Temporarily replace it with '\0' to simplify other code. - */ - equalsp = strchr(p, '='); - if (equalsp) - *equalsp = '\0'; - -#define FMTSEP " \t,\n" - while (p && *p) { - char *cp; - VAR *v; - struct varent *vent; - - /* - * skip separators before the first keyword, and - * look for the separator after the keyword. - */ - for (cp = p; *cp != '\0'; cp++) { - p = strpbrk(cp, FMTSEP); - if (p != cp) - break; - } - if (*cp == '\0') - break; - /* - * Now cp points to the start of a keyword, - * and p is NULL or points past the end of the keyword. - * - * Terminate the keyword with '\0', or reinstate the - * '=' that was removed earlier, if appropriate. - */ - if (p) { - *p = '\0'; - p++; - } else if (equalsp) { - *equalsp = '='; - } - - /* - * If findvar() likes the keyword or keyword=header, - * add it to our list. If findvar() doesn't like it, - * it will print a warning, so we ignore it. - */ - if ((v = findvar(cp)) == NULL) - continue; - if ((vent = malloc(sizeof(struct varent))) == NULL) - err(EXIT_FAILURE, NULL); - vent->var = v; - if (pos && *pos) - SIMPLEQ_INSERT_AFTER(listptr, *pos, vent, next); - else { - SIMPLEQ_INSERT_TAIL(listptr, vent, next); - } - if (pos) - *pos = vent; - } - free(sp); - if (SIMPLEQ_EMPTY(listptr)) - errx(EXIT_FAILURE, "no valid keywords"); -} - -void -parsefmt(const char *p) -{ - - parsevarlist(p, &displaylist, NULL); -} - -void -parsefmt_insert(const char *p, struct varent **pos) -{ - - parsevarlist(p, &displaylist, pos); -} - -void -parsesort(const char *p) -{ - - parsevarlist(p, &sortlist, NULL); -} - -/* Search through a list for an entry with a specified name. */ -struct varent * -varlist_find(struct varlist *list, const char *name) -{ - struct varent *vent; - - SIMPLEQ_FOREACH(vent, list, next) { - if (strcmp(vent->var->name, name) == 0) - break; - } - return vent; -} - -static VAR * -findvar(const char *p) -{ - VAR *v; - char *hp; - - hp = strchr(p, '='); - if (hp) - *hp++ = '\0'; - - v = bsearch(p, var, sizeof(var)/sizeof(VAR) - 1, sizeof(VAR), vcmp); - if (v && v->flag & ALIAS) - v = findvar(v->header); - if (!v) { - warnx("%s: keyword not found", p); - eval = 1; - return NULL; - } - - if (v && hp) { - /* - * Override the header. - * - * We need to copy the entry first, and override the - * header in the copy, because the same field might be - * used multiple times with different headers. We also - * need to strdup the header. - */ - struct var *newvar; - char *newheader; - - if ((newvar = malloc(sizeof(struct var))) == NULL) - err(EXIT_FAILURE, NULL); - if ((newheader = strdup(hp)) == NULL) - err(EXIT_FAILURE, NULL); - memcpy(newvar, v, sizeof(struct var)); - newvar->header = newheader; - - /* - * According to P1003.1-2004, if the header text is null, - * such as -o user=, the field width will be at least as - * wide as the default header text. - */ - if (*hp == '\0') - newvar->width = strlen(v->header); - - v = newvar; - } - return v; -} - -static int -vcmp(const void *a, const void *b) -{ - return strcmp(a, ((const VAR *)b)->name); -} diff --git a/bin/ps/nlist.c b/bin/ps/nlist.c deleted file mode 100644 index 42471ea..0000000 --- a/bin/ps/nlist.c +++ /dev/null @@ -1,234 +0,0 @@ -/* $NetBSD: nlist.c,v 1.27 2016/11/28 08:19:23 rin Exp $ */ - -/* - * Copyright (c) 2000 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Simon Burge. - * - * 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. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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. - */ - -/* - * Copyright (c) 1990, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. 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. - */ - -#include <sys/cdefs.h> -#ifndef lint -#if 0 -static char sccsid[] = "@(#)nlist.c 8.4 (Berkeley) 4/2/94"; -#else -__RCSID("$NetBSD: nlist.c,v 1.27 2016/11/28 08:19:23 rin Exp $"); -#endif -#endif /* not lint */ - -#include <sys/param.h> -#include <sys/time.h> -#include <sys/lwp.h> -#include <sys/proc.h> -#include <sys/resource.h> -#include <sys/sysctl.h> - -#include <err.h> -#include <errno.h> -#include <kvm.h> -#include <math.h> -#include <nlist.h> -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -#include "ps.h" - -struct nlist psnl[] = { - { .n_name = "_fscale" }, -#define X_FSCALE 0 - { .n_name = "_ccpu" }, -#define X_CCPU 1 - { .n_name = "_physmem" }, -#define X_PHYSMEM 2 - { .n_name = "_maxslp" }, -#define X_MAXSLP 3 - { .n_name = NULL } -}; - -double log_ccpu; /* log of kernel _ccpu variable */ -int nlistread; /* if nlist already read. */ -int mempages; /* number of pages of phys. memory */ -int fscale; /* kernel _fscale variable */ -int maxslp; /* kernel _maxslp variable */ -int uspace; /* kernel USPACE value */ - -/* XXX Hopefully reasonable default */ -#define MEMPAGES 0 -#ifndef FSCALE -#define FSCALE (1 << 8) -#endif -#define LOG_CCPU (-1.0 / 20.0) -#ifndef MAXSLP -#define MAXSLP 20 -#endif -#ifndef USPACE -#define USPACE (getpagesize()) -#endif - -#define kread(x, v) \ - kvm_read(kd, psnl[x].n_value, (char *)&v, sizeof v) != sizeof(v) - -void -donlist(void) -{ - fixpt_t xccpu; - - nlistread = 1; - - if (kvm_nlist(kd, psnl)) { - nlisterr(psnl); - eval = 1; - fscale = FSCALE; - mempages = MEMPAGES; - log_ccpu = LOG_CCPU; - maxslp = MAXSLP; - return; - } - - if (kread(X_FSCALE, fscale)) { - warnx("fscale: %s", kvm_geterr(kd)); - eval = 1; - fscale = FSCALE; - } - - if (kread(X_PHYSMEM, mempages)) { - warnx("avail_start: %s", kvm_geterr(kd)); - eval = 1; - mempages = MEMPAGES; - } - - if (kread(X_CCPU, xccpu)) { - warnx("ccpu: %s", kvm_geterr(kd)); - eval = 1; - log_ccpu = LOG_CCPU; - } else - log_ccpu = log((double)xccpu / fscale); - - if (kread(X_MAXSLP, maxslp)) { - warnx("maxslp: %s", kvm_geterr(kd)); - eval = 1; - maxslp = MAXSLP; - } -} - -void -donlist_sysctl(void) -{ - int mib[2]; - size_t size; - fixpt_t xccpu; - uint64_t memsize; - - nlistread = 1; - - mib[0] = CTL_KERN; - mib[1] = KERN_FSCALE; - size = sizeof(fscale); - if (sysctl(mib, 2, &fscale, &size, NULL, 0)) { - warn("fscale"); - eval = 1; - fscale = FSCALE; - } - - mib[0] = CTL_HW; - mib[1] = HW_PHYSMEM64; - size = sizeof(memsize); - if (sysctl(mib, 2, &memsize, &size, NULL, 0)) { - warn("avail_start"); - eval = 1; - mempages = MEMPAGES; - } else - mempages = memsize / getpagesize(); - - mib[0] = CTL_KERN; - mib[1] = KERN_CCPU; - size = sizeof(xccpu); - if (sysctl(mib, 2, &xccpu, &size, NULL, 0)) { - warn("ccpu"); - eval = 1; - log_ccpu = LOG_CCPU; - } else - log_ccpu = log((double)xccpu / fscale); - - mib[0] = CTL_VM; - mib[1] = VM_MAXSLP; - size = sizeof(maxslp); - if (sysctl(mib, 2, &maxslp, &size, NULL, 0)) { - warn("maxslp"); - eval = 1; - maxslp = MAXSLP; - } - - mib[0] = CTL_VM; - mib[1] = VM_USPACE; - size = sizeof(uspace); - if (sysctl(mib, 2, &uspace, &size, NULL, 0)) { - warn("uspace"); - eval = 1; - uspace = USPACE; - } -} - -void -nlisterr(struct nlist nl[]) -{ - int i; - - (void)fprintf(stderr, "ps: nlist: can't find following symbols:"); - for (i = 0; nl[i].n_name != NULL; i++) - if (nl[i].n_value == 0) - (void)fprintf(stderr, " %s", nl[i].n_name); - (void)fprintf(stderr, "\n"); -} diff --git a/bin/ps/print.c b/bin/ps/print.c deleted file mode 100644 index e725ef0..0000000 --- a/bin/ps/print.c +++ /dev/null @@ -1,1413 +0,0 @@ -/* $NetBSD: print.c,v 1.130 2018/09/19 15:20:39 maxv Exp $ */ - -/* - * Copyright (c) 2000, 2007 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Simon Burge. - * - * 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. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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. - */ - -/* - * Copyright (c) 1990, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. 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. - */ - -#include <sys/cdefs.h> -#ifndef lint -#if 0 -static char sccsid[] = "@(#)print.c 8.6 (Berkeley) 4/16/94"; -#else -__RCSID("$NetBSD: print.c,v 1.130 2018/09/19 15:20:39 maxv Exp $"); -#endif -#endif /* not lint */ - -#include <sys/param.h> -#include <sys/time.h> -#include <sys/resource.h> -#include <sys/lwp.h> -#include <sys/proc.h> -#include <sys/stat.h> -#include <sys/ucred.h> -#include <sys/sysctl.h> - -#include <err.h> -#include <grp.h> -#include <kvm.h> -#include <math.h> -#include <nlist.h> -#include <pwd.h> -#include <stddef.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> -#include <tzfile.h> -#include <unistd.h> - -#include "ps.h" - -static char *cmdpart(char *); -static void printval(void *, VAR *, enum mode); -static int titlecmp(char *, char **); - -static void doubleprintorsetwidth(VAR *, double, int, enum mode); -static void intprintorsetwidth(VAR *, int, enum mode); -static void strprintorsetwidth(VAR *, const char *, enum mode); - -static time_t now; - -#define min(a,b) ((a) <= (b) ? (a) : (b)) - -static int -iwidth(u_int64_t v) -{ - u_int64_t nlim, lim; - int w = 1; - - for (lim = 10; v >= lim; lim = nlim) { - nlim = lim * 10; - w++; - if (nlim < lim) - break; - } - return w; -} - -static char * -cmdpart(char *arg0) -{ - char *cp; - - return ((cp = strrchr(arg0, '/')) != NULL ? cp + 1 : arg0); -} - -void -printheader(void) -{ - int len; - VAR *v; - struct varent *vent; - static int firsttime = 1; - static int noheader = 0; - - /* - * If all the columns have user-specified null headers, - * don't print the blank header line at all. - */ - if (firsttime) { - SIMPLEQ_FOREACH(vent, &displaylist, next) { - if (vent->var->header[0]) - break; - } - if (vent == NULL) { - noheader = 1; - firsttime = 0; - } - - } - if (noheader) - return; - - SIMPLEQ_FOREACH(vent, &displaylist, next) { - v = vent->var; - if (firsttime) { - len = strlen(v->header); - if (len > v->width) - v->width = len; - totwidth += v->width + 1; /* +1 for space */ - } - if (v->flag & LJUST) { - if (SIMPLEQ_NEXT(vent, next) == NULL) /* last one */ - (void)printf("%s", v->header); - else - (void)printf("%-*s", v->width, - v->header); - } else - (void)printf("%*s", v->width, v->header); - if (SIMPLEQ_NEXT(vent, next) != NULL) - (void)putchar(' '); - } - (void)putchar('\n'); - if (firsttime) { - firsttime = 0; - totwidth--; /* take off last space */ - } -} - -/* - * Return 1 if the command name in the argument vector (u-area) does - * not match the command name (p_comm) - */ -static int -titlecmp(char *name, char **argv) -{ - char *title; - int namelen; - - - /* no argument vector == no match; system processes/threads do that */ - if (argv == 0 || argv[0] == 0) - return (1); - - title = cmdpart(argv[0]); - - /* the basename matches */ - if (!strcmp(name, title)) - return (0); - - /* handle login shells, by skipping the leading - */ - if (title[0] == '-' && !strcmp(name, title + 1)) - return (0); - - namelen = strlen(name); - - /* handle daemons that report activity as daemonname: activity */ - if (argv[1] == 0 && - !strncmp(name, title, namelen) && - title[namelen + 0] == ':' && - title[namelen + 1] == ' ') - return (0); - - return (1); -} - -static void -doubleprintorsetwidth(VAR *v, double val, int prec, enum mode mode) -{ - int fmtlen; - - if (mode == WIDTHMODE) { - if (val < 0.0 && val < v->longestnd) { - fmtlen = (int)log10(-val) + prec + 2; - v->longestnd = val; - if (fmtlen > v->width) - v->width = fmtlen; - } else if (val > 0.0 && val > v->longestpd) { - fmtlen = (int)log10(val) + prec + 1; - v->longestpd = val; - if (fmtlen > v->width) - v->width = fmtlen; - } - } else { - (void)printf("%*.*f", v->width, prec, val); - } -} - -static void -intprintorsetwidth(VAR *v, int val, enum mode mode) -{ - int fmtlen; - - if (mode == WIDTHMODE) { - if (val < 0 && val < v->longestn) { - v->longestn = val; - fmtlen = iwidth(-val) + 1; - if (fmtlen > v->width) - v->width = fmtlen; - } else if (val > 0 && val > v->longestp) { - v->longestp = val; - fmtlen = iwidth(val); - if (fmtlen > v->width) - v->width = fmtlen; - } - } else - (void)printf("%*d", v->width, val); -} - -static void -strprintorsetwidth(VAR *v, const char *str, enum mode mode) -{ - int len; - - if (mode == WIDTHMODE) { - len = strlen(str); - if (len > v->width) - v->width = len; - } else { - if (v->flag & LJUST) - (void)printf("%-*.*s", v->width, v->width, str); - else - (void)printf("%*.*s", v->width, v->width, str); - } -} - -void -command(struct pinfo *pi, VARENT *ve, enum mode mode) -{ - struct kinfo_proc2 *ki = pi->ki; - VAR *v; - int left; - char **argv, **p, *name; - - if (mode == WIDTHMODE) - return; - - v = ve->var; - if (SIMPLEQ_NEXT(ve, next) != NULL || termwidth != UNLIMITED) { - if (SIMPLEQ_NEXT(ve, next) == NULL) { - left = termwidth - (totwidth - v->width); - if (left < 1) /* already wrapped, just use std width */ - left = v->width; - } else - left = v->width; - } else - left = -1; - if (needenv && kd) { - argv = kvm_getenvv2(kd, ki, termwidth); - if ((p = argv) != NULL) { - while (*p) { - fmt_puts(*p, &left); - p++; - fmt_putc(' ', &left); - } - } - } - if (needcomm) { - if (pi->prefix) - (void)fmt_puts(pi->prefix, &left); - name = ki->p_comm; - if (!commandonly) { - argv = kvm_getargv2(kd, ki, termwidth); - if ((p = argv) != NULL) { - while (*p) { - fmt_puts(*p, &left); - p++; - fmt_putc(' ', &left); - if (v->flag & ARGV0) - break; - } - if (!(v->flag & ARGV0) && - titlecmp(name, argv)) { - /* - * append the real command name within - * parentheses, if the command name - * does not match the one in the - * argument vector - */ - fmt_putc('(', &left); - fmt_puts(name, &left); - fmt_putc(')', &left); - } - } else { - /* - * Commands that don't set an argv vector - * are printed with square brackets if they - * are system commands. Otherwise they are - * printed within parentheses. - */ - if (ki->p_flag & P_SYSTEM) { - fmt_putc('[', &left); - fmt_puts(name, &left); - fmt_putc(']', &left); - } else { - fmt_putc('(', &left); - fmt_puts(name, &left); - fmt_putc(')', &left); - } - } - } else { - fmt_puts(name, &left); - } - } - if (SIMPLEQ_NEXT(ve, next) != NULL && left > 0) - (void)printf("%*s", left, ""); -} - -void -groups(struct pinfo *pi, VARENT *ve, enum mode mode) -{ - struct kinfo_proc2 *ki = pi->ki; - VAR *v; - int left, i; - char buf[16], *p; - - if (mode == WIDTHMODE) - return; - - v = ve->var; - if (SIMPLEQ_NEXT(ve, next) != NULL || termwidth != UNLIMITED) { - if (SIMPLEQ_NEXT(ve, next) == NULL) { - left = termwidth - (totwidth - v->width); - if (left < 1) /* already wrapped, just use std width */ - left = v->width; - } else - left = v->width; - } else - left = -1; - - if (ki->p_ngroups == 0) - fmt_putc('-', &left); - - for (i = 0; i < ki->p_ngroups; i++) { - (void)snprintf(buf, sizeof(buf), "%d", ki->p_groups[i]); - if (i) - fmt_putc(' ', &left); - for (p = &buf[0]; *p; p++) - fmt_putc(*p, &left); - } - - if (SIMPLEQ_NEXT(ve, next) != NULL && left > 0) - (void)printf("%*s", left, ""); -} - -void -groupnames(struct pinfo *pi, VARENT *ve, enum mode mode) -{ - struct kinfo_proc2 *ki = pi->ki; - VAR *v; - int left, i; - const char *p; - - if (mode == WIDTHMODE) - return; - - v = ve->var; - if (SIMPLEQ_NEXT(ve, next) != NULL || termwidth != UNLIMITED) { - if (SIMPLEQ_NEXT(ve, next) == NULL) { - left = termwidth - (totwidth - v->width); - if (left < 1) /* already wrapped, just use std width */ - left = v->width; - } else - left = v->width; - } else - left = -1; - - if (ki->p_ngroups == 0) - fmt_putc('-', &left); - - for (i = 0; i < ki->p_ngroups; i++) { - if (i) - fmt_putc(' ', &left); - for (p = group_from_gid(ki->p_groups[i], 0); *p; p++) - fmt_putc(*p, &left); - } - - if (SIMPLEQ_NEXT(ve, next) != NULL && left > 0) - (void)printf("%*s", left, ""); -} - -void -ucomm(struct pinfo *pi, VARENT *ve, enum mode mode) -{ - struct kinfo_proc2 *k = pi->ki; - char buf[MAXPATHLEN], *p; - VAR *v; - - v = ve->var; - if (pi->prefix) - snprintf(p = buf, sizeof(buf), "%s%s", pi->prefix, k->p_comm); - else - p = k->p_comm; - strprintorsetwidth(v, p, mode); -} - -void -emul(struct pinfo *pi, VARENT *ve, enum mode mode) -{ - struct kinfo_proc2 *k = pi->ki; - VAR *v; - - v = ve->var; - strprintorsetwidth(v, k->p_ename, mode); -} - -void -logname(struct pinfo *pi, VARENT *ve, enum mode mode) -{ - struct kinfo_proc2 *k = pi->ki; - VAR *v; - - v = ve->var; - strprintorsetwidth(v, k->p_login, mode); -} - -void -state(struct pinfo *pi, VARENT *ve, enum mode mode) -{ - struct kinfo_proc2 *k = pi->ki; - int flag, is_zombie; - char *cp; - VAR *v; - char buf[16]; - - is_zombie = 0; - v = ve->var; - flag = k->p_flag; - cp = buf; - - /* - * NOTE: There are historical letters, which are no longer used: - * - * - W: indicated that process is swapped out. - * - L: indicated non-zero l_holdcnt (i.e. that process was - * prevented from swapping-out. - * - * These letters should not be used for new states to avoid - * conflicts with old applications which might depend on them. - */ - switch (k->p_stat) { - - case LSSTOP: - *cp = 'T'; - break; - - case LSSLEEP: - if (flag & L_SINTR) /* interruptable (long) */ - *cp = (int)k->p_slptime >= maxslp ? 'I' : 'S'; - else - *cp = 'D'; - break; - - case LSRUN: - case LSIDL: - *cp = 'R'; - break; - - case LSONPROC: - *cp = 'O'; - break; - - case LSZOMB: - *cp = 'Z'; - is_zombie = 1; - break; - - case LSSUSPENDED: - *cp = 'U'; - break; - - default: - *cp = '?'; - } - cp++; - if (k->p_nice < NZERO) - *cp++ = '<'; - else if (k->p_nice > NZERO) - *cp++ = 'N'; - if (flag & P_TRACED) - *cp++ = 'X'; - if (flag & P_WEXIT && !is_zombie) - *cp++ = 'E'; - if (flag & P_PPWAIT) - *cp++ = 'V'; - if (flag & P_SYSTEM) - *cp++ = 'K'; - if (k->p_eflag & EPROC_SLEADER) - *cp++ = 's'; - if (flag & P_SA) - *cp++ = 'a'; - else if (k->p_nlwps > 1) - *cp++ = 'l'; - if ((flag & P_CONTROLT) && k->p__pgid == k->p_tpgid) - *cp++ = '+'; - *cp = '\0'; - strprintorsetwidth(v, buf, mode); -} - -void -lstate(struct pinfo *pi, VARENT *ve, enum mode mode) -{ - struct kinfo_lwp *k = pi->li; - int flag; - char *cp; - VAR *v; - char buf[16]; - - v = ve->var; - flag = k->l_flag; - cp = buf; - - switch (k->l_stat) { - - case LSSTOP: - *cp = 'T'; - break; - - case LSSLEEP: - if (flag & L_SINTR) /* interruptible (long) */ - *cp = (int)k->l_slptime >= maxslp ? 'I' : 'S'; - else - *cp = 'D'; - break; - - case LSRUN: - case LSIDL: - *cp = 'R'; - break; - - case LSONPROC: - *cp = 'O'; - break; - - case LSZOMB: - case LSDEAD: - *cp = 'Z'; - break; - - case LSSUSPENDED: - *cp = 'U'; - break; - - default: - *cp = '?'; - } - cp++; - if (flag & L_SYSTEM) - *cp++ = 'K'; - if (flag & L_SA) - *cp++ = 'a'; - if (flag & L_DETACHED) - *cp++ = '-'; - *cp = '\0'; - strprintorsetwidth(v, buf, mode); -} - -void -pnice(struct pinfo *pi, VARENT *ve, enum mode mode) -{ - struct kinfo_proc2 *k = pi->ki; - VAR *v; - - v = ve->var; - intprintorsetwidth(v, k->p_nice - NZERO, mode); -} - -void -pri(struct pinfo *pi, VARENT *ve, enum mode mode) -{ - struct kinfo_lwp *l = pi->li; - VAR *v; - - v = ve->var; - intprintorsetwidth(v, l->l_priority, mode); -} - -void -usrname(struct pinfo *pi, VARENT *ve, enum mode mode) -{ - struct kinfo_proc2 *k = pi->ki; - VAR *v; - - v = ve->var; - strprintorsetwidth(v, user_from_uid(k->p_uid, 0), mode); -} - -void -runame(struct pinfo *pi, VARENT *ve, enum mode mode) -{ - struct kinfo_proc2 *k = pi->ki; - VAR *v; - - v = ve->var; - strprintorsetwidth(v, user_from_uid(k->p_ruid, 0), mode); -} - -void -svuname(struct pinfo *pi, VARENT *ve, enum mode mode) -{ - struct kinfo_proc2 *k = pi->ki; - VAR *v; - - v = ve->var; - strprintorsetwidth(v, user_from_uid(k->p_svuid, 0), mode); -} - -void -gname(struct pinfo *pi, VARENT *ve, enum mode mode) -{ - struct kinfo_proc2 *k = pi->ki; - VAR *v; - - v = ve->var; - strprintorsetwidth(v, group_from_gid(k->p_gid, 0), mode); -} - -void -rgname(struct pinfo *pi, VARENT *ve, enum mode mode) -{ - struct kinfo_proc2 *k = pi->ki; - VAR *v; - - v = ve->var; - strprintorsetwidth(v, group_from_gid(k->p_rgid, 0), mode); -} - -void -svgname(struct pinfo *pi, VARENT *ve, enum mode mode) -{ - struct kinfo_proc2 *k = pi->ki; - VAR *v; - - v = ve->var; - strprintorsetwidth(v, group_from_gid(k->p_svgid, 0), mode); -} - -void -tdev(struct pinfo *pi, VARENT *ve, enum mode mode) -{ - struct kinfo_proc2 *k = pi->ki; - VAR *v; - dev_t dev; - char buff[16]; - - v = ve->var; - dev = k->p_tdev; - if (dev == NODEV) { - if (mode == PRINTMODE) - (void)printf("%*s", v->width, "?"); - else - if (v->width < 2) - v->width = 2; - } else { - (void)snprintf(buff, sizeof(buff), - "%lld/%lld", (long long)major(dev), (long long)minor(dev)); - strprintorsetwidth(v, buff, mode); - } -} - -void -tname(struct pinfo *pi, VARENT *ve, enum mode mode) -{ - struct kinfo_proc2 *k = pi->ki; - VAR *v; - dev_t dev; - const char *ttname; - int noctty; - - v = ve->var; - dev = k->p_tdev; - if (dev == NODEV || (ttname = devname(dev, S_IFCHR)) == NULL) { - if (mode == PRINTMODE) - (void)printf("%-*s", v->width, "?"); - else - if (v->width < 2) - v->width = 2; - } else { - noctty = !(k->p_eflag & EPROC_CTTY) ? 1 : 0; - if (mode == WIDTHMODE) { - int fmtlen; - - fmtlen = strlen(ttname) + noctty; - if (v->width < fmtlen) - v->width = fmtlen; - } else { - if (noctty) - (void)printf("%-*s-", v->width - 1, ttname); - else - (void)printf("%-*s", v->width, ttname); - } - } -} - -void -longtname(struct pinfo *pi, VARENT *ve, enum mode mode) -{ - struct kinfo_proc2 *k = pi->ki; - VAR *v; - dev_t dev; - const char *ttname; - - v = ve->var; - dev = k->p_tdev; - if (dev == NODEV || (ttname = devname(dev, S_IFCHR)) == NULL) { - if (mode == PRINTMODE) - (void)printf("%-*s", v->width, "?"); - else - if (v->width < 2) - v->width = 2; - } else { - strprintorsetwidth(v, ttname, mode); - } -} - -void -started(struct pinfo *pi, VARENT *ve, enum mode mode) -{ - struct kinfo_proc2 *k = pi->ki; - VAR *v; - time_t startt; - struct tm *tp; - char buf[100], *cp; - - v = ve->var; - if (!k->p_uvalid) { - if (mode == PRINTMODE) - (void)printf("%*s", v->width, "-"); - return; - } - - startt = k->p_ustart_sec; - tp = localtime(&startt); - if (now == 0) - (void)time(&now); - if (now - k->p_ustart_sec < SECSPERDAY) - /* I *hate* SCCS... */ - (void)strftime(buf, sizeof(buf) - 1, "%l:%" "M%p", tp); - else if (now - k->p_ustart_sec < DAYSPERWEEK * SECSPERDAY) - /* I *hate* SCCS... */ - (void)strftime(buf, sizeof(buf) - 1, "%a%" "I%p", tp); - else - (void)strftime(buf, sizeof(buf) - 1, "%e%b%y", tp); - /* %e and %l can start with a space. */ - cp = buf; - if (*cp == ' ') - cp++; - strprintorsetwidth(v, cp, mode); -} - -void -lstarted(struct pinfo *pi, VARENT *ve, enum mode mode) -{ - struct kinfo_proc2 *k = pi->ki; - VAR *v; - time_t startt; - char buf[100]; - - v = ve->var; - if (!k->p_uvalid) { - /* - * Minimum width is less than header - we don't - * need to check it every time. - */ - if (mode == PRINTMODE) - (void)printf("%*s", v->width, "-"); - return; - } - startt = k->p_ustart_sec; - - /* assume all times are the same length */ - if (mode != WIDTHMODE || v->width == 0) { - (void)strftime(buf, sizeof(buf) -1, "%c", - localtime(&startt)); - strprintorsetwidth(v, buf, mode); - } -} - -void -elapsed(struct pinfo *pi, VARENT *ve, enum mode mode) -{ - struct kinfo_proc2 *k = pi->ki; - VAR *v; - int32_t origseconds, secs, mins, hours, days; - int fmtlen, printed_something; - - v = ve->var; - if (k->p_uvalid == 0) { - origseconds = 0; - } else { - if (now == 0) - (void)time(&now); - origseconds = now - k->p_ustart_sec; - if (origseconds < 0) { - /* - * Don't try to be fancy if the machine's - * clock has been rewound to before the - * process "started". - */ - origseconds = 0; - } - } - - secs = origseconds; - mins = secs / SECSPERMIN; - secs %= SECSPERMIN; - hours = mins / MINSPERHOUR; - mins %= MINSPERHOUR; - days = hours / HOURSPERDAY; - hours %= HOURSPERDAY; - - if (mode == WIDTHMODE) { - if (origseconds == 0) - /* non-zero so fmtlen is calculated at least once */ - origseconds = 1; - - if (origseconds > v->longestp) { - v->longestp = origseconds; - - if (days > 0) { - /* +9 for "-hh:mm:ss" */ - fmtlen = iwidth(days) + 9; - } else if (hours > 0) { - /* +6 for "mm:ss" */ - fmtlen = iwidth(hours) + 6; - } else { - /* +3 for ":ss" */ - fmtlen = iwidth(mins) + 3; - } - - if (fmtlen > v->width) - v->width = fmtlen; - } - } else { - printed_something = 0; - fmtlen = v->width; - - if (days > 0) { - (void)printf("%*d", fmtlen - 9, days); - printed_something = 1; - } else if (fmtlen > 9) { - (void)printf("%*s", fmtlen - 9, ""); - } - if (fmtlen > 9) - fmtlen = 9; - - if (printed_something) { - (void)printf("-%.*d", fmtlen - 7, hours); - printed_something = 1; - } else if (hours > 0) { - (void)printf("%*d", fmtlen - 6, hours); - printed_something = 1; - } else if (fmtlen > 6) { - (void)printf("%*s", fmtlen - 6, ""); - } - if (fmtlen > 6) - fmtlen = 6; - - /* Don't need to set fmtlen or printed_something any more... */ - if (printed_something) { - (void)printf(":%.*d", fmtlen - 4, mins); - } else if (mins > 0) { - (void)printf("%*d", fmtlen - 3, mins); - } else if (fmtlen > 3) { - (void)printf("%*s", fmtlen - 3, "0"); - } - - (void)printf(":%.2d", secs); - } -} - -void -wchan(struct pinfo *pi, VARENT *ve, enum mode mode) -{ - struct kinfo_lwp *l = pi->li; - VAR *v; - - v = ve->var; - if (l->l_wmesg[0]) { - strprintorsetwidth(v, l->l_wmesg, mode); - v->width = min(v->width, KI_WMESGLEN); - } else { - if (mode == PRINTMODE) - (void)printf("%-*s", v->width, "-"); - } -} - -#define pgtok(a) (((a)*(size_t)getpagesize())/1024) - -void -vsize(struct pinfo *pi, VARENT *ve, enum mode mode) -{ - struct kinfo_proc2 *k = pi->ki; - VAR *v; - - v = ve->var; - intprintorsetwidth(v, pgtok(k->p_vm_msize), mode); -} - -void -rssize(struct pinfo *pi, VARENT *ve, enum mode mode) -{ - struct kinfo_proc2 *k = pi->ki; - VAR *v; - - v = ve->var; - /* XXX don't have info about shared */ - intprintorsetwidth(v, pgtok(k->p_vm_rssize), mode); -} - -void -p_rssize(struct pinfo *pi, VARENT *ve, enum mode mode) /* doesn't account for text */ -{ - struct kinfo_proc2 *k = pi->ki; - VAR *v; - - v = ve->var; - intprintorsetwidth(v, pgtok(k->p_vm_rssize), mode); -} - -void -cpuid(struct pinfo *pi, VARENT *ve, enum mode mode) -{ - struct kinfo_lwp *l = pi->li; - VAR *v; - - v = ve->var; - intprintorsetwidth(v, l->l_cpuid, mode); -} - -static void -cputime1(int32_t secs, int32_t psecs, VAR *v, enum mode mode) -{ - int fmtlen; - - /* - * round and scale to 100's - */ - psecs = (psecs + 5000) / 10000; - secs += psecs / 100; - psecs = psecs % 100; - - if (mode == WIDTHMODE) { - /* - * Ugg, this is the only field where a value of 0 is longer - * than the column title. - * Use SECSPERMIN, because secs is divided by that when - * passed to iwidth(). - */ - if (secs == 0) - secs = SECSPERMIN; - - if (secs > v->longestp) { - v->longestp = secs; - /* "+6" for the ":%02ld.%02ld" in the printf() below */ - fmtlen = iwidth(secs / SECSPERMIN) + 6; - if (fmtlen > v->width) - v->width = fmtlen; - } - } else { - (void)printf("%*ld:%02ld.%02ld", v->width - 6, - (long)(secs / SECSPERMIN), (long)(secs % SECSPERMIN), - (long)psecs); - } -} - -void -cputime(struct pinfo *pi, VARENT *ve, enum mode mode) -{ - struct kinfo_proc2 *k = pi->ki; - VAR *v; - int32_t secs; - int32_t psecs; /* "parts" of a second. first micro, then centi */ - - v = ve->var; - - /* - * This counts time spent handling interrupts. We could - * fix this, but it is not 100% trivial (and interrupt - * time fractions only work on the sparc anyway). XXX - */ - secs = k->p_rtime_sec; - psecs = k->p_rtime_usec; - if (sumrusage) { - secs += k->p_uctime_sec; - psecs += k->p_uctime_usec; - } - - cputime1(secs, psecs, v, mode); -} - -void -lcputime(struct pinfo *pi, VARENT *ve, enum mode mode) -{ - struct kinfo_lwp *l = pi->li; - VAR *v; - int32_t secs; - int32_t psecs; /* "parts" of a second. first micro, then centi */ - - v = ve->var; - - secs = l->l_rtime_sec; - psecs = l->l_rtime_usec; - - cputime1(secs, psecs, v, mode); -} - -void -pcpu(struct pinfo *pi, VARENT *ve, enum mode mode) -{ - VAR *v; - double dbl; - - v = ve->var; - dbl = pi->pcpu; - doubleprintorsetwidth(v, dbl, (dbl >= 99.95) ? 0 : 1, mode); -} - -double -getpmem(const struct kinfo_proc2 *k) -{ - double fracmem; - int szptudot; - - if (!nlistread) - donlist(); - - /* XXX want pmap ptpages, segtab, etc. (per architecture) */ - szptudot = uspace/getpagesize(); - /* XXX don't have info about shared */ - fracmem = ((float)k->p_vm_rssize + szptudot)/mempages; - return (100.0 * fracmem); -} - -void -pmem(struct pinfo *pi, VARENT *ve, enum mode mode) -{ - struct kinfo_proc2 *k = pi->ki; - VAR *v; - - v = ve->var; - doubleprintorsetwidth(v, getpmem(k), 1, mode); -} - -void -pagein(struct pinfo *pi, VARENT *ve, enum mode mode) -{ - struct kinfo_proc2 *k = pi->ki; - VAR *v; - - v = ve->var; - intprintorsetwidth(v, k->p_uvalid ? k->p_uru_majflt : 0, mode); -} - -void -maxrss(struct pinfo *pi, VARENT *ve, enum mode mode) -{ - VAR *v; - - v = ve->var; - /* No need to check width! */ - if (mode == PRINTMODE) - (void)printf("%*s", v->width, "-"); -} - -void -tsize(struct pinfo *pi, VARENT *ve, enum mode mode) -{ - struct kinfo_proc2 *k = pi->ki; - VAR *v; - - v = ve->var; - intprintorsetwidth(v, pgtok(k->p_vm_tsize), mode); -} - -/* - * Generic output routines. Print fields from various prototype - * structures. - */ -static void -printval(void *bp, VAR *v, enum mode mode) -{ - static char ofmt[32] = "%"; - int width, vok, fmtlen; - const char *fcp; - char *cp; - int64_t val; - u_int64_t uval; - - val = 0; /* XXXGCC -Wuninitialized [hpcarm] */ - uval = 0; /* XXXGCC -Wuninitialized [hpcarm] */ - - /* - * Note that the "INF127" check is nonsensical for types - * that are or can be signed. - */ -#define GET(type) (*(type *)bp) -#define CHK_INF127(n) (((n) > 127) && (v->flag & INF127) ? 127 : (n)) - -#define VSIGN 1 -#define VUNSIGN 2 -#define VPTR 3 - - if (mode == WIDTHMODE) { - vok = 0; - switch (v->type) { - case CHAR: - val = GET(char); - vok = VSIGN; - break; - case UCHAR: - uval = CHK_INF127(GET(u_char)); - vok = VUNSIGN; - break; - case SHORT: - val = GET(short); - vok = VSIGN; - break; - case USHORT: - uval = CHK_INF127(GET(u_short)); - vok = VUNSIGN; - break; - case INT32: - val = GET(int32_t); - vok = VSIGN; - break; - case INT: - val = GET(int); - vok = VSIGN; - break; - case UINT: - case UINT32: - uval = CHK_INF127(GET(u_int)); - vok = VUNSIGN; - break; - case LONG: - val = GET(long); - vok = VSIGN; - break; - case ULONG: - uval = CHK_INF127(GET(u_long)); - vok = VUNSIGN; - break; - case KPTR: - uval = GET(u_int64_t); - vok = VPTR; - break; - case KPTR24: - uval = GET(u_int64_t); - uval &= 0xffffff; - vok = VPTR; - break; - case INT64: - val = GET(int64_t); - vok = VSIGN; - break; - case UINT64: - uval = CHK_INF127(GET(u_int64_t)); - vok = VUNSIGN; - break; - - case SIGLIST: - default: - /* nothing... */; - } - switch (vok) { - case VSIGN: - if (val < 0 && val < v->longestn) { - v->longestn = val; - fmtlen = iwidth(-val) + 1; - if (fmtlen > v->width) - v->width = fmtlen; - } else if (val > 0 && val > v->longestp) { - v->longestp = val; - fmtlen = iwidth(val); - if (fmtlen > v->width) - v->width = fmtlen; - } - return; - case VUNSIGN: - if (uval > v->longestu) { - v->longestu = uval; - v->width = iwidth(uval); - } - return; - case VPTR: - fmtlen = 0; - while (uval > 0) { - uval >>= 4; - fmtlen++; - } - if (fmtlen > v->width) - v->width = fmtlen; - return; - } - } - - width = v->width; - cp = ofmt + 1; - fcp = v->fmt; - if (v->flag & LJUST) - *cp++ = '-'; - *cp++ = '*'; - while ((*cp++ = *fcp++) != '\0') - continue; - - switch (v->type) { - case CHAR: - (void)printf(ofmt, width, GET(char)); - return; - case UCHAR: - (void)printf(ofmt, width, CHK_INF127(GET(u_char))); - return; - case SHORT: - (void)printf(ofmt, width, GET(short)); - return; - case USHORT: - (void)printf(ofmt, width, CHK_INF127(GET(u_short))); - return; - case INT: - (void)printf(ofmt, width, GET(int)); - return; - case UINT: - (void)printf(ofmt, width, CHK_INF127(GET(u_int))); - return; - case LONG: - (void)printf(ofmt, width, GET(long)); - return; - case ULONG: - (void)printf(ofmt, width, CHK_INF127(GET(u_long))); - return; - case KPTR: - (void)printf(ofmt, width, GET(u_int64_t)); - return; - case KPTR24: - (void)printf(ofmt, width, GET(u_int64_t) & 0xffffff); - return; - case INT32: - (void)printf(ofmt, width, GET(int32_t)); - return; - case UINT32: - (void)printf(ofmt, width, CHK_INF127(GET(u_int32_t))); - return; - case SIGLIST: - { - sigset_t *s = (sigset_t *)(void *)bp; - size_t i; -#define SIGSETSIZE (sizeof(s->__bits) / sizeof(s->__bits[0])) - char buf[SIGSETSIZE * 8 + 1]; - - for (i = 0; i < SIGSETSIZE; i++) - (void)snprintf(&buf[i * 8], 9, "%.8x", - s->__bits[(SIGSETSIZE - 1) - i]); - - /* Skip leading zeroes */ - for (i = 0; buf[i] == '0'; i++) - continue; - - if (buf[i] == '\0') - i--; - strprintorsetwidth(v, buf + i, mode); -#undef SIGSETSIZE - } - return; - case INT64: - (void)printf(ofmt, width, GET(int64_t)); - return; - case UINT64: - (void)printf(ofmt, width, CHK_INF127(GET(u_int64_t))); - return; - default: - errx(EXIT_FAILURE, "unknown type %d", v->type); - } -#undef GET -#undef CHK_INF127 -} - -void -pvar(struct pinfo *pi, VARENT *ve, enum mode mode) -{ - VAR *v = ve->var; - char *b = (v->flag & LWP) ? (char *)pi->li : (char *)pi->ki; - - if ((v->flag & UAREA) && !pi->ki->p_uvalid) { - if (mode == PRINTMODE) - (void)printf("%*s", v->width, "-"); - return; - } - - (void)printval(b + v->off, v, mode); -} - -void -putimeval(struct pinfo *pi, VARENT *ve, enum mode mode) -{ - VAR *v = ve->var; - struct kinfo_proc2 *k = pi->ki; - char *b = (v->flag & LWP) ? (char *)pi->li : (char *)pi->ki; - ulong secs = *(uint32_t *)(b + v->off); - ulong usec = *(uint32_t *)(b + v->off + sizeof (uint32_t)); - int fmtlen; - - if (!k->p_uvalid) { - if (mode == PRINTMODE) - (void)printf("%*s", v->width, "-"); - return; - } - - if (mode == WIDTHMODE) { - if (secs == 0) - /* non-zero so fmtlen is calculated at least once */ - secs = 1; - if (secs > v->longestu) { - v->longestu = secs; - if (secs <= 999) - /* sss.ssssss */ - fmtlen = iwidth(secs) + 6 + 1; - else - /* hh:mm:ss.ss */ - fmtlen = iwidth((secs + 1) / SECSPERHOUR) - + 2 + 1 + 2 + 1 + 2 + 1; - if (fmtlen > v->width) - v->width = fmtlen; - } - return; - } - - if (secs < 999) - (void)printf( "%*lu.%.6lu", v->width - 6 - 1, secs, usec); - else { - uint h, m; - usec += 5000; - if (usec >= 1000000) { - usec -= 1000000; - secs++; - } - m = secs / SECSPERMIN; - secs -= m * SECSPERMIN; - h = m / MINSPERHOUR; - m -= h * MINSPERHOUR; - (void)printf( "%*u:%.2u:%.2lu.%.2lu", v->width - 9, h, m, secs, - usec / 10000u ); - } -} - -void -lname(struct pinfo *pi, VARENT *ve, enum mode mode) -{ - struct kinfo_lwp *l = pi->li; - VAR *v; - - v = ve->var; - if (l->l_name[0] != '\0') { - strprintorsetwidth(v, l->l_name, mode); - v->width = min(v->width, KI_LNAMELEN); - } else { - if (mode == PRINTMODE) - (void)printf("%-*s", v->width, "-"); - } -} diff --git a/bin/ps/ps.1 b/bin/ps/ps.1 deleted file mode 100644 index 635ec3b..0000000 --- a/bin/ps/ps.1 +++ /dev/null @@ -1,706 +0,0 @@ -.\" $NetBSD: ps.1,v 1.109 2017/08/28 05:57:37 wiz Exp $ -.\" -.\" Copyright (c) 1980, 1990, 1991, 1993, 1994 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. 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. -.\" -.\" @(#)ps.1 8.3 (Berkeley) 4/18/94 -.\" -.Dd August 28, 2017 -.Dt PS 1 -.Os -.Sh NAME -.Nm ps -.Nd process status -.Sh SYNOPSIS -.Nm -.Op Fl AaCcdehjlmrSsTuvwx -.Op Fl k Ar key -.Op Fl M Ar core -.Op Fl N Ar system -.Op Fl O Ar fmt -.Op Fl o Ar fmt -.Op Fl p Ar pid -.Op Fl t Ar tty -.Op Fl U Ar user -.Op Fl W Ar swap -.Nm -.Fl L -.Sh DESCRIPTION -.Nm -displays a header line followed by lines containing information about -running processes. -By default, the display includes only processes that have -controlling terminals and are owned by your uid. -The default sort order of controlling terminal and -(among processes with the same controlling terminal) process ID -may be changed using the -.Fl k , Fl m , -or -.Fl r -options. -.Pp -The information displayed for each process -is selected based on a set of keywords (see the -.Fl L , -.Fl O , -and -.Fl o -options). -The default output format includes, for each process, the process' ID, -controlling terminal, CPU time (including both user and system time), -state, and associated command. -.Pp -The options are as follows: -.Bl -tag -width XNXsystemXX -.It Fl A -Display information about all processes. -This is equivalent to -.Fl a Fl x . -.It Fl a -Display information about other users' processes as well as your own. -Note that this does not display information about processes -without controlling terminals. -.It Fl C -Change the way the CPU percentage is calculated by using a -.Dq raw -CPU calculation that ignores -.Dq resident -time (this normally has no effect). -.It Fl c -Do not display full command with arguments, but only the -executable name. -This may be somewhat confusing; for example, all -.Xr sh 1 -scripts will show as -.Dq sh . -.It Fl d -Arrange processes into descendancy order and prefix each command with -indentation text showing sibling and parent/child relationships. -If either of the -.Fl m -and -.Fl r -options are also used, they control how sibling processes are sorted -relative to each other. -.It Fl e -Display the environment as well. -The environment for other -users' processes can only be displayed by the super-user. -.It Fl h -Repeat the information header as often as necessary to guarantee one -header per page of information. -.It Fl j -Print information associated with the following keywords: -.Ar user , pid , ppid , pgid , sess , jobc , state , tt , time , -and -.Ar command . -.It Fl k Ar key -Sort the output using the space or comma separated list of keywords. -Multiple sort keys may be specified, using any of the -.Fl k , Fl m , -or -.Fl r -options. -The default sort order is equivalent to -.Fl k Ar tdev,pid . -.It Fl L -List the set of available keywords. -.It Fl l -Display information associated with the following keywords: -.Ar uid , pid , ppid , cpu , pri , nice , vsz , rss , wchan , state , -.Ar tt , time , -and -.Ar command . -.It Fl M Ar core -Extract values from the specified core file instead of the running system. -.It Fl m -Sort by memory usage. -This is equivalent to -.Fl k Ar vsz . -.It Fl N Ar system -Extract the name list from the specified system instead of the default, -.Dq Pa /netbsd . -Ignored unless -.Fl M -is specified. -.It Fl O Ar fmt -Display information associated with the space or comma separated list -of keywords specified. -The -.Fl O -option does not suppress the default display; -it inserts additional keywords just after the -.Ar pid -keyword in the default display, or after the -.Ar pid -keyword (if any) in a non-default display specified before the -first use of the -.Fl O -flag. -Keywords inserted by multiple -.Fl O -options will be adjacent. -.Pp -An equals sign -.Pq Dq \&= -followed by a customised header string may be appended to a keyword, -as described in more detail under the -.Fl o -option. -.It Fl o Ar fmt -Display information associated with the space or comma separated list -of keywords specified. -Use of the -.Fl o -option suppresses the set of keywords that would be displayed by default, -or appends to the set of keywords specified by other options. -.Pp -An equals sign -.Pq Dq \&= -followed by a customised header string may be appended to a keyword. -This causes the printed header to use the specified string instead of -the default header associated with the keyword. -.Pp -Everything after the first equals sign is part of the customised -header text, and this may include embedded spaces -.Pq Dq " " , -commas -.Pq Dq \&, , -or equals signs -.Pq Dq \&= . -To specify multiple keywords with customised headers, use multiple -.Fl o -or -.Fl O -options. -.Pp -If all the keywords to be displayed have customised headers, -and all the customised headers are entirely empty, -then the header line is not printed at all. -.It Fl p Ar pid -Display information associated with the specified process ID. -.It Fl r -Sort by current CPU usage. -This is equivalent to -.Fl k Ar %cpu . -.It Fl S -Change the way the process time is calculated by summing all exited -children to their parent process. -.It Fl s -Display one line for each LWP, rather than one line for each process, -and display information associated with the following keywords: -.Ar uid , pid , ppid , cpu , lid , nlwp , pri , nice , vsz , rss , -.Ar wchan , lstate , tt , time , -and -.Ar command . -.It Fl T -Display information about processes attached to the device associated -with the standard input. -.It Fl t Ar tty -Display information about processes attached to the specified terminal -device. -Use a question mark -.Pq Dq \&? -for processes not attached to a -terminal device and a minus sign -.Pq Dq - -for processes that have -been revoked from their terminal device. -.It Fl U Ar user -Display processes belonging to the specified user, -given either as a user name or a uid. -.It Fl u -Display information associated with the following keywords: -.Ar user , pid , %cpu , %mem , vsz , rss , tt , state , start , time , -and -.Ar command . -The -.Fl u -option implies the -.Fl r -option. -.It Fl v -Display information associated with the following keywords: -.Ar pid , state , time , sl , re , pagein , vsz , rss , lim , tsiz , -.Ar %cpu , %mem , -and -.Ar command . -The -.Fl v -option implies the -.Fl m -option. -.It Fl W Ar swap -Extract swap information from the specified file instead of the default, -.Dq Pa /dev/drum . -Ignored unless -.Fl M -is specified. -.It Fl w -Use 132 columns to display information instead of the default, which -is your window size. -If the -.Fl w -option is specified more than once, -.Nm -will use as many columns as necessary without regard to your window size. -.It Fl x -Also display information about processes without controlling terminals. -.El -.Pp -A complete list of the available keywords are listed below. -Some of these keywords are further specified as follows: -.Bl -tag -width indent -.It Ar %cpu -The CPU utilization of the process; this is a decaying average over up to -a minute of previous (real) time. -Since the time base over which this is computed varies (since processes may -be very young) it is possible for the sum of all %CPU fields to exceed 100%. -.It Ar %mem -The percentage of real memory used by this process. -.It Ar flags -The flags (in hexadecimal) associated with the process as in -the include file -.In sys/proc.h : -.Bl -column P_NOCLDSTOP P_NOCLDSTOP compact -.It Dv "P_ADVLOCK" Ta No "0x00000001 process may hold a POSIX advisory lock" -.It Dv "P_CONTROLT" Ta No "0x00000002 process has a controlling terminal" -.It Dv "P_NOCLDSTOP" Ta No "0x00000008 no" Dv SIGCHLD No when children stop -.It Dv "P_PPWAIT" Ta No "0x00000010 parent is waiting for child to exec/exit" -.It Dv "P_PROFIL" Ta No "0x00000020 process has started profiling" -.It Dv "P_SELECT" Ta No "0x00000040 selecting; wakeup/waiting danger" -.It Dv "P_SINTR" Ta No "0x00000080 sleep is interruptible" -.It Dv "P_SUGID" Ta No "0x00000100 process had set id privileges since last exec" -.It Dv "P_SYSTEM" Ta No "0x00000200 system process: no sigs or stats" -.It Dv "P_TIMEOUT" Ta No "0x00000400 timing out during sleep" -.It Dv "P_TRACED" Ta No "0x00000800 process is being traced" -.It Dv "P_WAITED" Ta No "0x00001000 debugging process has waited for child" -.It Dv "P_WEXIT" Ta No "0x00002000 working on exiting" -.It Dv "P_EXEC" Ta No "0x00004000 process called" Xr execve 2 -.It Dv "P_OWEUPC" Ta No "0x00008000 owe process an addupc() call at next ast" -.\" the routine addupc is not documented in the man pages -.It Dv "P_NOCLDWAIT" Ta No "0x00020000 no zombies when children die" -.It Dv "P_32" Ta No "0x00040000 32-bit process (used on 64-bit kernels)" -.It Dv "P_BIGLOCK" Ta No "0x00080000 process needs kernel ``big lock'' to run" -.It Dv "P_INEXEC" Ta No "0x00100000 process is exec'ing and cannot be traced" -.El -.It Ar lim -The soft limit on memory used, specified via a call to -.Xr setrlimit 2 . -.It Ar lstart -The exact time the command started, using the -.Dq \&%c -format described in -.Xr strftime 3 . -.It Ar nice -The process scheduling increment (see -.Xr setpriority 2 ) . -.It Ar rss -the real memory (resident set) size of the process (in 1024 byte units). -.It Ar start -The time the command started. -If the command started less than 24 hours ago, the start time is -displayed using the -.Dq %l:%M%p -format described in -.Xr strftime 3 . -If the command started less than 7 days ago, the start time is -displayed using the -.Dq %a%p -format. -Otherwise, the start time is displayed using the -.Dq %e%b%y -format. -.It Ar state -The state is given by a sequence of letters, for example, -.Dq RNs . -The first letter indicates the run state of the process: -.Pp -.Bl -tag -width indent -compact -.It D -Marks a process in device or other short term, uninterruptible wait. -.It I -Marks a process that is idle (sleeping interruptibly for longer than about -.Dv MAXSLP -(default 20) seconds). -.It O -Marks a process running on a processor. -.It R -Marks a runnable process, or one that is in the process of creation. -.It S -Marks a process that is sleeping interruptibly for less than about -.Dv MAXSLP -(default 20) seconds. -.It T -Marks a stopped process. -.It U -Marks a suspended process. -.It Z -Marks a dead process that has exited, but not been waited for (a -.Dq zombie ) . -.El -.Pp -Additional characters after these, if any, indicate additional state -information: -.Pp -.Bl -tag -width indent -compact -.It + -The process is in the foreground process group of its control terminal. -.It - -The LWP is detached (can't be waited for). -.It < -The process has raised CPU scheduling priority. -.It a -The process is using scheduler activations (deprecated). -.It E -The process is in the process of exiting. -.It K -The process is a kernel thread or system process. -.It l -The process has multiple LWPs. -.It N -The process is niced (has reduced CPU scheduling priority) (see -.Xr setpriority 2 ) . -.It s -The process is a session leader. -.It V -The process is suspended during a -.Xr vfork 2 . -.It X -The process is being traced or debugged. -.El -.It Ar tt -An abbreviation for the pathname of the controlling terminal, if any. -The abbreviation consists of the two letters following -.Dq Pa /dev/tty -or, for the console, -.Dq co . -This is followed by a -.Dq \&- -if the process can no longer reach that -controlling terminal (i.e., it has been revoked). -.It Ar wchan -The event (an address in the system) on which a process waits. -When printed numerically, the initial part of the address is -trimmed off and the result is printed in hex, for example, 0x80324000 prints -as 324000. -.El -.Pp -When printing using the -.Ar command -keyword, a process that has exited and has a parent that has not yet -waited for the process (in other words, a zombie) is listed as -.Dq Aq defunct , -and a process which is blocked while trying to exit is listed as -.Dq Aq exiting . -.Pp -.Nm -will try to locate the processes' argument vector from the user -area in order to print the command name and arguments. -This method is not reliable because a process is allowed to destroy this -information. -The -.Ar ucomm -(accounting) keyword will always contain the real command name as -contained in the process structure's -.Va p_comm -field. -.Pp -If the command vector cannot be located (usually because it has not -been set, as is the case of system processes and/or kernel threads) -the command name is printed within square brackets. -.Pp -To indicate that the argument vector has been tampered with, -.Nm -will append the real command name to the output within parentheses -if the basename of the first argument in the argument vector -does not match the contents of the real command name. -.Pp -In addition, -.Nm -checks for the following two situations and does not append the -real command name parenthesized: -.Bl -tag -width indent -.It -shellname -The login process traditionally adds a -.Sq - -in front of the shell name to indicate a login shell. -.Nm -will not append parenthesized the command name if it matches with -the name in the first argument of the argument vector, skipping -the leading -.Sq - . -.It daemonname: current-activity -Daemon processes frequently report their current activity by setting -their name to be like -.Dq daemonname: current-activity . -.Nm -will not append parenthesized the command name, if the string preceding the -.Sq \&: -in the first argument of the argument vector matches the command name. -.El -.Sh KEYWORDS -The following is a complete list of the available keywords and their -meanings. -Several of them have aliases (keywords which are synonyms). -.Pp -.Bl -tag -width groupnames -compact -.It Ar %cpu -percentage CPU usage (alias -.Ar pcpu ) -.It Ar %mem -percentage memory usage (alias -.Ar pmem ) -.It Ar acflag -accounting flag (alias -.Ar acflg ) -.It Ar comm -command (the argv[0] value) -.It Ar command -command and arguments (alias -.Ar args ) -.It Ar cpu -short-term CPU usage factor (for scheduling) -.It Ar cpuid -CPU number the current process or lwp is running on. -.It Ar ctime -accumulated CPU time of all children that have exited -.It Ar egid -effective group id -.It Ar egroup -group name (from egid) -.It Ar emul -emulation name -.It Ar etime -elapsed time since the process was started, in the form -.Li [[dd-]hh:]mm:ss -.It Ar euid -effective user id -.It Ar euser -user name (from euid) -.It Ar flags -the process flags, in hexadecimal (alias -.Ar f ) -.It Ar gid -effective group id -.It Ar group -group name (from gid) -.It Ar groupnames -group names (from group access list) -.It Ar groups -group access list -.It Ar inblk -total blocks read (alias -.Ar inblock ) -.It Ar jobc -job control count -.It Ar ktrace -tracing flags -.It Ar ktracep -tracing vnode -.It Ar laddr -kernel virtual address of the -.Ft "struct lwp" -belonging to the LWP. -.It Ar lid -ID of the LWP -.It Ar lim -memory use limit -.It Ar lname -descriptive name of the LWP -.It Ar logname -login name of user who started the process (alias -.Ar login ) -.It Ar lstart -time started -.It Ar lstate -symbolic LWP state -.It Ar ltime -CPU time of the LWP -.It Ar majflt -total page faults -.It Ar minflt -total page reclaims -.It Ar msgrcv -total messages received (reads from pipes/sockets) -.It Ar msgsnd -total messages sent (writes on pipes/sockets) -.It Ar nice -nice value (alias -.Ar ni ) -.It Ar nivcsw -total involuntary context switches -.It Ar nlwp -number of LWPs in the process -.It Ar nsigs -total signals taken (alias -.Ar nsignals ) -.It Ar nvcsw -total voluntary context switches -.It Ar nwchan -wait channel (as an address) -.It Ar oublk -total blocks written (alias -.Ar oublock ) -.It Ar p_ru -resource usage pointer (valid only for zombie) -.It Ar paddr -kernel virtual address of the -.Ft "struct proc" -belonging to the process. -.It Ar pagein -pageins (same as majflt) -.It Ar pgid -process group number -.It Ar pid -process ID -.It Ar ppid -parent process ID -.It Ar pri -scheduling priority -.It Ar re -core residency time (in seconds; 127 = infinity) -.It Ar rgid -real group ID -.It Ar rlink -reverse link on run queue, or 0 -.It Ar rlwp -number of LWPs on a processor or run queue -.It Ar rss -resident set size -.It Ar rsz -resident set size + (text size / text use count) (alias -.Ar rssize ) -.It Ar ruid -real user ID -.It Ar ruser -user name (from ruid) -.It Ar sess -session pointer -.It Ar sid -session ID -.It Ar sig -pending signals (alias -.Ar pending ) -.It Ar sigcatch -caught signals (alias -.Ar caught ) -.It Ar sigignore -ignored signals (alias -.Ar ignored ) -.It Ar sigmask -blocked signals (alias -.Ar blocked ) -.It Ar sl -sleep time (in seconds; 127 = infinity) -.It Ar start -time started -.It Ar state -symbolic process state (alias -.Ar stat ) -.It Ar stime -accumulated system CPU time -.It Ar svgid -saved gid from a setgid executable -.It Ar svgroup -group name (from svgid) -.It Ar svuid -saved uid from a setuid executable -.It Ar svuser -user name (from svuid) -.It Ar tdev -control terminal device number -.It Ar time -accumulated CPU time, user + system (alias -.Ar cputime ) -.It Ar tpgid -control terminal process group ID -.It Ar tsess -control terminal session pointer -.It Ar tsiz -text size (in Kbytes) -.It Ar tt -control terminal name (two letter abbreviation) -.It Ar tty -full name of control terminal -.It Ar uaddr -kernel virtual address of the -.Ft "struct user" -belonging to the LWP. -.It Ar ucomm -name to be used for accounting -.It Ar uid -effective user ID -.It Ar upr -scheduling priority on return from system call (alias -.Ar usrpri ) -.It Ar user -user name (from uid) -.It Ar utime -accumulated user CPU time -.It Ar vsz -virtual size in Kbytes (alias -.Ar vsize ) -.It Ar wchan -wait channel (as a symbolic name) -.It Ar xstat -exit or stop status (valid only for stopped or zombie process) -.El -.Sh FILES -.Bl -tag -width /var/run/kvm.db -compact -.It Pa /dev -special files and device names -.It Pa /dev/drum -default swap device -.It Pa /var/run/dev.cdb -/dev name database -.It Pa /var/db/kvm.db -system name list database -.It Pa /netbsd -default system name list -.El -.Sh SEE ALSO -.Xr kill 1 , -.Xr pgrep 1 , -.Xr pkill 1 , -.Xr sh 1 , -.Xr w 1 , -.Xr kvm 3 , -.Xr strftime 3 , -.Xr dev_mkdb 8 , -.Xr pstat 8 -.Sh HISTORY -A -.Nm -utility appeared in -.At v3 -in section 8 of the manual. -.Sh BUGS -Since -.Nm -cannot run faster than the system and is run as any other scheduled -process, the information it displays can never be exact. diff --git a/bin/ps/ps.c b/bin/ps/ps.c deleted file mode 100644 index da26fc1..0000000 --- a/bin/ps/ps.c +++ /dev/null @@ -1,947 +0,0 @@ -/* $NetBSD: ps.c,v 1.91 2018/04/11 18:52:29 christos Exp $ */ - -/* - * Copyright (c) 2000-2008 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Simon Burge. - * - * 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. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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. - */ - -/* - * Copyright (c) 1990, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. 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. - */ - -#include <sys/cdefs.h> -#ifndef lint -__COPYRIGHT("@(#) Copyright (c) 1990, 1993, 1994\ - The Regents of the University of California. All rights reserved."); -#endif /* not lint */ - -#ifndef lint -#if 0 -static char sccsid[] = "@(#)ps.c 8.4 (Berkeley) 4/2/94"; -#else -__RCSID("$NetBSD: ps.c,v 1.91 2018/04/11 18:52:29 christos Exp $"); -#endif -#endif /* not lint */ - -#include <sys/param.h> -#include <sys/time.h> -#include <sys/resource.h> -#include <sys/lwp.h> -#include <sys/proc.h> -#include <sys/stat.h> -#include <sys/ioctl.h> -#include <sys/sysctl.h> - -#include <stddef.h> -#include <ctype.h> -#include <err.h> -#include <errno.h> -#include <fcntl.h> -#include <kvm.h> -#include <limits.h> -#include <locale.h> -#include <math.h> -#include <nlist.h> -#include <paths.h> -#include <pwd.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#include "ps.h" - -/* - * ARGOPTS must contain all option characters that take arguments - * (except for 't'!) - it is used in kludge_oldps_options() - */ -#define GETOPTSTR "aAcCdeghjk:LlM:mN:O:o:p:rSsTt:U:uvW:wx" -#define ARGOPTS "kMNOopUW" - -struct varlist displaylist = SIMPLEQ_HEAD_INITIALIZER(displaylist); -struct varlist sortlist = SIMPLEQ_HEAD_INITIALIZER(sortlist); - -int eval; /* exit value */ -int sumrusage; /* -S */ -int termwidth; /* width of screen (0 == infinity) */ -int totwidth; /* calculated width of requested variables */ - -int needcomm, needenv, commandonly; -uid_t myuid; - -static struct kinfo_lwp - *pick_representative_lwp(struct kinfo_proc2 *, - struct kinfo_lwp *, int); -static struct kinfo_proc2 - *getkinfo_kvm(kvm_t *, int, int, int *); -static struct pinfo - *setpinfo(struct kinfo_proc2 *, int, int, int); -static char *kludge_oldps_options(char *); -static int pscomp(const void *, const void *); -static void scanvars(void); -__dead static void usage(void); -static int parsenum(const char *, const char *); -static void descendant_sort(struct pinfo *, int); - -char dfmt[] = "pid tt state time command"; -char jfmt[] = "user pid ppid pgid sess jobc state tt time command"; -char lfmt[] = "uid pid ppid cpu pri nice vsz rss wchan state tt time command"; -char sfmt[] = "uid pid ppid cpu lid nlwp pri nice vsz rss wchan lstate tt " - "ltime command"; -char ufmt[] = "user pid %cpu %mem vsz rss tt state start time command"; -char vfmt[] = "pid state time sl re pagein vsz rss lim tsiz %cpu %mem command"; - -const char *default_fmt = dfmt; - -struct varent *Opos = NULL; /* -O flag inserts after this point */ - -kvm_t *kd; - -static long long -ttyname2dev(const char *ttname, int *xflg, int *what) -{ - struct stat sb; - const char *ttypath; - char pathbuf[MAXPATHLEN]; - - ttypath = NULL; - if (strcmp(ttname, "?") == 0) { - *xflg = 1; - return KERN_PROC_TTY_NODEV; - } - if (strcmp(ttname, "-") == 0) - return KERN_PROC_TTY_REVOKE; - - if (strcmp(ttname, "co") == 0) - ttypath = _PATH_CONSOLE; - else if (strncmp(ttname, "pts/", 4) == 0 || - strncmp(ttname, "tty", 3) == 0) { - (void)snprintf(pathbuf, - sizeof(pathbuf), "%s%s", _PATH_DEV, ttname); - ttypath = pathbuf; - } else if (*ttname != '/') { - (void)snprintf(pathbuf, - sizeof(pathbuf), "%s%s", _PATH_TTY, ttname); - ttypath = pathbuf; - } else - ttypath = ttname; - *what = KERN_PROC_TTY; - if (stat(ttypath, &sb) == -1) { - devmajor_t pts; - int serrno; - - serrno = errno; - pts = getdevmajor("pts", S_IFCHR); - if (pts != NODEVMAJOR && strncmp(ttname, "pts/", 4) == 0) { - int ptsminor = atoi(ttname + 4); - - snprintf(pathbuf, sizeof(pathbuf), "pts/%d", ptsminor); - if (strcmp(pathbuf, ttname) == 0 && ptsminor >= 0) - return makedev(pts, ptsminor); - } - errno = serrno; - err(EXIT_FAILURE, "%s", ttypath); - } - if (!S_ISCHR(sb.st_mode)) - errx(EXIT_FAILURE, "%s: not a terminal", ttypath); - return sb.st_rdev; -} - -int -main(int argc, char *argv[]) -{ - struct kinfo_proc2 *kinfo; - struct pinfo *pinfo; - struct varent *vent; - struct winsize ws; - struct kinfo_lwp *kl, *l; - int ch, i, j, fmt, lineno, descendancy, nentries, nlwps; - long long flag; - int calc_pcpu, prtheader, wflag, what, xflg, rawcpu, showlwps; - char *nlistf, *memf, *swapf, errbuf[_POSIX2_LINE_MAX]; - char *ttname; - - setprogname(argv[0]); - (void)setlocale(LC_ALL, ""); - - if ((ioctl(STDOUT_FILENO, TIOCGWINSZ, (char *)&ws) == -1 && - 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; - - if (argc > 1) - argv[1] = kludge_oldps_options(argv[1]); - - descendancy = fmt = prtheader = wflag = xflg = rawcpu = showlwps = 0; - what = KERN_PROC_UID; - flag = myuid = getuid(); - memf = nlistf = swapf = NULL; - - while ((ch = getopt(argc, argv, GETOPTSTR)) != -1) - switch((char)ch) { - case 'A': - /* "-A" shows all processes, like "-ax" */ - xflg = 1; - /*FALLTHROUGH*/ - case 'a': - what = KERN_PROC_ALL; - flag = 0; - break; - case 'c': - commandonly = 1; - break; - case 'd': - descendancy = 1; - break; - case 'e': /* XXX set ufmt */ - needenv = 1; - break; - case 'C': - rawcpu = 1; - break; - case 'g': - break; /* no-op */ - case 'h': - prtheader = ws.ws_row > 5 ? ws.ws_row : 22; - break; - case 'j': - parsefmt(jfmt); - fmt = 1; - jfmt[0] = '\0'; - break; - case 'k': - parsesort(optarg); - break; - case 'K': - break; /* no-op - was dontuseprocfs */ - case 'L': - showkey(); - return 0; - case 'l': - parsefmt(lfmt); - fmt = 1; - lfmt[0] = '\0'; - break; - case 'M': - memf = optarg; - break; - case 'm': - parsesort("vsz"); - break; - case 'N': - nlistf = optarg; - break; - case 'O': - /* - * If this is not the first -O option, insert - * just after the previous one. - * - * If there is no format yet, start with the default - * format, and insert after the pid column. - * - * If there is already a format, insert after - * the pid column, or at the end if there's no - * pid column. - */ - if (!Opos) { - if (!fmt) - parsefmt(default_fmt); - Opos = varlist_find(&displaylist, "pid"); - } - parsefmt_insert(optarg, &Opos); - fmt = 1; - break; - case 'o': - parsefmt(optarg); - fmt = 1; - break; - case 'p': - what = KERN_PROC_PID; - flag = parsenum(optarg, "process id"); - xflg = 1; - break; - case 'r': - parsesort("%cpu"); - break; - case 'S': - sumrusage = 1; - break; - case 's': - /* -L was already taken... */ - showlwps = 1; - default_fmt = sfmt; - break; - case 'T': - if ((ttname = ttyname(STDIN_FILENO)) == NULL) - errx(EXIT_FAILURE, "stdin: not a terminal"); - flag = ttyname2dev(ttname, &xflg, &what); - break; - case 't': - flag = ttyname2dev(optarg, &xflg, &what); - break; - case 'U': - if (*optarg != '\0') { - struct passwd *pw; - - what = KERN_PROC_UID; - pw = getpwnam(optarg); - if (pw == NULL) { - flag = parsenum(optarg, "user name"); - } else - flag = pw->pw_uid; - } - break; - case 'u': - parsefmt(ufmt); - parsesort("%cpu"); - fmt = 1; - ufmt[0] = '\0'; - break; - case 'v': - parsefmt(vfmt); - parsesort("vsz"); - fmt = 1; - vfmt[0] = '\0'; - break; - case 'W': - swapf = optarg; - break; - case 'w': - if (wflag) - termwidth = UNLIMITED; - else if (termwidth < 131) - termwidth = 131; - wflag++; - break; - case 'x': - xflg = 1; - break; - case '?': - default: - usage(); - } - argc -= optind; - argv += optind; - -#define BACKWARD_COMPATIBILITY -#ifdef BACKWARD_COMPATIBILITY - if (*argv) { - nlistf = *argv; - if (*++argv) { - memf = *argv; - if (*++argv) - swapf = *argv; - } - } -#endif - - if (memf == NULL) { - kd = kvm_openfiles(NULL, NULL, NULL, KVM_NO_FILES, errbuf); - donlist_sysctl(); - } else - kd = kvm_openfiles(nlistf, memf, swapf, O_RDONLY, errbuf); - - if (kd == NULL) - errx(EXIT_FAILURE, "%s", errbuf); - - if (!fmt) - parsefmt(default_fmt); - - /* Add default sort criteria */ - parsesort("tdev,pid"); - calc_pcpu = 0; - SIMPLEQ_FOREACH(vent, &sortlist, next) { - if (vent->var->flag & LWP || vent->var->type == UNSPECIFIED) - warnx("Cannot sort on %s, sort key ignored", - vent->var->name); - if (vent->var->type == PCPU) - calc_pcpu = 1; - } - if (!calc_pcpu) - SIMPLEQ_FOREACH(vent, &displaylist, next) - if (vent->var->type == PCPU) { - calc_pcpu = 1; - break; - } - - /* - * scan requested variables, noting what structures are needed. - */ - scanvars(); - - /* - * select procs - */ - if (!(kinfo = getkinfo_kvm(kd, what, flag, &nentries))) - errx(EXIT_FAILURE, "%s", kvm_geterr(kd)); - if (nentries == 0) { - printheader(); - return 1; - } - pinfo = setpinfo(kinfo, nentries, calc_pcpu, rawcpu); - - /* - * sort proc list - */ - qsort(pinfo, nentries, sizeof(struct pinfo), pscomp); - - /* - * We want things in descendant order - */ - if (descendancy) - descendant_sort(pinfo, nentries); - - /* - * For each proc, call each variable output function in - * "setwidth" mode to determine the widest element of - * the column. - */ - - for (i = 0; i < nentries; i++) { - struct pinfo *pi = &pinfo[i]; - struct kinfo_proc2 *ki = pi->ki; - - if (xflg == 0 && (ki->p_tdev == (uint32_t)NODEV || - (ki->p_flag & P_CONTROLT) == 0)) - continue; - - kl = kvm_getlwps(kd, ki->p_pid, ki->p_paddr, - sizeof(struct kinfo_lwp), &nlwps); - if (kl == 0) - nlwps = 0; - if (showlwps == 0) { - l = pick_representative_lwp(ki, kl, nlwps); - SIMPLEQ_FOREACH(vent, &displaylist, next) - OUTPUT(vent, l, pi, ki, WIDTHMODE); - } else { - /* The printing is done with the loops - * reversed, but here we don't need that, - * and this improves the code locality a bit. - */ - SIMPLEQ_FOREACH(vent, &displaylist, next) - for (j = 0; j < nlwps; j++) - OUTPUT(vent, &kl[j], pi, ki, WIDTHMODE); - } - } - /* - * Print header - AFTER determining process field widths. - * printheader() also adds up the total width of all - * fields the first time it's called. - */ - printheader(); - /* - * For each proc, call each variable output function in - * print mode. - */ - for (i = lineno = 0; i < nentries; i++) { - struct pinfo *pi = &pinfo[i]; - struct kinfo_proc2 *ki = pi->ki; - - if (xflg == 0 && (ki->p_tdev == (uint32_t)NODEV || - (ki->p_flag & P_CONTROLT ) == 0)) - continue; - kl = kvm_getlwps(kd, ki->p_pid, (u_long)ki->p_paddr, - sizeof(struct kinfo_lwp), &nlwps); - if (kl == 0) - nlwps = 0; - if (showlwps == 0) { - l = pick_representative_lwp(ki, kl, nlwps); - SIMPLEQ_FOREACH(vent, &displaylist, next) { - OUTPUT(vent, l, pi, ki, PRINTMODE); - if (SIMPLEQ_NEXT(vent, next) != NULL) - (void)putchar(' '); - } - (void)putchar('\n'); - if (prtheader && lineno++ == prtheader - 4) { - (void)putchar('\n'); - printheader(); - lineno = 0; - } - } else { - for (j = 0; j < nlwps; j++) { - SIMPLEQ_FOREACH(vent, &displaylist, next) { - OUTPUT(vent, &kl[j], pi, ki, PRINTMODE); - if (SIMPLEQ_NEXT(vent, next) != NULL) - (void)putchar(' '); - } - (void)putchar('\n'); - if (prtheader && lineno++ == prtheader - 4) { - (void)putchar('\n'); - printheader(); - lineno = 0; - } - } - } - } - return eval; -} - -static struct kinfo_lwp * -pick_representative_lwp(struct kinfo_proc2 *ki, struct kinfo_lwp *kl, int nlwps) -{ - int i, onproc, running, sleeping, stopped, suspended; - static struct kinfo_lwp zero_lwp; - - if (kl == 0) - return &zero_lwp; - - /* Trivial case: only one LWP */ - if (nlwps == 1) - return kl; - - switch (ki->p_realstat) { - case SSTOP: - case SACTIVE: - /* Pick the most live LWP */ - onproc = running = sleeping = stopped = suspended = -1; - for (i = 0; i < nlwps; i++) { - switch (kl[i].l_stat) { - case LSONPROC: - onproc = i; - break; - case LSRUN: - running = i; - break; - case LSSLEEP: - sleeping = i; - break; - case LSSTOP: - stopped = i; - break; - case LSSUSPENDED: - suspended = i; - break; - } - } - if (onproc != -1) - return &kl[onproc]; - if (running != -1) - return &kl[running]; - if (sleeping != -1) - return &kl[sleeping]; - if (stopped != -1) - return &kl[stopped]; - if (suspended != -1) - return &kl[suspended]; - break; - case SZOMB: - /* First will do */ - return kl; - break; - } - /* Error condition! */ - warnx("Inconsistent LWP state for process %d", ki->p_pid); - return kl; -} - -static struct kinfo_proc2 * -getkinfo_kvm(kvm_t *kdp, int what, int flag, int *nentriesp) -{ - - return (kvm_getproc2(kdp, what, flag, sizeof(struct kinfo_proc2), - nentriesp)); -} - -static struct pinfo * -setpinfo(struct kinfo_proc2 *ki, int nentries, int calc_pcpu, int rawcpu) -{ - struct pinfo *pi; - int i; - - pi = calloc(nentries, sizeof(*pi)); - if (pi == NULL) - err(EXIT_FAILURE, "calloc"); - - if (calc_pcpu && !nlistread) - donlist(); - - for (i = 0; i < nentries; i++) { - pi[i].ki = &ki[i]; - if (!calc_pcpu) - continue; - if (ki[i].p_swtime == 0 || ki[i].p_realstat == SZOMB) { - pi[i].pcpu = 0.0; - continue; - } - pi[i].pcpu = 100.0 * (double)ki[i].p_pctcpu / fscale; - if (!rawcpu) - pi[i].pcpu /= 1.0 - exp(ki[i].p_swtime * log_ccpu); - } - - return pi; -} - -static void -scanvars(void) -{ - struct varent *vent; - VAR *v; - - SIMPLEQ_FOREACH(vent, &displaylist, next) { - v = vent->var; - if (v->flag & COMM) { - needcomm = 1; - break; - } - } -} - -static int -pscomp(const void *a, const void *b) -{ - const struct pinfo *pa = (const struct pinfo *)a; - const struct pinfo *pb = (const struct pinfo *)b; - const struct kinfo_proc2 *ka = pa->ki; - const struct kinfo_proc2 *kb = pb->ki; - - int i; - int64_t i64; - VAR *v; - struct varent *ve; - const sigset_t *sa, *sb; - -#define V_SIZE(k) ((k)->p_vm_msize) -#define RDIFF_N(t, n) \ - if (((const t *)((const char *)ka + v->off))[n] > ((const t *)((const char *)kb + v->off))[n]) \ - return 1; \ - if (((const t *)((const char *)ka + v->off))[n] < ((const t *)((const char *)kb + v->off))[n]) \ - return -1; - -#define RDIFF(type) RDIFF_N(type, 0); continue - - SIMPLEQ_FOREACH(ve, &sortlist, next) { - v = ve->var; - if (v->flag & LWP) - /* LWP structure not available (yet) */ - continue; - /* Sort on pvar() fields, + a few others */ - switch (v->type) { - case CHAR: - RDIFF(char); - case UCHAR: - RDIFF(u_char); - case SHORT: - RDIFF(short); - case USHORT: - RDIFF(ushort); - case INT: - RDIFF(int); - case UINT: - RDIFF(uint); - case LONG: - RDIFF(long); - case ULONG: - RDIFF(ulong); - case INT32: - RDIFF(int32_t); - case UINT32: - RDIFF(uint32_t); - case SIGLIST: - sa = (const void *)((const char *)ka + v->off); - sb = (const void *)((const char *)kb + v->off); - i = 0; - do { - if (sa->__bits[i] > sb->__bits[i]) - return 1; - if (sa->__bits[i] < sb->__bits[i]) - return -1; - i++; - } while (i < (int)__arraycount(sa->__bits)); - continue; - case INT64: - RDIFF(int64_t); - case KPTR: - case KPTR24: - case UINT64: - RDIFF(uint64_t); - case TIMEVAL: - /* compare xxx_sec then xxx_usec */ - RDIFF_N(uint32_t, 0); - RDIFF_N(uint32_t, 1); - continue; - case CPUTIME: - i64 = ka->p_rtime_sec * 1000000 + ka->p_rtime_usec; - i64 -= kb->p_rtime_sec * 1000000 + kb->p_rtime_usec; - if (sumrusage) { - i64 += ka->p_uctime_sec * 1000000 - + ka->p_uctime_usec; - i64 -= kb->p_uctime_sec * 1000000 - + kb->p_uctime_usec; - } - if (i64 != 0) - return i64 > 0 ? 1 : -1; - continue; - case PCPU: - i = pb->pcpu - pa->pcpu; - if (i != 0) - return i; - continue; - case VSIZE: - i = V_SIZE(kb) - V_SIZE(ka); - if (i != 0) - return i; - continue; - - default: - /* Ignore everything else */ - break; - } - } - return 0; - -#undef VSIZE -} - -/* - * 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 user's - * 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 * -kludge_oldps_options(char *s) -{ - size_t len; - char *newopts, *ns, *cp; - - len = strlen(s); - if ((newopts = ns = malloc(len + 3)) == NULL) - err(EXIT_FAILURE, NULL); - /* - * options begin with '-' - */ - if (*s != '-') - *ns++ = '-'; /* add option flag */ - /* - * gaze to end of argv[1] - */ - cp = s + len - 1; - /* - * if the last letter is a 't' flag and there are no other option - * characters that take arguments (eg U, p, o) in the option - * string and the option string doesn't start with a '-' then - * convert to 'T' (meaning *this* terminal, i.e. ttyname(0)). - */ - if (*cp == 't' && *s != '-' && strpbrk(s, ARGOPTS) == NULL) - *cp = 'T'; - else { - /* - * otherwise check for trailing number, which *may* be a - * pid. - */ - while (cp >= s && isdigit((unsigned char)*cp)) - --cp; - } - cp++; - memmove(ns, s, (size_t)(cp - s)); /* copy up to trailing number */ - ns += cp - s; - /* - * if there's a trailing number, and not a preceding 'p' (pid) or - * 't' (tty) flag, then assume it's a pid and insert a 'p' flag. - */ - if (isdigit((unsigned char)*cp) && - (cp == s || (cp[-1] != 'U' && cp[-1] != 't' && cp[-1] != 'p' && - cp[-1] != '/' && (cp - 1 == s || cp[-2] != 't')))) - *ns++ = 'p'; - /* and append the number */ - (void)strcpy(ns, cp); /* XXX strcpy is safe here */ - - return (newopts); -} - -static int -parsenum(const char *str, const char *msg) -{ - char *ep; - unsigned long ul; - - ul = strtoul(str, &ep, 0); - - if (*str == '\0' || *ep != '\0') - errx(EXIT_FAILURE, "Invalid %s: `%s'", msg, str); - - if (ul > INT_MAX) - errx(EXIT_FAILURE, "Out of range %s: `%s'", msg, str); - - return (int)ul; -} - -static void -descendant_sort(struct pinfo *ki, int items) -{ - int dst, lvl, maxlvl, n, ndst, nsrc, siblings, src; - unsigned char *path; - struct pinfo kn; - - /* - * First, sort the entries by descendancy, tracking the descendancy - * depth in the level field. - */ - src = 0; - maxlvl = 0; - while (src < items) { - if (ki[src].level) { - src++; - continue; - } - for (nsrc = 1; src + nsrc < items; nsrc++) - if (!ki[src + nsrc].level) - break; - - for (dst = 0; dst < items; dst++) { - if (ki[dst].ki->p_pid == ki[src].ki->p_pid) - continue; - if (ki[dst].ki->p_pid == ki[src].ki->p_ppid) - break; - } - - if (dst == items) { - src += nsrc; - continue; - } - - for (ndst = 1; dst + ndst < items; ndst++) - if (ki[dst + ndst].level <= ki[dst].level) - break; - - for (n = src; n < src + nsrc; n++) { - ki[n].level += ki[dst].level + 1; - if (maxlvl < ki[n].level) - maxlvl = ki[n].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 prefix (instead of 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].level) == 0) { - ki[src].prefix = NULL; - continue; - } - if ((ki[src].prefix = malloc(lvl * 2 + 1)) == NULL) - errx(EXIT_FAILURE, "malloc failed"); - for (n = 0; n < lvl - 2; n++) { - ki[src].prefix[n * 2] = - path[n / 8] & 1 << (n % 8) ? '|' : ' '; - ki[src].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].level > lvl) - continue; - if (ki[dst].level == lvl) - siblings = 1; - break; - } - if (siblings) - path[n / 8] |= 1 << (n % 8); - else - path[n / 8] &= ~(1 << (n % 8)); - ki[src].prefix[n * 2] = siblings ? '|' : '`'; - ki[src].prefix[n * 2 + 1] = '-'; - n++; - } - strcpy(ki[src].prefix + n * 2, "- "); - } - free(path); -} - -static void -usage(void) -{ - - (void)fprintf(stderr, - "usage:\t%s\n\t %s\n\t%s\n", - "ps [-AaCcdehjlmrSsTuvwx] [-k key] [-M core] [-N system] [-O fmt]", - "[-o fmt] [-p pid] [-t tty] [-U user] [-W swap]", - "ps -L"); - exit(1); - /* NOTREACHED */ -} diff --git a/bin/ps/ps.h b/bin/ps/ps.h deleted file mode 100644 index 7d8ddb8..0000000 --- a/bin/ps/ps.h +++ /dev/null @@ -1,104 +0,0 @@ -/* $NetBSD: ps.h,v 1.29 2016/12/02 21:59:03 christos Exp $ */ - -/*- - * Copyright (c) 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. 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. - * - * @(#)ps.h 8.1 (Berkeley) 5/31/93 - */ - -#include <sys/queue.h> - -#define UNLIMITED 0 /* unlimited terminal width */ - -enum mode { - PRINTMODE = 0, /* print values */ - WIDTHMODE = 1 /* determine width of column */ -}; - -enum type { - UNSPECIFIED, - CHAR, UCHAR, SHORT, USHORT, INT, UINT, LONG, ULONG, - KPTR, KPTR24, INT32, UINT32, SIGLIST, INT64, UINT64, - TIMEVAL, CPUTIME, PCPU, VSIZE -}; - -/* Variables. */ -typedef SIMPLEQ_HEAD(varlist, varent) VARLIST; - -typedef struct varent { - SIMPLEQ_ENTRY(varent) next; - struct var *var; -} VARENT; - -struct pinfo { - struct kinfo_proc2 *ki; - struct kinfo_lwp *li; - char *prefix; - int level; - double pcpu; -}; - -typedef struct var { - const char *name; /* name(s) of variable */ - const char *header; /* header, possibly changed from default */ -#define COMM 0x01 /* needs exec arguments and environment (XXX) */ -#define ARGV0 0x02 /* only print argv[0] */ -#define LJUST 0x04 /* left adjust on output (trailing blanks) */ -#define INF127 0x08 /* 127 = infinity: if > 127, print 127. */ -#define LWP 0x10 /* dispatch to kinfo_lwp routine */ -#define UAREA 0x20 /* need to check p_uvalid */ -#define ALIAS 0x40 /* entry is alias for 'header' */ - u_int flag; - /* output routine */ - void (*oproc)(struct pinfo *pi, struct varent *, enum mode); - /* - * The following (optional) elements are hooks for passing information - * to the generic output routine: pvar (that which prints simple - * elements from struct kinfo_proc2). - */ - int off; /* offset in structure */ - enum type type; /* type of element */ - const char *fmt; /* printf format */ - - /* current longest element */ - int width; /* printing width */ - int64_t longestp; /* longest positive signed value */ - int64_t longestn; /* longest negative signed value */ - u_int64_t longestu; /* longest unsigned value */ - double longestpd; /* longest positive double */ - double longestnd; /* longest negative double */ -} VAR; - - -#define OUTPUT(vent, kl, pi, ki, mode) do { \ - if ((vent)->var->flag & LWP) \ - pi->li = kl; \ - ((vent)->var->oproc)(pi, (vent), (mode)); \ - } while (/*CONSTCOND*/ 0) - -#include "extern.h" |