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