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