1dea673e9SRodney W. Grimes /*- 29c5cdfe0SPeter Wemm * Copyright (c) 1980, 1991, 1993, 1994 3dea673e9SRodney W. Grimes * The Regents of the University of California. All rights reserved. 4dea673e9SRodney W. Grimes * 5dea673e9SRodney W. Grimes * Redistribution and use in source and binary forms, with or without 6dea673e9SRodney W. Grimes * modification, are permitted provided that the following conditions 7dea673e9SRodney W. Grimes * are met: 8dea673e9SRodney W. Grimes * 1. Redistributions of source code must retain the above copyright 9dea673e9SRodney W. Grimes * notice, this list of conditions and the following disclaimer. 10dea673e9SRodney W. Grimes * 2. Redistributions in binary form must reproduce the above copyright 11dea673e9SRodney W. Grimes * notice, this list of conditions and the following disclaimer in the 12dea673e9SRodney W. Grimes * documentation and/or other materials provided with the distribution. 13dea673e9SRodney W. Grimes * 3. All advertising materials mentioning features or use of this software 14dea673e9SRodney W. Grimes * must display the following acknowledgement: 15dea673e9SRodney W. Grimes * This product includes software developed by the University of 16dea673e9SRodney W. Grimes * California, Berkeley and its contributors. 17dea673e9SRodney W. Grimes * 4. Neither the name of the University nor the names of its contributors 18dea673e9SRodney W. Grimes * may be used to endorse or promote products derived from this software 19dea673e9SRodney W. Grimes * without specific prior written permission. 20dea673e9SRodney W. Grimes * 21dea673e9SRodney W. Grimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22dea673e9SRodney W. Grimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23dea673e9SRodney W. Grimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24dea673e9SRodney W. Grimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25dea673e9SRodney W. Grimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26dea673e9SRodney W. Grimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27dea673e9SRodney W. Grimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28dea673e9SRodney W. Grimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29dea673e9SRodney W. Grimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30dea673e9SRodney W. Grimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31dea673e9SRodney W. Grimes * SUCH DAMAGE. 32dea673e9SRodney W. Grimes */ 33dea673e9SRodney W. Grimes 34dea673e9SRodney W. Grimes #ifndef lint 35dea673e9SRodney W. Grimes static char copyright[] = 369c5cdfe0SPeter Wemm "@(#) Copyright (c) 1980, 1991, 1993, 1994\n\ 37dea673e9SRodney W. Grimes The Regents of the University of California. All rights reserved.\n"; 38dea673e9SRodney W. Grimes #endif /* not lint */ 39dea673e9SRodney W. Grimes 40dea673e9SRodney W. Grimes #ifndef lint 419c5cdfe0SPeter Wemm static char sccsid[] = "@(#)pstat.c 8.16 (Berkeley) 5/9/95"; 42dea673e9SRodney W. Grimes #endif /* not lint */ 43dea673e9SRodney W. Grimes 44dea673e9SRodney W. Grimes #include <sys/param.h> 45dea673e9SRodney W. Grimes #include <sys/time.h> 46dea673e9SRodney W. Grimes #include <sys/vnode.h> 47dea673e9SRodney W. Grimes #include <sys/ucred.h> 48dea673e9SRodney W. Grimes #define KERNEL 49dea673e9SRodney W. Grimes #include <sys/file.h> 50dea673e9SRodney W. Grimes #include <ufs/ufs/quota.h> 51dea673e9SRodney W. Grimes #include <ufs/ufs/inode.h> 52dea673e9SRodney W. Grimes #define NFS 53dea673e9SRodney W. Grimes #include <sys/mount.h> 54dea673e9SRodney W. Grimes #undef NFS 559c5cdfe0SPeter Wemm #include <sys/uio.h> 569c5cdfe0SPeter Wemm #include <sys/namei.h> 579c5cdfe0SPeter Wemm #include <miscfs/union/union.h> 58dea673e9SRodney W. Grimes #undef KERNEL 59dea673e9SRodney W. Grimes #include <sys/stat.h> 60a62dc406SDoug Rabson #include <nfs/rpcv2.h> 61a62dc406SDoug Rabson #include <nfs/nfsproto.h> 629c5cdfe0SPeter Wemm #define KERNEL 639c5cdfe0SPeter Wemm #include <nfs/nfs.h> 649c5cdfe0SPeter Wemm #undef KERNEL 65dea673e9SRodney W. Grimes #include <nfs/nfsnode.h> 66dea673e9SRodney W. Grimes #include <sys/ioctl.h> 6790300419SAndrey A. Chernov #include <sys/ioctl_compat.h> /* XXX NTTYDISC is too well hidden */ 68dea673e9SRodney W. Grimes #include <sys/tty.h> 69dea673e9SRodney W. Grimes #include <sys/conf.h> 708d7547c2SDavid Greenman #include <sys/rlist.h> 71dea673e9SRodney W. Grimes 723aab05cfSPoul-Henning Kamp #include <sys/user.h> 73dea673e9SRodney W. Grimes #include <sys/sysctl.h> 74dea673e9SRodney W. Grimes 75dea673e9SRodney W. Grimes #include <err.h> 765d98ce75SBruce Evans #include <fcntl.h> 77dea673e9SRodney W. Grimes #include <kvm.h> 78dea673e9SRodney W. Grimes #include <limits.h> 79dea673e9SRodney W. Grimes #include <nlist.h> 80dea673e9SRodney W. Grimes #include <stdio.h> 81dea673e9SRodney W. Grimes #include <stdlib.h> 82dea673e9SRodney W. Grimes #include <string.h> 83dea673e9SRodney W. Grimes #include <unistd.h> 84dea673e9SRodney W. Grimes 85dea673e9SRodney W. Grimes struct nlist nl[] = { 868d7547c2SDavid Greenman #define VM_SWAPLIST 0 878d7547c2SDavid Greenman { "_swaplist" },/* list of free swap areas */ 888d7547c2SDavid Greenman #define VM_SWDEVT 1 89dea673e9SRodney W. Grimes { "_swdevt" }, /* list of swap devices and sizes */ 908d7547c2SDavid Greenman #define VM_NSWAP 2 91dea673e9SRodney W. Grimes { "_nswap" }, /* size of largest swap device */ 928d7547c2SDavid Greenman #define VM_NSWDEV 3 93dea673e9SRodney W. Grimes { "_nswdev" }, /* number of swap devices */ 948d7547c2SDavid Greenman #define VM_DMMAX 4 95dea673e9SRodney W. Grimes { "_dmmax" }, /* maximum size of a swap block */ 968d7547c2SDavid Greenman #define V_MOUNTLIST 5 97dea673e9SRodney W. Grimes { "_mountlist" }, /* address of head of mount list. */ 988d7547c2SDavid Greenman #define V_NUMV 6 99dea673e9SRodney W. Grimes { "_numvnodes" }, 1008d7547c2SDavid Greenman #define FNL_NFILE 7 101dea673e9SRodney W. Grimes {"_nfiles"}, 1028d7547c2SDavid Greenman #define FNL_MAXFILE 8 103dea673e9SRodney W. Grimes {"_maxfiles"}, 104dea673e9SRodney W. Grimes #define NLMANDATORY FNL_MAXFILE /* names up to here are mandatory */ 1051cb2c626SDavid Greenman #define SCONS NLMANDATORY + 1 106dea673e9SRodney W. Grimes { "_cons" }, 1071cb2c626SDavid Greenman #define SPTY NLMANDATORY + 2 108dea673e9SRodney W. Grimes { "_pt_tty" }, 1091cb2c626SDavid Greenman #define SNPTY NLMANDATORY + 3 110dea673e9SRodney W. Grimes { "_npty" }, 111dea673e9SRodney W. Grimes 112dea673e9SRodney W. Grimes #ifdef hp300 113dea673e9SRodney W. Grimes #define SDCA (SNPTY+1) 114dea673e9SRodney W. Grimes { "_dca_tty" }, 115dea673e9SRodney W. Grimes #define SNDCA (SNPTY+2) 116dea673e9SRodney W. Grimes { "_ndca" }, 117dea673e9SRodney W. Grimes #define SDCM (SNPTY+3) 118dea673e9SRodney W. Grimes { "_dcm_tty" }, 119dea673e9SRodney W. Grimes #define SNDCM (SNPTY+4) 120dea673e9SRodney W. Grimes { "_ndcm" }, 121dea673e9SRodney W. Grimes #define SDCL (SNPTY+5) 122dea673e9SRodney W. Grimes { "_dcl_tty" }, 123dea673e9SRodney W. Grimes #define SNDCL (SNPTY+6) 124dea673e9SRodney W. Grimes { "_ndcl" }, 125dea673e9SRodney W. Grimes #define SITE (SNPTY+7) 126dea673e9SRodney W. Grimes { "_ite_tty" }, 127dea673e9SRodney W. Grimes #define SNITE (SNPTY+8) 128dea673e9SRodney W. Grimes { "_nite" }, 129dea673e9SRodney W. Grimes #endif 130dea673e9SRodney W. Grimes 131dea673e9SRodney W. Grimes #ifdef mips 132dea673e9SRodney W. Grimes #define SDC (SNPTY+1) 133dea673e9SRodney W. Grimes { "_dc_tty" }, 134dea673e9SRodney W. Grimes #define SNDC (SNPTY+2) 135dea673e9SRodney W. Grimes { "_dc_cnt" }, 136dea673e9SRodney W. Grimes #endif 137dea673e9SRodney W. Grimes 1385a3391bfSAndrey A. Chernov #ifdef __FreeBSD__ 139de4c8be3SSøren Schmidt #define SCCONS (SNPTY+1) 140de4c8be3SSøren Schmidt { "_sccons" }, 141de4c8be3SSøren Schmidt #define NSCCONS (SNPTY+2) 142de4c8be3SSøren Schmidt { "_nsccons" }, 14390300419SAndrey A. Chernov #define SIO (SNPTY+3) 14490300419SAndrey A. Chernov { "_sio_tty" }, 14590300419SAndrey A. Chernov #define NSIO (SNPTY+4) 14690300419SAndrey A. Chernov { "_nsio_tty" }, 14790300419SAndrey A. Chernov #define RC (SNPTY+5) 14890300419SAndrey A. Chernov { "_rc_tty" }, 14990300419SAndrey A. Chernov #define NRC (SNPTY+6) 15090300419SAndrey A. Chernov { "_nrc_tty" }, 15124f769b0SBruce Evans #define CY (SNPTY+7) 15224f769b0SBruce Evans { "_cy_tty" }, 15324f769b0SBruce Evans #define NCY (SNPTY+8) 15424f769b0SBruce Evans { "_ncy_tty" }, 155a9aa8c37SPeter Wemm #define SI (SNPTY+9) 156a9aa8c37SPeter Wemm { "_si_tty" }, 157a9aa8c37SPeter Wemm #define NSI (SNPTY+10) 158a9aa8c37SPeter Wemm { "_si_Nports" }, 1595a3391bfSAndrey A. Chernov #endif 160dea673e9SRodney W. Grimes { "" } 161dea673e9SRodney W. Grimes }; 162dea673e9SRodney W. Grimes 163dea673e9SRodney W. Grimes int usenumflag; 164dea673e9SRodney W. Grimes int totalflag; 165dea673e9SRodney W. Grimes char *nlistf = NULL; 166dea673e9SRodney W. Grimes char *memf = NULL; 167dea673e9SRodney W. Grimes kvm_t *kd; 168dea673e9SRodney W. Grimes 16959392fe2SPoul-Henning Kamp char *usage; 17059392fe2SPoul-Henning Kamp 1719c5cdfe0SPeter Wemm struct { 1729c5cdfe0SPeter Wemm int m_flag; 1739c5cdfe0SPeter Wemm const char *m_name; 1749c5cdfe0SPeter Wemm } mnt_flags[] = { 1759c5cdfe0SPeter Wemm { MNT_RDONLY, "rdonly" }, 1769c5cdfe0SPeter Wemm { MNT_SYNCHRONOUS, "sync" }, 1779c5cdfe0SPeter Wemm { MNT_NOEXEC, "noexec" }, 1789c5cdfe0SPeter Wemm { MNT_NOSUID, "nosuid" }, 1799c5cdfe0SPeter Wemm { MNT_NODEV, "nodev" }, 1809c5cdfe0SPeter Wemm { MNT_UNION, "union" }, 1819c5cdfe0SPeter Wemm { MNT_ASYNC, "async" }, 1829c5cdfe0SPeter Wemm { MNT_EXRDONLY, "exrdonly" }, 1839c5cdfe0SPeter Wemm { MNT_EXPORTED, "exported" }, 1849c5cdfe0SPeter Wemm { MNT_DEFEXPORTED, "defexported" }, 1859c5cdfe0SPeter Wemm { MNT_EXPORTANON, "exportanon" }, 1869c5cdfe0SPeter Wemm { MNT_EXKERB, "exkerb" }, 1879c5cdfe0SPeter Wemm { MNT_LOCAL, "local" }, 1889c5cdfe0SPeter Wemm { MNT_QUOTA, "quota" }, 1899c5cdfe0SPeter Wemm { MNT_ROOTFS, "rootfs" }, 1909c5cdfe0SPeter Wemm { MNT_UPDATE, "update" }, 1919c5cdfe0SPeter Wemm { MNT_DELEXPORT }, 1929c5cdfe0SPeter Wemm { MNT_UPDATE, "update" }, 1939c5cdfe0SPeter Wemm { MNT_DELEXPORT, "delexport" }, 1949c5cdfe0SPeter Wemm { MNT_RELOAD, "reload" }, 1959c5cdfe0SPeter Wemm { MNT_FORCE, "force" }, 1969c5cdfe0SPeter Wemm #if 0 1979c5cdfe0SPeter Wemm { MNT_MLOCK, "mlock" }, 1989c5cdfe0SPeter Wemm #endif 1999c5cdfe0SPeter Wemm { MNT_WAIT, "wait" }, 2009c5cdfe0SPeter Wemm #if 0 2019c5cdfe0SPeter Wemm { MNT_MPBUSY, "mpbusy" }, 2029c5cdfe0SPeter Wemm { MNT_MPWANT, "mpwant" }, 2039c5cdfe0SPeter Wemm #endif 2049c5cdfe0SPeter Wemm { MNT_UNMOUNT, "unmount" }, 2059c5cdfe0SPeter Wemm { MNT_WANTRDWR, "wantrdwr" }, 2069c5cdfe0SPeter Wemm { 0 } 2079c5cdfe0SPeter Wemm }; 2089c5cdfe0SPeter Wemm 2099c5cdfe0SPeter Wemm 210dea673e9SRodney W. Grimes #define SVAR(var) __STRING(var) /* to force expansion */ 211dea673e9SRodney W. Grimes #define KGET(idx, var) \ 212dea673e9SRodney W. Grimes KGET1(idx, &var, sizeof(var), SVAR(var)) 213dea673e9SRodney W. Grimes #define KGET1(idx, p, s, msg) \ 214dea673e9SRodney W. Grimes KGET2(nl[idx].n_value, p, s, msg) 215dea673e9SRodney W. Grimes #define KGET2(addr, p, s, msg) \ 216dea673e9SRodney W. Grimes if (kvm_read(kd, (u_long)(addr), p, s) != s) \ 217dea673e9SRodney W. Grimes warnx("cannot read %s: %s", msg, kvm_geterr(kd)) 218dea673e9SRodney W. Grimes #define KGETRET(addr, p, s, msg) \ 219dea673e9SRodney W. Grimes if (kvm_read(kd, (u_long)(addr), p, s) != s) { \ 220dea673e9SRodney W. Grimes warnx("cannot read %s: %s", msg, kvm_geterr(kd)); \ 221dea673e9SRodney W. Grimes return (0); \ 222dea673e9SRodney W. Grimes } 223dea673e9SRodney W. Grimes 224dea673e9SRodney W. Grimes void filemode __P((void)); 225dea673e9SRodney W. Grimes int getfiles __P((char **, int *)); 226dea673e9SRodney W. Grimes struct mount * 227dea673e9SRodney W. Grimes getmnt __P((struct mount *)); 228dea673e9SRodney W. Grimes struct e_vnode * 229dea673e9SRodney W. Grimes kinfo_vnodes __P((int *)); 230dea673e9SRodney W. Grimes struct e_vnode * 231dea673e9SRodney W. Grimes loadvnodes __P((int *)); 232dea673e9SRodney W. Grimes void mount_print __P((struct mount *)); 233dea673e9SRodney W. Grimes void nfs_header __P((void)); 234dea673e9SRodney W. Grimes int nfs_print __P((struct vnode *)); 235dea673e9SRodney W. Grimes void swapmode __P((void)); 236dea673e9SRodney W. Grimes void ttymode __P((void)); 237dea673e9SRodney W. Grimes void ttyprt __P((struct tty *, int)); 238a9aa8c37SPeter Wemm void ttytype __P((struct tty *, char *, int, int, int)); 239dea673e9SRodney W. Grimes void ufs_header __P((void)); 240dea673e9SRodney W. Grimes int ufs_print __P((struct vnode *)); 2419c5cdfe0SPeter Wemm void union_header __P((void)); 2429c5cdfe0SPeter Wemm int union_print __P((struct vnode *)); 243dea673e9SRodney W. Grimes void vnode_header __P((void)); 244dea673e9SRodney W. Grimes void vnode_print __P((struct vnode *, struct vnode *)); 245dea673e9SRodney W. Grimes void vnodemode __P((void)); 246dea673e9SRodney W. Grimes 247dea673e9SRodney W. Grimes int 248dea673e9SRodney W. Grimes main(argc, argv) 249dea673e9SRodney W. Grimes int argc; 250dea673e9SRodney W. Grimes char *argv[]; 251dea673e9SRodney W. Grimes { 252dea673e9SRodney W. Grimes extern char *optarg; 253dea673e9SRodney W. Grimes extern int optind; 254dea673e9SRodney W. Grimes int ch, i, quit, ret; 255dea673e9SRodney W. Grimes int fileflag, swapflag, ttyflag, vnodeflag; 25659392fe2SPoul-Henning Kamp char buf[_POSIX2_LINE_MAX],*opts; 257dea673e9SRodney W. Grimes 258dea673e9SRodney W. Grimes fileflag = swapflag = ttyflag = vnodeflag = 0; 25959392fe2SPoul-Henning Kamp 26059392fe2SPoul-Henning Kamp /* We will behave like good old swapinfo if thus invoked */ 26159392fe2SPoul-Henning Kamp opts = strrchr(argv[0],'/'); 26259392fe2SPoul-Henning Kamp if (opts) 26359392fe2SPoul-Henning Kamp opts++; 26459392fe2SPoul-Henning Kamp else 26559392fe2SPoul-Henning Kamp opts = argv[0]; 26659392fe2SPoul-Henning Kamp if (!strcmp(opts,"swapinfo")) { 26759392fe2SPoul-Henning Kamp swapflag = 1; 2682d8e94a4SSujal Patel opts = "kM:N:"; 26959392fe2SPoul-Henning Kamp usage = "usage: swapinfo [-k] [-M core] [-N system]\n"; 27059392fe2SPoul-Henning Kamp } else { 27159392fe2SPoul-Henning Kamp opts = "TM:N:fiknstv"; 27259392fe2SPoul-Henning Kamp usage = "usage: pstat [-Tfknstv] [-M core] [-N system]\n"; 27359392fe2SPoul-Henning Kamp } 27459392fe2SPoul-Henning Kamp 27559392fe2SPoul-Henning Kamp while ((ch = getopt(argc, argv, opts)) != EOF) 276dea673e9SRodney W. Grimes switch (ch) { 277dea673e9SRodney W. Grimes case 'f': 278dea673e9SRodney W. Grimes fileflag = 1; 279dea673e9SRodney W. Grimes break; 28059392fe2SPoul-Henning Kamp case 'k': 28159392fe2SPoul-Henning Kamp putenv("BLOCKSIZE=1K"); 28259392fe2SPoul-Henning Kamp break; 283dea673e9SRodney W. Grimes case 'M': 284dea673e9SRodney W. Grimes memf = optarg; 285dea673e9SRodney W. Grimes break; 286dea673e9SRodney W. Grimes case 'N': 287dea673e9SRodney W. Grimes nlistf = optarg; 288dea673e9SRodney W. Grimes break; 289dea673e9SRodney W. Grimes case 'n': 290dea673e9SRodney W. Grimes usenumflag = 1; 291dea673e9SRodney W. Grimes break; 292dea673e9SRodney W. Grimes case 's': 293dea673e9SRodney W. Grimes swapflag = 1; 294dea673e9SRodney W. Grimes break; 295dea673e9SRodney W. Grimes case 'T': 296dea673e9SRodney W. Grimes totalflag = 1; 297dea673e9SRodney W. Grimes break; 298dea673e9SRodney W. Grimes case 't': 299dea673e9SRodney W. Grimes ttyflag = 1; 300dea673e9SRodney W. Grimes break; 301dea673e9SRodney W. Grimes case 'v': 302dea673e9SRodney W. Grimes case 'i': /* Backward compatibility. */ 303dea673e9SRodney W. Grimes vnodeflag = 1; 304dea673e9SRodney W. Grimes break; 305dea673e9SRodney W. Grimes default: 30659392fe2SPoul-Henning Kamp (void)fprintf(stderr, usage); 30759392fe2SPoul-Henning Kamp exit(1); 308dea673e9SRodney W. Grimes } 309dea673e9SRodney W. Grimes argc -= optind; 310dea673e9SRodney W. Grimes argv += optind; 311dea673e9SRodney W. Grimes 312dea673e9SRodney W. Grimes /* 313dea673e9SRodney W. Grimes * Discard setgid privileges if not the running kernel so that bad 314dea673e9SRodney W. Grimes * guys can't print interesting stuff from kernel memory. 315dea673e9SRodney W. Grimes */ 316dea673e9SRodney W. Grimes if (nlistf != NULL || memf != NULL) 317dea673e9SRodney W. Grimes (void)setgid(getgid()); 318dea673e9SRodney W. Grimes 319dea673e9SRodney W. Grimes if ((kd = kvm_openfiles(nlistf, memf, NULL, O_RDONLY, buf)) == 0) 320dea673e9SRodney W. Grimes errx(1, "kvm_openfiles: %s", buf); 321dea673e9SRodney W. Grimes if ((ret = kvm_nlist(kd, nl)) != 0) { 322dea673e9SRodney W. Grimes if (ret == -1) 323dea673e9SRodney W. Grimes errx(1, "kvm_nlist: %s", kvm_geterr(kd)); 324dea673e9SRodney W. Grimes for (i = quit = 0; i <= NLMANDATORY; i++) 325dea673e9SRodney W. Grimes if (!nl[i].n_value) { 326dea673e9SRodney W. Grimes quit = 1; 327dea673e9SRodney W. Grimes warnx("undefined symbol: %s\n", nl[i].n_name); 328dea673e9SRodney W. Grimes } 329dea673e9SRodney W. Grimes if (quit) 330dea673e9SRodney W. Grimes exit(1); 331dea673e9SRodney W. Grimes } 33259392fe2SPoul-Henning Kamp if (!(fileflag | vnodeflag | ttyflag | swapflag | totalflag)) { 33359392fe2SPoul-Henning Kamp (void)fprintf(stderr, usage); 33459392fe2SPoul-Henning Kamp exit(1); 33559392fe2SPoul-Henning Kamp } 336dea673e9SRodney W. Grimes if (fileflag || totalflag) 337dea673e9SRodney W. Grimes filemode(); 338dea673e9SRodney W. Grimes if (vnodeflag || totalflag) 339dea673e9SRodney W. Grimes vnodemode(); 340dea673e9SRodney W. Grimes if (ttyflag) 341dea673e9SRodney W. Grimes ttymode(); 342dea673e9SRodney W. Grimes if (swapflag || totalflag) 343dea673e9SRodney W. Grimes swapmode(); 344dea673e9SRodney W. Grimes exit (0); 345dea673e9SRodney W. Grimes } 346dea673e9SRodney W. Grimes 347dea673e9SRodney W. Grimes struct e_vnode { 348dea673e9SRodney W. Grimes struct vnode *avnode; 349dea673e9SRodney W. Grimes struct vnode vnode; 350dea673e9SRodney W. Grimes }; 351dea673e9SRodney W. Grimes 352dea673e9SRodney W. Grimes void 353dea673e9SRodney W. Grimes vnodemode() 354dea673e9SRodney W. Grimes { 3559c5cdfe0SPeter Wemm struct e_vnode *e_vnodebase, *endvnode, *evp; 3569c5cdfe0SPeter Wemm struct vnode *vp; 3579c5cdfe0SPeter Wemm struct mount *maddr, *mp; 358dea673e9SRodney W. Grimes int numvnodes; 359dea673e9SRodney W. Grimes 360dea673e9SRodney W. Grimes e_vnodebase = loadvnodes(&numvnodes); 361dea673e9SRodney W. Grimes if (totalflag) { 362dea673e9SRodney W. Grimes (void)printf("%7d vnodes\n", numvnodes); 363dea673e9SRodney W. Grimes return; 364dea673e9SRodney W. Grimes } 365dea673e9SRodney W. Grimes endvnode = e_vnodebase + numvnodes; 366dea673e9SRodney W. Grimes (void)printf("%d active vnodes\n", numvnodes); 367dea673e9SRodney W. Grimes 368dea673e9SRodney W. Grimes 369dea673e9SRodney W. Grimes #define ST mp->mnt_stat 370dea673e9SRodney W. Grimes maddr = NULL; 371dea673e9SRodney W. Grimes for (evp = e_vnodebase; evp < endvnode; evp++) { 372dea673e9SRodney W. Grimes vp = &evp->vnode; 373dea673e9SRodney W. Grimes if (vp->v_mount != maddr) { 374dea673e9SRodney W. Grimes /* 375dea673e9SRodney W. Grimes * New filesystem 376dea673e9SRodney W. Grimes */ 377dea673e9SRodney W. Grimes if ((mp = getmnt(vp->v_mount)) == NULL) 378dea673e9SRodney W. Grimes continue; 379dea673e9SRodney W. Grimes maddr = vp->v_mount; 380dea673e9SRodney W. Grimes mount_print(mp); 381dea673e9SRodney W. Grimes vnode_header(); 3829c5cdfe0SPeter Wemm if (!strcmp(ST.f_fstypename, "ufs") || 3839c5cdfe0SPeter Wemm !strcmp(ST.f_fstypename, "mfs")) 384dea673e9SRodney W. Grimes ufs_header(); 3859c5cdfe0SPeter Wemm else if (!strcmp(ST.f_fstypename, "nfs")) 386dea673e9SRodney W. Grimes nfs_header(); 3879c5cdfe0SPeter Wemm else if (!strcmp(ST.f_fstypename, "union")) 3889c5cdfe0SPeter Wemm union_header(); 389dea673e9SRodney W. Grimes (void)printf("\n"); 390dea673e9SRodney W. Grimes } 391dea673e9SRodney W. Grimes vnode_print(evp->avnode, vp); 3929c5cdfe0SPeter Wemm if (!strcmp(ST.f_fstypename, "ufs") || 3939c5cdfe0SPeter Wemm !strcmp(ST.f_fstypename, "mfs")) 394dea673e9SRodney W. Grimes ufs_print(vp); 3959c5cdfe0SPeter Wemm else if (!strcmp(ST.f_fstypename, "nfs")) 396dea673e9SRodney W. Grimes nfs_print(vp); 3979c5cdfe0SPeter Wemm else if (!strcmp(ST.f_fstypename, "union")) 3989c5cdfe0SPeter Wemm union_print(vp); 399dea673e9SRodney W. Grimes (void)printf("\n"); 400dea673e9SRodney W. Grimes } 401dea673e9SRodney W. Grimes free(e_vnodebase); 402dea673e9SRodney W. Grimes } 403dea673e9SRodney W. Grimes 404dea673e9SRodney W. Grimes void 405dea673e9SRodney W. Grimes vnode_header() 406dea673e9SRodney W. Grimes { 407dea673e9SRodney W. Grimes (void)printf("ADDR TYP VFLAG USE HOLD"); 408dea673e9SRodney W. Grimes } 409dea673e9SRodney W. Grimes 410dea673e9SRodney W. Grimes void 411dea673e9SRodney W. Grimes vnode_print(avnode, vp) 412dea673e9SRodney W. Grimes struct vnode *avnode; 413dea673e9SRodney W. Grimes struct vnode *vp; 414dea673e9SRodney W. Grimes { 415dea673e9SRodney W. Grimes char *type, flags[16]; 416dea673e9SRodney W. Grimes char *fp = flags; 4179c5cdfe0SPeter Wemm int flag; 418dea673e9SRodney W. Grimes 419dea673e9SRodney W. Grimes /* 420dea673e9SRodney W. Grimes * set type 421dea673e9SRodney W. Grimes */ 422dea673e9SRodney W. Grimes switch (vp->v_type) { 423dea673e9SRodney W. Grimes case VNON: 424dea673e9SRodney W. Grimes type = "non"; break; 425dea673e9SRodney W. Grimes case VREG: 426dea673e9SRodney W. Grimes type = "reg"; break; 427dea673e9SRodney W. Grimes case VDIR: 428dea673e9SRodney W. Grimes type = "dir"; break; 429dea673e9SRodney W. Grimes case VBLK: 430dea673e9SRodney W. Grimes type = "blk"; break; 431dea673e9SRodney W. Grimes case VCHR: 432dea673e9SRodney W. Grimes type = "chr"; break; 433dea673e9SRodney W. Grimes case VLNK: 434dea673e9SRodney W. Grimes type = "lnk"; break; 435dea673e9SRodney W. Grimes case VSOCK: 436dea673e9SRodney W. Grimes type = "soc"; break; 437dea673e9SRodney W. Grimes case VFIFO: 438dea673e9SRodney W. Grimes type = "fif"; break; 439dea673e9SRodney W. Grimes case VBAD: 440dea673e9SRodney W. Grimes type = "bad"; break; 441dea673e9SRodney W. Grimes default: 442dea673e9SRodney W. Grimes type = "unk"; break; 443dea673e9SRodney W. Grimes } 444dea673e9SRodney W. Grimes /* 445dea673e9SRodney W. Grimes * gather flags 446dea673e9SRodney W. Grimes */ 447dea673e9SRodney W. Grimes flag = vp->v_flag; 448dea673e9SRodney W. Grimes if (flag & VROOT) 449dea673e9SRodney W. Grimes *fp++ = 'R'; 450dea673e9SRodney W. Grimes if (flag & VTEXT) 451dea673e9SRodney W. Grimes *fp++ = 'T'; 452dea673e9SRodney W. Grimes if (flag & VSYSTEM) 453dea673e9SRodney W. Grimes *fp++ = 'S'; 454dea673e9SRodney W. Grimes if (flag & VXLOCK) 455dea673e9SRodney W. Grimes *fp++ = 'L'; 456dea673e9SRodney W. Grimes if (flag & VXWANT) 457dea673e9SRodney W. Grimes *fp++ = 'W'; 458dea673e9SRodney W. Grimes if (flag & VBWAIT) 459dea673e9SRodney W. Grimes *fp++ = 'B'; 460dea673e9SRodney W. Grimes if (flag & VALIASED) 461dea673e9SRodney W. Grimes *fp++ = 'A'; 462dea673e9SRodney W. Grimes if (flag == 0) 463dea673e9SRodney W. Grimes *fp++ = '-'; 464dea673e9SRodney W. Grimes *fp = '\0'; 465dea673e9SRodney W. Grimes (void)printf("%8x %s %5s %4d %4d", 466dea673e9SRodney W. Grimes avnode, type, flags, vp->v_usecount, vp->v_holdcnt); 467dea673e9SRodney W. Grimes } 468dea673e9SRodney W. Grimes 469dea673e9SRodney W. Grimes void 470dea673e9SRodney W. Grimes ufs_header() 471dea673e9SRodney W. Grimes { 472dea673e9SRodney W. Grimes (void)printf(" FILEID IFLAG RDEV|SZ"); 473dea673e9SRodney W. Grimes } 474dea673e9SRodney W. Grimes 475dea673e9SRodney W. Grimes int 476dea673e9SRodney W. Grimes ufs_print(vp) 477dea673e9SRodney W. Grimes struct vnode *vp; 478dea673e9SRodney W. Grimes { 4799c5cdfe0SPeter Wemm int flag; 480dea673e9SRodney W. Grimes struct inode inode, *ip = &inode; 481dea673e9SRodney W. Grimes char flagbuf[16], *flags = flagbuf; 482dea673e9SRodney W. Grimes char *name; 483dea673e9SRodney W. Grimes mode_t type; 484dea673e9SRodney W. Grimes 485dea673e9SRodney W. Grimes KGETRET(VTOI(vp), &inode, sizeof(struct inode), "vnode's inode"); 486dea673e9SRodney W. Grimes flag = ip->i_flag; 4879c5cdfe0SPeter Wemm #if 0 /* XXX */ 488dea673e9SRodney W. Grimes if (flag & IN_LOCKED) 489dea673e9SRodney W. Grimes *flags++ = 'L'; 490dea673e9SRodney W. Grimes if (flag & IN_WANTED) 491dea673e9SRodney W. Grimes *flags++ = 'W'; 4929c5cdfe0SPeter Wemm #endif 493dea673e9SRodney W. Grimes if (flag & IN_RENAME) 494dea673e9SRodney W. Grimes *flags++ = 'R'; 495dea673e9SRodney W. Grimes if (flag & IN_UPDATE) 496dea673e9SRodney W. Grimes *flags++ = 'U'; 497dea673e9SRodney W. Grimes if (flag & IN_ACCESS) 498dea673e9SRodney W. Grimes *flags++ = 'A'; 499dea673e9SRodney W. Grimes if (flag & IN_CHANGE) 500dea673e9SRodney W. Grimes *flags++ = 'C'; 501dea673e9SRodney W. Grimes if (flag & IN_MODIFIED) 502dea673e9SRodney W. Grimes *flags++ = 'M'; 503dea673e9SRodney W. Grimes if (flag & IN_SHLOCK) 504dea673e9SRodney W. Grimes *flags++ = 'S'; 505dea673e9SRodney W. Grimes if (flag & IN_EXLOCK) 506dea673e9SRodney W. Grimes *flags++ = 'E'; 5079c5cdfe0SPeter Wemm #if 0 508dea673e9SRodney W. Grimes if (flag & IN_LWAIT) 509dea673e9SRodney W. Grimes *flags++ = 'Z'; 5109c5cdfe0SPeter Wemm #endif 511dea673e9SRodney W. Grimes if (flag == 0) 512dea673e9SRodney W. Grimes *flags++ = '-'; 513dea673e9SRodney W. Grimes *flags = '\0'; 514dea673e9SRodney W. Grimes 515dea673e9SRodney W. Grimes (void)printf(" %6d %5s", ip->i_number, flagbuf); 516dea673e9SRodney W. Grimes type = ip->i_mode & S_IFMT; 517dea673e9SRodney W. Grimes if (S_ISCHR(ip->i_mode) || S_ISBLK(ip->i_mode)) 518dea673e9SRodney W. Grimes if (usenumflag || ((name = devname(ip->i_rdev, type)) == NULL)) 519dea673e9SRodney W. Grimes (void)printf(" %2d,%-2d", 520dea673e9SRodney W. Grimes major(ip->i_rdev), minor(ip->i_rdev)); 521dea673e9SRodney W. Grimes else 522dea673e9SRodney W. Grimes (void)printf(" %7s", name); 523dea673e9SRodney W. Grimes else 524dea673e9SRodney W. Grimes (void)printf(" %7qd", ip->i_size); 525dea673e9SRodney W. Grimes return (0); 526dea673e9SRodney W. Grimes } 527dea673e9SRodney W. Grimes 528dea673e9SRodney W. Grimes void 529dea673e9SRodney W. Grimes nfs_header() 530dea673e9SRodney W. Grimes { 531dea673e9SRodney W. Grimes (void)printf(" FILEID NFLAG RDEV|SZ"); 532dea673e9SRodney W. Grimes } 533dea673e9SRodney W. Grimes 534dea673e9SRodney W. Grimes int 535dea673e9SRodney W. Grimes nfs_print(vp) 536dea673e9SRodney W. Grimes struct vnode *vp; 537dea673e9SRodney W. Grimes { 538dea673e9SRodney W. Grimes struct nfsnode nfsnode, *np = &nfsnode; 539dea673e9SRodney W. Grimes char flagbuf[16], *flags = flagbuf; 5409c5cdfe0SPeter Wemm int flag; 541dea673e9SRodney W. Grimes char *name; 542dea673e9SRodney W. Grimes mode_t type; 543dea673e9SRodney W. Grimes 544dea673e9SRodney W. Grimes KGETRET(VTONFS(vp), &nfsnode, sizeof(nfsnode), "vnode's nfsnode"); 545dea673e9SRodney W. Grimes flag = np->n_flag; 546dea673e9SRodney W. Grimes if (flag & NFLUSHWANT) 547dea673e9SRodney W. Grimes *flags++ = 'W'; 548dea673e9SRodney W. Grimes if (flag & NFLUSHINPROG) 549dea673e9SRodney W. Grimes *flags++ = 'P'; 550dea673e9SRodney W. Grimes if (flag & NMODIFIED) 551dea673e9SRodney W. Grimes *flags++ = 'M'; 552dea673e9SRodney W. Grimes if (flag & NWRITEERR) 553dea673e9SRodney W. Grimes *flags++ = 'E'; 554dea673e9SRodney W. Grimes if (flag & NQNFSNONCACHE) 555dea673e9SRodney W. Grimes *flags++ = 'X'; 556dea673e9SRodney W. Grimes if (flag & NQNFSWRITE) 557dea673e9SRodney W. Grimes *flags++ = 'O'; 558dea673e9SRodney W. Grimes if (flag & NQNFSEVICTED) 559dea673e9SRodney W. Grimes *flags++ = 'G'; 560dea673e9SRodney W. Grimes if (flag == 0) 561dea673e9SRodney W. Grimes *flags++ = '-'; 562dea673e9SRodney W. Grimes *flags = '\0'; 563dea673e9SRodney W. Grimes 564dea673e9SRodney W. Grimes #define VT np->n_vattr 565dea673e9SRodney W. Grimes (void)printf(" %6d %5s", VT.va_fileid, flagbuf); 566dea673e9SRodney W. Grimes type = VT.va_mode & S_IFMT; 567dea673e9SRodney W. Grimes if (S_ISCHR(VT.va_mode) || S_ISBLK(VT.va_mode)) 568dea673e9SRodney W. Grimes if (usenumflag || ((name = devname(VT.va_rdev, type)) == NULL)) 569dea673e9SRodney W. Grimes (void)printf(" %2d,%-2d", 570dea673e9SRodney W. Grimes major(VT.va_rdev), minor(VT.va_rdev)); 571dea673e9SRodney W. Grimes else 572dea673e9SRodney W. Grimes (void)printf(" %7s", name); 573dea673e9SRodney W. Grimes else 574dea673e9SRodney W. Grimes (void)printf(" %7qd", np->n_size); 575dea673e9SRodney W. Grimes return (0); 576dea673e9SRodney W. Grimes } 577dea673e9SRodney W. Grimes 5789c5cdfe0SPeter Wemm void 5799c5cdfe0SPeter Wemm union_header() 5809c5cdfe0SPeter Wemm { 5819c5cdfe0SPeter Wemm (void)printf(" UPPER LOWER"); 5829c5cdfe0SPeter Wemm } 5839c5cdfe0SPeter Wemm 5849c5cdfe0SPeter Wemm int 5859c5cdfe0SPeter Wemm union_print(vp) 5869c5cdfe0SPeter Wemm struct vnode *vp; 5879c5cdfe0SPeter Wemm { 5889c5cdfe0SPeter Wemm struct union_node unode, *up = &unode; 5899c5cdfe0SPeter Wemm 5909c5cdfe0SPeter Wemm KGETRET(VTOUNION(vp), &unode, sizeof(unode), "vnode's unode"); 5919c5cdfe0SPeter Wemm 5929c5cdfe0SPeter Wemm (void)printf(" %8x %8x", up->un_uppervp, up->un_lowervp); 5939c5cdfe0SPeter Wemm return (0); 5949c5cdfe0SPeter Wemm } 5959c5cdfe0SPeter Wemm 596dea673e9SRodney W. Grimes /* 597dea673e9SRodney W. Grimes * Given a pointer to a mount structure in kernel space, 598dea673e9SRodney W. Grimes * read it in and return a usable pointer to it. 599dea673e9SRodney W. Grimes */ 600dea673e9SRodney W. Grimes struct mount * 601dea673e9SRodney W. Grimes getmnt(maddr) 602dea673e9SRodney W. Grimes struct mount *maddr; 603dea673e9SRodney W. Grimes { 604dea673e9SRodney W. Grimes static struct mtab { 605dea673e9SRodney W. Grimes struct mtab *next; 606dea673e9SRodney W. Grimes struct mount *maddr; 607dea673e9SRodney W. Grimes struct mount mount; 608dea673e9SRodney W. Grimes } *mhead = NULL; 6099c5cdfe0SPeter Wemm struct mtab *mt; 610dea673e9SRodney W. Grimes 611dea673e9SRodney W. Grimes for (mt = mhead; mt != NULL; mt = mt->next) 612dea673e9SRodney W. Grimes if (maddr == mt->maddr) 613dea673e9SRodney W. Grimes return (&mt->mount); 614dea673e9SRodney W. Grimes if ((mt = malloc(sizeof(struct mtab))) == NULL) 615dea673e9SRodney W. Grimes err(1, NULL); 616dea673e9SRodney W. Grimes KGETRET(maddr, &mt->mount, sizeof(struct mount), "mount table"); 617dea673e9SRodney W. Grimes mt->maddr = maddr; 618dea673e9SRodney W. Grimes mt->next = mhead; 619dea673e9SRodney W. Grimes mhead = mt; 620dea673e9SRodney W. Grimes return (&mt->mount); 621dea673e9SRodney W. Grimes } 622dea673e9SRodney W. Grimes 623dea673e9SRodney W. Grimes void 624dea673e9SRodney W. Grimes mount_print(mp) 625dea673e9SRodney W. Grimes struct mount *mp; 626dea673e9SRodney W. Grimes { 6279c5cdfe0SPeter Wemm int flags; 6289c5cdfe0SPeter Wemm const char *type; 629dea673e9SRodney W. Grimes 630dea673e9SRodney W. Grimes #define ST mp->mnt_stat 6319c5cdfe0SPeter Wemm (void)printf("*** MOUNT %s %s on %s", ST.f_fstypename, 6329c5cdfe0SPeter Wemm ST.f_mntfromname, ST.f_mntonname); 633dea673e9SRodney W. Grimes if (flags = mp->mnt_flag) { 6349c5cdfe0SPeter Wemm int i; 6359c5cdfe0SPeter Wemm const char *sep = " ("; 636dea673e9SRodney W. Grimes 6379c5cdfe0SPeter Wemm for (i = 0; mnt_flags[i].m_flag; i++) { 6389c5cdfe0SPeter Wemm if (flags & mnt_flags[i].m_flag) { 6399c5cdfe0SPeter Wemm (void)printf("%s%s", sep, mnt_flags[i].m_name); 6409c5cdfe0SPeter Wemm flags &= ~mnt_flags[i].m_flag; 6419c5cdfe0SPeter Wemm sep = ","; 642dea673e9SRodney W. Grimes } 643dea673e9SRodney W. Grimes } 644dea673e9SRodney W. Grimes if (flags) 6459c5cdfe0SPeter Wemm (void)printf("%sunknown_flags:%x", sep, flags); 646dea673e9SRodney W. Grimes (void)printf(")"); 647dea673e9SRodney W. Grimes } 648dea673e9SRodney W. Grimes (void)printf("\n"); 649dea673e9SRodney W. Grimes #undef ST 650dea673e9SRodney W. Grimes } 651dea673e9SRodney W. Grimes 652dea673e9SRodney W. Grimes struct e_vnode * 653dea673e9SRodney W. Grimes loadvnodes(avnodes) 654dea673e9SRodney W. Grimes int *avnodes; 655dea673e9SRodney W. Grimes { 656dea673e9SRodney W. Grimes int mib[2]; 657dea673e9SRodney W. Grimes size_t copysize; 658dea673e9SRodney W. Grimes struct e_vnode *vnodebase; 659dea673e9SRodney W. Grimes 660dea673e9SRodney W. Grimes if (memf != NULL) { 661dea673e9SRodney W. Grimes /* 662dea673e9SRodney W. Grimes * do it by hand 663dea673e9SRodney W. Grimes */ 664dea673e9SRodney W. Grimes return (kinfo_vnodes(avnodes)); 665dea673e9SRodney W. Grimes } 666dea673e9SRodney W. Grimes mib[0] = CTL_KERN; 667dea673e9SRodney W. Grimes mib[1] = KERN_VNODE; 668dea673e9SRodney W. Grimes if (sysctl(mib, 2, NULL, ©size, NULL, 0) == -1) 669dea673e9SRodney W. Grimes err(1, "sysctl: KERN_VNODE"); 670dea673e9SRodney W. Grimes if ((vnodebase = malloc(copysize)) == NULL) 671dea673e9SRodney W. Grimes err(1, NULL); 672dea673e9SRodney W. Grimes if (sysctl(mib, 2, vnodebase, ©size, NULL, 0) == -1) 673dea673e9SRodney W. Grimes err(1, "sysctl: KERN_VNODE"); 674dea673e9SRodney W. Grimes if (copysize % sizeof(struct e_vnode)) 675dea673e9SRodney W. Grimes errx(1, "vnode size mismatch"); 676dea673e9SRodney W. Grimes *avnodes = copysize / sizeof(struct e_vnode); 677dea673e9SRodney W. Grimes 678dea673e9SRodney W. Grimes return (vnodebase); 679dea673e9SRodney W. Grimes } 680dea673e9SRodney W. Grimes 681dea673e9SRodney W. Grimes /* 682dea673e9SRodney W. Grimes * simulate what a running kernel does in in kinfo_vnode 683dea673e9SRodney W. Grimes */ 684dea673e9SRodney W. Grimes struct e_vnode * 685dea673e9SRodney W. Grimes kinfo_vnodes(avnodes) 686dea673e9SRodney W. Grimes int *avnodes; 687dea673e9SRodney W. Grimes { 688dea673e9SRodney W. Grimes struct mntlist mountlist; 689dea673e9SRodney W. Grimes struct mount *mp, mount; 690dea673e9SRodney W. Grimes struct vnode *vp, vnode; 691dea673e9SRodney W. Grimes char *vbuf, *evbuf, *bp; 692dea673e9SRodney W. Grimes int num, numvnodes; 693dea673e9SRodney W. Grimes 694dea673e9SRodney W. Grimes #define VPTRSZ sizeof(struct vnode *) 695dea673e9SRodney W. Grimes #define VNODESZ sizeof(struct vnode) 696dea673e9SRodney W. Grimes 697dea673e9SRodney W. Grimes KGET(V_NUMV, numvnodes); 698dea673e9SRodney W. Grimes if ((vbuf = malloc((numvnodes + 20) * (VPTRSZ + VNODESZ))) == NULL) 699dea673e9SRodney W. Grimes err(1, NULL); 700dea673e9SRodney W. Grimes bp = vbuf; 701dea673e9SRodney W. Grimes evbuf = vbuf + (numvnodes + 20) * (VPTRSZ + VNODESZ); 702dea673e9SRodney W. Grimes KGET(V_MOUNTLIST, mountlist); 703d219a12eSDavid Greenman for (num = 0, mp = mountlist.cqh_first; ; mp = mp->mnt_list.cqe_next) { 704dea673e9SRodney W. Grimes KGET2(mp, &mount, sizeof(mount), "mount entry"); 705dea673e9SRodney W. Grimes for (vp = mount.mnt_vnodelist.lh_first; 706dea673e9SRodney W. Grimes vp != NULL; vp = vp->v_mntvnodes.le_next) { 707dea673e9SRodney W. Grimes KGET2(vp, &vnode, sizeof(vnode), "vnode"); 708dea673e9SRodney W. Grimes if ((bp + VPTRSZ + VNODESZ) > evbuf) 709dea673e9SRodney W. Grimes /* XXX - should realloc */ 710dea673e9SRodney W. Grimes errx(1, "no more room for vnodes"); 711dea673e9SRodney W. Grimes memmove(bp, &vp, VPTRSZ); 712dea673e9SRodney W. Grimes bp += VPTRSZ; 713dea673e9SRodney W. Grimes memmove(bp, &vnode, VNODESZ); 714dea673e9SRodney W. Grimes bp += VNODESZ; 715dea673e9SRodney W. Grimes num++; 716dea673e9SRodney W. Grimes } 717d219a12eSDavid Greenman if (mp == mountlist.cqh_last) 718d219a12eSDavid Greenman break; 719dea673e9SRodney W. Grimes } 720dea673e9SRodney W. Grimes *avnodes = num; 721dea673e9SRodney W. Grimes return ((struct e_vnode *)vbuf); 722dea673e9SRodney W. Grimes } 723dea673e9SRodney W. Grimes 724dea673e9SRodney W. Grimes char hdr[]=" LINE RAW CAN OUT HWT LWT COL STATE SESS PGID DISC\n"; 725dea673e9SRodney W. Grimes int ttyspace = 128; 726dea673e9SRodney W. Grimes 727dea673e9SRodney W. Grimes void 728dea673e9SRodney W. Grimes ttymode() 729dea673e9SRodney W. Grimes { 730dea673e9SRodney W. Grimes struct tty *tty; 731dea673e9SRodney W. Grimes 732dea673e9SRodney W. Grimes if ((tty = malloc(ttyspace * sizeof(*tty))) == NULL) 733dea673e9SRodney W. Grimes err(1, NULL); 7349c5cdfe0SPeter Wemm #if !defined(hp300) && !defined(mips) 7355a3391bfSAndrey A. Chernov if (nl[SCONS].n_type != 0) { 736dea673e9SRodney W. Grimes (void)printf("1 console\n"); 737dea673e9SRodney W. Grimes KGET(SCONS, *tty); 738dea673e9SRodney W. Grimes (void)printf(hdr); 739dea673e9SRodney W. Grimes ttyprt(&tty[0], 0); 7405a3391bfSAndrey A. Chernov } 741dea673e9SRodney W. Grimes #endif 742dea673e9SRodney W. Grimes #ifdef vax 743dea673e9SRodney W. Grimes if (nl[SNQD].n_type != 0) 744dea673e9SRodney W. Grimes qdss(); 745dea673e9SRodney W. Grimes if (nl[SNDZ].n_type != 0) 746a9aa8c37SPeter Wemm ttytype(tty, "dz", SDZ, SNDZ, 0); 747dea673e9SRodney W. Grimes if (nl[SNDH].n_type != 0) 748a9aa8c37SPeter Wemm ttytype(tty, "dh", SDH, SNDH, 0); 749dea673e9SRodney W. Grimes if (nl[SNDMF].n_type != 0) 750a9aa8c37SPeter Wemm ttytype(tty, "dmf", SDMF, SNDMF, 0); 751dea673e9SRodney W. Grimes if (nl[SNDHU].n_type != 0) 752a9aa8c37SPeter Wemm ttytype(tty, "dhu", SDHU, SNDHU, 0); 753dea673e9SRodney W. Grimes if (nl[SNDMZ].n_type != 0) 754a9aa8c37SPeter Wemm ttytype(tty, "dmz", SDMZ, SNDMZ, 0); 755dea673e9SRodney W. Grimes #endif 756dea673e9SRodney W. Grimes #ifdef tahoe 757dea673e9SRodney W. Grimes if (nl[SNVX].n_type != 0) 758a9aa8c37SPeter Wemm ttytype(tty, "vx", SVX, SNVX, 0); 759dea673e9SRodney W. Grimes if (nl[SNMP].n_type != 0) 760a9aa8c37SPeter Wemm ttytype(tty, "mp", SMP, SNMP, 0); 761dea673e9SRodney W. Grimes #endif 762dea673e9SRodney W. Grimes #ifdef hp300 763dea673e9SRodney W. Grimes if (nl[SNITE].n_type != 0) 764a9aa8c37SPeter Wemm ttytype(tty, "ite", SITE, SNITE, 0); 765dea673e9SRodney W. Grimes if (nl[SNDCA].n_type != 0) 766a9aa8c37SPeter Wemm ttytype(tty, "dca", SDCA, SNDCA, 0); 767dea673e9SRodney W. Grimes if (nl[SNDCM].n_type != 0) 768a9aa8c37SPeter Wemm ttytype(tty, "dcm", SDCM, SNDCM, 0); 769dea673e9SRodney W. Grimes if (nl[SNDCL].n_type != 0) 770a9aa8c37SPeter Wemm ttytype(tty, "dcl", SDCL, SNDCL, 0); 771dea673e9SRodney W. Grimes #endif 772dea673e9SRodney W. Grimes #ifdef mips 773dea673e9SRodney W. Grimes if (nl[SNDC].n_type != 0) 774a9aa8c37SPeter Wemm ttytype(tty, "dc", SDC, SNDC, 0); 775dea673e9SRodney W. Grimes #endif 7765a3391bfSAndrey A. Chernov #ifdef __FreeBSD__ 777de4c8be3SSøren Schmidt if (nl[NSCCONS].n_type != 0) 778a9aa8c37SPeter Wemm ttytype(tty, "vty", SCCONS, NSCCONS, 0); 77990300419SAndrey A. Chernov if (nl[NSIO].n_type != 0) 780a9aa8c37SPeter Wemm ttytype(tty, "sio", SIO, NSIO, 0); 78190300419SAndrey A. Chernov if (nl[NRC].n_type != 0) 782a9aa8c37SPeter Wemm ttytype(tty, "rc", RC, NRC, 0); 78324f769b0SBruce Evans if (nl[NCY].n_type != 0) 784a9aa8c37SPeter Wemm ttytype(tty, "cy", CY, NCY, 0); 785a9aa8c37SPeter Wemm if (nl[NSI].n_type != 0) 786a9aa8c37SPeter Wemm ttytype(tty, "si", SI, NSI, 1); 7875a3391bfSAndrey A. Chernov #endif 788dea673e9SRodney W. Grimes if (nl[SNPTY].n_type != 0) 789a9aa8c37SPeter Wemm ttytype(tty, "pty", SPTY, SNPTY, 0); 790dea673e9SRodney W. Grimes } 791dea673e9SRodney W. Grimes 792dea673e9SRodney W. Grimes void 793a9aa8c37SPeter Wemm ttytype(tty, name, type, number, indir) 7949c5cdfe0SPeter Wemm struct tty *tty; 795dea673e9SRodney W. Grimes char *name; 796a9aa8c37SPeter Wemm int type, number, indir; 797dea673e9SRodney W. Grimes { 7989c5cdfe0SPeter Wemm struct tty *tp; 799dea673e9SRodney W. Grimes int ntty; 800a9aa8c37SPeter Wemm struct tty **ttyaddr; 801dea673e9SRodney W. Grimes 802dea673e9SRodney W. Grimes if (tty == NULL) 803dea673e9SRodney W. Grimes return; 804dea673e9SRodney W. Grimes KGET(number, ntty); 805dea673e9SRodney W. Grimes (void)printf("%d %s %s\n", ntty, name, (ntty == 1) ? "line" : "lines"); 806dea673e9SRodney W. Grimes if (ntty > ttyspace) { 807dea673e9SRodney W. Grimes ttyspace = ntty; 808dea673e9SRodney W. Grimes if ((tty = realloc(tty, ttyspace * sizeof(*tty))) == 0) 809dea673e9SRodney W. Grimes err(1, NULL); 810dea673e9SRodney W. Grimes } 811a9aa8c37SPeter Wemm if (indir) { 812a9aa8c37SPeter Wemm KGET(type, ttyaddr); 813a9aa8c37SPeter Wemm KGET2(ttyaddr, tty, ntty * sizeof(struct tty), "tty structs"); 814a9aa8c37SPeter Wemm } else { 815dea673e9SRodney W. Grimes KGET1(type, tty, ntty * sizeof(struct tty), "tty structs"); 816a9aa8c37SPeter Wemm } 817dea673e9SRodney W. Grimes (void)printf(hdr); 818dea673e9SRodney W. Grimes for (tp = tty; tp < &tty[ntty]; tp++) 819dea673e9SRodney W. Grimes ttyprt(tp, tp - tty); 820dea673e9SRodney W. Grimes } 821dea673e9SRodney W. Grimes 822dea673e9SRodney W. Grimes struct { 823dea673e9SRodney W. Grimes int flag; 824dea673e9SRodney W. Grimes char val; 825dea673e9SRodney W. Grimes } ttystates[] = { 82624f769b0SBruce Evans #ifdef TS_WOPEN 827dea673e9SRodney W. Grimes { TS_WOPEN, 'W'}, 82824f769b0SBruce Evans #endif 829dea673e9SRodney W. Grimes { TS_ISOPEN, 'O'}, 830dea673e9SRodney W. Grimes { TS_CARR_ON, 'C'}, 83124f769b0SBruce Evans #ifdef TS_CONNECTED 83224f769b0SBruce Evans { TS_CONNECTED, 'c'}, 83324f769b0SBruce Evans #endif 834dea673e9SRodney W. Grimes { TS_TIMEOUT, 'T'}, 835dea673e9SRodney W. Grimes { TS_FLUSH, 'F'}, 836dea673e9SRodney W. Grimes { TS_BUSY, 'B'}, 83724f769b0SBruce Evans #ifdef TS_ASLEEP 838dea673e9SRodney W. Grimes { TS_ASLEEP, 'A'}, 83924f769b0SBruce Evans #endif 84024f769b0SBruce Evans #ifdef TS_SO_OLOWAT 84124f769b0SBruce Evans { TS_SO_OLOWAT, 'A'}, 84224f769b0SBruce Evans #endif 84324f769b0SBruce Evans #ifdef TS_SO_OCOMPLETE 84424f769b0SBruce Evans { TS_SO_OCOMPLETE, 'a'}, 84524f769b0SBruce Evans #endif 846dea673e9SRodney W. Grimes { TS_XCLUDE, 'X'}, 847dea673e9SRodney W. Grimes { TS_TTSTOP, 'S'}, 84824f769b0SBruce Evans #ifdef TS_CAR_OFLOW 84924f769b0SBruce Evans { TS_CAR_OFLOW, 'm'}, 85024f769b0SBruce Evans #endif 85124f769b0SBruce Evans #ifdef TS_CTS_OFLOW 85224f769b0SBruce Evans { TS_CTS_OFLOW, 'o'}, 85324f769b0SBruce Evans #endif 85424f769b0SBruce Evans #ifdef TS_DSR_OFLOW 85524f769b0SBruce Evans { TS_DSR_OFLOW, 'd'}, 85624f769b0SBruce Evans #endif 857dea673e9SRodney W. Grimes { TS_TBLOCK, 'K'}, 858dea673e9SRodney W. Grimes { TS_ASYNC, 'Y'}, 859dea673e9SRodney W. Grimes { TS_BKSL, 'D'}, 860dea673e9SRodney W. Grimes { TS_ERASE, 'E'}, 861dea673e9SRodney W. Grimes { TS_LNCH, 'L'}, 862dea673e9SRodney W. Grimes { TS_TYPEN, 'P'}, 863dea673e9SRodney W. Grimes { TS_CNTTB, 'N'}, 86424f769b0SBruce Evans #ifdef TS_CAN_BYPASS_L_RINT 865020531ceSAndrey A. Chernov { TS_CAN_BYPASS_L_RINT, 'l'}, 866020531ceSAndrey A. Chernov #endif 86724f769b0SBruce Evans #ifdef TS_SNOOP 86824f769b0SBruce Evans { TS_SNOOP, 's'}, 86924f769b0SBruce Evans #endif 87024f769b0SBruce Evans #ifdef TS_ZOMBIE 87124f769b0SBruce Evans { TS_ZOMBIE, 'Z'}, 87224f769b0SBruce Evans #endif 873dea673e9SRodney W. Grimes { 0, '\0'}, 874dea673e9SRodney W. Grimes }; 875dea673e9SRodney W. Grimes 876dea673e9SRodney W. Grimes void 877dea673e9SRodney W. Grimes ttyprt(tp, line) 8789c5cdfe0SPeter Wemm struct tty *tp; 879dea673e9SRodney W. Grimes int line; 880dea673e9SRodney W. Grimes { 8819c5cdfe0SPeter Wemm int i, j; 882dea673e9SRodney W. Grimes pid_t pgid; 883dea673e9SRodney W. Grimes char *name, state[20]; 884dea673e9SRodney W. Grimes 885dea673e9SRodney W. Grimes if (usenumflag || tp->t_dev == 0 || 886dea673e9SRodney W. Grimes (name = devname(tp->t_dev, S_IFCHR)) == NULL) 887dea673e9SRodney W. Grimes (void)printf("%7d ", line); 888dea673e9SRodney W. Grimes else 889dea673e9SRodney W. Grimes (void)printf("%7s ", name); 890dea673e9SRodney W. Grimes (void)printf("%2d %3d ", tp->t_rawq.c_cc, tp->t_canq.c_cc); 8915a3391bfSAndrey A. Chernov (void)printf("%3d %4d %3d %7d ", tp->t_outq.c_cc, 892dea673e9SRodney W. Grimes tp->t_hiwat, tp->t_lowat, tp->t_column); 893dea673e9SRodney W. Grimes for (i = j = 0; ttystates[i].flag; i++) 894dea673e9SRodney W. Grimes if (tp->t_state&ttystates[i].flag) 895dea673e9SRodney W. Grimes state[j++] = ttystates[i].val; 896dea673e9SRodney W. Grimes if (j == 0) 897dea673e9SRodney W. Grimes state[j++] = '-'; 898dea673e9SRodney W. Grimes state[j] = '\0'; 8999c5cdfe0SPeter Wemm (void)printf("%-6s %8x", state, (u_long)tp->t_session); 900dea673e9SRodney W. Grimes pgid = 0; 901dea673e9SRodney W. Grimes if (tp->t_pgrp != NULL) 902dea673e9SRodney W. Grimes KGET2(&tp->t_pgrp->pg_id, &pgid, sizeof(pid_t), "pgid"); 903dea673e9SRodney W. Grimes (void)printf("%6d ", pgid); 904dea673e9SRodney W. Grimes switch (tp->t_line) { 905dea673e9SRodney W. Grimes case TTYDISC: 906dea673e9SRodney W. Grimes (void)printf("term\n"); 907dea673e9SRodney W. Grimes break; 90890300419SAndrey A. Chernov case NTTYDISC: 90990300419SAndrey A. Chernov (void)printf("ntty\n"); 91090300419SAndrey A. Chernov break; 911dea673e9SRodney W. Grimes case TABLDISC: 912dea673e9SRodney W. Grimes (void)printf("tab\n"); 913dea673e9SRodney W. Grimes break; 914dea673e9SRodney W. Grimes case SLIPDISC: 915dea673e9SRodney W. Grimes (void)printf("slip\n"); 916dea673e9SRodney W. Grimes break; 91790300419SAndrey A. Chernov case PPPDISC: 91890300419SAndrey A. Chernov (void)printf("ppp\n"); 91990300419SAndrey A. Chernov break; 920dea673e9SRodney W. Grimes default: 921dea673e9SRodney W. Grimes (void)printf("%d\n", tp->t_line); 922dea673e9SRodney W. Grimes break; 923dea673e9SRodney W. Grimes } 924dea673e9SRodney W. Grimes } 925dea673e9SRodney W. Grimes 926dea673e9SRodney W. Grimes void 927dea673e9SRodney W. Grimes filemode() 928dea673e9SRodney W. Grimes { 9299c5cdfe0SPeter Wemm struct file *fp; 930dea673e9SRodney W. Grimes struct file *addr; 931dea673e9SRodney W. Grimes char *buf, flagbuf[16], *fbp; 932dea673e9SRodney W. Grimes int len, maxfile, nfile; 933dea673e9SRodney W. Grimes static char *dtypes[] = { "???", "inode", "socket" }; 934dea673e9SRodney W. Grimes 935dea673e9SRodney W. Grimes KGET(FNL_MAXFILE, maxfile); 936dea673e9SRodney W. Grimes if (totalflag) { 937dea673e9SRodney W. Grimes KGET(FNL_NFILE, nfile); 938dea673e9SRodney W. Grimes (void)printf("%3d/%3d files\n", nfile, maxfile); 939dea673e9SRodney W. Grimes return; 940dea673e9SRodney W. Grimes } 941dea673e9SRodney W. Grimes if (getfiles(&buf, &len) == -1) 942dea673e9SRodney W. Grimes return; 943dea673e9SRodney W. Grimes /* 944dea673e9SRodney W. Grimes * Getfiles returns in malloc'd memory a pointer to the first file 945dea673e9SRodney W. Grimes * structure, and then an array of file structs (whose addresses are 946dea673e9SRodney W. Grimes * derivable from the previous entry). 947dea673e9SRodney W. Grimes */ 94898d69008SJeffrey Hsu addr = ((struct filelist *)buf)->lh_first; 94998d69008SJeffrey Hsu fp = (struct file *)(buf + sizeof(struct filelist)); 95098d69008SJeffrey Hsu nfile = (len - sizeof(struct filelist)) / sizeof(struct file); 951dea673e9SRodney W. Grimes 952dea673e9SRodney W. Grimes (void)printf("%d/%d open files\n", nfile, maxfile); 953dea673e9SRodney W. Grimes (void)printf(" LOC TYPE FLG CNT MSG DATA OFFSET\n"); 95498d69008SJeffrey Hsu for (; (char *)fp < buf + len; addr = fp->f_list.le_next, fp++) { 955dea673e9SRodney W. Grimes if ((unsigned)fp->f_type > DTYPE_SOCKET) 956dea673e9SRodney W. Grimes continue; 957dea673e9SRodney W. Grimes (void)printf("%x ", addr); 958dea673e9SRodney W. Grimes (void)printf("%-8.8s", dtypes[fp->f_type]); 959dea673e9SRodney W. Grimes fbp = flagbuf; 960dea673e9SRodney W. Grimes if (fp->f_flag & FREAD) 961dea673e9SRodney W. Grimes *fbp++ = 'R'; 962dea673e9SRodney W. Grimes if (fp->f_flag & FWRITE) 963dea673e9SRodney W. Grimes *fbp++ = 'W'; 964dea673e9SRodney W. Grimes if (fp->f_flag & FAPPEND) 965dea673e9SRodney W. Grimes *fbp++ = 'A'; 966dea673e9SRodney W. Grimes #ifdef FSHLOCK /* currently gone */ 967dea673e9SRodney W. Grimes if (fp->f_flag & FSHLOCK) 968dea673e9SRodney W. Grimes *fbp++ = 'S'; 969dea673e9SRodney W. Grimes if (fp->f_flag & FEXLOCK) 970dea673e9SRodney W. Grimes *fbp++ = 'X'; 971dea673e9SRodney W. Grimes #endif 972dea673e9SRodney W. Grimes if (fp->f_flag & FASYNC) 973dea673e9SRodney W. Grimes *fbp++ = 'I'; 974dea673e9SRodney W. Grimes *fbp = '\0'; 975dea673e9SRodney W. Grimes (void)printf("%6s %3d", flagbuf, fp->f_count); 976dea673e9SRodney W. Grimes (void)printf(" %3d", fp->f_msgcount); 977dea673e9SRodney W. Grimes (void)printf(" %8.1x", fp->f_data); 978dea673e9SRodney W. Grimes if (fp->f_offset < 0) 979dea673e9SRodney W. Grimes (void)printf(" %qx\n", fp->f_offset); 980dea673e9SRodney W. Grimes else 981dea673e9SRodney W. Grimes (void)printf(" %qd\n", fp->f_offset); 982dea673e9SRodney W. Grimes } 983dea673e9SRodney W. Grimes free(buf); 984dea673e9SRodney W. Grimes } 985dea673e9SRodney W. Grimes 986dea673e9SRodney W. Grimes int 987dea673e9SRodney W. Grimes getfiles(abuf, alen) 988dea673e9SRodney W. Grimes char **abuf; 989dea673e9SRodney W. Grimes int *alen; 990dea673e9SRodney W. Grimes { 991dea673e9SRodney W. Grimes size_t len; 992dea673e9SRodney W. Grimes int mib[2]; 993dea673e9SRodney W. Grimes char *buf; 994dea673e9SRodney W. Grimes 995dea673e9SRodney W. Grimes /* 996dea673e9SRodney W. Grimes * XXX 997dea673e9SRodney W. Grimes * Add emulation of KINFO_FILE here. 998dea673e9SRodney W. Grimes */ 999dea673e9SRodney W. Grimes if (memf != NULL) 1000dea673e9SRodney W. Grimes errx(1, "files on dead kernel, not implemented\n"); 1001dea673e9SRodney W. Grimes 1002dea673e9SRodney W. Grimes mib[0] = CTL_KERN; 1003dea673e9SRodney W. Grimes mib[1] = KERN_FILE; 1004dea673e9SRodney W. Grimes if (sysctl(mib, 2, NULL, &len, NULL, 0) == -1) { 1005dea673e9SRodney W. Grimes warn("sysctl: KERN_FILE"); 1006dea673e9SRodney W. Grimes return (-1); 1007dea673e9SRodney W. Grimes } 1008dea673e9SRodney W. Grimes if ((buf = malloc(len)) == NULL) 1009dea673e9SRodney W. Grimes err(1, NULL); 1010dea673e9SRodney W. Grimes if (sysctl(mib, 2, buf, &len, NULL, 0) == -1) { 1011dea673e9SRodney W. Grimes warn("sysctl: KERN_FILE"); 1012dea673e9SRodney W. Grimes return (-1); 1013dea673e9SRodney W. Grimes } 1014dea673e9SRodney W. Grimes *abuf = buf; 1015dea673e9SRodney W. Grimes *alen = len; 1016dea673e9SRodney W. Grimes return (0); 1017dea673e9SRodney W. Grimes } 1018dea673e9SRodney W. Grimes 1019dea673e9SRodney W. Grimes /* 1020dea673e9SRodney W. Grimes * swapmode is based on a program called swapinfo written 1021dea673e9SRodney W. Grimes * by Kevin Lahey <kml@rokkaku.atl.ga.us>. 1022dea673e9SRodney W. Grimes */ 1023dea673e9SRodney W. Grimes void 1024dea673e9SRodney W. Grimes swapmode() 1025dea673e9SRodney W. Grimes { 10269c5cdfe0SPeter Wemm char *header, *p; 10271cb2c626SDavid Greenman int hlen, nswap, nswdev, dmmax; 1028e96c5424SDavid Greenman int i, div, avail, nfree, npfree, used; 1029dea673e9SRodney W. Grimes struct swdevt *sw; 1030dea673e9SRodney W. Grimes long blocksize, *perdev; 10311cb2c626SDavid Greenman struct rlist head; 1032739a189aSJohn Dyson struct rlisthdr swaplist; 1033739a189aSJohn Dyson struct rlist *swapptr; 10341295400eSDavid Greenman u_long ptr; 1035dea673e9SRodney W. Grimes 1036dea673e9SRodney W. Grimes KGET(VM_NSWAP, nswap); 1037dea673e9SRodney W. Grimes KGET(VM_NSWDEV, nswdev); 1038dea673e9SRodney W. Grimes KGET(VM_DMMAX, dmmax); 1039739a189aSJohn Dyson KGET1(VM_SWAPLIST, &swaplist, sizeof swaplist, "swaplist"); 1040dea673e9SRodney W. Grimes if ((sw = malloc(nswdev * sizeof(*sw))) == NULL || 10411cb2c626SDavid Greenman (perdev = malloc(nswdev * sizeof(*perdev))) == NULL) 1042dea673e9SRodney W. Grimes err(1, "malloc"); 10431295400eSDavid Greenman KGET1(VM_SWDEVT, &ptr, sizeof ptr, "swdevt"); 10441295400eSDavid Greenman KGET2(ptr, sw, nswdev * sizeof(*sw), "*swdevt"); 1045dea673e9SRodney W. Grimes 1046dea673e9SRodney W. Grimes /* Count up swap space. */ 1047dea673e9SRodney W. Grimes nfree = 0; 1048dea673e9SRodney W. Grimes memset(perdev, 0, nswdev * sizeof(*perdev)); 1049739a189aSJohn Dyson swapptr = swaplist.rlh_list; 1050739a189aSJohn Dyson while (swapptr) { 10511cb2c626SDavid Greenman int top, bottom, next_block; 10521cb2c626SDavid Greenman 1053739a189aSJohn Dyson KGET2(swapptr, &head, sizeof(struct rlist), "swapptr"); 10541cb2c626SDavid Greenman 10551cb2c626SDavid Greenman top = head.rl_end; 10561cb2c626SDavid Greenman bottom = head.rl_start; 10571cb2c626SDavid Greenman 10581cb2c626SDavid Greenman nfree += top - bottom + 1; 1059dea673e9SRodney W. Grimes 1060dea673e9SRodney W. Grimes /* 1061dea673e9SRodney W. Grimes * Swap space is split up among the configured disks. 1062dea673e9SRodney W. Grimes * 1063dea673e9SRodney W. Grimes * For interleaved swap devices, the first dmmax blocks 1064dea673e9SRodney W. Grimes * of swap space some from the first disk, the next dmmax 10651cb2c626SDavid Greenman * blocks from the next, and so on up to nswap blocks. 1066dea673e9SRodney W. Grimes * 1067dea673e9SRodney W. Grimes * The list of free space joins adjacent free blocks, 1068dea673e9SRodney W. Grimes * ignoring device boundries. If we want to keep track 1069dea673e9SRodney W. Grimes * of this information per device, we'll just have to 10701cb2c626SDavid Greenman * extract it ourselves. 1071dea673e9SRodney W. Grimes */ 10721cb2c626SDavid Greenman while (top / dmmax != bottom / dmmax) { 10731cb2c626SDavid Greenman next_block = ((bottom + dmmax) / dmmax); 10741cb2c626SDavid Greenman perdev[(bottom / dmmax) % nswdev] += 10751cb2c626SDavid Greenman next_block * dmmax - bottom; 10761cb2c626SDavid Greenman bottom = next_block * dmmax; 10771cb2c626SDavid Greenman } 10781cb2c626SDavid Greenman perdev[(bottom / dmmax) % nswdev] += 10791cb2c626SDavid Greenman top - bottom + 1; 1080dea673e9SRodney W. Grimes 1081739a189aSJohn Dyson swapptr = head.rl_next; 1082dea673e9SRodney W. Grimes } 1083dea673e9SRodney W. Grimes 1084dea673e9SRodney W. Grimes header = getbsize(&hlen, &blocksize); 1085dea673e9SRodney W. Grimes if (!totalflag) 1086dea673e9SRodney W. Grimes (void)printf("%-11s %*s %8s %8s %8s %s\n", 1087dea673e9SRodney W. Grimes "Device", hlen, header, 1088dea673e9SRodney W. Grimes "Used", "Avail", "Capacity", "Type"); 1089dea673e9SRodney W. Grimes div = blocksize / 512; 1090dea673e9SRodney W. Grimes avail = npfree = 0; 1091dea673e9SRodney W. Grimes for (i = 0; i < nswdev; i++) { 1092dea673e9SRodney W. Grimes int xsize, xfree; 1093dea673e9SRodney W. Grimes 109459392fe2SPoul-Henning Kamp /* 109559392fe2SPoul-Henning Kamp * Don't report statistics for partitions which have not 109659392fe2SPoul-Henning Kamp * yet been activated via swapon(8). 109759392fe2SPoul-Henning Kamp */ 109859392fe2SPoul-Henning Kamp if (!(sw[i].sw_flags & SW_FREED)) 109959392fe2SPoul-Henning Kamp continue; 110059392fe2SPoul-Henning Kamp 1101dea673e9SRodney W. Grimes if (!totalflag) 11029c5cdfe0SPeter Wemm if (sw[i].sw_dev != NODEV) { 11039c5cdfe0SPeter Wemm p = devname(sw[i].sw_dev, S_IFBLK); 1104dea673e9SRodney W. Grimes (void)printf("/dev/%-6s %*d ", 11059c5cdfe0SPeter Wemm p == NULL ? "??" : p, 1106dea673e9SRodney W. Grimes hlen, sw[i].sw_nblks / div); 11079c5cdfe0SPeter Wemm } else 110864e529eaSJoerg Wunsch (void)printf("[NFS swap] %*d ", 110964e529eaSJoerg Wunsch hlen, sw[i].sw_nblks / div); 1110dea673e9SRodney W. Grimes 11112df6483fSPoul-Henning Kamp /* The first dmmax is never allocated to avoid trashing of 11122df6483fSPoul-Henning Kamp * disklabels 11132df6483fSPoul-Henning Kamp */ 11142df6483fSPoul-Henning Kamp xsize = sw[i].sw_nblks - dmmax; 1115dea673e9SRodney W. Grimes xfree = perdev[i]; 1116dea673e9SRodney W. Grimes used = xsize - xfree; 1117dea673e9SRodney W. Grimes npfree++; 1118dea673e9SRodney W. Grimes avail += xsize; 1119dea673e9SRodney W. Grimes if (totalflag) 1120dea673e9SRodney W. Grimes continue; 1121dea673e9SRodney W. Grimes (void)printf("%8d %8d %5.0f%% %s\n", 1122dea673e9SRodney W. Grimes used / div, xfree / div, 1123dea673e9SRodney W. Grimes (double)used / (double)xsize * 100.0, 1124dea673e9SRodney W. Grimes (sw[i].sw_flags & SW_SEQUENTIAL) ? 1125dea673e9SRodney W. Grimes "Sequential" : "Interleaved"); 1126dea673e9SRodney W. Grimes } 1127dea673e9SRodney W. Grimes 1128dea673e9SRodney W. Grimes /* 1129dea673e9SRodney W. Grimes * If only one partition has been set up via swapon(8), we don't 1130dea673e9SRodney W. Grimes * need to bother with totals. 1131dea673e9SRodney W. Grimes */ 1132dea673e9SRodney W. Grimes used = avail - nfree; 1133fb59e630SJordan K. Hubbard free(sw); 1134fb59e630SJordan K. Hubbard free(perdev); 1135dea673e9SRodney W. Grimes if (totalflag) { 1136dea673e9SRodney W. Grimes (void)printf("%dM/%dM swap space\n", used / 2048, avail / 2048); 1137dea673e9SRodney W. Grimes return; 1138dea673e9SRodney W. Grimes } 1139dea673e9SRodney W. Grimes if (npfree > 1) { 1140dea673e9SRodney W. Grimes (void)printf("%-11s %*d %8d %8d %5.0f%%\n", 1141dea673e9SRodney W. Grimes "Total", hlen, avail / div, used / div, nfree / div, 1142dea673e9SRodney W. Grimes (double)used / (double)avail * 100.0); 1143dea673e9SRodney W. Grimes } 1144dea673e9SRodney W. Grimes } 1145