xref: /freebsd/bin/ps/print.c (revision 6aed20fe1ae1f1ba4232fd0a5d561fe44960095c)
14b88c807SRodney W. Grimes /*-
24b88c807SRodney W. Grimes  * Copyright (c) 1990, 1993, 1994
34b88c807SRodney W. Grimes  *	The Regents of the University of California.  All rights reserved.
44b88c807SRodney W. Grimes  *
54b88c807SRodney W. Grimes  * Redistribution and use in source and binary forms, with or without
64b88c807SRodney W. Grimes  * modification, are permitted provided that the following conditions
74b88c807SRodney W. Grimes  * are met:
84b88c807SRodney W. Grimes  * 1. Redistributions of source code must retain the above copyright
94b88c807SRodney W. Grimes  *    notice, this list of conditions and the following disclaimer.
104b88c807SRodney W. Grimes  * 2. Redistributions in binary form must reproduce the above copyright
114b88c807SRodney W. Grimes  *    notice, this list of conditions and the following disclaimer in the
124b88c807SRodney W. Grimes  *    documentation and/or other materials provided with the distribution.
134b88c807SRodney W. Grimes  * 4. Neither the name of the University nor the names of its contributors
144b88c807SRodney W. Grimes  *    may be used to endorse or promote products derived from this software
154b88c807SRodney W. Grimes  *    without specific prior written permission.
164b88c807SRodney W. Grimes  *
174b88c807SRodney W. Grimes  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
184b88c807SRodney W. Grimes  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
194b88c807SRodney W. Grimes  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
204b88c807SRodney W. Grimes  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
214b88c807SRodney W. Grimes  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
224b88c807SRodney W. Grimes  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
234b88c807SRodney W. Grimes  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
244b88c807SRodney W. Grimes  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
254b88c807SRodney W. Grimes  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
264b88c807SRodney W. Grimes  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
274b88c807SRodney W. Grimes  * SUCH DAMAGE.
284b88c807SRodney W. Grimes  */
294b88c807SRodney W. Grimes 
30c9a8d1f4SPhilippe Charnier #if 0
31871e8d8cSMark Murray #ifndef lint
32c9a8d1f4SPhilippe Charnier static char sccsid[] = "@(#)print.c	8.6 (Berkeley) 4/16/94";
334b88c807SRodney W. Grimes #endif /* not lint */
34871e8d8cSMark Murray #endif
35eaed5652SPhilippe Charnier 
362749b141SDavid E. O'Brien #include <sys/cdefs.h>
372749b141SDavid E. O'Brien __FBSDID("$FreeBSD$");
384b88c807SRodney W. Grimes 
394b88c807SRodney W. Grimes #include <sys/param.h>
404b88c807SRodney W. Grimes #include <sys/time.h>
414b88c807SRodney W. Grimes #include <sys/resource.h>
424b88c807SRodney W. Grimes #include <sys/proc.h>
434b88c807SRodney W. Grimes #include <sys/stat.h>
444b88c807SRodney W. Grimes 
452af538ebSRobert Watson #include <sys/mac.h>
468b9b0e39SPoul-Henning Kamp #include <sys/user.h>
474b88c807SRodney W. Grimes #include <sys/sysctl.h>
4850a57dfbSKonstantin Belousov #include <sys/vmmeter.h>
494b88c807SRodney W. Grimes 
504b88c807SRodney W. Grimes #include <err.h>
51576541a9SWarner Losh #include <grp.h>
52f59105eeSAndrey A. Chernov #include <langinfo.h>
538073a93cSAndrey A. Chernov #include <locale.h>
544b88c807SRodney W. Grimes #include <math.h>
554b88c807SRodney W. Grimes #include <nlist.h>
56576541a9SWarner Losh #include <pwd.h>
574b88c807SRodney W. Grimes #include <stddef.h>
5841ded75dSJuli Mallett #include <stdint.h>
594b88c807SRodney W. Grimes #include <stdio.h>
604b88c807SRodney W. Grimes #include <stdlib.h>
614b88c807SRodney W. Grimes #include <string.h>
62871e8d8cSMark Murray #include <unistd.h>
634b88c807SRodney W. Grimes #include <vis.h>
644b88c807SRodney W. Grimes 
654b88c807SRodney W. Grimes #include "ps.h"
664b88c807SRodney W. Grimes 
671d1143ecSEdward Tomasz Napierala #define	COMMAND_WIDTH	16
681d1143ecSEdward Tomasz Napierala #define	ARGUMENTS_WIDTH	16
691d1143ecSEdward Tomasz Napierala 
706327ab9cSPeter Wemm #define	ps_pgtok(a)	(((a) * getpagesize()) / 1024)
71871e8d8cSMark Murray 
724b88c807SRodney W. Grimes void
7346251ddeSWarner Losh printheader(void)
744b88c807SRodney W. Grimes {
754b88c807SRodney W. Grimes 	VAR *v;
764b88c807SRodney W. Grimes 	struct varent *vent;
774b88c807SRodney W. Grimes 
78bdf8ab46SGarance A Drosehn 	STAILQ_FOREACH(vent, &varlist, next_ve)
79bdf8ab46SGarance A Drosehn 		if (*vent->header != '\0')
8001e5f166STim J. Robbins 			break;
81bdf8ab46SGarance A Drosehn 	if (!vent)
8201e5f166STim J. Robbins 		return;
83bdf8ab46SGarance A Drosehn 
84bdf8ab46SGarance A Drosehn 	STAILQ_FOREACH(vent, &varlist, next_ve) {
854b88c807SRodney W. Grimes 		v = vent->var;
864b88c807SRodney W. Grimes 		if (v->flag & LJUST) {
87bdf8ab46SGarance A Drosehn 			if (STAILQ_NEXT(vent, next_ve) == NULL)	/* last one */
8878b1878aSJuli Mallett 				(void)printf("%s", vent->header);
894b88c807SRodney W. Grimes 			else
9078b1878aSJuli Mallett 				(void)printf("%-*s", v->width, vent->header);
914b88c807SRodney W. Grimes 		} else
9278b1878aSJuli Mallett 			(void)printf("%*s", v->width, vent->header);
93bdf8ab46SGarance A Drosehn 		if (STAILQ_NEXT(vent, next_ve) != NULL)
944b88c807SRodney W. Grimes 			(void)putchar(' ');
954b88c807SRodney W. Grimes 	}
964b88c807SRodney W. Grimes 	(void)putchar('\n');
974b88c807SRodney W. Grimes }
984b88c807SRodney W. Grimes 
991d1143ecSEdward Tomasz Napierala char *
10003334017SJuli Mallett arguments(KINFO *k, VARENT *ve)
10103334017SJuli Mallett {
1021d1143ecSEdward Tomasz Napierala 	char *vis_args;
10303334017SJuli Mallett 
10403334017SJuli Mallett 	if ((vis_args = malloc(strlen(k->ki_args) * 4 + 1)) == NULL)
10503334017SJuli Mallett 		errx(1, "malloc failed");
10603334017SJuli Mallett 	strvis(vis_args, k->ki_args, VIS_TAB | VIS_NL | VIS_NOSLASH);
1071d1143ecSEdward Tomasz Napierala 
1081d1143ecSEdward Tomasz Napierala 	if (STAILQ_NEXT(ve, next_ve) != NULL && strlen(vis_args) > ARGUMENTS_WIDTH)
1091d1143ecSEdward Tomasz Napierala 		vis_args[ARGUMENTS_WIDTH] = '\0';
1101d1143ecSEdward Tomasz Napierala 
1111d1143ecSEdward Tomasz Napierala 	return (vis_args);
11203334017SJuli Mallett }
11303334017SJuli Mallett 
1141d1143ecSEdward Tomasz Napierala char *
11546251ddeSWarner Losh command(KINFO *k, VARENT *ve)
1164b88c807SRodney W. Grimes {
1171d1143ecSEdward Tomasz Napierala 	char *vis_args, *vis_env, *str;
1184b88c807SRodney W. Grimes 
119db91faacSPeter Wemm 	if (cflag) {
120bdf8ab46SGarance A Drosehn 		/* If it is the last field, then don't pad */
1217ab24ea3SJulian Elischer 		if (STAILQ_NEXT(ve, next_ve) == NULL) {
1221d1143ecSEdward Tomasz Napierala 			asprintf(&str, "%s%s%s%s",
1231d1143ecSEdward Tomasz Napierala 			    k->ki_d.prefix ? k->ki_d.prefix : "",
1241d1143ecSEdward Tomasz Napierala 			    k->ki_p->ki_comm,
1251d1143ecSEdward Tomasz Napierala 			    (showthreads && k->ki_p->ki_numthreads > 1) ? "/" : "",
1261d1143ecSEdward Tomasz Napierala 			    (showthreads && k->ki_p->ki_numthreads > 1) ? k->ki_p->ki_tdname : "");
1277ab24ea3SJulian Elischer 		} else
1281d1143ecSEdward Tomasz Napierala 			str = strdup(k->ki_p->ki_comm);
1291d1143ecSEdward Tomasz Napierala 
1301d1143ecSEdward Tomasz Napierala 		return (str);
131db91faacSPeter Wemm 	}
1324b88c807SRodney W. Grimes 	if ((vis_args = malloc(strlen(k->ki_args) * 4 + 1)) == NULL)
1334fa7d788SJuli Mallett 		errx(1, "malloc failed");
1344b88c807SRodney W. Grimes 	strvis(vis_args, k->ki_args, VIS_TAB | VIS_NL | VIS_NOSLASH);
1354b88c807SRodney W. Grimes 
136bdf8ab46SGarance A Drosehn 	if (STAILQ_NEXT(ve, next_ve) == NULL) {
1374b88c807SRodney W. Grimes 		/* last field */
138044fce53SBrian Somers 
139044fce53SBrian Somers 		if (k->ki_env) {
140044fce53SBrian Somers 			if ((vis_env = malloc(strlen(k->ki_env) * 4 + 1))
141044fce53SBrian Somers 			    == NULL)
142044fce53SBrian Somers 				errx(1, "malloc failed");
143044fce53SBrian Somers 			strvis(vis_env, k->ki_env,
144044fce53SBrian Somers 			    VIS_TAB | VIS_NL | VIS_NOSLASH);
145044fce53SBrian Somers 		} else
146044fce53SBrian Somers 			vis_env = NULL;
147044fce53SBrian Somers 
1481d1143ecSEdward Tomasz Napierala 		asprintf(&str, "%s%s%s%s",
1491d1143ecSEdward Tomasz Napierala 		    k->ki_d.prefix ? k->ki_d.prefix : "",
1501d1143ecSEdward Tomasz Napierala 		    vis_env ? vis_env : "",
1511d1143ecSEdward Tomasz Napierala 		    vis_env ? " " : "",
1521d1143ecSEdward Tomasz Napierala 		    vis_args);
1531d1143ecSEdward Tomasz Napierala 
1544b88c807SRodney W. Grimes 		if (vis_env != NULL)
1554b88c807SRodney W. Grimes 			free(vis_env);
156044fce53SBrian Somers 		free(vis_args);
1571d1143ecSEdward Tomasz Napierala 	} else {
1581d1143ecSEdward Tomasz Napierala 		/* ki_d.prefix & ki_env aren't shown for interim fields */
1591d1143ecSEdward Tomasz Napierala 		str = vis_args;
1601d1143ecSEdward Tomasz Napierala 
1611d1143ecSEdward Tomasz Napierala 		if (strlen(str) > COMMAND_WIDTH)
1621d1143ecSEdward Tomasz Napierala 			str[COMMAND_WIDTH] = '\0';
1634b88c807SRodney W. Grimes 	}
1644b88c807SRodney W. Grimes 
1651d1143ecSEdward Tomasz Napierala 	return (str);
1661d1143ecSEdward Tomasz Napierala }
1671d1143ecSEdward Tomasz Napierala 
1681d1143ecSEdward Tomasz Napierala char *
16946251ddeSWarner Losh ucomm(KINFO *k, VARENT *ve)
1704b88c807SRodney W. Grimes {
1711d1143ecSEdward Tomasz Napierala 	char *str;
1724b88c807SRodney W. Grimes 
1737ab24ea3SJulian Elischer 	if (STAILQ_NEXT(ve, next_ve) == NULL) {	/* last field, don't pad */
1741d1143ecSEdward Tomasz Napierala 		asprintf(&str, "%s%s%s%s",
1751d1143ecSEdward Tomasz Napierala 		    k->ki_d.prefix ? k->ki_d.prefix : "",
1761d1143ecSEdward Tomasz Napierala 		    k->ki_p->ki_comm,
1771d1143ecSEdward Tomasz Napierala 		    (showthreads && k->ki_p->ki_numthreads > 1) ? "/" : "",
1781d1143ecSEdward Tomasz Napierala 		    (showthreads && k->ki_p->ki_numthreads > 1) ? k->ki_p->ki_tdname : "");
1794610a811SAttilio Rao 	} else {
1804610a811SAttilio Rao 		if (showthreads && k->ki_p->ki_numthreads > 1)
1811d1143ecSEdward Tomasz Napierala 			asprintf(&str, "%s/%s", k->ki_p->ki_comm, k->ki_p->ki_tdname);
1824610a811SAttilio Rao 		else
1831d1143ecSEdward Tomasz Napierala 			str = strdup(k->ki_p->ki_comm);
1844610a811SAttilio Rao 	}
1851d1143ecSEdward Tomasz Napierala 	return (str);
1864b88c807SRodney W. Grimes }
1874b88c807SRodney W. Grimes 
1881d1143ecSEdward Tomasz Napierala char *
189*6aed20feSEd Schouten tdnam(KINFO *k, VARENT *ve __unused)
1907ab24ea3SJulian Elischer {
1911d1143ecSEdward Tomasz Napierala 	char *str;
1927ab24ea3SJulian Elischer 
1937ab24ea3SJulian Elischer 	if (showthreads && k->ki_p->ki_numthreads > 1)
1941d1143ecSEdward Tomasz Napierala 		str = strdup(k->ki_p->ki_tdname);
1957ab24ea3SJulian Elischer 	else
1961d1143ecSEdward Tomasz Napierala 		str = strdup("      ");
1971d1143ecSEdward Tomasz Napierala 
1981d1143ecSEdward Tomasz Napierala 	return (str);
1997ab24ea3SJulian Elischer }
2007ab24ea3SJulian Elischer 
2011d1143ecSEdward Tomasz Napierala char *
202*6aed20feSEd Schouten logname(KINFO *k, VARENT *ve __unused)
2034b88c807SRodney W. Grimes {
2044b88c807SRodney W. Grimes 
2051d1143ecSEdward Tomasz Napierala 	if (*k->ki_p->ki_login == '\0')
2061d1143ecSEdward Tomasz Napierala 		return (NULL);
2071d1143ecSEdward Tomasz Napierala 	return (strdup(k->ki_p->ki_login));
2084b88c807SRodney W. Grimes }
2094b88c807SRodney W. Grimes 
2101d1143ecSEdward Tomasz Napierala char *
211*6aed20feSEd Schouten state(KINFO *k, VARENT *ve __unused)
2124b88c807SRodney W. Grimes {
213b61ce5b0SJeff Roberson 	int flag, tdflags;
2141d1143ecSEdward Tomasz Napierala 	char *cp, *buf;
2151d1143ecSEdward Tomasz Napierala 
2161d1143ecSEdward Tomasz Napierala 	buf = malloc(16);
2171d1143ecSEdward Tomasz Napierala 	if (buf == NULL)
2181d1143ecSEdward Tomasz Napierala 		errx(1, "malloc failed");
2194b88c807SRodney W. Grimes 
2201f7d2501SKirk McKusick 	flag = k->ki_p->ki_flag;
221b40ce416SJulian Elischer 	tdflags = k->ki_p->ki_tdflags;	/* XXXKSE */
2224b88c807SRodney W. Grimes 	cp = buf;
2234b88c807SRodney W. Grimes 
2241f7d2501SKirk McKusick 	switch (k->ki_p->ki_stat) {
2254b88c807SRodney W. Grimes 
2264b88c807SRodney W. Grimes 	case SSTOP:
2274b88c807SRodney W. Grimes 		*cp = 'T';
2284b88c807SRodney W. Grimes 		break;
2294b88c807SRodney W. Grimes 
2304b88c807SRodney W. Grimes 	case SSLEEP:
231b40ce416SJulian Elischer 		if (tdflags & TDF_SINTR)	/* interruptable (long) */
2321f7d2501SKirk McKusick 			*cp = k->ki_p->ki_slptime >= MAXSLP ? 'I' : 'S';
2334b88c807SRodney W. Grimes 		else
2344b88c807SRodney W. Grimes 			*cp = 'D';
2354b88c807SRodney W. Grimes 		break;
2364b88c807SRodney W. Grimes 
2374b88c807SRodney W. Grimes 	case SRUN:
2384b88c807SRodney W. Grimes 	case SIDL:
2394b88c807SRodney W. Grimes 		*cp = 'R';
2404b88c807SRodney W. Grimes 		break;
2414b88c807SRodney W. Grimes 
2420384fff8SJason Evans 	case SWAIT:
2430384fff8SJason Evans 		*cp = 'W';
2440384fff8SJason Evans 		break;
2450384fff8SJason Evans 
2460d632649SJohn Baldwin 	case SLOCK:
2470d632649SJohn Baldwin 		*cp = 'L';
2480384fff8SJason Evans 		break;
2490384fff8SJason Evans 
2504b88c807SRodney W. Grimes 	case SZOMB:
2514b88c807SRodney W. Grimes 		*cp = 'Z';
2524b88c807SRodney W. Grimes 		break;
2534b88c807SRodney W. Grimes 
2544b88c807SRodney W. Grimes 	default:
2554b88c807SRodney W. Grimes 		*cp = '?';
2564b88c807SRodney W. Grimes 	}
2574b88c807SRodney W. Grimes 	cp++;
258b61ce5b0SJeff Roberson 	if (!(flag & P_INMEM))
2594b88c807SRodney W. Grimes 		*cp++ = 'W';
2601f7d2501SKirk McKusick 	if (k->ki_p->ki_nice < NZERO)
2614b88c807SRodney W. Grimes 		*cp++ = '<';
2621f7d2501SKirk McKusick 	else if (k->ki_p->ki_nice > NZERO)
2634b88c807SRodney W. Grimes 		*cp++ = 'N';
2644b88c807SRodney W. Grimes 	if (flag & P_TRACED)
2654b88c807SRodney W. Grimes 		*cp++ = 'X';
2661f7d2501SKirk McKusick 	if (flag & P_WEXIT && k->ki_p->ki_stat != SZOMB)
2674b88c807SRodney W. Grimes 		*cp++ = 'E';
2684b88c807SRodney W. Grimes 	if (flag & P_PPWAIT)
2694b88c807SRodney W. Grimes 		*cp++ = 'V';
2701f7d2501SKirk McKusick 	if ((flag & P_SYSTEM) || k->ki_p->ki_lock > 0)
2714b88c807SRodney W. Grimes 		*cp++ = 'L';
2721f7d2501SKirk McKusick 	if (k->ki_p->ki_kiflag & KI_SLEADER)
2734b88c807SRodney W. Grimes 		*cp++ = 's';
2741f7d2501SKirk McKusick 	if ((flag & P_CONTROLT) && k->ki_p->ki_pgid == k->ki_p->ki_tpgid)
2754b88c807SRodney W. Grimes 		*cp++ = '+';
27675c13541SPoul-Henning Kamp 	if (flag & P_JAILED)
27775c13541SPoul-Henning Kamp 		*cp++ = 'J';
2784b88c807SRodney W. Grimes 	*cp = '\0';
2791d1143ecSEdward Tomasz Napierala 	return (buf);
2804b88c807SRodney W. Grimes }
2814b88c807SRodney W. Grimes 
282820434b2SGarance A Drosehn #define	scalepri(x)	((x) - PZERO)
283820434b2SGarance A Drosehn 
2841d1143ecSEdward Tomasz Napierala char *
285*6aed20feSEd Schouten pri(KINFO *k, VARENT *ve __unused)
2864b88c807SRodney W. Grimes {
2871d1143ecSEdward Tomasz Napierala 	char *str;
2884b88c807SRodney W. Grimes 
2891d1143ecSEdward Tomasz Napierala 	asprintf(&str, "%d", scalepri(k->ki_p->ki_pri.pri_level));
2901d1143ecSEdward Tomasz Napierala 	return (str);
2914b88c807SRodney W. Grimes }
2924b88c807SRodney W. Grimes 
2931d1143ecSEdward Tomasz Napierala char *
294*6aed20feSEd Schouten upr(KINFO *k, VARENT *ve __unused)
295820434b2SGarance A Drosehn {
2961d1143ecSEdward Tomasz Napierala 	char *str;
297820434b2SGarance A Drosehn 
2981d1143ecSEdward Tomasz Napierala 	asprintf(&str, "%d", scalepri(k->ki_p->ki_pri.pri_user));
2991d1143ecSEdward Tomasz Napierala 	return (str);
300820434b2SGarance A Drosehn }
301820434b2SGarance A Drosehn #undef scalepri
302820434b2SGarance A Drosehn 
3031d1143ecSEdward Tomasz Napierala char *
304*6aed20feSEd Schouten uname(KINFO *k, VARENT *ve __unused)
3054b88c807SRodney W. Grimes {
3064b88c807SRodney W. Grimes 
3071d1143ecSEdward Tomasz Napierala 	return (strdup(user_from_uid(k->ki_p->ki_uid, 0)));
3084b88c807SRodney W. Grimes }
3094b88c807SRodney W. Grimes 
3101d1143ecSEdward Tomasz Napierala char *
311*6aed20feSEd Schouten egroupname(KINFO *k, VARENT *ve __unused)
3129acd9127SEdward Tomasz Napierala {
3139acd9127SEdward Tomasz Napierala 
3141d1143ecSEdward Tomasz Napierala 	return (strdup(group_from_gid(k->ki_p->ki_groups[0], 0)));
3159acd9127SEdward Tomasz Napierala }
3169acd9127SEdward Tomasz Napierala 
3171d1143ecSEdward Tomasz Napierala char *
318*6aed20feSEd Schouten rgroupname(KINFO *k, VARENT *ve __unused)
319e8eef4bbSJuli Mallett {
320e8eef4bbSJuli Mallett 
3211d1143ecSEdward Tomasz Napierala 	return (strdup(group_from_gid(k->ki_p->ki_rgid, 0)));
322e8eef4bbSJuli Mallett }
323e8eef4bbSJuli Mallett 
3241d1143ecSEdward Tomasz Napierala char *
325*6aed20feSEd Schouten runame(KINFO *k, VARENT *ve __unused)
3264b88c807SRodney W. Grimes {
3274b88c807SRodney W. Grimes 
3281d1143ecSEdward Tomasz Napierala 	return (strdup(user_from_uid(k->ki_p->ki_ruid, 0)));
3294b88c807SRodney W. Grimes }
3304b88c807SRodney W. Grimes 
3311d1143ecSEdward Tomasz Napierala char *
332*6aed20feSEd Schouten tdev(KINFO *k, VARENT *ve __unused)
3334b88c807SRodney W. Grimes {
3344b88c807SRodney W. Grimes 	dev_t dev;
3351d1143ecSEdward Tomasz Napierala 	char *str;
3364b88c807SRodney W. Grimes 
3371f7d2501SKirk McKusick 	dev = k->ki_p->ki_tdev;
3384b88c807SRodney W. Grimes 	if (dev == NODEV)
339aa7a15b6SEdward Tomasz Napierala 		str = strdup("-");
3409f365aa1SEd Schouten 	else
3411d1143ecSEdward Tomasz Napierala 		asprintf(&str, "%#jx", (uintmax_t)dev);
3421d1143ecSEdward Tomasz Napierala 
3431d1143ecSEdward Tomasz Napierala 	return (str);
3444b88c807SRodney W. Grimes }
3454b88c807SRodney W. Grimes 
3461d1143ecSEdward Tomasz Napierala char *
347*6aed20feSEd Schouten tname(KINFO *k, VARENT *ve __unused)
3484b88c807SRodney W. Grimes {
3494b88c807SRodney W. Grimes 	dev_t dev;
3501d1143ecSEdward Tomasz Napierala 	char *ttname, *str;
3514b88c807SRodney W. Grimes 
3521f7d2501SKirk McKusick 	dev = k->ki_p->ki_tdev;
3534b88c807SRodney W. Grimes 	if (dev == NODEV || (ttname = devname(dev, S_IFCHR)) == NULL)
354aa7a15b6SEdward Tomasz Napierala 		str = strdup("- ");
3554b88c807SRodney W. Grimes 	else {
356efc18e2cSAndrey A. Chernov 		if (strncmp(ttname, "tty", 3) == 0 ||
357efc18e2cSAndrey A. Chernov 		    strncmp(ttname, "cua", 3) == 0)
3584b88c807SRodney W. Grimes 			ttname += 3;
3597bd5296dSOlivier Houchard 		if (strncmp(ttname, "pts/", 4) == 0)
3607bd5296dSOlivier Houchard 			ttname += 4;
3611d1143ecSEdward Tomasz Napierala 		asprintf(&str, "%s%c", ttname,
3621f7d2501SKirk McKusick 		    k->ki_p->ki_kiflag & KI_CTTY ? ' ' : '-');
3634b88c807SRodney W. Grimes 	}
3641d1143ecSEdward Tomasz Napierala 
3651d1143ecSEdward Tomasz Napierala 	return (str);
3664b88c807SRodney W. Grimes }
3674b88c807SRodney W. Grimes 
3681d1143ecSEdward Tomasz Napierala char *
369*6aed20feSEd Schouten longtname(KINFO *k, VARENT *ve __unused)
3704b88c807SRodney W. Grimes {
3714b88c807SRodney W. Grimes 	dev_t dev;
3721d1143ecSEdward Tomasz Napierala 	const char *ttname;
3734b88c807SRodney W. Grimes 
3741f7d2501SKirk McKusick 	dev = k->ki_p->ki_tdev;
3754b88c807SRodney W. Grimes 	if (dev == NODEV || (ttname = devname(dev, S_IFCHR)) == NULL)
376aa7a15b6SEdward Tomasz Napierala 		ttname = "-";
3771d1143ecSEdward Tomasz Napierala 
3781d1143ecSEdward Tomasz Napierala 	return (strdup(ttname));
3794b88c807SRodney W. Grimes }
3804b88c807SRodney W. Grimes 
3811d1143ecSEdward Tomasz Napierala char *
382*6aed20feSEd Schouten started(KINFO *k, VARENT *ve __unused)
3834b88c807SRodney W. Grimes {
384f8ec5fe2SBruce Evans 	time_t then;
3854b88c807SRodney W. Grimes 	struct tm *tp;
386f59105eeSAndrey A. Chernov 	static int use_ampm = -1;
3871d1143ecSEdward Tomasz Napierala 	size_t buflen = 100;
3881d1143ecSEdward Tomasz Napierala 	char *buf;
3891d1143ecSEdward Tomasz Napierala 
3901d1143ecSEdward Tomasz Napierala 	buf = malloc(buflen);
3911d1143ecSEdward Tomasz Napierala 	if (buf == NULL)
3921d1143ecSEdward Tomasz Napierala 		errx(1, "malloc failed");
3934b88c807SRodney W. Grimes 
3941d1143ecSEdward Tomasz Napierala 	if (!k->ki_valid)
3951d1143ecSEdward Tomasz Napierala 		return (NULL);
396f59105eeSAndrey A. Chernov 	if (use_ampm < 0)
397f59105eeSAndrey A. Chernov 		use_ampm = (*nl_langinfo(T_FMT_AMPM) != '\0');
3981f7d2501SKirk McKusick 	then = k->ki_p->ki_start.tv_sec;
399f8ec5fe2SBruce Evans 	tp = localtime(&then);
4001f7d2501SKirk McKusick 	if (now - k->ki_p->ki_start.tv_sec < 24 * 3600) {
4011d1143ecSEdward Tomasz Napierala 		(void)strftime(buf, buflen,
40208017519SAndrey A. Chernov 		    use_ampm ? "%l:%M%p" : "%k:%M  ", tp);
4031f7d2501SKirk McKusick 	} else if (now - k->ki_p->ki_start.tv_sec < 7 * 86400) {
4041d1143ecSEdward Tomasz Napierala 		(void)strftime(buf, buflen,
40508017519SAndrey A. Chernov 		    use_ampm ? "%a%I%p" : "%a%H  ", tp);
4064b88c807SRodney W. Grimes 	} else
4071d1143ecSEdward Tomasz Napierala 		(void)strftime(buf, buflen, "%e%b%y", tp);
4081d1143ecSEdward Tomasz Napierala 	return (buf);
4094b88c807SRodney W. Grimes }
4104b88c807SRodney W. Grimes 
4111d1143ecSEdward Tomasz Napierala char *
412*6aed20feSEd Schouten lstarted(KINFO *k, VARENT *ve __unused)
4134b88c807SRodney W. Grimes {
414f8ec5fe2SBruce Evans 	time_t then;
4151d1143ecSEdward Tomasz Napierala 	char *buf;
4161d1143ecSEdward Tomasz Napierala 	size_t buflen = 100;
4171d1143ecSEdward Tomasz Napierala 
4181d1143ecSEdward Tomasz Napierala 	buf = malloc(buflen);
4191d1143ecSEdward Tomasz Napierala 	if (buf == NULL)
4201d1143ecSEdward Tomasz Napierala 		errx(1, "malloc failed");
4214b88c807SRodney W. Grimes 
4221d1143ecSEdward Tomasz Napierala 	if (!k->ki_valid)
4231d1143ecSEdward Tomasz Napierala 		return (NULL);
4241f7d2501SKirk McKusick 	then = k->ki_p->ki_start.tv_sec;
4251d1143ecSEdward Tomasz Napierala 	(void)strftime(buf, buflen, "%c", localtime(&then));
4261d1143ecSEdward Tomasz Napierala 	return (buf);
4274b88c807SRodney W. Grimes }
4284b88c807SRodney W. Grimes 
4291d1143ecSEdward Tomasz Napierala char *
430*6aed20feSEd Schouten lockname(KINFO *k, VARENT *ve __unused)
431fd5f30bfSJohn Baldwin {
4321d1143ecSEdward Tomasz Napierala 	char *str;
433fd5f30bfSJohn Baldwin 
4340d632649SJohn Baldwin 	if (k->ki_p->ki_kiflag & KI_LOCKBLOCK) {
4350d632649SJohn Baldwin 		if (k->ki_p->ki_lockname[0] != 0)
4361d1143ecSEdward Tomasz Napierala 			str = strdup(k->ki_p->ki_lockname);
437fd5f30bfSJohn Baldwin 		else
4381d1143ecSEdward Tomasz Napierala 			str = strdup("???");
439fd5f30bfSJohn Baldwin 	} else
4401d1143ecSEdward Tomasz Napierala 		str = NULL;
4411d1143ecSEdward Tomasz Napierala 
4421d1143ecSEdward Tomasz Napierala 	return (str);
443fd5f30bfSJohn Baldwin }
444fd5f30bfSJohn Baldwin 
4451d1143ecSEdward Tomasz Napierala char *
446*6aed20feSEd Schouten wchan(KINFO *k, VARENT *ve __unused)
4474b88c807SRodney W. Grimes {
4481d1143ecSEdward Tomasz Napierala 	char *str;
4494b88c807SRodney W. Grimes 
4501f7d2501SKirk McKusick 	if (k->ki_p->ki_wchan) {
4511f7d2501SKirk McKusick 		if (k->ki_p->ki_wmesg[0] != 0)
4521d1143ecSEdward Tomasz Napierala 			str = strdup(k->ki_p->ki_wmesg);
4534b88c807SRodney W. Grimes 		else
4541d1143ecSEdward Tomasz Napierala 			asprintf(&str, "%lx", (long)k->ki_p->ki_wchan);
455b85add5fSPhilippe Charnier 	} else
4561d1143ecSEdward Tomasz Napierala 		str = NULL;
4571d1143ecSEdward Tomasz Napierala 
4581d1143ecSEdward Tomasz Napierala 	return (str);
459d9a5f890SMatthew Dillon }
460d9a5f890SMatthew Dillon 
4611d1143ecSEdward Tomasz Napierala char *
462*6aed20feSEd Schouten nwchan(KINFO *k, VARENT *ve __unused)
463de244df7SHartmut Brandt {
4641d1143ecSEdward Tomasz Napierala 	char *str;
465de244df7SHartmut Brandt 
4661d1143ecSEdward Tomasz Napierala 	if (k->ki_p->ki_wchan)
4671d1143ecSEdward Tomasz Napierala 		asprintf(&str, "%0lx", (long)k->ki_p->ki_wchan);
4681d1143ecSEdward Tomasz Napierala 	else
4691d1143ecSEdward Tomasz Napierala 		str = NULL;
4701d1143ecSEdward Tomasz Napierala 
4711d1143ecSEdward Tomasz Napierala 	return (str);
472de244df7SHartmut Brandt }
473de244df7SHartmut Brandt 
4741d1143ecSEdward Tomasz Napierala char *
475*6aed20feSEd Schouten mwchan(KINFO *k, VARENT *ve __unused)
476d9a5f890SMatthew Dillon {
4771d1143ecSEdward Tomasz Napierala 	char *str;
478d9a5f890SMatthew Dillon 
479d9a5f890SMatthew Dillon 	if (k->ki_p->ki_wchan) {
480d9a5f890SMatthew Dillon 		if (k->ki_p->ki_wmesg[0] != 0)
4811d1143ecSEdward Tomasz Napierala 			str = strdup(k->ki_p->ki_wmesg);
482d9a5f890SMatthew Dillon 		else
4831d1143ecSEdward Tomasz Napierala                         asprintf(&str, "%lx", (long)k->ki_p->ki_wchan);
4840d632649SJohn Baldwin 	} else if (k->ki_p->ki_kiflag & KI_LOCKBLOCK) {
4850d632649SJohn Baldwin 		if (k->ki_p->ki_lockname[0]) {
4861d1143ecSEdward Tomasz Napierala 			str = strdup(k->ki_p->ki_lockname);
487b85add5fSPhilippe Charnier 		} else
4881d1143ecSEdward Tomasz Napierala 			str = strdup("???");
489b85add5fSPhilippe Charnier 	} else
4901d1143ecSEdward Tomasz Napierala 		str = NULL;
4911d1143ecSEdward Tomasz Napierala 
4921d1143ecSEdward Tomasz Napierala 	return (str);
4934b88c807SRodney W. Grimes }
4944b88c807SRodney W. Grimes 
4951d1143ecSEdward Tomasz Napierala char *
496*6aed20feSEd Schouten vsize(KINFO *k, VARENT *ve __unused)
4974b88c807SRodney W. Grimes {
4981d1143ecSEdward Tomasz Napierala 	char *str;
4994b88c807SRodney W. Grimes 
5001d1143ecSEdward Tomasz Napierala 	asprintf(&str, "%lu", (u_long)(k->ki_p->ki_size / 1024));
5011d1143ecSEdward Tomasz Napierala 	return (str);
5024b88c807SRodney W. Grimes }
5034b88c807SRodney W. Grimes 
5041d1143ecSEdward Tomasz Napierala static char *
505*6aed20feSEd Schouten printtime(KINFO *k, VARENT *ve __unused, long secs, long psecs)
506a870bf2cSKonstantin Belousov /* psecs is "parts" of a second. first micro, then centi */
5074b88c807SRodney W. Grimes {
508b85add5fSPhilippe Charnier 	static char decimal_point;
5091d1143ecSEdward Tomasz Napierala 	char *str;
5104b88c807SRodney W. Grimes 
511b85add5fSPhilippe Charnier 	if (decimal_point == '\0')
5128073a93cSAndrey A. Chernov 		decimal_point = localeconv()->decimal_point[0];
51316ac318dSGarance A Drosehn 	if (!k->ki_valid) {
5145832a752SBruce Evans 		secs = 0;
5155832a752SBruce Evans 		psecs = 0;
5164b88c807SRodney W. Grimes 	} else {
517a870bf2cSKonstantin Belousov 		/* round and scale to 100's */
518a870bf2cSKonstantin Belousov 		psecs = (psecs + 5000) / 10000;
519a870bf2cSKonstantin Belousov 		secs += psecs / 100;
520a870bf2cSKonstantin Belousov 		psecs = psecs % 100;
521a870bf2cSKonstantin Belousov 	}
5221d1143ecSEdward Tomasz Napierala 	asprintf(&str, "%ld:%02ld%c%02ld",
523a870bf2cSKonstantin Belousov 	    secs / 60, secs % 60, decimal_point, psecs);
5241d1143ecSEdward Tomasz Napierala 	return (str);
525a870bf2cSKonstantin Belousov }
526a870bf2cSKonstantin Belousov 
5271d1143ecSEdward Tomasz Napierala char *
528a870bf2cSKonstantin Belousov cputime(KINFO *k, VARENT *ve)
529a870bf2cSKonstantin Belousov {
530a870bf2cSKonstantin Belousov 	long secs, psecs;
531a870bf2cSKonstantin Belousov 
5324b88c807SRodney W. Grimes 	/*
5334b88c807SRodney W. Grimes 	 * This counts time spent handling interrupts.  We could
5344b88c807SRodney W. Grimes 	 * fix this, but it is not 100% trivial (and interrupt
5354b88c807SRodney W. Grimes 	 * time fractions only work on the sparc anyway).	XXX
5364b88c807SRodney W. Grimes 	 */
5371f7d2501SKirk McKusick 	secs = k->ki_p->ki_runtime / 1000000;
5381f7d2501SKirk McKusick 	psecs = k->ki_p->ki_runtime % 1000000;
5394b88c807SRodney W. Grimes 	if (sumrusage) {
5401f7d2501SKirk McKusick 		secs += k->ki_p->ki_childtime.tv_sec;
5411f7d2501SKirk McKusick 		psecs += k->ki_p->ki_childtime.tv_usec;
5424b88c807SRodney W. Grimes 	}
5431d1143ecSEdward Tomasz Napierala 	return (printtime(k, ve, secs, psecs));
5445832a752SBruce Evans }
545a870bf2cSKonstantin Belousov 
5461d1143ecSEdward Tomasz Napierala char *
547a870bf2cSKonstantin Belousov systime(KINFO *k, VARENT *ve)
548a870bf2cSKonstantin Belousov {
549a870bf2cSKonstantin Belousov 	long secs, psecs;
550a870bf2cSKonstantin Belousov 
551a870bf2cSKonstantin Belousov 	secs = k->ki_p->ki_rusage.ru_stime.tv_sec;
552a870bf2cSKonstantin Belousov 	psecs = k->ki_p->ki_rusage.ru_stime.tv_usec;
553a870bf2cSKonstantin Belousov 	if (sumrusage) {
554a870bf2cSKonstantin Belousov 		secs += k->ki_p->ki_childstime.tv_sec;
555a870bf2cSKonstantin Belousov 		psecs += k->ki_p->ki_childstime.tv_usec;
556a870bf2cSKonstantin Belousov 	}
5571d1143ecSEdward Tomasz Napierala 	return (printtime(k, ve, secs, psecs));
558a870bf2cSKonstantin Belousov }
559a870bf2cSKonstantin Belousov 
5601d1143ecSEdward Tomasz Napierala char *
561a870bf2cSKonstantin Belousov usertime(KINFO *k, VARENT *ve)
562a870bf2cSKonstantin Belousov {
563a870bf2cSKonstantin Belousov 	long secs, psecs;
564a870bf2cSKonstantin Belousov 
565a870bf2cSKonstantin Belousov 	secs = k->ki_p->ki_rusage.ru_utime.tv_sec;
566a870bf2cSKonstantin Belousov 	psecs = k->ki_p->ki_rusage.ru_utime.tv_usec;
567a870bf2cSKonstantin Belousov 	if (sumrusage) {
568a870bf2cSKonstantin Belousov 		secs += k->ki_p->ki_childutime.tv_sec;
569a870bf2cSKonstantin Belousov 		psecs += k->ki_p->ki_childutime.tv_usec;
570a870bf2cSKonstantin Belousov 	}
5711d1143ecSEdward Tomasz Napierala 	return (printtime(k, ve, secs, psecs));
5724b88c807SRodney W. Grimes }
5734b88c807SRodney W. Grimes 
5741d1143ecSEdward Tomasz Napierala char *
575*6aed20feSEd Schouten elapsed(KINFO *k, VARENT *ve __unused)
57676e1a9feSJuli Mallett {
577b85add5fSPhilippe Charnier 	time_t val;
578b85add5fSPhilippe Charnier 	int days, hours, mins, secs;
5791d1143ecSEdward Tomasz Napierala 	char *str;
58076e1a9feSJuli Mallett 
5811d1143ecSEdward Tomasz Napierala 	if (!k->ki_valid)
5821d1143ecSEdward Tomasz Napierala 		return (NULL);
583b85add5fSPhilippe Charnier 	val = now - k->ki_p->ki_start.tv_sec;
584b85add5fSPhilippe Charnier 	days = val / (24 * 60 * 60);
585b85add5fSPhilippe Charnier 	val %= 24 * 60 * 60;
586b85add5fSPhilippe Charnier 	hours = val / (60 * 60);
587b85add5fSPhilippe Charnier 	val %= 60 * 60;
588b85add5fSPhilippe Charnier 	mins = val / 60;
589b85add5fSPhilippe Charnier 	secs = val % 60;
590b85add5fSPhilippe Charnier 	if (days != 0)
5911d1143ecSEdward Tomasz Napierala 		asprintf(&str, "%3d-%02d:%02d:%02d", days, hours, mins, secs);
592b85add5fSPhilippe Charnier 	else if (hours != 0)
5931d1143ecSEdward Tomasz Napierala 		asprintf(&str, "%02d:%02d:%02d", hours, mins, secs);
594b85add5fSPhilippe Charnier 	else
5951d1143ecSEdward Tomasz Napierala 		asprintf(&str, "%02d:%02d", mins, secs);
5961d1143ecSEdward Tomasz Napierala 
5971d1143ecSEdward Tomasz Napierala 	return (str);
59876e1a9feSJuli Mallett }
59976e1a9feSJuli Mallett 
6001d1143ecSEdward Tomasz Napierala char *
601*6aed20feSEd Schouten elapseds(KINFO *k, VARENT *ve __unused)
60241ded75dSJuli Mallett {
60341ded75dSJuli Mallett 	time_t val;
6041d1143ecSEdward Tomasz Napierala 	char *str;
60541ded75dSJuli Mallett 
6061d1143ecSEdward Tomasz Napierala 	if (!k->ki_valid)
6071d1143ecSEdward Tomasz Napierala 		return (NULL);
60841ded75dSJuli Mallett 	val = now - k->ki_p->ki_start.tv_sec;
6091d1143ecSEdward Tomasz Napierala 	asprintf(&str, "%jd", (intmax_t)val);
6101d1143ecSEdward Tomasz Napierala 	return (str);
61141ded75dSJuli Mallett }
61241ded75dSJuli Mallett 
6134b88c807SRodney W. Grimes double
614871e8d8cSMark Murray getpcpu(const KINFO *k)
6154b88c807SRodney W. Grimes {
6164b88c807SRodney W. Grimes 	static int failure;
6174b88c807SRodney W. Grimes 
6184b88c807SRodney W. Grimes 	if (!nlistread)
6194b88c807SRodney W. Grimes 		failure = donlist();
6204b88c807SRodney W. Grimes 	if (failure)
6214b88c807SRodney W. Grimes 		return (0.0);
6224b88c807SRodney W. Grimes 
6234b88c807SRodney W. Grimes #define	fxtofl(fixpt)	((double)(fixpt) / fscale)
6244b88c807SRodney W. Grimes 
6254b88c807SRodney W. Grimes 	/* XXX - I don't like this */
626b61ce5b0SJeff Roberson 	if (k->ki_p->ki_swtime == 0 || (k->ki_p->ki_flag & P_INMEM) == 0)
6274b88c807SRodney W. Grimes 		return (0.0);
6284b88c807SRodney W. Grimes 	if (rawcpu)
6291f7d2501SKirk McKusick 		return (100.0 * fxtofl(k->ki_p->ki_pctcpu));
6301f7d2501SKirk McKusick 	return (100.0 * fxtofl(k->ki_p->ki_pctcpu) /
6311f7d2501SKirk McKusick 		(1.0 - exp(k->ki_p->ki_swtime * log(fxtofl(ccpu)))));
6324b88c807SRodney W. Grimes }
6334b88c807SRodney W. Grimes 
6341d1143ecSEdward Tomasz Napierala char *
635*6aed20feSEd Schouten pcpu(KINFO *k, VARENT *ve __unused)
6364b88c807SRodney W. Grimes {
6371d1143ecSEdward Tomasz Napierala 	char *str;
6384b88c807SRodney W. Grimes 
6391d1143ecSEdward Tomasz Napierala 	asprintf(&str, "%.1f", getpcpu(k));
6401d1143ecSEdward Tomasz Napierala 	return (str);
6414b88c807SRodney W. Grimes }
6424b88c807SRodney W. Grimes 
643871e8d8cSMark Murray static double
64446251ddeSWarner Losh getpmem(KINFO *k)
6454b88c807SRodney W. Grimes {
6464b88c807SRodney W. Grimes 	static int failure;
6474b88c807SRodney W. Grimes 	double fracmem;
6484b88c807SRodney W. Grimes 
6494b88c807SRodney W. Grimes 	if (!nlistread)
6504b88c807SRodney W. Grimes 		failure = donlist();
6514b88c807SRodney W. Grimes 	if (failure)
6524b88c807SRodney W. Grimes 		return (0.0);
6534b88c807SRodney W. Grimes 
654b61ce5b0SJeff Roberson 	if ((k->ki_p->ki_flag & P_INMEM) == 0)
6554b88c807SRodney W. Grimes 		return (0.0);
6564b88c807SRodney W. Grimes 	/* XXX want pmap ptpages, segtab, etc. (per architecture) */
6574b88c807SRodney W. Grimes 	/* XXX don't have info about shared */
65885012e7cSPeter Wemm 	fracmem = ((float)k->ki_p->ki_rssize) / mempages;
6594b88c807SRodney W. Grimes 	return (100.0 * fracmem);
6604b88c807SRodney W. Grimes }
6614b88c807SRodney W. Grimes 
6621d1143ecSEdward Tomasz Napierala char *
663*6aed20feSEd Schouten pmem(KINFO *k, VARENT *ve __unused)
6644b88c807SRodney W. Grimes {
6651d1143ecSEdward Tomasz Napierala 	char *str;
6664b88c807SRodney W. Grimes 
6671d1143ecSEdward Tomasz Napierala 	asprintf(&str, "%.1f", getpmem(k));
6681d1143ecSEdward Tomasz Napierala 	return (str);
6694b88c807SRodney W. Grimes }
6704b88c807SRodney W. Grimes 
6711d1143ecSEdward Tomasz Napierala char *
672*6aed20feSEd Schouten pagein(KINFO *k, VARENT *ve __unused)
6734b88c807SRodney W. Grimes {
6741d1143ecSEdward Tomasz Napierala 	char *str;
6754b88c807SRodney W. Grimes 
6761d1143ecSEdward Tomasz Napierala 	asprintf(&str, "%ld", k->ki_valid ? k->ki_p->ki_rusage.ru_majflt : 0);
6771d1143ecSEdward Tomasz Napierala 	return (str);
6784b88c807SRodney W. Grimes }
6794b88c807SRodney W. Grimes 
680871e8d8cSMark Murray /* ARGSUSED */
6811d1143ecSEdward Tomasz Napierala char *
682*6aed20feSEd Schouten maxrss(KINFO *k __unused, VARENT *ve __unused)
6834b88c807SRodney W. Grimes {
6844b88c807SRodney W. Grimes 
685940cca66SPeter Wemm 	/* XXX not yet */
6861d1143ecSEdward Tomasz Napierala 	return (NULL);
6874b88c807SRodney W. Grimes }
6884b88c807SRodney W. Grimes 
6891d1143ecSEdward Tomasz Napierala char *
690*6aed20feSEd Schouten priorityr(KINFO *k, VARENT *ve __unused)
691ad863cacSSteve Price {
692871e8d8cSMark Murray 	struct priority *lpri;
6931d1143ecSEdward Tomasz Napierala 	char *str;
6944c85452bSJake Burkholder 	unsigned class, level;
695ad863cacSSteve Price 
6963998d222SGarance A Drosehn 	lpri = &k->ki_p->ki_pri;
697871e8d8cSMark Murray 	class = lpri->pri_class;
698871e8d8cSMark Murray 	level = lpri->pri_level;
6994c85452bSJake Burkholder 	switch (class) {
70070548f64SGarance A Drosehn 	case PRI_ITHD:
7011d1143ecSEdward Tomasz Napierala 		asprintf(&str, "intr:%u", level);
70270548f64SGarance A Drosehn 		break;
7034c85452bSJake Burkholder 	case PRI_REALTIME:
7041d1143ecSEdward Tomasz Napierala 		asprintf(&str, "real:%u", level);
705ad863cacSSteve Price 		break;
7064c85452bSJake Burkholder 	case PRI_TIMESHARE:
7071d1143ecSEdward Tomasz Napierala 		asprintf(&str, "normal");
708ad863cacSSteve Price 		break;
7094c85452bSJake Burkholder 	case PRI_IDLE:
7101d1143ecSEdward Tomasz Napierala 		asprintf(&str, "idle:%u", level);
711ad863cacSSteve Price 		break;
712ad863cacSSteve Price 	default:
7131d1143ecSEdward Tomasz Napierala 		asprintf(&str, "%u:%u", class, level);
714ad863cacSSteve Price 		break;
715ad863cacSSteve Price 	}
7161d1143ecSEdward Tomasz Napierala 	return (str);
717ad863cacSSteve Price }
718ad863cacSSteve Price 
7194b88c807SRodney W. Grimes /*
7204b88c807SRodney W. Grimes  * Generic output routines.  Print fields from various prototype
7214b88c807SRodney W. Grimes  * structures.
7224b88c807SRodney W. Grimes  */
7231d1143ecSEdward Tomasz Napierala static char *
724ffe25988SJuli Mallett printval(void *bp, VAR *v)
7254b88c807SRodney W. Grimes {
7264b88c807SRodney W. Grimes 	static char ofmt[32] = "%";
727fdbec398SJuli Mallett 	const char *fcp;
7281d1143ecSEdward Tomasz Napierala 	char *cp, *str;
7294b88c807SRodney W. Grimes 
7304b88c807SRodney W. Grimes 	cp = ofmt + 1;
7314b88c807SRodney W. Grimes 	fcp = v->fmt;
7320fd510b7SJoerg Wunsch 	while ((*cp++ = *fcp++));
7334b88c807SRodney W. Grimes 
734e2c9ac69STim J. Robbins #define	CHKINF127(n)	(((n) > 127) && (v->flag & INF127) ? 127 : (n))
735e2c9ac69STim J. Robbins 
7364b88c807SRodney W. Grimes 	switch (v->type) {
7374b88c807SRodney W. Grimes 	case CHAR:
7381d1143ecSEdward Tomasz Napierala 		(void)asprintf(&str, ofmt, *(char *)bp);
7394b88c807SRodney W. Grimes 		break;
7404b88c807SRodney W. Grimes 	case UCHAR:
7411d1143ecSEdward Tomasz Napierala 		(void)asprintf(&str, ofmt, *(u_char *)bp);
7424b88c807SRodney W. Grimes 		break;
7434b88c807SRodney W. Grimes 	case SHORT:
7441d1143ecSEdward Tomasz Napierala 		(void)asprintf(&str, ofmt, *(short *)bp);
7454b88c807SRodney W. Grimes 		break;
7464b88c807SRodney W. Grimes 	case USHORT:
7471d1143ecSEdward Tomasz Napierala 		(void)asprintf(&str, ofmt, *(u_short *)bp);
7484b88c807SRodney W. Grimes 		break;
7493929d518SDoug Rabson 	case INT:
7501d1143ecSEdward Tomasz Napierala 		(void)asprintf(&str, ofmt, *(int *)bp);
7513929d518SDoug Rabson 		break;
7523929d518SDoug Rabson 	case UINT:
7531d1143ecSEdward Tomasz Napierala 		(void)asprintf(&str, ofmt, CHKINF127(*(u_int *)bp));
7543929d518SDoug Rabson 		break;
7554b88c807SRodney W. Grimes 	case LONG:
7561d1143ecSEdward Tomasz Napierala 		(void)asprintf(&str, ofmt, *(long *)bp);
7574b88c807SRodney W. Grimes 		break;
7584b88c807SRodney W. Grimes 	case ULONG:
7591d1143ecSEdward Tomasz Napierala 		(void)asprintf(&str, ofmt, *(u_long *)bp);
7604b88c807SRodney W. Grimes 		break;
7614b88c807SRodney W. Grimes 	case KPTR:
7621d1143ecSEdward Tomasz Napierala 		(void)asprintf(&str, ofmt, *(u_long *)bp);
7634b88c807SRodney W. Grimes 		break;
764362d62baSJuli Mallett 	case PGTOK:
7651d1143ecSEdward Tomasz Napierala 		(void)asprintf(&str, ofmt, ps_pgtok(*(u_long *)bp));
766760bbf7dSJuli Mallett 		break;
7674b88c807SRodney W. Grimes 	default:
7684b88c807SRodney W. Grimes 		errx(1, "unknown type %d", v->type);
7694b88c807SRodney W. Grimes 	}
7701d1143ecSEdward Tomasz Napierala 
7711d1143ecSEdward Tomasz Napierala 	return (str);
7724b88c807SRodney W. Grimes }
7734b88c807SRodney W. Grimes 
7741d1143ecSEdward Tomasz Napierala char *
77546251ddeSWarner Losh kvar(KINFO *k, VARENT *ve)
7764b88c807SRodney W. Grimes {
7774b88c807SRodney W. Grimes 	VAR *v;
7784b88c807SRodney W. Grimes 
7794b88c807SRodney W. Grimes 	v = ve->var;
7801d1143ecSEdward Tomasz Napierala 	return (printval((char *)((char *)k->ki_p + v->off), v));
7814b88c807SRodney W. Grimes }
7824b88c807SRodney W. Grimes 
7831d1143ecSEdward Tomasz Napierala char *
78446251ddeSWarner Losh rvar(KINFO *k, VARENT *ve)
7854b88c807SRodney W. Grimes {
7864b88c807SRodney W. Grimes 	VAR *v;
7874b88c807SRodney W. Grimes 
7884b88c807SRodney W. Grimes 	v = ve->var;
7891d1143ecSEdward Tomasz Napierala 	if (!k->ki_valid)
7901d1143ecSEdward Tomasz Napierala 		return (NULL);
7911d1143ecSEdward Tomasz Napierala 	return (printval((char *)((char *)(&k->ki_p->ki_rusage) + v->off), v));
7924b88c807SRodney W. Grimes }
7937304f61fSBrian Feldman 
7941d1143ecSEdward Tomasz Napierala char *
795*6aed20feSEd Schouten emulname(KINFO *k, VARENT *ve __unused)
79615b87b53SGarance A Drosehn {
79715b87b53SGarance A Drosehn 
7981d1143ecSEdward Tomasz Napierala 	if (k->ki_p->ki_emul == NULL)
7991d1143ecSEdward Tomasz Napierala 		return (NULL);
8001d1143ecSEdward Tomasz Napierala 	return (strdup(k->ki_p->ki_emul));
80115b87b53SGarance A Drosehn }
80215b87b53SGarance A Drosehn 
8031d1143ecSEdward Tomasz Napierala char *
804*6aed20feSEd Schouten label(KINFO *k, VARENT *ve __unused)
8057304f61fSBrian Feldman {
8062af538ebSRobert Watson 	char *string;
807775bba9fSJuli Mallett 	mac_t proclabel;
8082af538ebSRobert Watson 	int error;
8097304f61fSBrian Feldman 
8102af538ebSRobert Watson 	string = NULL;
811775bba9fSJuli Mallett 	if (mac_prepare_process_label(&proclabel) == -1) {
8122c61418dSTim J. Robbins 		warn("mac_prepare_process_label");
8132af538ebSRobert Watson 		goto out;
8142af538ebSRobert Watson 	}
815775bba9fSJuli Mallett 	error = mac_get_pid(k->ki_p->ki_pid, proclabel);
8162af538ebSRobert Watson 	if (error == 0) {
817775bba9fSJuli Mallett 		if (mac_to_text(proclabel, &string) == -1)
8182af538ebSRobert Watson 			string = NULL;
8192af538ebSRobert Watson 	}
820775bba9fSJuli Mallett 	mac_free(proclabel);
8212af538ebSRobert Watson out:
8221d1143ecSEdward Tomasz Napierala 	return (string);
8232af538ebSRobert Watson }
8242af538ebSRobert Watson 
8251d1143ecSEdward Tomasz Napierala char *
826*6aed20feSEd Schouten loginclass(KINFO *k, VARENT *ve __unused)
8277123f4cdSEdward Tomasz Napierala {
8287123f4cdSEdward Tomasz Napierala 	char *s;
8297123f4cdSEdward Tomasz Napierala 
8307123f4cdSEdward Tomasz Napierala 	/*
8317123f4cdSEdward Tomasz Napierala 	 * Don't display login class for system processes;
8327123f4cdSEdward Tomasz Napierala 	 * login classes are used for resource limits,
8337123f4cdSEdward Tomasz Napierala 	 * and limits don't apply to system processes.
8347123f4cdSEdward Tomasz Napierala 	 */
8357123f4cdSEdward Tomasz Napierala 	if (k->ki_p->ki_flag & P_SYSTEM) {
8361d1143ecSEdward Tomasz Napierala 		return (strdup("-"));
8377123f4cdSEdward Tomasz Napierala 	}
8387123f4cdSEdward Tomasz Napierala 	s = k->ki_p->ki_loginclass;
8393bf92decSEdward Tomasz Napierala 	if (s == NULL)
8401d1143ecSEdward Tomasz Napierala 		return (NULL);
8411d1143ecSEdward Tomasz Napierala 	return (strdup(s));
842f9db2550SEdward Tomasz Napierala }
843