1*c59e78d3Sclaudio /* $OpenBSD: keyword.c,v 1.53 2024/10/10 10:24:14 claudio Exp $ */ 223f943a6Sderaadt /* $NetBSD: keyword.c,v 1.12.6.1 1996/05/30 21:25:13 cgd Exp $ */ 3df930be7Sderaadt 4df930be7Sderaadt /*- 5df930be7Sderaadt * Copyright (c) 1990, 1993, 1994 6df930be7Sderaadt * The Regents of the University of California. All rights reserved. 7df930be7Sderaadt * 8df930be7Sderaadt * Redistribution and use in source and binary forms, with or without 9df930be7Sderaadt * modification, are permitted provided that the following conditions 10df930be7Sderaadt * are met: 11df930be7Sderaadt * 1. Redistributions of source code must retain the above copyright 12df930be7Sderaadt * notice, this list of conditions and the following disclaimer. 13df930be7Sderaadt * 2. Redistributions in binary form must reproduce the above copyright 14df930be7Sderaadt * notice, this list of conditions and the following disclaimer in the 15df930be7Sderaadt * documentation and/or other materials provided with the distribution. 1629295d1cSmillert * 3. Neither the name of the University nor the names of its contributors 17df930be7Sderaadt * may be used to endorse or promote products derived from this software 18df930be7Sderaadt * without specific prior written permission. 19df930be7Sderaadt * 20df930be7Sderaadt * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 21df930be7Sderaadt * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22df930be7Sderaadt * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23df930be7Sderaadt * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 24df930be7Sderaadt * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25df930be7Sderaadt * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26df930be7Sderaadt * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27df930be7Sderaadt * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28df930be7Sderaadt * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29df930be7Sderaadt * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30df930be7Sderaadt * SUCH DAMAGE. 31df930be7Sderaadt */ 32df930be7Sderaadt 3339d65d83Sderaadt #include <sys/types.h> 34df930be7Sderaadt #include <sys/time.h> 35df930be7Sderaadt #include <sys/resource.h> 36df930be7Sderaadt 37df930be7Sderaadt #include <err.h> 38df930be7Sderaadt #include <errno.h> 39df930be7Sderaadt #include <stddef.h> 40df930be7Sderaadt #include <stdio.h> 41df930be7Sderaadt #include <stdlib.h> 42df930be7Sderaadt #include <string.h> 43df930be7Sderaadt 44df930be7Sderaadt #include "ps.h" 45df930be7Sderaadt 46df930be7Sderaadt #include <sys/ucred.h> 47df930be7Sderaadt #include <sys/sysctl.h> 48df930be7Sderaadt 49f53ee0dcSguenther int needheader; 50f53ee0dcSguenther 51c72b5b24Smillert static VAR *findvar(char *); 52c72b5b24Smillert static int vcmp(const void *, const void *); 53df930be7Sderaadt 54df930be7Sderaadt #ifdef NOTINUSE 55df930be7Sderaadt int utime(), stime(), ixrss(), idrss(), isrss(); 56df930be7Sderaadt {{"utime"}, "UTIME", USER, utime, 4}, 57df930be7Sderaadt {{"stime"}, "STIME", USER, stime, 4}, 58df930be7Sderaadt {{"ixrss"}, "IXRSS", USER, ixrss, 4}, 59df930be7Sderaadt {{"idrss"}, "IDRSS", USER, idrss, 4}, 60df930be7Sderaadt {{"isrss"}, "ISRSS", USER, isrss, 4}, 61df930be7Sderaadt #endif 62df930be7Sderaadt 63df930be7Sderaadt /* Compute offset in common structures. */ 645027561dSguenther #define POFF(x) offsetof(struct kinfo_proc, x) 65df930be7Sderaadt 66df930be7Sderaadt #define UIDFMT "u" 67df930be7Sderaadt #define UIDLEN 5 68df930be7Sderaadt #define UID(n1, n2, fn, off) \ 6991da9bfbSmillert { n1, n2, NULL, 0, fn, UIDLEN, 0, off, UINT32, UIDFMT } 70df930be7Sderaadt #define GID(n1, n2, fn, off) UID(n1, n2, fn, off) 71df930be7Sderaadt 72df930be7Sderaadt #define PIDFMT "d" 73df930be7Sderaadt #define PIDLEN 5 74df930be7Sderaadt #define PID(n1, n2, fn, off) \ 7591da9bfbSmillert { n1, n2, NULL, 0, fn, PIDLEN, 0, off, INT32, PIDFMT } 76df930be7Sderaadt 77b9d9655cSjsing #define TIDFMT "d" 78b9d9655cSjsing #define TIDLEN 7 79b9d9655cSjsing #define TID(n1, n2, fn, off) \ 80b9d9655cSjsing { n1, n2, NULL, 0, fn, TIDLEN, 0, off, INT32, TIDFMT } 81b9d9655cSjsing 82df930be7Sderaadt #define USERLEN 8 83def13f16Snicm #define CWDLEN 40 84e9b1e889Smillert #define UCOMMLEN (sizeof(((struct kinfo_proc *)NULL)->p_comm) - 1) 85e9b1e889Smillert #define WCHANLEN (sizeof(((struct kinfo_proc *)NULL)->p_wmesg) - 1) 86df930be7Sderaadt 875027561dSguenther /* Bit types must match their respective entries in struct kinfo_proc */ 88447f61ceSguenther /* Entries must be sorted in lexical ascending order! */ 89df930be7Sderaadt VAR var[] = { 906b176adcSmillert {"%cpu", "%CPU", NULL, NLIST, pcpu, 4}, 916b176adcSmillert {"%mem", "%MEM", NULL, NLIST, pmem, 4}, 92ce05de28Srob {"acflag", "ACFLG", NULL, 0, pvar, 3, 0, POFF(p_acflag), UINT32, "x"}, 93df930be7Sderaadt {"acflg", "", "acflag"}, 9450b7cf99Skstailey {"args", "", "command"}, 95df930be7Sderaadt {"blocked", "", "sigmask"}, 96df930be7Sderaadt {"caught", "", "sigcatch"}, 9774acc7b2Sguenther {"comm", "COMMAND", "ucomm"}, 98df930be7Sderaadt {"command", "COMMAND", NULL, COMM|LJUST|USER, command, 16}, 9990624e93Smillert {"cpu", "CPU", NULL, 0, pvar, 3, 0, POFF(p_estcpu), UINT32, "d"}, 1006c857482Sderaadt {"cpuid", "CPUID", NULL, 0, pvar, 8, 0, POFF(p_cpuid), UINT64, "lld"}, 101df930be7Sderaadt {"cputime", "", "time"}, 102def13f16Snicm {"cwd", "CWD", NULL, LJUST, curwd, CWDLEN}, 103ab0c1884Smickey {"dsiz", "DSIZ", NULL, 0, dsize, 4}, 104588f7f8cStedu {"etime", "ELAPSED", NULL, USER, elapsed, 12}, 10590624e93Smillert {"f", "F", NULL, 0, pvar, 7, 0, POFF(p_flag), INT32, "x"}, 106df930be7Sderaadt {"flags", "", "f"}, 10790624e93Smillert GID("gid", "GID", pvar, POFF(p_gid)), 10818e03f5aSdrahn {"group", "GROUP", NULL, LJUST, gname, USERLEN}, 109df930be7Sderaadt {"ignored", "", "sigignore"}, 11090624e93Smillert {"inblk", "INBLK", NULL, USER, pvar, 4, 0, POFF(p_uru_inblock), UINT64, "lld"}, 111df930be7Sderaadt {"inblock", "", "inblk"}, 11290624e93Smillert {"jobc", "JOBC", NULL, 0, pvar, 4, 0, POFF(p_jobc), INT16, "d"}, 11390624e93Smillert {"ktrace", "KTRACE", NULL, 0, pvar, 8, 0, POFF(p_traceflag), INT32, "x"}, 114df930be7Sderaadt /* XXX */ 11572cf7c21Sguenther {"ktracep", "KTRACEP", NULL, 0, pvar, PTRWIDTH, 0, POFF(p_tracep), UINT64, "llx"}, 116df930be7Sderaadt {"lim", "LIM", NULL, 0, maxrss, 5}, 117b9fc9a72Sderaadt {"login", "LOGIN", NULL, LJUST, logname, LOGIN_NAME_MAX}, 118df930be7Sderaadt {"logname", "", "login"}, 119df930be7Sderaadt {"lstart", "STARTED", NULL, LJUST|USER, lstarted, 28}, 12090624e93Smillert {"majflt", "MAJFLT", NULL, USER, pvar, 4, 0, POFF(p_uru_majflt), UINT64, "lld"}, 121dfb1dca8Sguenther {"maxrss", "MAXRSS", NULL, USER, pvar, 4, 0, POFF(p_uru_maxrss), UINT64, "lld"}, 1222fd29784Slteo {"minflt", "MINFLT", NULL, USER, pvar, 4, 0, POFF(p_uru_minflt), UINT64, "lld"}, 12390624e93Smillert {"msgrcv", "MSGRCV", NULL, USER, pvar, 4, 0, POFF(p_uru_msgrcv), UINT64, "lld"}, 12490624e93Smillert {"msgsnd", "MSGSND", NULL, USER, pvar, 4, 0, POFF(p_uru_msgsnd), UINT64, "lld"}, 125df930be7Sderaadt {"ni", "", "nice"}, 1262242bec2Shugh {"nice", "NI", NULL, 0, pnice, 3}, 12790624e93Smillert {"nivcsw", "NIVCSW", NULL, USER, pvar, 5, 0, POFF(p_uru_nivcsw), UINT64, "lld"}, 128df930be7Sderaadt {"nsignals", "", "nsigs"}, 12990624e93Smillert {"nsigs", "NSIGS", NULL, USER, pvar, 4, 0, POFF(p_uru_nsignals), UINT64, "lld"}, 13090624e93Smillert {"nswap", "NSWAP", NULL, USER, pvar, 4, 0, POFF(p_uru_nswap), UINT64, "lld"}, 13190624e93Smillert {"nvcsw", "NVCSW", NULL, USER, pvar, 5, 0, POFF(p_uru_nvcsw), UINT64, "lld"}, 132df930be7Sderaadt /* XXX */ 13372cf7c21Sguenther {"nwchan", "WCHAN", NULL, 0, pvar, PTRWIDTH, 0, POFF(p_wchan), UINT64, "llx"}, 13490624e93Smillert {"oublk", "OUBLK", NULL, USER, pvar, 4, 0, POFF(p_uru_oublock), UINT64, "lld"}, 135df930be7Sderaadt {"oublock", "", "oublk"}, 136df930be7Sderaadt /* XXX */ 13772cf7c21Sguenther {"p_ru", "P_RU", NULL, 0, pvar, PTRWIDTH, 0, POFF(p_ru), UINT64, "llx"}, 138df930be7Sderaadt /* XXX */ 13972cf7c21Sguenther {"paddr", "PADDR", NULL, 0, pvar, PTRWIDTH, 0, POFF(p_paddr), UINT64, "llx"}, 140df930be7Sderaadt {"pagein", "PAGEIN", NULL, USER, pagein, 6}, 141df930be7Sderaadt {"pcpu", "", "%cpu"}, 142df930be7Sderaadt {"pending", "", "sig"}, 14390624e93Smillert PID("pgid", "PGID", pvar, POFF(p__pgid)), 144df930be7Sderaadt PID("pid", "PID", pvar, POFF(p_pid)), 14588009049Sderaadt {"pledge", "PLEDGE", NULL, LJUST|NLIST, printpledge, 64}, 146df930be7Sderaadt {"pmem", "", "%mem"}, 14790624e93Smillert PID("ppid", "PPID", pvar, POFF(p_ppid)), 148df930be7Sderaadt {"pri", "PRI", NULL, 0, pri, 3}, 149447f61ceSguenther {"procflags", "PROCF", NULL, 0, pvar, 7, 0, POFF(p_psflags), INT32, "x"}, 15090624e93Smillert {"re", "RE", NULL, INF127, pvar, 3, 0, POFF(p_swtime), UINT32, "u"}, 15190624e93Smillert GID("rgid", "RGID", pvar, POFF(p_rgid)), 152df930be7Sderaadt /* XXX */ 15350b7cf99Skstailey {"rgroup", "RGROUP", NULL, LJUST, rgname, USERLEN}, 15490624e93Smillert {"rlink", "RLINK", NULL, 0, pvar, 8, 0, POFF(p_back), UINT64, "llx"}, 155fc8192a4Skstailey {"rss", "RSS", NULL, 0, p_rssize, 5}, 156df930be7Sderaadt {"rssize", "", "rsz"}, 157df930be7Sderaadt {"rsz", "RSZ", NULL, 0, rssize, 4}, 158a60854cdSguenther {"rtable", "RTABLE", NULL, 0, pvar, 0, 0, POFF(p_rtableid), INT32, "d"}, 15990624e93Smillert UID("ruid", "RUID", pvar, POFF(p_ruid)), 160df930be7Sderaadt {"ruser", "RUSER", NULL, LJUST, runame, USERLEN}, 161*c59e78d3Sclaudio PID("sess", "SESS", pvar, POFF(p_sid)), 16290624e93Smillert {"sig", "PENDING", NULL, 0, pvar, 8, 0, POFF(p_siglist), INT32, "x"}, 16390624e93Smillert {"sigcatch", "CAUGHT", NULL, 0, pvar, 8, 0, POFF(p_sigcatch), UINT32, "x"}, 164df930be7Sderaadt {"sigignore", "IGNORED", 16590624e93Smillert NULL, 0, pvar, 8, 0, POFF(p_sigignore), UINT32, "x"}, 16690624e93Smillert {"sigmask", "BLOCKED", NULL, 0, pvar, 8, 0, POFF(p_sigmask), UINT32, "x"}, 16790624e93Smillert {"sl", "SL", NULL, INF127, pvar, 3, 0, POFF(p_slptime), UINT32, "u"}, 168ab0c1884Smickey {"ssiz", "SSIZ", NULL, 0, ssize, 4}, 169df930be7Sderaadt {"start", "STARTED", NULL, LJUST|USER, started, 8}, 170df930be7Sderaadt {"stat", "", "state"}, 1718d8661adSderaadt {"state", "STAT", NULL, LJUST|NLIST, printstate, 6}, 172ba85321fSchrisz {"supgid", "SUPGID", NULL, LJUST, supgid, 64}, 173ba85321fSchrisz {"supgrp", "SUPGRP", NULL, LJUST, supgrp, 64}, 17490624e93Smillert GID("svgid", "SVGID", pvar, POFF(p_svgid)), 17590624e93Smillert UID("svuid", "SVUID", pvar, POFF(p_svuid)), 176df930be7Sderaadt {"tdev", "TDEV", NULL, 0, tdev, 4}, 177b9d9655cSjsing TID("tid", "TID", pvar, POFF(p_tid)), 178df930be7Sderaadt {"time", "TIME", NULL, USER, cputime, 9}, 17990624e93Smillert PID("tpgid", "TPGID", pvar, POFF(p_tpgid)), 180c925c2a9Smillert {"tsess", "TSESS", NULL, 0, pvar, PTRWIDTH, 0, POFF(p_tsess), UINT64, "llx"}, 181df930be7Sderaadt {"tsiz", "TSIZ", NULL, 0, tsize, 4}, 182df930be7Sderaadt {"tt", "TT", NULL, LJUST, tname, 3}, 183df930be7Sderaadt {"tty", "TTY", NULL, LJUST, longtname, 8}, 184e9b1e889Smillert {"ucomm", "UCOMM", NULL, LJUST, ucomm, UCOMMLEN}, 18590624e93Smillert UID("uid", "UID", pvar, POFF(p_uid)), 18690624e93Smillert {"upr", "UPR", NULL, 0, pvar, 3, 0, POFF(p_usrpri), UINT8, "d"}, 187e41c4978Sderaadt {"user", "USER", NULL, LJUST, euname, USERLEN}, 188df930be7Sderaadt {"usrpri", "", "upr"}, 189df930be7Sderaadt {"vsize", "", "vsz"}, 190df930be7Sderaadt {"vsz", "VSZ", NULL, 0, vsize, 5}, 191e9b1e889Smillert {"wchan", "WCHAN", NULL, LJUST, wchan, WCHANLEN}, 19290624e93Smillert {"xstat", "XSTAT", NULL, 0, pvar, 4, 0, POFF(p_xstat), UINT16, "x"}, 193df930be7Sderaadt {""}, 194df930be7Sderaadt }; 195df930be7Sderaadt 196df930be7Sderaadt void 19728416801Sderaadt showkey(void) 198df930be7Sderaadt { 199df930be7Sderaadt VAR *v; 200df930be7Sderaadt int i; 201df930be7Sderaadt char *p, *sep; 202df930be7Sderaadt 203df930be7Sderaadt i = 0; 204df930be7Sderaadt sep = ""; 205df930be7Sderaadt for (v = var; *(p = v->name); ++v) { 206df930be7Sderaadt int len = strlen(p); 207df930be7Sderaadt if (termwidth && (i += len + 1) > termwidth) { 208df930be7Sderaadt i = len; 209df930be7Sderaadt sep = "\n"; 210df930be7Sderaadt } 211df930be7Sderaadt (void) printf("%s%s", sep, p); 212df930be7Sderaadt sep = " "; 213df930be7Sderaadt } 214df930be7Sderaadt (void) printf("\n"); 215df930be7Sderaadt } 216df930be7Sderaadt 217df930be7Sderaadt void 21828416801Sderaadt parsefmt(char *p) 219df930be7Sderaadt { 220df930be7Sderaadt static struct varent *vtail; 221df930be7Sderaadt 222df930be7Sderaadt #define FMTSEP " \t,\n" 223df930be7Sderaadt while (p && *p) { 224df930be7Sderaadt char *cp; 225df930be7Sderaadt VAR *v; 226df930be7Sderaadt struct varent *vent; 227df930be7Sderaadt 228df930be7Sderaadt while ((cp = strsep(&p, FMTSEP)) != NULL && *cp == '\0') 229df930be7Sderaadt /* void */; 23038a646d7Saaron if (!cp) 23138a646d7Saaron break; 23291da9bfbSmillert if (!(v = findvar(cp)) || v->parsed == 1) 233df930be7Sderaadt continue; 23491da9bfbSmillert v->parsed = 1; 235df930be7Sderaadt if ((vent = malloc(sizeof(struct varent))) == NULL) 236df930be7Sderaadt err(1, NULL); 237df930be7Sderaadt vent->var = v; 238df930be7Sderaadt vent->next = NULL; 239df930be7Sderaadt if (vhead == NULL) 240df930be7Sderaadt vhead = vtail = vent; 241df930be7Sderaadt else { 242df930be7Sderaadt vtail->next = vent; 243df930be7Sderaadt vtail = vent; 244df930be7Sderaadt } 245f53ee0dcSguenther needheader |= v->header[0] != '\0'; 246df930be7Sderaadt } 247df930be7Sderaadt if (!vhead) 248df930be7Sderaadt errx(1, "no valid keywords"); 249df930be7Sderaadt } 250df930be7Sderaadt 251df930be7Sderaadt static VAR * 25228416801Sderaadt findvar(char *p) 253df930be7Sderaadt { 254df930be7Sderaadt VAR *v, key; 255df930be7Sderaadt char *hp; 256df930be7Sderaadt 257df930be7Sderaadt key.name = p; 258df930be7Sderaadt 259df930be7Sderaadt hp = strchr(p, '='); 260df930be7Sderaadt if (hp) 261df930be7Sderaadt *hp++ = '\0'; 262df930be7Sderaadt 26374acc7b2Sguenther aliased: 264df930be7Sderaadt key.name = p; 265df930be7Sderaadt v = bsearch(&key, var, sizeof(var)/sizeof(VAR) - 1, sizeof(VAR), vcmp); 266df930be7Sderaadt 267df930be7Sderaadt if (v && v->alias) { 26874acc7b2Sguenther p = v->alias; 26974acc7b2Sguenther if (hp == NULL && v->header[0] != '\0') 27074acc7b2Sguenther hp = v->header; 27174acc7b2Sguenther goto aliased; 272df930be7Sderaadt } 273df930be7Sderaadt if (!v) { 274df930be7Sderaadt warnx("%s: keyword not found", p); 275df930be7Sderaadt eval = 1; 276906f3344Skstailey return (NULL); 277df930be7Sderaadt } 278df930be7Sderaadt if (hp) 279df930be7Sderaadt v->header = hp; 280df930be7Sderaadt return (v); 281df930be7Sderaadt } 282df930be7Sderaadt 283df930be7Sderaadt static int 28428416801Sderaadt vcmp(const void *a, const void *b) 285df930be7Sderaadt { 286df930be7Sderaadt return (strcmp(((VAR *)a)->name, ((VAR *)b)->name)); 287df930be7Sderaadt } 288