1dea673e9SRodney W. Grimes /*- 2dea673e9SRodney W. Grimes * Copyright (c) 1980, 1991, 1993 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[] = 36dea673e9SRodney W. Grimes "@(#) Copyright (c) 1980, 1991, 1993\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 41dea673e9SRodney W. Grimes static char sccsid[] = "@(#)pstat.c 8.9 (Berkeley) 2/16/94"; 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 55dea673e9SRodney W. Grimes #undef KERNEL 56dea673e9SRodney W. Grimes #include <sys/stat.h> 57dea673e9SRodney W. Grimes #include <nfs/nfsnode.h> 58dea673e9SRodney W. Grimes #include <sys/ioctl.h> 5990300419SAndrey A. Chernov #include <sys/ioctl_compat.h> /* XXX NTTYDISC is too well hidden */ 60dea673e9SRodney W. Grimes #include <sys/tty.h> 61dea673e9SRodney W. Grimes #include <sys/conf.h> 628d7547c2SDavid Greenman #include <sys/rlist.h> 63dea673e9SRodney W. Grimes 64dea673e9SRodney W. Grimes #include <sys/sysctl.h> 65dea673e9SRodney W. Grimes 66dea673e9SRodney W. Grimes #include <err.h> 67dea673e9SRodney W. Grimes #include <kvm.h> 68dea673e9SRodney W. Grimes #include <limits.h> 69dea673e9SRodney W. Grimes #include <nlist.h> 70dea673e9SRodney W. Grimes #include <stdio.h> 71dea673e9SRodney W. Grimes #include <stdlib.h> 72dea673e9SRodney W. Grimes #include <string.h> 73dea673e9SRodney W. Grimes #include <unistd.h> 74dea673e9SRodney W. Grimes 75dea673e9SRodney W. Grimes struct nlist nl[] = { 768d7547c2SDavid Greenman #define VM_SWAPLIST 0 778d7547c2SDavid Greenman { "_swaplist" },/* list of free swap areas */ 788d7547c2SDavid Greenman #define VM_SWDEVT 1 79dea673e9SRodney W. Grimes { "_swdevt" }, /* list of swap devices and sizes */ 808d7547c2SDavid Greenman #define VM_NSWAP 2 81dea673e9SRodney W. Grimes { "_nswap" }, /* size of largest swap device */ 828d7547c2SDavid Greenman #define VM_NSWDEV 3 83dea673e9SRodney W. Grimes { "_nswdev" }, /* number of swap devices */ 848d7547c2SDavid Greenman #define VM_DMMAX 4 85dea673e9SRodney W. Grimes { "_dmmax" }, /* maximum size of a swap block */ 868d7547c2SDavid Greenman #define V_MOUNTLIST 5 87dea673e9SRodney W. Grimes { "_mountlist" }, /* address of head of mount list. */ 888d7547c2SDavid Greenman #define V_NUMV 6 89dea673e9SRodney W. Grimes { "_numvnodes" }, 908d7547c2SDavid Greenman #define FNL_NFILE 7 91dea673e9SRodney W. Grimes {"_nfiles"}, 928d7547c2SDavid Greenman #define FNL_MAXFILE 8 93dea673e9SRodney W. Grimes {"_maxfiles"}, 94dea673e9SRodney W. Grimes #define NLMANDATORY FNL_MAXFILE /* names up to here are mandatory */ 951cb2c626SDavid Greenman #define SCONS NLMANDATORY + 1 96dea673e9SRodney W. Grimes { "_cons" }, 971cb2c626SDavid Greenman #define SPTY NLMANDATORY + 2 98dea673e9SRodney W. Grimes { "_pt_tty" }, 991cb2c626SDavid Greenman #define SNPTY NLMANDATORY + 3 100dea673e9SRodney W. Grimes { "_npty" }, 101dea673e9SRodney W. Grimes 102dea673e9SRodney W. Grimes #ifdef hp300 103dea673e9SRodney W. Grimes #define SDCA (SNPTY+1) 104dea673e9SRodney W. Grimes { "_dca_tty" }, 105dea673e9SRodney W. Grimes #define SNDCA (SNPTY+2) 106dea673e9SRodney W. Grimes { "_ndca" }, 107dea673e9SRodney W. Grimes #define SDCM (SNPTY+3) 108dea673e9SRodney W. Grimes { "_dcm_tty" }, 109dea673e9SRodney W. Grimes #define SNDCM (SNPTY+4) 110dea673e9SRodney W. Grimes { "_ndcm" }, 111dea673e9SRodney W. Grimes #define SDCL (SNPTY+5) 112dea673e9SRodney W. Grimes { "_dcl_tty" }, 113dea673e9SRodney W. Grimes #define SNDCL (SNPTY+6) 114dea673e9SRodney W. Grimes { "_ndcl" }, 115dea673e9SRodney W. Grimes #define SITE (SNPTY+7) 116dea673e9SRodney W. Grimes { "_ite_tty" }, 117dea673e9SRodney W. Grimes #define SNITE (SNPTY+8) 118dea673e9SRodney W. Grimes { "_nite" }, 119dea673e9SRodney W. Grimes #endif 120dea673e9SRodney W. Grimes 121dea673e9SRodney W. Grimes #ifdef mips 122dea673e9SRodney W. Grimes #define SDC (SNPTY+1) 123dea673e9SRodney W. Grimes { "_dc_tty" }, 124dea673e9SRodney W. Grimes #define SNDC (SNPTY+2) 125dea673e9SRodney W. Grimes { "_dc_cnt" }, 126dea673e9SRodney W. Grimes #endif 127dea673e9SRodney W. Grimes 1285a3391bfSAndrey A. Chernov #ifdef __FreeBSD__ 129de4c8be3SSøren Schmidt #define SCCONS (SNPTY+1) 130de4c8be3SSøren Schmidt { "_sccons" }, 131de4c8be3SSøren Schmidt #define NSCCONS (SNPTY+2) 132de4c8be3SSøren Schmidt { "_nsccons" }, 13390300419SAndrey A. Chernov #define SIO (SNPTY+3) 13490300419SAndrey A. Chernov { "_sio_tty" }, 13590300419SAndrey A. Chernov #define NSIO (SNPTY+4) 13690300419SAndrey A. Chernov { "_nsio_tty" }, 13790300419SAndrey A. Chernov #define RC (SNPTY+5) 13890300419SAndrey A. Chernov { "_rc_tty" }, 13990300419SAndrey A. Chernov #define NRC (SNPTY+6) 14090300419SAndrey A. Chernov { "_nrc_tty" }, 1415a3391bfSAndrey A. Chernov #endif 142dea673e9SRodney W. Grimes { "" } 143dea673e9SRodney W. Grimes }; 144dea673e9SRodney W. Grimes 145dea673e9SRodney W. Grimes int usenumflag; 146dea673e9SRodney W. Grimes int totalflag; 147dea673e9SRodney W. Grimes char *nlistf = NULL; 148dea673e9SRodney W. Grimes char *memf = NULL; 149dea673e9SRodney W. Grimes kvm_t *kd; 150dea673e9SRodney W. Grimes 15159392fe2SPoul-Henning Kamp char *usage; 15259392fe2SPoul-Henning Kamp 153dea673e9SRodney W. Grimes #define SVAR(var) __STRING(var) /* to force expansion */ 154dea673e9SRodney W. Grimes #define KGET(idx, var) \ 155dea673e9SRodney W. Grimes KGET1(idx, &var, sizeof(var), SVAR(var)) 156dea673e9SRodney W. Grimes #define KGET1(idx, p, s, msg) \ 157dea673e9SRodney W. Grimes KGET2(nl[idx].n_value, p, s, msg) 158dea673e9SRodney W. Grimes #define KGET2(addr, p, s, msg) \ 159dea673e9SRodney W. Grimes if (kvm_read(kd, (u_long)(addr), p, s) != s) \ 160dea673e9SRodney W. Grimes warnx("cannot read %s: %s", msg, kvm_geterr(kd)) 161dea673e9SRodney W. Grimes #define KGETRET(addr, p, s, msg) \ 162dea673e9SRodney W. Grimes if (kvm_read(kd, (u_long)(addr), p, s) != s) { \ 163dea673e9SRodney W. Grimes warnx("cannot read %s: %s", msg, kvm_geterr(kd)); \ 164dea673e9SRodney W. Grimes return (0); \ 165dea673e9SRodney W. Grimes } 166dea673e9SRodney W. Grimes 167dea673e9SRodney W. Grimes void filemode __P((void)); 168dea673e9SRodney W. Grimes int getfiles __P((char **, int *)); 169dea673e9SRodney W. Grimes struct mount * 170dea673e9SRodney W. Grimes getmnt __P((struct mount *)); 171dea673e9SRodney W. Grimes struct e_vnode * 172dea673e9SRodney W. Grimes kinfo_vnodes __P((int *)); 173dea673e9SRodney W. Grimes struct e_vnode * 174dea673e9SRodney W. Grimes loadvnodes __P((int *)); 175dea673e9SRodney W. Grimes void mount_print __P((struct mount *)); 176dea673e9SRodney W. Grimes void nfs_header __P((void)); 177dea673e9SRodney W. Grimes int nfs_print __P((struct vnode *)); 178dea673e9SRodney W. Grimes void swapmode __P((void)); 179dea673e9SRodney W. Grimes void ttymode __P((void)); 180dea673e9SRodney W. Grimes void ttyprt __P((struct tty *, int)); 181dea673e9SRodney W. Grimes void ttytype __P((struct tty *, char *, int, int)); 182dea673e9SRodney W. Grimes void ufs_header __P((void)); 183dea673e9SRodney W. Grimes int ufs_print __P((struct vnode *)); 184dea673e9SRodney W. Grimes void vnode_header __P((void)); 185dea673e9SRodney W. Grimes void vnode_print __P((struct vnode *, struct vnode *)); 186dea673e9SRodney W. Grimes void vnodemode __P((void)); 187dea673e9SRodney W. Grimes 188dea673e9SRodney W. Grimes int 189dea673e9SRodney W. Grimes main(argc, argv) 190dea673e9SRodney W. Grimes int argc; 191dea673e9SRodney W. Grimes char *argv[]; 192dea673e9SRodney W. Grimes { 193dea673e9SRodney W. Grimes extern char *optarg; 194dea673e9SRodney W. Grimes extern int optind; 195dea673e9SRodney W. Grimes int ch, i, quit, ret; 196dea673e9SRodney W. Grimes int fileflag, swapflag, ttyflag, vnodeflag; 19759392fe2SPoul-Henning Kamp char buf[_POSIX2_LINE_MAX],*opts; 198dea673e9SRodney W. Grimes 199dea673e9SRodney W. Grimes fileflag = swapflag = ttyflag = vnodeflag = 0; 20059392fe2SPoul-Henning Kamp 20159392fe2SPoul-Henning Kamp /* We will behave like good old swapinfo if thus invoked */ 20259392fe2SPoul-Henning Kamp opts = strrchr(argv[0],'/'); 20359392fe2SPoul-Henning Kamp if (opts) 20459392fe2SPoul-Henning Kamp opts++; 20559392fe2SPoul-Henning Kamp else 20659392fe2SPoul-Henning Kamp opts = argv[0]; 20759392fe2SPoul-Henning Kamp if (!strcmp(opts,"swapinfo")) { 20859392fe2SPoul-Henning Kamp swapflag = 1; 20959392fe2SPoul-Henning Kamp opts = "k"; 21059392fe2SPoul-Henning Kamp usage = "usage: swapinfo [-k] [-M core] [-N system]\n"; 21159392fe2SPoul-Henning Kamp } else { 21259392fe2SPoul-Henning Kamp opts = "TM:N:fiknstv"; 21359392fe2SPoul-Henning Kamp usage = "usage: pstat [-Tfknstv] [-M core] [-N system]\n"; 21459392fe2SPoul-Henning Kamp } 21559392fe2SPoul-Henning Kamp 21659392fe2SPoul-Henning Kamp while ((ch = getopt(argc, argv, opts)) != EOF) 217dea673e9SRodney W. Grimes switch (ch) { 218dea673e9SRodney W. Grimes case 'f': 219dea673e9SRodney W. Grimes fileflag = 1; 220dea673e9SRodney W. Grimes break; 22159392fe2SPoul-Henning Kamp case 'k': 22259392fe2SPoul-Henning Kamp putenv("BLOCKSIZE=1K"); 22359392fe2SPoul-Henning Kamp break; 224dea673e9SRodney W. Grimes case 'M': 225dea673e9SRodney W. Grimes memf = optarg; 226dea673e9SRodney W. Grimes break; 227dea673e9SRodney W. Grimes case 'N': 228dea673e9SRodney W. Grimes nlistf = optarg; 229dea673e9SRodney W. Grimes break; 230dea673e9SRodney W. Grimes case 'n': 231dea673e9SRodney W. Grimes usenumflag = 1; 232dea673e9SRodney W. Grimes break; 233dea673e9SRodney W. Grimes case 's': 234dea673e9SRodney W. Grimes swapflag = 1; 235dea673e9SRodney W. Grimes break; 236dea673e9SRodney W. Grimes case 'T': 237dea673e9SRodney W. Grimes totalflag = 1; 238dea673e9SRodney W. Grimes break; 239dea673e9SRodney W. Grimes case 't': 240dea673e9SRodney W. Grimes ttyflag = 1; 241dea673e9SRodney W. Grimes break; 242dea673e9SRodney W. Grimes case 'v': 243dea673e9SRodney W. Grimes case 'i': /* Backward compatibility. */ 244dea673e9SRodney W. Grimes vnodeflag = 1; 245dea673e9SRodney W. Grimes break; 246dea673e9SRodney W. Grimes default: 24759392fe2SPoul-Henning Kamp (void)fprintf(stderr, usage); 24859392fe2SPoul-Henning Kamp exit(1); 249dea673e9SRodney W. Grimes } 250dea673e9SRodney W. Grimes argc -= optind; 251dea673e9SRodney W. Grimes argv += optind; 252dea673e9SRodney W. Grimes 253dea673e9SRodney W. Grimes /* 254dea673e9SRodney W. Grimes * Discard setgid privileges if not the running kernel so that bad 255dea673e9SRodney W. Grimes * guys can't print interesting stuff from kernel memory. 256dea673e9SRodney W. Grimes */ 257dea673e9SRodney W. Grimes if (nlistf != NULL || memf != NULL) 258dea673e9SRodney W. Grimes (void)setgid(getgid()); 259dea673e9SRodney W. Grimes 260dea673e9SRodney W. Grimes if ((kd = kvm_openfiles(nlistf, memf, NULL, O_RDONLY, buf)) == 0) 261dea673e9SRodney W. Grimes errx(1, "kvm_openfiles: %s", buf); 262dea673e9SRodney W. Grimes if ((ret = kvm_nlist(kd, nl)) != 0) { 263dea673e9SRodney W. Grimes if (ret == -1) 264dea673e9SRodney W. Grimes errx(1, "kvm_nlist: %s", kvm_geterr(kd)); 265dea673e9SRodney W. Grimes for (i = quit = 0; i <= NLMANDATORY; i++) 266dea673e9SRodney W. Grimes if (!nl[i].n_value) { 267dea673e9SRodney W. Grimes quit = 1; 268dea673e9SRodney W. Grimes warnx("undefined symbol: %s\n", nl[i].n_name); 269dea673e9SRodney W. Grimes } 270dea673e9SRodney W. Grimes if (quit) 271dea673e9SRodney W. Grimes exit(1); 272dea673e9SRodney W. Grimes } 27359392fe2SPoul-Henning Kamp if (!(fileflag | vnodeflag | ttyflag | swapflag | totalflag)) { 27459392fe2SPoul-Henning Kamp (void)fprintf(stderr, usage); 27559392fe2SPoul-Henning Kamp exit(1); 27659392fe2SPoul-Henning Kamp } 277dea673e9SRodney W. Grimes if (fileflag || totalflag) 278dea673e9SRodney W. Grimes filemode(); 279dea673e9SRodney W. Grimes if (vnodeflag || totalflag) 280dea673e9SRodney W. Grimes vnodemode(); 281dea673e9SRodney W. Grimes if (ttyflag) 282dea673e9SRodney W. Grimes ttymode(); 283dea673e9SRodney W. Grimes if (swapflag || totalflag) 284dea673e9SRodney W. Grimes swapmode(); 285dea673e9SRodney W. Grimes exit (0); 286dea673e9SRodney W. Grimes } 287dea673e9SRodney W. Grimes 288dea673e9SRodney W. Grimes struct e_vnode { 289dea673e9SRodney W. Grimes struct vnode *avnode; 290dea673e9SRodney W. Grimes struct vnode vnode; 291dea673e9SRodney W. Grimes }; 292dea673e9SRodney W. Grimes 293dea673e9SRodney W. Grimes void 294dea673e9SRodney W. Grimes vnodemode() 295dea673e9SRodney W. Grimes { 296dea673e9SRodney W. Grimes register struct e_vnode *e_vnodebase, *endvnode, *evp; 297dea673e9SRodney W. Grimes register struct vnode *vp; 298dea673e9SRodney W. Grimes register struct mount *maddr, *mp; 299dea673e9SRodney W. Grimes int numvnodes; 300dea673e9SRodney W. Grimes 301dea673e9SRodney W. Grimes e_vnodebase = loadvnodes(&numvnodes); 302dea673e9SRodney W. Grimes if (totalflag) { 303dea673e9SRodney W. Grimes (void)printf("%7d vnodes\n", numvnodes); 304dea673e9SRodney W. Grimes return; 305dea673e9SRodney W. Grimes } 306dea673e9SRodney W. Grimes endvnode = e_vnodebase + numvnodes; 307dea673e9SRodney W. Grimes (void)printf("%d active vnodes\n", numvnodes); 308dea673e9SRodney W. Grimes 309dea673e9SRodney W. Grimes 310dea673e9SRodney W. Grimes #define ST mp->mnt_stat 311dea673e9SRodney W. Grimes maddr = NULL; 312dea673e9SRodney W. Grimes for (evp = e_vnodebase; evp < endvnode; evp++) { 313dea673e9SRodney W. Grimes vp = &evp->vnode; 314dea673e9SRodney W. Grimes if (vp->v_mount != maddr) { 315dea673e9SRodney W. Grimes /* 316dea673e9SRodney W. Grimes * New filesystem 317dea673e9SRodney W. Grimes */ 318dea673e9SRodney W. Grimes if ((mp = getmnt(vp->v_mount)) == NULL) 319dea673e9SRodney W. Grimes continue; 320dea673e9SRodney W. Grimes maddr = vp->v_mount; 321dea673e9SRodney W. Grimes mount_print(mp); 322dea673e9SRodney W. Grimes vnode_header(); 323dea673e9SRodney W. Grimes switch(ST.f_type) { 324dea673e9SRodney W. Grimes case MOUNT_UFS: 325dea673e9SRodney W. Grimes case MOUNT_MFS: 326dea673e9SRodney W. Grimes ufs_header(); 327dea673e9SRodney W. Grimes break; 328dea673e9SRodney W. Grimes case MOUNT_NFS: 329dea673e9SRodney W. Grimes nfs_header(); 330dea673e9SRodney W. Grimes break; 331dea673e9SRodney W. Grimes case MOUNT_NONE: 332dea673e9SRodney W. Grimes case MOUNT_MSDOS: 333dea673e9SRodney W. Grimes default: 334dea673e9SRodney W. Grimes break; 335dea673e9SRodney W. Grimes } 336dea673e9SRodney W. Grimes (void)printf("\n"); 337dea673e9SRodney W. Grimes } 338dea673e9SRodney W. Grimes vnode_print(evp->avnode, vp); 339dea673e9SRodney W. Grimes switch(ST.f_type) { 340dea673e9SRodney W. Grimes case MOUNT_UFS: 341dea673e9SRodney W. Grimes case MOUNT_MFS: 342dea673e9SRodney W. Grimes ufs_print(vp); 343dea673e9SRodney W. Grimes break; 344dea673e9SRodney W. Grimes case MOUNT_NFS: 345dea673e9SRodney W. Grimes nfs_print(vp); 346dea673e9SRodney W. Grimes break; 347dea673e9SRodney W. Grimes case MOUNT_NONE: 348dea673e9SRodney W. Grimes case MOUNT_MSDOS: 349dea673e9SRodney W. Grimes default: 350dea673e9SRodney W. Grimes break; 351dea673e9SRodney W. Grimes } 352dea673e9SRodney W. Grimes (void)printf("\n"); 353dea673e9SRodney W. Grimes } 354dea673e9SRodney W. Grimes free(e_vnodebase); 355dea673e9SRodney W. Grimes } 356dea673e9SRodney W. Grimes 357dea673e9SRodney W. Grimes void 358dea673e9SRodney W. Grimes vnode_header() 359dea673e9SRodney W. Grimes { 360dea673e9SRodney W. Grimes (void)printf("ADDR TYP VFLAG USE HOLD"); 361dea673e9SRodney W. Grimes } 362dea673e9SRodney W. Grimes 363dea673e9SRodney W. Grimes void 364dea673e9SRodney W. Grimes vnode_print(avnode, vp) 365dea673e9SRodney W. Grimes struct vnode *avnode; 366dea673e9SRodney W. Grimes struct vnode *vp; 367dea673e9SRodney W. Grimes { 368dea673e9SRodney W. Grimes char *type, flags[16]; 369dea673e9SRodney W. Grimes char *fp = flags; 370dea673e9SRodney W. Grimes register int flag; 371dea673e9SRodney W. Grimes 372dea673e9SRodney W. Grimes /* 373dea673e9SRodney W. Grimes * set type 374dea673e9SRodney W. Grimes */ 375dea673e9SRodney W. Grimes switch(vp->v_type) { 376dea673e9SRodney W. Grimes case VNON: 377dea673e9SRodney W. Grimes type = "non"; break; 378dea673e9SRodney W. Grimes case VREG: 379dea673e9SRodney W. Grimes type = "reg"; break; 380dea673e9SRodney W. Grimes case VDIR: 381dea673e9SRodney W. Grimes type = "dir"; break; 382dea673e9SRodney W. Grimes case VBLK: 383dea673e9SRodney W. Grimes type = "blk"; break; 384dea673e9SRodney W. Grimes case VCHR: 385dea673e9SRodney W. Grimes type = "chr"; break; 386dea673e9SRodney W. Grimes case VLNK: 387dea673e9SRodney W. Grimes type = "lnk"; break; 388dea673e9SRodney W. Grimes case VSOCK: 389dea673e9SRodney W. Grimes type = "soc"; break; 390dea673e9SRodney W. Grimes case VFIFO: 391dea673e9SRodney W. Grimes type = "fif"; break; 392dea673e9SRodney W. Grimes case VBAD: 393dea673e9SRodney W. Grimes type = "bad"; break; 394dea673e9SRodney W. Grimes default: 395dea673e9SRodney W. Grimes type = "unk"; break; 396dea673e9SRodney W. Grimes } 397dea673e9SRodney W. Grimes /* 398dea673e9SRodney W. Grimes * gather flags 399dea673e9SRodney W. Grimes */ 400dea673e9SRodney W. Grimes flag = vp->v_flag; 401dea673e9SRodney W. Grimes if (flag & VROOT) 402dea673e9SRodney W. Grimes *fp++ = 'R'; 403dea673e9SRodney W. Grimes if (flag & VTEXT) 404dea673e9SRodney W. Grimes *fp++ = 'T'; 405dea673e9SRodney W. Grimes if (flag & VSYSTEM) 406dea673e9SRodney W. Grimes *fp++ = 'S'; 407dea673e9SRodney W. Grimes if (flag & VXLOCK) 408dea673e9SRodney W. Grimes *fp++ = 'L'; 409dea673e9SRodney W. Grimes if (flag & VXWANT) 410dea673e9SRodney W. Grimes *fp++ = 'W'; 411dea673e9SRodney W. Grimes if (flag & VBWAIT) 412dea673e9SRodney W. Grimes *fp++ = 'B'; 413dea673e9SRodney W. Grimes if (flag & VALIASED) 414dea673e9SRodney W. Grimes *fp++ = 'A'; 415dea673e9SRodney W. Grimes if (flag == 0) 416dea673e9SRodney W. Grimes *fp++ = '-'; 417dea673e9SRodney W. Grimes *fp = '\0'; 418dea673e9SRodney W. Grimes (void)printf("%8x %s %5s %4d %4d", 419dea673e9SRodney W. Grimes avnode, type, flags, vp->v_usecount, vp->v_holdcnt); 420dea673e9SRodney W. Grimes } 421dea673e9SRodney W. Grimes 422dea673e9SRodney W. Grimes void 423dea673e9SRodney W. Grimes ufs_header() 424dea673e9SRodney W. Grimes { 425dea673e9SRodney W. Grimes (void)printf(" FILEID IFLAG RDEV|SZ"); 426dea673e9SRodney W. Grimes } 427dea673e9SRodney W. Grimes 428dea673e9SRodney W. Grimes int 429dea673e9SRodney W. Grimes ufs_print(vp) 430dea673e9SRodney W. Grimes struct vnode *vp; 431dea673e9SRodney W. Grimes { 432dea673e9SRodney W. Grimes register int flag; 433dea673e9SRodney W. Grimes struct inode inode, *ip = &inode; 434dea673e9SRodney W. Grimes char flagbuf[16], *flags = flagbuf; 435dea673e9SRodney W. Grimes char *name; 436dea673e9SRodney W. Grimes mode_t type; 437dea673e9SRodney W. Grimes 438dea673e9SRodney W. Grimes KGETRET(VTOI(vp), &inode, sizeof(struct inode), "vnode's inode"); 439dea673e9SRodney W. Grimes flag = ip->i_flag; 440dea673e9SRodney W. Grimes if (flag & IN_LOCKED) 441dea673e9SRodney W. Grimes *flags++ = 'L'; 442dea673e9SRodney W. Grimes if (flag & IN_WANTED) 443dea673e9SRodney W. Grimes *flags++ = 'W'; 444dea673e9SRodney W. Grimes if (flag & IN_RENAME) 445dea673e9SRodney W. Grimes *flags++ = 'R'; 446dea673e9SRodney W. Grimes if (flag & IN_UPDATE) 447dea673e9SRodney W. Grimes *flags++ = 'U'; 448dea673e9SRodney W. Grimes if (flag & IN_ACCESS) 449dea673e9SRodney W. Grimes *flags++ = 'A'; 450dea673e9SRodney W. Grimes if (flag & IN_CHANGE) 451dea673e9SRodney W. Grimes *flags++ = 'C'; 452dea673e9SRodney W. Grimes if (flag & IN_MODIFIED) 453dea673e9SRodney W. Grimes *flags++ = 'M'; 454dea673e9SRodney W. Grimes if (flag & IN_SHLOCK) 455dea673e9SRodney W. Grimes *flags++ = 'S'; 456dea673e9SRodney W. Grimes if (flag & IN_EXLOCK) 457dea673e9SRodney W. Grimes *flags++ = 'E'; 458dea673e9SRodney W. Grimes if (flag & IN_LWAIT) 459dea673e9SRodney W. Grimes *flags++ = 'Z'; 460dea673e9SRodney W. Grimes if (flag == 0) 461dea673e9SRodney W. Grimes *flags++ = '-'; 462dea673e9SRodney W. Grimes *flags = '\0'; 463dea673e9SRodney W. Grimes 464dea673e9SRodney W. Grimes (void)printf(" %6d %5s", ip->i_number, flagbuf); 465dea673e9SRodney W. Grimes type = ip->i_mode & S_IFMT; 466dea673e9SRodney W. Grimes if (S_ISCHR(ip->i_mode) || S_ISBLK(ip->i_mode)) 467dea673e9SRodney W. Grimes if (usenumflag || ((name = devname(ip->i_rdev, type)) == NULL)) 468dea673e9SRodney W. Grimes (void)printf(" %2d,%-2d", 469dea673e9SRodney W. Grimes major(ip->i_rdev), minor(ip->i_rdev)); 470dea673e9SRodney W. Grimes else 471dea673e9SRodney W. Grimes (void)printf(" %7s", name); 472dea673e9SRodney W. Grimes else 473dea673e9SRodney W. Grimes (void)printf(" %7qd", ip->i_size); 474dea673e9SRodney W. Grimes return (0); 475dea673e9SRodney W. Grimes } 476dea673e9SRodney W. Grimes 477dea673e9SRodney W. Grimes void 478dea673e9SRodney W. Grimes nfs_header() 479dea673e9SRodney W. Grimes { 480dea673e9SRodney W. Grimes (void)printf(" FILEID NFLAG RDEV|SZ"); 481dea673e9SRodney W. Grimes } 482dea673e9SRodney W. Grimes 483dea673e9SRodney W. Grimes int 484dea673e9SRodney W. Grimes nfs_print(vp) 485dea673e9SRodney W. Grimes struct vnode *vp; 486dea673e9SRodney W. Grimes { 487dea673e9SRodney W. Grimes struct nfsnode nfsnode, *np = &nfsnode; 488dea673e9SRodney W. Grimes char flagbuf[16], *flags = flagbuf; 489dea673e9SRodney W. Grimes register int flag; 490dea673e9SRodney W. Grimes char *name; 491dea673e9SRodney W. Grimes mode_t type; 492dea673e9SRodney W. Grimes 493dea673e9SRodney W. Grimes KGETRET(VTONFS(vp), &nfsnode, sizeof(nfsnode), "vnode's nfsnode"); 494dea673e9SRodney W. Grimes flag = np->n_flag; 495dea673e9SRodney W. Grimes if (flag & NFLUSHWANT) 496dea673e9SRodney W. Grimes *flags++ = 'W'; 497dea673e9SRodney W. Grimes if (flag & NFLUSHINPROG) 498dea673e9SRodney W. Grimes *flags++ = 'P'; 499dea673e9SRodney W. Grimes if (flag & NMODIFIED) 500dea673e9SRodney W. Grimes *flags++ = 'M'; 501dea673e9SRodney W. Grimes if (flag & NWRITEERR) 502dea673e9SRodney W. Grimes *flags++ = 'E'; 503dea673e9SRodney W. Grimes if (flag & NQNFSNONCACHE) 504dea673e9SRodney W. Grimes *flags++ = 'X'; 505dea673e9SRodney W. Grimes if (flag & NQNFSWRITE) 506dea673e9SRodney W. Grimes *flags++ = 'O'; 507dea673e9SRodney W. Grimes if (flag & NQNFSEVICTED) 508dea673e9SRodney W. Grimes *flags++ = 'G'; 509dea673e9SRodney W. Grimes if (flag == 0) 510dea673e9SRodney W. Grimes *flags++ = '-'; 511dea673e9SRodney W. Grimes *flags = '\0'; 512dea673e9SRodney W. Grimes 513dea673e9SRodney W. Grimes #define VT np->n_vattr 514dea673e9SRodney W. Grimes (void)printf(" %6d %5s", VT.va_fileid, flagbuf); 515dea673e9SRodney W. Grimes type = VT.va_mode & S_IFMT; 516dea673e9SRodney W. Grimes if (S_ISCHR(VT.va_mode) || S_ISBLK(VT.va_mode)) 517dea673e9SRodney W. Grimes if (usenumflag || ((name = devname(VT.va_rdev, type)) == NULL)) 518dea673e9SRodney W. Grimes (void)printf(" %2d,%-2d", 519dea673e9SRodney W. Grimes major(VT.va_rdev), minor(VT.va_rdev)); 520dea673e9SRodney W. Grimes else 521dea673e9SRodney W. Grimes (void)printf(" %7s", name); 522dea673e9SRodney W. Grimes else 523dea673e9SRodney W. Grimes (void)printf(" %7qd", np->n_size); 524dea673e9SRodney W. Grimes return (0); 525dea673e9SRodney W. Grimes } 526dea673e9SRodney W. Grimes 527dea673e9SRodney W. Grimes /* 528dea673e9SRodney W. Grimes * Given a pointer to a mount structure in kernel space, 529dea673e9SRodney W. Grimes * read it in and return a usable pointer to it. 530dea673e9SRodney W. Grimes */ 531dea673e9SRodney W. Grimes struct mount * 532dea673e9SRodney W. Grimes getmnt(maddr) 533dea673e9SRodney W. Grimes struct mount *maddr; 534dea673e9SRodney W. Grimes { 535dea673e9SRodney W. Grimes static struct mtab { 536dea673e9SRodney W. Grimes struct mtab *next; 537dea673e9SRodney W. Grimes struct mount *maddr; 538dea673e9SRodney W. Grimes struct mount mount; 539dea673e9SRodney W. Grimes } *mhead = NULL; 540dea673e9SRodney W. Grimes register struct mtab *mt; 541dea673e9SRodney W. Grimes 542dea673e9SRodney W. Grimes for (mt = mhead; mt != NULL; mt = mt->next) 543dea673e9SRodney W. Grimes if (maddr == mt->maddr) 544dea673e9SRodney W. Grimes return (&mt->mount); 545dea673e9SRodney W. Grimes if ((mt = malloc(sizeof(struct mtab))) == NULL) 546dea673e9SRodney W. Grimes err(1, NULL); 547dea673e9SRodney W. Grimes KGETRET(maddr, &mt->mount, sizeof(struct mount), "mount table"); 548dea673e9SRodney W. Grimes mt->maddr = maddr; 549dea673e9SRodney W. Grimes mt->next = mhead; 550dea673e9SRodney W. Grimes mhead = mt; 551dea673e9SRodney W. Grimes return (&mt->mount); 552dea673e9SRodney W. Grimes } 553dea673e9SRodney W. Grimes 554dea673e9SRodney W. Grimes void 555dea673e9SRodney W. Grimes mount_print(mp) 556dea673e9SRodney W. Grimes struct mount *mp; 557dea673e9SRodney W. Grimes { 558dea673e9SRodney W. Grimes register int flags; 559dea673e9SRodney W. Grimes char *type; 560dea673e9SRodney W. Grimes 561dea673e9SRodney W. Grimes #define ST mp->mnt_stat 562dea673e9SRodney W. Grimes (void)printf("*** MOUNT "); 563dea673e9SRodney W. Grimes switch (ST.f_type) { 564dea673e9SRodney W. Grimes case MOUNT_NONE: 565dea673e9SRodney W. Grimes type = "none"; 566dea673e9SRodney W. Grimes break; 567dea673e9SRodney W. Grimes case MOUNT_UFS: 568dea673e9SRodney W. Grimes type = "ufs"; 569dea673e9SRodney W. Grimes break; 570dea673e9SRodney W. Grimes case MOUNT_NFS: 571dea673e9SRodney W. Grimes type = "nfs"; 572dea673e9SRodney W. Grimes break; 573dea673e9SRodney W. Grimes case MOUNT_MFS: 574dea673e9SRodney W. Grimes type = "mfs"; 575dea673e9SRodney W. Grimes break; 576dea673e9SRodney W. Grimes case MOUNT_MSDOS: 577dea673e9SRodney W. Grimes type = "pc"; 578dea673e9SRodney W. Grimes break; 579dea673e9SRodney W. Grimes default: 580dea673e9SRodney W. Grimes type = "unknown"; 581dea673e9SRodney W. Grimes break; 582dea673e9SRodney W. Grimes } 583dea673e9SRodney W. Grimes (void)printf("%s %s on %s", type, ST.f_mntfromname, ST.f_mntonname); 584dea673e9SRodney W. Grimes if (flags = mp->mnt_flag) { 585dea673e9SRodney W. Grimes char *comma = "("; 586dea673e9SRodney W. Grimes 587dea673e9SRodney W. Grimes putchar(' '); 588dea673e9SRodney W. Grimes /* user visable flags */ 589dea673e9SRodney W. Grimes if (flags & MNT_RDONLY) { 590dea673e9SRodney W. Grimes (void)printf("%srdonly", comma); 591dea673e9SRodney W. Grimes flags &= ~MNT_RDONLY; 592dea673e9SRodney W. Grimes comma = ","; 593dea673e9SRodney W. Grimes } 594dea673e9SRodney W. Grimes if (flags & MNT_SYNCHRONOUS) { 595dea673e9SRodney W. Grimes (void)printf("%ssynchronous", comma); 596dea673e9SRodney W. Grimes flags &= ~MNT_SYNCHRONOUS; 597dea673e9SRodney W. Grimes comma = ","; 598dea673e9SRodney W. Grimes } 599dea673e9SRodney W. Grimes if (flags & MNT_NOEXEC) { 600dea673e9SRodney W. Grimes (void)printf("%snoexec", comma); 601dea673e9SRodney W. Grimes flags &= ~MNT_NOEXEC; 602dea673e9SRodney W. Grimes comma = ","; 603dea673e9SRodney W. Grimes } 604dea673e9SRodney W. Grimes if (flags & MNT_NOSUID) { 605dea673e9SRodney W. Grimes (void)printf("%snosuid", comma); 606dea673e9SRodney W. Grimes flags &= ~MNT_NOSUID; 607dea673e9SRodney W. Grimes comma = ","; 608dea673e9SRodney W. Grimes } 609dea673e9SRodney W. Grimes if (flags & MNT_NODEV) { 610dea673e9SRodney W. Grimes (void)printf("%snodev", comma); 611dea673e9SRodney W. Grimes flags &= ~MNT_NODEV; 612dea673e9SRodney W. Grimes comma = ","; 613dea673e9SRodney W. Grimes } 614dea673e9SRodney W. Grimes if (flags & MNT_EXPORTED) { 615dea673e9SRodney W. Grimes (void)printf("%sexport", comma); 616dea673e9SRodney W. Grimes flags &= ~MNT_EXPORTED; 617dea673e9SRodney W. Grimes comma = ","; 618dea673e9SRodney W. Grimes } 619dea673e9SRodney W. Grimes if (flags & MNT_EXRDONLY) { 620dea673e9SRodney W. Grimes (void)printf("%sexrdonly", comma); 621dea673e9SRodney W. Grimes flags &= ~MNT_EXRDONLY; 622dea673e9SRodney W. Grimes comma = ","; 623dea673e9SRodney W. Grimes } 624dea673e9SRodney W. Grimes if (flags & MNT_LOCAL) { 625dea673e9SRodney W. Grimes (void)printf("%slocal", comma); 626dea673e9SRodney W. Grimes flags &= ~MNT_LOCAL; 627dea673e9SRodney W. Grimes comma = ","; 628dea673e9SRodney W. Grimes } 629dea673e9SRodney W. Grimes if (flags & MNT_QUOTA) { 630dea673e9SRodney W. Grimes (void)printf("%squota", comma); 631dea673e9SRodney W. Grimes flags &= ~MNT_QUOTA; 632dea673e9SRodney W. Grimes comma = ","; 633dea673e9SRodney W. Grimes } 634dea673e9SRodney W. Grimes /* filesystem control flags */ 635dea673e9SRodney W. Grimes if (flags & MNT_UPDATE) { 636dea673e9SRodney W. Grimes (void)printf("%supdate", comma); 637dea673e9SRodney W. Grimes flags &= ~MNT_UPDATE; 638dea673e9SRodney W. Grimes comma = ","; 639dea673e9SRodney W. Grimes } 640dea673e9SRodney W. Grimes if (flags & MNT_MLOCK) { 641dea673e9SRodney W. Grimes (void)printf("%slock", comma); 642dea673e9SRodney W. Grimes flags &= ~MNT_MLOCK; 643dea673e9SRodney W. Grimes comma = ","; 644dea673e9SRodney W. Grimes } 645dea673e9SRodney W. Grimes if (flags & MNT_MWAIT) { 646dea673e9SRodney W. Grimes (void)printf("%swait", comma); 647dea673e9SRodney W. Grimes flags &= ~MNT_MWAIT; 648dea673e9SRodney W. Grimes comma = ","; 649dea673e9SRodney W. Grimes } 650dea673e9SRodney W. Grimes if (flags & MNT_MPBUSY) { 651dea673e9SRodney W. Grimes (void)printf("%sbusy", comma); 652dea673e9SRodney W. Grimes flags &= ~MNT_MPBUSY; 653dea673e9SRodney W. Grimes comma = ","; 654dea673e9SRodney W. Grimes } 655dea673e9SRodney W. Grimes if (flags & MNT_MPWANT) { 656dea673e9SRodney W. Grimes (void)printf("%swant", comma); 657dea673e9SRodney W. Grimes flags &= ~MNT_MPWANT; 658dea673e9SRodney W. Grimes comma = ","; 659dea673e9SRodney W. Grimes } 660dea673e9SRodney W. Grimes if (flags & MNT_UNMOUNT) { 661dea673e9SRodney W. Grimes (void)printf("%sunmount", comma); 662dea673e9SRodney W. Grimes flags &= ~MNT_UNMOUNT; 663dea673e9SRodney W. Grimes comma = ","; 664dea673e9SRodney W. Grimes } 665dea673e9SRodney W. Grimes if (flags) 666dea673e9SRodney W. Grimes (void)printf("%sunknown_flags:%x", comma, flags); 667dea673e9SRodney W. Grimes (void)printf(")"); 668dea673e9SRodney W. Grimes } 669dea673e9SRodney W. Grimes (void)printf("\n"); 670dea673e9SRodney W. Grimes #undef ST 671dea673e9SRodney W. Grimes } 672dea673e9SRodney W. Grimes 673dea673e9SRodney W. Grimes struct e_vnode * 674dea673e9SRodney W. Grimes loadvnodes(avnodes) 675dea673e9SRodney W. Grimes int *avnodes; 676dea673e9SRodney W. Grimes { 677dea673e9SRodney W. Grimes int mib[2]; 678dea673e9SRodney W. Grimes size_t copysize; 679dea673e9SRodney W. Grimes struct e_vnode *vnodebase; 680dea673e9SRodney W. Grimes 681dea673e9SRodney W. Grimes if (memf != NULL) { 682dea673e9SRodney W. Grimes /* 683dea673e9SRodney W. Grimes * do it by hand 684dea673e9SRodney W. Grimes */ 685dea673e9SRodney W. Grimes return (kinfo_vnodes(avnodes)); 686dea673e9SRodney W. Grimes } 687dea673e9SRodney W. Grimes mib[0] = CTL_KERN; 688dea673e9SRodney W. Grimes mib[1] = KERN_VNODE; 689dea673e9SRodney W. Grimes if (sysctl(mib, 2, NULL, ©size, NULL, 0) == -1) 690dea673e9SRodney W. Grimes err(1, "sysctl: KERN_VNODE"); 691dea673e9SRodney W. Grimes if ((vnodebase = malloc(copysize)) == NULL) 692dea673e9SRodney W. Grimes err(1, NULL); 693dea673e9SRodney W. Grimes if (sysctl(mib, 2, vnodebase, ©size, NULL, 0) == -1) 694dea673e9SRodney W. Grimes err(1, "sysctl: KERN_VNODE"); 695dea673e9SRodney W. Grimes if (copysize % sizeof(struct e_vnode)) 696dea673e9SRodney W. Grimes errx(1, "vnode size mismatch"); 697dea673e9SRodney W. Grimes *avnodes = copysize / sizeof(struct e_vnode); 698dea673e9SRodney W. Grimes 699dea673e9SRodney W. Grimes return (vnodebase); 700dea673e9SRodney W. Grimes } 701dea673e9SRodney W. Grimes 702dea673e9SRodney W. Grimes /* 703dea673e9SRodney W. Grimes * simulate what a running kernel does in in kinfo_vnode 704dea673e9SRodney W. Grimes */ 705dea673e9SRodney W. Grimes struct e_vnode * 706dea673e9SRodney W. Grimes kinfo_vnodes(avnodes) 707dea673e9SRodney W. Grimes int *avnodes; 708dea673e9SRodney W. Grimes { 709dea673e9SRodney W. Grimes struct mntlist mountlist; 710dea673e9SRodney W. Grimes struct mount *mp, mount; 711dea673e9SRodney W. Grimes struct vnode *vp, vnode; 712dea673e9SRodney W. Grimes char *vbuf, *evbuf, *bp; 713dea673e9SRodney W. Grimes int num, numvnodes; 714dea673e9SRodney W. Grimes 715dea673e9SRodney W. Grimes #define VPTRSZ sizeof(struct vnode *) 716dea673e9SRodney W. Grimes #define VNODESZ sizeof(struct vnode) 717dea673e9SRodney W. Grimes 718dea673e9SRodney W. Grimes KGET(V_NUMV, numvnodes); 719dea673e9SRodney W. Grimes if ((vbuf = malloc((numvnodes + 20) * (VPTRSZ + VNODESZ))) == NULL) 720dea673e9SRodney W. Grimes err(1, NULL); 721dea673e9SRodney W. Grimes bp = vbuf; 722dea673e9SRodney W. Grimes evbuf = vbuf + (numvnodes + 20) * (VPTRSZ + VNODESZ); 723dea673e9SRodney W. Grimes KGET(V_MOUNTLIST, mountlist); 724dea673e9SRodney W. Grimes for (num = 0, mp = mountlist.tqh_first; 725dea673e9SRodney W. Grimes mp != NULL; mp = mp->mnt_list.tqe_next) { 726dea673e9SRodney W. Grimes KGET2(mp, &mount, sizeof(mount), "mount entry"); 727dea673e9SRodney W. Grimes for (vp = mount.mnt_vnodelist.lh_first; 728dea673e9SRodney W. Grimes vp != NULL; vp = vp->v_mntvnodes.le_next) { 729dea673e9SRodney W. Grimes KGET2(vp, &vnode, sizeof(vnode), "vnode"); 730dea673e9SRodney W. Grimes if ((bp + VPTRSZ + VNODESZ) > evbuf) 731dea673e9SRodney W. Grimes /* XXX - should realloc */ 732dea673e9SRodney W. Grimes errx(1, "no more room for vnodes"); 733dea673e9SRodney W. Grimes memmove(bp, &vp, VPTRSZ); 734dea673e9SRodney W. Grimes bp += VPTRSZ; 735dea673e9SRodney W. Grimes memmove(bp, &vnode, VNODESZ); 736dea673e9SRodney W. Grimes bp += VNODESZ; 737dea673e9SRodney W. Grimes num++; 738dea673e9SRodney W. Grimes } 739dea673e9SRodney W. Grimes } 740dea673e9SRodney W. Grimes *avnodes = num; 741dea673e9SRodney W. Grimes return ((struct e_vnode *)vbuf); 742dea673e9SRodney W. Grimes } 743dea673e9SRodney W. Grimes 744dea673e9SRodney W. Grimes char hdr[]=" LINE RAW CAN OUT HWT LWT COL STATE SESS PGID DISC\n"; 745dea673e9SRodney W. Grimes int ttyspace = 128; 746dea673e9SRodney W. Grimes 747dea673e9SRodney W. Grimes void 748dea673e9SRodney W. Grimes ttymode() 749dea673e9SRodney W. Grimes { 750dea673e9SRodney W. Grimes struct tty *tty; 751dea673e9SRodney W. Grimes 752dea673e9SRodney W. Grimes if ((tty = malloc(ttyspace * sizeof(*tty))) == NULL) 753dea673e9SRodney W. Grimes err(1, NULL); 754dea673e9SRodney W. Grimes #ifndef hp300 7555a3391bfSAndrey A. Chernov if (nl[SCONS].n_type != 0) { 756dea673e9SRodney W. Grimes (void)printf("1 console\n"); 757dea673e9SRodney W. Grimes KGET(SCONS, *tty); 758dea673e9SRodney W. Grimes (void)printf(hdr); 759dea673e9SRodney W. Grimes ttyprt(&tty[0], 0); 7605a3391bfSAndrey A. Chernov } 761dea673e9SRodney W. Grimes #endif 762dea673e9SRodney W. Grimes #ifdef vax 763dea673e9SRodney W. Grimes if (nl[SNQD].n_type != 0) 764dea673e9SRodney W. Grimes qdss(); 765dea673e9SRodney W. Grimes if (nl[SNDZ].n_type != 0) 766dea673e9SRodney W. Grimes ttytype(tty, "dz", SDZ, SNDZ); 767dea673e9SRodney W. Grimes if (nl[SNDH].n_type != 0) 768dea673e9SRodney W. Grimes ttytype(tty, "dh", SDH, SNDH); 769dea673e9SRodney W. Grimes if (nl[SNDMF].n_type != 0) 770dea673e9SRodney W. Grimes ttytype(tty, "dmf", SDMF, SNDMF); 771dea673e9SRodney W. Grimes if (nl[SNDHU].n_type != 0) 772dea673e9SRodney W. Grimes ttytype(tty, "dhu", SDHU, SNDHU); 773dea673e9SRodney W. Grimes if (nl[SNDMZ].n_type != 0) 774dea673e9SRodney W. Grimes ttytype(tty, "dmz", SDMZ, SNDMZ); 775dea673e9SRodney W. Grimes #endif 776dea673e9SRodney W. Grimes #ifdef tahoe 777dea673e9SRodney W. Grimes if (nl[SNVX].n_type != 0) 778dea673e9SRodney W. Grimes ttytype(tty, "vx", SVX, SNVX); 779dea673e9SRodney W. Grimes if (nl[SNMP].n_type != 0) 780dea673e9SRodney W. Grimes ttytype(tty, "mp", SMP, SNMP); 781dea673e9SRodney W. Grimes #endif 782dea673e9SRodney W. Grimes #ifdef hp300 783dea673e9SRodney W. Grimes if (nl[SNITE].n_type != 0) 784dea673e9SRodney W. Grimes ttytype(tty, "ite", SITE, SNITE); 785dea673e9SRodney W. Grimes if (nl[SNDCA].n_type != 0) 786dea673e9SRodney W. Grimes ttytype(tty, "dca", SDCA, SNDCA); 787dea673e9SRodney W. Grimes if (nl[SNDCM].n_type != 0) 788dea673e9SRodney W. Grimes ttytype(tty, "dcm", SDCM, SNDCM); 789dea673e9SRodney W. Grimes if (nl[SNDCL].n_type != 0) 790dea673e9SRodney W. Grimes ttytype(tty, "dcl", SDCL, SNDCL); 791dea673e9SRodney W. Grimes #endif 792dea673e9SRodney W. Grimes #ifdef mips 793dea673e9SRodney W. Grimes if (nl[SNDC].n_type != 0) 794dea673e9SRodney W. Grimes ttytype(tty, "dc", SDC, SNDC); 795dea673e9SRodney W. Grimes #endif 7965a3391bfSAndrey A. Chernov #ifdef __FreeBSD__ 797de4c8be3SSøren Schmidt if (nl[NSCCONS].n_type != 0) 798de4c8be3SSøren Schmidt ttytype(tty, "vty", SCCONS, NSCCONS); 79990300419SAndrey A. Chernov if (nl[NSIO].n_type != 0) 80090300419SAndrey A. Chernov ttytype(tty, "sio", SIO, NSIO); 80190300419SAndrey A. Chernov if (nl[NRC].n_type != 0) 80290300419SAndrey A. Chernov ttytype(tty, "rc", RC, NRC); 8035a3391bfSAndrey A. Chernov #endif 804dea673e9SRodney W. Grimes if (nl[SNPTY].n_type != 0) 805dea673e9SRodney W. Grimes ttytype(tty, "pty", SPTY, SNPTY); 806dea673e9SRodney W. Grimes } 807dea673e9SRodney W. Grimes 808dea673e9SRodney W. Grimes void 809dea673e9SRodney W. Grimes ttytype(tty, name, type, number) 810dea673e9SRodney W. Grimes register struct tty *tty; 811dea673e9SRodney W. Grimes char *name; 812dea673e9SRodney W. Grimes int type, number; 813dea673e9SRodney W. Grimes { 814dea673e9SRodney W. Grimes register struct tty *tp; 815dea673e9SRodney W. Grimes int ntty; 816dea673e9SRodney W. Grimes 817dea673e9SRodney W. Grimes if (tty == NULL) 818dea673e9SRodney W. Grimes return; 819dea673e9SRodney W. Grimes KGET(number, ntty); 820dea673e9SRodney W. Grimes (void)printf("%d %s %s\n", ntty, name, (ntty == 1) ? "line" : "lines"); 821dea673e9SRodney W. Grimes if (ntty > ttyspace) { 822dea673e9SRodney W. Grimes ttyspace = ntty; 823dea673e9SRodney W. Grimes if ((tty = realloc(tty, ttyspace * sizeof(*tty))) == 0) 824dea673e9SRodney W. Grimes err(1, NULL); 825dea673e9SRodney W. Grimes } 826dea673e9SRodney W. Grimes KGET1(type, tty, ntty * sizeof(struct tty), "tty structs"); 827dea673e9SRodney W. Grimes (void)printf(hdr); 828dea673e9SRodney W. Grimes for (tp = tty; tp < &tty[ntty]; tp++) 829dea673e9SRodney W. Grimes ttyprt(tp, tp - tty); 830dea673e9SRodney W. Grimes } 831dea673e9SRodney W. Grimes 832dea673e9SRodney W. Grimes struct { 833dea673e9SRodney W. Grimes int flag; 834dea673e9SRodney W. Grimes char val; 835dea673e9SRodney W. Grimes } ttystates[] = { 836dea673e9SRodney W. Grimes { TS_WOPEN, 'W'}, 837dea673e9SRodney W. Grimes { TS_ISOPEN, 'O'}, 838dea673e9SRodney W. Grimes { TS_CARR_ON, 'C'}, 839dea673e9SRodney W. Grimes { TS_TIMEOUT, 'T'}, 840dea673e9SRodney W. Grimes { TS_FLUSH, 'F'}, 841dea673e9SRodney W. Grimes { TS_BUSY, 'B'}, 842dea673e9SRodney W. Grimes { TS_ASLEEP, 'A'}, 843dea673e9SRodney W. Grimes { TS_XCLUDE, 'X'}, 844dea673e9SRodney W. Grimes { TS_TTSTOP, 'S'}, 845dea673e9SRodney W. Grimes { TS_TBLOCK, 'K'}, 846dea673e9SRodney W. Grimes { TS_ASYNC, 'Y'}, 847dea673e9SRodney W. Grimes { TS_BKSL, 'D'}, 848dea673e9SRodney W. Grimes { TS_ERASE, 'E'}, 849dea673e9SRodney W. Grimes { TS_LNCH, 'L'}, 850dea673e9SRodney W. Grimes { TS_TYPEN, 'P'}, 851dea673e9SRodney W. Grimes { TS_CNTTB, 'N'}, 852020531ceSAndrey A. Chernov #ifdef __FreeBSD__ 853020531ceSAndrey A. Chernov { TS_SNOOP, 's'}, 854020531ceSAndrey A. Chernov { TS_CAN_BYPASS_L_RINT, 'l'}, 855020531ceSAndrey A. Chernov #endif 856dea673e9SRodney W. Grimes { 0, '\0'}, 857dea673e9SRodney W. Grimes }; 858dea673e9SRodney W. Grimes 859dea673e9SRodney W. Grimes void 860dea673e9SRodney W. Grimes ttyprt(tp, line) 861dea673e9SRodney W. Grimes register struct tty *tp; 862dea673e9SRodney W. Grimes int line; 863dea673e9SRodney W. Grimes { 864dea673e9SRodney W. Grimes register int i, j; 865dea673e9SRodney W. Grimes pid_t pgid; 866dea673e9SRodney W. Grimes char *name, state[20]; 867dea673e9SRodney W. Grimes 868dea673e9SRodney W. Grimes if (usenumflag || tp->t_dev == 0 || 869dea673e9SRodney W. Grimes (name = devname(tp->t_dev, S_IFCHR)) == NULL) 870dea673e9SRodney W. Grimes (void)printf("%7d ", line); 871dea673e9SRodney W. Grimes else 872dea673e9SRodney W. Grimes (void)printf("%7s ", name); 873dea673e9SRodney W. Grimes (void)printf("%2d %3d ", tp->t_rawq.c_cc, tp->t_canq.c_cc); 8745a3391bfSAndrey A. Chernov (void)printf("%3d %4d %3d %7d ", tp->t_outq.c_cc, 875dea673e9SRodney W. Grimes tp->t_hiwat, tp->t_lowat, tp->t_column); 876dea673e9SRodney W. Grimes for (i = j = 0; ttystates[i].flag; i++) 877dea673e9SRodney W. Grimes if (tp->t_state&ttystates[i].flag) 878dea673e9SRodney W. Grimes state[j++] = ttystates[i].val; 879dea673e9SRodney W. Grimes if (j == 0) 880dea673e9SRodney W. Grimes state[j++] = '-'; 881dea673e9SRodney W. Grimes state[j] = '\0'; 882dea673e9SRodney W. Grimes (void)printf("%-4s %6x", state, (u_long)tp->t_session & ~KERNBASE); 883dea673e9SRodney W. Grimes pgid = 0; 884dea673e9SRodney W. Grimes if (tp->t_pgrp != NULL) 885dea673e9SRodney W. Grimes KGET2(&tp->t_pgrp->pg_id, &pgid, sizeof(pid_t), "pgid"); 886dea673e9SRodney W. Grimes (void)printf("%6d ", pgid); 887dea673e9SRodney W. Grimes switch (tp->t_line) { 888dea673e9SRodney W. Grimes case TTYDISC: 889dea673e9SRodney W. Grimes (void)printf("term\n"); 890dea673e9SRodney W. Grimes break; 89190300419SAndrey A. Chernov case NTTYDISC: 89290300419SAndrey A. Chernov (void)printf("ntty\n"); 89390300419SAndrey A. Chernov break; 894dea673e9SRodney W. Grimes case TABLDISC: 895dea673e9SRodney W. Grimes (void)printf("tab\n"); 896dea673e9SRodney W. Grimes break; 897dea673e9SRodney W. Grimes case SLIPDISC: 898dea673e9SRodney W. Grimes (void)printf("slip\n"); 899dea673e9SRodney W. Grimes break; 90090300419SAndrey A. Chernov case PPPDISC: 90190300419SAndrey A. Chernov (void)printf("ppp\n"); 90290300419SAndrey A. Chernov break; 903dea673e9SRodney W. Grimes default: 904dea673e9SRodney W. Grimes (void)printf("%d\n", tp->t_line); 905dea673e9SRodney W. Grimes break; 906dea673e9SRodney W. Grimes } 907dea673e9SRodney W. Grimes } 908dea673e9SRodney W. Grimes 909dea673e9SRodney W. Grimes void 910dea673e9SRodney W. Grimes filemode() 911dea673e9SRodney W. Grimes { 912dea673e9SRodney W. Grimes register struct file *fp; 913dea673e9SRodney W. Grimes struct file *addr; 914dea673e9SRodney W. Grimes char *buf, flagbuf[16], *fbp; 915dea673e9SRodney W. Grimes int len, maxfile, nfile; 916dea673e9SRodney W. Grimes static char *dtypes[] = { "???", "inode", "socket" }; 917dea673e9SRodney W. Grimes 918dea673e9SRodney W. Grimes KGET(FNL_MAXFILE, maxfile); 919dea673e9SRodney W. Grimes if (totalflag) { 920dea673e9SRodney W. Grimes KGET(FNL_NFILE, nfile); 921dea673e9SRodney W. Grimes (void)printf("%3d/%3d files\n", nfile, maxfile); 922dea673e9SRodney W. Grimes return; 923dea673e9SRodney W. Grimes } 924dea673e9SRodney W. Grimes if (getfiles(&buf, &len) == -1) 925dea673e9SRodney W. Grimes return; 926dea673e9SRodney W. Grimes /* 927dea673e9SRodney W. Grimes * Getfiles returns in malloc'd memory a pointer to the first file 928dea673e9SRodney W. Grimes * structure, and then an array of file structs (whose addresses are 929dea673e9SRodney W. Grimes * derivable from the previous entry). 930dea673e9SRodney W. Grimes */ 931dea673e9SRodney W. Grimes addr = *((struct file **)buf); 932dea673e9SRodney W. Grimes fp = (struct file *)(buf + sizeof(struct file *)); 933dea673e9SRodney W. Grimes nfile = (len - sizeof(struct file *)) / sizeof(struct file); 934dea673e9SRodney W. Grimes 935dea673e9SRodney W. Grimes (void)printf("%d/%d open files\n", nfile, maxfile); 936dea673e9SRodney W. Grimes (void)printf(" LOC TYPE FLG CNT MSG DATA OFFSET\n"); 937dea673e9SRodney W. Grimes for (; (char *)fp < buf + len; addr = fp->f_filef, fp++) { 938dea673e9SRodney W. Grimes if ((unsigned)fp->f_type > DTYPE_SOCKET) 939dea673e9SRodney W. Grimes continue; 940dea673e9SRodney W. Grimes (void)printf("%x ", addr); 941dea673e9SRodney W. Grimes (void)printf("%-8.8s", dtypes[fp->f_type]); 942dea673e9SRodney W. Grimes fbp = flagbuf; 943dea673e9SRodney W. Grimes if (fp->f_flag & FREAD) 944dea673e9SRodney W. Grimes *fbp++ = 'R'; 945dea673e9SRodney W. Grimes if (fp->f_flag & FWRITE) 946dea673e9SRodney W. Grimes *fbp++ = 'W'; 947dea673e9SRodney W. Grimes if (fp->f_flag & FAPPEND) 948dea673e9SRodney W. Grimes *fbp++ = 'A'; 949dea673e9SRodney W. Grimes #ifdef FSHLOCK /* currently gone */ 950dea673e9SRodney W. Grimes if (fp->f_flag & FSHLOCK) 951dea673e9SRodney W. Grimes *fbp++ = 'S'; 952dea673e9SRodney W. Grimes if (fp->f_flag & FEXLOCK) 953dea673e9SRodney W. Grimes *fbp++ = 'X'; 954dea673e9SRodney W. Grimes #endif 955dea673e9SRodney W. Grimes if (fp->f_flag & FASYNC) 956dea673e9SRodney W. Grimes *fbp++ = 'I'; 957dea673e9SRodney W. Grimes *fbp = '\0'; 958dea673e9SRodney W. Grimes (void)printf("%6s %3d", flagbuf, fp->f_count); 959dea673e9SRodney W. Grimes (void)printf(" %3d", fp->f_msgcount); 960dea673e9SRodney W. Grimes (void)printf(" %8.1x", fp->f_data); 961dea673e9SRodney W. Grimes if (fp->f_offset < 0) 962dea673e9SRodney W. Grimes (void)printf(" %qx\n", fp->f_offset); 963dea673e9SRodney W. Grimes else 964dea673e9SRodney W. Grimes (void)printf(" %qd\n", fp->f_offset); 965dea673e9SRodney W. Grimes } 966dea673e9SRodney W. Grimes free(buf); 967dea673e9SRodney W. Grimes } 968dea673e9SRodney W. Grimes 969dea673e9SRodney W. Grimes int 970dea673e9SRodney W. Grimes getfiles(abuf, alen) 971dea673e9SRodney W. Grimes char **abuf; 972dea673e9SRodney W. Grimes int *alen; 973dea673e9SRodney W. Grimes { 974dea673e9SRodney W. Grimes size_t len; 975dea673e9SRodney W. Grimes int mib[2]; 976dea673e9SRodney W. Grimes char *buf; 977dea673e9SRodney W. Grimes 978dea673e9SRodney W. Grimes /* 979dea673e9SRodney W. Grimes * XXX 980dea673e9SRodney W. Grimes * Add emulation of KINFO_FILE here. 981dea673e9SRodney W. Grimes */ 982dea673e9SRodney W. Grimes if (memf != NULL) 983dea673e9SRodney W. Grimes errx(1, "files on dead kernel, not implemented\n"); 984dea673e9SRodney W. Grimes 985dea673e9SRodney W. Grimes mib[0] = CTL_KERN; 986dea673e9SRodney W. Grimes mib[1] = KERN_FILE; 987dea673e9SRodney W. Grimes if (sysctl(mib, 2, NULL, &len, NULL, 0) == -1) { 988dea673e9SRodney W. Grimes warn("sysctl: KERN_FILE"); 989dea673e9SRodney W. Grimes return (-1); 990dea673e9SRodney W. Grimes } 991dea673e9SRodney W. Grimes if ((buf = malloc(len)) == NULL) 992dea673e9SRodney W. Grimes err(1, NULL); 993dea673e9SRodney W. Grimes if (sysctl(mib, 2, buf, &len, NULL, 0) == -1) { 994dea673e9SRodney W. Grimes warn("sysctl: KERN_FILE"); 995dea673e9SRodney W. Grimes return (-1); 996dea673e9SRodney W. Grimes } 997dea673e9SRodney W. Grimes *abuf = buf; 998dea673e9SRodney W. Grimes *alen = len; 999dea673e9SRodney W. Grimes return (0); 1000dea673e9SRodney W. Grimes } 1001dea673e9SRodney W. Grimes 1002dea673e9SRodney W. Grimes /* 1003dea673e9SRodney W. Grimes * swapmode is based on a program called swapinfo written 1004dea673e9SRodney W. Grimes * by Kevin Lahey <kml@rokkaku.atl.ga.us>. 1005dea673e9SRodney W. Grimes */ 1006dea673e9SRodney W. Grimes void 1007dea673e9SRodney W. Grimes swapmode() 1008dea673e9SRodney W. Grimes { 1009dea673e9SRodney W. Grimes char *header; 10101cb2c626SDavid Greenman int hlen, nswap, nswdev, dmmax; 1011e96c5424SDavid Greenman int i, div, avail, nfree, npfree, used; 1012dea673e9SRodney W. Grimes struct swdevt *sw; 1013dea673e9SRodney W. Grimes long blocksize, *perdev; 10141cb2c626SDavid Greenman struct rlist head; 10151cb2c626SDavid Greenman struct rlist *swaplist; 1016dea673e9SRodney W. Grimes 1017dea673e9SRodney W. Grimes KGET(VM_NSWAP, nswap); 1018dea673e9SRodney W. Grimes KGET(VM_NSWDEV, nswdev); 1019dea673e9SRodney W. Grimes KGET(VM_DMMAX, dmmax); 10201cb2c626SDavid Greenman KGET(VM_SWAPLIST, swaplist); 1021dea673e9SRodney W. Grimes if ((sw = malloc(nswdev * sizeof(*sw))) == NULL || 10221cb2c626SDavid Greenman (perdev = malloc(nswdev * sizeof(*perdev))) == NULL) 1023dea673e9SRodney W. Grimes err(1, "malloc"); 1024dea673e9SRodney W. Grimes KGET1(VM_SWDEVT, sw, nswdev * sizeof(*sw), "swdevt"); 1025dea673e9SRodney W. Grimes 1026dea673e9SRodney W. Grimes /* Count up swap space. */ 1027dea673e9SRodney W. Grimes nfree = 0; 1028dea673e9SRodney W. Grimes memset(perdev, 0, nswdev * sizeof(*perdev)); 10291cb2c626SDavid Greenman while (swaplist) { 10301cb2c626SDavid Greenman int top, bottom, next_block; 10311cb2c626SDavid Greenman 10321cb2c626SDavid Greenman KGET2(swaplist, &head, sizeof(struct rlist), "swaplist"); 10331cb2c626SDavid Greenman 10341cb2c626SDavid Greenman top = head.rl_end; 10351cb2c626SDavid Greenman bottom = head.rl_start; 10361cb2c626SDavid Greenman 10371cb2c626SDavid Greenman nfree += top - bottom + 1; 1038dea673e9SRodney W. Grimes 1039dea673e9SRodney W. Grimes /* 1040dea673e9SRodney W. Grimes * Swap space is split up among the configured disks. 1041dea673e9SRodney W. Grimes * 1042dea673e9SRodney W. Grimes * For interleaved swap devices, the first dmmax blocks 1043dea673e9SRodney W. Grimes * of swap space some from the first disk, the next dmmax 10441cb2c626SDavid Greenman * blocks from the next, and so on up to nswap blocks. 1045dea673e9SRodney W. Grimes * 1046dea673e9SRodney W. Grimes * The list of free space joins adjacent free blocks, 1047dea673e9SRodney W. Grimes * ignoring device boundries. If we want to keep track 1048dea673e9SRodney W. Grimes * of this information per device, we'll just have to 10491cb2c626SDavid Greenman * extract it ourselves. 1050dea673e9SRodney W. Grimes */ 10511cb2c626SDavid Greenman while (top / dmmax != bottom / dmmax) { 10521cb2c626SDavid Greenman next_block = ((bottom + dmmax) / dmmax); 10531cb2c626SDavid Greenman perdev[(bottom / dmmax) % nswdev] += 10541cb2c626SDavid Greenman next_block * dmmax - bottom; 10551cb2c626SDavid Greenman bottom = next_block * dmmax; 10561cb2c626SDavid Greenman } 10571cb2c626SDavid Greenman perdev[(bottom / dmmax) % nswdev] += 10581cb2c626SDavid Greenman top - bottom + 1; 1059dea673e9SRodney W. Grimes 10601cb2c626SDavid Greenman swaplist = head.rl_next; 1061dea673e9SRodney W. Grimes } 1062dea673e9SRodney W. Grimes 1063dea673e9SRodney W. Grimes header = getbsize(&hlen, &blocksize); 1064dea673e9SRodney W. Grimes if (!totalflag) 1065dea673e9SRodney W. Grimes (void)printf("%-11s %*s %8s %8s %8s %s\n", 1066dea673e9SRodney W. Grimes "Device", hlen, header, 1067dea673e9SRodney W. Grimes "Used", "Avail", "Capacity", "Type"); 1068dea673e9SRodney W. Grimes div = blocksize / 512; 1069dea673e9SRodney W. Grimes avail = npfree = 0; 1070dea673e9SRodney W. Grimes for (i = 0; i < nswdev; i++) { 1071dea673e9SRodney W. Grimes int xsize, xfree; 1072dea673e9SRodney W. Grimes 107359392fe2SPoul-Henning Kamp /* 107459392fe2SPoul-Henning Kamp * Don't report statistics for partitions which have not 107559392fe2SPoul-Henning Kamp * yet been activated via swapon(8). 107659392fe2SPoul-Henning Kamp */ 107759392fe2SPoul-Henning Kamp if (!(sw[i].sw_flags & SW_FREED)) 107859392fe2SPoul-Henning Kamp continue; 107959392fe2SPoul-Henning Kamp 1080dea673e9SRodney W. Grimes if (!totalflag) 1081dea673e9SRodney W. Grimes (void)printf("/dev/%-6s %*d ", 1082dea673e9SRodney W. Grimes devname(sw[i].sw_dev, S_IFBLK), 1083dea673e9SRodney W. Grimes hlen, sw[i].sw_nblks / div); 1084dea673e9SRodney W. Grimes 1085dea673e9SRodney W. Grimes xsize = sw[i].sw_nblks; 1086dea673e9SRodney W. Grimes xfree = perdev[i]; 1087dea673e9SRodney W. Grimes used = xsize - xfree; 1088dea673e9SRodney W. Grimes npfree++; 1089dea673e9SRodney W. Grimes avail += xsize; 1090dea673e9SRodney W. Grimes if (totalflag) 1091dea673e9SRodney W. Grimes continue; 1092dea673e9SRodney W. Grimes (void)printf("%8d %8d %5.0f%% %s\n", 1093dea673e9SRodney W. Grimes used / div, xfree / div, 1094dea673e9SRodney W. Grimes (double)used / (double)xsize * 100.0, 1095dea673e9SRodney W. Grimes (sw[i].sw_flags & SW_SEQUENTIAL) ? 1096dea673e9SRodney W. Grimes "Sequential" : "Interleaved"); 1097dea673e9SRodney W. Grimes } 1098dea673e9SRodney W. Grimes 1099dea673e9SRodney W. Grimes /* 1100dea673e9SRodney W. Grimes * If only one partition has been set up via swapon(8), we don't 1101dea673e9SRodney W. Grimes * need to bother with totals. 1102dea673e9SRodney W. Grimes */ 1103dea673e9SRodney W. Grimes used = avail - nfree; 1104dea673e9SRodney W. Grimes if (totalflag) { 1105dea673e9SRodney W. Grimes (void)printf("%dM/%dM swap space\n", used / 2048, avail / 2048); 1106dea673e9SRodney W. Grimes return; 1107dea673e9SRodney W. Grimes } 1108dea673e9SRodney W. Grimes if (npfree > 1) { 1109dea673e9SRodney W. Grimes (void)printf("%-11s %*d %8d %8d %5.0f%%\n", 1110dea673e9SRodney W. Grimes "Total", hlen, avail / div, used / div, nfree / div, 1111dea673e9SRodney W. Grimes (double)used / (double)avail * 100.0); 1112dea673e9SRodney W. Grimes } 1113dea673e9SRodney W. Grimes } 1114