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> 57a62dc406SDoug Rabson #include <nfs/rpcv2.h> 58a62dc406SDoug Rabson #include <nfs/nfsproto.h> 59dea673e9SRodney W. Grimes #include <nfs/nfsnode.h> 60dea673e9SRodney W. Grimes #include <sys/ioctl.h> 6190300419SAndrey A. Chernov #include <sys/ioctl_compat.h> /* XXX NTTYDISC is too well hidden */ 62dea673e9SRodney W. Grimes #include <sys/tty.h> 63dea673e9SRodney W. Grimes #include <sys/conf.h> 648d7547c2SDavid Greenman #include <sys/rlist.h> 65dea673e9SRodney W. Grimes 663aab05cfSPoul-Henning Kamp #include <sys/user.h> 67dea673e9SRodney W. Grimes #include <sys/sysctl.h> 68dea673e9SRodney W. Grimes 69dea673e9SRodney W. Grimes #include <err.h> 705d98ce75SBruce Evans #include <fcntl.h> 71dea673e9SRodney W. Grimes #include <kvm.h> 72dea673e9SRodney W. Grimes #include <limits.h> 73dea673e9SRodney W. Grimes #include <nlist.h> 74dea673e9SRodney W. Grimes #include <stdio.h> 75dea673e9SRodney W. Grimes #include <stdlib.h> 76dea673e9SRodney W. Grimes #include <string.h> 77dea673e9SRodney W. Grimes #include <unistd.h> 78dea673e9SRodney W. Grimes 79dea673e9SRodney W. Grimes struct nlist nl[] = { 808d7547c2SDavid Greenman #define VM_SWAPLIST 0 818d7547c2SDavid Greenman { "_swaplist" },/* list of free swap areas */ 828d7547c2SDavid Greenman #define VM_SWDEVT 1 83dea673e9SRodney W. Grimes { "_swdevt" }, /* list of swap devices and sizes */ 848d7547c2SDavid Greenman #define VM_NSWAP 2 85dea673e9SRodney W. Grimes { "_nswap" }, /* size of largest swap device */ 868d7547c2SDavid Greenman #define VM_NSWDEV 3 87dea673e9SRodney W. Grimes { "_nswdev" }, /* number of swap devices */ 888d7547c2SDavid Greenman #define VM_DMMAX 4 89dea673e9SRodney W. Grimes { "_dmmax" }, /* maximum size of a swap block */ 908d7547c2SDavid Greenman #define V_MOUNTLIST 5 91dea673e9SRodney W. Grimes { "_mountlist" }, /* address of head of mount list. */ 928d7547c2SDavid Greenman #define V_NUMV 6 93dea673e9SRodney W. Grimes { "_numvnodes" }, 948d7547c2SDavid Greenman #define FNL_NFILE 7 95dea673e9SRodney W. Grimes {"_nfiles"}, 968d7547c2SDavid Greenman #define FNL_MAXFILE 8 97dea673e9SRodney W. Grimes {"_maxfiles"}, 98dea673e9SRodney W. Grimes #define NLMANDATORY FNL_MAXFILE /* names up to here are mandatory */ 991cb2c626SDavid Greenman #define SCONS NLMANDATORY + 1 100dea673e9SRodney W. Grimes { "_cons" }, 1011cb2c626SDavid Greenman #define SPTY NLMANDATORY + 2 102dea673e9SRodney W. Grimes { "_pt_tty" }, 1031cb2c626SDavid Greenman #define SNPTY NLMANDATORY + 3 104dea673e9SRodney W. Grimes { "_npty" }, 105dea673e9SRodney W. Grimes 106dea673e9SRodney W. Grimes #ifdef hp300 107dea673e9SRodney W. Grimes #define SDCA (SNPTY+1) 108dea673e9SRodney W. Grimes { "_dca_tty" }, 109dea673e9SRodney W. Grimes #define SNDCA (SNPTY+2) 110dea673e9SRodney W. Grimes { "_ndca" }, 111dea673e9SRodney W. Grimes #define SDCM (SNPTY+3) 112dea673e9SRodney W. Grimes { "_dcm_tty" }, 113dea673e9SRodney W. Grimes #define SNDCM (SNPTY+4) 114dea673e9SRodney W. Grimes { "_ndcm" }, 115dea673e9SRodney W. Grimes #define SDCL (SNPTY+5) 116dea673e9SRodney W. Grimes { "_dcl_tty" }, 117dea673e9SRodney W. Grimes #define SNDCL (SNPTY+6) 118dea673e9SRodney W. Grimes { "_ndcl" }, 119dea673e9SRodney W. Grimes #define SITE (SNPTY+7) 120dea673e9SRodney W. Grimes { "_ite_tty" }, 121dea673e9SRodney W. Grimes #define SNITE (SNPTY+8) 122dea673e9SRodney W. Grimes { "_nite" }, 123dea673e9SRodney W. Grimes #endif 124dea673e9SRodney W. Grimes 125dea673e9SRodney W. Grimes #ifdef mips 126dea673e9SRodney W. Grimes #define SDC (SNPTY+1) 127dea673e9SRodney W. Grimes { "_dc_tty" }, 128dea673e9SRodney W. Grimes #define SNDC (SNPTY+2) 129dea673e9SRodney W. Grimes { "_dc_cnt" }, 130dea673e9SRodney W. Grimes #endif 131dea673e9SRodney W. Grimes 1325a3391bfSAndrey A. Chernov #ifdef __FreeBSD__ 133de4c8be3SSøren Schmidt #define SCCONS (SNPTY+1) 134de4c8be3SSøren Schmidt { "_sccons" }, 135de4c8be3SSøren Schmidt #define NSCCONS (SNPTY+2) 136de4c8be3SSøren Schmidt { "_nsccons" }, 13790300419SAndrey A. Chernov #define SIO (SNPTY+3) 13890300419SAndrey A. Chernov { "_sio_tty" }, 13990300419SAndrey A. Chernov #define NSIO (SNPTY+4) 14090300419SAndrey A. Chernov { "_nsio_tty" }, 14190300419SAndrey A. Chernov #define RC (SNPTY+5) 14290300419SAndrey A. Chernov { "_rc_tty" }, 14390300419SAndrey A. Chernov #define NRC (SNPTY+6) 14490300419SAndrey A. Chernov { "_nrc_tty" }, 14524f769b0SBruce Evans #define CY (SNPTY+7) 14624f769b0SBruce Evans { "_cy_tty" }, 14724f769b0SBruce Evans #define NCY (SNPTY+8) 14824f769b0SBruce Evans { "_ncy_tty" }, 149a9aa8c37SPeter Wemm #define SI (SNPTY+9) 150a9aa8c37SPeter Wemm { "_si_tty" }, 151a9aa8c37SPeter Wemm #define NSI (SNPTY+10) 152a9aa8c37SPeter Wemm { "_si_Nports" }, 1535a3391bfSAndrey A. Chernov #endif 154dea673e9SRodney W. Grimes { "" } 155dea673e9SRodney W. Grimes }; 156dea673e9SRodney W. Grimes 157dea673e9SRodney W. Grimes int usenumflag; 158dea673e9SRodney W. Grimes int totalflag; 159dea673e9SRodney W. Grimes char *nlistf = NULL; 160dea673e9SRodney W. Grimes char *memf = NULL; 161dea673e9SRodney W. Grimes kvm_t *kd; 162dea673e9SRodney W. Grimes 16359392fe2SPoul-Henning Kamp char *usage; 16459392fe2SPoul-Henning Kamp 165dea673e9SRodney W. Grimes #define SVAR(var) __STRING(var) /* to force expansion */ 166dea673e9SRodney W. Grimes #define KGET(idx, var) \ 167dea673e9SRodney W. Grimes KGET1(idx, &var, sizeof(var), SVAR(var)) 168dea673e9SRodney W. Grimes #define KGET1(idx, p, s, msg) \ 169dea673e9SRodney W. Grimes KGET2(nl[idx].n_value, p, s, msg) 170dea673e9SRodney W. Grimes #define KGET2(addr, p, s, msg) \ 171dea673e9SRodney W. Grimes if (kvm_read(kd, (u_long)(addr), p, s) != s) \ 172dea673e9SRodney W. Grimes warnx("cannot read %s: %s", msg, kvm_geterr(kd)) 173dea673e9SRodney W. Grimes #define KGETRET(addr, p, s, msg) \ 174dea673e9SRodney W. Grimes if (kvm_read(kd, (u_long)(addr), p, s) != s) { \ 175dea673e9SRodney W. Grimes warnx("cannot read %s: %s", msg, kvm_geterr(kd)); \ 176dea673e9SRodney W. Grimes return (0); \ 177dea673e9SRodney W. Grimes } 178dea673e9SRodney W. Grimes 179dea673e9SRodney W. Grimes void filemode __P((void)); 180dea673e9SRodney W. Grimes int getfiles __P((char **, int *)); 181dea673e9SRodney W. Grimes struct mount * 182dea673e9SRodney W. Grimes getmnt __P((struct mount *)); 183dea673e9SRodney W. Grimes struct e_vnode * 184dea673e9SRodney W. Grimes kinfo_vnodes __P((int *)); 185dea673e9SRodney W. Grimes struct e_vnode * 186dea673e9SRodney W. Grimes loadvnodes __P((int *)); 187dea673e9SRodney W. Grimes void mount_print __P((struct mount *)); 188dea673e9SRodney W. Grimes void nfs_header __P((void)); 189dea673e9SRodney W. Grimes int nfs_print __P((struct vnode *)); 190dea673e9SRodney W. Grimes void swapmode __P((void)); 191dea673e9SRodney W. Grimes void ttymode __P((void)); 192dea673e9SRodney W. Grimes void ttyprt __P((struct tty *, int)); 193a9aa8c37SPeter Wemm void ttytype __P((struct tty *, char *, int, int, int)); 194dea673e9SRodney W. Grimes void ufs_header __P((void)); 195dea673e9SRodney W. Grimes int ufs_print __P((struct vnode *)); 196dea673e9SRodney W. Grimes void vnode_header __P((void)); 197dea673e9SRodney W. Grimes void vnode_print __P((struct vnode *, struct vnode *)); 198dea673e9SRodney W. Grimes void vnodemode __P((void)); 199dea673e9SRodney W. Grimes 200dea673e9SRodney W. Grimes int 201dea673e9SRodney W. Grimes main(argc, argv) 202dea673e9SRodney W. Grimes int argc; 203dea673e9SRodney W. Grimes char *argv[]; 204dea673e9SRodney W. Grimes { 205dea673e9SRodney W. Grimes extern char *optarg; 206dea673e9SRodney W. Grimes extern int optind; 207dea673e9SRodney W. Grimes int ch, i, quit, ret; 208dea673e9SRodney W. Grimes int fileflag, swapflag, ttyflag, vnodeflag; 20959392fe2SPoul-Henning Kamp char buf[_POSIX2_LINE_MAX],*opts; 210dea673e9SRodney W. Grimes 211dea673e9SRodney W. Grimes fileflag = swapflag = ttyflag = vnodeflag = 0; 21259392fe2SPoul-Henning Kamp 21359392fe2SPoul-Henning Kamp /* We will behave like good old swapinfo if thus invoked */ 21459392fe2SPoul-Henning Kamp opts = strrchr(argv[0],'/'); 21559392fe2SPoul-Henning Kamp if (opts) 21659392fe2SPoul-Henning Kamp opts++; 21759392fe2SPoul-Henning Kamp else 21859392fe2SPoul-Henning Kamp opts = argv[0]; 21959392fe2SPoul-Henning Kamp if (!strcmp(opts,"swapinfo")) { 22059392fe2SPoul-Henning Kamp swapflag = 1; 2212d8e94a4SSujal Patel opts = "kM:N:"; 22259392fe2SPoul-Henning Kamp usage = "usage: swapinfo [-k] [-M core] [-N system]\n"; 22359392fe2SPoul-Henning Kamp } else { 22459392fe2SPoul-Henning Kamp opts = "TM:N:fiknstv"; 22559392fe2SPoul-Henning Kamp usage = "usage: pstat [-Tfknstv] [-M core] [-N system]\n"; 22659392fe2SPoul-Henning Kamp } 22759392fe2SPoul-Henning Kamp 22859392fe2SPoul-Henning Kamp while ((ch = getopt(argc, argv, opts)) != EOF) 229dea673e9SRodney W. Grimes switch (ch) { 230dea673e9SRodney W. Grimes case 'f': 231dea673e9SRodney W. Grimes fileflag = 1; 232dea673e9SRodney W. Grimes break; 23359392fe2SPoul-Henning Kamp case 'k': 23459392fe2SPoul-Henning Kamp putenv("BLOCKSIZE=1K"); 23559392fe2SPoul-Henning Kamp break; 236dea673e9SRodney W. Grimes case 'M': 237dea673e9SRodney W. Grimes memf = optarg; 238dea673e9SRodney W. Grimes break; 239dea673e9SRodney W. Grimes case 'N': 240dea673e9SRodney W. Grimes nlistf = optarg; 241dea673e9SRodney W. Grimes break; 242dea673e9SRodney W. Grimes case 'n': 243dea673e9SRodney W. Grimes usenumflag = 1; 244dea673e9SRodney W. Grimes break; 245dea673e9SRodney W. Grimes case 's': 246dea673e9SRodney W. Grimes swapflag = 1; 247dea673e9SRodney W. Grimes break; 248dea673e9SRodney W. Grimes case 'T': 249dea673e9SRodney W. Grimes totalflag = 1; 250dea673e9SRodney W. Grimes break; 251dea673e9SRodney W. Grimes case 't': 252dea673e9SRodney W. Grimes ttyflag = 1; 253dea673e9SRodney W. Grimes break; 254dea673e9SRodney W. Grimes case 'v': 255dea673e9SRodney W. Grimes case 'i': /* Backward compatibility. */ 256dea673e9SRodney W. Grimes vnodeflag = 1; 257dea673e9SRodney W. Grimes break; 258dea673e9SRodney W. Grimes default: 25959392fe2SPoul-Henning Kamp (void)fprintf(stderr, usage); 26059392fe2SPoul-Henning Kamp exit(1); 261dea673e9SRodney W. Grimes } 262dea673e9SRodney W. Grimes argc -= optind; 263dea673e9SRodney W. Grimes argv += optind; 264dea673e9SRodney W. Grimes 265dea673e9SRodney W. Grimes /* 266dea673e9SRodney W. Grimes * Discard setgid privileges if not the running kernel so that bad 267dea673e9SRodney W. Grimes * guys can't print interesting stuff from kernel memory. 268dea673e9SRodney W. Grimes */ 269dea673e9SRodney W. Grimes if (nlistf != NULL || memf != NULL) 270dea673e9SRodney W. Grimes (void)setgid(getgid()); 271dea673e9SRodney W. Grimes 272dea673e9SRodney W. Grimes if ((kd = kvm_openfiles(nlistf, memf, NULL, O_RDONLY, buf)) == 0) 273dea673e9SRodney W. Grimes errx(1, "kvm_openfiles: %s", buf); 274dea673e9SRodney W. Grimes if ((ret = kvm_nlist(kd, nl)) != 0) { 275dea673e9SRodney W. Grimes if (ret == -1) 276dea673e9SRodney W. Grimes errx(1, "kvm_nlist: %s", kvm_geterr(kd)); 277dea673e9SRodney W. Grimes for (i = quit = 0; i <= NLMANDATORY; i++) 278dea673e9SRodney W. Grimes if (!nl[i].n_value) { 279dea673e9SRodney W. Grimes quit = 1; 280dea673e9SRodney W. Grimes warnx("undefined symbol: %s\n", nl[i].n_name); 281dea673e9SRodney W. Grimes } 282dea673e9SRodney W. Grimes if (quit) 283dea673e9SRodney W. Grimes exit(1); 284dea673e9SRodney W. Grimes } 28559392fe2SPoul-Henning Kamp if (!(fileflag | vnodeflag | ttyflag | swapflag | totalflag)) { 28659392fe2SPoul-Henning Kamp (void)fprintf(stderr, usage); 28759392fe2SPoul-Henning Kamp exit(1); 28859392fe2SPoul-Henning Kamp } 289dea673e9SRodney W. Grimes if (fileflag || totalflag) 290dea673e9SRodney W. Grimes filemode(); 291dea673e9SRodney W. Grimes if (vnodeflag || totalflag) 292dea673e9SRodney W. Grimes vnodemode(); 293dea673e9SRodney W. Grimes if (ttyflag) 294dea673e9SRodney W. Grimes ttymode(); 295dea673e9SRodney W. Grimes if (swapflag || totalflag) 296dea673e9SRodney W. Grimes swapmode(); 297dea673e9SRodney W. Grimes exit (0); 298dea673e9SRodney W. Grimes } 299dea673e9SRodney W. Grimes 300dea673e9SRodney W. Grimes struct e_vnode { 301dea673e9SRodney W. Grimes struct vnode *avnode; 302dea673e9SRodney W. Grimes struct vnode vnode; 303dea673e9SRodney W. Grimes }; 304dea673e9SRodney W. Grimes 305dea673e9SRodney W. Grimes void 306dea673e9SRodney W. Grimes vnodemode() 307dea673e9SRodney W. Grimes { 308dea673e9SRodney W. Grimes register struct e_vnode *e_vnodebase, *endvnode, *evp; 309dea673e9SRodney W. Grimes register struct vnode *vp; 310dea673e9SRodney W. Grimes register struct mount *maddr, *mp; 311dea673e9SRodney W. Grimes int numvnodes; 312dea673e9SRodney W. Grimes 313dea673e9SRodney W. Grimes e_vnodebase = loadvnodes(&numvnodes); 314dea673e9SRodney W. Grimes if (totalflag) { 315dea673e9SRodney W. Grimes (void)printf("%7d vnodes\n", numvnodes); 316dea673e9SRodney W. Grimes return; 317dea673e9SRodney W. Grimes } 318dea673e9SRodney W. Grimes endvnode = e_vnodebase + numvnodes; 319dea673e9SRodney W. Grimes (void)printf("%d active vnodes\n", numvnodes); 320dea673e9SRodney W. Grimes 321dea673e9SRodney W. Grimes 322dea673e9SRodney W. Grimes #define ST mp->mnt_stat 323dea673e9SRodney W. Grimes maddr = NULL; 324dea673e9SRodney W. Grimes for (evp = e_vnodebase; evp < endvnode; evp++) { 325dea673e9SRodney W. Grimes vp = &evp->vnode; 326dea673e9SRodney W. Grimes if (vp->v_mount != maddr) { 327dea673e9SRodney W. Grimes /* 328dea673e9SRodney W. Grimes * New filesystem 329dea673e9SRodney W. Grimes */ 330dea673e9SRodney W. Grimes if ((mp = getmnt(vp->v_mount)) == NULL) 331dea673e9SRodney W. Grimes continue; 332dea673e9SRodney W. Grimes maddr = vp->v_mount; 333dea673e9SRodney W. Grimes mount_print(mp); 334dea673e9SRodney W. Grimes vnode_header(); 335dea673e9SRodney W. Grimes switch(ST.f_type) { 336dea673e9SRodney W. Grimes case MOUNT_UFS: 337dea673e9SRodney W. Grimes case MOUNT_MFS: 338dea673e9SRodney W. Grimes ufs_header(); 339dea673e9SRodney W. Grimes break; 340dea673e9SRodney W. Grimes case MOUNT_NFS: 341dea673e9SRodney W. Grimes nfs_header(); 342dea673e9SRodney W. Grimes break; 343dea673e9SRodney W. Grimes case MOUNT_NONE: 344dea673e9SRodney W. Grimes case MOUNT_MSDOS: 345dea673e9SRodney W. Grimes default: 346dea673e9SRodney W. Grimes break; 347dea673e9SRodney W. Grimes } 348dea673e9SRodney W. Grimes (void)printf("\n"); 349dea673e9SRodney W. Grimes } 350dea673e9SRodney W. Grimes vnode_print(evp->avnode, vp); 351dea673e9SRodney W. Grimes switch(ST.f_type) { 352dea673e9SRodney W. Grimes case MOUNT_UFS: 353dea673e9SRodney W. Grimes case MOUNT_MFS: 354dea673e9SRodney W. Grimes ufs_print(vp); 355dea673e9SRodney W. Grimes break; 356dea673e9SRodney W. Grimes case MOUNT_NFS: 357dea673e9SRodney W. Grimes nfs_print(vp); 358dea673e9SRodney W. Grimes break; 359dea673e9SRodney W. Grimes case MOUNT_NONE: 360dea673e9SRodney W. Grimes case MOUNT_MSDOS: 361dea673e9SRodney W. Grimes default: 362dea673e9SRodney W. Grimes break; 363dea673e9SRodney W. Grimes } 364dea673e9SRodney W. Grimes (void)printf("\n"); 365dea673e9SRodney W. Grimes } 366dea673e9SRodney W. Grimes free(e_vnodebase); 367dea673e9SRodney W. Grimes } 368dea673e9SRodney W. Grimes 369dea673e9SRodney W. Grimes void 370dea673e9SRodney W. Grimes vnode_header() 371dea673e9SRodney W. Grimes { 372dea673e9SRodney W. Grimes (void)printf("ADDR TYP VFLAG USE HOLD"); 373dea673e9SRodney W. Grimes } 374dea673e9SRodney W. Grimes 375dea673e9SRodney W. Grimes void 376dea673e9SRodney W. Grimes vnode_print(avnode, vp) 377dea673e9SRodney W. Grimes struct vnode *avnode; 378dea673e9SRodney W. Grimes struct vnode *vp; 379dea673e9SRodney W. Grimes { 380dea673e9SRodney W. Grimes char *type, flags[16]; 381dea673e9SRodney W. Grimes char *fp = flags; 382dea673e9SRodney W. Grimes register int flag; 383dea673e9SRodney W. Grimes 384dea673e9SRodney W. Grimes /* 385dea673e9SRodney W. Grimes * set type 386dea673e9SRodney W. Grimes */ 387dea673e9SRodney W. Grimes switch(vp->v_type) { 388dea673e9SRodney W. Grimes case VNON: 389dea673e9SRodney W. Grimes type = "non"; break; 390dea673e9SRodney W. Grimes case VREG: 391dea673e9SRodney W. Grimes type = "reg"; break; 392dea673e9SRodney W. Grimes case VDIR: 393dea673e9SRodney W. Grimes type = "dir"; break; 394dea673e9SRodney W. Grimes case VBLK: 395dea673e9SRodney W. Grimes type = "blk"; break; 396dea673e9SRodney W. Grimes case VCHR: 397dea673e9SRodney W. Grimes type = "chr"; break; 398dea673e9SRodney W. Grimes case VLNK: 399dea673e9SRodney W. Grimes type = "lnk"; break; 400dea673e9SRodney W. Grimes case VSOCK: 401dea673e9SRodney W. Grimes type = "soc"; break; 402dea673e9SRodney W. Grimes case VFIFO: 403dea673e9SRodney W. Grimes type = "fif"; break; 404dea673e9SRodney W. Grimes case VBAD: 405dea673e9SRodney W. Grimes type = "bad"; break; 406dea673e9SRodney W. Grimes default: 407dea673e9SRodney W. Grimes type = "unk"; break; 408dea673e9SRodney W. Grimes } 409dea673e9SRodney W. Grimes /* 410dea673e9SRodney W. Grimes * gather flags 411dea673e9SRodney W. Grimes */ 412dea673e9SRodney W. Grimes flag = vp->v_flag; 413dea673e9SRodney W. Grimes if (flag & VROOT) 414dea673e9SRodney W. Grimes *fp++ = 'R'; 415dea673e9SRodney W. Grimes if (flag & VTEXT) 416dea673e9SRodney W. Grimes *fp++ = 'T'; 417dea673e9SRodney W. Grimes if (flag & VSYSTEM) 418dea673e9SRodney W. Grimes *fp++ = 'S'; 419dea673e9SRodney W. Grimes if (flag & VXLOCK) 420dea673e9SRodney W. Grimes *fp++ = 'L'; 421dea673e9SRodney W. Grimes if (flag & VXWANT) 422dea673e9SRodney W. Grimes *fp++ = 'W'; 423dea673e9SRodney W. Grimes if (flag & VBWAIT) 424dea673e9SRodney W. Grimes *fp++ = 'B'; 425dea673e9SRodney W. Grimes if (flag & VALIASED) 426dea673e9SRodney W. Grimes *fp++ = 'A'; 427dea673e9SRodney W. Grimes if (flag == 0) 428dea673e9SRodney W. Grimes *fp++ = '-'; 429dea673e9SRodney W. Grimes *fp = '\0'; 430dea673e9SRodney W. Grimes (void)printf("%8x %s %5s %4d %4d", 431dea673e9SRodney W. Grimes avnode, type, flags, vp->v_usecount, vp->v_holdcnt); 432dea673e9SRodney W. Grimes } 433dea673e9SRodney W. Grimes 434dea673e9SRodney W. Grimes void 435dea673e9SRodney W. Grimes ufs_header() 436dea673e9SRodney W. Grimes { 437dea673e9SRodney W. Grimes (void)printf(" FILEID IFLAG RDEV|SZ"); 438dea673e9SRodney W. Grimes } 439dea673e9SRodney W. Grimes 440dea673e9SRodney W. Grimes int 441dea673e9SRodney W. Grimes ufs_print(vp) 442dea673e9SRodney W. Grimes struct vnode *vp; 443dea673e9SRodney W. Grimes { 444dea673e9SRodney W. Grimes register int flag; 445dea673e9SRodney W. Grimes struct inode inode, *ip = &inode; 446dea673e9SRodney W. Grimes char flagbuf[16], *flags = flagbuf; 447dea673e9SRodney W. Grimes char *name; 448dea673e9SRodney W. Grimes mode_t type; 449dea673e9SRodney W. Grimes 450dea673e9SRodney W. Grimes KGETRET(VTOI(vp), &inode, sizeof(struct inode), "vnode's inode"); 451dea673e9SRodney W. Grimes flag = ip->i_flag; 452dea673e9SRodney W. Grimes if (flag & IN_LOCKED) 453dea673e9SRodney W. Grimes *flags++ = 'L'; 454dea673e9SRodney W. Grimes if (flag & IN_WANTED) 455dea673e9SRodney W. Grimes *flags++ = 'W'; 456dea673e9SRodney W. Grimes if (flag & IN_RENAME) 457dea673e9SRodney W. Grimes *flags++ = 'R'; 458dea673e9SRodney W. Grimes if (flag & IN_UPDATE) 459dea673e9SRodney W. Grimes *flags++ = 'U'; 460dea673e9SRodney W. Grimes if (flag & IN_ACCESS) 461dea673e9SRodney W. Grimes *flags++ = 'A'; 462dea673e9SRodney W. Grimes if (flag & IN_CHANGE) 463dea673e9SRodney W. Grimes *flags++ = 'C'; 464dea673e9SRodney W. Grimes if (flag & IN_MODIFIED) 465dea673e9SRodney W. Grimes *flags++ = 'M'; 466dea673e9SRodney W. Grimes if (flag & IN_SHLOCK) 467dea673e9SRodney W. Grimes *flags++ = 'S'; 468dea673e9SRodney W. Grimes if (flag & IN_EXLOCK) 469dea673e9SRodney W. Grimes *flags++ = 'E'; 470dea673e9SRodney W. Grimes if (flag & IN_LWAIT) 471dea673e9SRodney W. Grimes *flags++ = 'Z'; 472dea673e9SRodney W. Grimes if (flag == 0) 473dea673e9SRodney W. Grimes *flags++ = '-'; 474dea673e9SRodney W. Grimes *flags = '\0'; 475dea673e9SRodney W. Grimes 476dea673e9SRodney W. Grimes (void)printf(" %6d %5s", ip->i_number, flagbuf); 477dea673e9SRodney W. Grimes type = ip->i_mode & S_IFMT; 478dea673e9SRodney W. Grimes if (S_ISCHR(ip->i_mode) || S_ISBLK(ip->i_mode)) 479dea673e9SRodney W. Grimes if (usenumflag || ((name = devname(ip->i_rdev, type)) == NULL)) 480dea673e9SRodney W. Grimes (void)printf(" %2d,%-2d", 481dea673e9SRodney W. Grimes major(ip->i_rdev), minor(ip->i_rdev)); 482dea673e9SRodney W. Grimes else 483dea673e9SRodney W. Grimes (void)printf(" %7s", name); 484dea673e9SRodney W. Grimes else 485dea673e9SRodney W. Grimes (void)printf(" %7qd", ip->i_size); 486dea673e9SRodney W. Grimes return (0); 487dea673e9SRodney W. Grimes } 488dea673e9SRodney W. Grimes 489dea673e9SRodney W. Grimes void 490dea673e9SRodney W. Grimes nfs_header() 491dea673e9SRodney W. Grimes { 492dea673e9SRodney W. Grimes (void)printf(" FILEID NFLAG RDEV|SZ"); 493dea673e9SRodney W. Grimes } 494dea673e9SRodney W. Grimes 495dea673e9SRodney W. Grimes int 496dea673e9SRodney W. Grimes nfs_print(vp) 497dea673e9SRodney W. Grimes struct vnode *vp; 498dea673e9SRodney W. Grimes { 499dea673e9SRodney W. Grimes struct nfsnode nfsnode, *np = &nfsnode; 500dea673e9SRodney W. Grimes char flagbuf[16], *flags = flagbuf; 501dea673e9SRodney W. Grimes register int flag; 502dea673e9SRodney W. Grimes char *name; 503dea673e9SRodney W. Grimes mode_t type; 504dea673e9SRodney W. Grimes 505dea673e9SRodney W. Grimes KGETRET(VTONFS(vp), &nfsnode, sizeof(nfsnode), "vnode's nfsnode"); 506dea673e9SRodney W. Grimes flag = np->n_flag; 507dea673e9SRodney W. Grimes if (flag & NFLUSHWANT) 508dea673e9SRodney W. Grimes *flags++ = 'W'; 509dea673e9SRodney W. Grimes if (flag & NFLUSHINPROG) 510dea673e9SRodney W. Grimes *flags++ = 'P'; 511dea673e9SRodney W. Grimes if (flag & NMODIFIED) 512dea673e9SRodney W. Grimes *flags++ = 'M'; 513dea673e9SRodney W. Grimes if (flag & NWRITEERR) 514dea673e9SRodney W. Grimes *flags++ = 'E'; 515dea673e9SRodney W. Grimes if (flag & NQNFSNONCACHE) 516dea673e9SRodney W. Grimes *flags++ = 'X'; 517dea673e9SRodney W. Grimes if (flag & NQNFSWRITE) 518dea673e9SRodney W. Grimes *flags++ = 'O'; 519dea673e9SRodney W. Grimes if (flag & NQNFSEVICTED) 520dea673e9SRodney W. Grimes *flags++ = 'G'; 521dea673e9SRodney W. Grimes if (flag == 0) 522dea673e9SRodney W. Grimes *flags++ = '-'; 523dea673e9SRodney W. Grimes *flags = '\0'; 524dea673e9SRodney W. Grimes 525dea673e9SRodney W. Grimes #define VT np->n_vattr 526dea673e9SRodney W. Grimes (void)printf(" %6d %5s", VT.va_fileid, flagbuf); 527dea673e9SRodney W. Grimes type = VT.va_mode & S_IFMT; 528dea673e9SRodney W. Grimes if (S_ISCHR(VT.va_mode) || S_ISBLK(VT.va_mode)) 529dea673e9SRodney W. Grimes if (usenumflag || ((name = devname(VT.va_rdev, type)) == NULL)) 530dea673e9SRodney W. Grimes (void)printf(" %2d,%-2d", 531dea673e9SRodney W. Grimes major(VT.va_rdev), minor(VT.va_rdev)); 532dea673e9SRodney W. Grimes else 533dea673e9SRodney W. Grimes (void)printf(" %7s", name); 534dea673e9SRodney W. Grimes else 535dea673e9SRodney W. Grimes (void)printf(" %7qd", np->n_size); 536dea673e9SRodney W. Grimes return (0); 537dea673e9SRodney W. Grimes } 538dea673e9SRodney W. Grimes 539dea673e9SRodney W. Grimes /* 540dea673e9SRodney W. Grimes * Given a pointer to a mount structure in kernel space, 541dea673e9SRodney W. Grimes * read it in and return a usable pointer to it. 542dea673e9SRodney W. Grimes */ 543dea673e9SRodney W. Grimes struct mount * 544dea673e9SRodney W. Grimes getmnt(maddr) 545dea673e9SRodney W. Grimes struct mount *maddr; 546dea673e9SRodney W. Grimes { 547dea673e9SRodney W. Grimes static struct mtab { 548dea673e9SRodney W. Grimes struct mtab *next; 549dea673e9SRodney W. Grimes struct mount *maddr; 550dea673e9SRodney W. Grimes struct mount mount; 551dea673e9SRodney W. Grimes } *mhead = NULL; 552dea673e9SRodney W. Grimes register struct mtab *mt; 553dea673e9SRodney W. Grimes 554dea673e9SRodney W. Grimes for (mt = mhead; mt != NULL; mt = mt->next) 555dea673e9SRodney W. Grimes if (maddr == mt->maddr) 556dea673e9SRodney W. Grimes return (&mt->mount); 557dea673e9SRodney W. Grimes if ((mt = malloc(sizeof(struct mtab))) == NULL) 558dea673e9SRodney W. Grimes err(1, NULL); 559dea673e9SRodney W. Grimes KGETRET(maddr, &mt->mount, sizeof(struct mount), "mount table"); 560dea673e9SRodney W. Grimes mt->maddr = maddr; 561dea673e9SRodney W. Grimes mt->next = mhead; 562dea673e9SRodney W. Grimes mhead = mt; 563dea673e9SRodney W. Grimes return (&mt->mount); 564dea673e9SRodney W. Grimes } 565dea673e9SRodney W. Grimes 566dea673e9SRodney W. Grimes void 567dea673e9SRodney W. Grimes mount_print(mp) 568dea673e9SRodney W. Grimes struct mount *mp; 569dea673e9SRodney W. Grimes { 570dea673e9SRodney W. Grimes register int flags; 571dea673e9SRodney W. Grimes char *type; 572dea673e9SRodney W. Grimes 573dea673e9SRodney W. Grimes #define ST mp->mnt_stat 574dea673e9SRodney W. Grimes (void)printf("*** MOUNT "); 575dea673e9SRodney W. Grimes switch (ST.f_type) { 576dea673e9SRodney W. Grimes case MOUNT_NONE: 577dea673e9SRodney W. Grimes type = "none"; 578dea673e9SRodney W. Grimes break; 579dea673e9SRodney W. Grimes case MOUNT_UFS: 580dea673e9SRodney W. Grimes type = "ufs"; 581dea673e9SRodney W. Grimes break; 582dea673e9SRodney W. Grimes case MOUNT_NFS: 583dea673e9SRodney W. Grimes type = "nfs"; 584dea673e9SRodney W. Grimes break; 585dea673e9SRodney W. Grimes case MOUNT_MFS: 586dea673e9SRodney W. Grimes type = "mfs"; 587dea673e9SRodney W. Grimes break; 588dea673e9SRodney W. Grimes case MOUNT_MSDOS: 589dea673e9SRodney W. Grimes type = "pc"; 590dea673e9SRodney W. Grimes break; 591dea673e9SRodney W. Grimes default: 592dea673e9SRodney W. Grimes type = "unknown"; 593dea673e9SRodney W. Grimes break; 594dea673e9SRodney W. Grimes } 595dea673e9SRodney W. Grimes (void)printf("%s %s on %s", type, ST.f_mntfromname, ST.f_mntonname); 596dea673e9SRodney W. Grimes if (flags = mp->mnt_flag) { 597dea673e9SRodney W. Grimes char *comma = "("; 598dea673e9SRodney W. Grimes 599dea673e9SRodney W. Grimes putchar(' '); 600dea673e9SRodney W. Grimes /* user visable flags */ 601dea673e9SRodney W. Grimes if (flags & MNT_RDONLY) { 602dea673e9SRodney W. Grimes (void)printf("%srdonly", comma); 603dea673e9SRodney W. Grimes flags &= ~MNT_RDONLY; 604dea673e9SRodney W. Grimes comma = ","; 605dea673e9SRodney W. Grimes } 606dea673e9SRodney W. Grimes if (flags & MNT_SYNCHRONOUS) { 607dea673e9SRodney W. Grimes (void)printf("%ssynchronous", comma); 608dea673e9SRodney W. Grimes flags &= ~MNT_SYNCHRONOUS; 609dea673e9SRodney W. Grimes comma = ","; 610dea673e9SRodney W. Grimes } 611dea673e9SRodney W. Grimes if (flags & MNT_NOEXEC) { 612dea673e9SRodney W. Grimes (void)printf("%snoexec", comma); 613dea673e9SRodney W. Grimes flags &= ~MNT_NOEXEC; 614dea673e9SRodney W. Grimes comma = ","; 615dea673e9SRodney W. Grimes } 616dea673e9SRodney W. Grimes if (flags & MNT_NOSUID) { 617dea673e9SRodney W. Grimes (void)printf("%snosuid", comma); 618dea673e9SRodney W. Grimes flags &= ~MNT_NOSUID; 619dea673e9SRodney W. Grimes comma = ","; 620dea673e9SRodney W. Grimes } 621dea673e9SRodney W. Grimes if (flags & MNT_NODEV) { 622dea673e9SRodney W. Grimes (void)printf("%snodev", comma); 623dea673e9SRodney W. Grimes flags &= ~MNT_NODEV; 624dea673e9SRodney W. Grimes comma = ","; 625dea673e9SRodney W. Grimes } 626dea673e9SRodney W. Grimes if (flags & MNT_EXPORTED) { 627dea673e9SRodney W. Grimes (void)printf("%sexport", comma); 628dea673e9SRodney W. Grimes flags &= ~MNT_EXPORTED; 629dea673e9SRodney W. Grimes comma = ","; 630dea673e9SRodney W. Grimes } 631dea673e9SRodney W. Grimes if (flags & MNT_EXRDONLY) { 632dea673e9SRodney W. Grimes (void)printf("%sexrdonly", comma); 633dea673e9SRodney W. Grimes flags &= ~MNT_EXRDONLY; 634dea673e9SRodney W. Grimes comma = ","; 635dea673e9SRodney W. Grimes } 636dea673e9SRodney W. Grimes if (flags & MNT_LOCAL) { 637dea673e9SRodney W. Grimes (void)printf("%slocal", comma); 638dea673e9SRodney W. Grimes flags &= ~MNT_LOCAL; 639dea673e9SRodney W. Grimes comma = ","; 640dea673e9SRodney W. Grimes } 641dea673e9SRodney W. Grimes if (flags & MNT_QUOTA) { 642dea673e9SRodney W. Grimes (void)printf("%squota", comma); 643dea673e9SRodney W. Grimes flags &= ~MNT_QUOTA; 644dea673e9SRodney W. Grimes comma = ","; 645dea673e9SRodney W. Grimes } 646dea673e9SRodney W. Grimes /* filesystem control flags */ 647dea673e9SRodney W. Grimes if (flags & MNT_UPDATE) { 648dea673e9SRodney W. Grimes (void)printf("%supdate", comma); 649dea673e9SRodney W. Grimes flags &= ~MNT_UPDATE; 650dea673e9SRodney W. Grimes comma = ","; 651dea673e9SRodney W. Grimes } 652dea673e9SRodney W. Grimes if (flags & MNT_MLOCK) { 653dea673e9SRodney W. Grimes (void)printf("%slock", comma); 654dea673e9SRodney W. Grimes flags &= ~MNT_MLOCK; 655dea673e9SRodney W. Grimes comma = ","; 656dea673e9SRodney W. Grimes } 657dea673e9SRodney W. Grimes if (flags & MNT_MWAIT) { 658dea673e9SRodney W. Grimes (void)printf("%swait", comma); 659dea673e9SRodney W. Grimes flags &= ~MNT_MWAIT; 660dea673e9SRodney W. Grimes comma = ","; 661dea673e9SRodney W. Grimes } 662dea673e9SRodney W. Grimes if (flags & MNT_MPBUSY) { 663dea673e9SRodney W. Grimes (void)printf("%sbusy", comma); 664dea673e9SRodney W. Grimes flags &= ~MNT_MPBUSY; 665dea673e9SRodney W. Grimes comma = ","; 666dea673e9SRodney W. Grimes } 667dea673e9SRodney W. Grimes if (flags & MNT_MPWANT) { 668dea673e9SRodney W. Grimes (void)printf("%swant", comma); 669dea673e9SRodney W. Grimes flags &= ~MNT_MPWANT; 670dea673e9SRodney W. Grimes comma = ","; 671dea673e9SRodney W. Grimes } 672dea673e9SRodney W. Grimes if (flags & MNT_UNMOUNT) { 673dea673e9SRodney W. Grimes (void)printf("%sunmount", comma); 674dea673e9SRodney W. Grimes flags &= ~MNT_UNMOUNT; 675dea673e9SRodney W. Grimes comma = ","; 676dea673e9SRodney W. Grimes } 677dea673e9SRodney W. Grimes if (flags) 678dea673e9SRodney W. Grimes (void)printf("%sunknown_flags:%x", comma, flags); 679dea673e9SRodney W. Grimes (void)printf(")"); 680dea673e9SRodney W. Grimes } 681dea673e9SRodney W. Grimes (void)printf("\n"); 682dea673e9SRodney W. Grimes #undef ST 683dea673e9SRodney W. Grimes } 684dea673e9SRodney W. Grimes 685dea673e9SRodney W. Grimes struct e_vnode * 686dea673e9SRodney W. Grimes loadvnodes(avnodes) 687dea673e9SRodney W. Grimes int *avnodes; 688dea673e9SRodney W. Grimes { 689dea673e9SRodney W. Grimes int mib[2]; 690dea673e9SRodney W. Grimes size_t copysize; 691dea673e9SRodney W. Grimes struct e_vnode *vnodebase; 692dea673e9SRodney W. Grimes 693dea673e9SRodney W. Grimes if (memf != NULL) { 694dea673e9SRodney W. Grimes /* 695dea673e9SRodney W. Grimes * do it by hand 696dea673e9SRodney W. Grimes */ 697dea673e9SRodney W. Grimes return (kinfo_vnodes(avnodes)); 698dea673e9SRodney W. Grimes } 699dea673e9SRodney W. Grimes mib[0] = CTL_KERN; 700dea673e9SRodney W. Grimes mib[1] = KERN_VNODE; 701dea673e9SRodney W. Grimes if (sysctl(mib, 2, NULL, ©size, NULL, 0) == -1) 702dea673e9SRodney W. Grimes err(1, "sysctl: KERN_VNODE"); 703dea673e9SRodney W. Grimes if ((vnodebase = malloc(copysize)) == NULL) 704dea673e9SRodney W. Grimes err(1, NULL); 705dea673e9SRodney W. Grimes if (sysctl(mib, 2, vnodebase, ©size, NULL, 0) == -1) 706dea673e9SRodney W. Grimes err(1, "sysctl: KERN_VNODE"); 707dea673e9SRodney W. Grimes if (copysize % sizeof(struct e_vnode)) 708dea673e9SRodney W. Grimes errx(1, "vnode size mismatch"); 709dea673e9SRodney W. Grimes *avnodes = copysize / sizeof(struct e_vnode); 710dea673e9SRodney W. Grimes 711dea673e9SRodney W. Grimes return (vnodebase); 712dea673e9SRodney W. Grimes } 713dea673e9SRodney W. Grimes 714dea673e9SRodney W. Grimes /* 715dea673e9SRodney W. Grimes * simulate what a running kernel does in in kinfo_vnode 716dea673e9SRodney W. Grimes */ 717dea673e9SRodney W. Grimes struct e_vnode * 718dea673e9SRodney W. Grimes kinfo_vnodes(avnodes) 719dea673e9SRodney W. Grimes int *avnodes; 720dea673e9SRodney W. Grimes { 721dea673e9SRodney W. Grimes struct mntlist mountlist; 722dea673e9SRodney W. Grimes struct mount *mp, mount; 723dea673e9SRodney W. Grimes struct vnode *vp, vnode; 724dea673e9SRodney W. Grimes char *vbuf, *evbuf, *bp; 725dea673e9SRodney W. Grimes int num, numvnodes; 726dea673e9SRodney W. Grimes 727dea673e9SRodney W. Grimes #define VPTRSZ sizeof(struct vnode *) 728dea673e9SRodney W. Grimes #define VNODESZ sizeof(struct vnode) 729dea673e9SRodney W. Grimes 730dea673e9SRodney W. Grimes KGET(V_NUMV, numvnodes); 731dea673e9SRodney W. Grimes if ((vbuf = malloc((numvnodes + 20) * (VPTRSZ + VNODESZ))) == NULL) 732dea673e9SRodney W. Grimes err(1, NULL); 733dea673e9SRodney W. Grimes bp = vbuf; 734dea673e9SRodney W. Grimes evbuf = vbuf + (numvnodes + 20) * (VPTRSZ + VNODESZ); 735dea673e9SRodney W. Grimes KGET(V_MOUNTLIST, mountlist); 736d219a12eSDavid Greenman for (num = 0, mp = mountlist.cqh_first; ; mp = mp->mnt_list.cqe_next) { 737dea673e9SRodney W. Grimes KGET2(mp, &mount, sizeof(mount), "mount entry"); 738dea673e9SRodney W. Grimes for (vp = mount.mnt_vnodelist.lh_first; 739dea673e9SRodney W. Grimes vp != NULL; vp = vp->v_mntvnodes.le_next) { 740dea673e9SRodney W. Grimes KGET2(vp, &vnode, sizeof(vnode), "vnode"); 741dea673e9SRodney W. Grimes if ((bp + VPTRSZ + VNODESZ) > evbuf) 742dea673e9SRodney W. Grimes /* XXX - should realloc */ 743dea673e9SRodney W. Grimes errx(1, "no more room for vnodes"); 744dea673e9SRodney W. Grimes memmove(bp, &vp, VPTRSZ); 745dea673e9SRodney W. Grimes bp += VPTRSZ; 746dea673e9SRodney W. Grimes memmove(bp, &vnode, VNODESZ); 747dea673e9SRodney W. Grimes bp += VNODESZ; 748dea673e9SRodney W. Grimes num++; 749dea673e9SRodney W. Grimes } 750d219a12eSDavid Greenman if (mp == mountlist.cqh_last) 751d219a12eSDavid Greenman break; 752dea673e9SRodney W. Grimes } 753dea673e9SRodney W. Grimes *avnodes = num; 754dea673e9SRodney W. Grimes return ((struct e_vnode *)vbuf); 755dea673e9SRodney W. Grimes } 756dea673e9SRodney W. Grimes 757dea673e9SRodney W. Grimes char hdr[]=" LINE RAW CAN OUT HWT LWT COL STATE SESS PGID DISC\n"; 758dea673e9SRodney W. Grimes int ttyspace = 128; 759dea673e9SRodney W. Grimes 760dea673e9SRodney W. Grimes void 761dea673e9SRodney W. Grimes ttymode() 762dea673e9SRodney W. Grimes { 763dea673e9SRodney W. Grimes struct tty *tty; 764dea673e9SRodney W. Grimes 765dea673e9SRodney W. Grimes if ((tty = malloc(ttyspace * sizeof(*tty))) == NULL) 766dea673e9SRodney W. Grimes err(1, NULL); 767dea673e9SRodney W. Grimes #ifndef hp300 7685a3391bfSAndrey A. Chernov if (nl[SCONS].n_type != 0) { 769dea673e9SRodney W. Grimes (void)printf("1 console\n"); 770dea673e9SRodney W. Grimes KGET(SCONS, *tty); 771dea673e9SRodney W. Grimes (void)printf(hdr); 772dea673e9SRodney W. Grimes ttyprt(&tty[0], 0); 7735a3391bfSAndrey A. Chernov } 774dea673e9SRodney W. Grimes #endif 775dea673e9SRodney W. Grimes #ifdef vax 776dea673e9SRodney W. Grimes if (nl[SNQD].n_type != 0) 777dea673e9SRodney W. Grimes qdss(); 778dea673e9SRodney W. Grimes if (nl[SNDZ].n_type != 0) 779a9aa8c37SPeter Wemm ttytype(tty, "dz", SDZ, SNDZ, 0); 780dea673e9SRodney W. Grimes if (nl[SNDH].n_type != 0) 781a9aa8c37SPeter Wemm ttytype(tty, "dh", SDH, SNDH, 0); 782dea673e9SRodney W. Grimes if (nl[SNDMF].n_type != 0) 783a9aa8c37SPeter Wemm ttytype(tty, "dmf", SDMF, SNDMF, 0); 784dea673e9SRodney W. Grimes if (nl[SNDHU].n_type != 0) 785a9aa8c37SPeter Wemm ttytype(tty, "dhu", SDHU, SNDHU, 0); 786dea673e9SRodney W. Grimes if (nl[SNDMZ].n_type != 0) 787a9aa8c37SPeter Wemm ttytype(tty, "dmz", SDMZ, SNDMZ, 0); 788dea673e9SRodney W. Grimes #endif 789dea673e9SRodney W. Grimes #ifdef tahoe 790dea673e9SRodney W. Grimes if (nl[SNVX].n_type != 0) 791a9aa8c37SPeter Wemm ttytype(tty, "vx", SVX, SNVX, 0); 792dea673e9SRodney W. Grimes if (nl[SNMP].n_type != 0) 793a9aa8c37SPeter Wemm ttytype(tty, "mp", SMP, SNMP, 0); 794dea673e9SRodney W. Grimes #endif 795dea673e9SRodney W. Grimes #ifdef hp300 796dea673e9SRodney W. Grimes if (nl[SNITE].n_type != 0) 797a9aa8c37SPeter Wemm ttytype(tty, "ite", SITE, SNITE, 0); 798dea673e9SRodney W. Grimes if (nl[SNDCA].n_type != 0) 799a9aa8c37SPeter Wemm ttytype(tty, "dca", SDCA, SNDCA, 0); 800dea673e9SRodney W. Grimes if (nl[SNDCM].n_type != 0) 801a9aa8c37SPeter Wemm ttytype(tty, "dcm", SDCM, SNDCM, 0); 802dea673e9SRodney W. Grimes if (nl[SNDCL].n_type != 0) 803a9aa8c37SPeter Wemm ttytype(tty, "dcl", SDCL, SNDCL, 0); 804dea673e9SRodney W. Grimes #endif 805dea673e9SRodney W. Grimes #ifdef mips 806dea673e9SRodney W. Grimes if (nl[SNDC].n_type != 0) 807a9aa8c37SPeter Wemm ttytype(tty, "dc", SDC, SNDC, 0); 808dea673e9SRodney W. Grimes #endif 8095a3391bfSAndrey A. Chernov #ifdef __FreeBSD__ 810de4c8be3SSøren Schmidt if (nl[NSCCONS].n_type != 0) 811a9aa8c37SPeter Wemm ttytype(tty, "vty", SCCONS, NSCCONS, 0); 81290300419SAndrey A. Chernov if (nl[NSIO].n_type != 0) 813a9aa8c37SPeter Wemm ttytype(tty, "sio", SIO, NSIO, 0); 81490300419SAndrey A. Chernov if (nl[NRC].n_type != 0) 815a9aa8c37SPeter Wemm ttytype(tty, "rc", RC, NRC, 0); 81624f769b0SBruce Evans if (nl[NCY].n_type != 0) 817a9aa8c37SPeter Wemm ttytype(tty, "cy", CY, NCY, 0); 818a9aa8c37SPeter Wemm if (nl[NSI].n_type != 0) 819a9aa8c37SPeter Wemm ttytype(tty, "si", SI, NSI, 1); 8205a3391bfSAndrey A. Chernov #endif 821dea673e9SRodney W. Grimes if (nl[SNPTY].n_type != 0) 822a9aa8c37SPeter Wemm ttytype(tty, "pty", SPTY, SNPTY, 0); 823dea673e9SRodney W. Grimes } 824dea673e9SRodney W. Grimes 825dea673e9SRodney W. Grimes void 826a9aa8c37SPeter Wemm ttytype(tty, name, type, number, indir) 827dea673e9SRodney W. Grimes register struct tty *tty; 828dea673e9SRodney W. Grimes char *name; 829a9aa8c37SPeter Wemm int type, number, indir; 830dea673e9SRodney W. Grimes { 831dea673e9SRodney W. Grimes register struct tty *tp; 832dea673e9SRodney W. Grimes int ntty; 833a9aa8c37SPeter Wemm struct tty **ttyaddr; 834dea673e9SRodney W. Grimes 835dea673e9SRodney W. Grimes if (tty == NULL) 836dea673e9SRodney W. Grimes return; 837dea673e9SRodney W. Grimes KGET(number, ntty); 838dea673e9SRodney W. Grimes (void)printf("%d %s %s\n", ntty, name, (ntty == 1) ? "line" : "lines"); 839dea673e9SRodney W. Grimes if (ntty > ttyspace) { 840dea673e9SRodney W. Grimes ttyspace = ntty; 841dea673e9SRodney W. Grimes if ((tty = realloc(tty, ttyspace * sizeof(*tty))) == 0) 842dea673e9SRodney W. Grimes err(1, NULL); 843dea673e9SRodney W. Grimes } 844a9aa8c37SPeter Wemm if (indir) { 845a9aa8c37SPeter Wemm KGET(type, ttyaddr); 846a9aa8c37SPeter Wemm KGET2(ttyaddr, tty, ntty * sizeof(struct tty), "tty structs"); 847a9aa8c37SPeter Wemm } else { 848dea673e9SRodney W. Grimes KGET1(type, tty, ntty * sizeof(struct tty), "tty structs"); 849a9aa8c37SPeter Wemm } 850dea673e9SRodney W. Grimes (void)printf(hdr); 851dea673e9SRodney W. Grimes for (tp = tty; tp < &tty[ntty]; tp++) 852dea673e9SRodney W. Grimes ttyprt(tp, tp - tty); 853dea673e9SRodney W. Grimes } 854dea673e9SRodney W. Grimes 855dea673e9SRodney W. Grimes struct { 856dea673e9SRodney W. Grimes int flag; 857dea673e9SRodney W. Grimes char val; 858dea673e9SRodney W. Grimes } ttystates[] = { 85924f769b0SBruce Evans #ifdef TS_WOPEN 860dea673e9SRodney W. Grimes { TS_WOPEN, 'W'}, 86124f769b0SBruce Evans #endif 862dea673e9SRodney W. Grimes { TS_ISOPEN, 'O'}, 863dea673e9SRodney W. Grimes { TS_CARR_ON, 'C'}, 86424f769b0SBruce Evans #ifdef TS_CONNECTED 86524f769b0SBruce Evans { TS_CONNECTED, 'c'}, 86624f769b0SBruce Evans #endif 867dea673e9SRodney W. Grimes { TS_TIMEOUT, 'T'}, 868dea673e9SRodney W. Grimes { TS_FLUSH, 'F'}, 869dea673e9SRodney W. Grimes { TS_BUSY, 'B'}, 87024f769b0SBruce Evans #ifdef TS_ASLEEP 871dea673e9SRodney W. Grimes { TS_ASLEEP, 'A'}, 87224f769b0SBruce Evans #endif 87324f769b0SBruce Evans #ifdef TS_SO_OLOWAT 87424f769b0SBruce Evans { TS_SO_OLOWAT, 'A'}, 87524f769b0SBruce Evans #endif 87624f769b0SBruce Evans #ifdef TS_SO_OCOMPLETE 87724f769b0SBruce Evans { TS_SO_OCOMPLETE, 'a'}, 87824f769b0SBruce Evans #endif 879dea673e9SRodney W. Grimes { TS_XCLUDE, 'X'}, 880dea673e9SRodney W. Grimes { TS_TTSTOP, 'S'}, 88124f769b0SBruce Evans #ifdef TS_CAR_OFLOW 88224f769b0SBruce Evans { TS_CAR_OFLOW, 'm'}, 88324f769b0SBruce Evans #endif 88424f769b0SBruce Evans #ifdef TS_CTS_OFLOW 88524f769b0SBruce Evans { TS_CTS_OFLOW, 'o'}, 88624f769b0SBruce Evans #endif 88724f769b0SBruce Evans #ifdef TS_DSR_OFLOW 88824f769b0SBruce Evans { TS_DSR_OFLOW, 'd'}, 88924f769b0SBruce Evans #endif 890dea673e9SRodney W. Grimes { TS_TBLOCK, 'K'}, 891dea673e9SRodney W. Grimes { TS_ASYNC, 'Y'}, 892dea673e9SRodney W. Grimes { TS_BKSL, 'D'}, 893dea673e9SRodney W. Grimes { TS_ERASE, 'E'}, 894dea673e9SRodney W. Grimes { TS_LNCH, 'L'}, 895dea673e9SRodney W. Grimes { TS_TYPEN, 'P'}, 896dea673e9SRodney W. Grimes { TS_CNTTB, 'N'}, 89724f769b0SBruce Evans #ifdef TS_CAN_BYPASS_L_RINT 898020531ceSAndrey A. Chernov { TS_CAN_BYPASS_L_RINT, 'l'}, 899020531ceSAndrey A. Chernov #endif 90024f769b0SBruce Evans #ifdef TS_SNOOP 90124f769b0SBruce Evans { TS_SNOOP, 's'}, 90224f769b0SBruce Evans #endif 90324f769b0SBruce Evans #ifdef TS_ZOMBIE 90424f769b0SBruce Evans { TS_ZOMBIE, 'Z'}, 90524f769b0SBruce Evans #endif 906dea673e9SRodney W. Grimes { 0, '\0'}, 907dea673e9SRodney W. Grimes }; 908dea673e9SRodney W. Grimes 909dea673e9SRodney W. Grimes void 910dea673e9SRodney W. Grimes ttyprt(tp, line) 911dea673e9SRodney W. Grimes register struct tty *tp; 912dea673e9SRodney W. Grimes int line; 913dea673e9SRodney W. Grimes { 914dea673e9SRodney W. Grimes register int i, j; 915dea673e9SRodney W. Grimes pid_t pgid; 916dea673e9SRodney W. Grimes char *name, state[20]; 917dea673e9SRodney W. Grimes 918dea673e9SRodney W. Grimes if (usenumflag || tp->t_dev == 0 || 919dea673e9SRodney W. Grimes (name = devname(tp->t_dev, S_IFCHR)) == NULL) 920dea673e9SRodney W. Grimes (void)printf("%7d ", line); 921dea673e9SRodney W. Grimes else 922dea673e9SRodney W. Grimes (void)printf("%7s ", name); 923dea673e9SRodney W. Grimes (void)printf("%2d %3d ", tp->t_rawq.c_cc, tp->t_canq.c_cc); 9245a3391bfSAndrey A. Chernov (void)printf("%3d %4d %3d %7d ", tp->t_outq.c_cc, 925dea673e9SRodney W. Grimes tp->t_hiwat, tp->t_lowat, tp->t_column); 926dea673e9SRodney W. Grimes for (i = j = 0; ttystates[i].flag; i++) 927dea673e9SRodney W. Grimes if (tp->t_state&ttystates[i].flag) 928dea673e9SRodney W. Grimes state[j++] = ttystates[i].val; 929dea673e9SRodney W. Grimes if (j == 0) 930dea673e9SRodney W. Grimes state[j++] = '-'; 931dea673e9SRodney W. Grimes state[j] = '\0'; 932dea673e9SRodney W. Grimes (void)printf("%-4s %6x", state, (u_long)tp->t_session & ~KERNBASE); 933dea673e9SRodney W. Grimes pgid = 0; 934dea673e9SRodney W. Grimes if (tp->t_pgrp != NULL) 935dea673e9SRodney W. Grimes KGET2(&tp->t_pgrp->pg_id, &pgid, sizeof(pid_t), "pgid"); 936dea673e9SRodney W. Grimes (void)printf("%6d ", pgid); 937dea673e9SRodney W. Grimes switch (tp->t_line) { 938dea673e9SRodney W. Grimes case TTYDISC: 939dea673e9SRodney W. Grimes (void)printf("term\n"); 940dea673e9SRodney W. Grimes break; 94190300419SAndrey A. Chernov case NTTYDISC: 94290300419SAndrey A. Chernov (void)printf("ntty\n"); 94390300419SAndrey A. Chernov break; 944dea673e9SRodney W. Grimes case TABLDISC: 945dea673e9SRodney W. Grimes (void)printf("tab\n"); 946dea673e9SRodney W. Grimes break; 947dea673e9SRodney W. Grimes case SLIPDISC: 948dea673e9SRodney W. Grimes (void)printf("slip\n"); 949dea673e9SRodney W. Grimes break; 95090300419SAndrey A. Chernov case PPPDISC: 95190300419SAndrey A. Chernov (void)printf("ppp\n"); 95290300419SAndrey A. Chernov break; 953dea673e9SRodney W. Grimes default: 954dea673e9SRodney W. Grimes (void)printf("%d\n", tp->t_line); 955dea673e9SRodney W. Grimes break; 956dea673e9SRodney W. Grimes } 957dea673e9SRodney W. Grimes } 958dea673e9SRodney W. Grimes 959dea673e9SRodney W. Grimes void 960dea673e9SRodney W. Grimes filemode() 961dea673e9SRodney W. Grimes { 962dea673e9SRodney W. Grimes register struct file *fp; 963dea673e9SRodney W. Grimes struct file *addr; 964dea673e9SRodney W. Grimes char *buf, flagbuf[16], *fbp; 965dea673e9SRodney W. Grimes int len, maxfile, nfile; 966dea673e9SRodney W. Grimes static char *dtypes[] = { "???", "inode", "socket" }; 967dea673e9SRodney W. Grimes 968dea673e9SRodney W. Grimes KGET(FNL_MAXFILE, maxfile); 969dea673e9SRodney W. Grimes if (totalflag) { 970dea673e9SRodney W. Grimes KGET(FNL_NFILE, nfile); 971dea673e9SRodney W. Grimes (void)printf("%3d/%3d files\n", nfile, maxfile); 972dea673e9SRodney W. Grimes return; 973dea673e9SRodney W. Grimes } 974dea673e9SRodney W. Grimes if (getfiles(&buf, &len) == -1) 975dea673e9SRodney W. Grimes return; 976dea673e9SRodney W. Grimes /* 977dea673e9SRodney W. Grimes * Getfiles returns in malloc'd memory a pointer to the first file 978dea673e9SRodney W. Grimes * structure, and then an array of file structs (whose addresses are 979dea673e9SRodney W. Grimes * derivable from the previous entry). 980dea673e9SRodney W. Grimes */ 98198d69008SJeffrey Hsu addr = ((struct filelist *)buf)->lh_first; 98298d69008SJeffrey Hsu fp = (struct file *)(buf + sizeof(struct filelist)); 98398d69008SJeffrey Hsu nfile = (len - sizeof(struct filelist)) / sizeof(struct file); 984dea673e9SRodney W. Grimes 985dea673e9SRodney W. Grimes (void)printf("%d/%d open files\n", nfile, maxfile); 986dea673e9SRodney W. Grimes (void)printf(" LOC TYPE FLG CNT MSG DATA OFFSET\n"); 98798d69008SJeffrey Hsu for (; (char *)fp < buf + len; addr = fp->f_list.le_next, fp++) { 988dea673e9SRodney W. Grimes if ((unsigned)fp->f_type > DTYPE_SOCKET) 989dea673e9SRodney W. Grimes continue; 990dea673e9SRodney W. Grimes (void)printf("%x ", addr); 991dea673e9SRodney W. Grimes (void)printf("%-8.8s", dtypes[fp->f_type]); 992dea673e9SRodney W. Grimes fbp = flagbuf; 993dea673e9SRodney W. Grimes if (fp->f_flag & FREAD) 994dea673e9SRodney W. Grimes *fbp++ = 'R'; 995dea673e9SRodney W. Grimes if (fp->f_flag & FWRITE) 996dea673e9SRodney W. Grimes *fbp++ = 'W'; 997dea673e9SRodney W. Grimes if (fp->f_flag & FAPPEND) 998dea673e9SRodney W. Grimes *fbp++ = 'A'; 999dea673e9SRodney W. Grimes #ifdef FSHLOCK /* currently gone */ 1000dea673e9SRodney W. Grimes if (fp->f_flag & FSHLOCK) 1001dea673e9SRodney W. Grimes *fbp++ = 'S'; 1002dea673e9SRodney W. Grimes if (fp->f_flag & FEXLOCK) 1003dea673e9SRodney W. Grimes *fbp++ = 'X'; 1004dea673e9SRodney W. Grimes #endif 1005dea673e9SRodney W. Grimes if (fp->f_flag & FASYNC) 1006dea673e9SRodney W. Grimes *fbp++ = 'I'; 1007dea673e9SRodney W. Grimes *fbp = '\0'; 1008dea673e9SRodney W. Grimes (void)printf("%6s %3d", flagbuf, fp->f_count); 1009dea673e9SRodney W. Grimes (void)printf(" %3d", fp->f_msgcount); 1010dea673e9SRodney W. Grimes (void)printf(" %8.1x", fp->f_data); 1011dea673e9SRodney W. Grimes if (fp->f_offset < 0) 1012dea673e9SRodney W. Grimes (void)printf(" %qx\n", fp->f_offset); 1013dea673e9SRodney W. Grimes else 1014dea673e9SRodney W. Grimes (void)printf(" %qd\n", fp->f_offset); 1015dea673e9SRodney W. Grimes } 1016dea673e9SRodney W. Grimes free(buf); 1017dea673e9SRodney W. Grimes } 1018dea673e9SRodney W. Grimes 1019dea673e9SRodney W. Grimes int 1020dea673e9SRodney W. Grimes getfiles(abuf, alen) 1021dea673e9SRodney W. Grimes char **abuf; 1022dea673e9SRodney W. Grimes int *alen; 1023dea673e9SRodney W. Grimes { 1024dea673e9SRodney W. Grimes size_t len; 1025dea673e9SRodney W. Grimes int mib[2]; 1026dea673e9SRodney W. Grimes char *buf; 1027dea673e9SRodney W. Grimes 1028dea673e9SRodney W. Grimes /* 1029dea673e9SRodney W. Grimes * XXX 1030dea673e9SRodney W. Grimes * Add emulation of KINFO_FILE here. 1031dea673e9SRodney W. Grimes */ 1032dea673e9SRodney W. Grimes if (memf != NULL) 1033dea673e9SRodney W. Grimes errx(1, "files on dead kernel, not implemented\n"); 1034dea673e9SRodney W. Grimes 1035dea673e9SRodney W. Grimes mib[0] = CTL_KERN; 1036dea673e9SRodney W. Grimes mib[1] = KERN_FILE; 1037dea673e9SRodney W. Grimes if (sysctl(mib, 2, NULL, &len, NULL, 0) == -1) { 1038dea673e9SRodney W. Grimes warn("sysctl: KERN_FILE"); 1039dea673e9SRodney W. Grimes return (-1); 1040dea673e9SRodney W. Grimes } 1041dea673e9SRodney W. Grimes if ((buf = malloc(len)) == NULL) 1042dea673e9SRodney W. Grimes err(1, NULL); 1043dea673e9SRodney W. Grimes if (sysctl(mib, 2, buf, &len, NULL, 0) == -1) { 1044dea673e9SRodney W. Grimes warn("sysctl: KERN_FILE"); 1045dea673e9SRodney W. Grimes return (-1); 1046dea673e9SRodney W. Grimes } 1047dea673e9SRodney W. Grimes *abuf = buf; 1048dea673e9SRodney W. Grimes *alen = len; 1049dea673e9SRodney W. Grimes return (0); 1050dea673e9SRodney W. Grimes } 1051dea673e9SRodney W. Grimes 1052dea673e9SRodney W. Grimes /* 1053dea673e9SRodney W. Grimes * swapmode is based on a program called swapinfo written 1054dea673e9SRodney W. Grimes * by Kevin Lahey <kml@rokkaku.atl.ga.us>. 1055dea673e9SRodney W. Grimes */ 1056dea673e9SRodney W. Grimes void 1057dea673e9SRodney W. Grimes swapmode() 1058dea673e9SRodney W. Grimes { 1059dea673e9SRodney W. Grimes char *header; 10601cb2c626SDavid Greenman int hlen, nswap, nswdev, dmmax; 1061e96c5424SDavid Greenman int i, div, avail, nfree, npfree, used; 1062dea673e9SRodney W. Grimes struct swdevt *sw; 1063dea673e9SRodney W. Grimes long blocksize, *perdev; 10641cb2c626SDavid Greenman struct rlist head; 1065739a189aSJohn Dyson struct rlisthdr swaplist; 1066739a189aSJohn Dyson struct rlist *swapptr; 10671295400eSDavid Greenman u_long ptr; 1068dea673e9SRodney W. Grimes 1069dea673e9SRodney W. Grimes KGET(VM_NSWAP, nswap); 1070dea673e9SRodney W. Grimes KGET(VM_NSWDEV, nswdev); 1071dea673e9SRodney W. Grimes KGET(VM_DMMAX, dmmax); 1072739a189aSJohn Dyson KGET1(VM_SWAPLIST, &swaplist, sizeof swaplist, "swaplist"); 1073dea673e9SRodney W. Grimes if ((sw = malloc(nswdev * sizeof(*sw))) == NULL || 10741cb2c626SDavid Greenman (perdev = malloc(nswdev * sizeof(*perdev))) == NULL) 1075dea673e9SRodney W. Grimes err(1, "malloc"); 10761295400eSDavid Greenman KGET1(VM_SWDEVT, &ptr, sizeof ptr, "swdevt"); 10771295400eSDavid Greenman KGET2(ptr, sw, nswdev * sizeof(*sw), "*swdevt"); 1078dea673e9SRodney W. Grimes 1079dea673e9SRodney W. Grimes /* Count up swap space. */ 1080dea673e9SRodney W. Grimes nfree = 0; 1081dea673e9SRodney W. Grimes memset(perdev, 0, nswdev * sizeof(*perdev)); 1082739a189aSJohn Dyson swapptr = swaplist.rlh_list; 1083739a189aSJohn Dyson while (swapptr) { 10841cb2c626SDavid Greenman int top, bottom, next_block; 10851cb2c626SDavid Greenman 1086739a189aSJohn Dyson KGET2(swapptr, &head, sizeof(struct rlist), "swapptr"); 10871cb2c626SDavid Greenman 10881cb2c626SDavid Greenman top = head.rl_end; 10891cb2c626SDavid Greenman bottom = head.rl_start; 10901cb2c626SDavid Greenman 10911cb2c626SDavid Greenman nfree += top - bottom + 1; 1092dea673e9SRodney W. Grimes 1093dea673e9SRodney W. Grimes /* 1094dea673e9SRodney W. Grimes * Swap space is split up among the configured disks. 1095dea673e9SRodney W. Grimes * 1096dea673e9SRodney W. Grimes * For interleaved swap devices, the first dmmax blocks 1097dea673e9SRodney W. Grimes * of swap space some from the first disk, the next dmmax 10981cb2c626SDavid Greenman * blocks from the next, and so on up to nswap blocks. 1099dea673e9SRodney W. Grimes * 1100dea673e9SRodney W. Grimes * The list of free space joins adjacent free blocks, 1101dea673e9SRodney W. Grimes * ignoring device boundries. If we want to keep track 1102dea673e9SRodney W. Grimes * of this information per device, we'll just have to 11031cb2c626SDavid Greenman * extract it ourselves. 1104dea673e9SRodney W. Grimes */ 11051cb2c626SDavid Greenman while (top / dmmax != bottom / dmmax) { 11061cb2c626SDavid Greenman next_block = ((bottom + dmmax) / dmmax); 11071cb2c626SDavid Greenman perdev[(bottom / dmmax) % nswdev] += 11081cb2c626SDavid Greenman next_block * dmmax - bottom; 11091cb2c626SDavid Greenman bottom = next_block * dmmax; 11101cb2c626SDavid Greenman } 11111cb2c626SDavid Greenman perdev[(bottom / dmmax) % nswdev] += 11121cb2c626SDavid Greenman top - bottom + 1; 1113dea673e9SRodney W. Grimes 1114739a189aSJohn Dyson swapptr = head.rl_next; 1115dea673e9SRodney W. Grimes } 1116dea673e9SRodney W. Grimes 1117dea673e9SRodney W. Grimes header = getbsize(&hlen, &blocksize); 1118dea673e9SRodney W. Grimes if (!totalflag) 1119dea673e9SRodney W. Grimes (void)printf("%-11s %*s %8s %8s %8s %s\n", 1120dea673e9SRodney W. Grimes "Device", hlen, header, 1121dea673e9SRodney W. Grimes "Used", "Avail", "Capacity", "Type"); 1122dea673e9SRodney W. Grimes div = blocksize / 512; 1123dea673e9SRodney W. Grimes avail = npfree = 0; 1124dea673e9SRodney W. Grimes for (i = 0; i < nswdev; i++) { 1125dea673e9SRodney W. Grimes int xsize, xfree; 1126dea673e9SRodney W. Grimes 112759392fe2SPoul-Henning Kamp /* 112859392fe2SPoul-Henning Kamp * Don't report statistics for partitions which have not 112959392fe2SPoul-Henning Kamp * yet been activated via swapon(8). 113059392fe2SPoul-Henning Kamp */ 113159392fe2SPoul-Henning Kamp if (!(sw[i].sw_flags & SW_FREED)) 113259392fe2SPoul-Henning Kamp continue; 113359392fe2SPoul-Henning Kamp 1134dea673e9SRodney W. Grimes if (!totalflag) 1135dea673e9SRodney W. Grimes (void)printf("/dev/%-6s %*d ", 1136dea673e9SRodney W. Grimes devname(sw[i].sw_dev, S_IFBLK), 1137dea673e9SRodney W. Grimes hlen, sw[i].sw_nblks / div); 1138dea673e9SRodney W. Grimes 11392df6483fSPoul-Henning Kamp /* The first dmmax is never allocated to avoid trashing of 11402df6483fSPoul-Henning Kamp * disklabels 11412df6483fSPoul-Henning Kamp */ 11422df6483fSPoul-Henning Kamp xsize = sw[i].sw_nblks - dmmax; 1143dea673e9SRodney W. Grimes xfree = perdev[i]; 1144dea673e9SRodney W. Grimes used = xsize - xfree; 1145dea673e9SRodney W. Grimes npfree++; 1146dea673e9SRodney W. Grimes avail += xsize; 1147dea673e9SRodney W. Grimes if (totalflag) 1148dea673e9SRodney W. Grimes continue; 1149dea673e9SRodney W. Grimes (void)printf("%8d %8d %5.0f%% %s\n", 1150dea673e9SRodney W. Grimes used / div, xfree / div, 1151dea673e9SRodney W. Grimes (double)used / (double)xsize * 100.0, 1152dea673e9SRodney W. Grimes (sw[i].sw_flags & SW_SEQUENTIAL) ? 1153dea673e9SRodney W. Grimes "Sequential" : "Interleaved"); 1154dea673e9SRodney W. Grimes } 1155dea673e9SRodney W. Grimes 1156dea673e9SRodney W. Grimes /* 1157dea673e9SRodney W. Grimes * If only one partition has been set up via swapon(8), we don't 1158dea673e9SRodney W. Grimes * need to bother with totals. 1159dea673e9SRodney W. Grimes */ 1160dea673e9SRodney W. Grimes used = avail - nfree; 1161fb59e630SJordan K. Hubbard free(sw); 1162fb59e630SJordan K. Hubbard free(perdev); 1163dea673e9SRodney W. Grimes if (totalflag) { 1164dea673e9SRodney W. Grimes (void)printf("%dM/%dM swap space\n", used / 2048, avail / 2048); 1165dea673e9SRodney W. Grimes return; 1166dea673e9SRodney W. Grimes } 1167dea673e9SRodney W. Grimes if (npfree > 1) { 1168dea673e9SRodney W. Grimes (void)printf("%-11s %*d %8d %8d %5.0f%%\n", 1169dea673e9SRodney W. Grimes "Total", hlen, avail / div, used / div, nfree / div, 1170dea673e9SRodney W. Grimes (double)used / (double)avail * 100.0); 1171dea673e9SRodney W. Grimes } 1172dea673e9SRodney W. Grimes } 1173