xref: /minix3/bin/ps/print.c (revision 97189037b1c31a92749a06453951cb811bee1eb0)
1*97189037SDavid van Moolenbroek /*	$NetBSD: print.c,v 1.123 2014/11/15 01:58:34 joerg Exp $	*/
2*97189037SDavid van Moolenbroek 
3*97189037SDavid van Moolenbroek /*
4*97189037SDavid van Moolenbroek  * Copyright (c) 2000, 2007 The NetBSD Foundation, Inc.
5*97189037SDavid van Moolenbroek  * All rights reserved.
6*97189037SDavid van Moolenbroek  *
7*97189037SDavid van Moolenbroek  * This code is derived from software contributed to The NetBSD Foundation
8*97189037SDavid van Moolenbroek  * by Simon Burge.
9*97189037SDavid van Moolenbroek  *
10*97189037SDavid van Moolenbroek  * Redistribution and use in source and binary forms, with or without
11*97189037SDavid van Moolenbroek  * modification, are permitted provided that the following conditions
12*97189037SDavid van Moolenbroek  * are met:
13*97189037SDavid van Moolenbroek  * 1. Redistributions of source code must retain the above copyright
14*97189037SDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer.
15*97189037SDavid van Moolenbroek  * 2. Redistributions in binary form must reproduce the above copyright
16*97189037SDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer in the
17*97189037SDavid van Moolenbroek  *    documentation and/or other materials provided with the distribution.
18*97189037SDavid van Moolenbroek  *
19*97189037SDavid van Moolenbroek  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20*97189037SDavid van Moolenbroek  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21*97189037SDavid van Moolenbroek  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22*97189037SDavid van Moolenbroek  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23*97189037SDavid van Moolenbroek  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24*97189037SDavid van Moolenbroek  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25*97189037SDavid van Moolenbroek  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26*97189037SDavid van Moolenbroek  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27*97189037SDavid van Moolenbroek  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28*97189037SDavid van Moolenbroek  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29*97189037SDavid van Moolenbroek  * POSSIBILITY OF SUCH DAMAGE.
30*97189037SDavid van Moolenbroek  */
31*97189037SDavid van Moolenbroek 
32*97189037SDavid van Moolenbroek /*
33*97189037SDavid van Moolenbroek  * Copyright (c) 1990, 1993, 1994
34*97189037SDavid van Moolenbroek  *	The Regents of the University of California.  All rights reserved.
35*97189037SDavid van Moolenbroek  *
36*97189037SDavid van Moolenbroek  * Redistribution and use in source and binary forms, with or without
37*97189037SDavid van Moolenbroek  * modification, are permitted provided that the following conditions
38*97189037SDavid van Moolenbroek  * are met:
39*97189037SDavid van Moolenbroek  * 1. Redistributions of source code must retain the above copyright
40*97189037SDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer.
41*97189037SDavid van Moolenbroek  * 2. Redistributions in binary form must reproduce the above copyright
42*97189037SDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer in the
43*97189037SDavid van Moolenbroek  *    documentation and/or other materials provided with the distribution.
44*97189037SDavid van Moolenbroek  * 3. Neither the name of the University nor the names of its contributors
45*97189037SDavid van Moolenbroek  *    may be used to endorse or promote products derived from this software
46*97189037SDavid van Moolenbroek  *    without specific prior written permission.
47*97189037SDavid van Moolenbroek  *
48*97189037SDavid van Moolenbroek  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
49*97189037SDavid van Moolenbroek  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
50*97189037SDavid van Moolenbroek  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
51*97189037SDavid van Moolenbroek  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
52*97189037SDavid van Moolenbroek  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
53*97189037SDavid van Moolenbroek  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
54*97189037SDavid van Moolenbroek  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
55*97189037SDavid van Moolenbroek  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
56*97189037SDavid van Moolenbroek  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
57*97189037SDavid van Moolenbroek  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
58*97189037SDavid van Moolenbroek  * SUCH DAMAGE.
59*97189037SDavid van Moolenbroek  */
60*97189037SDavid van Moolenbroek 
61*97189037SDavid van Moolenbroek #include <sys/cdefs.h>
62*97189037SDavid van Moolenbroek #ifndef lint
63*97189037SDavid van Moolenbroek #if 0
64*97189037SDavid van Moolenbroek static char sccsid[] = "@(#)print.c	8.6 (Berkeley) 4/16/94";
65*97189037SDavid van Moolenbroek #else
66*97189037SDavid van Moolenbroek __RCSID("$NetBSD: print.c,v 1.123 2014/11/15 01:58:34 joerg Exp $");
67*97189037SDavid van Moolenbroek #endif
68*97189037SDavid van Moolenbroek #endif /* not lint */
69*97189037SDavid van Moolenbroek 
70*97189037SDavid van Moolenbroek #include <sys/param.h>
71*97189037SDavid van Moolenbroek #include <sys/time.h>
72*97189037SDavid van Moolenbroek #include <sys/resource.h>
73*97189037SDavid van Moolenbroek #include <sys/lwp.h>
74*97189037SDavid van Moolenbroek #include <sys/proc.h>
75*97189037SDavid van Moolenbroek #include <sys/stat.h>
76*97189037SDavid van Moolenbroek #include <sys/ucred.h>
77*97189037SDavid van Moolenbroek #include <sys/sysctl.h>
78*97189037SDavid van Moolenbroek 
79*97189037SDavid van Moolenbroek #include <err.h>
80*97189037SDavid van Moolenbroek #include <grp.h>
81*97189037SDavid van Moolenbroek #include <kvm.h>
82*97189037SDavid van Moolenbroek #include <math.h>
83*97189037SDavid van Moolenbroek #include <nlist.h>
84*97189037SDavid van Moolenbroek #include <pwd.h>
85*97189037SDavid van Moolenbroek #include <stddef.h>
86*97189037SDavid van Moolenbroek #include <stdio.h>
87*97189037SDavid van Moolenbroek #include <stdlib.h>
88*97189037SDavid van Moolenbroek #include <string.h>
89*97189037SDavid van Moolenbroek #include <time.h>
90*97189037SDavid van Moolenbroek #include <tzfile.h>
91*97189037SDavid van Moolenbroek #include <unistd.h>
92*97189037SDavid van Moolenbroek 
93*97189037SDavid van Moolenbroek #include "ps.h"
94*97189037SDavid van Moolenbroek 
95*97189037SDavid van Moolenbroek static char *cmdpart(char *);
96*97189037SDavid van Moolenbroek static void  printval(void *, VAR *, enum mode);
97*97189037SDavid van Moolenbroek static int   titlecmp(char *, char **);
98*97189037SDavid van Moolenbroek 
99*97189037SDavid van Moolenbroek static void  doubleprintorsetwidth(VAR *, double, int, enum mode);
100*97189037SDavid van Moolenbroek static void  intprintorsetwidth(VAR *, int, enum mode);
101*97189037SDavid van Moolenbroek static void  strprintorsetwidth(VAR *, const char *, enum mode);
102*97189037SDavid van Moolenbroek 
103*97189037SDavid van Moolenbroek static time_t now;
104*97189037SDavid van Moolenbroek 
105*97189037SDavid van Moolenbroek #define	min(a,b)	((a) <= (b) ? (a) : (b))
106*97189037SDavid van Moolenbroek 
107*97189037SDavid van Moolenbroek static int
iwidth(u_int64_t v)108*97189037SDavid van Moolenbroek iwidth(u_int64_t v)
109*97189037SDavid van Moolenbroek {
110*97189037SDavid van Moolenbroek 	u_int64_t nlim, lim;
111*97189037SDavid van Moolenbroek 	int w = 1;
112*97189037SDavid van Moolenbroek 
113*97189037SDavid van Moolenbroek 	for (lim = 10; v >= lim; lim = nlim) {
114*97189037SDavid van Moolenbroek 		nlim = lim * 10;
115*97189037SDavid van Moolenbroek 		w++;
116*97189037SDavid van Moolenbroek 		if (nlim < lim)
117*97189037SDavid van Moolenbroek 			break;
118*97189037SDavid van Moolenbroek 	}
119*97189037SDavid van Moolenbroek 	return w;
120*97189037SDavid van Moolenbroek }
121*97189037SDavid van Moolenbroek 
122*97189037SDavid van Moolenbroek static char *
cmdpart(char * arg0)123*97189037SDavid van Moolenbroek cmdpart(char *arg0)
124*97189037SDavid van Moolenbroek {
125*97189037SDavid van Moolenbroek 	char *cp;
126*97189037SDavid van Moolenbroek 
127*97189037SDavid van Moolenbroek 	return ((cp = strrchr(arg0, '/')) != NULL ? cp + 1 : arg0);
128*97189037SDavid van Moolenbroek }
129*97189037SDavid van Moolenbroek 
130*97189037SDavid van Moolenbroek void
printheader(void)131*97189037SDavid van Moolenbroek printheader(void)
132*97189037SDavid van Moolenbroek {
133*97189037SDavid van Moolenbroek 	int len;
134*97189037SDavid van Moolenbroek 	VAR *v;
135*97189037SDavid van Moolenbroek 	struct varent *vent;
136*97189037SDavid van Moolenbroek 	static int firsttime = 1;
137*97189037SDavid van Moolenbroek 	static int noheader = 0;
138*97189037SDavid van Moolenbroek 
139*97189037SDavid van Moolenbroek 	/*
140*97189037SDavid van Moolenbroek 	 * If all the columns have user-specified null headers,
141*97189037SDavid van Moolenbroek 	 * don't print the blank header line at all.
142*97189037SDavid van Moolenbroek 	 */
143*97189037SDavid van Moolenbroek 	if (firsttime) {
144*97189037SDavid van Moolenbroek 		SIMPLEQ_FOREACH(vent, &displaylist, next) {
145*97189037SDavid van Moolenbroek 			if (vent->var->header[0])
146*97189037SDavid van Moolenbroek 				break;
147*97189037SDavid van Moolenbroek 		}
148*97189037SDavid van Moolenbroek 		if (vent == NULL) {
149*97189037SDavid van Moolenbroek 			noheader = 1;
150*97189037SDavid van Moolenbroek 			firsttime = 0;
151*97189037SDavid van Moolenbroek 		}
152*97189037SDavid van Moolenbroek 
153*97189037SDavid van Moolenbroek 	}
154*97189037SDavid van Moolenbroek 	if (noheader)
155*97189037SDavid van Moolenbroek 		return;
156*97189037SDavid van Moolenbroek 
157*97189037SDavid van Moolenbroek 	SIMPLEQ_FOREACH(vent, &displaylist, next) {
158*97189037SDavid van Moolenbroek 		v = vent->var;
159*97189037SDavid van Moolenbroek 		if (firsttime) {
160*97189037SDavid van Moolenbroek 			len = strlen(v->header);
161*97189037SDavid van Moolenbroek 			if (len > v->width)
162*97189037SDavid van Moolenbroek 				v->width = len;
163*97189037SDavid van Moolenbroek 			totwidth += v->width + 1;	/* +1 for space */
164*97189037SDavid van Moolenbroek 		}
165*97189037SDavid van Moolenbroek 		if (v->flag & LJUST) {
166*97189037SDavid van Moolenbroek 			if (SIMPLEQ_NEXT(vent, next) == NULL)	/* last one */
167*97189037SDavid van Moolenbroek 				(void)printf("%s", v->header);
168*97189037SDavid van Moolenbroek 			else
169*97189037SDavid van Moolenbroek 				(void)printf("%-*s", v->width,
170*97189037SDavid van Moolenbroek 				    v->header);
171*97189037SDavid van Moolenbroek 		} else
172*97189037SDavid van Moolenbroek 			(void)printf("%*s", v->width, v->header);
173*97189037SDavid van Moolenbroek 		if (SIMPLEQ_NEXT(vent, next) != NULL)
174*97189037SDavid van Moolenbroek 			(void)putchar(' ');
175*97189037SDavid van Moolenbroek 	}
176*97189037SDavid van Moolenbroek 	(void)putchar('\n');
177*97189037SDavid van Moolenbroek 	if (firsttime) {
178*97189037SDavid van Moolenbroek 		firsttime = 0;
179*97189037SDavid van Moolenbroek 		totwidth--;	/* take off last space */
180*97189037SDavid van Moolenbroek 	}
181*97189037SDavid van Moolenbroek }
182*97189037SDavid van Moolenbroek 
183*97189037SDavid van Moolenbroek /*
184*97189037SDavid van Moolenbroek  * Return 1 if the command name in the argument vector (u-area) does
185*97189037SDavid van Moolenbroek  * not match the command name (p_comm)
186*97189037SDavid van Moolenbroek  */
187*97189037SDavid van Moolenbroek static int
titlecmp(char * name,char ** argv)188*97189037SDavid van Moolenbroek titlecmp(char *name, char **argv)
189*97189037SDavid van Moolenbroek {
190*97189037SDavid van Moolenbroek 	char *title;
191*97189037SDavid van Moolenbroek 	int namelen;
192*97189037SDavid van Moolenbroek 
193*97189037SDavid van Moolenbroek 
194*97189037SDavid van Moolenbroek 	/* no argument vector == no match; system processes/threads do that */
195*97189037SDavid van Moolenbroek 	if (argv == 0 || argv[0] == 0)
196*97189037SDavid van Moolenbroek 		return (1);
197*97189037SDavid van Moolenbroek 
198*97189037SDavid van Moolenbroek 	title = cmdpart(argv[0]);
199*97189037SDavid van Moolenbroek 
200*97189037SDavid van Moolenbroek 	/* the basename matches */
201*97189037SDavid van Moolenbroek 	if (!strcmp(name, title))
202*97189037SDavid van Moolenbroek 		return (0);
203*97189037SDavid van Moolenbroek 
204*97189037SDavid van Moolenbroek 	/* handle login shells, by skipping the leading - */
205*97189037SDavid van Moolenbroek 	if (title[0] == '-' && !strcmp(name, title + 1))
206*97189037SDavid van Moolenbroek 		return (0);
207*97189037SDavid van Moolenbroek 
208*97189037SDavid van Moolenbroek 	namelen = strlen(name);
209*97189037SDavid van Moolenbroek 
210*97189037SDavid van Moolenbroek 	/* handle daemons that report activity as daemonname: activity */
211*97189037SDavid van Moolenbroek 	if (argv[1] == 0 &&
212*97189037SDavid van Moolenbroek 	    !strncmp(name, title, namelen) &&
213*97189037SDavid van Moolenbroek 	    title[namelen + 0] == ':' &&
214*97189037SDavid van Moolenbroek 	    title[namelen + 1] == ' ')
215*97189037SDavid van Moolenbroek 		return (0);
216*97189037SDavid van Moolenbroek 
217*97189037SDavid van Moolenbroek 	return (1);
218*97189037SDavid van Moolenbroek }
219*97189037SDavid van Moolenbroek 
220*97189037SDavid van Moolenbroek static void
doubleprintorsetwidth(VAR * v,double val,int prec,enum mode mode)221*97189037SDavid van Moolenbroek doubleprintorsetwidth(VAR *v, double val, int prec, enum mode mode)
222*97189037SDavid van Moolenbroek {
223*97189037SDavid van Moolenbroek 	int fmtlen;
224*97189037SDavid van Moolenbroek 
225*97189037SDavid van Moolenbroek 	if (mode == WIDTHMODE) {
226*97189037SDavid van Moolenbroek 		if (val < 0.0 && val < v->longestnd) {
227*97189037SDavid van Moolenbroek 			fmtlen = (int)log10(-val) + prec + 2;
228*97189037SDavid van Moolenbroek 			v->longestnd = val;
229*97189037SDavid van Moolenbroek 			if (fmtlen > v->width)
230*97189037SDavid van Moolenbroek 				v->width = fmtlen;
231*97189037SDavid van Moolenbroek 		} else if (val > 0.0 && val > v->longestpd) {
232*97189037SDavid van Moolenbroek 			fmtlen = (int)log10(val) + prec + 1;
233*97189037SDavid van Moolenbroek 			v->longestpd = val;
234*97189037SDavid van Moolenbroek 			if (fmtlen > v->width)
235*97189037SDavid van Moolenbroek 				v->width = fmtlen;
236*97189037SDavid van Moolenbroek 		}
237*97189037SDavid van Moolenbroek 	} else {
238*97189037SDavid van Moolenbroek 		(void)printf("%*.*f", v->width, prec, val);
239*97189037SDavid van Moolenbroek 	}
240*97189037SDavid van Moolenbroek }
241*97189037SDavid van Moolenbroek 
242*97189037SDavid van Moolenbroek static void
intprintorsetwidth(VAR * v,int val,enum mode mode)243*97189037SDavid van Moolenbroek intprintorsetwidth(VAR *v, int val, enum mode mode)
244*97189037SDavid van Moolenbroek {
245*97189037SDavid van Moolenbroek 	int fmtlen;
246*97189037SDavid van Moolenbroek 
247*97189037SDavid van Moolenbroek 	if (mode == WIDTHMODE) {
248*97189037SDavid van Moolenbroek 		if (val < 0 && val < v->longestn) {
249*97189037SDavid van Moolenbroek 			v->longestn = val;
250*97189037SDavid van Moolenbroek 			fmtlen = iwidth(-val) + 1;
251*97189037SDavid van Moolenbroek 			if (fmtlen > v->width)
252*97189037SDavid van Moolenbroek 				v->width = fmtlen;
253*97189037SDavid van Moolenbroek 		} else if (val > 0 && val > v->longestp) {
254*97189037SDavid van Moolenbroek 			v->longestp = val;
255*97189037SDavid van Moolenbroek 			fmtlen = iwidth(val);
256*97189037SDavid van Moolenbroek 			if (fmtlen > v->width)
257*97189037SDavid van Moolenbroek 				v->width = fmtlen;
258*97189037SDavid van Moolenbroek 		}
259*97189037SDavid van Moolenbroek 	} else
260*97189037SDavid van Moolenbroek 		(void)printf("%*d", v->width, val);
261*97189037SDavid van Moolenbroek }
262*97189037SDavid van Moolenbroek 
263*97189037SDavid van Moolenbroek static void
strprintorsetwidth(VAR * v,const char * str,enum mode mode)264*97189037SDavid van Moolenbroek strprintorsetwidth(VAR *v, const char *str, enum mode mode)
265*97189037SDavid van Moolenbroek {
266*97189037SDavid van Moolenbroek 	int len;
267*97189037SDavid van Moolenbroek 
268*97189037SDavid van Moolenbroek 	if (mode == WIDTHMODE) {
269*97189037SDavid van Moolenbroek 		len = strlen(str);
270*97189037SDavid van Moolenbroek 		if (len > v->width)
271*97189037SDavid van Moolenbroek 			v->width = len;
272*97189037SDavid van Moolenbroek 	} else {
273*97189037SDavid van Moolenbroek 		if (v->flag & LJUST)
274*97189037SDavid van Moolenbroek 			(void)printf("%-*.*s", v->width, v->width, str);
275*97189037SDavid van Moolenbroek 		else
276*97189037SDavid van Moolenbroek 			(void)printf("%*.*s", v->width, v->width, str);
277*97189037SDavid van Moolenbroek 	}
278*97189037SDavid van Moolenbroek }
279*97189037SDavid van Moolenbroek 
280*97189037SDavid van Moolenbroek void
command(void * arg,VARENT * ve,enum mode mode)281*97189037SDavid van Moolenbroek command(void *arg, VARENT *ve, enum mode mode)
282*97189037SDavid van Moolenbroek {
283*97189037SDavid van Moolenbroek 	struct kinfo_proc2 *ki;
284*97189037SDavid van Moolenbroek 	VAR *v;
285*97189037SDavid van Moolenbroek 	int left;
286*97189037SDavid van Moolenbroek 	char **argv, **p, *name;
287*97189037SDavid van Moolenbroek 
288*97189037SDavid van Moolenbroek 	if (mode == WIDTHMODE)
289*97189037SDavid van Moolenbroek 		return;
290*97189037SDavid van Moolenbroek 
291*97189037SDavid van Moolenbroek 	ki = arg;
292*97189037SDavid van Moolenbroek 	v = ve->var;
293*97189037SDavid van Moolenbroek 	if (SIMPLEQ_NEXT(ve, next) != NULL || termwidth != UNLIMITED) {
294*97189037SDavid van Moolenbroek 		if (SIMPLEQ_NEXT(ve, next) == NULL) {
295*97189037SDavid van Moolenbroek 			left = termwidth - (totwidth - v->width);
296*97189037SDavid van Moolenbroek 			if (left < 1) /* already wrapped, just use std width */
297*97189037SDavid van Moolenbroek 				left = v->width;
298*97189037SDavid van Moolenbroek 		} else
299*97189037SDavid van Moolenbroek 			left = v->width;
300*97189037SDavid van Moolenbroek 	} else
301*97189037SDavid van Moolenbroek 		left = -1;
302*97189037SDavid van Moolenbroek 	if (needenv && kd) {
303*97189037SDavid van Moolenbroek 		argv = kvm_getenvv2(kd, ki, termwidth);
304*97189037SDavid van Moolenbroek 		if ((p = argv) != NULL) {
305*97189037SDavid van Moolenbroek 			while (*p) {
306*97189037SDavid van Moolenbroek 				fmt_puts(*p, &left);
307*97189037SDavid van Moolenbroek 				p++;
308*97189037SDavid van Moolenbroek 				fmt_putc(' ', &left);
309*97189037SDavid van Moolenbroek 			}
310*97189037SDavid van Moolenbroek 		}
311*97189037SDavid van Moolenbroek 	}
312*97189037SDavid van Moolenbroek 	if (needcomm) {
313*97189037SDavid van Moolenbroek 		name = ki->p_comm;
314*97189037SDavid van Moolenbroek 		if (!commandonly) {
315*97189037SDavid van Moolenbroek 			argv = kvm_getargv2(kd, ki, termwidth);
316*97189037SDavid van Moolenbroek 			if ((p = argv) != NULL) {
317*97189037SDavid van Moolenbroek 				while (*p) {
318*97189037SDavid van Moolenbroek 					fmt_puts(*p, &left);
319*97189037SDavid van Moolenbroek 					p++;
320*97189037SDavid van Moolenbroek 					fmt_putc(' ', &left);
321*97189037SDavid van Moolenbroek 					if (v->flag & ARGV0)
322*97189037SDavid van Moolenbroek 						break;
323*97189037SDavid van Moolenbroek 				}
324*97189037SDavid van Moolenbroek 				if (!(v->flag & ARGV0) &&
325*97189037SDavid van Moolenbroek 				    titlecmp(name, argv)) {
326*97189037SDavid van Moolenbroek 					/*
327*97189037SDavid van Moolenbroek 					 * append the real command name within
328*97189037SDavid van Moolenbroek 					 * parentheses, if the command name
329*97189037SDavid van Moolenbroek 					 * does not match the one in the
330*97189037SDavid van Moolenbroek 					 * argument vector
331*97189037SDavid van Moolenbroek 					 */
332*97189037SDavid van Moolenbroek 					fmt_putc('(', &left);
333*97189037SDavid van Moolenbroek 					fmt_puts(name, &left);
334*97189037SDavid van Moolenbroek 					fmt_putc(')', &left);
335*97189037SDavid van Moolenbroek 				}
336*97189037SDavid van Moolenbroek 			} else {
337*97189037SDavid van Moolenbroek 				/*
338*97189037SDavid van Moolenbroek 				 * Commands that don't set an argv vector
339*97189037SDavid van Moolenbroek 				 * are printed with square brackets if they
340*97189037SDavid van Moolenbroek 				 * are system commands.  Otherwise they are
341*97189037SDavid van Moolenbroek 				 * printed within parentheses.
342*97189037SDavid van Moolenbroek 				 */
343*97189037SDavid van Moolenbroek 				if (ki->p_flag & P_SYSTEM) {
344*97189037SDavid van Moolenbroek 					fmt_putc('[', &left);
345*97189037SDavid van Moolenbroek 					fmt_puts(name, &left);
346*97189037SDavid van Moolenbroek 					fmt_putc(']', &left);
347*97189037SDavid van Moolenbroek 				} else {
348*97189037SDavid van Moolenbroek 					fmt_putc('(', &left);
349*97189037SDavid van Moolenbroek 					fmt_puts(name, &left);
350*97189037SDavid van Moolenbroek 					fmt_putc(')', &left);
351*97189037SDavid van Moolenbroek 				}
352*97189037SDavid van Moolenbroek 			}
353*97189037SDavid van Moolenbroek 		} else {
354*97189037SDavid van Moolenbroek 			fmt_puts(name, &left);
355*97189037SDavid van Moolenbroek 		}
356*97189037SDavid van Moolenbroek 	}
357*97189037SDavid van Moolenbroek 	if (SIMPLEQ_NEXT(ve, next) != NULL && left > 0)
358*97189037SDavid van Moolenbroek 		(void)printf("%*s", left, "");
359*97189037SDavid van Moolenbroek }
360*97189037SDavid van Moolenbroek 
361*97189037SDavid van Moolenbroek void
groups(void * arg,VARENT * ve,enum mode mode)362*97189037SDavid van Moolenbroek groups(void *arg, VARENT *ve, enum mode mode)
363*97189037SDavid van Moolenbroek {
364*97189037SDavid van Moolenbroek 	struct kinfo_proc2 *ki;
365*97189037SDavid van Moolenbroek 	VAR *v;
366*97189037SDavid van Moolenbroek 	int left, i;
367*97189037SDavid van Moolenbroek 	char buf[16], *p;
368*97189037SDavid van Moolenbroek 
369*97189037SDavid van Moolenbroek 	if (mode == WIDTHMODE)
370*97189037SDavid van Moolenbroek 		return;
371*97189037SDavid van Moolenbroek 
372*97189037SDavid van Moolenbroek 	ki = arg;
373*97189037SDavid van Moolenbroek 	v = ve->var;
374*97189037SDavid van Moolenbroek 	if (SIMPLEQ_NEXT(ve, next) != NULL || termwidth != UNLIMITED) {
375*97189037SDavid van Moolenbroek 		if (SIMPLEQ_NEXT(ve, next) == NULL) {
376*97189037SDavid van Moolenbroek 			left = termwidth - (totwidth - v->width);
377*97189037SDavid van Moolenbroek 			if (left < 1) /* already wrapped, just use std width */
378*97189037SDavid van Moolenbroek 				left = v->width;
379*97189037SDavid van Moolenbroek 		} else
380*97189037SDavid van Moolenbroek 			left = v->width;
381*97189037SDavid van Moolenbroek 	} else
382*97189037SDavid van Moolenbroek 		left = -1;
383*97189037SDavid van Moolenbroek 
384*97189037SDavid van Moolenbroek 	if (ki->p_ngroups == 0)
385*97189037SDavid van Moolenbroek 		fmt_putc('-', &left);
386*97189037SDavid van Moolenbroek 
387*97189037SDavid van Moolenbroek 	for (i = 0; i < ki->p_ngroups; i++) {
388*97189037SDavid van Moolenbroek 		(void)snprintf(buf, sizeof(buf), "%d", ki->p_groups[i]);
389*97189037SDavid van Moolenbroek 		if (i)
390*97189037SDavid van Moolenbroek 			fmt_putc(' ', &left);
391*97189037SDavid van Moolenbroek 		for (p = &buf[0]; *p; p++)
392*97189037SDavid van Moolenbroek 			fmt_putc(*p, &left);
393*97189037SDavid van Moolenbroek 	}
394*97189037SDavid van Moolenbroek 
395*97189037SDavid van Moolenbroek 	if (SIMPLEQ_NEXT(ve, next) != NULL && left > 0)
396*97189037SDavid van Moolenbroek 		(void)printf("%*s", left, "");
397*97189037SDavid van Moolenbroek }
398*97189037SDavid van Moolenbroek 
399*97189037SDavid van Moolenbroek void
groupnames(void * arg,VARENT * ve,enum mode mode)400*97189037SDavid van Moolenbroek groupnames(void *arg, VARENT *ve, enum mode mode)
401*97189037SDavid van Moolenbroek {
402*97189037SDavid van Moolenbroek 	struct kinfo_proc2 *ki;
403*97189037SDavid van Moolenbroek 	VAR *v;
404*97189037SDavid van Moolenbroek 	int left, i;
405*97189037SDavid van Moolenbroek 	const char *p;
406*97189037SDavid van Moolenbroek 
407*97189037SDavid van Moolenbroek 	if (mode == WIDTHMODE)
408*97189037SDavid van Moolenbroek 		return;
409*97189037SDavid van Moolenbroek 
410*97189037SDavid van Moolenbroek 	ki = arg;
411*97189037SDavid van Moolenbroek 	v = ve->var;
412*97189037SDavid van Moolenbroek 	if (SIMPLEQ_NEXT(ve, next) != NULL || termwidth != UNLIMITED) {
413*97189037SDavid van Moolenbroek 		if (SIMPLEQ_NEXT(ve, next) == NULL) {
414*97189037SDavid van Moolenbroek 			left = termwidth - (totwidth - v->width);
415*97189037SDavid van Moolenbroek 			if (left < 1) /* already wrapped, just use std width */
416*97189037SDavid van Moolenbroek 				left = v->width;
417*97189037SDavid van Moolenbroek 		} else
418*97189037SDavid van Moolenbroek 			left = v->width;
419*97189037SDavid van Moolenbroek 	} else
420*97189037SDavid van Moolenbroek 		left = -1;
421*97189037SDavid van Moolenbroek 
422*97189037SDavid van Moolenbroek 	if (ki->p_ngroups == 0)
423*97189037SDavid van Moolenbroek 		fmt_putc('-', &left);
424*97189037SDavid van Moolenbroek 
425*97189037SDavid van Moolenbroek 	for (i = 0; i < ki->p_ngroups; i++) {
426*97189037SDavid van Moolenbroek 		if (i)
427*97189037SDavid van Moolenbroek 			fmt_putc(' ', &left);
428*97189037SDavid van Moolenbroek 		for (p = group_from_gid(ki->p_groups[i], 0); *p; p++)
429*97189037SDavid van Moolenbroek 			fmt_putc(*p, &left);
430*97189037SDavid van Moolenbroek 	}
431*97189037SDavid van Moolenbroek 
432*97189037SDavid van Moolenbroek 	if (SIMPLEQ_NEXT(ve, next) != NULL && left > 0)
433*97189037SDavid van Moolenbroek 		(void)printf("%*s", left, "");
434*97189037SDavid van Moolenbroek }
435*97189037SDavid van Moolenbroek 
436*97189037SDavid van Moolenbroek void
ucomm(void * arg,VARENT * ve,enum mode mode)437*97189037SDavid van Moolenbroek ucomm(void *arg, VARENT *ve, enum mode mode)
438*97189037SDavid van Moolenbroek {
439*97189037SDavid van Moolenbroek 	struct kinfo_proc2 *k;
440*97189037SDavid van Moolenbroek 	VAR *v;
441*97189037SDavid van Moolenbroek 
442*97189037SDavid van Moolenbroek 	k = arg;
443*97189037SDavid van Moolenbroek 	v = ve->var;
444*97189037SDavid van Moolenbroek 	strprintorsetwidth(v, k->p_comm, mode);
445*97189037SDavid van Moolenbroek }
446*97189037SDavid van Moolenbroek 
447*97189037SDavid van Moolenbroek void
emul(void * arg,VARENT * ve,enum mode mode)448*97189037SDavid van Moolenbroek emul(void *arg, VARENT *ve, enum mode mode)
449*97189037SDavid van Moolenbroek {
450*97189037SDavid van Moolenbroek 	struct kinfo_proc2 *k;
451*97189037SDavid van Moolenbroek 	VAR *v;
452*97189037SDavid van Moolenbroek 
453*97189037SDavid van Moolenbroek 	k = arg;
454*97189037SDavid van Moolenbroek 	v = ve->var;
455*97189037SDavid van Moolenbroek 	strprintorsetwidth(v, k->p_ename, mode);
456*97189037SDavid van Moolenbroek }
457*97189037SDavid van Moolenbroek 
458*97189037SDavid van Moolenbroek void
logname(void * arg,VARENT * ve,enum mode mode)459*97189037SDavid van Moolenbroek logname(void *arg, VARENT *ve, enum mode mode)
460*97189037SDavid van Moolenbroek {
461*97189037SDavid van Moolenbroek 	struct kinfo_proc2 *k;
462*97189037SDavid van Moolenbroek 	VAR *v;
463*97189037SDavid van Moolenbroek 
464*97189037SDavid van Moolenbroek 	k = arg;
465*97189037SDavid van Moolenbroek 	v = ve->var;
466*97189037SDavid van Moolenbroek 	strprintorsetwidth(v, k->p_login, mode);
467*97189037SDavid van Moolenbroek }
468*97189037SDavid van Moolenbroek 
469*97189037SDavid van Moolenbroek void
state(void * arg,VARENT * ve,enum mode mode)470*97189037SDavid van Moolenbroek state(void *arg, VARENT *ve, enum mode mode)
471*97189037SDavid van Moolenbroek {
472*97189037SDavid van Moolenbroek 	struct kinfo_proc2 *k;
473*97189037SDavid van Moolenbroek 	int flag, is_zombie;
474*97189037SDavid van Moolenbroek 	char *cp;
475*97189037SDavid van Moolenbroek 	VAR *v;
476*97189037SDavid van Moolenbroek 	char buf[16];
477*97189037SDavid van Moolenbroek 
478*97189037SDavid van Moolenbroek 	k = arg;
479*97189037SDavid van Moolenbroek 	is_zombie = 0;
480*97189037SDavid van Moolenbroek 	v = ve->var;
481*97189037SDavid van Moolenbroek 	flag = k->p_flag;
482*97189037SDavid van Moolenbroek 	cp = buf;
483*97189037SDavid van Moolenbroek 
484*97189037SDavid van Moolenbroek 	/*
485*97189037SDavid van Moolenbroek 	 * NOTE: There are historical letters, which are no longer used:
486*97189037SDavid van Moolenbroek 	 *
487*97189037SDavid van Moolenbroek 	 * - W: indicated that process is swapped out.
488*97189037SDavid van Moolenbroek 	 * - L: indicated non-zero l_holdcnt (i.e. that process was
489*97189037SDavid van Moolenbroek 	 *   prevented from swapping-out.
490*97189037SDavid van Moolenbroek 	 *
491*97189037SDavid van Moolenbroek 	 * These letters should not be used for new states to avoid
492*97189037SDavid van Moolenbroek 	 * conflicts with old applications which might depend on them.
493*97189037SDavid van Moolenbroek 	 */
494*97189037SDavid van Moolenbroek 	switch (k->p_stat) {
495*97189037SDavid van Moolenbroek 
496*97189037SDavid van Moolenbroek 	case LSSTOP:
497*97189037SDavid van Moolenbroek 		*cp = 'T';
498*97189037SDavid van Moolenbroek 		break;
499*97189037SDavid van Moolenbroek 
500*97189037SDavid van Moolenbroek 	case LSSLEEP:
501*97189037SDavid van Moolenbroek 		if (flag & L_SINTR)	/* interruptable (long) */
502*97189037SDavid van Moolenbroek 			*cp = (int)k->p_slptime >= maxslp ? 'I' : 'S';
503*97189037SDavid van Moolenbroek 		else
504*97189037SDavid van Moolenbroek 			*cp = 'D';
505*97189037SDavid van Moolenbroek 		break;
506*97189037SDavid van Moolenbroek 
507*97189037SDavid van Moolenbroek 	case LSRUN:
508*97189037SDavid van Moolenbroek 	case LSIDL:
509*97189037SDavid van Moolenbroek 		*cp = 'R';
510*97189037SDavid van Moolenbroek 		break;
511*97189037SDavid van Moolenbroek 
512*97189037SDavid van Moolenbroek 	case LSONPROC:
513*97189037SDavid van Moolenbroek 		*cp = 'O';
514*97189037SDavid van Moolenbroek 		break;
515*97189037SDavid van Moolenbroek 
516*97189037SDavid van Moolenbroek 	case LSZOMB:
517*97189037SDavid van Moolenbroek 		*cp = 'Z';
518*97189037SDavid van Moolenbroek 		is_zombie = 1;
519*97189037SDavid van Moolenbroek 		break;
520*97189037SDavid van Moolenbroek 
521*97189037SDavid van Moolenbroek 	case LSSUSPENDED:
522*97189037SDavid van Moolenbroek 		*cp = 'U';
523*97189037SDavid van Moolenbroek 		break;
524*97189037SDavid van Moolenbroek 
525*97189037SDavid van Moolenbroek 	default:
526*97189037SDavid van Moolenbroek 		*cp = '?';
527*97189037SDavid van Moolenbroek 	}
528*97189037SDavid van Moolenbroek 	cp++;
529*97189037SDavid van Moolenbroek 	if (k->p_nice < NZERO)
530*97189037SDavid van Moolenbroek 		*cp++ = '<';
531*97189037SDavid van Moolenbroek 	else if (k->p_nice > NZERO)
532*97189037SDavid van Moolenbroek 		*cp++ = 'N';
533*97189037SDavid van Moolenbroek 	if (flag & P_TRACED)
534*97189037SDavid van Moolenbroek 		*cp++ = 'X';
535*97189037SDavid van Moolenbroek 	if (flag & P_WEXIT && !is_zombie)
536*97189037SDavid van Moolenbroek 		*cp++ = 'E';
537*97189037SDavid van Moolenbroek 	if (flag & P_PPWAIT)
538*97189037SDavid van Moolenbroek 		*cp++ = 'V';
539*97189037SDavid van Moolenbroek 	if (flag & P_SYSTEM)
540*97189037SDavid van Moolenbroek 		*cp++ = 'K';
541*97189037SDavid van Moolenbroek 	if (k->p_eflag & EPROC_SLEADER)
542*97189037SDavid van Moolenbroek 		*cp++ = 's';
543*97189037SDavid van Moolenbroek 	if (flag & P_SA)
544*97189037SDavid van Moolenbroek 		*cp++ = 'a';
545*97189037SDavid van Moolenbroek 	else if (k->p_nlwps > 1)
546*97189037SDavid van Moolenbroek 		*cp++ = 'l';
547*97189037SDavid van Moolenbroek 	if ((flag & P_CONTROLT) && k->p__pgid == k->p_tpgid)
548*97189037SDavid van Moolenbroek 		*cp++ = '+';
549*97189037SDavid van Moolenbroek 	*cp = '\0';
550*97189037SDavid van Moolenbroek 	strprintorsetwidth(v, buf, mode);
551*97189037SDavid van Moolenbroek }
552*97189037SDavid van Moolenbroek 
553*97189037SDavid van Moolenbroek void
lstate(void * arg,VARENT * ve,enum mode mode)554*97189037SDavid van Moolenbroek lstate(void *arg, VARENT *ve, enum mode mode)
555*97189037SDavid van Moolenbroek {
556*97189037SDavid van Moolenbroek 	struct kinfo_lwp *k;
557*97189037SDavid van Moolenbroek 	int flag;
558*97189037SDavid van Moolenbroek 	char *cp;
559*97189037SDavid van Moolenbroek 	VAR *v;
560*97189037SDavid van Moolenbroek 	char buf[16];
561*97189037SDavid van Moolenbroek 
562*97189037SDavid van Moolenbroek 	k = arg;
563*97189037SDavid van Moolenbroek 	v = ve->var;
564*97189037SDavid van Moolenbroek 	flag = k->l_flag;
565*97189037SDavid van Moolenbroek 	cp = buf;
566*97189037SDavid van Moolenbroek 
567*97189037SDavid van Moolenbroek 	switch (k->l_stat) {
568*97189037SDavid van Moolenbroek 
569*97189037SDavid van Moolenbroek 	case LSSTOP:
570*97189037SDavid van Moolenbroek 		*cp = 'T';
571*97189037SDavid van Moolenbroek 		break;
572*97189037SDavid van Moolenbroek 
573*97189037SDavid van Moolenbroek 	case LSSLEEP:
574*97189037SDavid van Moolenbroek 		if (flag & L_SINTR)	/* interruptible (long) */
575*97189037SDavid van Moolenbroek 			*cp = (int)k->l_slptime >= maxslp ? 'I' : 'S';
576*97189037SDavid van Moolenbroek 		else
577*97189037SDavid van Moolenbroek 			*cp = 'D';
578*97189037SDavid van Moolenbroek 		break;
579*97189037SDavid van Moolenbroek 
580*97189037SDavid van Moolenbroek 	case LSRUN:
581*97189037SDavid van Moolenbroek 	case LSIDL:
582*97189037SDavid van Moolenbroek 		*cp = 'R';
583*97189037SDavid van Moolenbroek 		break;
584*97189037SDavid van Moolenbroek 
585*97189037SDavid van Moolenbroek 	case LSONPROC:
586*97189037SDavid van Moolenbroek 		*cp = 'O';
587*97189037SDavid van Moolenbroek 		break;
588*97189037SDavid van Moolenbroek 
589*97189037SDavid van Moolenbroek 	case LSZOMB:
590*97189037SDavid van Moolenbroek 	case LSDEAD:
591*97189037SDavid van Moolenbroek 		*cp = 'Z';
592*97189037SDavid van Moolenbroek 		break;
593*97189037SDavid van Moolenbroek 
594*97189037SDavid van Moolenbroek 	case LSSUSPENDED:
595*97189037SDavid van Moolenbroek 		*cp = 'U';
596*97189037SDavid van Moolenbroek 		break;
597*97189037SDavid van Moolenbroek 
598*97189037SDavid van Moolenbroek 	default:
599*97189037SDavid van Moolenbroek 		*cp = '?';
600*97189037SDavid van Moolenbroek 	}
601*97189037SDavid van Moolenbroek 	cp++;
602*97189037SDavid van Moolenbroek 	if (flag & L_SYSTEM)
603*97189037SDavid van Moolenbroek 		*cp++ = 'K';
604*97189037SDavid van Moolenbroek 	if (flag & L_SA)
605*97189037SDavid van Moolenbroek 		*cp++ = 'a';
606*97189037SDavid van Moolenbroek 	if (flag & L_DETACHED)
607*97189037SDavid van Moolenbroek 		*cp++ = '-';
608*97189037SDavid van Moolenbroek 	*cp = '\0';
609*97189037SDavid van Moolenbroek 	strprintorsetwidth(v, buf, mode);
610*97189037SDavid van Moolenbroek }
611*97189037SDavid van Moolenbroek 
612*97189037SDavid van Moolenbroek void
pnice(void * arg,VARENT * ve,enum mode mode)613*97189037SDavid van Moolenbroek pnice(void *arg, VARENT *ve, enum mode mode)
614*97189037SDavid van Moolenbroek {
615*97189037SDavid van Moolenbroek 	struct kinfo_proc2 *k;
616*97189037SDavid van Moolenbroek 	VAR *v;
617*97189037SDavid van Moolenbroek 
618*97189037SDavid van Moolenbroek 	k = arg;
619*97189037SDavid van Moolenbroek 	v = ve->var;
620*97189037SDavid van Moolenbroek 	intprintorsetwidth(v, k->p_nice - NZERO, mode);
621*97189037SDavid van Moolenbroek }
622*97189037SDavid van Moolenbroek 
623*97189037SDavid van Moolenbroek void
pri(void * arg,VARENT * ve,enum mode mode)624*97189037SDavid van Moolenbroek pri(void *arg, VARENT *ve, enum mode mode)
625*97189037SDavid van Moolenbroek {
626*97189037SDavid van Moolenbroek 	struct kinfo_lwp *l;
627*97189037SDavid van Moolenbroek 	VAR *v;
628*97189037SDavid van Moolenbroek 
629*97189037SDavid van Moolenbroek 	l = arg;
630*97189037SDavid van Moolenbroek 	v = ve->var;
631*97189037SDavid van Moolenbroek 	intprintorsetwidth(v, l->l_priority, mode);
632*97189037SDavid van Moolenbroek }
633*97189037SDavid van Moolenbroek 
634*97189037SDavid van Moolenbroek void
uname(void * arg,VARENT * ve,enum mode mode)635*97189037SDavid van Moolenbroek uname(void *arg, VARENT *ve, enum mode mode)
636*97189037SDavid van Moolenbroek {
637*97189037SDavid van Moolenbroek 	struct kinfo_proc2 *k;
638*97189037SDavid van Moolenbroek 	VAR *v;
639*97189037SDavid van Moolenbroek 
640*97189037SDavid van Moolenbroek 	k = arg;
641*97189037SDavid van Moolenbroek 	v = ve->var;
642*97189037SDavid van Moolenbroek 	strprintorsetwidth(v, user_from_uid(k->p_uid, 0), mode);
643*97189037SDavid van Moolenbroek }
644*97189037SDavid van Moolenbroek 
645*97189037SDavid van Moolenbroek void
runame(void * arg,VARENT * ve,enum mode mode)646*97189037SDavid van Moolenbroek runame(void *arg, VARENT *ve, enum mode mode)
647*97189037SDavid van Moolenbroek {
648*97189037SDavid van Moolenbroek 	struct kinfo_proc2 *k;
649*97189037SDavid van Moolenbroek 	VAR *v;
650*97189037SDavid van Moolenbroek 
651*97189037SDavid van Moolenbroek 	k = arg;
652*97189037SDavid van Moolenbroek 	v = ve->var;
653*97189037SDavid van Moolenbroek 	strprintorsetwidth(v, user_from_uid(k->p_ruid, 0), mode);
654*97189037SDavid van Moolenbroek }
655*97189037SDavid van Moolenbroek 
656*97189037SDavid van Moolenbroek void
svuname(void * arg,VARENT * ve,enum mode mode)657*97189037SDavid van Moolenbroek svuname(void *arg, VARENT *ve, enum mode mode)
658*97189037SDavid van Moolenbroek {
659*97189037SDavid van Moolenbroek 	struct kinfo_proc2 *k;
660*97189037SDavid van Moolenbroek 	VAR *v;
661*97189037SDavid van Moolenbroek 
662*97189037SDavid van Moolenbroek 	k = arg;
663*97189037SDavid van Moolenbroek 	v = ve->var;
664*97189037SDavid van Moolenbroek 	strprintorsetwidth(v, user_from_uid(k->p_svuid, 0), mode);
665*97189037SDavid van Moolenbroek }
666*97189037SDavid van Moolenbroek 
667*97189037SDavid van Moolenbroek void
gname(void * arg,VARENT * ve,enum mode mode)668*97189037SDavid van Moolenbroek gname(void *arg, VARENT *ve, enum mode mode)
669*97189037SDavid van Moolenbroek {
670*97189037SDavid van Moolenbroek 	struct kinfo_proc2 *k;
671*97189037SDavid van Moolenbroek 	VAR *v;
672*97189037SDavid van Moolenbroek 
673*97189037SDavid van Moolenbroek 	k = arg;
674*97189037SDavid van Moolenbroek 	v = ve->var;
675*97189037SDavid van Moolenbroek 	strprintorsetwidth(v, group_from_gid(k->p_gid, 0), mode);
676*97189037SDavid van Moolenbroek }
677*97189037SDavid van Moolenbroek 
678*97189037SDavid van Moolenbroek void
rgname(void * arg,VARENT * ve,enum mode mode)679*97189037SDavid van Moolenbroek rgname(void *arg, VARENT *ve, enum mode mode)
680*97189037SDavid van Moolenbroek {
681*97189037SDavid van Moolenbroek 	struct kinfo_proc2 *k;
682*97189037SDavid van Moolenbroek 	VAR *v;
683*97189037SDavid van Moolenbroek 
684*97189037SDavid van Moolenbroek 	k = arg;
685*97189037SDavid van Moolenbroek 	v = ve->var;
686*97189037SDavid van Moolenbroek 	strprintorsetwidth(v, group_from_gid(k->p_rgid, 0), mode);
687*97189037SDavid van Moolenbroek }
688*97189037SDavid van Moolenbroek 
689*97189037SDavid van Moolenbroek void
svgname(void * arg,VARENT * ve,enum mode mode)690*97189037SDavid van Moolenbroek svgname(void *arg, VARENT *ve, enum mode mode)
691*97189037SDavid van Moolenbroek {
692*97189037SDavid van Moolenbroek 	struct kinfo_proc2 *k;
693*97189037SDavid van Moolenbroek 	VAR *v;
694*97189037SDavid van Moolenbroek 
695*97189037SDavid van Moolenbroek 	k = arg;
696*97189037SDavid van Moolenbroek 	v = ve->var;
697*97189037SDavid van Moolenbroek 	strprintorsetwidth(v, group_from_gid(k->p_svgid, 0), mode);
698*97189037SDavid van Moolenbroek }
699*97189037SDavid van Moolenbroek 
700*97189037SDavid van Moolenbroek void
tdev(void * arg,VARENT * ve,enum mode mode)701*97189037SDavid van Moolenbroek tdev(void *arg, VARENT *ve, enum mode mode)
702*97189037SDavid van Moolenbroek {
703*97189037SDavid van Moolenbroek 	struct kinfo_proc2 *k;
704*97189037SDavid van Moolenbroek 	VAR *v;
705*97189037SDavid van Moolenbroek 	dev_t dev;
706*97189037SDavid van Moolenbroek 	char buff[16];
707*97189037SDavid van Moolenbroek 
708*97189037SDavid van Moolenbroek 	k = arg;
709*97189037SDavid van Moolenbroek 	v = ve->var;
710*97189037SDavid van Moolenbroek 	dev = k->p_tdev;
711*97189037SDavid van Moolenbroek 	if (dev == NODEV) {
712*97189037SDavid van Moolenbroek 		if (mode == PRINTMODE)
713*97189037SDavid van Moolenbroek 			(void)printf("%*s", v->width, "?");
714*97189037SDavid van Moolenbroek 		else
715*97189037SDavid van Moolenbroek 			if (v->width < 2)
716*97189037SDavid van Moolenbroek 				v->width = 2;
717*97189037SDavid van Moolenbroek 	} else {
718*97189037SDavid van Moolenbroek 		(void)snprintf(buff, sizeof(buff),
719*97189037SDavid van Moolenbroek 		    "%lld/%lld", (long long)major(dev), (long long)minor(dev));
720*97189037SDavid van Moolenbroek 		strprintorsetwidth(v, buff, mode);
721*97189037SDavid van Moolenbroek 	}
722*97189037SDavid van Moolenbroek }
723*97189037SDavid van Moolenbroek 
724*97189037SDavid van Moolenbroek void
tname(void * arg,VARENT * ve,enum mode mode)725*97189037SDavid van Moolenbroek tname(void *arg, VARENT *ve, enum mode mode)
726*97189037SDavid van Moolenbroek {
727*97189037SDavid van Moolenbroek 	struct kinfo_proc2 *k;
728*97189037SDavid van Moolenbroek 	VAR *v;
729*97189037SDavid van Moolenbroek 	dev_t dev;
730*97189037SDavid van Moolenbroek 	const char *ttname;
731*97189037SDavid van Moolenbroek 	int noctty;
732*97189037SDavid van Moolenbroek 
733*97189037SDavid van Moolenbroek 	k = arg;
734*97189037SDavid van Moolenbroek 	v = ve->var;
735*97189037SDavid van Moolenbroek 	dev = k->p_tdev;
736*97189037SDavid van Moolenbroek 	if (dev == NODEV || (ttname = devname(dev, S_IFCHR)) == NULL) {
737*97189037SDavid van Moolenbroek 		if (mode == PRINTMODE)
738*97189037SDavid van Moolenbroek 			(void)printf("%-*s", v->width, "?");
739*97189037SDavid van Moolenbroek 		else
740*97189037SDavid van Moolenbroek 			if (v->width < 2)
741*97189037SDavid van Moolenbroek 				v->width = 2;
742*97189037SDavid van Moolenbroek 	} else {
743*97189037SDavid van Moolenbroek #ifdef __minix
744*97189037SDavid van Moolenbroek 		/* Actually shorten TTY names.  "console" is *really* long. */
745*97189037SDavid van Moolenbroek 		if (strcmp(ttname, "console") == 0)
746*97189037SDavid van Moolenbroek 			ttname = "co";
747*97189037SDavid van Moolenbroek 		else if (strncmp(ttname, "tty", 3) == 0 && ttname[3] != '\0')
748*97189037SDavid van Moolenbroek 			ttname += 3;
749*97189037SDavid van Moolenbroek 		else if (strncmp(ttname, "pts/", 4) == 0 && ttname[4] != '\0')
750*97189037SDavid van Moolenbroek 			ttname += 4; /* this is what FreeBSD does */
751*97189037SDavid van Moolenbroek #endif /* __minix */
752*97189037SDavid van Moolenbroek 		noctty = !(k->p_eflag & EPROC_CTTY) ? 1 : 0;
753*97189037SDavid van Moolenbroek 		if (mode == WIDTHMODE) {
754*97189037SDavid van Moolenbroek 			int fmtlen;
755*97189037SDavid van Moolenbroek 
756*97189037SDavid van Moolenbroek 			fmtlen = strlen(ttname) + noctty;
757*97189037SDavid van Moolenbroek 			if (v->width < fmtlen)
758*97189037SDavid van Moolenbroek 				v->width = fmtlen;
759*97189037SDavid van Moolenbroek 		} else {
760*97189037SDavid van Moolenbroek 			if (noctty)
761*97189037SDavid van Moolenbroek 				(void)printf("%-*s-", v->width - 1, ttname);
762*97189037SDavid van Moolenbroek 			else
763*97189037SDavid van Moolenbroek 				(void)printf("%-*s", v->width, ttname);
764*97189037SDavid van Moolenbroek 		}
765*97189037SDavid van Moolenbroek 	}
766*97189037SDavid van Moolenbroek }
767*97189037SDavid van Moolenbroek 
768*97189037SDavid van Moolenbroek void
longtname(void * arg,VARENT * ve,enum mode mode)769*97189037SDavid van Moolenbroek longtname(void *arg, VARENT *ve, enum mode mode)
770*97189037SDavid van Moolenbroek {
771*97189037SDavid van Moolenbroek 	struct kinfo_proc2 *k;
772*97189037SDavid van Moolenbroek 	VAR *v;
773*97189037SDavid van Moolenbroek 	dev_t dev;
774*97189037SDavid van Moolenbroek 	const char *ttname;
775*97189037SDavid van Moolenbroek 
776*97189037SDavid van Moolenbroek 	k = arg;
777*97189037SDavid van Moolenbroek 	v = ve->var;
778*97189037SDavid van Moolenbroek 	dev = k->p_tdev;
779*97189037SDavid van Moolenbroek 	if (dev == NODEV || (ttname = devname(dev, S_IFCHR)) == NULL) {
780*97189037SDavid van Moolenbroek 		if (mode == PRINTMODE)
781*97189037SDavid van Moolenbroek 			(void)printf("%-*s", v->width, "?");
782*97189037SDavid van Moolenbroek 		else
783*97189037SDavid van Moolenbroek 			if (v->width < 2)
784*97189037SDavid van Moolenbroek 				v->width = 2;
785*97189037SDavid van Moolenbroek 	} else {
786*97189037SDavid van Moolenbroek 		strprintorsetwidth(v, ttname, mode);
787*97189037SDavid van Moolenbroek 	}
788*97189037SDavid van Moolenbroek }
789*97189037SDavid van Moolenbroek 
790*97189037SDavid van Moolenbroek void
started(void * arg,VARENT * ve,enum mode mode)791*97189037SDavid van Moolenbroek started(void *arg, VARENT *ve, enum mode mode)
792*97189037SDavid van Moolenbroek {
793*97189037SDavid van Moolenbroek 	struct kinfo_proc2 *k;
794*97189037SDavid van Moolenbroek 	VAR *v;
795*97189037SDavid van Moolenbroek 	time_t startt;
796*97189037SDavid van Moolenbroek 	struct tm *tp;
797*97189037SDavid van Moolenbroek 	char buf[100], *cp;
798*97189037SDavid van Moolenbroek 
799*97189037SDavid van Moolenbroek 	k = arg;
800*97189037SDavid van Moolenbroek 	v = ve->var;
801*97189037SDavid van Moolenbroek 	if (!k->p_uvalid) {
802*97189037SDavid van Moolenbroek 		if (mode == PRINTMODE)
803*97189037SDavid van Moolenbroek 			(void)printf("%*s", v->width, "-");
804*97189037SDavid van Moolenbroek 		return;
805*97189037SDavid van Moolenbroek 	}
806*97189037SDavid van Moolenbroek 
807*97189037SDavid van Moolenbroek 	startt = k->p_ustart_sec;
808*97189037SDavid van Moolenbroek 	tp = localtime(&startt);
809*97189037SDavid van Moolenbroek 	if (now == 0)
810*97189037SDavid van Moolenbroek 		(void)time(&now);
811*97189037SDavid van Moolenbroek 	if (now - k->p_ustart_sec < SECSPERDAY)
812*97189037SDavid van Moolenbroek 		/* I *hate* SCCS... */
813*97189037SDavid van Moolenbroek 		(void)strftime(buf, sizeof(buf) - 1, "%l:%" "M%p", tp);
814*97189037SDavid van Moolenbroek 	else if (now - k->p_ustart_sec < DAYSPERWEEK * SECSPERDAY)
815*97189037SDavid van Moolenbroek 		/* I *hate* SCCS... */
816*97189037SDavid van Moolenbroek 		(void)strftime(buf, sizeof(buf) - 1, "%a%" "I%p", tp);
817*97189037SDavid van Moolenbroek 	else
818*97189037SDavid van Moolenbroek 		(void)strftime(buf, sizeof(buf) - 1, "%e%b%y", tp);
819*97189037SDavid van Moolenbroek 	/* %e and %l can start with a space. */
820*97189037SDavid van Moolenbroek 	cp = buf;
821*97189037SDavid van Moolenbroek 	if (*cp == ' ')
822*97189037SDavid van Moolenbroek 		cp++;
823*97189037SDavid van Moolenbroek 	strprintorsetwidth(v, cp, mode);
824*97189037SDavid van Moolenbroek }
825*97189037SDavid van Moolenbroek 
826*97189037SDavid van Moolenbroek void
lstarted(void * arg,VARENT * ve,enum mode mode)827*97189037SDavid van Moolenbroek lstarted(void *arg, VARENT *ve, enum mode mode)
828*97189037SDavid van Moolenbroek {
829*97189037SDavid van Moolenbroek 	struct kinfo_proc2 *k;
830*97189037SDavid van Moolenbroek 	VAR *v;
831*97189037SDavid van Moolenbroek 	time_t startt;
832*97189037SDavid van Moolenbroek 	char buf[100];
833*97189037SDavid van Moolenbroek 
834*97189037SDavid van Moolenbroek 	k = arg;
835*97189037SDavid van Moolenbroek 	v = ve->var;
836*97189037SDavid van Moolenbroek 	if (!k->p_uvalid) {
837*97189037SDavid van Moolenbroek 		/*
838*97189037SDavid van Moolenbroek 		 * Minimum width is less than header - we don't
839*97189037SDavid van Moolenbroek 		 * need to check it every time.
840*97189037SDavid van Moolenbroek 		 */
841*97189037SDavid van Moolenbroek 		if (mode == PRINTMODE)
842*97189037SDavid van Moolenbroek 			(void)printf("%*s", v->width, "-");
843*97189037SDavid van Moolenbroek 		return;
844*97189037SDavid van Moolenbroek 	}
845*97189037SDavid van Moolenbroek 	startt = k->p_ustart_sec;
846*97189037SDavid van Moolenbroek 
847*97189037SDavid van Moolenbroek 	/* assume all times are the same length */
848*97189037SDavid van Moolenbroek 	if (mode != WIDTHMODE || v->width == 0) {
849*97189037SDavid van Moolenbroek 		(void)strftime(buf, sizeof(buf) -1, "%c",
850*97189037SDavid van Moolenbroek 		    localtime(&startt));
851*97189037SDavid van Moolenbroek 		strprintorsetwidth(v, buf, mode);
852*97189037SDavid van Moolenbroek 	}
853*97189037SDavid van Moolenbroek }
854*97189037SDavid van Moolenbroek 
855*97189037SDavid van Moolenbroek void
elapsed(void * arg,VARENT * ve,enum mode mode)856*97189037SDavid van Moolenbroek elapsed(void *arg, VARENT *ve, enum mode mode)
857*97189037SDavid van Moolenbroek {
858*97189037SDavid van Moolenbroek 	struct kinfo_proc2 *k;
859*97189037SDavid van Moolenbroek 	VAR *v;
860*97189037SDavid van Moolenbroek 	int32_t origseconds, secs, mins, hours, days;
861*97189037SDavid van Moolenbroek 	int fmtlen, printed_something;
862*97189037SDavid van Moolenbroek 
863*97189037SDavid van Moolenbroek 	k = arg;
864*97189037SDavid van Moolenbroek 	v = ve->var;
865*97189037SDavid van Moolenbroek 	if (k->p_uvalid == 0) {
866*97189037SDavid van Moolenbroek 		origseconds = 0;
867*97189037SDavid van Moolenbroek 	} else {
868*97189037SDavid van Moolenbroek 		if (now == 0)
869*97189037SDavid van Moolenbroek 			(void)time(&now);
870*97189037SDavid van Moolenbroek 		origseconds = now - k->p_ustart_sec;
871*97189037SDavid van Moolenbroek 		if (origseconds < 0) {
872*97189037SDavid van Moolenbroek 			/*
873*97189037SDavid van Moolenbroek 			 * Don't try to be fancy if the machine's
874*97189037SDavid van Moolenbroek 			 * clock has been rewound to before the
875*97189037SDavid van Moolenbroek 			 * process "started".
876*97189037SDavid van Moolenbroek 			 */
877*97189037SDavid van Moolenbroek 			origseconds = 0;
878*97189037SDavid van Moolenbroek 		}
879*97189037SDavid van Moolenbroek 	}
880*97189037SDavid van Moolenbroek 
881*97189037SDavid van Moolenbroek 	secs = origseconds;
882*97189037SDavid van Moolenbroek 	mins = secs / SECSPERMIN;
883*97189037SDavid van Moolenbroek 	secs %= SECSPERMIN;
884*97189037SDavid van Moolenbroek 	hours = mins / MINSPERHOUR;
885*97189037SDavid van Moolenbroek 	mins %= MINSPERHOUR;
886*97189037SDavid van Moolenbroek 	days = hours / HOURSPERDAY;
887*97189037SDavid van Moolenbroek 	hours %= HOURSPERDAY;
888*97189037SDavid van Moolenbroek 
889*97189037SDavid van Moolenbroek 	if (mode == WIDTHMODE) {
890*97189037SDavid van Moolenbroek 		if (origseconds == 0)
891*97189037SDavid van Moolenbroek 			/* non-zero so fmtlen is calculated at least once */
892*97189037SDavid van Moolenbroek 			origseconds = 1;
893*97189037SDavid van Moolenbroek 
894*97189037SDavid van Moolenbroek 		if (origseconds > v->longestp) {
895*97189037SDavid van Moolenbroek 			v->longestp = origseconds;
896*97189037SDavid van Moolenbroek 
897*97189037SDavid van Moolenbroek 			if (days > 0) {
898*97189037SDavid van Moolenbroek 				/* +9 for "-hh:mm:ss" */
899*97189037SDavid van Moolenbroek 				fmtlen = iwidth(days) + 9;
900*97189037SDavid van Moolenbroek 			} else if (hours > 0) {
901*97189037SDavid van Moolenbroek 				/* +6 for "mm:ss" */
902*97189037SDavid van Moolenbroek 				fmtlen = iwidth(hours) + 6;
903*97189037SDavid van Moolenbroek 			} else {
904*97189037SDavid van Moolenbroek 				/* +3 for ":ss" */
905*97189037SDavid van Moolenbroek 				fmtlen = iwidth(mins) + 3;
906*97189037SDavid van Moolenbroek 			}
907*97189037SDavid van Moolenbroek 
908*97189037SDavid van Moolenbroek 			if (fmtlen > v->width)
909*97189037SDavid van Moolenbroek 				v->width = fmtlen;
910*97189037SDavid van Moolenbroek 		}
911*97189037SDavid van Moolenbroek 	} else {
912*97189037SDavid van Moolenbroek 		printed_something = 0;
913*97189037SDavid van Moolenbroek 		fmtlen = v->width;
914*97189037SDavid van Moolenbroek 
915*97189037SDavid van Moolenbroek 		if (days > 0) {
916*97189037SDavid van Moolenbroek 			(void)printf("%*d", fmtlen - 9, days);
917*97189037SDavid van Moolenbroek 			printed_something = 1;
918*97189037SDavid van Moolenbroek 		} else if (fmtlen > 9) {
919*97189037SDavid van Moolenbroek 			(void)printf("%*s", fmtlen - 9, "");
920*97189037SDavid van Moolenbroek 		}
921*97189037SDavid van Moolenbroek 		if (fmtlen > 9)
922*97189037SDavid van Moolenbroek 			fmtlen = 9;
923*97189037SDavid van Moolenbroek 
924*97189037SDavid van Moolenbroek 		if (printed_something) {
925*97189037SDavid van Moolenbroek 			(void)printf("-%.*d", fmtlen - 7, hours);
926*97189037SDavid van Moolenbroek 			printed_something = 1;
927*97189037SDavid van Moolenbroek 		} else if (hours > 0) {
928*97189037SDavid van Moolenbroek 			(void)printf("%*d", fmtlen - 6, hours);
929*97189037SDavid van Moolenbroek 			printed_something = 1;
930*97189037SDavid van Moolenbroek 		} else if (fmtlen > 6) {
931*97189037SDavid van Moolenbroek 			(void)printf("%*s", fmtlen - 6, "");
932*97189037SDavid van Moolenbroek 		}
933*97189037SDavid van Moolenbroek 		if (fmtlen > 6)
934*97189037SDavid van Moolenbroek 			fmtlen = 6;
935*97189037SDavid van Moolenbroek 
936*97189037SDavid van Moolenbroek 		/* Don't need to set fmtlen or printed_something any more... */
937*97189037SDavid van Moolenbroek 		if (printed_something) {
938*97189037SDavid van Moolenbroek 			(void)printf(":%.*d", fmtlen - 4, mins);
939*97189037SDavid van Moolenbroek 		} else if (mins > 0) {
940*97189037SDavid van Moolenbroek 			(void)printf("%*d", fmtlen - 3, mins);
941*97189037SDavid van Moolenbroek 		} else if (fmtlen > 3) {
942*97189037SDavid van Moolenbroek 			(void)printf("%*s", fmtlen - 3, "0");
943*97189037SDavid van Moolenbroek 		}
944*97189037SDavid van Moolenbroek 
945*97189037SDavid van Moolenbroek 		(void)printf(":%.2d", secs);
946*97189037SDavid van Moolenbroek 	}
947*97189037SDavid van Moolenbroek }
948*97189037SDavid van Moolenbroek 
949*97189037SDavid van Moolenbroek void
wchan(void * arg,VARENT * ve,enum mode mode)950*97189037SDavid van Moolenbroek wchan(void *arg, VARENT *ve, enum mode mode)
951*97189037SDavid van Moolenbroek {
952*97189037SDavid van Moolenbroek 	struct kinfo_lwp *l;
953*97189037SDavid van Moolenbroek 	VAR *v;
954*97189037SDavid van Moolenbroek 	char *buf;
955*97189037SDavid van Moolenbroek 
956*97189037SDavid van Moolenbroek 	l = arg;
957*97189037SDavid van Moolenbroek 	v = ve->var;
958*97189037SDavid van Moolenbroek 	if (l->l_wchan) {
959*97189037SDavid van Moolenbroek 		if (l->l_wmesg[0]) {
960*97189037SDavid van Moolenbroek 			strprintorsetwidth(v, l->l_wmesg, mode);
961*97189037SDavid van Moolenbroek 			v->width = min(v->width, KI_WMESGLEN);
962*97189037SDavid van Moolenbroek 		} else {
963*97189037SDavid van Moolenbroek 			(void)asprintf(&buf, "%-*" PRIx64, v->width,
964*97189037SDavid van Moolenbroek 			    l->l_wchan);
965*97189037SDavid van Moolenbroek 			if (buf == NULL)
966*97189037SDavid van Moolenbroek 				err(1, "%s", "");
967*97189037SDavid van Moolenbroek 			strprintorsetwidth(v, buf, mode);
968*97189037SDavid van Moolenbroek 			v->width = min(v->width, KI_WMESGLEN);
969*97189037SDavid van Moolenbroek 			free(buf);
970*97189037SDavid van Moolenbroek 		}
971*97189037SDavid van Moolenbroek 	} else {
972*97189037SDavid van Moolenbroek 		if (mode == PRINTMODE)
973*97189037SDavid van Moolenbroek 			(void)printf("%-*s", v->width, "-");
974*97189037SDavid van Moolenbroek 	}
975*97189037SDavid van Moolenbroek }
976*97189037SDavid van Moolenbroek 
977*97189037SDavid van Moolenbroek #define	pgtok(a)        (((a)*(size_t)getpagesize())/1024)
978*97189037SDavid van Moolenbroek 
979*97189037SDavid van Moolenbroek void
vsize(void * arg,VARENT * ve,enum mode mode)980*97189037SDavid van Moolenbroek vsize(void *arg, VARENT *ve, enum mode mode)
981*97189037SDavid van Moolenbroek {
982*97189037SDavid van Moolenbroek 	struct kinfo_proc2 *k;
983*97189037SDavid van Moolenbroek 	VAR *v;
984*97189037SDavid van Moolenbroek 
985*97189037SDavid van Moolenbroek 	k = arg;
986*97189037SDavid van Moolenbroek 	v = ve->var;
987*97189037SDavid van Moolenbroek 	intprintorsetwidth(v, pgtok(k->p_vm_msize), mode);
988*97189037SDavid van Moolenbroek }
989*97189037SDavid van Moolenbroek 
990*97189037SDavid van Moolenbroek void
rssize(void * arg,VARENT * ve,enum mode mode)991*97189037SDavid van Moolenbroek rssize(void *arg, VARENT *ve, enum mode mode)
992*97189037SDavid van Moolenbroek {
993*97189037SDavid van Moolenbroek 	struct kinfo_proc2 *k;
994*97189037SDavid van Moolenbroek 	VAR *v;
995*97189037SDavid van Moolenbroek 
996*97189037SDavid van Moolenbroek 	k = arg;
997*97189037SDavid van Moolenbroek 	v = ve->var;
998*97189037SDavid van Moolenbroek 	/* XXX don't have info about shared */
999*97189037SDavid van Moolenbroek 	intprintorsetwidth(v, pgtok(k->p_vm_rssize), mode);
1000*97189037SDavid van Moolenbroek }
1001*97189037SDavid van Moolenbroek 
1002*97189037SDavid van Moolenbroek void
p_rssize(void * arg,VARENT * ve,enum mode mode)1003*97189037SDavid van Moolenbroek p_rssize(void *arg, VARENT *ve, enum mode mode)	/* doesn't account for text */
1004*97189037SDavid van Moolenbroek {
1005*97189037SDavid van Moolenbroek 	struct kinfo_proc2 *k;
1006*97189037SDavid van Moolenbroek 	VAR *v;
1007*97189037SDavid van Moolenbroek 
1008*97189037SDavid van Moolenbroek 	k = arg;
1009*97189037SDavid van Moolenbroek 	v = ve->var;
1010*97189037SDavid van Moolenbroek 	intprintorsetwidth(v, pgtok(k->p_vm_rssize), mode);
1011*97189037SDavid van Moolenbroek }
1012*97189037SDavid van Moolenbroek 
1013*97189037SDavid van Moolenbroek void
cpuid(void * arg,VARENT * ve,enum mode mode)1014*97189037SDavid van Moolenbroek cpuid(void *arg, VARENT *ve, enum mode mode)
1015*97189037SDavid van Moolenbroek {
1016*97189037SDavid van Moolenbroek 	struct kinfo_lwp *l;
1017*97189037SDavid van Moolenbroek 	VAR *v;
1018*97189037SDavid van Moolenbroek 
1019*97189037SDavid van Moolenbroek 	l = arg;
1020*97189037SDavid van Moolenbroek 	v = ve->var;
1021*97189037SDavid van Moolenbroek 	intprintorsetwidth(v, l->l_cpuid, mode);
1022*97189037SDavid van Moolenbroek }
1023*97189037SDavid van Moolenbroek 
1024*97189037SDavid van Moolenbroek static void
cputime1(int32_t secs,int32_t psecs,VAR * v,enum mode mode)1025*97189037SDavid van Moolenbroek cputime1(int32_t secs, int32_t psecs, VAR *v, enum mode mode)
1026*97189037SDavid van Moolenbroek {
1027*97189037SDavid van Moolenbroek 	int fmtlen;
1028*97189037SDavid van Moolenbroek 
1029*97189037SDavid van Moolenbroek 	/*
1030*97189037SDavid van Moolenbroek 	 * round and scale to 100's
1031*97189037SDavid van Moolenbroek 	 */
1032*97189037SDavid van Moolenbroek 	psecs = (psecs + 5000) / 10000;
1033*97189037SDavid van Moolenbroek 	secs += psecs / 100;
1034*97189037SDavid van Moolenbroek 	psecs = psecs % 100;
1035*97189037SDavid van Moolenbroek 
1036*97189037SDavid van Moolenbroek 	if (mode == WIDTHMODE) {
1037*97189037SDavid van Moolenbroek 		/*
1038*97189037SDavid van Moolenbroek 		 * Ugg, this is the only field where a value of 0 is longer
1039*97189037SDavid van Moolenbroek 		 * than the column title.
1040*97189037SDavid van Moolenbroek 		 * Use SECSPERMIN, because secs is divided by that when
1041*97189037SDavid van Moolenbroek 		 * passed to iwidth().
1042*97189037SDavid van Moolenbroek 		 */
1043*97189037SDavid van Moolenbroek 		if (secs == 0)
1044*97189037SDavid van Moolenbroek 			secs = SECSPERMIN;
1045*97189037SDavid van Moolenbroek 
1046*97189037SDavid van Moolenbroek 		if (secs > v->longestp) {
1047*97189037SDavid van Moolenbroek 			v->longestp = secs;
1048*97189037SDavid van Moolenbroek 			/* "+6" for the ":%02ld.%02ld" in the printf() below */
1049*97189037SDavid van Moolenbroek 			fmtlen = iwidth(secs / SECSPERMIN) + 6;
1050*97189037SDavid van Moolenbroek 			if (fmtlen > v->width)
1051*97189037SDavid van Moolenbroek 				v->width = fmtlen;
1052*97189037SDavid van Moolenbroek 		}
1053*97189037SDavid van Moolenbroek 	} else {
1054*97189037SDavid van Moolenbroek 		(void)printf("%*ld:%02ld.%02ld", v->width - 6,
1055*97189037SDavid van Moolenbroek 		    (long)(secs / SECSPERMIN), (long)(secs % SECSPERMIN),
1056*97189037SDavid van Moolenbroek 		    (long)psecs);
1057*97189037SDavid van Moolenbroek 	}
1058*97189037SDavid van Moolenbroek }
1059*97189037SDavid van Moolenbroek 
1060*97189037SDavid van Moolenbroek void
cputime(void * arg,VARENT * ve,enum mode mode)1061*97189037SDavid van Moolenbroek cputime(void *arg, VARENT *ve, enum mode mode)
1062*97189037SDavid van Moolenbroek {
1063*97189037SDavid van Moolenbroek 	struct kinfo_proc2 *k;
1064*97189037SDavid van Moolenbroek 	VAR *v;
1065*97189037SDavid van Moolenbroek 	int32_t secs;
1066*97189037SDavid van Moolenbroek 	int32_t psecs;	/* "parts" of a second. first micro, then centi */
1067*97189037SDavid van Moolenbroek 
1068*97189037SDavid van Moolenbroek 	k = arg;
1069*97189037SDavid van Moolenbroek 	v = ve->var;
1070*97189037SDavid van Moolenbroek 
1071*97189037SDavid van Moolenbroek 	/*
1072*97189037SDavid van Moolenbroek 	 * This counts time spent handling interrupts.  We could
1073*97189037SDavid van Moolenbroek 	 * fix this, but it is not 100% trivial (and interrupt
1074*97189037SDavid van Moolenbroek 	 * time fractions only work on the sparc anyway).	XXX
1075*97189037SDavid van Moolenbroek 	 */
1076*97189037SDavid van Moolenbroek 	secs = k->p_rtime_sec;
1077*97189037SDavid van Moolenbroek 	psecs = k->p_rtime_usec;
1078*97189037SDavid van Moolenbroek 	if (sumrusage) {
1079*97189037SDavid van Moolenbroek 		secs += k->p_uctime_sec;
1080*97189037SDavid van Moolenbroek 		psecs += k->p_uctime_usec;
1081*97189037SDavid van Moolenbroek 	}
1082*97189037SDavid van Moolenbroek 
1083*97189037SDavid van Moolenbroek 	cputime1(secs, psecs, v, mode);
1084*97189037SDavid van Moolenbroek }
1085*97189037SDavid van Moolenbroek 
1086*97189037SDavid van Moolenbroek void
lcputime(void * arg,VARENT * ve,enum mode mode)1087*97189037SDavid van Moolenbroek lcputime(void *arg, VARENT *ve, enum mode mode)
1088*97189037SDavid van Moolenbroek {
1089*97189037SDavid van Moolenbroek 	struct kinfo_lwp *l;
1090*97189037SDavid van Moolenbroek 	VAR *v;
1091*97189037SDavid van Moolenbroek 	int32_t secs;
1092*97189037SDavid van Moolenbroek 	int32_t psecs;	/* "parts" of a second. first micro, then centi */
1093*97189037SDavid van Moolenbroek 
1094*97189037SDavid van Moolenbroek 	l = arg;
1095*97189037SDavid van Moolenbroek 	v = ve->var;
1096*97189037SDavid van Moolenbroek 
1097*97189037SDavid van Moolenbroek 	secs = l->l_rtime_sec;
1098*97189037SDavid van Moolenbroek 	psecs = l->l_rtime_usec;
1099*97189037SDavid van Moolenbroek 
1100*97189037SDavid van Moolenbroek 	cputime1(secs, psecs, v, mode);
1101*97189037SDavid van Moolenbroek }
1102*97189037SDavid van Moolenbroek 
1103*97189037SDavid van Moolenbroek double
getpcpu(const struct kinfo_proc2 * k)1104*97189037SDavid van Moolenbroek getpcpu(const struct kinfo_proc2 *k)
1105*97189037SDavid van Moolenbroek {
1106*97189037SDavid van Moolenbroek 	static int failure;
1107*97189037SDavid van Moolenbroek 
1108*97189037SDavid van Moolenbroek 	if (!nlistread)
1109*97189037SDavid van Moolenbroek 		failure = (kd) ? donlist() : 1;
1110*97189037SDavid van Moolenbroek 	if (failure)
1111*97189037SDavid van Moolenbroek 		return (0.0);
1112*97189037SDavid van Moolenbroek 
1113*97189037SDavid van Moolenbroek #define	fxtofl(fixpt)	((double)(fixpt) / fscale)
1114*97189037SDavid van Moolenbroek 
1115*97189037SDavid van Moolenbroek 	if (k->p_swtime == 0 || k->p_realstat == SZOMB)
1116*97189037SDavid van Moolenbroek 		return (0.0);
1117*97189037SDavid van Moolenbroek 	if (rawcpu)
1118*97189037SDavid van Moolenbroek 		return (100.0 * fxtofl(k->p_pctcpu));
1119*97189037SDavid van Moolenbroek 	return (100.0 * fxtofl(k->p_pctcpu) /
1120*97189037SDavid van Moolenbroek 		(1.0 - exp(k->p_swtime * log(ccpu))));
1121*97189037SDavid van Moolenbroek }
1122*97189037SDavid van Moolenbroek 
1123*97189037SDavid van Moolenbroek void
pcpu(void * arg,VARENT * ve,enum mode mode)1124*97189037SDavid van Moolenbroek pcpu(void *arg, VARENT *ve, enum mode mode)
1125*97189037SDavid van Moolenbroek {
1126*97189037SDavid van Moolenbroek 	struct kinfo_proc2 *k;
1127*97189037SDavid van Moolenbroek 	VAR *v;
1128*97189037SDavid van Moolenbroek 	double dbl;
1129*97189037SDavid van Moolenbroek 
1130*97189037SDavid van Moolenbroek 	k = arg;
1131*97189037SDavid van Moolenbroek 	v = ve->var;
1132*97189037SDavid van Moolenbroek 	dbl = getpcpu(k);
1133*97189037SDavid van Moolenbroek 	doubleprintorsetwidth(v, dbl, (dbl >= 99.95) ? 0 : 1, mode);
1134*97189037SDavid van Moolenbroek }
1135*97189037SDavid van Moolenbroek 
1136*97189037SDavid van Moolenbroek double
getpmem(const struct kinfo_proc2 * k)1137*97189037SDavid van Moolenbroek getpmem(const struct kinfo_proc2 *k)
1138*97189037SDavid van Moolenbroek {
1139*97189037SDavid van Moolenbroek 	static int failure;
1140*97189037SDavid van Moolenbroek 	double fracmem;
1141*97189037SDavid van Moolenbroek 	int szptudot;
1142*97189037SDavid van Moolenbroek 
1143*97189037SDavid van Moolenbroek 	if (!nlistread)
1144*97189037SDavid van Moolenbroek 		failure = (kd) ? donlist() : 1;
1145*97189037SDavid van Moolenbroek 	if (failure)
1146*97189037SDavid van Moolenbroek 		return (0.0);
1147*97189037SDavid van Moolenbroek 
1148*97189037SDavid van Moolenbroek 	/* XXX want pmap ptpages, segtab, etc. (per architecture) */
1149*97189037SDavid van Moolenbroek 	szptudot = uspace/getpagesize();
1150*97189037SDavid van Moolenbroek 	/* XXX don't have info about shared */
1151*97189037SDavid van Moolenbroek 	fracmem = ((float)k->p_vm_rssize + szptudot)/mempages;
1152*97189037SDavid van Moolenbroek 	return (100.0 * fracmem);
1153*97189037SDavid van Moolenbroek }
1154*97189037SDavid van Moolenbroek 
1155*97189037SDavid van Moolenbroek void
pmem(void * arg,VARENT * ve,enum mode mode)1156*97189037SDavid van Moolenbroek pmem(void *arg, VARENT *ve, enum mode mode)
1157*97189037SDavid van Moolenbroek {
1158*97189037SDavid van Moolenbroek 	struct kinfo_proc2 *k;
1159*97189037SDavid van Moolenbroek 	VAR *v;
1160*97189037SDavid van Moolenbroek 
1161*97189037SDavid van Moolenbroek 	k = arg;
1162*97189037SDavid van Moolenbroek 	v = ve->var;
1163*97189037SDavid van Moolenbroek 	doubleprintorsetwidth(v, getpmem(k), 1, mode);
1164*97189037SDavid van Moolenbroek }
1165*97189037SDavid van Moolenbroek 
1166*97189037SDavid van Moolenbroek void
pagein(void * arg,VARENT * ve,enum mode mode)1167*97189037SDavid van Moolenbroek pagein(void *arg, VARENT *ve, enum mode mode)
1168*97189037SDavid van Moolenbroek {
1169*97189037SDavid van Moolenbroek 	struct kinfo_proc2 *k;
1170*97189037SDavid van Moolenbroek 	VAR *v;
1171*97189037SDavid van Moolenbroek 
1172*97189037SDavid van Moolenbroek 	k = arg;
1173*97189037SDavid van Moolenbroek 	v = ve->var;
1174*97189037SDavid van Moolenbroek 	intprintorsetwidth(v, k->p_uvalid ? k->p_uru_majflt : 0, mode);
1175*97189037SDavid van Moolenbroek }
1176*97189037SDavid van Moolenbroek 
1177*97189037SDavid van Moolenbroek void
maxrss(void * arg,VARENT * ve,enum mode mode)1178*97189037SDavid van Moolenbroek maxrss(void *arg, VARENT *ve, enum mode mode)
1179*97189037SDavid van Moolenbroek {
1180*97189037SDavid van Moolenbroek 	VAR *v;
1181*97189037SDavid van Moolenbroek 
1182*97189037SDavid van Moolenbroek 	v = ve->var;
1183*97189037SDavid van Moolenbroek 	/* No need to check width! */
1184*97189037SDavid van Moolenbroek 	if (mode == PRINTMODE)
1185*97189037SDavid van Moolenbroek 		(void)printf("%*s", v->width, "-");
1186*97189037SDavid van Moolenbroek }
1187*97189037SDavid van Moolenbroek 
1188*97189037SDavid van Moolenbroek void
tsize(void * arg,VARENT * ve,enum mode mode)1189*97189037SDavid van Moolenbroek tsize(void *arg, VARENT *ve, enum mode mode)
1190*97189037SDavid van Moolenbroek {
1191*97189037SDavid van Moolenbroek 	struct kinfo_proc2 *k;
1192*97189037SDavid van Moolenbroek 	VAR *v;
1193*97189037SDavid van Moolenbroek 
1194*97189037SDavid van Moolenbroek 	k = arg;
1195*97189037SDavid van Moolenbroek 	v = ve->var;
1196*97189037SDavid van Moolenbroek 	intprintorsetwidth(v, pgtok(k->p_vm_tsize), mode);
1197*97189037SDavid van Moolenbroek }
1198*97189037SDavid van Moolenbroek 
1199*97189037SDavid van Moolenbroek /*
1200*97189037SDavid van Moolenbroek  * Generic output routines.  Print fields from various prototype
1201*97189037SDavid van Moolenbroek  * structures.
1202*97189037SDavid van Moolenbroek  */
1203*97189037SDavid van Moolenbroek static void
printval(void * bp,VAR * v,enum mode mode)1204*97189037SDavid van Moolenbroek printval(void *bp, VAR *v, enum mode mode)
1205*97189037SDavid van Moolenbroek {
1206*97189037SDavid van Moolenbroek 	static char ofmt[32] = "%";
1207*97189037SDavid van Moolenbroek 	int width, vok, fmtlen;
1208*97189037SDavid van Moolenbroek 	const char *fcp;
1209*97189037SDavid van Moolenbroek 	char *cp;
1210*97189037SDavid van Moolenbroek 	int64_t val;
1211*97189037SDavid van Moolenbroek 	u_int64_t uval;
1212*97189037SDavid van Moolenbroek 
1213*97189037SDavid van Moolenbroek 	val = 0;	/* XXXGCC -Wuninitialized [hpcarm] */
1214*97189037SDavid van Moolenbroek 	uval = 0;	/* XXXGCC -Wuninitialized [hpcarm] */
1215*97189037SDavid van Moolenbroek 
1216*97189037SDavid van Moolenbroek 	/*
1217*97189037SDavid van Moolenbroek 	 * Note that the "INF127" check is nonsensical for types
1218*97189037SDavid van Moolenbroek 	 * that are or can be signed.
1219*97189037SDavid van Moolenbroek 	 */
1220*97189037SDavid van Moolenbroek #define	GET(type)		(*(type *)bp)
1221*97189037SDavid van Moolenbroek #define	CHK_INF127(n)		(((n) > 127) && (v->flag & INF127) ? 127 : (n))
1222*97189037SDavid van Moolenbroek 
1223*97189037SDavid van Moolenbroek #define	VSIGN	1
1224*97189037SDavid van Moolenbroek #define	VUNSIGN	2
1225*97189037SDavid van Moolenbroek #define	VPTR	3
1226*97189037SDavid van Moolenbroek 
1227*97189037SDavid van Moolenbroek 	if (mode == WIDTHMODE) {
1228*97189037SDavid van Moolenbroek 		vok = 0;
1229*97189037SDavid van Moolenbroek 		switch (v->type) {
1230*97189037SDavid van Moolenbroek 		case CHAR:
1231*97189037SDavid van Moolenbroek 			val = GET(char);
1232*97189037SDavid van Moolenbroek 			vok = VSIGN;
1233*97189037SDavid van Moolenbroek 			break;
1234*97189037SDavid van Moolenbroek 		case UCHAR:
1235*97189037SDavid van Moolenbroek 			uval = CHK_INF127(GET(u_char));
1236*97189037SDavid van Moolenbroek 			vok = VUNSIGN;
1237*97189037SDavid van Moolenbroek 			break;
1238*97189037SDavid van Moolenbroek 		case SHORT:
1239*97189037SDavid van Moolenbroek 			val = GET(short);
1240*97189037SDavid van Moolenbroek 			vok = VSIGN;
1241*97189037SDavid van Moolenbroek 			break;
1242*97189037SDavid van Moolenbroek 		case USHORT:
1243*97189037SDavid van Moolenbroek 			uval = CHK_INF127(GET(u_short));
1244*97189037SDavid van Moolenbroek 			vok = VUNSIGN;
1245*97189037SDavid van Moolenbroek 			break;
1246*97189037SDavid van Moolenbroek 		case INT32:
1247*97189037SDavid van Moolenbroek 			val = GET(int32_t);
1248*97189037SDavid van Moolenbroek 			vok = VSIGN;
1249*97189037SDavid van Moolenbroek 			break;
1250*97189037SDavid van Moolenbroek 		case INT:
1251*97189037SDavid van Moolenbroek 			val = GET(int);
1252*97189037SDavid van Moolenbroek 			vok = VSIGN;
1253*97189037SDavid van Moolenbroek 			break;
1254*97189037SDavid van Moolenbroek 		case UINT:
1255*97189037SDavid van Moolenbroek 		case UINT32:
1256*97189037SDavid van Moolenbroek 			uval = CHK_INF127(GET(u_int));
1257*97189037SDavid van Moolenbroek 			vok = VUNSIGN;
1258*97189037SDavid van Moolenbroek 			break;
1259*97189037SDavid van Moolenbroek 		case LONG:
1260*97189037SDavid van Moolenbroek 			val = GET(long);
1261*97189037SDavid van Moolenbroek 			vok = VSIGN;
1262*97189037SDavid van Moolenbroek 			break;
1263*97189037SDavid van Moolenbroek 		case ULONG:
1264*97189037SDavid van Moolenbroek 			uval = CHK_INF127(GET(u_long));
1265*97189037SDavid van Moolenbroek 			vok = VUNSIGN;
1266*97189037SDavid van Moolenbroek 			break;
1267*97189037SDavid van Moolenbroek 		case KPTR:
1268*97189037SDavid van Moolenbroek 			uval = GET(u_int64_t);
1269*97189037SDavid van Moolenbroek 			vok = VPTR;
1270*97189037SDavid van Moolenbroek 			break;
1271*97189037SDavid van Moolenbroek 		case KPTR24:
1272*97189037SDavid van Moolenbroek 			uval = GET(u_int64_t);
1273*97189037SDavid van Moolenbroek 			uval &= 0xffffff;
1274*97189037SDavid van Moolenbroek 			vok = VPTR;
1275*97189037SDavid van Moolenbroek 			break;
1276*97189037SDavid van Moolenbroek 		case INT64:
1277*97189037SDavid van Moolenbroek 			val = GET(int64_t);
1278*97189037SDavid van Moolenbroek 			vok = VSIGN;
1279*97189037SDavid van Moolenbroek 			break;
1280*97189037SDavid van Moolenbroek 		case UINT64:
1281*97189037SDavid van Moolenbroek 			uval = CHK_INF127(GET(u_int64_t));
1282*97189037SDavid van Moolenbroek 			vok = VUNSIGN;
1283*97189037SDavid van Moolenbroek 			break;
1284*97189037SDavid van Moolenbroek 
1285*97189037SDavid van Moolenbroek 		case SIGLIST:
1286*97189037SDavid van Moolenbroek 		default:
1287*97189037SDavid van Moolenbroek 			/* nothing... */;
1288*97189037SDavid van Moolenbroek 		}
1289*97189037SDavid van Moolenbroek 		switch (vok) {
1290*97189037SDavid van Moolenbroek 		case VSIGN:
1291*97189037SDavid van Moolenbroek 			if (val < 0 && val < v->longestn) {
1292*97189037SDavid van Moolenbroek 				v->longestn = val;
1293*97189037SDavid van Moolenbroek 				fmtlen = iwidth(-val) + 1;
1294*97189037SDavid van Moolenbroek 				if (fmtlen > v->width)
1295*97189037SDavid van Moolenbroek 					v->width = fmtlen;
1296*97189037SDavid van Moolenbroek 			} else if (val > 0 && val > v->longestp) {
1297*97189037SDavid van Moolenbroek 				v->longestp = val;
1298*97189037SDavid van Moolenbroek 				fmtlen = iwidth(val);
1299*97189037SDavid van Moolenbroek 				if (fmtlen > v->width)
1300*97189037SDavid van Moolenbroek 					v->width = fmtlen;
1301*97189037SDavid van Moolenbroek 			}
1302*97189037SDavid van Moolenbroek 			return;
1303*97189037SDavid van Moolenbroek 		case VUNSIGN:
1304*97189037SDavid van Moolenbroek 			if (uval > v->longestu) {
1305*97189037SDavid van Moolenbroek 				v->longestu = uval;
1306*97189037SDavid van Moolenbroek 				v->width = iwidth(uval);
1307*97189037SDavid van Moolenbroek 			}
1308*97189037SDavid van Moolenbroek 			return;
1309*97189037SDavid van Moolenbroek 		case VPTR:
1310*97189037SDavid van Moolenbroek 			fmtlen = 0;
1311*97189037SDavid van Moolenbroek 			while (uval > 0) {
1312*97189037SDavid van Moolenbroek 				uval >>= 4;
1313*97189037SDavid van Moolenbroek 				fmtlen++;
1314*97189037SDavid van Moolenbroek 			}
1315*97189037SDavid van Moolenbroek 			if (fmtlen > v->width)
1316*97189037SDavid van Moolenbroek 				v->width = fmtlen;
1317*97189037SDavid van Moolenbroek 			return;
1318*97189037SDavid van Moolenbroek 		}
1319*97189037SDavid van Moolenbroek 	}
1320*97189037SDavid van Moolenbroek 
1321*97189037SDavid van Moolenbroek 	width = v->width;
1322*97189037SDavid van Moolenbroek 	cp = ofmt + 1;
1323*97189037SDavid van Moolenbroek 	fcp = v->fmt;
1324*97189037SDavid van Moolenbroek 	if (v->flag & LJUST)
1325*97189037SDavid van Moolenbroek 		*cp++ = '-';
1326*97189037SDavid van Moolenbroek 	*cp++ = '*';
1327*97189037SDavid van Moolenbroek 	while ((*cp++ = *fcp++) != '\0')
1328*97189037SDavid van Moolenbroek 		continue;
1329*97189037SDavid van Moolenbroek 
1330*97189037SDavid van Moolenbroek 	switch (v->type) {
1331*97189037SDavid van Moolenbroek 	case CHAR:
1332*97189037SDavid van Moolenbroek 		(void)printf(ofmt, width, GET(char));
1333*97189037SDavid van Moolenbroek 		return;
1334*97189037SDavid van Moolenbroek 	case UCHAR:
1335*97189037SDavid van Moolenbroek 		(void)printf(ofmt, width, CHK_INF127(GET(u_char)));
1336*97189037SDavid van Moolenbroek 		return;
1337*97189037SDavid van Moolenbroek 	case SHORT:
1338*97189037SDavid van Moolenbroek 		(void)printf(ofmt, width, GET(short));
1339*97189037SDavid van Moolenbroek 		return;
1340*97189037SDavid van Moolenbroek 	case USHORT:
1341*97189037SDavid van Moolenbroek 		(void)printf(ofmt, width, CHK_INF127(GET(u_short)));
1342*97189037SDavid van Moolenbroek 		return;
1343*97189037SDavid van Moolenbroek 	case INT:
1344*97189037SDavid van Moolenbroek 		(void)printf(ofmt, width, GET(int));
1345*97189037SDavid van Moolenbroek 		return;
1346*97189037SDavid van Moolenbroek 	case UINT:
1347*97189037SDavid van Moolenbroek 		(void)printf(ofmt, width, CHK_INF127(GET(u_int)));
1348*97189037SDavid van Moolenbroek 		return;
1349*97189037SDavid van Moolenbroek 	case LONG:
1350*97189037SDavid van Moolenbroek 		(void)printf(ofmt, width, GET(long));
1351*97189037SDavid van Moolenbroek 		return;
1352*97189037SDavid van Moolenbroek 	case ULONG:
1353*97189037SDavid van Moolenbroek 		(void)printf(ofmt, width, CHK_INF127(GET(u_long)));
1354*97189037SDavid van Moolenbroek 		return;
1355*97189037SDavid van Moolenbroek 	case KPTR:
1356*97189037SDavid van Moolenbroek 		(void)printf(ofmt, width, GET(u_int64_t));
1357*97189037SDavid van Moolenbroek 		return;
1358*97189037SDavid van Moolenbroek 	case KPTR24:
1359*97189037SDavid van Moolenbroek 		(void)printf(ofmt, width, GET(u_int64_t) & 0xffffff);
1360*97189037SDavid van Moolenbroek 		return;
1361*97189037SDavid van Moolenbroek 	case INT32:
1362*97189037SDavid van Moolenbroek 		(void)printf(ofmt, width, GET(int32_t));
1363*97189037SDavid van Moolenbroek 		return;
1364*97189037SDavid van Moolenbroek 	case UINT32:
1365*97189037SDavid van Moolenbroek 		(void)printf(ofmt, width, CHK_INF127(GET(u_int32_t)));
1366*97189037SDavid van Moolenbroek 		return;
1367*97189037SDavid van Moolenbroek 	case SIGLIST:
1368*97189037SDavid van Moolenbroek 		{
1369*97189037SDavid van Moolenbroek 			sigset_t *s = (sigset_t *)(void *)bp;
1370*97189037SDavid van Moolenbroek 			size_t i;
1371*97189037SDavid van Moolenbroek #define	SIGSETSIZE	(sizeof(s->__bits) / sizeof(s->__bits[0]))
1372*97189037SDavid van Moolenbroek 			char buf[SIGSETSIZE * 8 + 1];
1373*97189037SDavid van Moolenbroek 
1374*97189037SDavid van Moolenbroek 			for (i = 0; i < SIGSETSIZE; i++)
1375*97189037SDavid van Moolenbroek 				(void)snprintf(&buf[i * 8], 9, "%.8x",
1376*97189037SDavid van Moolenbroek 				    s->__bits[(SIGSETSIZE - 1) - i]);
1377*97189037SDavid van Moolenbroek 
1378*97189037SDavid van Moolenbroek 			/* Skip leading zeroes */
1379*97189037SDavid van Moolenbroek 			for (i = 0; buf[i] == '0'; i++)
1380*97189037SDavid van Moolenbroek 				continue;
1381*97189037SDavid van Moolenbroek 
1382*97189037SDavid van Moolenbroek 			if (buf[i] == '\0')
1383*97189037SDavid van Moolenbroek 				i--;
1384*97189037SDavid van Moolenbroek 			strprintorsetwidth(v, buf + i, mode);
1385*97189037SDavid van Moolenbroek #undef SIGSETSIZE
1386*97189037SDavid van Moolenbroek 		}
1387*97189037SDavid van Moolenbroek 		return;
1388*97189037SDavid van Moolenbroek 	case INT64:
1389*97189037SDavid van Moolenbroek 		(void)printf(ofmt, width, GET(int64_t));
1390*97189037SDavid van Moolenbroek 		return;
1391*97189037SDavid van Moolenbroek 	case UINT64:
1392*97189037SDavid van Moolenbroek 		(void)printf(ofmt, width, CHK_INF127(GET(u_int64_t)));
1393*97189037SDavid van Moolenbroek 		return;
1394*97189037SDavid van Moolenbroek 	default:
1395*97189037SDavid van Moolenbroek 		errx(1, "unknown type %d", v->type);
1396*97189037SDavid van Moolenbroek 	}
1397*97189037SDavid van Moolenbroek #undef GET
1398*97189037SDavid van Moolenbroek #undef CHK_INF127
1399*97189037SDavid van Moolenbroek }
1400*97189037SDavid van Moolenbroek 
1401*97189037SDavid van Moolenbroek void
pvar(void * arg,VARENT * ve,enum mode mode)1402*97189037SDavid van Moolenbroek pvar(void *arg, VARENT *ve, enum mode mode)
1403*97189037SDavid van Moolenbroek {
1404*97189037SDavid van Moolenbroek 	VAR *v;
1405*97189037SDavid van Moolenbroek 
1406*97189037SDavid van Moolenbroek 	v = ve->var;
1407*97189037SDavid van Moolenbroek 	if (v->flag & UAREA && !((struct kinfo_proc2 *)arg)->p_uvalid) {
1408*97189037SDavid van Moolenbroek 		if (mode == PRINTMODE)
1409*97189037SDavid van Moolenbroek 			(void)printf("%*s", v->width, "-");
1410*97189037SDavid van Moolenbroek 		return;
1411*97189037SDavid van Moolenbroek 	}
1412*97189037SDavid van Moolenbroek 
1413*97189037SDavid van Moolenbroek 	(void)printval((char *)arg + v->off, v, mode);
1414*97189037SDavid van Moolenbroek }
1415*97189037SDavid van Moolenbroek 
1416*97189037SDavid van Moolenbroek void
putimeval(void * arg,VARENT * ve,enum mode mode)1417*97189037SDavid van Moolenbroek putimeval(void *arg, VARENT *ve, enum mode mode)
1418*97189037SDavid van Moolenbroek {
1419*97189037SDavid van Moolenbroek 	VAR *v = ve->var;
1420*97189037SDavid van Moolenbroek 	struct kinfo_proc2 *k = arg;
1421*97189037SDavid van Moolenbroek 	ulong secs = *(uint32_t *)((char *)arg + v->off);
1422*97189037SDavid van Moolenbroek 	ulong usec = *(uint32_t *)((char *)arg + v->off + sizeof (uint32_t));
1423*97189037SDavid van Moolenbroek 	int fmtlen;
1424*97189037SDavid van Moolenbroek 
1425*97189037SDavid van Moolenbroek 	if (!k->p_uvalid) {
1426*97189037SDavid van Moolenbroek 		if (mode == PRINTMODE)
1427*97189037SDavid van Moolenbroek 			(void)printf("%*s", v->width, "-");
1428*97189037SDavid van Moolenbroek 		return;
1429*97189037SDavid van Moolenbroek 	}
1430*97189037SDavid van Moolenbroek 
1431*97189037SDavid van Moolenbroek 	if (mode == WIDTHMODE) {
1432*97189037SDavid van Moolenbroek 		if (secs == 0)
1433*97189037SDavid van Moolenbroek 			/* non-zero so fmtlen is calculated at least once */
1434*97189037SDavid van Moolenbroek 			secs = 1;
1435*97189037SDavid van Moolenbroek 		if (secs > v->longestu) {
1436*97189037SDavid van Moolenbroek 			v->longestu = secs;
1437*97189037SDavid van Moolenbroek 			if (secs <= 999)
1438*97189037SDavid van Moolenbroek 				/* sss.ssssss */
1439*97189037SDavid van Moolenbroek 				fmtlen = iwidth(secs) + 6 + 1;
1440*97189037SDavid van Moolenbroek 			else
1441*97189037SDavid van Moolenbroek 				/* hh:mm:ss.ss */
1442*97189037SDavid van Moolenbroek 				fmtlen = iwidth((secs + 1) / SECSPERHOUR)
1443*97189037SDavid van Moolenbroek 					+ 2 + 1 + 2 + 1 + 2 + 1;
1444*97189037SDavid van Moolenbroek 			if (fmtlen > v->width)
1445*97189037SDavid van Moolenbroek 				v->width = fmtlen;
1446*97189037SDavid van Moolenbroek 		}
1447*97189037SDavid van Moolenbroek 		return;
1448*97189037SDavid van Moolenbroek 	}
1449*97189037SDavid van Moolenbroek 
1450*97189037SDavid van Moolenbroek 	if (secs < 999)
1451*97189037SDavid van Moolenbroek 		(void)printf( "%*lu.%.6lu", v->width - 6 - 1, secs, usec);
1452*97189037SDavid van Moolenbroek 	else {
1453*97189037SDavid van Moolenbroek 		uint h, m;
1454*97189037SDavid van Moolenbroek 		usec += 5000;
1455*97189037SDavid van Moolenbroek 		if (usec >= 1000000) {
1456*97189037SDavid van Moolenbroek 			usec -= 1000000;
1457*97189037SDavid van Moolenbroek 			secs++;
1458*97189037SDavid van Moolenbroek 		}
1459*97189037SDavid van Moolenbroek 		m = secs / SECSPERMIN;
1460*97189037SDavid van Moolenbroek 		secs -= m * SECSPERMIN;
1461*97189037SDavid van Moolenbroek 		h = m / MINSPERHOUR;
1462*97189037SDavid van Moolenbroek 		m -= h * MINSPERHOUR;
1463*97189037SDavid van Moolenbroek 		(void)printf( "%*u:%.2u:%.2lu.%.2lu", v->width - 9, h, m, secs,
1464*97189037SDavid van Moolenbroek 		    usec / 10000u );
1465*97189037SDavid van Moolenbroek 	}
1466*97189037SDavid van Moolenbroek }
1467*97189037SDavid van Moolenbroek 
1468*97189037SDavid van Moolenbroek void
lname(void * arg,VARENT * ve,enum mode mode)1469*97189037SDavid van Moolenbroek lname(void *arg, VARENT *ve, enum mode mode)
1470*97189037SDavid van Moolenbroek {
1471*97189037SDavid van Moolenbroek 	struct kinfo_lwp *l;
1472*97189037SDavid van Moolenbroek 	VAR *v;
1473*97189037SDavid van Moolenbroek 
1474*97189037SDavid van Moolenbroek 	l = arg;
1475*97189037SDavid van Moolenbroek 	v = ve->var;
1476*97189037SDavid van Moolenbroek 	if (l->l_name[0] != '\0') {
1477*97189037SDavid van Moolenbroek 		strprintorsetwidth(v, l->l_name, mode);
1478*97189037SDavid van Moolenbroek 		v->width = min(v->width, KI_LNAMELEN);
1479*97189037SDavid van Moolenbroek 	} else {
1480*97189037SDavid van Moolenbroek 		if (mode == PRINTMODE)
1481*97189037SDavid van Moolenbroek 			(void)printf("%-*s", v->width, "-");
1482*97189037SDavid van Moolenbroek 	}
1483*97189037SDavid van Moolenbroek }
1484