Module Name: src Committed By: christos Date: Tue Sep 14 17:09:18 UTC 2021
Modified Files: src/bin/ps: Makefile keyword.c print.c ps.1 ps.h Log Message: Provide symbolic printing of some keywords by capitalizing them. To generate a diff of this commit: cvs rdiff -u -r1.30 -r1.31 src/bin/ps/Makefile src/bin/ps/ps.h cvs rdiff -u -r1.57 -r1.58 src/bin/ps/keyword.c cvs rdiff -u -r1.135 -r1.136 src/bin/ps/print.c cvs rdiff -u -r1.112 -r1.113 src/bin/ps/ps.1 Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/bin/ps/Makefile diff -u src/bin/ps/Makefile:1.30 src/bin/ps/Makefile:1.31 --- src/bin/ps/Makefile:1.30 Tue Apr 6 00:49:41 2021 +++ src/bin/ps/Makefile Tue Sep 14 13:09:18 2021 @@ -1,10 +1,10 @@ -# $NetBSD: Makefile,v 1.30 2021/04/06 04:49:41 simonb Exp $ +# $NetBSD: Makefile,v 1.31 2021/09/14 17:09:18 christos Exp $ # @(#)Makefile 8.1 (Berkeley) 6/2/93 PROG= ps SRCS= fmt.c keyword.c nlist.c print.c ps.c -DPADD= ${LIBM} ${LIBKVM} -LDADD= -lm -lkvm +DPADD= ${LIBUTIL} ${LIBM} ${LIBKVM} +LDADD= -lutil -lm -lkvm COPTS.print.c = -Wno-format-nonliteral -Wno-format-y2k Index: src/bin/ps/ps.h diff -u src/bin/ps/ps.h:1.30 src/bin/ps/ps.h:1.31 --- src/bin/ps/ps.h:1.30 Fri Sep 10 18:11:03 2021 +++ src/bin/ps/ps.h Tue Sep 14 13:09:18 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: ps.h,v 1.30 2021/09/10 22:11:03 rillig Exp $ */ +/* $NetBSD: ps.h,v 1.31 2021/09/14 17:09:18 christos Exp $ */ /*- * Copyright (c) 1990, 1993 @@ -44,7 +44,7 @@ enum type { UNSPECIFIED, CHAR, UCHAR, SHORT, USHORT, INT, UINT, LONG, ULONG, KPTR, KPTR24, INT32, UINT32, SIGLIST, INT64, UINT64, - TIMEVAL, CPUTIME, PCPU, VSIZE + TIMEVAL, CPUTIME, PCPU, VSIZE, PROCFLAG, PROCACFLAG }; /* Variables. */ @@ -73,6 +73,7 @@ typedef struct var { #define LWP 0x10 /* dispatch to kinfo_lwp routine */ #define UAREA 0x20 /* need to check p_uvalid */ #define ALIAS 0x40 /* entry is alias for 'header' */ +#define ALTPR 0x80 /* use alternate printing method */ u_int flag; /* output routine */ void (*oproc)(struct pinfo *pi, struct varent *, enum mode); Index: src/bin/ps/keyword.c diff -u src/bin/ps/keyword.c:1.57 src/bin/ps/keyword.c:1.58 --- src/bin/ps/keyword.c:1.57 Tue Aug 6 14:07:51 2019 +++ src/bin/ps/keyword.c Tue Sep 14 13:09:18 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: keyword.c,v 1.57 2019/08/06 18:07:51 kamil Exp $ */ +/* $NetBSD: keyword.c,v 1.58 2021/09/14 17:09:18 christos Exp $ */ /*- * Copyright (c) 1990, 1993, 1994 @@ -34,7 +34,7 @@ #if 0 static char sccsid[] = "@(#)keyword.c 8.5 (Berkeley) 4/2/94"; #else -__RCSID("$NetBSD: keyword.c,v 1.57 2019/08/06 18:07:51 kamil Exp $"); +__RCSID("$NetBSD: keyword.c,v 1.58 2021/09/14 17:09:18 christos Exp $"); #endif #endif /* not lint */ @@ -49,6 +49,7 @@ __RCSID("$NetBSD: keyword.c,v 1.57 2019/ #include <err.h> #include <errno.h> #include <kvm.h> +#include <ctype.h> #include <stddef.h> #include <stdio.h> #include <stdlib.h> @@ -103,7 +104,7 @@ static int vcmp(const void *, const voi 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"), + PVAR("acflag", "ACFLG", 0, p_acflag, PROCACFLAG, "x"), VAR3("acflg", "acflag", ALIAS), VAR3("args", "command", ALIAS), VAR3("blocked", "sigmask", ALIAS), @@ -120,7 +121,7 @@ VAR var[] = { 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"), + PVAR("f", "F", 0, p_flag, PROCFLAG, "x"), VAR3("flags", "f", ALIAS), GID("gid", "GID", p_gid), VAR4("group", "GROUP", LJUST, gname), @@ -359,12 +360,16 @@ findvar(const char *p) { VAR *v; char *hp; + char pp[1024]; + strlcpy(pp, p, sizeof(pp)); - hp = strchr(p, '='); + hp = strchr(pp, '='); if (hp) *hp++ = '\0'; + for (char *dp = pp; *dp; dp++) + *dp = tolower((unsigned char)*dp); - v = bsearch(p, var, sizeof(var)/sizeof(VAR) - 1, sizeof(VAR), vcmp); + v = bsearch(pp, var, sizeof(var)/sizeof(VAR) - 1, sizeof(VAR), vcmp); if (v && v->flag & ALIAS) v = findvar(v->header); if (!v) { @@ -373,7 +378,17 @@ findvar(const char *p) return NULL; } - if (v && hp) { + if (!hp && *p == *pp) + return v; + + struct var *newvar; + + if ((newvar = malloc(sizeof(*newvar))) == NULL) + err(EXIT_FAILURE, NULL); + memcpy(newvar, v, sizeof(*newvar)); + v = newvar; + + if (hp) { /* * Override the header. * @@ -382,16 +397,10 @@ findvar(const char *p) * 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 @@ -399,9 +408,11 @@ findvar(const char *p) */ if (*hp == '\0') newvar->width = strlen(v->header); - - v = newvar; } + + if (*p != *pp) + newvar->flag |= ALTPR|LJUST; + return v; } Index: src/bin/ps/print.c diff -u src/bin/ps/print.c:1.135 src/bin/ps/print.c:1.136 --- src/bin/ps/print.c:1.135 Sat Apr 17 04:35:33 2021 +++ src/bin/ps/print.c Tue Sep 14 13:09:18 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: print.c,v 1.135 2021/04/17 08:35:33 maya Exp $ */ +/* $NetBSD: print.c,v 1.136 2021/09/14 17:09:18 christos Exp $ */ /* * Copyright (c) 2000, 2007 The NetBSD Foundation, Inc. @@ -63,18 +63,20 @@ #if 0 static char sccsid[] = "@(#)print.c 8.6 (Berkeley) 4/16/94"; #else -__RCSID("$NetBSD: print.c,v 1.135 2021/04/17 08:35:33 maya Exp $"); +__RCSID("$NetBSD: print.c,v 1.136 2021/09/14 17:09:18 christos Exp $"); #endif #endif /* not lint */ #include <sys/param.h> #include <sys/time.h> #include <sys/resource.h> +#include <sys/sysctl.h> #include <sys/lwp.h> #include <sys/proc.h> #include <sys/stat.h> #include <sys/ucred.h> #include <sys/sysctl.h> +#include <sys/acct.h> #include <err.h> #include <grp.h> @@ -87,8 +89,10 @@ __RCSID("$NetBSD: print.c,v 1.135 2021/0 #include <stdlib.h> #include <string.h> #include <time.h> +#include <util.h> #include <tzfile.h> #include <unistd.h> +#include <signal.h> #include "ps.h" @@ -1145,6 +1149,73 @@ tsize(struct pinfo *pi, VARENT *ve, enum intprintorsetwidth(v, pgtok(k->p_vm_tsize), mode); } +static void +printsig(VAR *v, const sigset_t *s, enum mode mode) +{ +#define SIGSETSIZE __arraycount(s->__bits) + if ((v->flag & ALTPR) == 0) { + char buf[SIGSETSIZE * 8 + 1]; + size_t i; + + 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); + } else { + size_t maxlen = 1024, len = 0; + char *buf = malloc(maxlen); + if (buf == NULL) + err(EXIT_FAILURE, NULL); + *buf = '\0'; + for (size_t i = 0; i < SIGSETSIZE; i++) { + uint32_t m = s->__bits[i]; + for (uint32_t j = 0; j < 32; j++) { + if ((m & (1 << j)) == 0) + continue; + const char *n = signalname(j + 1); + size_t sn = strlen(n); + if (len) + sn++; + if (len + sn >= maxlen) { + maxlen += 1024; + buf = realloc(buf, maxlen); + if (buf == NULL) + err(EXIT_FAILURE, NULL); + } + snprintf(buf + len, sn + 1, "%s%s", + len == 0 ? "" : ",", n); + len += sn; + } + } + strprintorsetwidth(v, buf, mode); + free(buf); +#undef SIGSETSIZE + } +} + +static void +printflag(VAR *v, int flag, enum mode mode) +{ + char buf[1024]; + snprintb(buf, sizeof(buf), __SYSCTL_PROC_FLAG_BITS, flag); + strprintorsetwidth(v, buf, mode); +} + +static void +printacflag(VAR *v, int flag, enum mode mode) +{ + char buf[1024]; + snprintb(buf, sizeof(buf), __ACCT_FLAG_BITS, flag); + strprintorsetwidth(v, buf, mode); +} + /* * Generic output routines. Print fields from various prototype * structures. @@ -1188,6 +1259,10 @@ printval(void *bp, VAR *v, enum mode mod val = GET(short); vok = VSIGN; break; + case PROCACFLAG: + if (v->flag & ALTPR) + break; + /*FALLTHROUGH*/ case USHORT: uval = CHK_INF127(GET(u_short)); vok = VUNSIGN; @@ -1196,6 +1271,10 @@ printval(void *bp, VAR *v, enum mode mod val = GET(int32_t); vok = VSIGN; break; + case PROCFLAG: + if (v->flag & ALTPR) + break; + /*FALLTHROUGH*/ case INT: val = GET(int); vok = VSIGN; @@ -1286,9 +1365,21 @@ printval(void *bp, VAR *v, enum mode mod case SHORT: (void)printf(ofmt, width, GET(short)); return; + case PROCACFLAG: + if (v->flag & ALTPR) { + printacflag(v, CHK_INF127(GET(u_short)), mode); + return; + } + /*FALLTHROUGH*/ case USHORT: (void)printf(ofmt, width, CHK_INF127(GET(u_short))); return; + case PROCFLAG: + if (v->flag & ALTPR) { + printflag(v, GET(int), mode); + return; + } + /*FALLTHROUGH*/ case INT: (void)printf(ofmt, width, GET(int)); return; @@ -1313,33 +1404,15 @@ printval(void *bp, VAR *v, enum mode mod 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; + case SIGLIST: + printsig(v, (const sigset_t *)(void *)bp, mode); + return; default: errx(EXIT_FAILURE, "unknown type %d", v->type); } Index: src/bin/ps/ps.1 diff -u src/bin/ps/ps.1:1.112 src/bin/ps/ps.1:1.113 --- src/bin/ps/ps.1:1.112 Fri Jun 4 04:16:14 2021 +++ src/bin/ps/ps.1 Tue Sep 14 13:09:18 2021 @@ -1,4 +1,4 @@ -.\" $NetBSD: ps.1,v 1.112 2021/06/04 08:16:14 wiz Exp $ +.\" $NetBSD: ps.1,v 1.113 2021/09/14 17:09:18 christos Exp $ .\" .\" Copyright (c) 1980, 1990, 1991, 1993, 1994 .\" The Regents of the University of California. All rights reserved. @@ -29,7 +29,7 @@ .\" .\" @(#)ps.1 8.3 (Berkeley) 4/18/94 .\" -.Dd August 6, 2019 +.Dd September 14, 2021 .Dt PS 1 .Os .Sh NAME @@ -205,6 +205,9 @@ options. 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. +.Pp +If the keyword is capitalized, then an alternate (symbolic) form of it +is printed, if available. .It Fl p Ar pid Display information associated with the specified process ID. .It Fl r