xref: /openbsd-src/bin/ps/print.c (revision 55449a4bb35a049d6de07a109bfa26688f55c824)
1*55449a4bSflorian /*	$OpenBSD: print.c,v 1.89 2024/04/28 16:43:15 florian Exp $	*/
2df930be7Sderaadt /*	$NetBSD: print.c,v 1.27 1995/09/29 21:58:12 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 
33acd8f640Sderaadt #include <sys/param.h>	/* PZERO NODEV */
34b9fc9a72Sderaadt #include <sys/types.h>
35acd8f640Sderaadt #include <sys/signal.h>
36df930be7Sderaadt #include <sys/proc.h>
37df930be7Sderaadt #include <sys/stat.h>
38df930be7Sderaadt 
39df930be7Sderaadt #include <sys/sysctl.h>
4088009049Sderaadt #define PLEDGENAMES
4188009049Sderaadt #include <sys/pledge.h>
42df930be7Sderaadt 
43df930be7Sderaadt #include <err.h>
4496beb81cSmillert #include <grp.h>
45df930be7Sderaadt #include <kvm.h>
46df930be7Sderaadt #include <math.h>
47df930be7Sderaadt #include <nlist.h>
48df930be7Sderaadt #include <stddef.h>
49df930be7Sderaadt #include <stdio.h>
50df930be7Sderaadt #include <stdlib.h>
51df930be7Sderaadt #include <string.h>
52df930be7Sderaadt #include <unistd.h>
53b9fc9a72Sderaadt #include <limits.h>
54764064c4Smickey #include <pwd.h>
55df930be7Sderaadt 
56df930be7Sderaadt #include "ps.h"
57df930be7Sderaadt 
58df930be7Sderaadt extern kvm_t *kd;
596b176adcSmillert extern int needenv, needcomm, neednlist, commandonly;
60df930be7Sderaadt 
61033e8ff0Sschwarze int mbswprint(const char *, int, int);  /* utf8.c */
62033e8ff0Sschwarze 
63c72b5b24Smillert static char *cmdpart(char *);
64df930be7Sderaadt 
658a7b4502Sderaadt #define	min(a,b)	((a) < (b) ? (a) : (b))
668a7b4502Sderaadt 
67df930be7Sderaadt static char *
cmdpart(char * arg0)6828416801Sderaadt cmdpart(char *arg0)
69df930be7Sderaadt {
70df930be7Sderaadt 	char *cp;
71df930be7Sderaadt 
72df930be7Sderaadt 	return ((cp = strrchr(arg0, '/')) != NULL ? cp + 1 : arg0);
73df930be7Sderaadt }
74df930be7Sderaadt 
75df930be7Sderaadt void
printheader(void)7628416801Sderaadt printheader(void)
77df930be7Sderaadt {
78df930be7Sderaadt 	VAR *v;
79df930be7Sderaadt 	struct varent *vent;
80df930be7Sderaadt 
81f53ee0dcSguenther 	if (!needheader)
82f53ee0dcSguenther 		return;
83df930be7Sderaadt 	for (vent = vhead; vent; vent = vent->next) {
84df930be7Sderaadt 		v = vent->var;
85df930be7Sderaadt 		if (v->flag & LJUST) {
86df930be7Sderaadt 			if (vent->next == NULL)	/* last one */
87df930be7Sderaadt 				(void)printf("%s", v->header);
88df930be7Sderaadt 			else
89df930be7Sderaadt 				(void)printf("%-*s", v->width, v->header);
90df930be7Sderaadt 		} else
91df930be7Sderaadt 			(void)printf("%*s", v->width, v->header);
92df930be7Sderaadt 		if (vent->next != NULL)
93df930be7Sderaadt 			(void)putchar(' ');
94df930be7Sderaadt 	}
95df930be7Sderaadt 	(void)putchar('\n');
96df930be7Sderaadt }
97df930be7Sderaadt 
98cef5a146Sguenther static int
print_comm_name(const struct kinfo_proc * kp,int left,int trail)99cef5a146Sguenther print_comm_name(const struct kinfo_proc *kp, int left, int trail)
100cef5a146Sguenther {
101cef5a146Sguenther 	left -= mbswprint(kp->p_comm, left, trail);
102cef5a146Sguenther 	if (left > 1 && kp->p_name[0] != '\0') {
103cef5a146Sguenther 		putchar('/');
104cef5a146Sguenther 		left--;
105cef5a146Sguenther 		left -= mbswprint(kp->p_name, left, trail);
106cef5a146Sguenther 	}
107cef5a146Sguenther 	return left;
108cef5a146Sguenther }
109cef5a146Sguenther 
110df930be7Sderaadt void
command(const struct pinfo * pi,VARENT * ve)11124ca0f25Sjob command(const struct pinfo *pi, VARENT *ve)
112df930be7Sderaadt {
11324ca0f25Sjob 	const struct kinfo_proc *kp = pi->ki;
114df930be7Sderaadt 	VAR *v;
115ef85c6c7Sderaadt 	int left, wantspace = 0;
116fe96ca78Sderaadt 	char **p;
117df930be7Sderaadt 
118033e8ff0Sschwarze 	/*
119033e8ff0Sschwarze 	 * Determine the available number of display columns.
120033e8ff0Sschwarze 	 * Always decrement and check after writing.
121033e8ff0Sschwarze 	 * No check is needed before mbswprint()
122033e8ff0Sschwarze 	 * and after writing the last data, though.
123033e8ff0Sschwarze 	 */
124033e8ff0Sschwarze 
125df930be7Sderaadt 	v = ve->var;
126df930be7Sderaadt 	if (ve->next != NULL || termwidth != UNLIMITED) {
127df930be7Sderaadt 		if (ve->next == NULL) {
128df930be7Sderaadt 			left = termwidth - (totwidth - v->width);
129df930be7Sderaadt 			if (left < 1) /* already wrapped, just use std width */
130df930be7Sderaadt 				left = v->width;
131df930be7Sderaadt 		} else
132df930be7Sderaadt 			left = v->width;
133df930be7Sderaadt 	} else
134033e8ff0Sschwarze 		left = INT_MAX;
135033e8ff0Sschwarze 
136bb929088Smickey 	if (needenv && kd != NULL) {
137fe96ca78Sderaadt 		char **envp = kvm_getenvv(kd, kp, termwidth);
138fe96ca78Sderaadt 		if ((p = envp) != NULL) {
139df930be7Sderaadt 			while (*p) {
140033e8ff0Sschwarze 				if (wantspace) {
141033e8ff0Sschwarze 					putchar(' ');
142033e8ff0Sschwarze 					left--;
143033e8ff0Sschwarze 				}
144033e8ff0Sschwarze 				left -= mbswprint(*p, left, 0);
145033e8ff0Sschwarze 				if (left == 0)
146033e8ff0Sschwarze 					return;
147df930be7Sderaadt 				p++;
148ef85c6c7Sderaadt 				wantspace = 1;
149df930be7Sderaadt 			}
150df930be7Sderaadt 		}
151fe96ca78Sderaadt 	}
152033e8ff0Sschwarze 
153df930be7Sderaadt 	if (needcomm) {
15424ca0f25Sjob 		if (pi->prefix)
155e41c7237Sjob 			left -= mbswprint(pi->prefix, left, 0);
156df930be7Sderaadt 		if (!commandonly) {
157fe96ca78Sderaadt 			char **argv = NULL;
158fe96ca78Sderaadt 
159bb929088Smickey 			if (kd != NULL) {
1605027561dSguenther 				argv = kvm_getargv(kd, kp, termwidth);
161764064c4Smickey 				if ((p = argv) != NULL) {
162ef85c6c7Sderaadt 					while (*p) {
163033e8ff0Sschwarze 						if (wantspace) {
164033e8ff0Sschwarze 							putchar(' ');
165033e8ff0Sschwarze 							left--;
166033e8ff0Sschwarze 						}
167033e8ff0Sschwarze 						left -= mbswprint(*p, left, 0);
168033e8ff0Sschwarze 						if (left == 0)
169033e8ff0Sschwarze 							return;
170df930be7Sderaadt 						p++;
171ef85c6c7Sderaadt 						wantspace = 1;
172df930be7Sderaadt 					}
173df930be7Sderaadt 				}
174bb929088Smickey 			}
175e30a1d6dSderaadt 			if (argv == NULL || argv[0] == NULL ||
176cef5a146Sguenther 			    kp->p_name[0] != '\0' ||
17790624e93Smillert 			    strcmp(cmdpart(argv[0]), kp->p_comm)) {
178ef85c6c7Sderaadt 				if (wantspace) {
179033e8ff0Sschwarze 					putchar(' ');
180033e8ff0Sschwarze 					if (--left == 0)
181033e8ff0Sschwarze 						return;
182ef85c6c7Sderaadt 				}
183033e8ff0Sschwarze 				putchar('(');
184033e8ff0Sschwarze 				left--;
18566cbf9abStobhe 				left = print_comm_name(kp, left, 0);
186033e8ff0Sschwarze 				if (left == 0)
187033e8ff0Sschwarze 					return;
188033e8ff0Sschwarze 				putchar(')');
189033e8ff0Sschwarze 				left--;
190df930be7Sderaadt 			}
191df930be7Sderaadt 		} else {
192ef85c6c7Sderaadt 			if (wantspace) {
193033e8ff0Sschwarze 				putchar(' ');
194033e8ff0Sschwarze 				left--;
195ef85c6c7Sderaadt 			}
19666cbf9abStobhe 			left = print_comm_name(kp, left, 0);
197df930be7Sderaadt 		}
198df930be7Sderaadt 	}
199033e8ff0Sschwarze 	if (ve->next != NULL)
200033e8ff0Sschwarze 		while (left-- > 0)
201033e8ff0Sschwarze 			putchar(' ');
202ef85c6c7Sderaadt }
203df930be7Sderaadt 
204df930be7Sderaadt void
ucomm(const struct pinfo * pi,VARENT * ve)20524ca0f25Sjob ucomm(const struct pinfo *pi, VARENT *ve)
206df930be7Sderaadt {
20724ca0f25Sjob 	const struct kinfo_proc *kp = pi->ki;
208033e8ff0Sschwarze 	mbswprint(kp->p_comm, ve->var->width, ve->next != NULL);
209df930be7Sderaadt }
210df930be7Sderaadt 
211df930be7Sderaadt void
curwd(const struct pinfo * pi,VARENT * ve)21224ca0f25Sjob curwd(const struct pinfo *pi, VARENT *ve)
213def13f16Snicm {
21424ca0f25Sjob 	const struct kinfo_proc *kp = pi->ki;
215def13f16Snicm 	int name[] = { CTL_KERN, KERN_PROC_CWD, kp->p_pid };
216b9fc9a72Sderaadt 	char path[PATH_MAX];
217def13f16Snicm 	size_t pathlen = sizeof path;
218def13f16Snicm 
219def13f16Snicm 	if (!kvm_sysctl_only || sysctl(name, 3, path, &pathlen, NULL, 0) != 0)
220def13f16Snicm 		*path = '\0';
221def13f16Snicm 
222033e8ff0Sschwarze 	mbswprint(path, ve->var->width, ve->next != NULL);
223def13f16Snicm }
224def13f16Snicm 
225def13f16Snicm void
logname(const struct pinfo * pi,VARENT * ve)22624ca0f25Sjob logname(const struct pinfo *pi, VARENT *ve)
227df930be7Sderaadt {
22824ca0f25Sjob 	const struct kinfo_proc *kp = pi->ki;
229df930be7Sderaadt 	VAR *v;
230df930be7Sderaadt 
231df930be7Sderaadt 	v = ve->var;
23290624e93Smillert 	if (kp->p_login[0]) {
233b9fc9a72Sderaadt 		int n = min(v->width, LOGIN_NAME_MAX);
234033e8ff0Sschwarze 		mbswprint(kp->p_login, n, ve->next != NULL);
235033e8ff0Sschwarze 		if (ve->next != NULL)
236033e8ff0Sschwarze 			while (n++ < v->width)
237033e8ff0Sschwarze 				putchar(' ');
238c36d77e5Sderaadt 	} else
239c2668b32Sderaadt 		(void)printf("%-*s", v->width, "-");
240df930be7Sderaadt }
241df930be7Sderaadt 
24272cf7c21Sguenther #define pgtok(a)	(((unsigned long long)(a)*getpagesize())/1024)
243fc8192a4Skstailey 
244df930be7Sderaadt void
printstate(const struct pinfo * pi,VARENT * ve)24524ca0f25Sjob printstate(const struct pinfo *pi, VARENT *ve)
246df930be7Sderaadt {
24724ca0f25Sjob 	const struct kinfo_proc *kp = pi->ki;
248df930be7Sderaadt 	int flag;
249970ac3e4Sderaadt 	char *cp, state = '\0';
250df930be7Sderaadt 	VAR *v;
251df930be7Sderaadt 	char buf[16];
252df930be7Sderaadt 
253df930be7Sderaadt 	v = ve->var;
25490624e93Smillert 	flag = kp->p_flag;
255df930be7Sderaadt 	cp = buf;
256df930be7Sderaadt 
25790624e93Smillert 	switch (kp->p_stat) {
258df930be7Sderaadt 
259df930be7Sderaadt 	case SSTOP:
260df930be7Sderaadt 		*cp = 'T';
261df930be7Sderaadt 		break;
262df930be7Sderaadt 
263df930be7Sderaadt 	case SSLEEP:
264a871de46Sheko 		if (flag & P_SINTR)	/* interruptible (long) */
26590624e93Smillert 			*cp = kp->p_slptime >= maxslp ? 'I' : 'S';
266df930be7Sderaadt 		else
267df930be7Sderaadt 			*cp = 'D';
268df930be7Sderaadt 		break;
269df930be7Sderaadt 
270df930be7Sderaadt 	case SRUN:
271df930be7Sderaadt 	case SIDL:
2722876d274Smarkus 	case SONPROC:
273970ac3e4Sderaadt 		state = *cp = 'R';
274df930be7Sderaadt 		break;
275df930be7Sderaadt 
276644b4788Sguenther 	case SDEAD:
277df930be7Sderaadt 		*cp = 'Z';
278df930be7Sderaadt 		break;
279df930be7Sderaadt 
280df930be7Sderaadt 	default:
281df930be7Sderaadt 		*cp = '?';
282df930be7Sderaadt 	}
283df930be7Sderaadt 	cp++;
284970ac3e4Sderaadt 
28590624e93Smillert 	if (kp->p_nice < NZERO)
286df930be7Sderaadt 		*cp++ = '<';
28790624e93Smillert 	else if (kp->p_nice > NZERO)
288df930be7Sderaadt 		*cp++ = 'N';
289447f61ceSguenther 	if (kp->p_psflags & PS_TRACED)
290df930be7Sderaadt 		*cp++ = 'X';
291644b4788Sguenther 	if ((kp->p_psflags & (PS_EXITING | PS_ZOMBIE)) == PS_EXITING)
292df930be7Sderaadt 		*cp++ = 'E';
293447f61ceSguenther 	if (kp->p_psflags & PS_ISPWAIT)
294df930be7Sderaadt 		*cp++ = 'V';
2953f2d366dSniklas 	if (flag & P_SYSTEM)
2963f2d366dSniklas 		*cp++ = 'K';
2973f2d366dSniklas 	if ((flag & P_SYSTEM) == 0 &&
29890624e93Smillert 	    kp->p_rlim_rss_cur / 1024 < pgtok(kp->p_vm_rssize))
299fc8192a4Skstailey 		*cp++ = '>';
30090624e93Smillert 	if (kp->p_eflag & EPROC_SLEADER)
301df930be7Sderaadt 		*cp++ = 's';
302447f61ceSguenther 	if ((kp->p_psflags & PS_CONTROLT) && kp->p__pgid == kp->p_tpgid)
303df930be7Sderaadt 		*cp++ = '+';
3040bd1216cSderaadt 	if (kp->p_psflags & PS_PLEDGE)
3050bd1216cSderaadt 		*cp++ = 'p';
3068d8661adSderaadt 	if (kp->p_eflag & EPROC_UNVEIL) {
3078d8661adSderaadt 		if (kp->p_eflag & EPROC_LKUNVEIL)
3088d8661adSderaadt 			*cp++ = 'U';
3098d8661adSderaadt 		else
3108d8661adSderaadt 			*cp++ = 'u';
3118d8661adSderaadt 	}
312f1e82477Srob 	if (kp->p_psflags & PS_CHROOT)
313f1e82477Srob 		*cp++ = 'c';
314df930be7Sderaadt 	*cp = '\0';
315970ac3e4Sderaadt 
3161601eb99Sguenther 	if (state == 'R' && kp->p_cpuid != KI_NOCPU) {
317970ac3e4Sderaadt 		char pbuf[16];
318970ac3e4Sderaadt 
3191717b5a3Schl 		snprintf(pbuf, sizeof pbuf, "/%llu", kp->p_cpuid);
320970ac3e4Sderaadt 		*++cp = '\0';
321970ac3e4Sderaadt 		strlcat(buf, pbuf, sizeof buf);
322970ac3e4Sderaadt 		cp = buf + strlen(buf);
323970ac3e4Sderaadt 	}
324970ac3e4Sderaadt 
325df930be7Sderaadt 	(void)printf("%-*s", v->width, buf);
326df930be7Sderaadt }
327df930be7Sderaadt 
328df930be7Sderaadt void
printpledge(const struct pinfo * pi,VARENT * ve)32924ca0f25Sjob printpledge(const struct pinfo *pi, VARENT *ve)
33088009049Sderaadt {
33124ca0f25Sjob 	const struct kinfo_proc *kp = pi->ki;
3324e12c66fSkn 	int i;
33388009049Sderaadt 	VAR *v;
33488009049Sderaadt 	char buf[1024];
33588009049Sderaadt 
33688009049Sderaadt 	v = ve->var;
33788009049Sderaadt 	buf[0] = '\0';
33888009049Sderaadt 
33988009049Sderaadt 	for (i = 0; pledgenames[i].bits != 0; i++) {
34088009049Sderaadt 		if (pledgenames[i].bits & kp->p_pledge) {
34188009049Sderaadt 			if (*buf != '\0')
34288009049Sderaadt 				strlcat(buf, ",", sizeof buf);
34388009049Sderaadt 			strlcat(buf, pledgenames[i].name, sizeof buf);
34488009049Sderaadt 		}
34588009049Sderaadt 	}
34688009049Sderaadt 
34788009049Sderaadt 	(void)printf("%-*s", v->width, buf);
34888009049Sderaadt }
34988009049Sderaadt 
35088009049Sderaadt void
pri(const struct pinfo * pi,VARENT * ve)35124ca0f25Sjob pri(const struct pinfo *pi, VARENT *ve)
352df930be7Sderaadt {
35324ca0f25Sjob 	const struct kinfo_proc *kp = pi->ki;
354df930be7Sderaadt 	VAR *v;
355df930be7Sderaadt 
356df930be7Sderaadt 	v = ve->var;
35790624e93Smillert 	(void)printf("%*d", v->width, kp->p_priority - PZERO);
358df930be7Sderaadt }
359df930be7Sderaadt 
360df930be7Sderaadt void
pnice(const struct pinfo * pi,VARENT * ve)36124ca0f25Sjob pnice(const struct pinfo *pi, VARENT *ve)
3622242bec2Shugh {
36324ca0f25Sjob 	const struct kinfo_proc *kp = pi->ki;
3642242bec2Shugh 	VAR *v;
36524ca0f25Sjob 
3662242bec2Shugh 	v = ve->var;
3672242bec2Shugh 	(void)printf("%*d", v->width, kp->p_nice - NZERO);
3682242bec2Shugh }
3692242bec2Shugh 
3702242bec2Shugh void
euname(const struct pinfo * pi,VARENT * ve)37124ca0f25Sjob euname(const struct pinfo *pi, VARENT *ve)
372df930be7Sderaadt {
37324ca0f25Sjob 	const struct kinfo_proc *kp = pi->ki;
37424ca0f25Sjob 
375033e8ff0Sschwarze 	mbswprint(user_from_uid(kp->p_uid, 0), ve->var->width,
376033e8ff0Sschwarze 	    ve->next != NULL);
377df930be7Sderaadt }
378df930be7Sderaadt 
379df930be7Sderaadt void
runame(const struct pinfo * pi,VARENT * ve)38024ca0f25Sjob runame(const struct pinfo *pi, VARENT *ve)
381df930be7Sderaadt {
38224ca0f25Sjob 	const struct kinfo_proc *kp = pi->ki;
38324ca0f25Sjob 
384033e8ff0Sschwarze 	mbswprint(user_from_uid(kp->p_ruid, 0), ve->var->width,
385033e8ff0Sschwarze 	    ve->next != NULL);
386df930be7Sderaadt }
387df930be7Sderaadt 
388df930be7Sderaadt void
gname(const struct pinfo * pi,VARENT * ve)38924ca0f25Sjob gname(const struct pinfo *pi, VARENT *ve)
39050b7cf99Skstailey {
39124ca0f25Sjob 	const struct kinfo_proc *kp = pi->ki;
39224ca0f25Sjob 
393033e8ff0Sschwarze 	mbswprint(group_from_gid(kp->p_gid, 0), ve->var->width,
394033e8ff0Sschwarze 	    ve->next != NULL);
39550b7cf99Skstailey }
39650b7cf99Skstailey 
39750b7cf99Skstailey void
rgname(const struct pinfo * pi,VARENT * ve)39824ca0f25Sjob rgname(const struct pinfo *pi, VARENT *ve)
39950b7cf99Skstailey {
40024ca0f25Sjob 	const struct kinfo_proc *kp = pi->ki;
40124ca0f25Sjob 
402033e8ff0Sschwarze 	mbswprint(group_from_gid(kp->p_rgid, 0), ve->var->width,
403033e8ff0Sschwarze 	    ve->next != NULL);
40450b7cf99Skstailey }
40550b7cf99Skstailey 
40650b7cf99Skstailey void
supgid(const struct pinfo * pi,VARENT * ve)40724ca0f25Sjob supgid(const struct pinfo *pi, VARENT *ve)
408ba85321fSchrisz {
40924ca0f25Sjob 	const struct kinfo_proc *kp = pi->ki;
410ba85321fSchrisz 	char buf[1024];
411ba85321fSchrisz 	char *p = buf;
412ba85321fSchrisz 	ssize_t size = sizeof(buf);
413ba85321fSchrisz 	int i, len;
414ba85321fSchrisz 
415ba85321fSchrisz 	for (i = 0; i < kp->p_ngroups; i++) {
416ba85321fSchrisz 		len = snprintf(p, size, "%s%u",
417ba85321fSchrisz 		    p == buf ? "" : ",",
418ba85321fSchrisz 		    kp->p_groups[i]);
419ba85321fSchrisz 		if (len < 0 || len >= size)
420ba85321fSchrisz 			break;
421ba85321fSchrisz 		p += len;
422ba85321fSchrisz 		size -= len;
423ba85321fSchrisz 	}
424ba85321fSchrisz 
425ba85321fSchrisz 	(void)printf("%-*s", ve->var->width, buf);
426ba85321fSchrisz }
427ba85321fSchrisz 
428ba85321fSchrisz void
supgrp(const struct pinfo * pi,VARENT * ve)42924ca0f25Sjob supgrp(const struct pinfo *pi, VARENT *ve)
430ba85321fSchrisz {
43124ca0f25Sjob 	const struct kinfo_proc *kp = pi->ki;
432ba85321fSchrisz 	char buf[1024];
433ba85321fSchrisz 	char *p = buf;
434ba85321fSchrisz 	ssize_t size = sizeof(buf);
435ba85321fSchrisz 	int i, len;
436ba85321fSchrisz 
437ba85321fSchrisz 	for (i = 0; i < kp->p_ngroups; i++) {
438ba85321fSchrisz 		len = snprintf(p, size, "%s%s",
439ba85321fSchrisz 		    p == buf ? "" : ",",
440ba85321fSchrisz 		    group_from_gid(kp->p_groups[i], 0));
441ba85321fSchrisz 		if (len < 0 || len >= size)
442ba85321fSchrisz 			break;
443ba85321fSchrisz 		p += len;
444ba85321fSchrisz 		size -= len;
445ba85321fSchrisz 	}
446ba85321fSchrisz 
447ba85321fSchrisz 	(void)printf("%-*s", ve->var->width, buf);
448ba85321fSchrisz }
449ba85321fSchrisz 
450ba85321fSchrisz void
tdev(const struct pinfo * pi,VARENT * ve)45124ca0f25Sjob tdev(const struct pinfo *pi, VARENT *ve)
452df930be7Sderaadt {
45324ca0f25Sjob 	const struct kinfo_proc *kp = pi->ki;
454df930be7Sderaadt 	VAR *v;
455df930be7Sderaadt 	dev_t dev;
456df930be7Sderaadt 
457df930be7Sderaadt 	v = ve->var;
45890624e93Smillert 	dev = kp->p_tdev;
459df930be7Sderaadt 	if (dev == NODEV)
460df930be7Sderaadt 		(void)printf("%*s", v->width, "??");
461df930be7Sderaadt 	else {
462705b0c5cSderaadt 		char buff[10+1+10+1];
463705b0c5cSderaadt 
464df930be7Sderaadt 		(void)snprintf(buff, sizeof(buff),
4657aa9f692Sderaadt 		    "%u/%u", major(dev), minor(dev));
466df930be7Sderaadt 		(void)printf("%*s", v->width, buff);
467df930be7Sderaadt 	}
468df930be7Sderaadt }
469df930be7Sderaadt 
470df930be7Sderaadt void
tname(const struct pinfo * pi,VARENT * ve)47124ca0f25Sjob tname(const struct pinfo *pi, VARENT *ve)
472df930be7Sderaadt {
47324ca0f25Sjob 	const struct kinfo_proc *kp = pi->ki;
474df930be7Sderaadt 	VAR *v;
475df930be7Sderaadt 	dev_t dev;
476df930be7Sderaadt 	char *ttname;
477df930be7Sderaadt 
478df930be7Sderaadt 	v = ve->var;
47990624e93Smillert 	dev = kp->p_tdev;
480df930be7Sderaadt 	if (dev == NODEV || (ttname = devname(dev, S_IFCHR)) == NULL)
481df930be7Sderaadt 		(void)printf("%-*s", v->width, "??");
482df930be7Sderaadt 	else {
483df930be7Sderaadt 		if (strncmp(ttname, "tty", 3) == 0)
484df930be7Sderaadt 			ttname += 3;
485df930be7Sderaadt 		(void)printf("%*.*s%c", v->width-1, v->width-1, ttname,
48690624e93Smillert 			kp->p_eflag & EPROC_CTTY ? ' ' : '-');
487df930be7Sderaadt 	}
488df930be7Sderaadt }
489df930be7Sderaadt 
490df930be7Sderaadt void
longtname(const struct pinfo * pi,VARENT * ve)49124ca0f25Sjob longtname(const struct pinfo *pi, VARENT *ve)
492df930be7Sderaadt {
49324ca0f25Sjob 	const struct kinfo_proc *kp = pi->ki;
494df930be7Sderaadt 	VAR *v;
495df930be7Sderaadt 	dev_t dev;
496df930be7Sderaadt 	char *ttname;
497df930be7Sderaadt 
498df930be7Sderaadt 	v = ve->var;
49990624e93Smillert 	dev = kp->p_tdev;
500df930be7Sderaadt 	if (dev == NODEV || (ttname = devname(dev, S_IFCHR)) == NULL)
501df930be7Sderaadt 		(void)printf("%-*s", v->width, "??");
502df930be7Sderaadt 	else
503df930be7Sderaadt 		(void)printf("%-*s", v->width, ttname);
504df930be7Sderaadt }
505df930be7Sderaadt 
506df930be7Sderaadt void
started(const struct pinfo * pi,VARENT * ve)50724ca0f25Sjob started(const struct pinfo *pi, VARENT *ve)
508df930be7Sderaadt {
50924ca0f25Sjob 	const struct kinfo_proc *kp = pi->ki;
510df930be7Sderaadt 	VAR *v;
511df930be7Sderaadt 	static time_t now;
512df930be7Sderaadt 	time_t startt;
513df930be7Sderaadt 	struct tm *tp;
514df930be7Sderaadt 	char buf[100];
515df930be7Sderaadt 
516df930be7Sderaadt 	v = ve->var;
51790624e93Smillert 	if (!kp->p_uvalid) {
518df930be7Sderaadt 		(void)printf("%-*s", v->width, "-");
519df930be7Sderaadt 		return;
520df930be7Sderaadt 	}
521df930be7Sderaadt 
522f7055df5Smillert #define SECSPERHOUR	(60 * 60)
523f7055df5Smillert #define SECSPERDAY	(24 * 60 * 60)
524f7055df5Smillert 
52590624e93Smillert 	startt = kp->p_ustart_sec;
526df930be7Sderaadt 	tp = localtime(&startt);
527*55449a4bSflorian 	if (tp == NULL) {
528*55449a4bSflorian 		(void)printf("%-*s", v->width, "-");
529*55449a4bSflorian 		return;
530*55449a4bSflorian 	}
531df930be7Sderaadt 	if (!now)
532df930be7Sderaadt 		(void)time(&now);
5330c6ce285Stedu 	if (now - kp->p_ustart_sec < 12 * SECSPERHOUR) {
534d5db78f1Snaddy 		(void)strftime(buf, sizeof(buf) - 1, "%l:%M%p", tp);
53590624e93Smillert 	} else if (now - kp->p_ustart_sec < 7 * SECSPERDAY) {
536d5db78f1Snaddy 		(void)strftime(buf, sizeof(buf) - 1, "%a%I%p", tp);
537df930be7Sderaadt 	} else
538df930be7Sderaadt 		(void)strftime(buf, sizeof(buf) - 1, "%e%b%y", tp);
539df930be7Sderaadt 	(void)printf("%-*s", v->width, buf);
540df930be7Sderaadt }
541df930be7Sderaadt 
542df930be7Sderaadt void
lstarted(const struct pinfo * pi,VARENT * ve)54324ca0f25Sjob lstarted(const struct pinfo *pi, VARENT *ve)
544df930be7Sderaadt {
54524ca0f25Sjob 	const struct kinfo_proc *kp = pi->ki;
546df930be7Sderaadt 	VAR *v;
547df930be7Sderaadt 	time_t startt;
548df930be7Sderaadt 	char buf[100];
549df930be7Sderaadt 
550df930be7Sderaadt 	v = ve->var;
55190624e93Smillert 	if (!kp->p_uvalid) {
552df930be7Sderaadt 		(void)printf("%-*s", v->width, "-");
553df930be7Sderaadt 		return;
554df930be7Sderaadt 	}
55590624e93Smillert 	startt = kp->p_ustart_sec;
556d1417a94Sderaadt 	(void)strftime(buf, sizeof(buf) -1, "%c",
557df930be7Sderaadt 	    localtime(&startt));
558df930be7Sderaadt 	(void)printf("%-*s", v->width, buf);
559df930be7Sderaadt }
560df930be7Sderaadt 
elapsed(const struct pinfo * pi,VARENT * ve)56124ca0f25Sjob void elapsed(const struct pinfo *pi, VARENT *ve)
562588f7f8cStedu {
56324ca0f25Sjob 	const struct kinfo_proc *kp = pi->ki;
564588f7f8cStedu 	VAR *v;
565588f7f8cStedu 	static time_t now;
566588f7f8cStedu 	time_t secs;
567588f7f8cStedu 	char buf[64];
568588f7f8cStedu 	long days, hours, minutes, seconds;
569588f7f8cStedu 
570588f7f8cStedu 	v = ve->var;
571588f7f8cStedu 	if (!kp->p_uvalid) {
572588f7f8cStedu 		(void)printf("%*s", v->width, "-");
573588f7f8cStedu 		return;
574588f7f8cStedu 	}
575588f7f8cStedu 
576588f7f8cStedu 	if (!now)
577588f7f8cStedu 		(void)time(&now);
578588f7f8cStedu 	secs = now - kp->p_ustart_sec;
579588f7f8cStedu 
580588f7f8cStedu 	if (secs < 0) {
581588f7f8cStedu 		(void)printf("%*s", v->width, "-");
582588f7f8cStedu 		return;
583588f7f8cStedu 	}
584588f7f8cStedu 
585588f7f8cStedu 	days = secs / SECSPERDAY;
586588f7f8cStedu 	secs %= SECSPERDAY;
587588f7f8cStedu 
588588f7f8cStedu 	hours = secs / SECSPERHOUR;
589588f7f8cStedu 	secs %= SECSPERHOUR;
590588f7f8cStedu 
591588f7f8cStedu 	minutes = secs / 60;
592588f7f8cStedu 	seconds = secs % 60;
593588f7f8cStedu 
594588f7f8cStedu 	if (days > 0)
595588f7f8cStedu 		(void)snprintf(buf, sizeof(buf), "%ld-%02ld:%02ld:%02ld",
596588f7f8cStedu 		    days, hours, minutes, seconds);
597588f7f8cStedu 	else if (hours > 0)
598588f7f8cStedu 		(void)snprintf(buf, sizeof(buf), "%02ld:%02ld:%02ld",
599588f7f8cStedu 		    hours, minutes, seconds);
600588f7f8cStedu 	else
601588f7f8cStedu 		(void)snprintf(buf, sizeof(buf), "%02ld:%02ld",
602588f7f8cStedu 		    minutes, seconds);
603588f7f8cStedu 	(void)printf("%*s", v->width, buf);
604588f7f8cStedu }
605588f7f8cStedu 
606df930be7Sderaadt void
wchan(const struct pinfo * pi,VARENT * ve)60724ca0f25Sjob wchan(const struct pinfo *pi, VARENT *ve)
608df930be7Sderaadt {
60924ca0f25Sjob 	const struct kinfo_proc *kp = pi->ki;
610df930be7Sderaadt 	VAR *v;
611df930be7Sderaadt 
612df930be7Sderaadt 	v = ve->var;
613c2c8ed76Stedu 	if (kp->p_wmesg[0]) {
61409431e5cSguenther 		(void)printf("%-*s", (int)v->width, kp->p_wmesg);
615df930be7Sderaadt 	} else
616df930be7Sderaadt 		(void)printf("%-*s", v->width, "-");
617df930be7Sderaadt }
618df930be7Sderaadt 
619df930be7Sderaadt void
vsize(const struct pinfo * pi,VARENT * ve)62024ca0f25Sjob vsize(const struct pinfo *pi, VARENT *ve)
621df930be7Sderaadt {
62224ca0f25Sjob 	const struct kinfo_proc *kp = pi->ki;
623df930be7Sderaadt 	VAR *v;
624df930be7Sderaadt 
625df930be7Sderaadt 	v = ve->var;
62672cf7c21Sguenther 	(void)printf("%*llu", v->width,
62790624e93Smillert 	    pgtok(kp->p_vm_dsize + kp->p_vm_ssize + kp->p_vm_tsize));
628df930be7Sderaadt }
629df930be7Sderaadt 
630df930be7Sderaadt void
rssize(const struct pinfo * pi,VARENT * ve)63124ca0f25Sjob rssize(const struct pinfo *pi, VARENT *ve)
632df930be7Sderaadt {
63324ca0f25Sjob 	const struct kinfo_proc *kp = pi->ki;
634df930be7Sderaadt 	VAR *v;
635df930be7Sderaadt 
636df930be7Sderaadt 	v = ve->var;
637df930be7Sderaadt 	/* XXX don't have info about shared */
63872cf7c21Sguenther 	(void)printf("%*llu", v->width, (kp->p_flag & P_SYSTEM) ? 0 :
63990624e93Smillert 	    pgtok(kp->p_vm_rssize));
640df930be7Sderaadt }
641df930be7Sderaadt 
642df930be7Sderaadt void
p_rssize(const struct pinfo * pi,VARENT * ve)64324ca0f25Sjob p_rssize(const struct pinfo *pi, VARENT *ve)
644df930be7Sderaadt {
64524ca0f25Sjob 	const struct kinfo_proc *kp = pi->ki;
646df930be7Sderaadt 	VAR *v;
647df930be7Sderaadt 
648df930be7Sderaadt 	v = ve->var;
64972cf7c21Sguenther 	(void)printf("%*llu", v->width, (kp->p_flag & P_SYSTEM) ? 0 :
65090624e93Smillert 	    pgtok(kp->p_vm_rssize));
651df930be7Sderaadt }
652df930be7Sderaadt 
653df930be7Sderaadt void
cputime(const struct pinfo * pi,VARENT * ve)65424ca0f25Sjob cputime(const struct pinfo *pi, VARENT *ve)
655df930be7Sderaadt {
65624ca0f25Sjob 	const struct kinfo_proc *kp = pi->ki;
657df930be7Sderaadt 	VAR *v;
658df930be7Sderaadt 	long secs;
659df930be7Sderaadt 	long psecs;	/* "parts" of a second. first micro, then centi */
660df930be7Sderaadt 	char obuff[128];
661df930be7Sderaadt 
662df930be7Sderaadt 	v = ve->var;
663644b4788Sguenther 	if (kp->p_stat == SDEAD || !kp->p_uvalid) {
664df930be7Sderaadt 		secs = 0;
665df930be7Sderaadt 		psecs = 0;
666df930be7Sderaadt 	} else {
667df930be7Sderaadt 		/*
66812ca30a0Stedu 		 * This counts time spent handling interrupts.  XXX
669df930be7Sderaadt 		 */
67090624e93Smillert 		secs = kp->p_rtime_sec;
67190624e93Smillert 		psecs = kp->p_rtime_usec;
672df930be7Sderaadt 		if (sumrusage) {
67390624e93Smillert 			secs += kp->p_uctime_sec;
67490624e93Smillert 			psecs += kp->p_uctime_usec;
675df930be7Sderaadt 		}
676df930be7Sderaadt 		/*
677df930be7Sderaadt 		 * round and scale to 100's
678df930be7Sderaadt 		 */
679df930be7Sderaadt 		psecs = (psecs + 5000) / 10000;
680df930be7Sderaadt 		secs += psecs / 100;
681df930be7Sderaadt 		psecs = psecs % 100;
682df930be7Sderaadt 	}
683df930be7Sderaadt 	(void)snprintf(obuff, sizeof(obuff),
684df930be7Sderaadt 	    "%3ld:%02ld.%02ld", secs/60, secs%60, psecs);
685df930be7Sderaadt 	(void)printf("%*s", v->width, obuff);
686df930be7Sderaadt }
687df930be7Sderaadt 
688df930be7Sderaadt double
getpcpu(const struct kinfo_proc * kp)6895027561dSguenther getpcpu(const struct kinfo_proc *kp)
690df930be7Sderaadt {
6916b176adcSmillert 	if (fscale == 0)
692df930be7Sderaadt 		return (0.0);
693df930be7Sderaadt 
694df930be7Sderaadt #define	fxtofl(fixpt)	((double)(fixpt) / fscale)
695df930be7Sderaadt 
69690624e93Smillert 	return (100.0 * fxtofl(kp->p_pctcpu));
697df930be7Sderaadt }
698df930be7Sderaadt 
699df930be7Sderaadt void
pcpu(const struct pinfo * pi,VARENT * ve)70024ca0f25Sjob pcpu(const struct pinfo *pi, VARENT *ve)
701df930be7Sderaadt {
702df930be7Sderaadt 	VAR *v;
703df930be7Sderaadt 
704df930be7Sderaadt 	v = ve->var;
70524ca0f25Sjob 	(void)printf("%*.1f", v->width, getpcpu(pi->ki));
706df930be7Sderaadt }
707df930be7Sderaadt 
708df930be7Sderaadt double
getpmem(const struct kinfo_proc * kp)7095027561dSguenther getpmem(const struct kinfo_proc *kp)
710df930be7Sderaadt {
711df930be7Sderaadt 	double fracmem;
712df930be7Sderaadt 
7136b176adcSmillert 	if (mempages == 0)
714df930be7Sderaadt 		return (0.0);
715df930be7Sderaadt 
716878d74d8Smiod 	if (kp->p_flag & P_SYSTEM)
717df930be7Sderaadt 		return (0.0);
718df930be7Sderaadt 	/* XXX don't have info about shared */
719d9e14babSderaadt 	fracmem = ((float)kp->p_vm_rssize)/mempages;
720df930be7Sderaadt 	return (100.0 * fracmem);
721df930be7Sderaadt }
722df930be7Sderaadt 
723df930be7Sderaadt void
pmem(const struct pinfo * pi,VARENT * ve)72424ca0f25Sjob pmem(const struct pinfo *pi, VARENT *ve)
725df930be7Sderaadt {
726df930be7Sderaadt 	VAR *v;
727df930be7Sderaadt 
728df930be7Sderaadt 	v = ve->var;
72924ca0f25Sjob 	(void)printf("%*.1f", v->width, getpmem(pi->ki));
730df930be7Sderaadt }
731df930be7Sderaadt 
732df930be7Sderaadt void
pagein(const struct pinfo * pi,VARENT * ve)73324ca0f25Sjob pagein(const struct pinfo *pi, VARENT *ve)
734df930be7Sderaadt {
73524ca0f25Sjob 	const struct kinfo_proc *kp = pi->ki;
736df930be7Sderaadt 	VAR *v;
737df930be7Sderaadt 
738df930be7Sderaadt 	v = ve->var;
73990624e93Smillert 	(void)printf("%*llu", v->width,
74090624e93Smillert 	    kp->p_uvalid ? kp->p_uru_majflt : 0);
741df930be7Sderaadt }
742df930be7Sderaadt 
743df930be7Sderaadt void
maxrss(const struct pinfo * pi,VARENT * ve)74424ca0f25Sjob maxrss(const struct pinfo *pi, VARENT *ve)
745df930be7Sderaadt {
74624ca0f25Sjob 	const struct kinfo_proc *kp = pi->ki;
747df930be7Sderaadt 	VAR *v;
748df930be7Sderaadt 
749df930be7Sderaadt 	v = ve->var;
75072cf7c21Sguenther 	(void)printf("%*llu", v->width, kp->p_rlim_rss_cur / 1024);
751df930be7Sderaadt }
752df930be7Sderaadt 
753df930be7Sderaadt void
tsize(const struct pinfo * pi,VARENT * ve)75424ca0f25Sjob tsize(const struct pinfo *pi, VARENT *ve)
755df930be7Sderaadt {
75624ca0f25Sjob 	const struct kinfo_proc *kp = pi->ki;
757df930be7Sderaadt 	VAR *v;
758df930be7Sderaadt 
759df930be7Sderaadt 	v = ve->var;
76072cf7c21Sguenther 	(void)printf("%*llu", v->width, pgtok(kp->p_vm_tsize));
761df930be7Sderaadt }
762df930be7Sderaadt 
763ab0c1884Smickey void
dsize(const struct pinfo * pi,VARENT * ve)76424ca0f25Sjob dsize(const struct pinfo *pi, VARENT *ve)
765ab0c1884Smickey {
76624ca0f25Sjob 	const struct kinfo_proc *kp = pi->ki;
767ab0c1884Smickey 	VAR *v;
768ab0c1884Smickey 
769ab0c1884Smickey 	v = ve->var;
77072cf7c21Sguenther 	(void)printf("%*llu", v->width, pgtok(kp->p_vm_dsize));
771ab0c1884Smickey }
772ab0c1884Smickey 
773ab0c1884Smickey void
ssize(const struct pinfo * pi,VARENT * ve)77424ca0f25Sjob ssize(const struct pinfo *pi, VARENT *ve)
775ab0c1884Smickey {
77624ca0f25Sjob 	const struct kinfo_proc *kp = pi->ki;
777ab0c1884Smickey 	VAR *v;
778ab0c1884Smickey 
779ab0c1884Smickey 	v = ve->var;
78072cf7c21Sguenther 	(void)printf("%*llu", v->width, pgtok(kp->p_vm_ssize));
781ab0c1884Smickey }
782ab0c1884Smickey 
783df930be7Sderaadt /*
784df930be7Sderaadt  * Generic output routines.  Print fields from various prototype
785df930be7Sderaadt  * structures.
786df930be7Sderaadt  */
787df930be7Sderaadt static void
printval(char * bp,VAR * v)78828416801Sderaadt printval(char *bp, VAR *v)
789df930be7Sderaadt {
79090624e93Smillert 	char ofmt[32];
791df930be7Sderaadt 
79290624e93Smillert 	snprintf(ofmt, sizeof(ofmt), "%%%s*%s", (v->flag & LJUST) ? "-" : "",
79390624e93Smillert 	    v->fmt);
794df930be7Sderaadt 
795df930be7Sderaadt 	/*
796df930be7Sderaadt 	 * Note that the "INF127" check is nonsensical for types
797df930be7Sderaadt 	 * that are or can be signed.
798df930be7Sderaadt 	 */
799df930be7Sderaadt #define	GET(type)		(*(type *)bp)
800df930be7Sderaadt #define	CHK_INF127(n)		(((n) > 127) && (v->flag & INF127) ? 127 : (n))
801df930be7Sderaadt 
802df930be7Sderaadt 	switch (v->type) {
80390624e93Smillert 	case INT8:
80490624e93Smillert 		(void)printf(ofmt, v->width, GET(int8_t));
80590624e93Smillert 		break;
80690624e93Smillert 	case UINT8:
80790624e93Smillert 		(void)printf(ofmt, v->width, CHK_INF127(GET(u_int8_t)));
80890624e93Smillert 		break;
80990624e93Smillert 	case INT16:
81090624e93Smillert 		(void)printf(ofmt, v->width, GET(int16_t));
81190624e93Smillert 		break;
81290624e93Smillert 	case UINT16:
81390624e93Smillert 		(void)printf(ofmt, v->width, CHK_INF127(GET(u_int16_t)));
81490624e93Smillert 		break;
815df930be7Sderaadt 	case INT32:
81690624e93Smillert 		(void)printf(ofmt, v->width, GET(int32_t));
817df930be7Sderaadt 		break;
818df930be7Sderaadt 	case UINT32:
81990624e93Smillert 		(void)printf(ofmt, v->width, CHK_INF127(GET(u_int32_t)));
820df930be7Sderaadt 		break;
82190624e93Smillert 	case INT64:
82290624e93Smillert 		(void)printf(ofmt, v->width, GET(int64_t));
823e130e40bSmoritz 		break;
82490624e93Smillert 	case UINT64:
82590624e93Smillert 		(void)printf(ofmt, v->width, CHK_INF127(GET(u_int64_t)));
826df930be7Sderaadt 		break;
827df930be7Sderaadt 	default:
828df930be7Sderaadt 		errx(1, "unknown type %d", v->type);
829df930be7Sderaadt 	}
830df930be7Sderaadt #undef GET
831df930be7Sderaadt #undef CHK_INF127
832df930be7Sderaadt }
833df930be7Sderaadt 
834df930be7Sderaadt void
pvar(const struct pinfo * pi,VARENT * ve)83524ca0f25Sjob pvar(const struct pinfo *pi, VARENT *ve)
836df930be7Sderaadt {
83724ca0f25Sjob 	const struct kinfo_proc *kp = pi->ki;
838df930be7Sderaadt 	VAR *v;
839df930be7Sderaadt 
840df930be7Sderaadt 	v = ve->var;
84190624e93Smillert 	if ((v->flag & USER) && !kp->p_uvalid)
842df930be7Sderaadt 		(void)printf("%*s", v->width, "-");
843df930be7Sderaadt 	else
84490624e93Smillert 		printval((char *)kp + v->off, v);
845df930be7Sderaadt }
846