1dea673e9SRodney W. Grimes /*- 29c5cdfe0SPeter Wemm * Copyright (c) 1980, 1991, 1993, 1994 3dea673e9SRodney W. Grimes * The Regents of the University of California. All rights reserved. 45f9ab4b0SDag-Erling Smørgrav * Copyright (c) 2002 Networks Associates Technologies, Inc. 55f9ab4b0SDag-Erling Smørgrav * All rights reserved. 65f9ab4b0SDag-Erling Smørgrav * 75f9ab4b0SDag-Erling Smørgrav * Portions of this software were developed for the FreeBSD Project by 85f9ab4b0SDag-Erling Smørgrav * ThinkSec AS and NAI Labs, the Security Research Division of Network 95f9ab4b0SDag-Erling Smørgrav * Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035 105f9ab4b0SDag-Erling Smørgrav * ("CBOSS"), as part of the DARPA CHATS research program. 11dea673e9SRodney W. Grimes * 12dea673e9SRodney W. Grimes * Redistribution and use in source and binary forms, with or without 13dea673e9SRodney W. Grimes * modification, are permitted provided that the following conditions 14dea673e9SRodney W. Grimes * are met: 15dea673e9SRodney W. Grimes * 1. Redistributions of source code must retain the above copyright 16dea673e9SRodney W. Grimes * notice, this list of conditions and the following disclaimer. 17dea673e9SRodney W. Grimes * 2. Redistributions in binary form must reproduce the above copyright 18dea673e9SRodney W. Grimes * notice, this list of conditions and the following disclaimer in the 19dea673e9SRodney W. Grimes * documentation and/or other materials provided with the distribution. 20dea673e9SRodney W. Grimes * 3. All advertising materials mentioning features or use of this software 21dea673e9SRodney W. Grimes * must display the following acknowledgement: 22dea673e9SRodney W. Grimes * This product includes software developed by the University of 23dea673e9SRodney W. Grimes * California, Berkeley and its contributors. 24dea673e9SRodney W. Grimes * 4. Neither the name of the University nor the names of its contributors 25dea673e9SRodney W. Grimes * may be used to endorse or promote products derived from this software 26dea673e9SRodney W. Grimes * without specific prior written permission. 27dea673e9SRodney W. Grimes * 28dea673e9SRodney W. Grimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 29dea673e9SRodney W. Grimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 30dea673e9SRodney W. Grimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 31dea673e9SRodney W. Grimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 32dea673e9SRodney W. Grimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 33dea673e9SRodney W. Grimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 34dea673e9SRodney W. Grimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 35dea673e9SRodney W. Grimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 36dea673e9SRodney W. Grimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 37dea673e9SRodney W. Grimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 38dea673e9SRodney W. Grimes * SUCH DAMAGE. 39dea673e9SRodney W. Grimes */ 40dea673e9SRodney W. Grimes 41dea673e9SRodney W. Grimes #ifndef lint 42d9961cfdSPhilippe Charnier static const char copyright[] = 439c5cdfe0SPeter Wemm "@(#) Copyright (c) 1980, 1991, 1993, 1994\n\ 44dea673e9SRodney W. Grimes The Regents of the University of California. All rights reserved.\n"; 45dea673e9SRodney W. Grimes #endif /* not lint */ 46dea673e9SRodney W. Grimes 47dea673e9SRodney W. Grimes #ifndef lint 48d9961cfdSPhilippe Charnier #if 0 499c5cdfe0SPeter Wemm static char sccsid[] = "@(#)pstat.c 8.16 (Berkeley) 5/9/95"; 50d9961cfdSPhilippe Charnier #endif 51d9961cfdSPhilippe Charnier static const char rcsid[] = 5297d92980SPeter Wemm "$FreeBSD$"; 53dea673e9SRodney W. Grimes #endif /* not lint */ 54dea673e9SRodney W. Grimes 55dea673e9SRodney W. Grimes #include <sys/param.h> 56dea673e9SRodney W. Grimes #include <sys/time.h> 57dea673e9SRodney W. Grimes #include <sys/file.h> 58dea673e9SRodney W. Grimes #include <sys/stat.h> 594418dbbdSDag-Erling Smørgrav #include <sys/stdint.h> 60dea673e9SRodney W. Grimes #include <sys/ioctl.h> 6190300419SAndrey A. Chernov #include <sys/ioctl_compat.h> /* XXX NTTYDISC is too well hidden */ 62dea673e9SRodney W. Grimes #include <sys/tty.h> 63dea673e9SRodney W. Grimes #include <sys/conf.h> 64eedc3436SMatthew Dillon #include <sys/blist.h> 65dea673e9SRodney W. Grimes 663aab05cfSPoul-Henning Kamp #include <sys/user.h> 67dea673e9SRodney W. Grimes #include <sys/sysctl.h> 68dea673e9SRodney W. Grimes 69dea673e9SRodney W. Grimes #include <err.h> 705d98ce75SBruce Evans #include <fcntl.h> 71dea673e9SRodney W. Grimes #include <kvm.h> 72dea673e9SRodney W. Grimes #include <limits.h> 73dea673e9SRodney W. Grimes #include <nlist.h> 74dea673e9SRodney W. Grimes #include <stdio.h> 75dea673e9SRodney W. Grimes #include <stdlib.h> 76dea673e9SRodney W. Grimes #include <string.h> 77dea673e9SRodney W. Grimes #include <unistd.h> 78dea673e9SRodney W. Grimes 79182a90e4SDag-Erling Smørgrav enum { 80182a90e4SDag-Erling Smørgrav NL_CONSTTY, 81182a90e4SDag-Erling Smørgrav NL_MAXFILES, 82182a90e4SDag-Erling Smørgrav NL_NFILES, 83182a90e4SDag-Erling Smørgrav NL_TTY_LIST 84182a90e4SDag-Erling Smørgrav }; 85182a90e4SDag-Erling Smørgrav 861dcc9c32SDag-Erling Smørgrav static struct nlist nl[] = { 87182a90e4SDag-Erling Smørgrav { "_constty", 0 }, 88182a90e4SDag-Erling Smørgrav { "_maxfiles", 0 }, 89182a90e4SDag-Erling Smørgrav { "_nfiles", 0 }, 90182a90e4SDag-Erling Smørgrav { "_tty_list", 0 }, 91dea673e9SRodney W. Grimes { "" } 92dea673e9SRodney W. Grimes }; 93dea673e9SRodney W. Grimes 941dcc9c32SDag-Erling Smørgrav static int usenumflag; 951dcc9c32SDag-Erling Smørgrav static int totalflag; 961dcc9c32SDag-Erling Smørgrav static int swapflag; 97d88b2458SDag-Erling Smørgrav static char *nlistf; 98d88b2458SDag-Erling Smørgrav static char *memf; 991dcc9c32SDag-Erling Smørgrav static kvm_t *kd; 100dea673e9SRodney W. Grimes 1011dcc9c32SDag-Erling Smørgrav static char *usagestr; 10259392fe2SPoul-Henning Kamp 103c9624363SDag-Erling Smørgrav static void filemode(void); 104333eaaedSDag-Erling Smørgrav static int getfiles(char **, size_t *); 105c9624363SDag-Erling Smørgrav static void swapmode(void); 106c9624363SDag-Erling Smørgrav static void ttymode(void); 107333eaaedSDag-Erling Smørgrav static void ttyprt(struct xtty *); 108c9624363SDag-Erling Smørgrav static void usage(void); 109dea673e9SRodney W. Grimes 110dea673e9SRodney W. Grimes int 111c9624363SDag-Erling Smørgrav main(int argc, char *argv[]) 112dea673e9SRodney W. Grimes { 113dea673e9SRodney W. Grimes int ch, i, quit, ret; 1140cbfd1a5SDag-Erling Smørgrav int fileflag, ttyflag; 11559392fe2SPoul-Henning Kamp char buf[_POSIX2_LINE_MAX],*opts; 116dea673e9SRodney W. Grimes 1170cbfd1a5SDag-Erling Smørgrav fileflag = swapflag = ttyflag = 0; 11859392fe2SPoul-Henning Kamp 11959392fe2SPoul-Henning Kamp /* We will behave like good old swapinfo if thus invoked */ 12059392fe2SPoul-Henning Kamp opts = strrchr(argv[0], '/'); 12159392fe2SPoul-Henning Kamp if (opts) 12259392fe2SPoul-Henning Kamp opts++; 12359392fe2SPoul-Henning Kamp else 12459392fe2SPoul-Henning Kamp opts = argv[0]; 12559392fe2SPoul-Henning Kamp if (!strcmp(opts, "swapinfo")) { 12659392fe2SPoul-Henning Kamp swapflag = 1; 1272d8e94a4SSujal Patel opts = "kM:N:"; 128d9961cfdSPhilippe Charnier usagestr = "swapinfo [-k] [-M core] [-N system]"; 12959392fe2SPoul-Henning Kamp } else { 1300cbfd1a5SDag-Erling Smørgrav opts = "TM:N:fknst"; 131d88b2458SDag-Erling Smørgrav usagestr = "pstat [-Tfknst] [-M core] [-N system]"; 13259392fe2SPoul-Henning Kamp } 13359392fe2SPoul-Henning Kamp 1346c3f552aSWarner Losh while ((ch = getopt(argc, argv, opts)) != -1) 135dea673e9SRodney W. Grimes switch (ch) { 136dea673e9SRodney W. Grimes case 'f': 137dea673e9SRodney W. Grimes fileflag = 1; 138dea673e9SRodney W. Grimes break; 13959392fe2SPoul-Henning Kamp case 'k': 14059392fe2SPoul-Henning Kamp putenv("BLOCKSIZE=1K"); 14159392fe2SPoul-Henning Kamp break; 142dea673e9SRodney W. Grimes case 'M': 143dea673e9SRodney W. Grimes memf = optarg; 144dea673e9SRodney W. Grimes break; 145dea673e9SRodney W. Grimes case 'N': 146dea673e9SRodney W. Grimes nlistf = optarg; 147dea673e9SRodney W. Grimes break; 148dea673e9SRodney W. Grimes case 'n': 149dea673e9SRodney W. Grimes usenumflag = 1; 150dea673e9SRodney W. Grimes break; 151dea673e9SRodney W. Grimes case 's': 152eedc3436SMatthew Dillon ++swapflag; 153dea673e9SRodney W. Grimes break; 154dea673e9SRodney W. Grimes case 'T': 155dea673e9SRodney W. Grimes totalflag = 1; 156dea673e9SRodney W. Grimes break; 157dea673e9SRodney W. Grimes case 't': 158dea673e9SRodney W. Grimes ttyflag = 1; 159dea673e9SRodney W. Grimes break; 160dea673e9SRodney W. Grimes default: 161d9961cfdSPhilippe Charnier usage(); 162dea673e9SRodney W. Grimes } 163dea673e9SRodney W. Grimes argc -= optind; 164dea673e9SRodney W. Grimes argv += optind; 165dea673e9SRodney W. Grimes 1664418dbbdSDag-Erling Smørgrav if (memf != NULL) { 1674418dbbdSDag-Erling Smørgrav kd = kvm_openfiles(nlistf, memf, NULL, O_RDONLY, buf); 1684418dbbdSDag-Erling Smørgrav if (kd == NULL) 169dea673e9SRodney W. Grimes errx(1, "kvm_openfiles: %s", buf); 170dea673e9SRodney W. Grimes if ((ret = kvm_nlist(kd, nl)) != 0) { 171dea673e9SRodney W. Grimes if (ret == -1) 172dea673e9SRodney W. Grimes errx(1, "kvm_nlist: %s", kvm_geterr(kd)); 1734418dbbdSDag-Erling Smørgrav quit = 0; 174182a90e4SDag-Erling Smørgrav for (i = 0; nl[i].n_name[0] != '\0'; ++i) 175182a90e4SDag-Erling Smørgrav if (nl[i].n_value == 0) { 176dea673e9SRodney W. Grimes quit = 1; 1774418dbbdSDag-Erling Smørgrav warnx("undefined symbol: %s", 1784418dbbdSDag-Erling Smørgrav nl[i].n_name); 179dea673e9SRodney W. Grimes } 180dea673e9SRodney W. Grimes if (quit) 181dea673e9SRodney W. Grimes exit(1); 182dea673e9SRodney W. Grimes } 1834418dbbdSDag-Erling Smørgrav } 1840cbfd1a5SDag-Erling Smørgrav if (!(fileflag | ttyflag | swapflag | totalflag)) 185d9961cfdSPhilippe Charnier usage(); 186dea673e9SRodney W. Grimes if (fileflag || totalflag) 187dea673e9SRodney W. Grimes filemode(); 188dea673e9SRodney W. Grimes if (ttyflag) 189dea673e9SRodney W. Grimes ttymode(); 190dea673e9SRodney W. Grimes if (swapflag || totalflag) 191dea673e9SRodney W. Grimes swapmode(); 192dea673e9SRodney W. Grimes exit (0); 193dea673e9SRodney W. Grimes } 194dea673e9SRodney W. Grimes 195d9961cfdSPhilippe Charnier static void 196c9624363SDag-Erling Smørgrav usage(void) 197d9961cfdSPhilippe Charnier { 198d9961cfdSPhilippe Charnier fprintf(stderr, "usage: %s\n", usagestr); 199d9961cfdSPhilippe Charnier exit (1); 200d9961cfdSPhilippe Charnier } 201d9961cfdSPhilippe Charnier 2021dcc9c32SDag-Erling Smørgrav static const char hdr[] = 203f6f60773SBruce Evans " LINE RAW CAN OUT IHIWT ILOWT OHWT LWT COL STATE SESS PGID DISC\n"; 204dea673e9SRodney W. Grimes 2051dcc9c32SDag-Erling Smørgrav static void 206182a90e4SDag-Erling Smørgrav ttymode_kvm(void) 207182a90e4SDag-Erling Smørgrav { 208182a90e4SDag-Erling Smørgrav SLIST_HEAD(, tty) tl; 209182a90e4SDag-Erling Smørgrav struct tty *tp, tty; 210182a90e4SDag-Erling Smørgrav struct xtty xt; 211182a90e4SDag-Erling Smørgrav 212182a90e4SDag-Erling Smørgrav (void)printf("%s", hdr); 213182a90e4SDag-Erling Smørgrav bzero(&xt, sizeof xt); 214182a90e4SDag-Erling Smørgrav xt.xt_size = sizeof xt; 215182a90e4SDag-Erling Smørgrav if (kvm_read(kd, nl[NL_TTY_LIST].n_value, &tl, sizeof tl) != sizeof tl) 216182a90e4SDag-Erling Smørgrav errx(1, "kvm_read(): %s", kvm_geterr(kd)); 217182a90e4SDag-Erling Smørgrav tp = SLIST_FIRST(&tl); 218182a90e4SDag-Erling Smørgrav while (tp != NULL) { 219182a90e4SDag-Erling Smørgrav if (kvm_read(kd, (u_long)tp, &tty, sizeof tty) != sizeof tty) 220182a90e4SDag-Erling Smørgrav errx(1, "kvm_read(): %s", kvm_geterr(kd)); 221182a90e4SDag-Erling Smørgrav xt.xt_rawcc = tty.t_rawq.c_cc; 222182a90e4SDag-Erling Smørgrav xt.xt_cancc = tty.t_canq.c_cc; 223182a90e4SDag-Erling Smørgrav xt.xt_outcc = tty.t_outq.c_cc; 224182a90e4SDag-Erling Smørgrav #define XT_COPY(field) xt.xt_##field = tty.t_##field 225182a90e4SDag-Erling Smørgrav XT_COPY(line); 226182a90e4SDag-Erling Smørgrav XT_COPY(state); 227182a90e4SDag-Erling Smørgrav XT_COPY(column); 228182a90e4SDag-Erling Smørgrav XT_COPY(ihiwat); 229182a90e4SDag-Erling Smørgrav XT_COPY(ilowat); 230182a90e4SDag-Erling Smørgrav XT_COPY(ohiwat); 231182a90e4SDag-Erling Smørgrav XT_COPY(olowat); 232182a90e4SDag-Erling Smørgrav #undef XT_COPY 233182a90e4SDag-Erling Smørgrav ttyprt(&xt); 234182a90e4SDag-Erling Smørgrav tp = tty.t_list.sle_next; 235182a90e4SDag-Erling Smørgrav } 236182a90e4SDag-Erling Smørgrav } 237182a90e4SDag-Erling Smørgrav 238182a90e4SDag-Erling Smørgrav static void 239182a90e4SDag-Erling Smørgrav ttymode_sysctl(void) 240dea673e9SRodney W. Grimes { 241333eaaedSDag-Erling Smørgrav struct xtty *xt, *end; 242333eaaedSDag-Erling Smørgrav void *xttys; 243333eaaedSDag-Erling Smørgrav size_t len; 244dea673e9SRodney W. Grimes 245c01c5d5cSDima Dorfman (void)printf("%s", hdr); 246333eaaedSDag-Erling Smørgrav if ((xttys = malloc(len = sizeof *xt)) == NULL) 247333eaaedSDag-Erling Smørgrav err(1, "malloc()"); 248333eaaedSDag-Erling Smørgrav while (sysctlbyname("kern.ttys", xttys, &len, 0, 0) == -1) { 249333eaaedSDag-Erling Smørgrav if (errno != ENOMEM) 250333eaaedSDag-Erling Smørgrav err(1, "sysctlbyname()"); 251333eaaedSDag-Erling Smørgrav len *= 2; 252333eaaedSDag-Erling Smørgrav if ((xttys = realloc(xttys, len)) == NULL) 253333eaaedSDag-Erling Smørgrav err(1, "realloc()"); 2541bc52887SPoul-Henning Kamp } 255333eaaedSDag-Erling Smørgrav if (len > 0) { 256333eaaedSDag-Erling Smørgrav end = (struct xtty *)((char *)xttys + len); 257333eaaedSDag-Erling Smørgrav for (xt = xttys; xt < end; xt++) 258333eaaedSDag-Erling Smørgrav ttyprt(xt); 2591bc52887SPoul-Henning Kamp } 260dea673e9SRodney W. Grimes } 261dea673e9SRodney W. Grimes 2621dcc9c32SDag-Erling Smørgrav static void 263182a90e4SDag-Erling Smørgrav ttymode(void) 264dea673e9SRodney W. Grimes { 265dea673e9SRodney W. Grimes 266182a90e4SDag-Erling Smørgrav if (kd != NULL) 267182a90e4SDag-Erling Smørgrav ttymode_kvm(); 268182a90e4SDag-Erling Smørgrav else 269182a90e4SDag-Erling Smørgrav ttymode_sysctl(); 270dea673e9SRodney W. Grimes } 271dea673e9SRodney W. Grimes 2721dcc9c32SDag-Erling Smørgrav static struct { 273dea673e9SRodney W. Grimes int flag; 274dea673e9SRodney W. Grimes char val; 275dea673e9SRodney W. Grimes } ttystates[] = { 27624f769b0SBruce Evans #ifdef TS_WOPEN 277dea673e9SRodney W. Grimes { TS_WOPEN, 'W'}, 27824f769b0SBruce Evans #endif 279dea673e9SRodney W. Grimes { TS_ISOPEN, 'O'}, 280dea673e9SRodney W. Grimes { TS_CARR_ON, 'C'}, 28124f769b0SBruce Evans #ifdef TS_CONNECTED 28224f769b0SBruce Evans { TS_CONNECTED, 'c'}, 28324f769b0SBruce Evans #endif 284dea673e9SRodney W. Grimes { TS_TIMEOUT, 'T'}, 285dea673e9SRodney W. Grimes { TS_FLUSH, 'F'}, 286dea673e9SRodney W. Grimes { TS_BUSY, 'B'}, 28724f769b0SBruce Evans #ifdef TS_ASLEEP 288dea673e9SRodney W. Grimes { TS_ASLEEP, 'A'}, 28924f769b0SBruce Evans #endif 29024f769b0SBruce Evans #ifdef TS_SO_OLOWAT 29124f769b0SBruce Evans { TS_SO_OLOWAT, 'A'}, 29224f769b0SBruce Evans #endif 29324f769b0SBruce Evans #ifdef TS_SO_OCOMPLETE 29424f769b0SBruce Evans { TS_SO_OCOMPLETE, 'a'}, 29524f769b0SBruce Evans #endif 296dea673e9SRodney W. Grimes { TS_XCLUDE, 'X'}, 297dea673e9SRodney W. Grimes { TS_TTSTOP, 'S'}, 29824f769b0SBruce Evans #ifdef TS_CAR_OFLOW 29924f769b0SBruce Evans { TS_CAR_OFLOW, 'm'}, 30024f769b0SBruce Evans #endif 30124f769b0SBruce Evans #ifdef TS_CTS_OFLOW 30224f769b0SBruce Evans { TS_CTS_OFLOW, 'o'}, 30324f769b0SBruce Evans #endif 30424f769b0SBruce Evans #ifdef TS_DSR_OFLOW 30524f769b0SBruce Evans { TS_DSR_OFLOW, 'd'}, 30624f769b0SBruce Evans #endif 307dea673e9SRodney W. Grimes { TS_TBLOCK, 'K'}, 308dea673e9SRodney W. Grimes { TS_ASYNC, 'Y'}, 309dea673e9SRodney W. Grimes { TS_BKSL, 'D'}, 310dea673e9SRodney W. Grimes { TS_ERASE, 'E'}, 311dea673e9SRodney W. Grimes { TS_LNCH, 'L'}, 312dea673e9SRodney W. Grimes { TS_TYPEN, 'P'}, 313dea673e9SRodney W. Grimes { TS_CNTTB, 'N'}, 31424f769b0SBruce Evans #ifdef TS_CAN_BYPASS_L_RINT 315020531ceSAndrey A. Chernov { TS_CAN_BYPASS_L_RINT, 'l'}, 316020531ceSAndrey A. Chernov #endif 31724f769b0SBruce Evans #ifdef TS_SNOOP 31824f769b0SBruce Evans { TS_SNOOP, 's'}, 31924f769b0SBruce Evans #endif 32024f769b0SBruce Evans #ifdef TS_ZOMBIE 32124f769b0SBruce Evans { TS_ZOMBIE, 'Z'}, 32224f769b0SBruce Evans #endif 323dea673e9SRodney W. Grimes { 0, '\0'}, 324dea673e9SRodney W. Grimes }; 325dea673e9SRodney W. Grimes 3261dcc9c32SDag-Erling Smørgrav static void 327333eaaedSDag-Erling Smørgrav ttyprt(struct xtty *xt) 328dea673e9SRodney W. Grimes { 3299c5cdfe0SPeter Wemm int i, j; 330dea673e9SRodney W. Grimes pid_t pgid; 331dea673e9SRodney W. Grimes char *name, state[20]; 332dea673e9SRodney W. Grimes 333333eaaedSDag-Erling Smørgrav if (xt->xt_size != sizeof *xt) 334333eaaedSDag-Erling Smørgrav errx(1, "struct xtty size mismatch"); 335333eaaedSDag-Erling Smørgrav if (usenumflag || xt->xt_dev == 0 || 336333eaaedSDag-Erling Smørgrav (name = devname(xt->xt_dev, S_IFCHR)) == NULL) 337333eaaedSDag-Erling Smørgrav (void)printf(" %2d,%-2d", major(xt->xt_dev), minor(xt->xt_dev)); 338dea673e9SRodney W. Grimes else 339dea673e9SRodney W. Grimes (void)printf("%7s ", name); 340333eaaedSDag-Erling Smørgrav (void)printf("%2ld %3ld ", xt->xt_rawcc, xt->xt_cancc); 341333eaaedSDag-Erling Smørgrav (void)printf("%3ld %5d %5d %4d %3d %7d ", xt->xt_outcc, 342333eaaedSDag-Erling Smørgrav xt->xt_ihiwat, xt->xt_ilowat, xt->xt_ohiwat, xt->xt_olowat, 343333eaaedSDag-Erling Smørgrav xt->xt_column); 344dea673e9SRodney W. Grimes for (i = j = 0; ttystates[i].flag; i++) 345333eaaedSDag-Erling Smørgrav if (xt->xt_state & ttystates[i].flag) 346dea673e9SRodney W. Grimes state[j++] = ttystates[i].val; 347dea673e9SRodney W. Grimes if (j == 0) 348dea673e9SRodney W. Grimes state[j++] = '-'; 349dea673e9SRodney W. Grimes state[j] = '\0'; 350333eaaedSDag-Erling Smørgrav (void)printf("%-6s %8d", state, xt->xt_sid); 351dea673e9SRodney W. Grimes pgid = 0; 352333eaaedSDag-Erling Smørgrav (void)printf("%6d ", xt->xt_pgid); 353333eaaedSDag-Erling Smørgrav switch (xt->xt_line) { 354dea673e9SRodney W. Grimes case TTYDISC: 355dea673e9SRodney W. Grimes (void)printf("term\n"); 356dea673e9SRodney W. Grimes break; 35790300419SAndrey A. Chernov case NTTYDISC: 35890300419SAndrey A. Chernov (void)printf("ntty\n"); 35990300419SAndrey A. Chernov break; 360dea673e9SRodney W. Grimes case SLIPDISC: 361dea673e9SRodney W. Grimes (void)printf("slip\n"); 362dea673e9SRodney W. Grimes break; 36390300419SAndrey A. Chernov case PPPDISC: 36490300419SAndrey A. Chernov (void)printf("ppp\n"); 36590300419SAndrey A. Chernov break; 366dea673e9SRodney W. Grimes default: 367333eaaedSDag-Erling Smørgrav (void)printf("%d\n", xt->xt_line); 368dea673e9SRodney W. Grimes break; 369dea673e9SRodney W. Grimes } 370dea673e9SRodney W. Grimes } 371dea673e9SRodney W. Grimes 3721dcc9c32SDag-Erling Smørgrav static void 373c9624363SDag-Erling Smørgrav filemode(void) 374dea673e9SRodney W. Grimes { 375eeebf53eSDag-Erling Smørgrav struct xfile *fp; 376dea673e9SRodney W. Grimes char *buf, flagbuf[16], *fbp; 3775f9ab4b0SDag-Erling Smørgrav int maxf, openf; 3784418dbbdSDag-Erling Smørgrav size_t len; 379dea673e9SRodney W. Grimes static char *dtypes[] = { "???", "inode", "socket" }; 380eeebf53eSDag-Erling Smørgrav int i; 381dea673e9SRodney W. Grimes 3824418dbbdSDag-Erling Smørgrav if (kd != NULL) { 3835f9ab4b0SDag-Erling Smørgrav if (kvm_read(kd, nl[NL_MAXFILES].n_value, 3845f9ab4b0SDag-Erling Smørgrav &maxf, sizeof maxf) != sizeof maxf || 3855f9ab4b0SDag-Erling Smørgrav kvm_read(kd, nl[NL_NFILES].n_value, 3865f9ab4b0SDag-Erling Smørgrav &openf, sizeof openf) != sizeof openf) 3875f9ab4b0SDag-Erling Smørgrav errx(1, "kvm_read(): %s", kvm_geterr(kd)); 3884418dbbdSDag-Erling Smørgrav } else { 3895f9ab4b0SDag-Erling Smørgrav len = sizeof(int); 3905f9ab4b0SDag-Erling Smørgrav if (sysctlbyname("kern.maxfiles", &maxf, &len, 0, 0) == -1 || 3915f9ab4b0SDag-Erling Smørgrav sysctlbyname("kern.openfiles", &openf, &len, 0, 0) == -1) 3924418dbbdSDag-Erling Smørgrav err(1, "sysctlbyname()"); 3934418dbbdSDag-Erling Smørgrav } 3944418dbbdSDag-Erling Smørgrav 395dea673e9SRodney W. Grimes if (totalflag) { 3965f9ab4b0SDag-Erling Smørgrav (void)printf("%3d/%3d files\n", openf, maxf); 397dea673e9SRodney W. Grimes return; 398dea673e9SRodney W. Grimes } 399dea673e9SRodney W. Grimes if (getfiles(&buf, &len) == -1) 400dea673e9SRodney W. Grimes return; 401eeebf53eSDag-Erling Smørgrav openf = len / sizeof *fp; 4025f9ab4b0SDag-Erling Smørgrav (void)printf("%d/%d open files\n", openf, maxf); 403dea673e9SRodney W. Grimes (void)printf(" LOC TYPE FLG CNT MSG DATA OFFSET\n"); 404eeebf53eSDag-Erling Smørgrav for (fp = (struct xfile *)buf, i = 0; i < openf; ++fp, ++i) { 405eeebf53eSDag-Erling Smørgrav if ((unsigned)fp->xf_type > DTYPE_SOCKET) 406dea673e9SRodney W. Grimes continue; 407eeebf53eSDag-Erling Smørgrav (void)printf("%8jx ", (uintmax_t)(uintptr_t)fp->xf_file); 408eeebf53eSDag-Erling Smørgrav (void)printf("%-8.8s", dtypes[fp->xf_type]); 409dea673e9SRodney W. Grimes fbp = flagbuf; 410eeebf53eSDag-Erling Smørgrav if (fp->xf_flag & FREAD) 411dea673e9SRodney W. Grimes *fbp++ = 'R'; 412eeebf53eSDag-Erling Smørgrav if (fp->xf_flag & FWRITE) 413dea673e9SRodney W. Grimes *fbp++ = 'W'; 414eeebf53eSDag-Erling Smørgrav if (fp->xf_flag & FAPPEND) 415dea673e9SRodney W. Grimes *fbp++ = 'A'; 416eeebf53eSDag-Erling Smørgrav if (fp->xf_flag & FASYNC) 417dea673e9SRodney W. Grimes *fbp++ = 'I'; 418dea673e9SRodney W. Grimes *fbp = '\0'; 419eeebf53eSDag-Erling Smørgrav (void)printf("%6s %3d", flagbuf, fp->xf_count); 420eeebf53eSDag-Erling Smørgrav (void)printf(" %3d", fp->xf_msgcount); 421eeebf53eSDag-Erling Smørgrav (void)printf(" %8lx", (u_long)(void *)fp->xf_data); 422eeebf53eSDag-Erling Smørgrav (void)printf(" %jx\n", (uintmax_t)fp->xf_offset); 423dea673e9SRodney W. Grimes } 424dea673e9SRodney W. Grimes free(buf); 425dea673e9SRodney W. Grimes } 426dea673e9SRodney W. Grimes 4271dcc9c32SDag-Erling Smørgrav static int 428333eaaedSDag-Erling Smørgrav getfiles(char **abuf, size_t *alen) 429dea673e9SRodney W. Grimes { 430dea673e9SRodney W. Grimes size_t len; 431dea673e9SRodney W. Grimes int mib[2]; 432dea673e9SRodney W. Grimes char *buf; 433dea673e9SRodney W. Grimes 434dea673e9SRodney W. Grimes /* 435dea673e9SRodney W. Grimes * XXX 436dea673e9SRodney W. Grimes * Add emulation of KINFO_FILE here. 437dea673e9SRodney W. Grimes */ 4384418dbbdSDag-Erling Smørgrav if (kd != NULL) 439d9961cfdSPhilippe Charnier errx(1, "files on dead kernel, not implemented"); 440dea673e9SRodney W. Grimes 441dea673e9SRodney W. Grimes mib[0] = CTL_KERN; 442dea673e9SRodney W. Grimes mib[1] = KERN_FILE; 443dea673e9SRodney W. Grimes if (sysctl(mib, 2, NULL, &len, NULL, 0) == -1) { 444dea673e9SRodney W. Grimes warn("sysctl: KERN_FILE"); 445dea673e9SRodney W. Grimes return (-1); 446dea673e9SRodney W. Grimes } 447dea673e9SRodney W. Grimes if ((buf = malloc(len)) == NULL) 448d9961cfdSPhilippe Charnier errx(1, "malloc"); 449dea673e9SRodney W. Grimes if (sysctl(mib, 2, buf, &len, NULL, 0) == -1) { 450dea673e9SRodney W. Grimes warn("sysctl: KERN_FILE"); 451dea673e9SRodney W. Grimes return (-1); 452dea673e9SRodney W. Grimes } 453dea673e9SRodney W. Grimes *abuf = buf; 454dea673e9SRodney W. Grimes *alen = len; 455dea673e9SRodney W. Grimes return (0); 456dea673e9SRodney W. Grimes } 457dea673e9SRodney W. Grimes 458dea673e9SRodney W. Grimes /* 459dea673e9SRodney W. Grimes * swapmode is based on a program called swapinfo written 460dea673e9SRodney W. Grimes * by Kevin Lahey <kml@rokkaku.atl.ga.us>. 461dea673e9SRodney W. Grimes */ 4624418dbbdSDag-Erling Smørgrav 4634418dbbdSDag-Erling Smørgrav #define CONVERT(v) ((int)((intmax_t)(v) * pagesize / blocksize)) 4644418dbbdSDag-Erling Smørgrav static struct kvm_swap swtot; 4654418dbbdSDag-Erling Smørgrav static int nswdev; 4664418dbbdSDag-Erling Smørgrav 4671dcc9c32SDag-Erling Smørgrav static void 4684418dbbdSDag-Erling Smørgrav print_swap_header(void) 469dea673e9SRodney W. Grimes { 470782f8687SMatthew Dillon int hlen; 471782f8687SMatthew Dillon long blocksize; 4724418dbbdSDag-Erling Smørgrav const char *header; 473dea673e9SRodney W. Grimes 474dea673e9SRodney W. Grimes header = getbsize(&hlen, &blocksize); 4754418dbbdSDag-Erling Smørgrav if (totalflag == 0) 47673f2a3c2SPhilippe Charnier (void)printf("%-15s %*s %8s %8s %8s %s\n", 477dea673e9SRodney W. Grimes "Device", hlen, header, 478dea673e9SRodney W. Grimes "Used", "Avail", "Capacity", "Type"); 4794418dbbdSDag-Erling Smørgrav } 480eedc3436SMatthew Dillon 4814418dbbdSDag-Erling Smørgrav static void 4824418dbbdSDag-Erling Smørgrav print_swap(struct kvm_swap *ksw) 4834418dbbdSDag-Erling Smørgrav { 4844418dbbdSDag-Erling Smørgrav int hlen, pagesize; 4854418dbbdSDag-Erling Smørgrav long blocksize; 4864418dbbdSDag-Erling Smørgrav 4874418dbbdSDag-Erling Smørgrav pagesize = getpagesize(); 4884418dbbdSDag-Erling Smørgrav getbsize(&hlen, &blocksize); 4894418dbbdSDag-Erling Smørgrav swtot.ksw_total += ksw->ksw_total; 4904418dbbdSDag-Erling Smørgrav swtot.ksw_used += ksw->ksw_used; 4914418dbbdSDag-Erling Smørgrav ++nswdev; 4924418dbbdSDag-Erling Smørgrav if (totalflag == 0) { 493182a90e4SDag-Erling Smørgrav (void)printf("%-15s %*d ", 4944418dbbdSDag-Erling Smørgrav ksw->ksw_devname, hlen, 4954418dbbdSDag-Erling Smørgrav CONVERT(ksw->ksw_total)); 4964418dbbdSDag-Erling Smørgrav (void)printf("%8d %8d %5.0f%% %s\n", 4974418dbbdSDag-Erling Smørgrav CONVERT(ksw->ksw_used), 4984418dbbdSDag-Erling Smørgrav CONVERT(ksw->ksw_total - ksw->ksw_used), 4994418dbbdSDag-Erling Smørgrav (ksw->ksw_used * 100.0) / ksw->ksw_total, 5004418dbbdSDag-Erling Smørgrav (ksw->ksw_flags & SW_SEQUENTIAL) ? 5014418dbbdSDag-Erling Smørgrav "Sequential" : "Interleaved"); 502eedc3436SMatthew Dillon } 503eedc3436SMatthew Dillon } 504eedc3436SMatthew Dillon 5054418dbbdSDag-Erling Smørgrav static void 5064418dbbdSDag-Erling Smørgrav print_swap_total(void) 5074418dbbdSDag-Erling Smørgrav { 5084418dbbdSDag-Erling Smørgrav int hlen, pagesize; 5094418dbbdSDag-Erling Smørgrav long blocksize; 5104418dbbdSDag-Erling Smørgrav 5114418dbbdSDag-Erling Smørgrav pagesize = getpagesize(); 5124418dbbdSDag-Erling Smørgrav getbsize(&hlen, &blocksize); 513dea673e9SRodney W. Grimes if (totalflag) { 514782f8687SMatthew Dillon blocksize = 1024 * 1024; 5154418dbbdSDag-Erling Smørgrav (void)printf("%dM/%dM swap space\n", 5164418dbbdSDag-Erling Smørgrav CONVERT(swtot.ksw_used), CONVERT(swtot.ksw_total)); 5174418dbbdSDag-Erling Smørgrav } else if (nswdev > 1) { 5184418dbbdSDag-Erling Smørgrav (void)printf("%-15s %*d %8d %8d %5.0f%%\n", 5194418dbbdSDag-Erling Smørgrav "Total", hlen, CONVERT(swtot.ksw_total), 5204418dbbdSDag-Erling Smørgrav CONVERT(swtot.ksw_used), 5214418dbbdSDag-Erling Smørgrav CONVERT(swtot.ksw_total - swtot.ksw_used), 5224418dbbdSDag-Erling Smørgrav (swtot.ksw_used * 100.0) / swtot.ksw_total); 523dea673e9SRodney W. Grimes } 524dea673e9SRodney W. Grimes } 5254418dbbdSDag-Erling Smørgrav 5264418dbbdSDag-Erling Smørgrav static void 5274418dbbdSDag-Erling Smørgrav swapmode_kvm(void) 5284418dbbdSDag-Erling Smørgrav { 5294418dbbdSDag-Erling Smørgrav struct kvm_swap kswap[16]; 5304418dbbdSDag-Erling Smørgrav int i, n; 5314418dbbdSDag-Erling Smørgrav 5324418dbbdSDag-Erling Smørgrav n = kvm_getswapinfo(kd, kswap, sizeof kswap / sizeof kswap[0], 5334418dbbdSDag-Erling Smørgrav ((swapflag > 1) ? SWIF_DUMP_TREE : 0) | SWIF_DEV_PREFIX); 5344418dbbdSDag-Erling Smørgrav 5354418dbbdSDag-Erling Smørgrav print_swap_header(); 5364418dbbdSDag-Erling Smørgrav for (i = 0; i < n; ++i) 5374418dbbdSDag-Erling Smørgrav print_swap(&kswap[i]); 5384418dbbdSDag-Erling Smørgrav print_swap_total(); 5394418dbbdSDag-Erling Smørgrav } 5404418dbbdSDag-Erling Smørgrav 5414418dbbdSDag-Erling Smørgrav static void 5424418dbbdSDag-Erling Smørgrav swapmode_sysctl(void) 5434418dbbdSDag-Erling Smørgrav { 5444418dbbdSDag-Erling Smørgrav struct kvm_swap ksw; 5454418dbbdSDag-Erling Smørgrav struct xswdev xsw; 5464418dbbdSDag-Erling Smørgrav size_t mibsize, size; 5474418dbbdSDag-Erling Smørgrav int mib[16], n; 5484418dbbdSDag-Erling Smørgrav 5494418dbbdSDag-Erling Smørgrav print_swap_header(); 5504418dbbdSDag-Erling Smørgrav mibsize = sizeof mib / sizeof mib[0]; 5514418dbbdSDag-Erling Smørgrav if (sysctlnametomib("vm.swap_info", mib, &mibsize) == -1) 5524418dbbdSDag-Erling Smørgrav err(1, "sysctlnametomib()"); 5534418dbbdSDag-Erling Smørgrav for (n = 0; ; ++n) { 5544418dbbdSDag-Erling Smørgrav mib[mibsize] = n; 5554418dbbdSDag-Erling Smørgrav size = sizeof xsw; 5564418dbbdSDag-Erling Smørgrav if (sysctl(mib, mibsize + 1, &xsw, &size, NULL, NULL) == -1) 5574418dbbdSDag-Erling Smørgrav break; 5584418dbbdSDag-Erling Smørgrav if (xsw.xsw_version != XSWDEV_VERSION) 5594418dbbdSDag-Erling Smørgrav errx(1, "xswdev version mismatch"); 5604418dbbdSDag-Erling Smørgrav snprintf(ksw.ksw_devname, sizeof ksw.ksw_devname, 5614418dbbdSDag-Erling Smørgrav "/dev/%s", devname(xsw.xsw_dev, S_IFCHR)); 5624418dbbdSDag-Erling Smørgrav ksw.ksw_used = xsw.xsw_used; 5634418dbbdSDag-Erling Smørgrav ksw.ksw_total = xsw.xsw_nblks; 5644418dbbdSDag-Erling Smørgrav ksw.ksw_flags = xsw.xsw_flags; 5654418dbbdSDag-Erling Smørgrav print_swap(&ksw); 5664418dbbdSDag-Erling Smørgrav } 5674418dbbdSDag-Erling Smørgrav if (errno != ENOENT) 5684418dbbdSDag-Erling Smørgrav err(1, "sysctl()"); 5694418dbbdSDag-Erling Smørgrav print_swap_total(); 5704418dbbdSDag-Erling Smørgrav } 5714418dbbdSDag-Erling Smørgrav 5724418dbbdSDag-Erling Smørgrav static void 5734418dbbdSDag-Erling Smørgrav swapmode(void) 5744418dbbdSDag-Erling Smørgrav { 5754418dbbdSDag-Erling Smørgrav if (kd != NULL) 5764418dbbdSDag-Erling Smørgrav swapmode_kvm(); 5774418dbbdSDag-Erling Smørgrav else 5784418dbbdSDag-Erling Smørgrav swapmode_sysctl(); 5794418dbbdSDag-Erling Smørgrav } 580