xref: /freebsd-src/bin/ps/print.c (revision 09290c3a0c82524138973b14f393379edf733753)
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 
324b88c807SRodney W. Grimes #include <sys/param.h>
334b88c807SRodney W. Grimes #include <sys/time.h>
344b88c807SRodney W. Grimes #include <sys/resource.h>
354b88c807SRodney W. Grimes #include <sys/proc.h>
364b88c807SRodney W. Grimes #include <sys/stat.h>
374b88c807SRodney W. Grimes 
382af538ebSRobert Watson #include <sys/mac.h>
398b9b0e39SPoul-Henning Kamp #include <sys/user.h>
404b88c807SRodney W. Grimes #include <sys/sysctl.h>
4150a57dfbSKonstantin Belousov #include <sys/vmmeter.h>
424b88c807SRodney W. Grimes 
43576541a9SWarner Losh #include <grp.h>
442f5a9b76SJohn Baldwin #include <jail.h>
45f59105eeSAndrey A. Chernov #include <langinfo.h>
468073a93cSAndrey A. Chernov #include <locale.h>
474b88c807SRodney W. Grimes #include <math.h>
484b88c807SRodney W. Grimes #include <nlist.h>
49576541a9SWarner Losh #include <pwd.h>
504b88c807SRodney W. Grimes #include <stddef.h>
5141ded75dSJuli Mallett #include <stdint.h>
524b88c807SRodney W. Grimes #include <stdio.h>
534b88c807SRodney W. Grimes #include <stdlib.h>
544b88c807SRodney W. Grimes #include <string.h>
55871e8d8cSMark Murray #include <unistd.h>
564b88c807SRodney W. Grimes #include <vis.h>
578beb1a2fSMarcel Moolenaar #include <libxo/xo.h>
584b88c807SRodney W. Grimes 
594b88c807SRodney W. Grimes #include "ps.h"
604b88c807SRodney W. Grimes 
611d1143ecSEdward Tomasz Napierala #define	COMMAND_WIDTH	16
621d1143ecSEdward Tomasz Napierala #define	ARGUMENTS_WIDTH	16
631d1143ecSEdward Tomasz Napierala 
646327ab9cSPeter Wemm #define	ps_pgtok(a)	(((a) * getpagesize()) / 1024)
65871e8d8cSMark Murray 
664b88c807SRodney W. Grimes void
6746251ddeSWarner Losh printheader(void)
684b88c807SRodney W. Grimes {
694b88c807SRodney W. Grimes 	VAR *v;
704b88c807SRodney W. Grimes 	struct varent *vent;
714b88c807SRodney W. Grimes 
72bdf8ab46SGarance A Drosehn 	STAILQ_FOREACH(vent, &varlist, next_ve)
73bdf8ab46SGarance A Drosehn 		if (*vent->header != '\0')
7401e5f166STim J. Robbins 			break;
75bdf8ab46SGarance A Drosehn 	if (!vent)
7601e5f166STim J. Robbins 		return;
77bdf8ab46SGarance A Drosehn 
78bdf8ab46SGarance A Drosehn 	STAILQ_FOREACH(vent, &varlist, next_ve) {
794b88c807SRodney W. Grimes 		v = vent->var;
804b88c807SRodney W. Grimes 		if (v->flag & LJUST) {
81bdf8ab46SGarance A Drosehn 			if (STAILQ_NEXT(vent, next_ve) == NULL)	/* last one */
82aa8ab146SYuri Pankov 				xo_emit("{T:/%hs}", vent->header);
834b88c807SRodney W. Grimes 			else
84aa8ab146SYuri Pankov 				xo_emit("{T:/%-*hs}", v->width, vent->header);
854b88c807SRodney W. Grimes 		} else
86aa8ab146SYuri Pankov 			xo_emit("{T:/%*hs}", v->width, vent->header);
87bdf8ab46SGarance A Drosehn 		if (STAILQ_NEXT(vent, next_ve) != NULL)
888beb1a2fSMarcel Moolenaar 			xo_emit("{P: }");
894b88c807SRodney W. Grimes 	}
908beb1a2fSMarcel Moolenaar 	xo_emit("\n");
914b88c807SRodney W. Grimes }
924b88c807SRodney W. Grimes 
931d1143ecSEdward Tomasz Napierala char *
9403334017SJuli Mallett arguments(KINFO *k, VARENT *ve)
9503334017SJuli Mallett {
961d1143ecSEdward Tomasz Napierala 	char *vis_args;
9703334017SJuli Mallett 
9803334017SJuli Mallett 	if ((vis_args = malloc(strlen(k->ki_args) * 4 + 1)) == NULL)
998beb1a2fSMarcel Moolenaar 		xo_errx(1, "malloc failed");
10003334017SJuli Mallett 	strvis(vis_args, k->ki_args, VIS_TAB | VIS_NL | VIS_NOSLASH);
1011d1143ecSEdward Tomasz Napierala 
1021d1143ecSEdward Tomasz Napierala 	if (STAILQ_NEXT(ve, next_ve) != NULL && strlen(vis_args) > ARGUMENTS_WIDTH)
1031d1143ecSEdward Tomasz Napierala 		vis_args[ARGUMENTS_WIDTH] = '\0';
1041d1143ecSEdward Tomasz Napierala 
1051d1143ecSEdward Tomasz Napierala 	return (vis_args);
10603334017SJuli Mallett }
10703334017SJuli Mallett 
1081d1143ecSEdward Tomasz Napierala char *
10946251ddeSWarner Losh command(KINFO *k, VARENT *ve)
1104b88c807SRodney W. Grimes {
1111d1143ecSEdward Tomasz Napierala 	char *vis_args, *vis_env, *str;
1124b88c807SRodney W. Grimes 
113db91faacSPeter Wemm 	if (cflag) {
114bdf8ab46SGarance A Drosehn 		/* If it is the last field, then don't pad */
1157ab24ea3SJulian Elischer 		if (STAILQ_NEXT(ve, next_ve) == NULL) {
1163d32d4a7SEric van Gyzen 			asprintf(&str, "%s%s%s%s%s",
1171d1143ecSEdward Tomasz Napierala 			    k->ki_d.prefix ? k->ki_d.prefix : "",
1181d1143ecSEdward Tomasz Napierala 			    k->ki_p->ki_comm,
1191d1143ecSEdward Tomasz Napierala 			    (showthreads && k->ki_p->ki_numthreads > 1) ? "/" : "",
1203d32d4a7SEric van Gyzen 			    (showthreads && k->ki_p->ki_numthreads > 1) ? k->ki_p->ki_tdname : "",
1213d32d4a7SEric van Gyzen 			    (showthreads && k->ki_p->ki_numthreads > 1) ? k->ki_p->ki_moretdname : "");
1227ab24ea3SJulian Elischer 		} else
1231d1143ecSEdward Tomasz Napierala 			str = strdup(k->ki_p->ki_comm);
1241d1143ecSEdward Tomasz Napierala 
1251d1143ecSEdward Tomasz Napierala 		return (str);
126db91faacSPeter Wemm 	}
1274b88c807SRodney W. Grimes 	if ((vis_args = malloc(strlen(k->ki_args) * 4 + 1)) == NULL)
1288beb1a2fSMarcel Moolenaar 		xo_errx(1, "malloc failed");
1294b88c807SRodney W. Grimes 	strvis(vis_args, k->ki_args, VIS_TAB | VIS_NL | VIS_NOSLASH);
1304b88c807SRodney W. Grimes 
131bdf8ab46SGarance A Drosehn 	if (STAILQ_NEXT(ve, next_ve) == NULL) {
1324b88c807SRodney W. Grimes 		/* last field */
133044fce53SBrian Somers 
134044fce53SBrian Somers 		if (k->ki_env) {
135044fce53SBrian Somers 			if ((vis_env = malloc(strlen(k->ki_env) * 4 + 1))
136044fce53SBrian Somers 			    == NULL)
1378beb1a2fSMarcel Moolenaar 				xo_errx(1, "malloc failed");
138044fce53SBrian Somers 			strvis(vis_env, k->ki_env,
139044fce53SBrian Somers 			    VIS_TAB | VIS_NL | VIS_NOSLASH);
140044fce53SBrian Somers 		} else
141044fce53SBrian Somers 			vis_env = NULL;
142044fce53SBrian Somers 
1431d1143ecSEdward Tomasz Napierala 		asprintf(&str, "%s%s%s%s",
1441d1143ecSEdward Tomasz Napierala 		    k->ki_d.prefix ? k->ki_d.prefix : "",
1451d1143ecSEdward Tomasz Napierala 		    vis_env ? vis_env : "",
1461d1143ecSEdward Tomasz Napierala 		    vis_env ? " " : "",
1471d1143ecSEdward Tomasz Napierala 		    vis_args);
1481d1143ecSEdward Tomasz Napierala 
1494b88c807SRodney W. Grimes 		if (vis_env != NULL)
1504b88c807SRodney W. Grimes 			free(vis_env);
151044fce53SBrian Somers 		free(vis_args);
1521d1143ecSEdward Tomasz Napierala 	} else {
1531d1143ecSEdward Tomasz Napierala 		/* ki_d.prefix & ki_env aren't shown for interim fields */
1541d1143ecSEdward Tomasz Napierala 		str = vis_args;
1551d1143ecSEdward Tomasz Napierala 
1561d1143ecSEdward Tomasz Napierala 		if (strlen(str) > COMMAND_WIDTH)
1571d1143ecSEdward Tomasz Napierala 			str[COMMAND_WIDTH] = '\0';
1584b88c807SRodney W. Grimes 	}
1594b88c807SRodney W. Grimes 
1601d1143ecSEdward Tomasz Napierala 	return (str);
1611d1143ecSEdward Tomasz Napierala }
1621d1143ecSEdward Tomasz Napierala 
1631d1143ecSEdward Tomasz Napierala char *
16446251ddeSWarner Losh ucomm(KINFO *k, VARENT *ve)
1654b88c807SRodney W. Grimes {
1661d1143ecSEdward Tomasz Napierala 	char *str;
1674b88c807SRodney W. Grimes 
1687ab24ea3SJulian Elischer 	if (STAILQ_NEXT(ve, next_ve) == NULL) {	/* last field, don't pad */
1693d32d4a7SEric van Gyzen 		asprintf(&str, "%s%s%s%s%s",
1701d1143ecSEdward Tomasz Napierala 		    k->ki_d.prefix ? k->ki_d.prefix : "",
1711d1143ecSEdward Tomasz Napierala 		    k->ki_p->ki_comm,
1721d1143ecSEdward Tomasz Napierala 		    (showthreads && k->ki_p->ki_numthreads > 1) ? "/" : "",
1733d32d4a7SEric van Gyzen 		    (showthreads && k->ki_p->ki_numthreads > 1) ? k->ki_p->ki_tdname : "",
1743d32d4a7SEric van Gyzen 		    (showthreads && k->ki_p->ki_numthreads > 1) ? k->ki_p->ki_moretdname : "");
1754610a811SAttilio Rao 	} else {
1764610a811SAttilio Rao 		if (showthreads && k->ki_p->ki_numthreads > 1)
1773d32d4a7SEric van Gyzen 			asprintf(&str, "%s/%s%s", k->ki_p->ki_comm,
1783d32d4a7SEric van Gyzen 			    k->ki_p->ki_tdname, k->ki_p->ki_moretdname);
1794610a811SAttilio Rao 		else
1801d1143ecSEdward Tomasz Napierala 			str = strdup(k->ki_p->ki_comm);
1814610a811SAttilio Rao 	}
1821d1143ecSEdward Tomasz Napierala 	return (str);
1834b88c807SRodney W. Grimes }
1844b88c807SRodney W. Grimes 
1851d1143ecSEdward Tomasz Napierala char *
1866aed20feSEd Schouten tdnam(KINFO *k, VARENT *ve __unused)
1877ab24ea3SJulian Elischer {
1881d1143ecSEdward Tomasz Napierala 	char *str;
1897ab24ea3SJulian Elischer 
1907ab24ea3SJulian Elischer 	if (showthreads && k->ki_p->ki_numthreads > 1)
1913d32d4a7SEric van Gyzen 		asprintf(&str, "%s%s", k->ki_p->ki_tdname,
1923d32d4a7SEric van Gyzen 		    k->ki_p->ki_moretdname);
1937ab24ea3SJulian Elischer 	else
1941d1143ecSEdward Tomasz Napierala 		str = strdup("      ");
1951d1143ecSEdward Tomasz Napierala 
1961d1143ecSEdward Tomasz Napierala 	return (str);
1977ab24ea3SJulian Elischer }
1987ab24ea3SJulian Elischer 
1991d1143ecSEdward Tomasz Napierala char *
2006aed20feSEd Schouten logname(KINFO *k, VARENT *ve __unused)
2014b88c807SRodney W. Grimes {
2024b88c807SRodney W. Grimes 
2031d1143ecSEdward Tomasz Napierala 	if (*k->ki_p->ki_login == '\0')
2041d1143ecSEdward Tomasz Napierala 		return (NULL);
2051d1143ecSEdward Tomasz Napierala 	return (strdup(k->ki_p->ki_login));
2064b88c807SRodney W. Grimes }
2074b88c807SRodney W. Grimes 
2081d1143ecSEdward Tomasz Napierala char *
2096aed20feSEd Schouten state(KINFO *k, VARENT *ve __unused)
2104b88c807SRodney W. Grimes {
21145ed6753SConrad Meyer 	long flag, tdflags;
2121d1143ecSEdward Tomasz Napierala 	char *cp, *buf;
2131d1143ecSEdward Tomasz Napierala 
2141d1143ecSEdward Tomasz Napierala 	buf = malloc(16);
2151d1143ecSEdward Tomasz Napierala 	if (buf == NULL)
2168beb1a2fSMarcel Moolenaar 		xo_errx(1, "malloc failed");
2174b88c807SRodney W. Grimes 
2181f7d2501SKirk McKusick 	flag = k->ki_p->ki_flag;
219b40ce416SJulian Elischer 	tdflags = k->ki_p->ki_tdflags;	/* XXXKSE */
2204b88c807SRodney W. Grimes 	cp = buf;
2214b88c807SRodney W. Grimes 
2221f7d2501SKirk McKusick 	switch (k->ki_p->ki_stat) {
2234b88c807SRodney W. Grimes 
2244b88c807SRodney W. Grimes 	case SSTOP:
2254b88c807SRodney W. Grimes 		*cp = 'T';
2264b88c807SRodney W. Grimes 		break;
2274b88c807SRodney W. Grimes 
2284b88c807SRodney W. Grimes 	case SSLEEP:
2293fe686f2SElyes HAOUAS 		if (tdflags & TDF_SINTR)	/* interruptible (long) */
2301f7d2501SKirk McKusick 			*cp = k->ki_p->ki_slptime >= MAXSLP ? 'I' : 'S';
2314b88c807SRodney W. Grimes 		else
2324b88c807SRodney W. Grimes 			*cp = 'D';
2334b88c807SRodney W. Grimes 		break;
2344b88c807SRodney W. Grimes 
2354b88c807SRodney W. Grimes 	case SRUN:
2364b88c807SRodney W. Grimes 	case SIDL:
2374b88c807SRodney W. Grimes 		*cp = 'R';
2384b88c807SRodney W. Grimes 		break;
2394b88c807SRodney W. Grimes 
2400384fff8SJason Evans 	case SWAIT:
2410384fff8SJason Evans 		*cp = 'W';
2420384fff8SJason Evans 		break;
2430384fff8SJason Evans 
2440d632649SJohn Baldwin 	case SLOCK:
2450d632649SJohn Baldwin 		*cp = 'L';
2460384fff8SJason Evans 		break;
2470384fff8SJason Evans 
2484b88c807SRodney W. Grimes 	case SZOMB:
2494b88c807SRodney W. Grimes 		*cp = 'Z';
2504b88c807SRodney W. Grimes 		break;
2514b88c807SRodney W. Grimes 
2524b88c807SRodney W. Grimes 	default:
2534b88c807SRodney W. Grimes 		*cp = '?';
2544b88c807SRodney W. Grimes 	}
2554b88c807SRodney W. Grimes 	cp++;
256e4d52dfdSEdward Tomasz Napierala 	if (k->ki_p->ki_nice < NZERO || k->ki_p->ki_pri.pri_class == PRI_REALTIME)
2574b88c807SRodney W. Grimes 		*cp++ = '<';
258e4d52dfdSEdward Tomasz Napierala 	else if (k->ki_p->ki_nice > NZERO || k->ki_p->ki_pri.pri_class == PRI_IDLE)
2594b88c807SRodney W. Grimes 		*cp++ = 'N';
2604b88c807SRodney W. Grimes 	if (flag & P_TRACED)
2614b88c807SRodney W. Grimes 		*cp++ = 'X';
2621f7d2501SKirk McKusick 	if (flag & P_WEXIT && k->ki_p->ki_stat != SZOMB)
2634b88c807SRodney W. Grimes 		*cp++ = 'E';
2644b88c807SRodney W. Grimes 	if (flag & P_PPWAIT)
2654b88c807SRodney W. Grimes 		*cp++ = 'V';
2661f7d2501SKirk McKusick 	if ((flag & P_SYSTEM) || k->ki_p->ki_lock > 0)
2674b88c807SRodney W. Grimes 		*cp++ = 'L';
268*09290c3aSOlivier Certner 	if ((k->ki_p->ki_cr_flags & KI_CRF_CAPABILITY_MODE) != 0)
2696f47d67bSEdward Tomasz Napierala 		*cp++ = 'C';
2701f7d2501SKirk McKusick 	if (k->ki_p->ki_kiflag & KI_SLEADER)
2714b88c807SRodney W. Grimes 		*cp++ = 's';
2721f7d2501SKirk McKusick 	if ((flag & P_CONTROLT) && k->ki_p->ki_pgid == k->ki_p->ki_tpgid)
2734b88c807SRodney W. Grimes 		*cp++ = '+';
27475c13541SPoul-Henning Kamp 	if (flag & P_JAILED)
27575c13541SPoul-Henning Kamp 		*cp++ = 'J';
2764b88c807SRodney W. Grimes 	*cp = '\0';
2771d1143ecSEdward Tomasz Napierala 	return (buf);
2784b88c807SRodney W. Grimes }
2794b88c807SRodney W. Grimes 
280820434b2SGarance A Drosehn #define	scalepri(x)	((x) - PZERO)
281820434b2SGarance A Drosehn 
2821d1143ecSEdward Tomasz Napierala char *
2836aed20feSEd Schouten pri(KINFO *k, VARENT *ve __unused)
2844b88c807SRodney W. Grimes {
2851d1143ecSEdward Tomasz Napierala 	char *str;
2864b88c807SRodney W. Grimes 
2871d1143ecSEdward Tomasz Napierala 	asprintf(&str, "%d", scalepri(k->ki_p->ki_pri.pri_level));
2881d1143ecSEdward Tomasz Napierala 	return (str);
2894b88c807SRodney W. Grimes }
2904b88c807SRodney W. Grimes 
2911d1143ecSEdward Tomasz Napierala char *
2926aed20feSEd Schouten upr(KINFO *k, VARENT *ve __unused)
293820434b2SGarance A Drosehn {
2941d1143ecSEdward Tomasz Napierala 	char *str;
295820434b2SGarance A Drosehn 
2961d1143ecSEdward Tomasz Napierala 	asprintf(&str, "%d", scalepri(k->ki_p->ki_pri.pri_user));
2971d1143ecSEdward Tomasz Napierala 	return (str);
298820434b2SGarance A Drosehn }
299820434b2SGarance A Drosehn #undef scalepri
300820434b2SGarance A Drosehn 
3011d1143ecSEdward Tomasz Napierala char *
3022423585bSAlex Richardson username(KINFO *k, VARENT *ve __unused)
3034b88c807SRodney W. Grimes {
3044b88c807SRodney W. Grimes 
3051d1143ecSEdward Tomasz Napierala 	return (strdup(user_from_uid(k->ki_p->ki_uid, 0)));
3064b88c807SRodney W. Grimes }
3074b88c807SRodney W. Grimes 
3081d1143ecSEdward Tomasz Napierala char *
3096aed20feSEd Schouten egroupname(KINFO *k, VARENT *ve __unused)
3109acd9127SEdward Tomasz Napierala {
3119acd9127SEdward Tomasz Napierala 
3121d1143ecSEdward Tomasz Napierala 	return (strdup(group_from_gid(k->ki_p->ki_groups[0], 0)));
3139acd9127SEdward Tomasz Napierala }
3149acd9127SEdward Tomasz Napierala 
3151d1143ecSEdward Tomasz Napierala char *
3166aed20feSEd Schouten rgroupname(KINFO *k, VARENT *ve __unused)
317e8eef4bbSJuli Mallett {
318e8eef4bbSJuli Mallett 
3191d1143ecSEdward Tomasz Napierala 	return (strdup(group_from_gid(k->ki_p->ki_rgid, 0)));
320e8eef4bbSJuli Mallett }
321e8eef4bbSJuli Mallett 
3221d1143ecSEdward Tomasz Napierala char *
3236aed20feSEd Schouten runame(KINFO *k, VARENT *ve __unused)
3244b88c807SRodney W. Grimes {
3254b88c807SRodney W. Grimes 
3261d1143ecSEdward Tomasz Napierala 	return (strdup(user_from_uid(k->ki_p->ki_ruid, 0)));
3274b88c807SRodney W. Grimes }
3284b88c807SRodney W. Grimes 
3291d1143ecSEdward Tomasz Napierala char *
3306aed20feSEd Schouten tdev(KINFO *k, VARENT *ve __unused)
3314b88c807SRodney W. Grimes {
3324b88c807SRodney W. Grimes 	dev_t dev;
3331d1143ecSEdward Tomasz Napierala 	char *str;
3344b88c807SRodney W. Grimes 
3351f7d2501SKirk McKusick 	dev = k->ki_p->ki_tdev;
3364b88c807SRodney W. Grimes 	if (dev == NODEV)
337aa7a15b6SEdward Tomasz Napierala 		str = strdup("-");
3389f365aa1SEd Schouten 	else
3391d1143ecSEdward Tomasz Napierala 		asprintf(&str, "%#jx", (uintmax_t)dev);
3401d1143ecSEdward Tomasz Napierala 
3411d1143ecSEdward Tomasz Napierala 	return (str);
3424b88c807SRodney W. Grimes }
3434b88c807SRodney W. Grimes 
3441d1143ecSEdward Tomasz Napierala char *
3456aed20feSEd Schouten tname(KINFO *k, VARENT *ve __unused)
3464b88c807SRodney W. Grimes {
3474b88c807SRodney W. Grimes 	dev_t dev;
3481d1143ecSEdward Tomasz Napierala 	char *ttname, *str;
3494b88c807SRodney W. Grimes 
3501f7d2501SKirk McKusick 	dev = k->ki_p->ki_tdev;
3514b88c807SRodney W. Grimes 	if (dev == NODEV || (ttname = devname(dev, S_IFCHR)) == NULL)
352aa7a15b6SEdward Tomasz Napierala 		str = strdup("- ");
3534b88c807SRodney W. Grimes 	else {
354efc18e2cSAndrey A. Chernov 		if (strncmp(ttname, "tty", 3) == 0 ||
355efc18e2cSAndrey A. Chernov 		    strncmp(ttname, "cua", 3) == 0)
3564b88c807SRodney W. Grimes 			ttname += 3;
3577bd5296dSOlivier Houchard 		if (strncmp(ttname, "pts/", 4) == 0)
3587bd5296dSOlivier Houchard 			ttname += 4;
3591d1143ecSEdward Tomasz Napierala 		asprintf(&str, "%s%c", ttname,
3601f7d2501SKirk McKusick 		    k->ki_p->ki_kiflag & KI_CTTY ? ' ' : '-');
3614b88c807SRodney W. Grimes 	}
3621d1143ecSEdward Tomasz Napierala 
3631d1143ecSEdward Tomasz Napierala 	return (str);
3644b88c807SRodney W. Grimes }
3654b88c807SRodney W. Grimes 
3661d1143ecSEdward Tomasz Napierala char *
3676aed20feSEd Schouten longtname(KINFO *k, VARENT *ve __unused)
3684b88c807SRodney W. Grimes {
3694b88c807SRodney W. Grimes 	dev_t dev;
3701d1143ecSEdward Tomasz Napierala 	const char *ttname;
3714b88c807SRodney W. Grimes 
3721f7d2501SKirk McKusick 	dev = k->ki_p->ki_tdev;
3734b88c807SRodney W. Grimes 	if (dev == NODEV || (ttname = devname(dev, S_IFCHR)) == NULL)
374aa7a15b6SEdward Tomasz Napierala 		ttname = "-";
3751d1143ecSEdward Tomasz Napierala 
3761d1143ecSEdward Tomasz Napierala 	return (strdup(ttname));
3774b88c807SRodney W. Grimes }
3784b88c807SRodney W. Grimes 
3791d1143ecSEdward Tomasz Napierala char *
3806aed20feSEd Schouten started(KINFO *k, VARENT *ve __unused)
3814b88c807SRodney W. Grimes {
382f8ec5fe2SBruce Evans 	time_t then;
3834b88c807SRodney W. Grimes 	struct tm *tp;
3841d1143ecSEdward Tomasz Napierala 	size_t buflen = 100;
3851d1143ecSEdward Tomasz Napierala 	char *buf;
3861d1143ecSEdward Tomasz Napierala 
3872aff415aSJilles Tjoelker 	if (!k->ki_valid)
3882aff415aSJilles Tjoelker 		return (NULL);
3892aff415aSJilles Tjoelker 
3901d1143ecSEdward Tomasz Napierala 	buf = malloc(buflen);
3911d1143ecSEdward Tomasz Napierala 	if (buf == NULL)
3928beb1a2fSMarcel Moolenaar 		xo_errx(1, "malloc failed");
3934b88c807SRodney W. Grimes 
3941f7d2501SKirk McKusick 	then = k->ki_p->ki_start.tv_sec;
395f8ec5fe2SBruce Evans 	tp = localtime(&then);
3961f7d2501SKirk McKusick 	if (now - k->ki_p->ki_start.tv_sec < 24 * 3600) {
397c2290ff6SMark Felder 		(void)strftime(buf, buflen, "%H:%M  ", tp);
3981f7d2501SKirk McKusick 	} else if (now - k->ki_p->ki_start.tv_sec < 7 * 86400) {
399c2290ff6SMark Felder 		(void)strftime(buf, buflen, "%a%H  ", tp);
4004b88c807SRodney W. Grimes 	} else
4011d1143ecSEdward Tomasz Napierala 		(void)strftime(buf, buflen, "%e%b%y", tp);
4021d1143ecSEdward Tomasz Napierala 	return (buf);
4034b88c807SRodney W. Grimes }
4044b88c807SRodney W. Grimes 
4051d1143ecSEdward Tomasz Napierala char *
4066aed20feSEd Schouten lstarted(KINFO *k, VARENT *ve __unused)
4074b88c807SRodney W. Grimes {
408f8ec5fe2SBruce Evans 	time_t then;
4091d1143ecSEdward Tomasz Napierala 	char *buf;
4101d1143ecSEdward Tomasz Napierala 	size_t buflen = 100;
4111d1143ecSEdward Tomasz Napierala 
4122aff415aSJilles Tjoelker 	if (!k->ki_valid)
4132aff415aSJilles Tjoelker 		return (NULL);
4142aff415aSJilles Tjoelker 
4151d1143ecSEdward Tomasz Napierala 	buf = malloc(buflen);
4161d1143ecSEdward Tomasz Napierala 	if (buf == NULL)
4178beb1a2fSMarcel Moolenaar 		xo_errx(1, "malloc failed");
4184b88c807SRodney W. Grimes 
4191f7d2501SKirk McKusick 	then = k->ki_p->ki_start.tv_sec;
4201d1143ecSEdward Tomasz Napierala 	(void)strftime(buf, buflen, "%c", localtime(&then));
4211d1143ecSEdward Tomasz Napierala 	return (buf);
4224b88c807SRodney W. Grimes }
4234b88c807SRodney W. Grimes 
4241d1143ecSEdward Tomasz Napierala char *
4256aed20feSEd Schouten lockname(KINFO *k, VARENT *ve __unused)
426fd5f30bfSJohn Baldwin {
4271d1143ecSEdward Tomasz Napierala 	char *str;
428fd5f30bfSJohn Baldwin 
4290d632649SJohn Baldwin 	if (k->ki_p->ki_kiflag & KI_LOCKBLOCK) {
4300d632649SJohn Baldwin 		if (k->ki_p->ki_lockname[0] != 0)
4311d1143ecSEdward Tomasz Napierala 			str = strdup(k->ki_p->ki_lockname);
432fd5f30bfSJohn Baldwin 		else
4331d1143ecSEdward Tomasz Napierala 			str = strdup("???");
434fd5f30bfSJohn Baldwin 	} else
4351d1143ecSEdward Tomasz Napierala 		str = NULL;
4361d1143ecSEdward Tomasz Napierala 
4371d1143ecSEdward Tomasz Napierala 	return (str);
438fd5f30bfSJohn Baldwin }
439fd5f30bfSJohn Baldwin 
4401d1143ecSEdward Tomasz Napierala char *
4416aed20feSEd Schouten wchan(KINFO *k, VARENT *ve __unused)
4424b88c807SRodney W. Grimes {
4431d1143ecSEdward Tomasz Napierala 	char *str;
4444b88c807SRodney W. Grimes 
4451f7d2501SKirk McKusick 	if (k->ki_p->ki_wchan) {
4461f7d2501SKirk McKusick 		if (k->ki_p->ki_wmesg[0] != 0)
4471d1143ecSEdward Tomasz Napierala 			str = strdup(k->ki_p->ki_wmesg);
4484b88c807SRodney W. Grimes 		else
4491d1143ecSEdward Tomasz Napierala 			asprintf(&str, "%lx", (long)k->ki_p->ki_wchan);
450b85add5fSPhilippe Charnier 	} else
4511d1143ecSEdward Tomasz Napierala 		str = NULL;
4521d1143ecSEdward Tomasz Napierala 
4531d1143ecSEdward Tomasz Napierala 	return (str);
454d9a5f890SMatthew Dillon }
455d9a5f890SMatthew Dillon 
4561d1143ecSEdward Tomasz Napierala char *
4576aed20feSEd Schouten nwchan(KINFO *k, VARENT *ve __unused)
458de244df7SHartmut Brandt {
4591d1143ecSEdward Tomasz Napierala 	char *str;
460de244df7SHartmut Brandt 
4611d1143ecSEdward Tomasz Napierala 	if (k->ki_p->ki_wchan)
4621d1143ecSEdward Tomasz Napierala 		asprintf(&str, "%0lx", (long)k->ki_p->ki_wchan);
4631d1143ecSEdward Tomasz Napierala 	else
4641d1143ecSEdward Tomasz Napierala 		str = NULL;
4651d1143ecSEdward Tomasz Napierala 
4661d1143ecSEdward Tomasz Napierala 	return (str);
467de244df7SHartmut Brandt }
468de244df7SHartmut Brandt 
4691d1143ecSEdward Tomasz Napierala char *
4706aed20feSEd Schouten mwchan(KINFO *k, VARENT *ve __unused)
471d9a5f890SMatthew Dillon {
4721d1143ecSEdward Tomasz Napierala 	char *str;
473d9a5f890SMatthew Dillon 
474d9a5f890SMatthew Dillon 	if (k->ki_p->ki_wchan) {
475d9a5f890SMatthew Dillon 		if (k->ki_p->ki_wmesg[0] != 0)
4761d1143ecSEdward Tomasz Napierala 			str = strdup(k->ki_p->ki_wmesg);
477d9a5f890SMatthew Dillon 		else
4781d1143ecSEdward Tomasz Napierala                         asprintf(&str, "%lx", (long)k->ki_p->ki_wchan);
4790d632649SJohn Baldwin 	} else if (k->ki_p->ki_kiflag & KI_LOCKBLOCK) {
4800d632649SJohn Baldwin 		if (k->ki_p->ki_lockname[0]) {
4811d1143ecSEdward Tomasz Napierala 			str = strdup(k->ki_p->ki_lockname);
482b85add5fSPhilippe Charnier 		} else
4831d1143ecSEdward Tomasz Napierala 			str = strdup("???");
484b85add5fSPhilippe Charnier 	} else
4851d1143ecSEdward Tomasz Napierala 		str = NULL;
4861d1143ecSEdward Tomasz Napierala 
4871d1143ecSEdward Tomasz Napierala 	return (str);
4884b88c807SRodney W. Grimes }
4894b88c807SRodney W. Grimes 
4901d1143ecSEdward Tomasz Napierala char *
4916aed20feSEd Schouten vsize(KINFO *k, VARENT *ve __unused)
4924b88c807SRodney W. Grimes {
4931d1143ecSEdward Tomasz Napierala 	char *str;
4944b88c807SRodney W. Grimes 
4951d1143ecSEdward Tomasz Napierala 	asprintf(&str, "%lu", (u_long)(k->ki_p->ki_size / 1024));
4961d1143ecSEdward Tomasz Napierala 	return (str);
4974b88c807SRodney W. Grimes }
4984b88c807SRodney W. Grimes 
4991d1143ecSEdward Tomasz Napierala static char *
5006aed20feSEd Schouten printtime(KINFO *k, VARENT *ve __unused, long secs, long psecs)
501a870bf2cSKonstantin Belousov /* psecs is "parts" of a second. first micro, then centi */
5024b88c807SRodney W. Grimes {
503b85add5fSPhilippe Charnier 	static char decimal_point;
5041d1143ecSEdward Tomasz Napierala 	char *str;
5054b88c807SRodney W. Grimes 
506b85add5fSPhilippe Charnier 	if (decimal_point == '\0')
5078073a93cSAndrey A. Chernov 		decimal_point = localeconv()->decimal_point[0];
50816ac318dSGarance A Drosehn 	if (!k->ki_valid) {
5095832a752SBruce Evans 		secs = 0;
5105832a752SBruce Evans 		psecs = 0;
5114b88c807SRodney W. Grimes 	} else {
512a870bf2cSKonstantin Belousov 		/* round and scale to 100's */
513a870bf2cSKonstantin Belousov 		psecs = (psecs + 5000) / 10000;
514a870bf2cSKonstantin Belousov 		secs += psecs / 100;
515a870bf2cSKonstantin Belousov 		psecs = psecs % 100;
516a870bf2cSKonstantin Belousov 	}
5171d1143ecSEdward Tomasz Napierala 	asprintf(&str, "%ld:%02ld%c%02ld",
518a870bf2cSKonstantin Belousov 	    secs / 60, secs % 60, decimal_point, psecs);
5191d1143ecSEdward Tomasz Napierala 	return (str);
520a870bf2cSKonstantin Belousov }
521a870bf2cSKonstantin Belousov 
5221d1143ecSEdward Tomasz Napierala char *
523a870bf2cSKonstantin Belousov cputime(KINFO *k, VARENT *ve)
524a870bf2cSKonstantin Belousov {
525a870bf2cSKonstantin Belousov 	long secs, psecs;
526a870bf2cSKonstantin Belousov 
5274b88c807SRodney W. Grimes 	/*
5284b88c807SRodney W. Grimes 	 * This counts time spent handling interrupts.  We could
5294b88c807SRodney W. Grimes 	 * fix this, but it is not 100% trivial (and interrupt
5304b88c807SRodney W. Grimes 	 * time fractions only work on the sparc anyway).	XXX
5314b88c807SRodney W. Grimes 	 */
5321f7d2501SKirk McKusick 	secs = k->ki_p->ki_runtime / 1000000;
5331f7d2501SKirk McKusick 	psecs = k->ki_p->ki_runtime % 1000000;
5344b88c807SRodney W. Grimes 	if (sumrusage) {
5351f7d2501SKirk McKusick 		secs += k->ki_p->ki_childtime.tv_sec;
5361f7d2501SKirk McKusick 		psecs += k->ki_p->ki_childtime.tv_usec;
5374b88c807SRodney W. Grimes 	}
5381d1143ecSEdward Tomasz Napierala 	return (printtime(k, ve, secs, psecs));
5395832a752SBruce Evans }
540a870bf2cSKonstantin Belousov 
5411d1143ecSEdward Tomasz Napierala char *
5424f47f511SPiotr Pawel Stefaniak cpunum(KINFO *k, VARENT *ve __unused)
5434f47f511SPiotr Pawel Stefaniak {
5444f47f511SPiotr Pawel Stefaniak 	char *cpu;
5454f47f511SPiotr Pawel Stefaniak 
5464f47f511SPiotr Pawel Stefaniak 	if (k->ki_p->ki_stat == SRUN && k->ki_p->ki_oncpu != NOCPU) {
5474f47f511SPiotr Pawel Stefaniak 		asprintf(&cpu, "%d", k->ki_p->ki_oncpu);
5484f47f511SPiotr Pawel Stefaniak 	} else {
5494f47f511SPiotr Pawel Stefaniak 		asprintf(&cpu, "%d", k->ki_p->ki_lastcpu);
5504f47f511SPiotr Pawel Stefaniak 	}
5514f47f511SPiotr Pawel Stefaniak 	return (cpu);
5524f47f511SPiotr Pawel Stefaniak }
5534f47f511SPiotr Pawel Stefaniak 
5544f47f511SPiotr Pawel Stefaniak char *
555a870bf2cSKonstantin Belousov systime(KINFO *k, VARENT *ve)
556a870bf2cSKonstantin Belousov {
557a870bf2cSKonstantin Belousov 	long secs, psecs;
558a870bf2cSKonstantin Belousov 
559a870bf2cSKonstantin Belousov 	secs = k->ki_p->ki_rusage.ru_stime.tv_sec;
560a870bf2cSKonstantin Belousov 	psecs = k->ki_p->ki_rusage.ru_stime.tv_usec;
561a870bf2cSKonstantin Belousov 	if (sumrusage) {
562a870bf2cSKonstantin Belousov 		secs += k->ki_p->ki_childstime.tv_sec;
563a870bf2cSKonstantin Belousov 		psecs += k->ki_p->ki_childstime.tv_usec;
564a870bf2cSKonstantin Belousov 	}
5651d1143ecSEdward Tomasz Napierala 	return (printtime(k, ve, secs, psecs));
566a870bf2cSKonstantin Belousov }
567a870bf2cSKonstantin Belousov 
5681d1143ecSEdward Tomasz Napierala char *
569a870bf2cSKonstantin Belousov usertime(KINFO *k, VARENT *ve)
570a870bf2cSKonstantin Belousov {
571a870bf2cSKonstantin Belousov 	long secs, psecs;
572a870bf2cSKonstantin Belousov 
573a870bf2cSKonstantin Belousov 	secs = k->ki_p->ki_rusage.ru_utime.tv_sec;
574a870bf2cSKonstantin Belousov 	psecs = k->ki_p->ki_rusage.ru_utime.tv_usec;
575a870bf2cSKonstantin Belousov 	if (sumrusage) {
576a870bf2cSKonstantin Belousov 		secs += k->ki_p->ki_childutime.tv_sec;
577a870bf2cSKonstantin Belousov 		psecs += k->ki_p->ki_childutime.tv_usec;
578a870bf2cSKonstantin Belousov 	}
5791d1143ecSEdward Tomasz Napierala 	return (printtime(k, ve, secs, psecs));
5804b88c807SRodney W. Grimes }
5814b88c807SRodney W. Grimes 
5821d1143ecSEdward Tomasz Napierala char *
5836aed20feSEd Schouten elapsed(KINFO *k, VARENT *ve __unused)
58476e1a9feSJuli Mallett {
585b85add5fSPhilippe Charnier 	time_t val;
586b85add5fSPhilippe Charnier 	int days, hours, mins, secs;
5871d1143ecSEdward Tomasz Napierala 	char *str;
58876e1a9feSJuli Mallett 
5891d1143ecSEdward Tomasz Napierala 	if (!k->ki_valid)
5901d1143ecSEdward Tomasz Napierala 		return (NULL);
591b85add5fSPhilippe Charnier 	val = now - k->ki_p->ki_start.tv_sec;
592b85add5fSPhilippe Charnier 	days = val / (24 * 60 * 60);
593b85add5fSPhilippe Charnier 	val %= 24 * 60 * 60;
594b85add5fSPhilippe Charnier 	hours = val / (60 * 60);
595b85add5fSPhilippe Charnier 	val %= 60 * 60;
596b85add5fSPhilippe Charnier 	mins = val / 60;
597b85add5fSPhilippe Charnier 	secs = val % 60;
598b85add5fSPhilippe Charnier 	if (days != 0)
5991d1143ecSEdward Tomasz Napierala 		asprintf(&str, "%3d-%02d:%02d:%02d", days, hours, mins, secs);
600b85add5fSPhilippe Charnier 	else if (hours != 0)
6011d1143ecSEdward Tomasz Napierala 		asprintf(&str, "%02d:%02d:%02d", hours, mins, secs);
602b85add5fSPhilippe Charnier 	else
6031d1143ecSEdward Tomasz Napierala 		asprintf(&str, "%02d:%02d", mins, secs);
6041d1143ecSEdward Tomasz Napierala 
6051d1143ecSEdward Tomasz Napierala 	return (str);
60676e1a9feSJuli Mallett }
60776e1a9feSJuli Mallett 
6081d1143ecSEdward Tomasz Napierala char *
6096aed20feSEd Schouten elapseds(KINFO *k, VARENT *ve __unused)
61041ded75dSJuli Mallett {
61141ded75dSJuli Mallett 	time_t val;
6121d1143ecSEdward Tomasz Napierala 	char *str;
61341ded75dSJuli Mallett 
6141d1143ecSEdward Tomasz Napierala 	if (!k->ki_valid)
6151d1143ecSEdward Tomasz Napierala 		return (NULL);
61641ded75dSJuli Mallett 	val = now - k->ki_p->ki_start.tv_sec;
6171d1143ecSEdward Tomasz Napierala 	asprintf(&str, "%jd", (intmax_t)val);
6181d1143ecSEdward Tomasz Napierala 	return (str);
61941ded75dSJuli Mallett }
62041ded75dSJuli Mallett 
6214b88c807SRodney W. Grimes double
622871e8d8cSMark Murray getpcpu(const KINFO *k)
6234b88c807SRodney W. Grimes {
6244b88c807SRodney W. Grimes 	static int failure;
6254b88c807SRodney W. Grimes 
6264b88c807SRodney W. Grimes 	if (!nlistread)
6274b88c807SRodney W. Grimes 		failure = donlist();
6284b88c807SRodney W. Grimes 	if (failure)
6294b88c807SRodney W. Grimes 		return (0.0);
6304b88c807SRodney W. Grimes 
6314b88c807SRodney W. Grimes #define	fxtofl(fixpt)	((double)(fixpt) / fscale)
6324b88c807SRodney W. Grimes 
6334b88c807SRodney W. Grimes 	/* XXX - I don't like this */
63462e6ca0fSKonstantin Belousov 	if (k->ki_p->ki_swtime == 0)
6354b88c807SRodney W. Grimes 		return (0.0);
6364b88c807SRodney W. Grimes 	if (rawcpu)
6371f7d2501SKirk McKusick 		return (100.0 * fxtofl(k->ki_p->ki_pctcpu));
6381f7d2501SKirk McKusick 	return (100.0 * fxtofl(k->ki_p->ki_pctcpu) /
6391f7d2501SKirk McKusick 		(1.0 - exp(k->ki_p->ki_swtime * log(fxtofl(ccpu)))));
6404b88c807SRodney W. Grimes }
6414b88c807SRodney W. Grimes 
6421d1143ecSEdward Tomasz Napierala char *
6436aed20feSEd Schouten pcpu(KINFO *k, VARENT *ve __unused)
6444b88c807SRodney W. Grimes {
6451d1143ecSEdward Tomasz Napierala 	char *str;
6464b88c807SRodney W. Grimes 
6471d1143ecSEdward Tomasz Napierala 	asprintf(&str, "%.1f", getpcpu(k));
6481d1143ecSEdward Tomasz Napierala 	return (str);
6494b88c807SRodney W. Grimes }
6504b88c807SRodney W. Grimes 
651871e8d8cSMark Murray static double
65246251ddeSWarner Losh getpmem(KINFO *k)
6534b88c807SRodney W. Grimes {
6544b88c807SRodney W. Grimes 	static int failure;
6554b88c807SRodney W. Grimes 	double fracmem;
6564b88c807SRodney W. Grimes 
6574b88c807SRodney W. Grimes 	if (!nlistread)
6584b88c807SRodney W. Grimes 		failure = donlist();
6594b88c807SRodney W. Grimes 	if (failure)
6604b88c807SRodney W. Grimes 		return (0.0);
6614b88c807SRodney W. Grimes 
6624b88c807SRodney W. Grimes 	/* XXX want pmap ptpages, segtab, etc. (per architecture) */
6634b88c807SRodney W. Grimes 	/* XXX don't have info about shared */
664c6a5ff71SEitan Adler 	fracmem = ((double)k->ki_p->ki_rssize) / mempages;
6654b88c807SRodney W. Grimes 	return (100.0 * fracmem);
6664b88c807SRodney W. Grimes }
6674b88c807SRodney W. Grimes 
6681d1143ecSEdward Tomasz Napierala char *
6696aed20feSEd Schouten pmem(KINFO *k, VARENT *ve __unused)
6704b88c807SRodney W. Grimes {
6711d1143ecSEdward Tomasz Napierala 	char *str;
6724b88c807SRodney W. Grimes 
6731d1143ecSEdward Tomasz Napierala 	asprintf(&str, "%.1f", getpmem(k));
6741d1143ecSEdward Tomasz Napierala 	return (str);
6754b88c807SRodney W. Grimes }
6764b88c807SRodney W. Grimes 
6771d1143ecSEdward Tomasz Napierala char *
6786aed20feSEd Schouten pagein(KINFO *k, VARENT *ve __unused)
6794b88c807SRodney W. Grimes {
6801d1143ecSEdward Tomasz Napierala 	char *str;
6814b88c807SRodney W. Grimes 
6821d1143ecSEdward Tomasz Napierala 	asprintf(&str, "%ld", k->ki_valid ? k->ki_p->ki_rusage.ru_majflt : 0);
6831d1143ecSEdward Tomasz Napierala 	return (str);
6844b88c807SRodney W. Grimes }
6854b88c807SRodney W. Grimes 
686871e8d8cSMark Murray /* ARGSUSED */
6871d1143ecSEdward Tomasz Napierala char *
6886aed20feSEd Schouten maxrss(KINFO *k __unused, VARENT *ve __unused)
6894b88c807SRodney W. Grimes {
6904b88c807SRodney W. Grimes 
691940cca66SPeter Wemm 	/* XXX not yet */
6921d1143ecSEdward Tomasz Napierala 	return (NULL);
6934b88c807SRodney W. Grimes }
6944b88c807SRodney W. Grimes 
6951d1143ecSEdward Tomasz Napierala char *
6966aed20feSEd Schouten priorityr(KINFO *k, VARENT *ve __unused)
697ad863cacSSteve Price {
698871e8d8cSMark Murray 	struct priority *lpri;
6991d1143ecSEdward Tomasz Napierala 	char *str;
7004c85452bSJake Burkholder 	unsigned class, level;
701ad863cacSSteve Price 
7023998d222SGarance A Drosehn 	lpri = &k->ki_p->ki_pri;
703871e8d8cSMark Murray 	class = lpri->pri_class;
704871e8d8cSMark Murray 	level = lpri->pri_level;
7054c85452bSJake Burkholder 	switch (class) {
70650301bb0SLorenzo Salvadore 	case RTP_PRIO_REALTIME:
70750301bb0SLorenzo Salvadore 	/* alias for PRI_REALTIME */
70850301bb0SLorenzo Salvadore 		asprintf(&str, "real:%u", level - PRI_MIN_REALTIME);
70970548f64SGarance A Drosehn 		break;
71050301bb0SLorenzo Salvadore 	case RTP_PRIO_NORMAL:
71150301bb0SLorenzo Salvadore 	/* alias for PRI_TIMESHARE */
7124a022f0eSKirk McKusick 		if (level >= PRI_MIN_TIMESHARE)
71350301bb0SLorenzo Salvadore 			asprintf(&str, "normal:%u", level - PRI_MIN_TIMESHARE);
7144a022f0eSKirk McKusick 		else
7154a022f0eSKirk McKusick 			asprintf(&str, "kernel:%u", level - PRI_MIN_KERN);
716ad863cacSSteve Price 		break;
71750301bb0SLorenzo Salvadore 	case RTP_PRIO_IDLE:
71850301bb0SLorenzo Salvadore 	/* alias for PRI_IDLE */
71950301bb0SLorenzo Salvadore 		asprintf(&str, "idle:%u", level - PRI_MIN_IDLE);
720ad863cacSSteve Price 		break;
7214a022f0eSKirk McKusick 	case RTP_PRIO_ITHD:
7224a022f0eSKirk McKusick 	/* alias for PRI_ITHD */
7234a022f0eSKirk McKusick 		asprintf(&str, "intr:%u", level - PRI_MIN_ITHD);
7244a022f0eSKirk McKusick 		break;
725ad863cacSSteve Price 	default:
7261d1143ecSEdward Tomasz Napierala 		asprintf(&str, "%u:%u", class, level);
727ad863cacSSteve Price 		break;
728ad863cacSSteve Price 	}
7291d1143ecSEdward Tomasz Napierala 	return (str);
730ad863cacSSteve Price }
731ad863cacSSteve Price 
7324b88c807SRodney W. Grimes /*
7334b88c807SRodney W. Grimes  * Generic output routines.  Print fields from various prototype
7344b88c807SRodney W. Grimes  * structures.
7354b88c807SRodney W. Grimes  */
7361d1143ecSEdward Tomasz Napierala static char *
737ffe25988SJuli Mallett printval(void *bp, VAR *v)
7384b88c807SRodney W. Grimes {
7394b88c807SRodney W. Grimes 	static char ofmt[32] = "%";
740fdbec398SJuli Mallett 	const char *fcp;
7411d1143ecSEdward Tomasz Napierala 	char *cp, *str;
7424b88c807SRodney W. Grimes 
7434b88c807SRodney W. Grimes 	cp = ofmt + 1;
7444b88c807SRodney W. Grimes 	fcp = v->fmt;
7450fd510b7SJoerg Wunsch 	while ((*cp++ = *fcp++));
7464b88c807SRodney W. Grimes 
747e2c9ac69STim J. Robbins #define	CHKINF127(n)	(((n) > 127) && (v->flag & INF127) ? 127 : (n))
748e2c9ac69STim J. Robbins 
7494b88c807SRodney W. Grimes 	switch (v->type) {
7504b88c807SRodney W. Grimes 	case CHAR:
7511d1143ecSEdward Tomasz Napierala 		(void)asprintf(&str, ofmt, *(char *)bp);
7524b88c807SRodney W. Grimes 		break;
7534b88c807SRodney W. Grimes 	case UCHAR:
7541d1143ecSEdward Tomasz Napierala 		(void)asprintf(&str, ofmt, *(u_char *)bp);
7554b88c807SRodney W. Grimes 		break;
7564b88c807SRodney W. Grimes 	case SHORT:
7571d1143ecSEdward Tomasz Napierala 		(void)asprintf(&str, ofmt, *(short *)bp);
7584b88c807SRodney W. Grimes 		break;
7594b88c807SRodney W. Grimes 	case USHORT:
7601d1143ecSEdward Tomasz Napierala 		(void)asprintf(&str, ofmt, *(u_short *)bp);
7614b88c807SRodney W. Grimes 		break;
7623929d518SDoug Rabson 	case INT:
7631d1143ecSEdward Tomasz Napierala 		(void)asprintf(&str, ofmt, *(int *)bp);
7643929d518SDoug Rabson 		break;
7653929d518SDoug Rabson 	case UINT:
7661d1143ecSEdward Tomasz Napierala 		(void)asprintf(&str, ofmt, CHKINF127(*(u_int *)bp));
7673929d518SDoug Rabson 		break;
7684b88c807SRodney W. Grimes 	case LONG:
7691d1143ecSEdward Tomasz Napierala 		(void)asprintf(&str, ofmt, *(long *)bp);
7704b88c807SRodney W. Grimes 		break;
7714b88c807SRodney W. Grimes 	case ULONG:
7721d1143ecSEdward Tomasz Napierala 		(void)asprintf(&str, ofmt, *(u_long *)bp);
7734b88c807SRodney W. Grimes 		break;
7744b88c807SRodney W. Grimes 	case KPTR:
7751d1143ecSEdward Tomasz Napierala 		(void)asprintf(&str, ofmt, *(u_long *)bp);
7764b88c807SRodney W. Grimes 		break;
777362d62baSJuli Mallett 	case PGTOK:
7781d1143ecSEdward Tomasz Napierala 		(void)asprintf(&str, ofmt, ps_pgtok(*(u_long *)bp));
779760bbf7dSJuli Mallett 		break;
7804b88c807SRodney W. Grimes 	}
7811d1143ecSEdward Tomasz Napierala 
7821d1143ecSEdward Tomasz Napierala 	return (str);
7834b88c807SRodney W. Grimes }
7844b88c807SRodney W. Grimes 
7851d1143ecSEdward Tomasz Napierala char *
78646251ddeSWarner Losh kvar(KINFO *k, VARENT *ve)
7874b88c807SRodney W. Grimes {
7884b88c807SRodney W. Grimes 	VAR *v;
7894b88c807SRodney W. Grimes 
7904b88c807SRodney W. Grimes 	v = ve->var;
7911d1143ecSEdward Tomasz Napierala 	return (printval((char *)((char *)k->ki_p + v->off), v));
7924b88c807SRodney W. Grimes }
7934b88c807SRodney W. Grimes 
7941d1143ecSEdward Tomasz Napierala char *
79546251ddeSWarner Losh rvar(KINFO *k, VARENT *ve)
7964b88c807SRodney W. Grimes {
7974b88c807SRodney W. Grimes 	VAR *v;
7984b88c807SRodney W. Grimes 
7994b88c807SRodney W. Grimes 	v = ve->var;
8001d1143ecSEdward Tomasz Napierala 	if (!k->ki_valid)
8011d1143ecSEdward Tomasz Napierala 		return (NULL);
8021d1143ecSEdward Tomasz Napierala 	return (printval((char *)((char *)(&k->ki_p->ki_rusage) + v->off), v));
8034b88c807SRodney W. Grimes }
8047304f61fSBrian Feldman 
8051d1143ecSEdward Tomasz Napierala char *
8066aed20feSEd Schouten emulname(KINFO *k, VARENT *ve __unused)
80715b87b53SGarance A Drosehn {
80815b87b53SGarance A Drosehn 
8091d1143ecSEdward Tomasz Napierala 	return (strdup(k->ki_p->ki_emul));
81015b87b53SGarance A Drosehn }
81115b87b53SGarance A Drosehn 
8121d1143ecSEdward Tomasz Napierala char *
8136aed20feSEd Schouten label(KINFO *k, VARENT *ve __unused)
8147304f61fSBrian Feldman {
8152af538ebSRobert Watson 	char *string;
816775bba9fSJuli Mallett 	mac_t proclabel;
8172af538ebSRobert Watson 	int error;
8187304f61fSBrian Feldman 
8192af538ebSRobert Watson 	string = NULL;
820775bba9fSJuli Mallett 	if (mac_prepare_process_label(&proclabel) == -1) {
8218beb1a2fSMarcel Moolenaar 		xo_warn("mac_prepare_process_label");
8222af538ebSRobert Watson 		goto out;
8232af538ebSRobert Watson 	}
824775bba9fSJuli Mallett 	error = mac_get_pid(k->ki_p->ki_pid, proclabel);
8252af538ebSRobert Watson 	if (error == 0) {
826775bba9fSJuli Mallett 		if (mac_to_text(proclabel, &string) == -1)
8272af538ebSRobert Watson 			string = NULL;
8282af538ebSRobert Watson 	}
829775bba9fSJuli Mallett 	mac_free(proclabel);
8302af538ebSRobert Watson out:
8311d1143ecSEdward Tomasz Napierala 	return (string);
8322af538ebSRobert Watson }
8332af538ebSRobert Watson 
8341d1143ecSEdward Tomasz Napierala char *
8356aed20feSEd Schouten loginclass(KINFO *k, VARENT *ve __unused)
8367123f4cdSEdward Tomasz Napierala {
8377123f4cdSEdward Tomasz Napierala 
8387123f4cdSEdward Tomasz Napierala 	/*
8397123f4cdSEdward Tomasz Napierala 	 * Don't display login class for system processes;
8407123f4cdSEdward Tomasz Napierala 	 * login classes are used for resource limits,
8417123f4cdSEdward Tomasz Napierala 	 * and limits don't apply to system processes.
8427123f4cdSEdward Tomasz Napierala 	 */
8437123f4cdSEdward Tomasz Napierala 	if (k->ki_p->ki_flag & P_SYSTEM) {
8441d1143ecSEdward Tomasz Napierala 		return (strdup("-"));
8457123f4cdSEdward Tomasz Napierala 	}
846c5985c1fSEdward Tomasz Napierala 	return (strdup(k->ki_p->ki_loginclass));
847f9db2550SEdward Tomasz Napierala }
8482f5a9b76SJohn Baldwin 
8492f5a9b76SJohn Baldwin char *
8502f5a9b76SJohn Baldwin jailname(KINFO *k, VARENT *ve __unused)
8512f5a9b76SJohn Baldwin {
8522f5a9b76SJohn Baldwin 	char *name;
8532f5a9b76SJohn Baldwin 
8542f5a9b76SJohn Baldwin 	if (k->ki_p->ki_jid == 0)
8552f5a9b76SJohn Baldwin 		return (strdup("-"));
8562f5a9b76SJohn Baldwin 	name = jail_getname(k->ki_p->ki_jid);
8572f5a9b76SJohn Baldwin 	if (name == NULL)
8582f5a9b76SJohn Baldwin 		return (strdup("-"));
8592f5a9b76SJohn Baldwin 	return (name);
8602f5a9b76SJohn Baldwin }
861