print.c revision 219713
11556Srgrimes/*-
21556Srgrimes * Copyright (c) 1990, 1993, 1994
31556Srgrimes *	The Regents of the University of California.  All rights reserved.
41556Srgrimes *
51556Srgrimes * Redistribution and use in source and binary forms, with or without
61556Srgrimes * modification, are permitted provided that the following conditions
71556Srgrimes * are met:
81556Srgrimes * 1. Redistributions of source code must retain the above copyright
91556Srgrimes *    notice, this list of conditions and the following disclaimer.
101556Srgrimes * 2. Redistributions in binary form must reproduce the above copyright
111556Srgrimes *    notice, this list of conditions and the following disclaimer in the
121556Srgrimes *    documentation and/or other materials provided with the distribution.
131556Srgrimes * 4. Neither the name of the University nor the names of its contributors
141556Srgrimes *    may be used to endorse or promote products derived from this software
151556Srgrimes *    without specific prior written permission.
161556Srgrimes *
171556Srgrimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
181556Srgrimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
191556Srgrimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
201556Srgrimes * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
211556Srgrimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
221556Srgrimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
231556Srgrimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
241556Srgrimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
251556Srgrimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
261556Srgrimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
271556Srgrimes * SUCH DAMAGE.
281556Srgrimes */
291556Srgrimes
3090143Smarkm#if 0
311556Srgrimes#ifndef lint
3236049Scharnierstatic char sccsid[] = "@(#)print.c	8.6 (Berkeley) 4/16/94";
3390143Smarkm#endif /* not lint */
3436049Scharnier#endif
35110391Scharnier
3699110Sobrien#include <sys/cdefs.h>
3799110Sobrien__FBSDID("$FreeBSD: head/bin/ps/print.c 219713 2011-03-17 11:25:32Z kib $");
381556Srgrimes
391556Srgrimes#include <sys/param.h>
401556Srgrimes#include <sys/time.h>
411556Srgrimes#include <sys/resource.h>
421556Srgrimes#include <sys/proc.h>
431556Srgrimes#include <sys/stat.h>
441556Srgrimes
45105831Srwatson#include <sys/mac.h>
4611890Sphk#include <sys/user.h>
471556Srgrimes#include <sys/sysctl.h>
48217192Skib#include <sys/vmmeter.h>
491556Srgrimes
501556Srgrimes#include <err.h>
5190878Simp#include <grp.h>
5273369Sache#include <langinfo.h>
5372343Sache#include <locale.h>
541556Srgrimes#include <math.h>
551556Srgrimes#include <nlist.h>
5690878Simp#include <pwd.h>
571556Srgrimes#include <stddef.h>
58205271Sjmallett#include <stdint.h>
591556Srgrimes#include <stdio.h>
601556Srgrimes#include <stdlib.h>
6190143Smarkm#include <string.h>
6216835Speter#include <unistd.h>
631556Srgrimes#include <vis.h>
641556Srgrimes
651556Srgrimes#include "ps.h"
661556Srgrimes
67103274Speter#define	ps_pgtok(a)	(((a) * getpagesize()) / 1024)
6890143Smarkm
691556Srgrimesvoid
7090110Simpprintheader(void)
711556Srgrimes{
721556Srgrimes	VAR *v;
731556Srgrimes	struct varent *vent;
741556Srgrimes
75130999Sgad	STAILQ_FOREACH(vent, &varlist, next_ve)
76130999Sgad		if (*vent->header != '\0')
77106251Stjr			break;
78130999Sgad	if (!vent)
79106251Stjr		return;
80130999Sgad
81130999Sgad	STAILQ_FOREACH(vent, &varlist, next_ve) {
821556Srgrimes		v = vent->var;
831556Srgrimes		if (v->flag & LJUST) {
84130999Sgad			if (STAILQ_NEXT(vent, next_ve) == NULL)	/* last one */
85109504Sjmallett				(void)printf("%s", vent->header);
861556Srgrimes			else
87109504Sjmallett				(void)printf("%-*s", v->width, vent->header);
881556Srgrimes		} else
89109504Sjmallett			(void)printf("%*s", v->width, vent->header);
90130999Sgad		if (STAILQ_NEXT(vent, next_ve) != NULL)
911556Srgrimes			(void)putchar(' ');
921556Srgrimes	}
931556Srgrimes	(void)putchar('\n');
941556Srgrimes}
951556Srgrimes
961556Srgrimesvoid
9797958Sjmallettarguments(KINFO *k, VARENT *ve)
9897958Sjmallett{
9997958Sjmallett	VAR *v;
10097958Sjmallett	int left;
10197958Sjmallett	char *cp, *vis_args;
10297958Sjmallett
10397958Sjmallett	v = ve->var;
10497958Sjmallett	if ((vis_args = malloc(strlen(k->ki_args) * 4 + 1)) == NULL)
10597958Sjmallett		errx(1, "malloc failed");
10697958Sjmallett	strvis(vis_args, k->ki_args, VIS_TAB | VIS_NL | VIS_NOSLASH);
107130999Sgad	if (STAILQ_NEXT(ve, next_ve) == NULL) {
10897958Sjmallett		/* last field */
10997958Sjmallett		if (termwidth == UNLIMITED) {
11097958Sjmallett			(void)printf("%s", vis_args);
11197958Sjmallett		} else {
11297958Sjmallett			left = termwidth - (totwidth - v->width);
11397958Sjmallett			if (left < 1) /* already wrapped, just use std width */
11497958Sjmallett				left = v->width;
11597958Sjmallett			for (cp = vis_args; --left >= 0 && *cp != '\0';)
11697958Sjmallett				(void)putchar(*cp++);
11797958Sjmallett		}
11897958Sjmallett	} else {
11997958Sjmallett		(void)printf("%-*.*s", v->width, v->width, vis_args);
12097958Sjmallett	}
12197958Sjmallett	free(vis_args);
12297958Sjmallett}
12397958Sjmallett
12497958Sjmallettvoid
12590110Simpcommand(KINFO *k, VARENT *ve)
1261556Srgrimes{
1271556Srgrimes	VAR *v;
1281556Srgrimes	int left;
1291556Srgrimes	char *cp, *vis_env, *vis_args;
1301556Srgrimes
13119068Speter	v = ve->var;
13219068Speter	if (cflag) {
133130999Sgad		/* If it is the last field, then don't pad */
134173004Sjulian		if (STAILQ_NEXT(ve, next_ve) == NULL) {
135192239Sbrian			if (k->ki_d.prefix)
136192239Sbrian				(void)printf("%s", k->ki_d.prefix);
13769896Smckusick			(void)printf("%s", k->ki_p->ki_comm);
138173004Sjulian			if (showthreads && k->ki_p->ki_numthreads > 1)
139192239Sbrian				(void)printf("/%s", k->ki_p->ki_ocomm);
140173004Sjulian		} else
14169896Smckusick			(void)printf("%-*s", v->width, k->ki_p->ki_comm);
14219068Speter		return;
14319068Speter	}
1441556Srgrimes	if ((vis_args = malloc(strlen(k->ki_args) * 4 + 1)) == NULL)
14597877Sjmallett		errx(1, "malloc failed");
1461556Srgrimes	strvis(vis_args, k->ki_args, VIS_TAB | VIS_NL | VIS_NOSLASH);
1471556Srgrimes
148130999Sgad	if (STAILQ_NEXT(ve, next_ve) == NULL) {
1491556Srgrimes		/* last field */
150192239Sbrian
151192239Sbrian		if (k->ki_env) {
152192239Sbrian			if ((vis_env = malloc(strlen(k->ki_env) * 4 + 1))
153192239Sbrian			    == NULL)
154192239Sbrian				errx(1, "malloc failed");
155192239Sbrian			strvis(vis_env, k->ki_env,
156192239Sbrian			    VIS_TAB | VIS_NL | VIS_NOSLASH);
157192239Sbrian		} else
158192239Sbrian			vis_env = NULL;
159192239Sbrian
1601556Srgrimes		if (termwidth == UNLIMITED) {
161192239Sbrian			if (k->ki_d.prefix)
162192239Sbrian				(void)printf("%s", k->ki_d.prefix);
1631556Srgrimes			if (vis_env)
1641556Srgrimes				(void)printf("%s ", vis_env);
1651556Srgrimes			(void)printf("%s", vis_args);
1661556Srgrimes		} else {
1671556Srgrimes			left = termwidth - (totwidth - v->width);
1681556Srgrimes			if (left < 1) /* already wrapped, just use std width */
1691556Srgrimes				left = v->width;
170192239Sbrian			if ((cp = k->ki_d.prefix) != NULL)
171192239Sbrian				while (--left >= 0 && *cp)
172192239Sbrian					(void)putchar(*cp++);
1731556Srgrimes			if ((cp = vis_env) != NULL) {
1741556Srgrimes				while (--left >= 0 && *cp)
1751556Srgrimes					(void)putchar(*cp++);
1761556Srgrimes				if (--left >= 0)
1771556Srgrimes					putchar(' ');
1781556Srgrimes			}
1791556Srgrimes			for (cp = vis_args; --left >= 0 && *cp != '\0';)
1801556Srgrimes				(void)putchar(*cp++);
1811556Srgrimes		}
182192239Sbrian		if (vis_env != NULL)
183192239Sbrian			free(vis_env);
1841556Srgrimes	} else
185192239Sbrian		/* ki_d.prefix & ki_env aren't shown for interim fields */
1861556Srgrimes		(void)printf("%-*.*s", v->width, v->width, vis_args);
1871556Srgrimes	free(vis_args);
1881556Srgrimes}
1891556Srgrimes
1901556Srgrimesvoid
19190110Simpucomm(KINFO *k, VARENT *ve)
1921556Srgrimes{
193189078Sattilio	char tmpbuff[COMMLEN + OCOMMLEN + 2];
1941556Srgrimes	VAR *v;
1951556Srgrimes
1961556Srgrimes	v = ve->var;
197173004Sjulian	if (STAILQ_NEXT(ve, next_ve) == NULL) {	/* last field, don't pad */
198192239Sbrian		if (k->ki_d.prefix)
199192239Sbrian			(void)printf("%s", k->ki_d.prefix);
200130975Sgad		(void)printf("%s", k->ki_p->ki_comm);
201173004Sjulian		if (showthreads && k->ki_p->ki_numthreads > 1)
202173004Sjulian			printf("/%s", k->ki_p->ki_ocomm);
203189078Sattilio	} else {
204189078Sattilio		bzero(tmpbuff, sizeof(tmpbuff));
205189078Sattilio		if (showthreads && k->ki_p->ki_numthreads > 1)
206189078Sattilio			sprintf(tmpbuff, "%s/%s", k->ki_p->ki_comm,
207189078Sattilio			    k->ki_p->ki_ocomm);
208189078Sattilio		else
209189078Sattilio			sprintf(tmpbuff, "%s", k->ki_p->ki_comm);
210189078Sattilio		(void)printf("%-*s", v->width, tmpbuff);
211189078Sattilio	}
2121556Srgrimes}
2131556Srgrimes
2141556Srgrimesvoid
215173004Sjuliantdnam(KINFO *k, VARENT *ve)
216173004Sjulian{
217173004Sjulian	VAR *v;
218173004Sjulian
219173004Sjulian	v = ve->var;
220173004Sjulian	if (showthreads && k->ki_p->ki_numthreads > 1)
221173004Sjulian		(void)printf("%-*s", v->width, k->ki_p->ki_ocomm);
222184925Semaste	else
223184925Semaste		(void)printf("%-*s", v->width, "      ");
224173004Sjulian}
225173004Sjulian
226173004Sjulianvoid
22790110Simplogname(KINFO *k, VARENT *ve)
2281556Srgrimes{
2291556Srgrimes	VAR *v;
23036352Ssteve	char *s;
2311556Srgrimes
2321556Srgrimes	v = ve->var;
23369896Smckusick	(void)printf("%-*s", v->width, (s = k->ki_p->ki_login, *s) ? s : "-");
2341556Srgrimes}
2351556Srgrimes
2361556Srgrimesvoid
23790110Simpstate(KINFO *k, VARENT *ve)
2381556Srgrimes{
239172207Sjeff	int flag, tdflags;
2401556Srgrimes	char *cp;
2411556Srgrimes	VAR *v;
2421556Srgrimes	char buf[16];
2431556Srgrimes
2441556Srgrimes	v = ve->var;
24569896Smckusick	flag = k->ki_p->ki_flag;
24683366Sjulian	tdflags = k->ki_p->ki_tdflags;	/* XXXKSE */
2471556Srgrimes	cp = buf;
2481556Srgrimes
24969896Smckusick	switch (k->ki_p->ki_stat) {
2501556Srgrimes
2511556Srgrimes	case SSTOP:
2521556Srgrimes		*cp = 'T';
2531556Srgrimes		break;
2541556Srgrimes
2551556Srgrimes	case SSLEEP:
25683366Sjulian		if (tdflags & TDF_SINTR)	/* interruptable (long) */
25769896Smckusick			*cp = k->ki_p->ki_slptime >= MAXSLP ? 'I' : 'S';
2581556Srgrimes		else
2591556Srgrimes			*cp = 'D';
2601556Srgrimes		break;
2611556Srgrimes
2621556Srgrimes	case SRUN:
2631556Srgrimes	case SIDL:
2641556Srgrimes		*cp = 'R';
2651556Srgrimes		break;
2661556Srgrimes
26765557Sjasone	case SWAIT:
26865557Sjasone		*cp = 'W';
26965557Sjasone		break;
27065557Sjasone
271104388Sjhb	case SLOCK:
272104388Sjhb		*cp = 'L';
27365557Sjasone		break;
27465557Sjasone
2751556Srgrimes	case SZOMB:
2761556Srgrimes		*cp = 'Z';
2771556Srgrimes		break;
2781556Srgrimes
2791556Srgrimes	default:
2801556Srgrimes		*cp = '?';
2811556Srgrimes	}
2821556Srgrimes	cp++;
283172207Sjeff	if (!(flag & P_INMEM))
2841556Srgrimes		*cp++ = 'W';
28569896Smckusick	if (k->ki_p->ki_nice < NZERO)
2861556Srgrimes		*cp++ = '<';
28769896Smckusick	else if (k->ki_p->ki_nice > NZERO)
2881556Srgrimes		*cp++ = 'N';
2891556Srgrimes	if (flag & P_TRACED)
2901556Srgrimes		*cp++ = 'X';
29169896Smckusick	if (flag & P_WEXIT && k->ki_p->ki_stat != SZOMB)
2921556Srgrimes		*cp++ = 'E';
2931556Srgrimes	if (flag & P_PPWAIT)
2941556Srgrimes		*cp++ = 'V';
29569896Smckusick	if ((flag & P_SYSTEM) || k->ki_p->ki_lock > 0)
2961556Srgrimes		*cp++ = 'L';
29769896Smckusick	if (k->ki_p->ki_kiflag & KI_SLEADER)
2981556Srgrimes		*cp++ = 's';
29969896Smckusick	if ((flag & P_CONTROLT) && k->ki_p->ki_pgid == k->ki_p->ki_tpgid)
3001556Srgrimes		*cp++ = '+';
30146155Sphk	if (flag & P_JAILED)
30246155Sphk		*cp++ = 'J';
3031556Srgrimes	*cp = '\0';
3041556Srgrimes	(void)printf("%-*s", v->width, buf);
3051556Srgrimes}
3061556Srgrimes
307130974Sgad#define	scalepri(x)	((x) - PZERO)
308130974Sgad
3091556Srgrimesvoid
31090110Simppri(KINFO *k, VARENT *ve)
3111556Srgrimes{
3121556Srgrimes	VAR *v;
3131556Srgrimes
3141556Srgrimes	v = ve->var;
315130974Sgad	(void)printf("%*d", v->width, scalepri(k->ki_p->ki_pri.pri_level));
3161556Srgrimes}
3171556Srgrimes
3181556Srgrimesvoid
319130974Sgadupr(KINFO *k, VARENT *ve)
320130974Sgad{
321130974Sgad	VAR *v;
322130974Sgad
323130974Sgad	v = ve->var;
324130974Sgad	(void)printf("%*d", v->width, scalepri(k->ki_p->ki_pri.pri_user));
325130974Sgad}
326130974Sgad#undef scalepri
327130974Sgad
328130974Sgadvoid
32990110Simpuname(KINFO *k, VARENT *ve)
3301556Srgrimes{
3311556Srgrimes	VAR *v;
3321556Srgrimes
3331556Srgrimes	v = ve->var;
33497961Sjmallett	(void)printf("%-*s", v->width, user_from_uid(k->ki_p->ki_uid, 0));
3351556Srgrimes}
3361556Srgrimes
33725271Sjkhint
33890110Simps_uname(KINFO *k)
33925271Sjkh{
340113485Scharnier	return (strlen(user_from_uid(k->ki_p->ki_uid, 0)));
34125271Sjkh}
34225271Sjkh
3431556Srgrimesvoid
34497961Sjmallettrgroupname(KINFO *k, VARENT *ve)
34597961Sjmallett{
34697961Sjmallett	VAR *v;
34797961Sjmallett
34897961Sjmallett	v = ve->var;
34997961Sjmallett	(void)printf("%-*s", v->width, group_from_gid(k->ki_p->ki_rgid, 0));
35097961Sjmallett}
35197961Sjmallett
35297961Sjmallettint
35397961Sjmalletts_rgroupname(KINFO *k)
35497961Sjmallett{
35597961Sjmallett	return (strlen(group_from_gid(k->ki_p->ki_rgid, 0)));
35697961Sjmallett}
35797961Sjmallett
35897961Sjmallettvoid
35990110Simpruname(KINFO *k, VARENT *ve)
3601556Srgrimes{
3611556Srgrimes	VAR *v;
3621556Srgrimes
3631556Srgrimes	v = ve->var;
36497961Sjmallett	(void)printf("%-*s", v->width, user_from_uid(k->ki_p->ki_ruid, 0));
3651556Srgrimes}
3661556Srgrimes
36725271Sjkhint
36890110Simps_runame(KINFO *k)
36925271Sjkh{
370113485Scharnier	return (strlen(user_from_uid(k->ki_p->ki_ruid, 0)));
37125271Sjkh}
37225271Sjkh
373103422Sjmallett
3741556Srgrimesvoid
37590110Simptdev(KINFO *k, VARENT *ve)
3761556Srgrimes{
3771556Srgrimes	VAR *v;
3781556Srgrimes	dev_t dev;
3791556Srgrimes	char buff[16];
3801556Srgrimes
3811556Srgrimes	v = ve->var;
38269896Smckusick	dev = k->ki_p->ki_tdev;
3831556Srgrimes	if (dev == NODEV)
3841556Srgrimes		(void)printf("%*s", v->width, "??");
3851556Srgrimes	else {
3861556Srgrimes		(void)snprintf(buff, sizeof(buff),
3871556Srgrimes		    "%d/%d", major(dev), minor(dev));
3881556Srgrimes		(void)printf("%*s", v->width, buff);
3891556Srgrimes	}
3901556Srgrimes}
3911556Srgrimes
3921556Srgrimesvoid
39390110Simptname(KINFO *k, VARENT *ve)
3941556Srgrimes{
3951556Srgrimes	VAR *v;
3961556Srgrimes	dev_t dev;
3971556Srgrimes	char *ttname;
3981556Srgrimes
3991556Srgrimes	v = ve->var;
40069896Smckusick	dev = k->ki_p->ki_tdev;
4011556Srgrimes	if (dev == NODEV || (ttname = devname(dev, S_IFCHR)) == NULL)
402113485Scharnier		(void)printf("%*s ", v->width - 1, "??");
4031556Srgrimes	else {
4043301Sache		if (strncmp(ttname, "tty", 3) == 0 ||
4053301Sache		    strncmp(ttname, "cua", 3) == 0)
4061556Srgrimes			ttname += 3;
407155876Scognet		if (strncmp(ttname, "pts/", 4) == 0)
408155876Scognet			ttname += 4;
409113485Scharnier		(void)printf("%*.*s%c", v->width - 1, v->width - 1, ttname,
410113485Scharnier		    k->ki_p->ki_kiflag & KI_CTTY ? ' ' : '-');
4111556Srgrimes	}
4121556Srgrimes}
4131556Srgrimes
4141556Srgrimesvoid
41590110Simplongtname(KINFO *k, VARENT *ve)
4161556Srgrimes{
4171556Srgrimes	VAR *v;
4181556Srgrimes	dev_t dev;
4191556Srgrimes	char *ttname;
4201556Srgrimes
4211556Srgrimes	v = ve->var;
42269896Smckusick	dev = k->ki_p->ki_tdev;
4231556Srgrimes	if (dev == NODEV || (ttname = devname(dev, S_IFCHR)) == NULL)
4241556Srgrimes		(void)printf("%-*s", v->width, "??");
4251556Srgrimes	else
4261556Srgrimes		(void)printf("%-*s", v->width, ttname);
4271556Srgrimes}
4281556Srgrimes
4291556Srgrimesvoid
43090110Simpstarted(KINFO *k, VARENT *ve)
4311556Srgrimes{
4321556Srgrimes	VAR *v;
43337231Sbde	time_t then;
4341556Srgrimes	struct tm *tp;
435113485Scharnier	static int use_ampm = -1;
4361556Srgrimes	char buf[100];
4371556Srgrimes
4381556Srgrimes	v = ve->var;
43969896Smckusick	if (!k->ki_valid) {
4401556Srgrimes		(void)printf("%-*s", v->width, "-");
4411556Srgrimes		return;
4421556Srgrimes	}
44373369Sache	if (use_ampm < 0)
44473369Sache		use_ampm = (*nl_langinfo(T_FMT_AMPM) != '\0');
44569896Smckusick	then = k->ki_p->ki_start.tv_sec;
44637231Sbde	tp = localtime(&then);
44769896Smckusick	if (now - k->ki_p->ki_start.tv_sec < 24 * 3600) {
448113485Scharnier		(void)strftime(buf, sizeof(buf),
449113485Scharnier		    use_ampm ? "%l:%M%p" : "%k:%M  ", tp);
45069896Smckusick	} else if (now - k->ki_p->ki_start.tv_sec < 7 * 86400) {
451113485Scharnier		(void)strftime(buf, sizeof(buf),
452113485Scharnier		    use_ampm ? "%a%I%p" : "%a%H  ", tp);
4531556Srgrimes	} else
454113485Scharnier		(void)strftime(buf, sizeof(buf), "%e%b%y", tp);
4551556Srgrimes	(void)printf("%-*s", v->width, buf);
4561556Srgrimes}
4571556Srgrimes
4581556Srgrimesvoid
45990110Simplstarted(KINFO *k, VARENT *ve)
4601556Srgrimes{
4611556Srgrimes	VAR *v;
46237231Sbde	time_t then;
4631556Srgrimes	char buf[100];
4641556Srgrimes
4651556Srgrimes	v = ve->var;
46669896Smckusick	if (!k->ki_valid) {
4671556Srgrimes		(void)printf("%-*s", v->width, "-");
4681556Srgrimes		return;
4691556Srgrimes	}
47069896Smckusick	then = k->ki_p->ki_start.tv_sec;
471113485Scharnier	(void)strftime(buf, sizeof(buf), "%c", localtime(&then));
4721556Srgrimes	(void)printf("%-*s", v->width, buf);
4731556Srgrimes}
4741556Srgrimes
4751556Srgrimesvoid
476104388Sjhblockname(KINFO *k, VARENT *ve)
47769372Sjhb{
47869372Sjhb	VAR *v;
47969372Sjhb
48069372Sjhb	v = ve->var;
481104388Sjhb	if (k->ki_p->ki_kiflag & KI_LOCKBLOCK) {
482104388Sjhb		if (k->ki_p->ki_lockname[0] != 0)
48369372Sjhb			(void)printf("%-*.*s", v->width, v->width,
484113485Scharnier			    k->ki_p->ki_lockname);
48569372Sjhb		else
48669372Sjhb			(void)printf("%-*s", v->width, "???");
48769372Sjhb	} else
48869372Sjhb		(void)printf("%-*s", v->width, "-");
48969372Sjhb}
49069372Sjhb
49169372Sjhbvoid
49290110Simpwchan(KINFO *k, VARENT *ve)
4931556Srgrimes{
4941556Srgrimes	VAR *v;
4951556Srgrimes
4961556Srgrimes	v = ve->var;
49769896Smckusick	if (k->ki_p->ki_wchan) {
49869896Smckusick		if (k->ki_p->ki_wmesg[0] != 0)
4998855Srgrimes			(void)printf("%-*.*s", v->width, v->width,
500113485Scharnier			    k->ki_p->ki_wmesg);
5011556Srgrimes		else
50239160Sdfr			(void)printf("%-*lx", v->width,
50382268Speter			    (long)k->ki_p->ki_wchan);
504113485Scharnier	} else
50591028Sdillon		(void)printf("%-*s", v->width, "-");
50691028Sdillon}
50791028Sdillon
50891028Sdillonvoid
509118857Shartinwchan(KINFO *k, VARENT *ve)
510118857Sharti{
511118857Sharti	VAR *v;
512118857Sharti
513118857Sharti	v = ve->var;
514118857Sharti	if (k->ki_p->ki_wchan) {
515118857Sharti		(void)printf("%0*lx", v->width,
516118857Sharti		    (long)k->ki_p->ki_wchan);
517118857Sharti	} else
518118857Sharti		(void)printf("%-*s", v->width, "-");
519118857Sharti}
520118857Sharti
521118857Shartivoid
52291028Sdillonmwchan(KINFO *k, VARENT *ve)
52391028Sdillon{
52491028Sdillon	VAR *v;
52591028Sdillon
52691028Sdillon	v = ve->var;
52791028Sdillon	if (k->ki_p->ki_wchan) {
52891028Sdillon		if (k->ki_p->ki_wmesg[0] != 0)
52991028Sdillon			(void)printf("%-*.*s", v->width, v->width,
530113485Scharnier			    k->ki_p->ki_wmesg);
53191028Sdillon		else
53291028Sdillon			(void)printf("%-*lx", v->width,
53391028Sdillon			    (long)k->ki_p->ki_wchan);
534104388Sjhb	} else if (k->ki_p->ki_kiflag & KI_LOCKBLOCK) {
535104388Sjhb		if (k->ki_p->ki_lockname[0]) {
53691028Sdillon			(void)printf("%-*.*s", v->width, v->width,
537104388Sjhb			    k->ki_p->ki_lockname);
538113485Scharnier		} else
53991028Sdillon			(void)printf("%-*s", v->width, "???");
540113485Scharnier	} else
5411556Srgrimes		(void)printf("%-*s", v->width, "-");
5421556Srgrimes}
5431556Srgrimes
5441556Srgrimesvoid
54590110Simpvsize(KINFO *k, VARENT *ve)
5461556Srgrimes{
5471556Srgrimes	VAR *v;
5481556Srgrimes
5491556Srgrimes	v = ve->var;
55099785Sbde	(void)printf("%*lu", v->width, (u_long)(k->ki_p->ki_size / 1024));
5511556Srgrimes}
5521556Srgrimes
553219713Skibstatic void
554219713Skibprinttime(KINFO *k, VARENT *ve, long secs, long psecs)
555219713Skib/* psecs is "parts" of a second. first micro, then centi */
5561556Srgrimes{
5571556Srgrimes	VAR *v;
5581556Srgrimes	char obuff[128];
559113485Scharnier	static char decimal_point;
5601556Srgrimes
561113485Scharnier	if (decimal_point == '\0')
56272343Sache		decimal_point = localeconv()->decimal_point[0];
5631556Srgrimes	v = ve->var;
564130856Sgad	if (!k->ki_valid) {
56536497Sbde		secs = 0;
56636497Sbde		psecs = 0;
5671556Srgrimes	} else {
568219713Skib		/* round and scale to 100's */
56936497Sbde		psecs = (psecs + 5000) / 10000;
57036497Sbde		secs += psecs / 100;
57136497Sbde		psecs = psecs % 100;
5721556Srgrimes	}
573113485Scharnier	(void)snprintf(obuff, sizeof(obuff), "%3ld:%02ld%c%02ld",
574113485Scharnier	    secs / 60, secs % 60, decimal_point, psecs);
5751556Srgrimes	(void)printf("%*s", v->width, obuff);
5761556Srgrimes}
5771556Srgrimes
57897965Sjmallettvoid
579219713Skibcputime(KINFO *k, VARENT *ve)
580219713Skib{
581219713Skib	long secs, psecs;
582219713Skib
583219713Skib	/*
584219713Skib	 * This counts time spent handling interrupts.  We could
585219713Skib	 * fix this, but it is not 100% trivial (and interrupt
586219713Skib	 * time fractions only work on the sparc anyway).	XXX
587219713Skib	 */
588219713Skib	secs = k->ki_p->ki_runtime / 1000000;
589219713Skib	psecs = k->ki_p->ki_runtime % 1000000;
590219713Skib	if (sumrusage) {
591219713Skib		secs += k->ki_p->ki_childtime.tv_sec;
592219713Skib		psecs += k->ki_p->ki_childtime.tv_usec;
593219713Skib	}
594219713Skib	printtime(k, ve, secs, psecs);
595219713Skib}
596219713Skib
597219713Skibvoid
598219713Skibsystime(KINFO *k, VARENT *ve)
599219713Skib{
600219713Skib	long secs, psecs;
601219713Skib
602219713Skib	secs = k->ki_p->ki_rusage.ru_stime.tv_sec;
603219713Skib	psecs = k->ki_p->ki_rusage.ru_stime.tv_usec;
604219713Skib	if (sumrusage) {
605219713Skib		secs += k->ki_p->ki_childstime.tv_sec;
606219713Skib		psecs += k->ki_p->ki_childstime.tv_usec;
607219713Skib	}
608219713Skib	printtime(k, ve, secs, psecs);
609219713Skib}
610219713Skib
611219713Skibvoid
612219713Skibusertime(KINFO *k, VARENT *ve)
613219713Skib{
614219713Skib	long secs, psecs;
615219713Skib
616219713Skib	secs = k->ki_p->ki_rusage.ru_utime.tv_sec;
617219713Skib	psecs = k->ki_p->ki_rusage.ru_utime.tv_usec;
618219713Skib	if (sumrusage) {
619219713Skib		secs += k->ki_p->ki_childutime.tv_sec;
620219713Skib		psecs += k->ki_p->ki_childutime.tv_usec;
621219713Skib	}
622219713Skib	printtime(k, ve, secs, psecs);
623219713Skib}
624219713Skib
625219713Skibvoid
62697965Sjmallettelapsed(KINFO *k, VARENT *ve)
62797965Sjmallett{
62897965Sjmallett	VAR *v;
629113485Scharnier	time_t val;
630113485Scharnier	int days, hours, mins, secs;
63197965Sjmallett	char obuff[128];
63297965Sjmallett
63397965Sjmallett	v = ve->var;
634192688Sjilles	if (!k->ki_valid) {
635192688Sjilles		(void)printf("%-*s", v->width, "-");
636192688Sjilles		return;
637192688Sjilles	}
638113485Scharnier	val = now - k->ki_p->ki_start.tv_sec;
639113485Scharnier	days = val / (24 * 60 * 60);
640113485Scharnier	val %= 24 * 60 * 60;
641113485Scharnier	hours = val / (60 * 60);
642113485Scharnier	val %= 60 * 60;
643113485Scharnier	mins = val / 60;
644113485Scharnier	secs = val % 60;
645113485Scharnier	if (days != 0)
646113485Scharnier		(void)snprintf(obuff, sizeof(obuff), "%3d-%02d:%02d:%02d",
647113485Scharnier		    days, hours, mins, secs);
648113485Scharnier	else if (hours != 0)
649113485Scharnier		(void)snprintf(obuff, sizeof(obuff), "%02d:%02d:%02d",
650113485Scharnier		    hours, mins, secs);
651113485Scharnier	else
652113485Scharnier		(void)snprintf(obuff, sizeof(obuff), "%02d:%02d", mins, secs);
65397965Sjmallett	(void)printf("%*s", v->width, obuff);
65497965Sjmallett}
65597965Sjmallett
656205271Sjmallettvoid
657205271Sjmallettelapseds(KINFO *k, VARENT *ve)
658205271Sjmallett{
659205271Sjmallett	VAR *v;
660205271Sjmallett	time_t val;
661205271Sjmallett
662205271Sjmallett	v = ve->var;
663205271Sjmallett	if (!k->ki_valid) {
664205271Sjmallett		(void)printf("%-*s", v->width, "-");
665205271Sjmallett		return;
666205271Sjmallett	}
667205271Sjmallett	val = now - k->ki_p->ki_start.tv_sec;
668205271Sjmallett	(void)printf("%*jd", v->width, (intmax_t)val);
669205271Sjmallett}
670205271Sjmallett
6711556Srgrimesdouble
67290143Smarkmgetpcpu(const KINFO *k)
6731556Srgrimes{
6741556Srgrimes	static int failure;
6751556Srgrimes
6761556Srgrimes	if (!nlistread)
6771556Srgrimes		failure = donlist();
6781556Srgrimes	if (failure)
6791556Srgrimes		return (0.0);
6801556Srgrimes
6811556Srgrimes#define	fxtofl(fixpt)	((double)(fixpt) / fscale)
6821556Srgrimes
6831556Srgrimes	/* XXX - I don't like this */
684172207Sjeff	if (k->ki_p->ki_swtime == 0 || (k->ki_p->ki_flag & P_INMEM) == 0)
6851556Srgrimes		return (0.0);
6861556Srgrimes	if (rawcpu)
68769896Smckusick		return (100.0 * fxtofl(k->ki_p->ki_pctcpu));
68869896Smckusick	return (100.0 * fxtofl(k->ki_p->ki_pctcpu) /
68969896Smckusick		(1.0 - exp(k->ki_p->ki_swtime * log(fxtofl(ccpu)))));
6901556Srgrimes}
6911556Srgrimes
6921556Srgrimesvoid
69390110Simppcpu(KINFO *k, VARENT *ve)
6941556Srgrimes{
6951556Srgrimes	VAR *v;
6961556Srgrimes
6971556Srgrimes	v = ve->var;
6981556Srgrimes	(void)printf("%*.1f", v->width, getpcpu(k));
6991556Srgrimes}
7001556Srgrimes
70190143Smarkmstatic double
70290110Simpgetpmem(KINFO *k)
7031556Srgrimes{
7041556Srgrimes	static int failure;
7051556Srgrimes	double fracmem;
7061556Srgrimes
7071556Srgrimes	if (!nlistread)
7081556Srgrimes		failure = donlist();
7091556Srgrimes	if (failure)
7101556Srgrimes		return (0.0);
7111556Srgrimes
712172207Sjeff	if ((k->ki_p->ki_flag & P_INMEM) == 0)
7131556Srgrimes		return (0.0);
7141556Srgrimes	/* XXX want pmap ptpages, segtab, etc. (per architecture) */
7151556Srgrimes	/* XXX don't have info about shared */
716113485Scharnier	fracmem = ((float)k->ki_p->ki_rssize) / mempages;
7171556Srgrimes	return (100.0 * fracmem);
7181556Srgrimes}
7191556Srgrimes
7201556Srgrimesvoid
72190110Simppmem(KINFO *k, VARENT *ve)
7221556Srgrimes{
7231556Srgrimes	VAR *v;
7241556Srgrimes
7251556Srgrimes	v = ve->var;
7261556Srgrimes	(void)printf("%*.1f", v->width, getpmem(k));
7271556Srgrimes}
7281556Srgrimes
7291556Srgrimesvoid
73090110Simppagein(KINFO *k, VARENT *ve)
7311556Srgrimes{
7321556Srgrimes	VAR *v;
7331556Srgrimes
7341556Srgrimes	v = ve->var;
7358855Srgrimes	(void)printf("%*ld", v->width,
73669896Smckusick	    k->ki_valid ? k->ki_p->ki_rusage.ru_majflt : 0);
7371556Srgrimes}
7381556Srgrimes
73990143Smarkm/* ARGSUSED */
7401556Srgrimesvoid
74190143Smarkmmaxrss(KINFO *k __unused, VARENT *ve)
7421556Srgrimes{
7431556Srgrimes	VAR *v;
7441556Srgrimes
7451556Srgrimes	v = ve->var;
74627856Speter	/* XXX not yet */
74727856Speter	(void)printf("%*s", v->width, "-");
7481556Srgrimes}
7491556Srgrimes
7501556Srgrimesvoid
75190110Simppriorityr(KINFO *k, VARENT *ve)
75236352Ssteve{
75336352Ssteve	VAR *v;
75490143Smarkm	struct priority *lpri;
75536352Ssteve	char str[8];
75672377Sjake	unsigned class, level;
757127512Sgad
75836352Ssteve	v = ve->var;
759127512Sgad	lpri = &k->ki_p->ki_pri;
76090143Smarkm	class = lpri->pri_class;
76190143Smarkm	level = lpri->pri_level;
76272377Sjake	switch (class) {
763131215Sgad	case PRI_ITHD:
764131215Sgad		snprintf(str, sizeof(str), "intr:%u", level);
765131215Sgad		break;
76672377Sjake	case PRI_REALTIME:
76772377Sjake		snprintf(str, sizeof(str), "real:%u", level);
76836352Ssteve		break;
76972377Sjake	case PRI_TIMESHARE:
77036352Ssteve		strncpy(str, "normal", sizeof(str));
77136352Ssteve		break;
77272377Sjake	case PRI_IDLE:
77372377Sjake		snprintf(str, sizeof(str), "idle:%u", level);
77436352Ssteve		break;
77536352Ssteve	default:
77672377Sjake		snprintf(str, sizeof(str), "%u:%u", class, level);
77736352Ssteve		break;
77836352Ssteve	}
77936352Ssteve	str[sizeof(str) - 1] = '\0';
78036352Ssteve	(void)printf("%*s", v->width, str);
78136352Ssteve}
78236352Ssteve
7831556Srgrimes/*
7841556Srgrimes * Generic output routines.  Print fields from various prototype
7851556Srgrimes * structures.
7861556Srgrimes */
7871556Srgrimesstatic void
78899547Sjmallettprintval(void *bp, VAR *v)
7891556Srgrimes{
7901556Srgrimes	static char ofmt[32] = "%";
79197843Sjmallett	const char *fcp;
79297843Sjmallett	char *cp;
7931556Srgrimes
7941556Srgrimes	cp = ofmt + 1;
7951556Srgrimes	fcp = v->fmt;
7961556Srgrimes	if (v->flag & LJUST)
7971556Srgrimes		*cp++ = '-';
7981556Srgrimes	*cp++ = '*';
7997165Sjoerg	while ((*cp++ = *fcp++));
8001556Srgrimes
801113395Stjr#define	CHKINF127(n)	(((n) > 127) && (v->flag & INF127) ? 127 : (n))
802113395Stjr
8031556Srgrimes	switch (v->type) {
8041556Srgrimes	case CHAR:
8051556Srgrimes		(void)printf(ofmt, v->width, *(char *)bp);
8061556Srgrimes		break;
8071556Srgrimes	case UCHAR:
8081556Srgrimes		(void)printf(ofmt, v->width, *(u_char *)bp);
8091556Srgrimes		break;
8101556Srgrimes	case SHORT:
8111556Srgrimes		(void)printf(ofmt, v->width, *(short *)bp);
8121556Srgrimes		break;
8131556Srgrimes	case USHORT:
8141556Srgrimes		(void)printf(ofmt, v->width, *(u_short *)bp);
8151556Srgrimes		break;
81639160Sdfr	case INT:
81739160Sdfr		(void)printf(ofmt, v->width, *(int *)bp);
81839160Sdfr		break;
81939160Sdfr	case UINT:
820113395Stjr		(void)printf(ofmt, v->width, CHKINF127(*(u_int *)bp));
82139160Sdfr		break;
8221556Srgrimes	case LONG:
8231556Srgrimes		(void)printf(ofmt, v->width, *(long *)bp);
8241556Srgrimes		break;
8251556Srgrimes	case ULONG:
8261556Srgrimes		(void)printf(ofmt, v->width, *(u_long *)bp);
8271556Srgrimes		break;
8281556Srgrimes	case KPTR:
82982268Speter		(void)printf(ofmt, v->width, *(u_long *)bp);
8301556Srgrimes		break;
831103497Sjmallett	case PGTOK:
832103438Sjmallett		(void)printf(ofmt, v->width, ps_pgtok(*(u_long *)bp));
833103438Sjmallett		break;
8341556Srgrimes	default:
8351556Srgrimes		errx(1, "unknown type %d", v->type);
8361556Srgrimes	}
8371556Srgrimes}
8381556Srgrimes
8391556Srgrimesvoid
84090110Simpkvar(KINFO *k, VARENT *ve)
8411556Srgrimes{
8421556Srgrimes	VAR *v;
8431556Srgrimes
8441556Srgrimes	v = ve->var;
84569896Smckusick	printval((char *)((char *)k->ki_p + v->off), v);
8461556Srgrimes}
8471556Srgrimes
8481556Srgrimesvoid
84990110Simprvar(KINFO *k, VARENT *ve)
8501556Srgrimes{
8511556Srgrimes	VAR *v;
8521556Srgrimes
8531556Srgrimes	v = ve->var;
85469896Smckusick	if (k->ki_valid)
85569896Smckusick		printval((char *)((char *)(&k->ki_p->ki_rusage) + v->off), v);
8561556Srgrimes	else
8571556Srgrimes		(void)printf("%*s", v->width, "-");
8581556Srgrimes}
85986922Sgreen
86086922Sgreenvoid
861130830Sgademulname(KINFO *k, VARENT *ve)
862130830Sgad{
863130830Sgad	VAR *v;
864130830Sgad
865130830Sgad	v = ve->var;
866130830Sgad	printf("%-*s", v->width, *k->ki_p->ki_emul ? k->ki_p->ki_emul : "-");
867130830Sgad}
868130830Sgad
869130830Sgadvoid
870105831Srwatsonlabel(KINFO *k, VARENT *ve)
87186922Sgreen{
872105831Srwatson	char *string;
873113485Scharnier	VAR *v;
874109460Sjmallett	mac_t proclabel;
875105831Srwatson	int error;
87686922Sgreen
87786922Sgreen	v = ve->var;
878105831Srwatson	string = NULL;
879109460Sjmallett	if (mac_prepare_process_label(&proclabel) == -1) {
880132433Stjr		warn("mac_prepare_process_label");
881105831Srwatson		goto out;
882105831Srwatson	}
883109460Sjmallett	error = mac_get_pid(k->ki_p->ki_pid, proclabel);
884105831Srwatson	if (error == 0) {
885109460Sjmallett		if (mac_to_text(proclabel, &string) == -1)
886105831Srwatson			string = NULL;
887105831Srwatson	}
888109460Sjmallett	mac_free(proclabel);
889105831Srwatsonout:
890105831Srwatson	if (string != NULL) {
891105831Srwatson		(void)printf("%-*s", v->width, string);
892105831Srwatson		free(string);
893105831Srwatson	} else
894130828Sgad		(void)printf("%-*s", v->width, "  -");
895105831Srwatson	return;
89686922Sgreen}
897105831Srwatson
898219307Straszvoid
899219307Straszloginclass(KINFO *k, VARENT *ve)
900219307Strasz{
901219307Strasz	VAR *v;
902219307Strasz	char *s;
903219307Strasz
904219307Strasz	v = ve->var;
905219307Strasz	/*
906219307Strasz	 * Don't display login class for system processes;
907219307Strasz	 * login classes are used for resource limits,
908219307Strasz	 * and limits don't apply to system processes.
909219307Strasz	 */
910219307Strasz	if (k->ki_p->ki_flag & P_SYSTEM) {
911219307Strasz		(void)printf("%-*s", v->width, "  -");
912219307Strasz		return;
913219307Strasz	}
914219307Strasz	s = k->ki_p->ki_loginclass;
915219307Strasz	(void)printf("%-*s", v->width, *s ? s : "-");
916219307Strasz}
917219307Strasz
918105831Srwatsonint
919189078Sattilios_comm(KINFO *k)
920189078Sattilio{
921189078Sattilio	char tmpbuff[COMMLEN + OCOMMLEN + 2];
922189078Sattilio
923189078Sattilio	bzero(tmpbuff, sizeof(tmpbuff));
924189078Sattilio	if (showthreads && k->ki_p->ki_numthreads > 1)
925189078Sattilio		sprintf(tmpbuff, "%s/%s", k->ki_p->ki_comm,
926189078Sattilio		    k->ki_p->ki_ocomm);
927189078Sattilio	else
928189078Sattilio		sprintf(tmpbuff, "%s", k->ki_p->ki_comm);
929189078Sattilio	return (strlen(tmpbuff));
930189078Sattilio}
931189078Sattilio
932189078Sattilioint
933105831Srwatsons_label(KINFO *k)
934105831Srwatson{
935105831Srwatson	char *string = NULL;
936109460Sjmallett	mac_t proclabel;
937105831Srwatson	int error, size = 0;
938105831Srwatson
939109460Sjmallett	if (mac_prepare_process_label(&proclabel) == -1) {
940132433Stjr		warn("mac_prepare_process_label");
941105831Srwatson		return (0);
942105831Srwatson	}
943109460Sjmallett	error = mac_get_pid(k->ki_p->ki_pid, proclabel);
944109460Sjmallett	if (error == 0 && mac_to_text(proclabel, &string) == 0) {
945105831Srwatson		size = strlen(string);
946105831Srwatson		free(string);
947105831Srwatson	}
948109460Sjmallett	mac_free(proclabel);
949105831Srwatson	return (size);
950105831Srwatson}
951