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