xref: /freebsd/bin/ps/print.c (revision 09e8dea79366f1e5b3a73e8a271b26e4b6bf2e6a)
1 /*-
2  * Copyright (c) 1990, 1993, 1994
3  *	The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *	This product includes software developed by the University of
16  *	California, Berkeley and its contributors.
17  * 4. Neither the name of the University nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  */
33 
34 #include <sys/cdefs.h>
35 
36 __FBSDID("$FreeBSD$");
37 
38 #if 0
39 #ifndef lint
40 static char sccsid[] = "@(#)print.c	8.6 (Berkeley) 4/16/94";
41 #endif /* not lint */
42 #endif
43 
44 #include <sys/param.h>
45 #include <sys/time.h>
46 #include <sys/resource.h>
47 #include <sys/proc.h>
48 #include <sys/stat.h>
49 
50 #include <sys/user.h>
51 #include <sys/sysctl.h>
52 
53 #include <err.h>
54 #include <grp.h>
55 #include <langinfo.h>
56 #include <locale.h>
57 #include <math.h>
58 #include <nlist.h>
59 #include <pwd.h>
60 #include <stddef.h>
61 #include <stdio.h>
62 #include <stdlib.h>
63 #include <string.h>
64 #include <unistd.h>
65 #include <vis.h>
66 
67 #include "lomac.h"
68 #include "ps.h"
69 
70 static void printval(char *, VAR *);
71 
72 void
73 printheader(void)
74 {
75 	VAR *v;
76 	struct varent *vent;
77 
78 	for (vent = vhead; vent; vent = vent->next) {
79 		v = vent->var;
80 		if (v->flag & LJUST) {
81 			if (vent->next == NULL)	/* last one */
82 				(void)printf("%s", v->header);
83 			else
84 				(void)printf("%-*s", v->width, v->header);
85 		} else
86 			(void)printf("%*s", v->width, v->header);
87 		if (vent->next != NULL)
88 			(void)putchar(' ');
89 	}
90 	(void)putchar('\n');
91 }
92 
93 void
94 arguments(KINFO *k, VARENT *ve)
95 {
96 	VAR *v;
97 	int left;
98 	char *cp, *vis_args;
99 
100 	v = ve->var;
101 
102 	if ((vis_args = malloc(strlen(k->ki_args) * 4 + 1)) == NULL)
103 		errx(1, "malloc failed");
104 	strvis(vis_args, k->ki_args, VIS_TAB | VIS_NL | VIS_NOSLASH);
105 
106 	if (ve->next == NULL) {
107 		/* last field */
108 		if (termwidth == UNLIMITED) {
109 			(void)printf("%s", vis_args);
110 		} else {
111 			left = termwidth - (totwidth - v->width);
112 			if (left < 1) /* already wrapped, just use std width */
113 				left = v->width;
114 			for (cp = vis_args; --left >= 0 && *cp != '\0';)
115 				(void)putchar(*cp++);
116 		}
117 	} else {
118 		(void)printf("%-*.*s", v->width, v->width, vis_args);
119 	}
120 	free(vis_args);
121 }
122 
123 void
124 command(KINFO *k, VARENT *ve)
125 {
126 	VAR *v;
127 	int left;
128 	char *cp, *vis_env, *vis_args;
129 
130 	v = ve->var;
131 
132 	if (cflag) {
133 		if (ve->next == NULL)	/* last field, don't pad */
134 			(void)printf("%s", k->ki_p->ki_comm);
135 		else
136 			(void)printf("%-*s", v->width, k->ki_p->ki_comm);
137 		return;
138 	}
139 
140 	if ((vis_args = malloc(strlen(k->ki_args) * 4 + 1)) == NULL)
141 		errx(1, "malloc failed");
142 	strvis(vis_args, k->ki_args, VIS_TAB | VIS_NL | VIS_NOSLASH);
143 	if (k->ki_env) {
144 		if ((vis_env = malloc(strlen(k->ki_env) * 4 + 1)) == NULL)
145 			errx(1, "malloc failed");
146 		strvis(vis_env, k->ki_env, VIS_TAB | VIS_NL | VIS_NOSLASH);
147 	} else
148 		vis_env = NULL;
149 
150 	if (ve->next == NULL) {
151 		/* last field */
152 		if (termwidth == UNLIMITED) {
153 			if (vis_env)
154 				(void)printf("%s ", vis_env);
155 			(void)printf("%s", vis_args);
156 		} else {
157 			left = termwidth - (totwidth - v->width);
158 			if (left < 1) /* already wrapped, just use std width */
159 				left = v->width;
160 			if ((cp = vis_env) != NULL) {
161 				while (--left >= 0 && *cp)
162 					(void)putchar(*cp++);
163 				if (--left >= 0)
164 					putchar(' ');
165 			}
166 			for (cp = vis_args; --left >= 0 && *cp != '\0';)
167 				(void)putchar(*cp++);
168 		}
169 	} else
170 		/* XXX env? */
171 		(void)printf("%-*.*s", v->width, v->width, vis_args);
172 	free(vis_args);
173 	if (vis_env != NULL)
174 		free(vis_env);
175 }
176 
177 void
178 ucomm(KINFO *k, VARENT *ve)
179 {
180 	VAR *v;
181 
182 	v = ve->var;
183 	(void)printf("%-*s", v->width, k->ki_p->ki_comm);
184 }
185 
186 void
187 logname(KINFO *k, VARENT *ve)
188 {
189 	VAR *v;
190 	char *s;
191 
192 	v = ve->var;
193 	(void)printf("%-*s", v->width, (s = k->ki_p->ki_login, *s) ? s : "-");
194 }
195 
196 void
197 state(KINFO *k, VARENT *ve)
198 {
199 	int flag, sflag, tdflags;
200 	char *cp;
201 	VAR *v;
202 	char buf[16];
203 
204 	v = ve->var;
205 	flag = k->ki_p->ki_flag;
206 	sflag = k->ki_p->ki_sflag;
207 	tdflags = k->ki_p->ki_tdflags;	/* XXXKSE */
208 	cp = buf;
209 
210 	switch (k->ki_p->ki_stat) {
211 
212 	case SSTOP:
213 		*cp = 'T';
214 		break;
215 
216 	case SSLEEP:
217 		if (tdflags & TDF_SINTR)	/* interruptable (long) */
218 			*cp = k->ki_p->ki_slptime >= MAXSLP ? 'I' : 'S';
219 		else
220 			*cp = 'D';
221 		break;
222 
223 	case SRUN:
224 	case SIDL:
225 		*cp = 'R';
226 		break;
227 
228 	case SWAIT:
229 		*cp = 'W';
230 		break;
231 
232 	case SMTX:
233 		*cp = 'M';
234 		break;
235 
236 	case SZOMB:
237 		*cp = 'Z';
238 		break;
239 
240 	default:
241 		*cp = '?';
242 	}
243 	cp++;
244 	if (!(sflag & PS_INMEM))
245 		*cp++ = 'W';
246 	if (k->ki_p->ki_nice < NZERO)
247 		*cp++ = '<';
248 	else if (k->ki_p->ki_nice > NZERO)
249 		*cp++ = 'N';
250 	if (flag & P_TRACED)
251 		*cp++ = 'X';
252 	if (flag & P_WEXIT && k->ki_p->ki_stat != SZOMB)
253 		*cp++ = 'E';
254 	if (flag & P_PPWAIT)
255 		*cp++ = 'V';
256 	if ((flag & P_SYSTEM) || k->ki_p->ki_lock > 0)
257 		*cp++ = 'L';
258 	if (k->ki_p->ki_kiflag & KI_SLEADER)
259 		*cp++ = 's';
260 	if ((flag & P_CONTROLT) && k->ki_p->ki_pgid == k->ki_p->ki_tpgid)
261 		*cp++ = '+';
262 	if (flag & P_JAILED)
263 		*cp++ = 'J';
264 	*cp = '\0';
265 	(void)printf("%-*s", v->width, buf);
266 }
267 
268 void
269 pri(KINFO *k, VARENT *ve)
270 {
271 	VAR *v;
272 
273 	v = ve->var;
274 	(void)printf("%*d", v->width, k->ki_p->ki_pri.pri_level - PZERO);
275 }
276 
277 void
278 uname(KINFO *k, VARENT *ve)
279 {
280 	VAR *v;
281 
282 	v = ve->var;
283 	(void)printf("%-*s", v->width, user_from_uid(k->ki_p->ki_uid, 0));
284 }
285 
286 int
287 s_uname(KINFO *k)
288 {
289 	    return (strlen(user_from_uid(k->ki_p->ki_uid, 0)));
290 }
291 
292 void
293 rgroupname(KINFO *k, VARENT *ve)
294 {
295 	VAR *v;
296 
297 	v = ve->var;
298 	(void)printf("%-*s", v->width, group_from_gid(k->ki_p->ki_rgid, 0));
299 }
300 
301 int
302 s_rgroupname(KINFO *k)
303 {
304 	return (strlen(group_from_gid(k->ki_p->ki_rgid, 0)));
305 }
306 
307 void
308 runame(KINFO *k, VARENT *ve)
309 {
310 	VAR *v;
311 
312 	v = ve->var;
313 	(void)printf("%-*s", v->width, user_from_uid(k->ki_p->ki_ruid, 0));
314 }
315 
316 int
317 s_runame(KINFO *k)
318 {
319 	    return (strlen(user_from_uid(k->ki_p->ki_ruid, 0)));
320 }
321 
322 void
323 tdev(KINFO *k, VARENT *ve)
324 {
325 	VAR *v;
326 	dev_t dev;
327 	char buff[16];
328 
329 	v = ve->var;
330 	dev = k->ki_p->ki_tdev;
331 	if (dev == NODEV)
332 		(void)printf("%*s", v->width, "??");
333 	else {
334 		(void)snprintf(buff, sizeof(buff),
335 		    "%d/%d", major(dev), minor(dev));
336 		(void)printf("%*s", v->width, buff);
337 	}
338 }
339 
340 void
341 tname(KINFO *k, VARENT *ve)
342 {
343 	VAR *v;
344 	dev_t dev;
345 	char *ttname;
346 
347 	v = ve->var;
348 	dev = k->ki_p->ki_tdev;
349 	if (dev == NODEV || (ttname = devname(dev, S_IFCHR)) == NULL)
350 		(void)printf("%*s ", v->width-1, "??");
351 	else {
352 		if (strncmp(ttname, "tty", 3) == 0 ||
353 		    strncmp(ttname, "cua", 3) == 0)
354 			ttname += 3;
355 		(void)printf("%*.*s%c", v->width-1, v->width-1, ttname,
356 			k->ki_p->ki_kiflag & KI_CTTY ? ' ' : '-');
357 	}
358 }
359 
360 void
361 longtname(KINFO *k, VARENT *ve)
362 {
363 	VAR *v;
364 	dev_t dev;
365 	char *ttname;
366 
367 	v = ve->var;
368 	dev = k->ki_p->ki_tdev;
369 	if (dev == NODEV || (ttname = devname(dev, S_IFCHR)) == NULL)
370 		(void)printf("%-*s", v->width, "??");
371 	else
372 		(void)printf("%-*s", v->width, ttname);
373 }
374 
375 void
376 started(KINFO *k, VARENT *ve)
377 {
378 	VAR *v;
379 	time_t then;
380 	struct tm *tp;
381 	char buf[100];
382 	static int  use_ampm = -1;
383 
384 	v = ve->var;
385 	if (!k->ki_valid) {
386 		(void)printf("%-*s", v->width, "-");
387 		return;
388 	}
389 
390 	if (use_ampm < 0)
391 		use_ampm = (*nl_langinfo(T_FMT_AMPM) != '\0');
392 
393 	then = k->ki_p->ki_start.tv_sec;
394 	tp = localtime(&then);
395 	if (now - k->ki_p->ki_start.tv_sec < 24 * 3600) {
396 		(void)strftime(buf, sizeof(buf) - 1,
397 		use_ampm ? "%l:%M%p" : "%k:%M  ", tp);
398 	} else if (now - k->ki_p->ki_start.tv_sec < 7 * 86400) {
399 		(void)strftime(buf, sizeof(buf) - 1,
400 		use_ampm ? "%a%I%p" : "%a%H  ", tp);
401 	} else
402 		(void)strftime(buf, sizeof(buf) - 1, "%e%b%y", tp);
403 	(void)printf("%-*s", v->width, buf);
404 }
405 
406 void
407 lstarted(KINFO *k, VARENT *ve)
408 {
409 	VAR *v;
410 	time_t then;
411 	char buf[100];
412 
413 	v = ve->var;
414 	if (!k->ki_valid) {
415 		(void)printf("%-*s", v->width, "-");
416 		return;
417 	}
418 	then = k->ki_p->ki_start.tv_sec;
419 	(void)strftime(buf, sizeof(buf) -1, "%c", localtime(&then));
420 	(void)printf("%-*s", v->width, buf);
421 }
422 
423 void
424 mtxname(KINFO *k, VARENT *ve)
425 {
426 	VAR *v;
427 
428 	v = ve->var;
429 	if (k->ki_p->ki_kiflag & KI_MTXBLOCK) {
430 		if (k->ki_p->ki_mtxname[0] != 0)
431 			(void)printf("%-*.*s", v->width, v->width,
432 				      k->ki_p->ki_mtxname);
433 		else
434 			(void)printf("%-*s", v->width, "???");
435 	} else
436 		(void)printf("%-*s", v->width, "-");
437 }
438 
439 void
440 wchan(KINFO *k, VARENT *ve)
441 {
442 	VAR *v;
443 
444 	v = ve->var;
445 	if (k->ki_p->ki_wchan) {
446 		if (k->ki_p->ki_wmesg[0] != 0)
447 			(void)printf("%-*.*s", v->width, v->width,
448 				      k->ki_p->ki_wmesg);
449 		else
450 			(void)printf("%-*lx", v->width,
451 			    (long)k->ki_p->ki_wchan);
452 	} else {
453 		(void)printf("%-*s", v->width, "-");
454 	}
455 }
456 
457 void
458 mwchan(KINFO *k, VARENT *ve)
459 {
460 	VAR *v;
461 
462 	v = ve->var;
463 	if (k->ki_p->ki_wchan) {
464 		if (k->ki_p->ki_wmesg[0] != 0)
465 			(void)printf("%-*.*s", v->width, v->width,
466 				      k->ki_p->ki_wmesg);
467 		else
468 			(void)printf("%-*lx", v->width,
469 			    (long)k->ki_p->ki_wchan);
470 	} else if (k->ki_p->ki_kiflag & KI_MTXBLOCK) {
471 		if (k->ki_p->ki_mtxname[0]) {
472 			(void)printf("%-*.*s", v->width, v->width,
473 			    k->ki_p->ki_mtxname);
474 		} else {
475 			(void)printf("%-*s", v->width, "???");
476 		}
477 	} else {
478 		(void)printf("%-*s", v->width, "-");
479 	}
480 }
481 
482 #ifndef pgtok
483 #define pgtok(a)        (((a)*getpagesize())/1024)
484 #endif
485 
486 void
487 vsize(KINFO *k, VARENT *ve)
488 {
489 	VAR *v;
490 
491 	v = ve->var;
492 	(void)printf("%*d", v->width,
493 	    (k->ki_p->ki_size/1024));
494 }
495 
496 void
497 cputime(KINFO *k, VARENT *ve)
498 {
499 	VAR *v;
500 	long secs;
501 	long psecs;	/* "parts" of a second. first micro, then centi */
502 	char obuff[128];
503 	static char decimal_point = 0;
504 
505 	if (!decimal_point)
506 		decimal_point = localeconv()->decimal_point[0];
507 	v = ve->var;
508 	if (k->ki_p->ki_stat == SZOMB || !k->ki_valid) {
509 		secs = 0;
510 		psecs = 0;
511 	} else {
512 		/*
513 		 * This counts time spent handling interrupts.  We could
514 		 * fix this, but it is not 100% trivial (and interrupt
515 		 * time fractions only work on the sparc anyway).	XXX
516 		 */
517 		secs = k->ki_p->ki_runtime / 1000000;
518 		psecs = k->ki_p->ki_runtime % 1000000;
519 		if (sumrusage) {
520 			secs += k->ki_p->ki_childtime.tv_sec;
521 			psecs += k->ki_p->ki_childtime.tv_usec;
522 		}
523 		/*
524 		 * round and scale to 100's
525 		 */
526 		psecs = (psecs + 5000) / 10000;
527 		secs += psecs / 100;
528 		psecs = psecs % 100;
529 	}
530 	(void)snprintf(obuff, sizeof(obuff),
531 	    "%3ld:%02ld%c%02ld", secs/60, secs%60, decimal_point, psecs);
532 	(void)printf("%*s", v->width, obuff);
533 }
534 
535 void
536 elapsed(KINFO *k, VARENT *ve)
537 {
538 	VAR *v;
539 	time_t secs;
540 	char obuff[128];
541 
542 	v = ve->var;
543 
544 	secs = now - k->ki_p->ki_start.tv_sec;
545 	(void)snprintf(obuff, sizeof(obuff), "%3ld:%02ld", (long)secs/60,
546 	    (long)secs%60);
547 	(void)printf("%*s", v->width, obuff);
548 }
549 
550 double
551 getpcpu(const KINFO *k)
552 {
553 	static int failure;
554 
555 	if (!nlistread)
556 		failure = donlist();
557 	if (failure)
558 		return (0.0);
559 
560 #define	fxtofl(fixpt)	((double)(fixpt) / fscale)
561 
562 	/* XXX - I don't like this */
563 	if (k->ki_p->ki_swtime == 0 || (k->ki_p->ki_sflag & PS_INMEM) == 0)
564 		return (0.0);
565 	if (rawcpu)
566 		return (100.0 * fxtofl(k->ki_p->ki_pctcpu));
567 	return (100.0 * fxtofl(k->ki_p->ki_pctcpu) /
568 		(1.0 - exp(k->ki_p->ki_swtime * log(fxtofl(ccpu)))));
569 }
570 
571 void
572 pcpu(KINFO *k, VARENT *ve)
573 {
574 	VAR *v;
575 
576 	v = ve->var;
577 	(void)printf("%*.1f", v->width, getpcpu(k));
578 }
579 
580 static double
581 getpmem(KINFO *k)
582 {
583 	static int failure;
584 	double fracmem;
585 
586 	if (!nlistread)
587 		failure = donlist();
588 	if (failure)
589 		return (0.0);
590 
591 	if ((k->ki_p->ki_sflag & PS_INMEM) == 0)
592 		return (0.0);
593 	/* XXX want pmap ptpages, segtab, etc. (per architecture) */
594 	/* XXX don't have info about shared */
595 	fracmem = ((float)k->ki_p->ki_rssize)/mempages;
596 	return (100.0 * fracmem);
597 }
598 
599 void
600 pmem(KINFO *k, VARENT *ve)
601 {
602 	VAR *v;
603 
604 	v = ve->var;
605 	(void)printf("%*.1f", v->width, getpmem(k));
606 }
607 
608 void
609 pagein(KINFO *k, VARENT *ve)
610 {
611 	VAR *v;
612 
613 	v = ve->var;
614 	(void)printf("%*ld", v->width,
615 	    k->ki_valid ? k->ki_p->ki_rusage.ru_majflt : 0);
616 }
617 
618 /* ARGSUSED */
619 void
620 maxrss(KINFO *k __unused, VARENT *ve)
621 {
622 	VAR *v;
623 
624 	v = ve->var;
625 	/* XXX not yet */
626 	(void)printf("%*s", v->width, "-");
627 }
628 
629 void
630 tsize(KINFO *k, VARENT *ve)
631 {
632 	VAR *v;
633 
634 	v = ve->var;
635 	(void)printf("%*ld", v->width, (long)pgtok(k->ki_p->ki_tsize));
636 }
637 
638 void
639 priorityr(KINFO *k, VARENT *ve)
640 {
641 	VAR *v;
642 	struct priority *lpri;
643 	char str[8];
644 	unsigned class, level;
645 
646 	v = ve->var;
647 	lpri = (struct priority *) ((char *)k + v->off);
648 	class = lpri->pri_class;
649 	level = lpri->pri_level;
650 	switch (class) {
651 	case PRI_REALTIME:
652 		snprintf(str, sizeof(str), "real:%u", level);
653 		break;
654 	case PRI_TIMESHARE:
655 		strncpy(str, "normal", sizeof(str));
656 		break;
657 	case PRI_IDLE:
658 		snprintf(str, sizeof(str), "idle:%u", level);
659 		break;
660 	default:
661 		snprintf(str, sizeof(str), "%u:%u", class, level);
662 		break;
663 	}
664 	str[sizeof(str) - 1] = '\0';
665 	(void)printf("%*s", v->width, str);
666 }
667 
668 /*
669  * Generic output routines.  Print fields from various prototype
670  * structures.
671  */
672 static void
673 printval(char *bp, VAR *v)
674 {
675 	static char ofmt[32] = "%";
676 	const char *fcp;
677 	char *cp;
678 
679 	cp = ofmt + 1;
680 	fcp = v->fmt;
681 	if (v->flag & LJUST)
682 		*cp++ = '-';
683 	*cp++ = '*';
684 	while ((*cp++ = *fcp++));
685 
686 	switch (v->type) {
687 	case CHAR:
688 		(void)printf(ofmt, v->width, *(char *)bp);
689 		break;
690 	case UCHAR:
691 		(void)printf(ofmt, v->width, *(u_char *)bp);
692 		break;
693 	case SHORT:
694 		(void)printf(ofmt, v->width, *(short *)bp);
695 		break;
696 	case USHORT:
697 		(void)printf(ofmt, v->width, *(u_short *)bp);
698 		break;
699 	case INT:
700 		(void)printf(ofmt, v->width, *(int *)bp);
701 		break;
702 	case UINT:
703 		(void)printf(ofmt, v->width, *(u_int *)bp);
704 		break;
705 	case LONG:
706 		(void)printf(ofmt, v->width, *(long *)bp);
707 		break;
708 	case ULONG:
709 		(void)printf(ofmt, v->width, *(u_long *)bp);
710 		break;
711 	case KPTR:
712 		(void)printf(ofmt, v->width, *(u_long *)bp);
713 		break;
714 	default:
715 		errx(1, "unknown type %d", v->type);
716 	}
717 }
718 
719 void
720 kvar(KINFO *k, VARENT *ve)
721 {
722 	VAR *v;
723 
724 	v = ve->var;
725 	printval((char *)((char *)k->ki_p + v->off), v);
726 }
727 
728 void
729 rvar(KINFO *k, VARENT *ve)
730 {
731 	VAR *v;
732 
733 	v = ve->var;
734 	if (k->ki_valid)
735 		printval((char *)((char *)(&k->ki_p->ki_rusage) + v->off), v);
736 	else
737 		(void)printf("%*s", v->width, "-");
738 }
739 
740 void
741 lattr(KINFO *k, VARENT *ve)
742 {
743 	VAR *v;
744 
745 	v = ve->var;
746 	(void)printf("%-*d", v->width, get_lattr(k->ki_p->ki_pid));
747 }
748