nfsstat.c revision 50477
11590Srgrimes/* 21590Srgrimes * Copyright (c) 1983, 1989, 1993 31590Srgrimes * The Regents of the University of California. All rights reserved. 41590Srgrimes * 51590Srgrimes * This code is derived from software contributed to Berkeley by 61590Srgrimes * Rick Macklem at The University of Guelph. 71590Srgrimes * 81590Srgrimes * Redistribution and use in source and binary forms, with or without 91590Srgrimes * modification, are permitted provided that the following conditions 101590Srgrimes * are met: 111590Srgrimes * 1. Redistributions of source code must retain the above copyright 121590Srgrimes * notice, this list of conditions and the following disclaimer. 131590Srgrimes * 2. Redistributions in binary form must reproduce the above copyright 141590Srgrimes * notice, this list of conditions and the following disclaimer in the 151590Srgrimes * documentation and/or other materials provided with the distribution. 161590Srgrimes * 3. All advertising materials mentioning features or use of this software 171590Srgrimes * must display the following acknowledgement: 181590Srgrimes * This product includes software developed by the University of 191590Srgrimes * California, Berkeley and its contributors. 201590Srgrimes * 4. Neither the name of the University nor the names of its contributors 211590Srgrimes * may be used to endorse or promote products derived from this software 221590Srgrimes * without specific prior written permission. 231590Srgrimes * 241590Srgrimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 251590Srgrimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 261590Srgrimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 271590Srgrimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 281590Srgrimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 291590Srgrimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 301590Srgrimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 311590Srgrimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 321590Srgrimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 331590Srgrimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 341590Srgrimes * SUCH DAMAGE. 351590Srgrimes */ 361590Srgrimes 371590Srgrimes#ifndef lint 381590Srgrimesstatic char copyright[] = 391590Srgrimes"@(#) Copyright (c) 1983, 1989, 1993\n\ 401590Srgrimes The Regents of the University of California. All rights reserved.\n"; 411590Srgrimes#endif /* not lint */ 421590Srgrimes 431590Srgrimes#ifndef lint 4432649Sbde#if 0 4532649Sbdestatic char sccsid[] = "@(#)nfsstat.c 8.2 (Berkeley) 3/31/95"; 4632649Sbde#endif 473819Swollmanstatic const char rcsid[] = 4850477Speter "$FreeBSD: head/usr.bin/nfsstat/nfsstat.c 50477 1999-08-28 01:08:13Z peter $"; 491590Srgrimes#endif /* not lint */ 501590Srgrimes 511590Srgrimes#include <sys/param.h> 521590Srgrimes#include <sys/mount.h> 5311936Sphk#include <sys/time.h> 543819Swollman#include <sys/sysctl.h> 559336Sdfr#include <nfs/rpcv2.h> 569336Sdfr#include <nfs/nfsproto.h> 571590Srgrimes#include <nfs/nfs.h> 581590Srgrimes#include <signal.h> 591590Srgrimes#include <fcntl.h> 601590Srgrimes#include <ctype.h> 611590Srgrimes#include <errno.h> 621590Srgrimes#include <kvm.h> 631590Srgrimes#include <nlist.h> 641590Srgrimes#include <unistd.h> 651590Srgrimes#include <stdio.h> 661590Srgrimes#include <stdlib.h> 671590Srgrimes#include <string.h> 681590Srgrimes#include <paths.h> 693819Swollman#include <err.h> 701590Srgrimes 711590Srgrimesstruct nlist nl[] = { 721590Srgrimes#define N_NFSSTAT 0 731590Srgrimes { "_nfsstats" }, 741590Srgrimes "", 751590Srgrimes}; 761590Srgrimeskvm_t *kd; 771590Srgrimes 783819Swollmanstatic int deadkernel = 0; 791590Srgrimes 809336Sdfrvoid intpr __P((void)); 819336Sdfrvoid printhdr __P((void)); 829336Sdfrvoid sidewaysintpr __P((u_int)); 839336Sdfrvoid usage __P((void)); 843819Swollman 851590Srgrimesmain(argc, argv) 861590Srgrimes int argc; 871590Srgrimes char **argv; 881590Srgrimes{ 891590Srgrimes extern int optind; 901590Srgrimes extern char *optarg; 911590Srgrimes u_int interval; 921590Srgrimes int ch; 931590Srgrimes char *memf, *nlistf; 941590Srgrimes char errbuf[80]; 951590Srgrimes 961590Srgrimes interval = 0; 971590Srgrimes memf = nlistf = NULL; 9824360Simp while ((ch = getopt(argc, argv, "M:N:w:")) != -1) 991590Srgrimes switch(ch) { 1001590Srgrimes case 'M': 1011590Srgrimes memf = optarg; 1021590Srgrimes break; 1031590Srgrimes case 'N': 1041590Srgrimes nlistf = optarg; 1051590Srgrimes break; 1061590Srgrimes case 'w': 1071590Srgrimes interval = atoi(optarg); 1081590Srgrimes break; 1091590Srgrimes case '?': 1101590Srgrimes default: 1111590Srgrimes usage(); 1121590Srgrimes } 1131590Srgrimes argc -= optind; 1141590Srgrimes argv += optind; 1151590Srgrimes 1161590Srgrimes#define BACKWARD_COMPATIBILITY 1171590Srgrimes#ifdef BACKWARD_COMPATIBILITY 1181590Srgrimes if (*argv) { 1191590Srgrimes interval = atoi(*argv); 1201590Srgrimes if (*++argv) { 1211590Srgrimes nlistf = *argv; 1221590Srgrimes if (*++argv) 1231590Srgrimes memf = *argv; 1241590Srgrimes } 1251590Srgrimes } 1261590Srgrimes#endif 1271590Srgrimes /* 1281590Srgrimes * Discard setgid privileges if not the running kernel so that bad 1291590Srgrimes * guys can't print interesting stuff from kernel memory. 1301590Srgrimes */ 1313819Swollman if (nlistf != NULL || memf != NULL) { 1321590Srgrimes setgid(getgid()); 1333819Swollman deadkernel = 1; 1341590Srgrimes 1353819Swollman if ((kd = kvm_openfiles(nlistf, memf, NULL, O_RDONLY, 1363819Swollman errbuf)) == 0) { 1373819Swollman errx(1, "kvm_openfiles: %s", errbuf); 1383819Swollman } 1393819Swollman if (kvm_nlist(kd, nl) != 0) { 1403819Swollman errx(1, "kvm_nlist: can't get names"); 1413819Swollman } 1421590Srgrimes } 1431590Srgrimes 1441590Srgrimes if (interval) 1453819Swollman sidewaysintpr(interval); 1461590Srgrimes else 1473819Swollman intpr(); 1481590Srgrimes exit(0); 1491590Srgrimes} 1501590Srgrimes 1511590Srgrimes/* 1523819Swollman * Read the nfs stats using sysctl(3) for live kernels, or kvm_read 1533819Swollman * for dead ones. 1543819Swollman */ 1553819Swollmanvoid 1569336Sdfrreadstats(stp) 1579336Sdfr struct nfsstats *stp; 1583819Swollman{ 1593819Swollman if(deadkernel) { 1603819Swollman if(kvm_read(kd, (u_long)nl[N_NFSSTAT].n_value, stp, 1613819Swollman sizeof *stp) < 0) { 1623819Swollman err(1, "kvm_read"); 1633819Swollman } 1643819Swollman } else { 16540638Sbde int name[3]; 1663819Swollman size_t buflen = sizeof *stp; 16740638Sbde struct vfsconf vfc; 1683819Swollman 16940638Sbde if (getvfsbyname("nfs", &vfc) < 0) 17040638Sbde err(1, "getvfsbyname: NFS not compiled into kernel"); 17140638Sbde name[0] = CTL_VFS; 17240638Sbde name[1] = vfc.vfc_typenum; 17340638Sbde name[2] = NFS_NFSSTATS; 17440638Sbde if (sysctl(name, 3, stp, &buflen, (void *)0, (size_t)0) < 0) { 1753819Swollman err(1, "sysctl"); 1763819Swollman } 1773819Swollman } 1783819Swollman} 1793819Swollman 1803819Swollman/* 1811590Srgrimes * Print a description of the nfs stats. 1821590Srgrimes */ 1831590Srgrimesvoid 1849336Sdfrintpr() 1851590Srgrimes{ 1861590Srgrimes struct nfsstats nfsstats; 1871590Srgrimes 1883819Swollman readstats(&nfsstats); 1893819Swollman 1901590Srgrimes printf("Client Info:\n"); 1911590Srgrimes printf("Rpc Counts:\n"); 1921590Srgrimes printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 1931590Srgrimes "Getattr", "Setattr", "Lookup", "Readlink", "Read", 1941590Srgrimes "Write", "Create", "Remove"); 1951590Srgrimes printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 1961590Srgrimes nfsstats.rpccnt[NFSPROC_GETATTR], 1971590Srgrimes nfsstats.rpccnt[NFSPROC_SETATTR], 1981590Srgrimes nfsstats.rpccnt[NFSPROC_LOOKUP], 1991590Srgrimes nfsstats.rpccnt[NFSPROC_READLINK], 2001590Srgrimes nfsstats.rpccnt[NFSPROC_READ], 2011590Srgrimes nfsstats.rpccnt[NFSPROC_WRITE], 2021590Srgrimes nfsstats.rpccnt[NFSPROC_CREATE], 2031590Srgrimes nfsstats.rpccnt[NFSPROC_REMOVE]); 2041590Srgrimes printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 2051590Srgrimes "Rename", "Link", "Symlink", "Mkdir", "Rmdir", 2069336Sdfr "Readdir", "RdirPlus", "Access"); 2071590Srgrimes printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 2081590Srgrimes nfsstats.rpccnt[NFSPROC_RENAME], 2091590Srgrimes nfsstats.rpccnt[NFSPROC_LINK], 2101590Srgrimes nfsstats.rpccnt[NFSPROC_SYMLINK], 2111590Srgrimes nfsstats.rpccnt[NFSPROC_MKDIR], 2121590Srgrimes nfsstats.rpccnt[NFSPROC_RMDIR], 2131590Srgrimes nfsstats.rpccnt[NFSPROC_READDIR], 2149336Sdfr nfsstats.rpccnt[NFSPROC_READDIRPLUS], 2159336Sdfr nfsstats.rpccnt[NFSPROC_ACCESS]); 2169336Sdfr printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 2179336Sdfr "Mknod", "Fsstat", "Fsinfo", "PathConf", "Commit", 2181590Srgrimes "GLease", "Vacate", "Evict"); 2199336Sdfr printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 2209336Sdfr nfsstats.rpccnt[NFSPROC_MKNOD], 2219336Sdfr nfsstats.rpccnt[NFSPROC_FSSTAT], 2229336Sdfr nfsstats.rpccnt[NFSPROC_FSINFO], 2239336Sdfr nfsstats.rpccnt[NFSPROC_PATHCONF], 2249336Sdfr nfsstats.rpccnt[NFSPROC_COMMIT], 2251590Srgrimes nfsstats.rpccnt[NQNFSPROC_GETLEASE], 2261590Srgrimes nfsstats.rpccnt[NQNFSPROC_VACATED], 2271590Srgrimes nfsstats.rpccnt[NQNFSPROC_EVICTED]); 2281590Srgrimes printf("Rpc Info:\n"); 2291590Srgrimes printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", 2301590Srgrimes "TimedOut", "Invalid", "X Replies", "Retries", "Requests"); 2311590Srgrimes printf("%9d %9d %9d %9d %9d\n", 2321590Srgrimes nfsstats.rpctimeouts, 2331590Srgrimes nfsstats.rpcinvalid, 2341590Srgrimes nfsstats.rpcunexpected, 2351590Srgrimes nfsstats.rpcretries, 2361590Srgrimes nfsstats.rpcrequests); 2371590Srgrimes printf("Cache Info:\n"); 2381590Srgrimes printf("%9.9s %9.9s %9.9s %9.9s", 2391590Srgrimes "Attr Hits", "Misses", "Lkup Hits", "Misses"); 2401590Srgrimes printf(" %9.9s %9.9s %9.9s %9.9s\n", 2411590Srgrimes "BioR Hits", "Misses", "BioW Hits", "Misses"); 2421590Srgrimes printf("%9d %9d %9d %9d", 2431590Srgrimes nfsstats.attrcache_hits, nfsstats.attrcache_misses, 2441590Srgrimes nfsstats.lookupcache_hits, nfsstats.lookupcache_misses); 2451590Srgrimes printf(" %9d %9d %9d %9d\n", 2461590Srgrimes nfsstats.biocache_reads-nfsstats.read_bios, 2471590Srgrimes nfsstats.read_bios, 2481590Srgrimes nfsstats.biocache_writes-nfsstats.write_bios, 2491590Srgrimes nfsstats.write_bios); 2501590Srgrimes printf("%9.9s %9.9s %9.9s %9.9s", 2511590Srgrimes "BioRLHits", "Misses", "BioD Hits", "Misses"); 2521590Srgrimes printf(" %9.9s %9.9s\n", "DirE Hits", "Misses"); 2531590Srgrimes printf("%9d %9d %9d %9d", 2541590Srgrimes nfsstats.biocache_readlinks-nfsstats.readlink_bios, 2551590Srgrimes nfsstats.readlink_bios, 2561590Srgrimes nfsstats.biocache_readdirs-nfsstats.readdir_bios, 2571590Srgrimes nfsstats.readdir_bios); 2581590Srgrimes printf(" %9d %9d\n", 2591590Srgrimes nfsstats.direofcache_hits, nfsstats.direofcache_misses); 2601590Srgrimes printf("\nServer Info:\n"); 2611590Srgrimes printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 2621590Srgrimes "Getattr", "Setattr", "Lookup", "Readlink", "Read", 2631590Srgrimes "Write", "Create", "Remove"); 2641590Srgrimes printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 2651590Srgrimes nfsstats.srvrpccnt[NFSPROC_GETATTR], 2661590Srgrimes nfsstats.srvrpccnt[NFSPROC_SETATTR], 2671590Srgrimes nfsstats.srvrpccnt[NFSPROC_LOOKUP], 2681590Srgrimes nfsstats.srvrpccnt[NFSPROC_READLINK], 2691590Srgrimes nfsstats.srvrpccnt[NFSPROC_READ], 2701590Srgrimes nfsstats.srvrpccnt[NFSPROC_WRITE], 2711590Srgrimes nfsstats.srvrpccnt[NFSPROC_CREATE], 2721590Srgrimes nfsstats.srvrpccnt[NFSPROC_REMOVE]); 2731590Srgrimes printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 2741590Srgrimes "Rename", "Link", "Symlink", "Mkdir", "Rmdir", 2759336Sdfr "Readdir", "RdirPlus", "Access"); 2761590Srgrimes printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 2771590Srgrimes nfsstats.srvrpccnt[NFSPROC_RENAME], 2781590Srgrimes nfsstats.srvrpccnt[NFSPROC_LINK], 2791590Srgrimes nfsstats.srvrpccnt[NFSPROC_SYMLINK], 2801590Srgrimes nfsstats.srvrpccnt[NFSPROC_MKDIR], 2811590Srgrimes nfsstats.srvrpccnt[NFSPROC_RMDIR], 2821590Srgrimes nfsstats.srvrpccnt[NFSPROC_READDIR], 2839336Sdfr nfsstats.srvrpccnt[NFSPROC_READDIRPLUS], 2849336Sdfr nfsstats.srvrpccnt[NFSPROC_ACCESS]); 2859336Sdfr printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 2869336Sdfr "Mknod", "Fsstat", "Fsinfo", "PathConf", "Commit", 2871590Srgrimes "GLease", "Vacate", "Evict"); 2889336Sdfr printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 2899336Sdfr nfsstats.srvrpccnt[NFSPROC_MKNOD], 2909336Sdfr nfsstats.srvrpccnt[NFSPROC_FSSTAT], 2919336Sdfr nfsstats.srvrpccnt[NFSPROC_FSINFO], 2929336Sdfr nfsstats.srvrpccnt[NFSPROC_PATHCONF], 2939336Sdfr nfsstats.srvrpccnt[NFSPROC_COMMIT], 2941590Srgrimes nfsstats.srvrpccnt[NQNFSPROC_GETLEASE], 2951590Srgrimes nfsstats.srvrpccnt[NQNFSPROC_VACATED], 2961590Srgrimes nfsstats.srvrpccnt[NQNFSPROC_EVICTED]); 2971590Srgrimes printf("Server Ret-Failed\n"); 2981590Srgrimes printf("%17d\n", nfsstats.srvrpc_errs); 2991590Srgrimes printf("Server Faults\n"); 3001590Srgrimes printf("%13d\n", nfsstats.srv_errs); 3011590Srgrimes printf("Server Cache Stats:\n"); 3021590Srgrimes printf("%9.9s %9.9s %9.9s %9.9s\n", 3031590Srgrimes "Inprog", "Idem", "Non-idem", "Misses"); 3041590Srgrimes printf("%9d %9d %9d %9d\n", 3051590Srgrimes nfsstats.srvcache_inproghits, 3061590Srgrimes nfsstats.srvcache_idemdonehits, 3071590Srgrimes nfsstats.srvcache_nonidemdonehits, 3081590Srgrimes nfsstats.srvcache_misses); 3091590Srgrimes printf("Server Lease Stats:\n"); 3101590Srgrimes printf("%9.9s %9.9s %9.9s\n", 3111590Srgrimes "Leases", "PeakL", "GLeases"); 3121590Srgrimes printf("%9d %9d %9d\n", 3131590Srgrimes nfsstats.srvnqnfs_leases, 3141590Srgrimes nfsstats.srvnqnfs_maxleases, 3151590Srgrimes nfsstats.srvnqnfs_getleases); 3169336Sdfr printf("Server Write Gathering:\n"); 3179336Sdfr printf("%9.9s %9.9s %9.9s\n", 3189336Sdfr "WriteOps", "WriteRPC", "Opsaved"); 3199336Sdfr printf("%9d %9d %9d\n", 3209336Sdfr nfsstats.srvvop_writes, 3219336Sdfr nfsstats.srvrpccnt[NFSPROC_WRITE], 3229336Sdfr nfsstats.srvrpccnt[NFSPROC_WRITE] - nfsstats.srvvop_writes); 3231590Srgrimes} 3241590Srgrimes 3251590Srgrimesu_char signalled; /* set if alarm goes off "early" */ 3261590Srgrimes 3271590Srgrimes/* 3281590Srgrimes * Print a running summary of nfs statistics. 3291590Srgrimes * Repeat display every interval seconds, showing statistics 3301590Srgrimes * collected over that interval. Assumes that interval is non-zero. 3311590Srgrimes * First line printed at top of screen is always cumulative. 3321590Srgrimes */ 3331590Srgrimesvoid 3343819Swollmansidewaysintpr(interval) 3351590Srgrimes u_int interval; 3361590Srgrimes{ 3371590Srgrimes struct nfsstats nfsstats, lastst; 3381590Srgrimes int hdrcnt, oldmask; 3391590Srgrimes void catchalarm(); 3401590Srgrimes 3411590Srgrimes (void)signal(SIGALRM, catchalarm); 3421590Srgrimes signalled = 0; 3431590Srgrimes (void)alarm(interval); 3441590Srgrimes bzero((caddr_t)&lastst, sizeof(lastst)); 3451590Srgrimes 3461590Srgrimes for (hdrcnt = 1;;) { 3471590Srgrimes if (!--hdrcnt) { 3481590Srgrimes printhdr(); 3491590Srgrimes hdrcnt = 20; 3501590Srgrimes } 3513819Swollman readstats(&nfsstats); 3521590Srgrimes printf("Client: %8d %8d %8d %8d %8d %8d %8d %8d\n", 3539336Sdfr nfsstats.rpccnt[NFSPROC_GETATTR]-lastst.rpccnt[NFSPROC_GETATTR], 3549336Sdfr nfsstats.rpccnt[NFSPROC_LOOKUP]-lastst.rpccnt[NFSPROC_LOOKUP], 3559336Sdfr nfsstats.rpccnt[NFSPROC_READLINK]-lastst.rpccnt[NFSPROC_READLINK], 3569336Sdfr nfsstats.rpccnt[NFSPROC_READ]-lastst.rpccnt[NFSPROC_READ], 3579336Sdfr nfsstats.rpccnt[NFSPROC_WRITE]-lastst.rpccnt[NFSPROC_WRITE], 3589336Sdfr nfsstats.rpccnt[NFSPROC_RENAME]-lastst.rpccnt[NFSPROC_RENAME], 3599336Sdfr nfsstats.rpccnt[NFSPROC_ACCESS]-lastst.rpccnt[NFSPROC_ACCESS], 3609336Sdfr (nfsstats.rpccnt[NFSPROC_READDIR]-lastst.rpccnt[NFSPROC_READDIR]) 3619336Sdfr +(nfsstats.rpccnt[NFSPROC_READDIRPLUS]-lastst.rpccnt[NFSPROC_READDIRPLUS])); 3621590Srgrimes printf("Server: %8d %8d %8d %8d %8d %8d %8d %8d\n", 3639336Sdfr nfsstats.srvrpccnt[NFSPROC_GETATTR]-lastst.srvrpccnt[NFSPROC_GETATTR], 3649336Sdfr nfsstats.srvrpccnt[NFSPROC_LOOKUP]-lastst.srvrpccnt[NFSPROC_LOOKUP], 3659336Sdfr nfsstats.srvrpccnt[NFSPROC_READLINK]-lastst.srvrpccnt[NFSPROC_READLINK], 3669336Sdfr nfsstats.srvrpccnt[NFSPROC_READ]-lastst.srvrpccnt[NFSPROC_READ], 3679336Sdfr nfsstats.srvrpccnt[NFSPROC_WRITE]-lastst.srvrpccnt[NFSPROC_WRITE], 3689336Sdfr nfsstats.srvrpccnt[NFSPROC_RENAME]-lastst.srvrpccnt[NFSPROC_RENAME], 3699336Sdfr nfsstats.srvrpccnt[NFSPROC_ACCESS]-lastst.srvrpccnt[NFSPROC_ACCESS], 3709336Sdfr (nfsstats.srvrpccnt[NFSPROC_READDIR]-lastst.srvrpccnt[NFSPROC_READDIR]) 3719336Sdfr +(nfsstats.srvrpccnt[NFSPROC_READDIRPLUS]-lastst.srvrpccnt[NFSPROC_READDIRPLUS])); 3721590Srgrimes lastst = nfsstats; 3731590Srgrimes fflush(stdout); 3741590Srgrimes oldmask = sigblock(sigmask(SIGALRM)); 3751590Srgrimes if (!signalled) 3761590Srgrimes sigpause(0); 3771590Srgrimes sigsetmask(oldmask); 3781590Srgrimes signalled = 0; 3791590Srgrimes (void)alarm(interval); 3801590Srgrimes } 3811590Srgrimes /*NOTREACHED*/ 3821590Srgrimes} 3831590Srgrimes 3841590Srgrimesvoid 3851590Srgrimesprinthdr() 3861590Srgrimes{ 3871590Srgrimes printf(" %8.8s %8.8s %8.8s %8.8s %8.8s %8.8s %8.8s %8.8s\n", 3881590Srgrimes "Getattr", "Lookup", "Readlink", "Read", "Write", "Rename", 3899336Sdfr "Access", "Readdir"); 3901590Srgrimes fflush(stdout); 3911590Srgrimes} 3921590Srgrimes 3931590Srgrimes/* 3941590Srgrimes * Called if an interval expires before sidewaysintpr has completed a loop. 3951590Srgrimes * Sets a flag to not wait for the alarm. 3961590Srgrimes */ 3971590Srgrimesvoid 3981590Srgrimescatchalarm() 3991590Srgrimes{ 4001590Srgrimes signalled = 1; 4011590Srgrimes} 4021590Srgrimes 4031590Srgrimesvoid 4041590Srgrimesusage() 4051590Srgrimes{ 4061590Srgrimes (void)fprintf(stderr, 4071590Srgrimes "usage: nfsstat [-M core] [-N system] [-w interval]\n"); 4081590Srgrimes exit(1); 4091590Srgrimes} 410