xref: /freebsd/bin/ps/print.c (revision 3fe686f25a0d0844dc3afd0b3b067ec46abdbc99)
14b88c807SRodney W. Grimes /*-
28a16b7a1SPedro F. Giffuni  * SPDX-License-Identifier: BSD-3-Clause
38a16b7a1SPedro F. Giffuni  *
44b88c807SRodney W. Grimes  * Copyright (c) 1990, 1993, 1994
54b88c807SRodney W. Grimes  *	The Regents of the University of California.  All rights reserved.
64b88c807SRodney W. Grimes  *
74b88c807SRodney W. Grimes  * Redistribution and use in source and binary forms, with or without
84b88c807SRodney W. Grimes  * modification, are permitted provided that the following conditions
94b88c807SRodney W. Grimes  * are met:
104b88c807SRodney W. Grimes  * 1. Redistributions of source code must retain the above copyright
114b88c807SRodney W. Grimes  *    notice, this list of conditions and the following disclaimer.
124b88c807SRodney W. Grimes  * 2. Redistributions in binary form must reproduce the above copyright
134b88c807SRodney W. Grimes  *    notice, this list of conditions and the following disclaimer in the
144b88c807SRodney W. Grimes  *    documentation and/or other materials provided with the distribution.
15fbbd9655SWarner Losh  * 3. Neither the name of the University nor the names of its contributors
164b88c807SRodney W. Grimes  *    may be used to endorse or promote products derived from this software
174b88c807SRodney W. Grimes  *    without specific prior written permission.
184b88c807SRodney W. Grimes  *
194b88c807SRodney W. Grimes  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
204b88c807SRodney W. Grimes  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
214b88c807SRodney W. Grimes  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
224b88c807SRodney W. Grimes  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
234b88c807SRodney W. Grimes  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
244b88c807SRodney W. Grimes  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
254b88c807SRodney W. Grimes  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
264b88c807SRodney W. Grimes  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
274b88c807SRodney W. Grimes  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
284b88c807SRodney W. Grimes  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
294b88c807SRodney W. Grimes  * SUCH DAMAGE.
304b88c807SRodney W. Grimes  */
314b88c807SRodney W. Grimes 
32c9a8d1f4SPhilippe Charnier #if 0
33871e8d8cSMark Murray #ifndef lint
34c9a8d1f4SPhilippe Charnier static char sccsid[] = "@(#)print.c	8.6 (Berkeley) 4/16/94";
354b88c807SRodney W. Grimes #endif /* not lint */
36871e8d8cSMark Murray #endif
37eaed5652SPhilippe Charnier 
382749b141SDavid E. O'Brien #include <sys/cdefs.h>
392749b141SDavid E. O'Brien __FBSDID("$FreeBSD$");
404b88c807SRodney W. Grimes 
414b88c807SRodney W. Grimes #include <sys/param.h>
424b88c807SRodney W. Grimes #include <sys/time.h>
434b88c807SRodney W. Grimes #include <sys/resource.h>
444b88c807SRodney W. Grimes #include <sys/proc.h>
454b88c807SRodney W. Grimes #include <sys/stat.h>
464b88c807SRodney W. Grimes 
472af538ebSRobert Watson #include <sys/mac.h>
488b9b0e39SPoul-Henning Kamp #include <sys/user.h>
494b88c807SRodney W. Grimes #include <sys/sysctl.h>
5050a57dfbSKonstantin Belousov #include <sys/vmmeter.h>
514b88c807SRodney W. Grimes 
524b88c807SRodney W. Grimes #include <err.h>
53576541a9SWarner Losh #include <grp.h>
542f5a9b76SJohn Baldwin #include <jail.h>
55f59105eeSAndrey A. Chernov #include <langinfo.h>
568073a93cSAndrey A. Chernov #include <locale.h>
574b88c807SRodney W. Grimes #include <math.h>
584b88c807SRodney W. Grimes #include <nlist.h>
59576541a9SWarner Losh #include <pwd.h>
604b88c807SRodney W. Grimes #include <stddef.h>
6141ded75dSJuli Mallett #include <stdint.h>
624b88c807SRodney W. Grimes #include <stdio.h>
634b88c807SRodney W. Grimes #include <stdlib.h>
644b88c807SRodney W. Grimes #include <string.h>
65871e8d8cSMark Murray #include <unistd.h>
664b88c807SRodney W. Grimes #include <vis.h>
678beb1a2fSMarcel Moolenaar #include <libxo/xo.h>
684b88c807SRodney W. Grimes 
694b88c807SRodney W. Grimes #include "ps.h"
704b88c807SRodney W. Grimes 
711d1143ecSEdward Tomasz Napierala #define	COMMAND_WIDTH	16
721d1143ecSEdward Tomasz Napierala #define	ARGUMENTS_WIDTH	16
731d1143ecSEdward Tomasz Napierala 
746327ab9cSPeter Wemm #define	ps_pgtok(a)	(((a) * getpagesize()) / 1024)
75871e8d8cSMark Murray 
764b88c807SRodney W. Grimes void
7746251ddeSWarner Losh printheader(void)
784b88c807SRodney W. Grimes {
794b88c807SRodney W. Grimes 	VAR *v;
804b88c807SRodney W. Grimes 	struct varent *vent;
814b88c807SRodney W. Grimes 
82bdf8ab46SGarance A Drosehn 	STAILQ_FOREACH(vent, &varlist, next_ve)
83bdf8ab46SGarance A Drosehn 		if (*vent->header != '\0')
8401e5f166STim J. Robbins 			break;
85bdf8ab46SGarance A Drosehn 	if (!vent)
8601e5f166STim J. Robbins 		return;
87bdf8ab46SGarance A Drosehn 
88bdf8ab46SGarance A Drosehn 	STAILQ_FOREACH(vent, &varlist, next_ve) {
894b88c807SRodney W. Grimes 		v = vent->var;
904b88c807SRodney W. Grimes 		if (v->flag & LJUST) {
91bdf8ab46SGarance A Drosehn 			if (STAILQ_NEXT(vent, next_ve) == NULL)	/* last one */
92aa8ab146SYuri Pankov 				xo_emit("{T:/%hs}", vent->header);
934b88c807SRodney W. Grimes 			else
94aa8ab146SYuri Pankov 				xo_emit("{T:/%-*hs}", v->width, vent->header);
954b88c807SRodney W. Grimes 		} else
96aa8ab146SYuri Pankov 			xo_emit("{T:/%*hs}", v->width, vent->header);
97bdf8ab46SGarance A Drosehn 		if (STAILQ_NEXT(vent, next_ve) != NULL)
988beb1a2fSMarcel Moolenaar 			xo_emit("{P: }");
994b88c807SRodney W. Grimes 	}
1008beb1a2fSMarcel Moolenaar 	xo_emit("\n");
1014b88c807SRodney W. Grimes }
1024b88c807SRodney W. Grimes 
1031d1143ecSEdward Tomasz Napierala char *
10403334017SJuli Mallett arguments(KINFO *k, VARENT *ve)
10503334017SJuli Mallett {
1061d1143ecSEdward Tomasz Napierala 	char *vis_args;
10703334017SJuli Mallett 
10803334017SJuli Mallett 	if ((vis_args = malloc(strlen(k->ki_args) * 4 + 1)) == NULL)
1098beb1a2fSMarcel Moolenaar 		xo_errx(1, "malloc failed");
11003334017SJuli Mallett 	strvis(vis_args, k->ki_args, VIS_TAB | VIS_NL | VIS_NOSLASH);
1111d1143ecSEdward Tomasz Napierala 
1121d1143ecSEdward Tomasz Napierala 	if (STAILQ_NEXT(ve, next_ve) != NULL && strlen(vis_args) > ARGUMENTS_WIDTH)
1131d1143ecSEdward Tomasz Napierala 		vis_args[ARGUMENTS_WIDTH] = '\0';
1141d1143ecSEdward Tomasz Napierala 
1151d1143ecSEdward Tomasz Napierala 	return (vis_args);
11603334017SJuli Mallett }
11703334017SJuli Mallett 
1181d1143ecSEdward Tomasz Napierala char *
11946251ddeSWarner Losh command(KINFO *k, VARENT *ve)
1204b88c807SRodney W. Grimes {
1211d1143ecSEdward Tomasz Napierala 	char *vis_args, *vis_env, *str;
1224b88c807SRodney W. Grimes 
123db91faacSPeter Wemm 	if (cflag) {
124bdf8ab46SGarance A Drosehn 		/* If it is the last field, then don't pad */
1257ab24ea3SJulian Elischer 		if (STAILQ_NEXT(ve, next_ve) == NULL) {
1263d32d4a7SEric van Gyzen 			asprintf(&str, "%s%s%s%s%s",
1271d1143ecSEdward Tomasz Napierala 			    k->ki_d.prefix ? k->ki_d.prefix : "",
1281d1143ecSEdward Tomasz Napierala 			    k->ki_p->ki_comm,
1291d1143ecSEdward Tomasz Napierala 			    (showthreads && k->ki_p->ki_numthreads > 1) ? "/" : "",
1303d32d4a7SEric van Gyzen 			    (showthreads && k->ki_p->ki_numthreads > 1) ? k->ki_p->ki_tdname : "",
1313d32d4a7SEric van Gyzen 			    (showthreads && k->ki_p->ki_numthreads > 1) ? k->ki_p->ki_moretdname : "");
1327ab24ea3SJulian Elischer 		} else
1331d1143ecSEdward Tomasz Napierala 			str = strdup(k->ki_p->ki_comm);
1341d1143ecSEdward Tomasz Napierala 
1351d1143ecSEdward Tomasz Napierala 		return (str);
136db91faacSPeter Wemm 	}
1374b88c807SRodney W. Grimes 	if ((vis_args = malloc(strlen(k->ki_args) * 4 + 1)) == NULL)
1388beb1a2fSMarcel Moolenaar 		xo_errx(1, "malloc failed");
1394b88c807SRodney W. Grimes 	strvis(vis_args, k->ki_args, VIS_TAB | VIS_NL | VIS_NOSLASH);
1404b88c807SRodney W. Grimes 
141bdf8ab46SGarance A Drosehn 	if (STAILQ_NEXT(ve, next_ve) == NULL) {
1424b88c807SRodney W. Grimes 		/* last field */
143044fce53SBrian Somers 
144044fce53SBrian Somers 		if (k->ki_env) {
145044fce53SBrian Somers 			if ((vis_env = malloc(strlen(k->ki_env) * 4 + 1))
146044fce53SBrian Somers 			    == NULL)
1478beb1a2fSMarcel Moolenaar 				xo_errx(1, "malloc failed");
148044fce53SBrian Somers 			strvis(vis_env, k->ki_env,
149044fce53SBrian Somers 			    VIS_TAB | VIS_NL | VIS_NOSLASH);
150044fce53SBrian Somers 		} else
151044fce53SBrian Somers 			vis_env = NULL;
152044fce53SBrian Somers 
1531d1143ecSEdward Tomasz Napierala 		asprintf(&str, "%s%s%s%s",
1541d1143ecSEdward Tomasz Napierala 		    k->ki_d.prefix ? k->ki_d.prefix : "",
1551d1143ecSEdward Tomasz Napierala 		    vis_env ? vis_env : "",
1561d1143ecSEdward Tomasz Napierala 		    vis_env ? " " : "",
1571d1143ecSEdward Tomasz Napierala 		    vis_args);
1581d1143ecSEdward Tomasz Napierala 
1594b88c807SRodney W. Grimes 		if (vis_env != NULL)
1604b88c807SRodney W. Grimes 			free(vis_env);
161044fce53SBrian Somers 		free(vis_args);
1621d1143ecSEdward Tomasz Napierala 	} else {
1631d1143ecSEdward Tomasz Napierala 		/* ki_d.prefix & ki_env aren't shown for interim fields */
1641d1143ecSEdward Tomasz Napierala 		str = vis_args;
1651d1143ecSEdward Tomasz Napierala 
1661d1143ecSEdward Tomasz Napierala 		if (strlen(str) > COMMAND_WIDTH)
1671d1143ecSEdward Tomasz Napierala 			str[COMMAND_WIDTH] = '\0';
1684b88c807SRodney W. Grimes 	}
1694b88c807SRodney W. Grimes 
1701d1143ecSEdward Tomasz Napierala 	return (str);
1711d1143ecSEdward Tomasz Napierala }
1721d1143ecSEdward Tomasz Napierala 
1731d1143ecSEdward Tomasz Napierala char *
17446251ddeSWarner Losh ucomm(KINFO *k, VARENT *ve)
1754b88c807SRodney W. Grimes {
1761d1143ecSEdward Tomasz Napierala 	char *str;
1774b88c807SRodney W. Grimes 
1787ab24ea3SJulian Elischer 	if (STAILQ_NEXT(ve, next_ve) == NULL) {	/* last field, don't pad */
1793d32d4a7SEric van Gyzen 		asprintf(&str, "%s%s%s%s%s",
1801d1143ecSEdward Tomasz Napierala 		    k->ki_d.prefix ? k->ki_d.prefix : "",
1811d1143ecSEdward Tomasz Napierala 		    k->ki_p->ki_comm,
1821d1143ecSEdward Tomasz Napierala 		    (showthreads && k->ki_p->ki_numthreads > 1) ? "/" : "",
1833d32d4a7SEric van Gyzen 		    (showthreads && k->ki_p->ki_numthreads > 1) ? k->ki_p->ki_tdname : "",
1843d32d4a7SEric van Gyzen 		    (showthreads && k->ki_p->ki_numthreads > 1) ? k->ki_p->ki_moretdname : "");
1854610a811SAttilio Rao 	} else {
1864610a811SAttilio Rao 		if (showthreads && k->ki_p->ki_numthreads > 1)
1873d32d4a7SEric van Gyzen 			asprintf(&str, "%s/%s%s", k->ki_p->ki_comm,
1883d32d4a7SEric van Gyzen 			    k->ki_p->ki_tdname, k->ki_p->ki_moretdname);
1894610a811SAttilio Rao 		else
1901d1143ecSEdward Tomasz Napierala 			str = strdup(k->ki_p->ki_comm);
1914610a811SAttilio Rao 	}
1921d1143ecSEdward Tomasz Napierala 	return (str);
1934b88c807SRodney W. Grimes }
1944b88c807SRodney W. Grimes 
1951d1143ecSEdward Tomasz Napierala char *
1966aed20feSEd Schouten tdnam(KINFO *k, VARENT *ve __unused)
1977ab24ea3SJulian Elischer {
1981d1143ecSEdward Tomasz Napierala 	char *str;
1997ab24ea3SJulian Elischer 
2007ab24ea3SJulian Elischer 	if (showthreads && k->ki_p->ki_numthreads > 1)
2013d32d4a7SEric van Gyzen 		asprintf(&str, "%s%s", k->ki_p->ki_tdname,
2023d32d4a7SEric van Gyzen 		    k->ki_p->ki_moretdname);
2037ab24ea3SJulian Elischer 	else
2041d1143ecSEdward Tomasz Napierala 		str = strdup("      ");
2051d1143ecSEdward Tomasz Napierala 
2061d1143ecSEdward Tomasz Napierala 	return (str);
2077ab24ea3SJulian Elischer }
2087ab24ea3SJulian Elischer 
2091d1143ecSEdward Tomasz Napierala char *
2106aed20feSEd Schouten logname(KINFO *k, VARENT *ve __unused)
2114b88c807SRodney W. Grimes {
2124b88c807SRodney W. Grimes 
2131d1143ecSEdward Tomasz Napierala 	if (*k->ki_p->ki_login == '\0')
2141d1143ecSEdward Tomasz Napierala 		return (NULL);
2151d1143ecSEdward Tomasz Napierala 	return (strdup(k->ki_p->ki_login));
2164b88c807SRodney W. Grimes }
2174b88c807SRodney W. Grimes 
2181d1143ecSEdward Tomasz Napierala char *
2196aed20feSEd Schouten state(KINFO *k, VARENT *ve __unused)
2204b88c807SRodney W. Grimes {
22145ed6753SConrad Meyer 	long flag, tdflags;
2221d1143ecSEdward Tomasz Napierala 	char *cp, *buf;
2231d1143ecSEdward Tomasz Napierala 
2241d1143ecSEdward Tomasz Napierala 	buf = malloc(16);
2251d1143ecSEdward Tomasz Napierala 	if (buf == NULL)
2268beb1a2fSMarcel Moolenaar 		xo_errx(1, "malloc failed");
2274b88c807SRodney W. Grimes 
2281f7d2501SKirk McKusick 	flag = k->ki_p->ki_flag;
229b40ce416SJulian Elischer 	tdflags = k->ki_p->ki_tdflags;	/* XXXKSE */
2304b88c807SRodney W. Grimes 	cp = buf;
2314b88c807SRodney W. Grimes 
2321f7d2501SKirk McKusick 	switch (k->ki_p->ki_stat) {
2334b88c807SRodney W. Grimes 
2344b88c807SRodney W. Grimes 	case SSTOP:
2354b88c807SRodney W. Grimes 		*cp = 'T';
2364b88c807SRodney W. Grimes 		break;
2374b88c807SRodney W. Grimes 
2384b88c807SRodney W. Grimes 	case SSLEEP:
239*3fe686f2SElyes HAOUAS 		if (tdflags & TDF_SINTR)	/* interruptible (long) */
2401f7d2501SKirk McKusick 			*cp = k->ki_p->ki_slptime >= MAXSLP ? 'I' : 'S';
2414b88c807SRodney W. Grimes 		else
2424b88c807SRodney W. Grimes 			*cp = 'D';
2434b88c807SRodney W. Grimes 		break;
2444b88c807SRodney W. Grimes 
2454b88c807SRodney W. Grimes 	case SRUN:
2464b88c807SRodney W. Grimes 	case SIDL:
2474b88c807SRodney W. Grimes 		*cp = 'R';
2484b88c807SRodney W. Grimes 		break;
2494b88c807SRodney W. Grimes 
2500384fff8SJason Evans 	case SWAIT:
2510384fff8SJason Evans 		*cp = 'W';
2520384fff8SJason Evans 		break;
2530384fff8SJason Evans 
2540d632649SJohn Baldwin 	case SLOCK:
2550d632649SJohn Baldwin 		*cp = 'L';
2560384fff8SJason Evans 		break;
2570384fff8SJason Evans 
2584b88c807SRodney W. Grimes 	case SZOMB:
2594b88c807SRodney W. Grimes 		*cp = 'Z';
2604b88c807SRodney W. Grimes 		break;
2614b88c807SRodney W. Grimes 
2624b88c807SRodney W. Grimes 	default:
2634b88c807SRodney W. Grimes 		*cp = '?';
2644b88c807SRodney W. Grimes 	}
2654b88c807SRodney W. Grimes 	cp++;
266b61ce5b0SJeff Roberson 	if (!(flag & P_INMEM))
2674b88c807SRodney W. Grimes 		*cp++ = 'W';
268e4d52dfdSEdward Tomasz Napierala 	if (k->ki_p->ki_nice < NZERO || k->ki_p->ki_pri.pri_class == PRI_REALTIME)
2694b88c807SRodney W. Grimes 		*cp++ = '<';
270e4d52dfdSEdward Tomasz Napierala 	else if (k->ki_p->ki_nice > NZERO || k->ki_p->ki_pri.pri_class == PRI_IDLE)
2714b88c807SRodney W. Grimes 		*cp++ = 'N';
2724b88c807SRodney W. Grimes 	if (flag & P_TRACED)
2734b88c807SRodney W. Grimes 		*cp++ = 'X';
2741f7d2501SKirk McKusick 	if (flag & P_WEXIT && k->ki_p->ki_stat != SZOMB)
2754b88c807SRodney W. Grimes 		*cp++ = 'E';
2764b88c807SRodney W. Grimes 	if (flag & P_PPWAIT)
2774b88c807SRodney W. Grimes 		*cp++ = 'V';
2781f7d2501SKirk McKusick 	if ((flag & P_SYSTEM) || k->ki_p->ki_lock > 0)
2794b88c807SRodney W. Grimes 		*cp++ = 'L';
2806f47d67bSEdward Tomasz Napierala 	if ((k->ki_p->ki_cr_flags & CRED_FLAG_CAPMODE) != 0)
2816f47d67bSEdward Tomasz Napierala 		*cp++ = 'C';
2821f7d2501SKirk McKusick 	if (k->ki_p->ki_kiflag & KI_SLEADER)
2834b88c807SRodney W. Grimes 		*cp++ = 's';
2841f7d2501SKirk McKusick 	if ((flag & P_CONTROLT) && k->ki_p->ki_pgid == k->ki_p->ki_tpgid)
2854b88c807SRodney W. Grimes 		*cp++ = '+';
28675c13541SPoul-Henning Kamp 	if (flag & P_JAILED)
28775c13541SPoul-Henning Kamp 		*cp++ = 'J';
2884b88c807SRodney W. Grimes 	*cp = '\0';
2891d1143ecSEdward Tomasz Napierala 	return (buf);
2904b88c807SRodney W. Grimes }
2914b88c807SRodney W. Grimes 
292820434b2SGarance A Drosehn #define	scalepri(x)	((x) - PZERO)
293820434b2SGarance A Drosehn 
2941d1143ecSEdward Tomasz Napierala char *
2956aed20feSEd Schouten pri(KINFO *k, VARENT *ve __unused)
2964b88c807SRodney W. Grimes {
2971d1143ecSEdward Tomasz Napierala 	char *str;
2984b88c807SRodney W. Grimes 
2991d1143ecSEdward Tomasz Napierala 	asprintf(&str, "%d", scalepri(k->ki_p->ki_pri.pri_level));
3001d1143ecSEdward Tomasz Napierala 	return (str);
3014b88c807SRodney W. Grimes }
3024b88c807SRodney W. Grimes 
3031d1143ecSEdward Tomasz Napierala char *
3046aed20feSEd Schouten upr(KINFO *k, VARENT *ve __unused)
305820434b2SGarance A Drosehn {
3061d1143ecSEdward Tomasz Napierala 	char *str;
307820434b2SGarance A Drosehn 
3081d1143ecSEdward Tomasz Napierala 	asprintf(&str, "%d", scalepri(k->ki_p->ki_pri.pri_user));
3091d1143ecSEdward Tomasz Napierala 	return (str);
310820434b2SGarance A Drosehn }
311820434b2SGarance A Drosehn #undef scalepri
312820434b2SGarance A Drosehn 
3131d1143ecSEdward Tomasz Napierala char *
3142423585bSAlex Richardson username(KINFO *k, VARENT *ve __unused)
3154b88c807SRodney W. Grimes {
3164b88c807SRodney W. Grimes 
3171d1143ecSEdward Tomasz Napierala 	return (strdup(user_from_uid(k->ki_p->ki_uid, 0)));
3184b88c807SRodney W. Grimes }
3194b88c807SRodney W. Grimes 
3201d1143ecSEdward Tomasz Napierala char *
3216aed20feSEd Schouten egroupname(KINFO *k, VARENT *ve __unused)
3229acd9127SEdward Tomasz Napierala {
3239acd9127SEdward Tomasz Napierala 
3241d1143ecSEdward Tomasz Napierala 	return (strdup(group_from_gid(k->ki_p->ki_groups[0], 0)));
3259acd9127SEdward Tomasz Napierala }
3269acd9127SEdward Tomasz Napierala 
3271d1143ecSEdward Tomasz Napierala char *
3286aed20feSEd Schouten rgroupname(KINFO *k, VARENT *ve __unused)
329e8eef4bbSJuli Mallett {
330e8eef4bbSJuli Mallett 
3311d1143ecSEdward Tomasz Napierala 	return (strdup(group_from_gid(k->ki_p->ki_rgid, 0)));
332e8eef4bbSJuli Mallett }
333e8eef4bbSJuli Mallett 
3341d1143ecSEdward Tomasz Napierala char *
3356aed20feSEd Schouten runame(KINFO *k, VARENT *ve __unused)
3364b88c807SRodney W. Grimes {
3374b88c807SRodney W. Grimes 
3381d1143ecSEdward Tomasz Napierala 	return (strdup(user_from_uid(k->ki_p->ki_ruid, 0)));
3394b88c807SRodney W. Grimes }
3404b88c807SRodney W. Grimes 
3411d1143ecSEdward Tomasz Napierala char *
3426aed20feSEd Schouten tdev(KINFO *k, VARENT *ve __unused)
3434b88c807SRodney W. Grimes {
3444b88c807SRodney W. Grimes 	dev_t dev;
3451d1143ecSEdward Tomasz Napierala 	char *str;
3464b88c807SRodney W. Grimes 
3471f7d2501SKirk McKusick 	dev = k->ki_p->ki_tdev;
3484b88c807SRodney W. Grimes 	if (dev == NODEV)
349aa7a15b6SEdward Tomasz Napierala 		str = strdup("-");
3509f365aa1SEd Schouten 	else
3511d1143ecSEdward Tomasz Napierala 		asprintf(&str, "%#jx", (uintmax_t)dev);
3521d1143ecSEdward Tomasz Napierala 
3531d1143ecSEdward Tomasz Napierala 	return (str);
3544b88c807SRodney W. Grimes }
3554b88c807SRodney W. Grimes 
3561d1143ecSEdward Tomasz Napierala char *
3576aed20feSEd Schouten tname(KINFO *k, VARENT *ve __unused)
3584b88c807SRodney W. Grimes {
3594b88c807SRodney W. Grimes 	dev_t dev;
3601d1143ecSEdward Tomasz Napierala 	char *ttname, *str;
3614b88c807SRodney W. Grimes 
3621f7d2501SKirk McKusick 	dev = k->ki_p->ki_tdev;
3634b88c807SRodney W. Grimes 	if (dev == NODEV || (ttname = devname(dev, S_IFCHR)) == NULL)
364aa7a15b6SEdward Tomasz Napierala 		str = strdup("- ");
3654b88c807SRodney W. Grimes 	else {
366efc18e2cSAndrey A. Chernov 		if (strncmp(ttname, "tty", 3) == 0 ||
367efc18e2cSAndrey A. Chernov 		    strncmp(ttname, "cua", 3) == 0)
3684b88c807SRodney W. Grimes 			ttname += 3;
3697bd5296dSOlivier Houchard 		if (strncmp(ttname, "pts/", 4) == 0)
3707bd5296dSOlivier Houchard 			ttname += 4;
3711d1143ecSEdward Tomasz Napierala 		asprintf(&str, "%s%c", ttname,
3721f7d2501SKirk McKusick 		    k->ki_p->ki_kiflag & KI_CTTY ? ' ' : '-');
3734b88c807SRodney W. Grimes 	}
3741d1143ecSEdward Tomasz Napierala 
3751d1143ecSEdward Tomasz Napierala 	return (str);
3764b88c807SRodney W. Grimes }
3774b88c807SRodney W. Grimes 
3781d1143ecSEdward Tomasz Napierala char *
3796aed20feSEd Schouten longtname(KINFO *k, VARENT *ve __unused)
3804b88c807SRodney W. Grimes {
3814b88c807SRodney W. Grimes 	dev_t dev;
3821d1143ecSEdward Tomasz Napierala 	const char *ttname;
3834b88c807SRodney W. Grimes 
3841f7d2501SKirk McKusick 	dev = k->ki_p->ki_tdev;
3854b88c807SRodney W. Grimes 	if (dev == NODEV || (ttname = devname(dev, S_IFCHR)) == NULL)
386aa7a15b6SEdward Tomasz Napierala 		ttname = "-";
3871d1143ecSEdward Tomasz Napierala 
3881d1143ecSEdward Tomasz Napierala 	return (strdup(ttname));
3894b88c807SRodney W. Grimes }
3904b88c807SRodney W. Grimes 
3911d1143ecSEdward Tomasz Napierala char *
3926aed20feSEd Schouten started(KINFO *k, VARENT *ve __unused)
3934b88c807SRodney W. Grimes {
394f8ec5fe2SBruce Evans 	time_t then;
3954b88c807SRodney W. Grimes 	struct tm *tp;
3961d1143ecSEdward Tomasz Napierala 	size_t buflen = 100;
3971d1143ecSEdward Tomasz Napierala 	char *buf;
3981d1143ecSEdward Tomasz Napierala 
3992aff415aSJilles Tjoelker 	if (!k->ki_valid)
4002aff415aSJilles Tjoelker 		return (NULL);
4012aff415aSJilles Tjoelker 
4021d1143ecSEdward Tomasz Napierala 	buf = malloc(buflen);
4031d1143ecSEdward Tomasz Napierala 	if (buf == NULL)
4048beb1a2fSMarcel Moolenaar 		xo_errx(1, "malloc failed");
4054b88c807SRodney W. Grimes 
4061f7d2501SKirk McKusick 	then = k->ki_p->ki_start.tv_sec;
407f8ec5fe2SBruce Evans 	tp = localtime(&then);
4081f7d2501SKirk McKusick 	if (now - k->ki_p->ki_start.tv_sec < 24 * 3600) {
409c2290ff6SMark Felder 		(void)strftime(buf, buflen, "%H:%M  ", tp);
4101f7d2501SKirk McKusick 	} else if (now - k->ki_p->ki_start.tv_sec < 7 * 86400) {
411c2290ff6SMark Felder 		(void)strftime(buf, buflen, "%a%H  ", tp);
4124b88c807SRodney W. Grimes 	} else
4131d1143ecSEdward Tomasz Napierala 		(void)strftime(buf, buflen, "%e%b%y", tp);
4141d1143ecSEdward Tomasz Napierala 	return (buf);
4154b88c807SRodney W. Grimes }
4164b88c807SRodney W. Grimes 
4171d1143ecSEdward Tomasz Napierala char *
4186aed20feSEd Schouten lstarted(KINFO *k, VARENT *ve __unused)
4194b88c807SRodney W. Grimes {
420f8ec5fe2SBruce Evans 	time_t then;
4211d1143ecSEdward Tomasz Napierala 	char *buf;
4221d1143ecSEdward Tomasz Napierala 	size_t buflen = 100;
4231d1143ecSEdward Tomasz Napierala 
4242aff415aSJilles Tjoelker 	if (!k->ki_valid)
4252aff415aSJilles Tjoelker 		return (NULL);
4262aff415aSJilles Tjoelker 
4271d1143ecSEdward Tomasz Napierala 	buf = malloc(buflen);
4281d1143ecSEdward Tomasz Napierala 	if (buf == NULL)
4298beb1a2fSMarcel Moolenaar 		xo_errx(1, "malloc failed");
4304b88c807SRodney W. Grimes 
4311f7d2501SKirk McKusick 	then = k->ki_p->ki_start.tv_sec;
4321d1143ecSEdward Tomasz Napierala 	(void)strftime(buf, buflen, "%c", localtime(&then));
4331d1143ecSEdward Tomasz Napierala 	return (buf);
4344b88c807SRodney W. Grimes }
4354b88c807SRodney W. Grimes 
4361d1143ecSEdward Tomasz Napierala char *
4376aed20feSEd Schouten lockname(KINFO *k, VARENT *ve __unused)
438fd5f30bfSJohn Baldwin {
4391d1143ecSEdward Tomasz Napierala 	char *str;
440fd5f30bfSJohn Baldwin 
4410d632649SJohn Baldwin 	if (k->ki_p->ki_kiflag & KI_LOCKBLOCK) {
4420d632649SJohn Baldwin 		if (k->ki_p->ki_lockname[0] != 0)
4431d1143ecSEdward Tomasz Napierala 			str = strdup(k->ki_p->ki_lockname);
444fd5f30bfSJohn Baldwin 		else
4451d1143ecSEdward Tomasz Napierala 			str = strdup("???");
446fd5f30bfSJohn Baldwin 	} else
4471d1143ecSEdward Tomasz Napierala 		str = NULL;
4481d1143ecSEdward Tomasz Napierala 
4491d1143ecSEdward Tomasz Napierala 	return (str);
450fd5f30bfSJohn Baldwin }
451fd5f30bfSJohn Baldwin 
4521d1143ecSEdward Tomasz Napierala char *
4536aed20feSEd Schouten wchan(KINFO *k, VARENT *ve __unused)
4544b88c807SRodney W. Grimes {
4551d1143ecSEdward Tomasz Napierala 	char *str;
4564b88c807SRodney W. Grimes 
4571f7d2501SKirk McKusick 	if (k->ki_p->ki_wchan) {
4581f7d2501SKirk McKusick 		if (k->ki_p->ki_wmesg[0] != 0)
4591d1143ecSEdward Tomasz Napierala 			str = strdup(k->ki_p->ki_wmesg);
4604b88c807SRodney W. Grimes 		else
4611d1143ecSEdward Tomasz Napierala 			asprintf(&str, "%lx", (long)k->ki_p->ki_wchan);
462b85add5fSPhilippe Charnier 	} else
4631d1143ecSEdward Tomasz Napierala 		str = NULL;
4641d1143ecSEdward Tomasz Napierala 
4651d1143ecSEdward Tomasz Napierala 	return (str);
466d9a5f890SMatthew Dillon }
467d9a5f890SMatthew Dillon 
4681d1143ecSEdward Tomasz Napierala char *
4696aed20feSEd Schouten nwchan(KINFO *k, VARENT *ve __unused)
470de244df7SHartmut Brandt {
4711d1143ecSEdward Tomasz Napierala 	char *str;
472de244df7SHartmut Brandt 
4731d1143ecSEdward Tomasz Napierala 	if (k->ki_p->ki_wchan)
4741d1143ecSEdward Tomasz Napierala 		asprintf(&str, "%0lx", (long)k->ki_p->ki_wchan);
4751d1143ecSEdward Tomasz Napierala 	else
4761d1143ecSEdward Tomasz Napierala 		str = NULL;
4771d1143ecSEdward Tomasz Napierala 
4781d1143ecSEdward Tomasz Napierala 	return (str);
479de244df7SHartmut Brandt }
480de244df7SHartmut Brandt 
4811d1143ecSEdward Tomasz Napierala char *
4826aed20feSEd Schouten mwchan(KINFO *k, VARENT *ve __unused)
483d9a5f890SMatthew Dillon {
4841d1143ecSEdward Tomasz Napierala 	char *str;
485d9a5f890SMatthew Dillon 
486d9a5f890SMatthew Dillon 	if (k->ki_p->ki_wchan) {
487d9a5f890SMatthew Dillon 		if (k->ki_p->ki_wmesg[0] != 0)
4881d1143ecSEdward Tomasz Napierala 			str = strdup(k->ki_p->ki_wmesg);
489d9a5f890SMatthew Dillon 		else
4901d1143ecSEdward Tomasz Napierala                         asprintf(&str, "%lx", (long)k->ki_p->ki_wchan);
4910d632649SJohn Baldwin 	} else if (k->ki_p->ki_kiflag & KI_LOCKBLOCK) {
4920d632649SJohn Baldwin 		if (k->ki_p->ki_lockname[0]) {
4931d1143ecSEdward Tomasz Napierala 			str = strdup(k->ki_p->ki_lockname);
494b85add5fSPhilippe Charnier 		} else
4951d1143ecSEdward Tomasz Napierala 			str = strdup("???");
496b85add5fSPhilippe Charnier 	} else
4971d1143ecSEdward Tomasz Napierala 		str = NULL;
4981d1143ecSEdward Tomasz Napierala 
4991d1143ecSEdward Tomasz Napierala 	return (str);
5004b88c807SRodney W. Grimes }
5014b88c807SRodney W. Grimes 
5021d1143ecSEdward Tomasz Napierala char *
5036aed20feSEd Schouten vsize(KINFO *k, VARENT *ve __unused)
5044b88c807SRodney W. Grimes {
5051d1143ecSEdward Tomasz Napierala 	char *str;
5064b88c807SRodney W. Grimes 
5071d1143ecSEdward Tomasz Napierala 	asprintf(&str, "%lu", (u_long)(k->ki_p->ki_size / 1024));
5081d1143ecSEdward Tomasz Napierala 	return (str);
5094b88c807SRodney W. Grimes }
5104b88c807SRodney W. Grimes 
5111d1143ecSEdward Tomasz Napierala static char *
5126aed20feSEd Schouten printtime(KINFO *k, VARENT *ve __unused, long secs, long psecs)
513a870bf2cSKonstantin Belousov /* psecs is "parts" of a second. first micro, then centi */
5144b88c807SRodney W. Grimes {
515b85add5fSPhilippe Charnier 	static char decimal_point;
5161d1143ecSEdward Tomasz Napierala 	char *str;
5174b88c807SRodney W. Grimes 
518b85add5fSPhilippe Charnier 	if (decimal_point == '\0')
5198073a93cSAndrey A. Chernov 		decimal_point = localeconv()->decimal_point[0];
52016ac318dSGarance A Drosehn 	if (!k->ki_valid) {
5215832a752SBruce Evans 		secs = 0;
5225832a752SBruce Evans 		psecs = 0;
5234b88c807SRodney W. Grimes 	} else {
524a870bf2cSKonstantin Belousov 		/* round and scale to 100's */
525a870bf2cSKonstantin Belousov 		psecs = (psecs + 5000) / 10000;
526a870bf2cSKonstantin Belousov 		secs += psecs / 100;
527a870bf2cSKonstantin Belousov 		psecs = psecs % 100;
528a870bf2cSKonstantin Belousov 	}
5291d1143ecSEdward Tomasz Napierala 	asprintf(&str, "%ld:%02ld%c%02ld",
530a870bf2cSKonstantin Belousov 	    secs / 60, secs % 60, decimal_point, psecs);
5311d1143ecSEdward Tomasz Napierala 	return (str);
532a870bf2cSKonstantin Belousov }
533a870bf2cSKonstantin Belousov 
5341d1143ecSEdward Tomasz Napierala char *
535a870bf2cSKonstantin Belousov cputime(KINFO *k, VARENT *ve)
536a870bf2cSKonstantin Belousov {
537a870bf2cSKonstantin Belousov 	long secs, psecs;
538a870bf2cSKonstantin Belousov 
5394b88c807SRodney W. Grimes 	/*
5404b88c807SRodney W. Grimes 	 * This counts time spent handling interrupts.  We could
5414b88c807SRodney W. Grimes 	 * fix this, but it is not 100% trivial (and interrupt
5424b88c807SRodney W. Grimes 	 * time fractions only work on the sparc anyway).	XXX
5434b88c807SRodney W. Grimes 	 */
5441f7d2501SKirk McKusick 	secs = k->ki_p->ki_runtime / 1000000;
5451f7d2501SKirk McKusick 	psecs = k->ki_p->ki_runtime % 1000000;
5464b88c807SRodney W. Grimes 	if (sumrusage) {
5471f7d2501SKirk McKusick 		secs += k->ki_p->ki_childtime.tv_sec;
5481f7d2501SKirk McKusick 		psecs += k->ki_p->ki_childtime.tv_usec;
5494b88c807SRodney W. Grimes 	}
5501d1143ecSEdward Tomasz Napierala 	return (printtime(k, ve, secs, psecs));
5515832a752SBruce Evans }
552a870bf2cSKonstantin Belousov 
5531d1143ecSEdward Tomasz Napierala char *
5544f47f511SPiotr Pawel Stefaniak cpunum(KINFO *k, VARENT *ve __unused)
5554f47f511SPiotr Pawel Stefaniak {
5564f47f511SPiotr Pawel Stefaniak 	char *cpu;
5574f47f511SPiotr Pawel Stefaniak 
5584f47f511SPiotr Pawel Stefaniak 	if (k->ki_p->ki_stat == SRUN && k->ki_p->ki_oncpu != NOCPU) {
5594f47f511SPiotr Pawel Stefaniak 		asprintf(&cpu, "%d", k->ki_p->ki_oncpu);
5604f47f511SPiotr Pawel Stefaniak 	} else {
5614f47f511SPiotr Pawel Stefaniak 		asprintf(&cpu, "%d", k->ki_p->ki_lastcpu);
5624f47f511SPiotr Pawel Stefaniak 	}
5634f47f511SPiotr Pawel Stefaniak 	return (cpu);
5644f47f511SPiotr Pawel Stefaniak }
5654f47f511SPiotr Pawel Stefaniak 
5664f47f511SPiotr Pawel Stefaniak char *
567a870bf2cSKonstantin Belousov systime(KINFO *k, VARENT *ve)
568a870bf2cSKonstantin Belousov {
569a870bf2cSKonstantin Belousov 	long secs, psecs;
570a870bf2cSKonstantin Belousov 
571a870bf2cSKonstantin Belousov 	secs = k->ki_p->ki_rusage.ru_stime.tv_sec;
572a870bf2cSKonstantin Belousov 	psecs = k->ki_p->ki_rusage.ru_stime.tv_usec;
573a870bf2cSKonstantin Belousov 	if (sumrusage) {
574a870bf2cSKonstantin Belousov 		secs += k->ki_p->ki_childstime.tv_sec;
575a870bf2cSKonstantin Belousov 		psecs += k->ki_p->ki_childstime.tv_usec;
576a870bf2cSKonstantin Belousov 	}
5771d1143ecSEdward Tomasz Napierala 	return (printtime(k, ve, secs, psecs));
578a870bf2cSKonstantin Belousov }
579a870bf2cSKonstantin Belousov 
5801d1143ecSEdward Tomasz Napierala char *
581a870bf2cSKonstantin Belousov usertime(KINFO *k, VARENT *ve)
582a870bf2cSKonstantin Belousov {
583a870bf2cSKonstantin Belousov 	long secs, psecs;
584a870bf2cSKonstantin Belousov 
585a870bf2cSKonstantin Belousov 	secs = k->ki_p->ki_rusage.ru_utime.tv_sec;
586a870bf2cSKonstantin Belousov 	psecs = k->ki_p->ki_rusage.ru_utime.tv_usec;
587a870bf2cSKonstantin Belousov 	if (sumrusage) {
588a870bf2cSKonstantin Belousov 		secs += k->ki_p->ki_childutime.tv_sec;
589a870bf2cSKonstantin Belousov 		psecs += k->ki_p->ki_childutime.tv_usec;
590a870bf2cSKonstantin Belousov 	}
5911d1143ecSEdward Tomasz Napierala 	return (printtime(k, ve, secs, psecs));
5924b88c807SRodney W. Grimes }
5934b88c807SRodney W. Grimes 
5941d1143ecSEdward Tomasz Napierala char *
5956aed20feSEd Schouten elapsed(KINFO *k, VARENT *ve __unused)
59676e1a9feSJuli Mallett {
597b85add5fSPhilippe Charnier 	time_t val;
598b85add5fSPhilippe Charnier 	int days, hours, mins, secs;
5991d1143ecSEdward Tomasz Napierala 	char *str;
60076e1a9feSJuli Mallett 
6011d1143ecSEdward Tomasz Napierala 	if (!k->ki_valid)
6021d1143ecSEdward Tomasz Napierala 		return (NULL);
603b85add5fSPhilippe Charnier 	val = now - k->ki_p->ki_start.tv_sec;
604b85add5fSPhilippe Charnier 	days = val / (24 * 60 * 60);
605b85add5fSPhilippe Charnier 	val %= 24 * 60 * 60;
606b85add5fSPhilippe Charnier 	hours = val / (60 * 60);
607b85add5fSPhilippe Charnier 	val %= 60 * 60;
608b85add5fSPhilippe Charnier 	mins = val / 60;
609b85add5fSPhilippe Charnier 	secs = val % 60;
610b85add5fSPhilippe Charnier 	if (days != 0)
6111d1143ecSEdward Tomasz Napierala 		asprintf(&str, "%3d-%02d:%02d:%02d", days, hours, mins, secs);
612b85add5fSPhilippe Charnier 	else if (hours != 0)
6131d1143ecSEdward Tomasz Napierala 		asprintf(&str, "%02d:%02d:%02d", hours, mins, secs);
614b85add5fSPhilippe Charnier 	else
6151d1143ecSEdward Tomasz Napierala 		asprintf(&str, "%02d:%02d", mins, secs);
6161d1143ecSEdward Tomasz Napierala 
6171d1143ecSEdward Tomasz Napierala 	return (str);
61876e1a9feSJuli Mallett }
61976e1a9feSJuli Mallett 
6201d1143ecSEdward Tomasz Napierala char *
6216aed20feSEd Schouten elapseds(KINFO *k, VARENT *ve __unused)
62241ded75dSJuli Mallett {
62341ded75dSJuli Mallett 	time_t val;
6241d1143ecSEdward Tomasz Napierala 	char *str;
62541ded75dSJuli Mallett 
6261d1143ecSEdward Tomasz Napierala 	if (!k->ki_valid)
6271d1143ecSEdward Tomasz Napierala 		return (NULL);
62841ded75dSJuli Mallett 	val = now - k->ki_p->ki_start.tv_sec;
6291d1143ecSEdward Tomasz Napierala 	asprintf(&str, "%jd", (intmax_t)val);
6301d1143ecSEdward Tomasz Napierala 	return (str);
63141ded75dSJuli Mallett }
63241ded75dSJuli Mallett 
6334b88c807SRodney W. Grimes double
634871e8d8cSMark Murray getpcpu(const KINFO *k)
6354b88c807SRodney W. Grimes {
6364b88c807SRodney W. Grimes 	static int failure;
6374b88c807SRodney W. Grimes 
6384b88c807SRodney W. Grimes 	if (!nlistread)
6394b88c807SRodney W. Grimes 		failure = donlist();
6404b88c807SRodney W. Grimes 	if (failure)
6414b88c807SRodney W. Grimes 		return (0.0);
6424b88c807SRodney W. Grimes 
6434b88c807SRodney W. Grimes #define	fxtofl(fixpt)	((double)(fixpt) / fscale)
6444b88c807SRodney W. Grimes 
6454b88c807SRodney W. Grimes 	/* XXX - I don't like this */
646b61ce5b0SJeff Roberson 	if (k->ki_p->ki_swtime == 0 || (k->ki_p->ki_flag & P_INMEM) == 0)
6474b88c807SRodney W. Grimes 		return (0.0);
6484b88c807SRodney W. Grimes 	if (rawcpu)
6491f7d2501SKirk McKusick 		return (100.0 * fxtofl(k->ki_p->ki_pctcpu));
6501f7d2501SKirk McKusick 	return (100.0 * fxtofl(k->ki_p->ki_pctcpu) /
6511f7d2501SKirk McKusick 		(1.0 - exp(k->ki_p->ki_swtime * log(fxtofl(ccpu)))));
6524b88c807SRodney W. Grimes }
6534b88c807SRodney W. Grimes 
6541d1143ecSEdward Tomasz Napierala char *
6556aed20feSEd Schouten pcpu(KINFO *k, VARENT *ve __unused)
6564b88c807SRodney W. Grimes {
6571d1143ecSEdward Tomasz Napierala 	char *str;
6584b88c807SRodney W. Grimes 
6591d1143ecSEdward Tomasz Napierala 	asprintf(&str, "%.1f", getpcpu(k));
6601d1143ecSEdward Tomasz Napierala 	return (str);
6614b88c807SRodney W. Grimes }
6624b88c807SRodney W. Grimes 
663871e8d8cSMark Murray static double
66446251ddeSWarner Losh getpmem(KINFO *k)
6654b88c807SRodney W. Grimes {
6664b88c807SRodney W. Grimes 	static int failure;
6674b88c807SRodney W. Grimes 	double fracmem;
6684b88c807SRodney W. Grimes 
6694b88c807SRodney W. Grimes 	if (!nlistread)
6704b88c807SRodney W. Grimes 		failure = donlist();
6714b88c807SRodney W. Grimes 	if (failure)
6724b88c807SRodney W. Grimes 		return (0.0);
6734b88c807SRodney W. Grimes 
674b61ce5b0SJeff Roberson 	if ((k->ki_p->ki_flag & P_INMEM) == 0)
6754b88c807SRodney W. Grimes 		return (0.0);
6764b88c807SRodney W. Grimes 	/* XXX want pmap ptpages, segtab, etc. (per architecture) */
6774b88c807SRodney W. Grimes 	/* XXX don't have info about shared */
678c6a5ff71SEitan Adler 	fracmem = ((double)k->ki_p->ki_rssize) / mempages;
6794b88c807SRodney W. Grimes 	return (100.0 * fracmem);
6804b88c807SRodney W. Grimes }
6814b88c807SRodney W. Grimes 
6821d1143ecSEdward Tomasz Napierala char *
6836aed20feSEd Schouten pmem(KINFO *k, VARENT *ve __unused)
6844b88c807SRodney W. Grimes {
6851d1143ecSEdward Tomasz Napierala 	char *str;
6864b88c807SRodney W. Grimes 
6871d1143ecSEdward Tomasz Napierala 	asprintf(&str, "%.1f", getpmem(k));
6881d1143ecSEdward Tomasz Napierala 	return (str);
6894b88c807SRodney W. Grimes }
6904b88c807SRodney W. Grimes 
6911d1143ecSEdward Tomasz Napierala char *
6926aed20feSEd Schouten pagein(KINFO *k, VARENT *ve __unused)
6934b88c807SRodney W. Grimes {
6941d1143ecSEdward Tomasz Napierala 	char *str;
6954b88c807SRodney W. Grimes 
6961d1143ecSEdward Tomasz Napierala 	asprintf(&str, "%ld", k->ki_valid ? k->ki_p->ki_rusage.ru_majflt : 0);
6971d1143ecSEdward Tomasz Napierala 	return (str);
6984b88c807SRodney W. Grimes }
6994b88c807SRodney W. Grimes 
700871e8d8cSMark Murray /* ARGSUSED */
7011d1143ecSEdward Tomasz Napierala char *
7026aed20feSEd Schouten maxrss(KINFO *k __unused, VARENT *ve __unused)
7034b88c807SRodney W. Grimes {
7044b88c807SRodney W. Grimes 
705940cca66SPeter Wemm 	/* XXX not yet */
7061d1143ecSEdward Tomasz Napierala 	return (NULL);
7074b88c807SRodney W. Grimes }
7084b88c807SRodney W. Grimes 
7091d1143ecSEdward Tomasz Napierala char *
7106aed20feSEd Schouten priorityr(KINFO *k, VARENT *ve __unused)
711ad863cacSSteve Price {
712871e8d8cSMark Murray 	struct priority *lpri;
7131d1143ecSEdward Tomasz Napierala 	char *str;
7144c85452bSJake Burkholder 	unsigned class, level;
715ad863cacSSteve Price 
7163998d222SGarance A Drosehn 	lpri = &k->ki_p->ki_pri;
717871e8d8cSMark Murray 	class = lpri->pri_class;
718871e8d8cSMark Murray 	level = lpri->pri_level;
7194c85452bSJake Burkholder 	switch (class) {
72050301bb0SLorenzo Salvadore 	case RTP_PRIO_REALTIME:
72150301bb0SLorenzo Salvadore 	/* alias for PRI_REALTIME */
72250301bb0SLorenzo Salvadore 		asprintf(&str, "real:%u", level - PRI_MIN_REALTIME);
72370548f64SGarance A Drosehn 		break;
72450301bb0SLorenzo Salvadore 	case RTP_PRIO_NORMAL:
72550301bb0SLorenzo Salvadore 	/* alias for PRI_TIMESHARE */
7264a022f0eSKirk McKusick 		if (level >= PRI_MIN_TIMESHARE)
72750301bb0SLorenzo Salvadore 			asprintf(&str, "normal:%u", level - PRI_MIN_TIMESHARE);
7284a022f0eSKirk McKusick 		else
7294a022f0eSKirk McKusick 			asprintf(&str, "kernel:%u", level - PRI_MIN_KERN);
730ad863cacSSteve Price 		break;
73150301bb0SLorenzo Salvadore 	case RTP_PRIO_IDLE:
73250301bb0SLorenzo Salvadore 	/* alias for PRI_IDLE */
73350301bb0SLorenzo Salvadore 		asprintf(&str, "idle:%u", level - PRI_MIN_IDLE);
734ad863cacSSteve Price 		break;
7354a022f0eSKirk McKusick 	case RTP_PRIO_ITHD:
7364a022f0eSKirk McKusick 	/* alias for PRI_ITHD */
7374a022f0eSKirk McKusick 		asprintf(&str, "intr:%u", level - PRI_MIN_ITHD);
7384a022f0eSKirk McKusick 		break;
739ad863cacSSteve Price 	default:
7401d1143ecSEdward Tomasz Napierala 		asprintf(&str, "%u:%u", class, level);
741ad863cacSSteve Price 		break;
742ad863cacSSteve Price 	}
7431d1143ecSEdward Tomasz Napierala 	return (str);
744ad863cacSSteve Price }
745ad863cacSSteve Price 
7464b88c807SRodney W. Grimes /*
7474b88c807SRodney W. Grimes  * Generic output routines.  Print fields from various prototype
7484b88c807SRodney W. Grimes  * structures.
7494b88c807SRodney W. Grimes  */
7501d1143ecSEdward Tomasz Napierala static char *
751ffe25988SJuli Mallett printval(void *bp, VAR *v)
7524b88c807SRodney W. Grimes {
7534b88c807SRodney W. Grimes 	static char ofmt[32] = "%";
754fdbec398SJuli Mallett 	const char *fcp;
7551d1143ecSEdward Tomasz Napierala 	char *cp, *str;
7564b88c807SRodney W. Grimes 
7574b88c807SRodney W. Grimes 	cp = ofmt + 1;
7584b88c807SRodney W. Grimes 	fcp = v->fmt;
7590fd510b7SJoerg Wunsch 	while ((*cp++ = *fcp++));
7604b88c807SRodney W. Grimes 
761e2c9ac69STim J. Robbins #define	CHKINF127(n)	(((n) > 127) && (v->flag & INF127) ? 127 : (n))
762e2c9ac69STim J. Robbins 
7634b88c807SRodney W. Grimes 	switch (v->type) {
7644b88c807SRodney W. Grimes 	case CHAR:
7651d1143ecSEdward Tomasz Napierala 		(void)asprintf(&str, ofmt, *(char *)bp);
7664b88c807SRodney W. Grimes 		break;
7674b88c807SRodney W. Grimes 	case UCHAR:
7681d1143ecSEdward Tomasz Napierala 		(void)asprintf(&str, ofmt, *(u_char *)bp);
7694b88c807SRodney W. Grimes 		break;
7704b88c807SRodney W. Grimes 	case SHORT:
7711d1143ecSEdward Tomasz Napierala 		(void)asprintf(&str, ofmt, *(short *)bp);
7724b88c807SRodney W. Grimes 		break;
7734b88c807SRodney W. Grimes 	case USHORT:
7741d1143ecSEdward Tomasz Napierala 		(void)asprintf(&str, ofmt, *(u_short *)bp);
7754b88c807SRodney W. Grimes 		break;
7763929d518SDoug Rabson 	case INT:
7771d1143ecSEdward Tomasz Napierala 		(void)asprintf(&str, ofmt, *(int *)bp);
7783929d518SDoug Rabson 		break;
7793929d518SDoug Rabson 	case UINT:
7801d1143ecSEdward Tomasz Napierala 		(void)asprintf(&str, ofmt, CHKINF127(*(u_int *)bp));
7813929d518SDoug Rabson 		break;
7824b88c807SRodney W. Grimes 	case LONG:
7831d1143ecSEdward Tomasz Napierala 		(void)asprintf(&str, ofmt, *(long *)bp);
7844b88c807SRodney W. Grimes 		break;
7854b88c807SRodney W. Grimes 	case ULONG:
7861d1143ecSEdward Tomasz Napierala 		(void)asprintf(&str, ofmt, *(u_long *)bp);
7874b88c807SRodney W. Grimes 		break;
7884b88c807SRodney W. Grimes 	case KPTR:
7891d1143ecSEdward Tomasz Napierala 		(void)asprintf(&str, ofmt, *(u_long *)bp);
7904b88c807SRodney W. Grimes 		break;
791362d62baSJuli Mallett 	case PGTOK:
7921d1143ecSEdward Tomasz Napierala 		(void)asprintf(&str, ofmt, ps_pgtok(*(u_long *)bp));
793760bbf7dSJuli Mallett 		break;
7944b88c807SRodney W. Grimes 	}
7951d1143ecSEdward Tomasz Napierala 
7961d1143ecSEdward Tomasz Napierala 	return (str);
7974b88c807SRodney W. Grimes }
7984b88c807SRodney W. Grimes 
7991d1143ecSEdward Tomasz Napierala char *
80046251ddeSWarner Losh kvar(KINFO *k, VARENT *ve)
8014b88c807SRodney W. Grimes {
8024b88c807SRodney W. Grimes 	VAR *v;
8034b88c807SRodney W. Grimes 
8044b88c807SRodney W. Grimes 	v = ve->var;
8051d1143ecSEdward Tomasz Napierala 	return (printval((char *)((char *)k->ki_p + v->off), v));
8064b88c807SRodney W. Grimes }
8074b88c807SRodney W. Grimes 
8081d1143ecSEdward Tomasz Napierala char *
80946251ddeSWarner Losh rvar(KINFO *k, VARENT *ve)
8104b88c807SRodney W. Grimes {
8114b88c807SRodney W. Grimes 	VAR *v;
8124b88c807SRodney W. Grimes 
8134b88c807SRodney W. Grimes 	v = ve->var;
8141d1143ecSEdward Tomasz Napierala 	if (!k->ki_valid)
8151d1143ecSEdward Tomasz Napierala 		return (NULL);
8161d1143ecSEdward Tomasz Napierala 	return (printval((char *)((char *)(&k->ki_p->ki_rusage) + v->off), v));
8174b88c807SRodney W. Grimes }
8187304f61fSBrian Feldman 
8191d1143ecSEdward Tomasz Napierala char *
8206aed20feSEd Schouten emulname(KINFO *k, VARENT *ve __unused)
82115b87b53SGarance A Drosehn {
82215b87b53SGarance A Drosehn 
8231d1143ecSEdward Tomasz Napierala 	return (strdup(k->ki_p->ki_emul));
82415b87b53SGarance A Drosehn }
82515b87b53SGarance A Drosehn 
8261d1143ecSEdward Tomasz Napierala char *
8276aed20feSEd Schouten label(KINFO *k, VARENT *ve __unused)
8287304f61fSBrian Feldman {
8292af538ebSRobert Watson 	char *string;
830775bba9fSJuli Mallett 	mac_t proclabel;
8312af538ebSRobert Watson 	int error;
8327304f61fSBrian Feldman 
8332af538ebSRobert Watson 	string = NULL;
834775bba9fSJuli Mallett 	if (mac_prepare_process_label(&proclabel) == -1) {
8358beb1a2fSMarcel Moolenaar 		xo_warn("mac_prepare_process_label");
8362af538ebSRobert Watson 		goto out;
8372af538ebSRobert Watson 	}
838775bba9fSJuli Mallett 	error = mac_get_pid(k->ki_p->ki_pid, proclabel);
8392af538ebSRobert Watson 	if (error == 0) {
840775bba9fSJuli Mallett 		if (mac_to_text(proclabel, &string) == -1)
8412af538ebSRobert Watson 			string = NULL;
8422af538ebSRobert Watson 	}
843775bba9fSJuli Mallett 	mac_free(proclabel);
8442af538ebSRobert Watson out:
8451d1143ecSEdward Tomasz Napierala 	return (string);
8462af538ebSRobert Watson }
8472af538ebSRobert Watson 
8481d1143ecSEdward Tomasz Napierala char *
8496aed20feSEd Schouten loginclass(KINFO *k, VARENT *ve __unused)
8507123f4cdSEdward Tomasz Napierala {
8517123f4cdSEdward Tomasz Napierala 
8527123f4cdSEdward Tomasz Napierala 	/*
8537123f4cdSEdward Tomasz Napierala 	 * Don't display login class for system processes;
8547123f4cdSEdward Tomasz Napierala 	 * login classes are used for resource limits,
8557123f4cdSEdward Tomasz Napierala 	 * and limits don't apply to system processes.
8567123f4cdSEdward Tomasz Napierala 	 */
8577123f4cdSEdward Tomasz Napierala 	if (k->ki_p->ki_flag & P_SYSTEM) {
8581d1143ecSEdward Tomasz Napierala 		return (strdup("-"));
8597123f4cdSEdward Tomasz Napierala 	}
860c5985c1fSEdward Tomasz Napierala 	return (strdup(k->ki_p->ki_loginclass));
861f9db2550SEdward Tomasz Napierala }
8622f5a9b76SJohn Baldwin 
8632f5a9b76SJohn Baldwin char *
8642f5a9b76SJohn Baldwin jailname(KINFO *k, VARENT *ve __unused)
8652f5a9b76SJohn Baldwin {
8662f5a9b76SJohn Baldwin 	char *name;
8672f5a9b76SJohn Baldwin 
8682f5a9b76SJohn Baldwin 	if (k->ki_p->ki_jid == 0)
8692f5a9b76SJohn Baldwin 		return (strdup("-"));
8702f5a9b76SJohn Baldwin 	name = jail_getname(k->ki_p->ki_jid);
8712f5a9b76SJohn Baldwin 	if (name == NULL)
8722f5a9b76SJohn Baldwin 		return (strdup("-"));
8732f5a9b76SJohn Baldwin 	return (name);
8742f5a9b76SJohn Baldwin }
875