fsstat.c revision 5a59a8b3d86e67dbe75588879c46e3629f40efec
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb/*
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * CDDL HEADER START
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb *
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * The contents of this file are subject to the terms of the
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * Common Development and Distribution License (the "License").
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * You may not use this file except in compliance with the License.
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb *
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * or http://www.opensolaris.org/os/licensing.
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * See the License for the specific language governing permissions
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * and limitations under the License.
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb *
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * When distributing Covered Code, include this CDDL HEADER in each
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * If applicable, add the following below this CDDL HEADER, with the
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * fields enclosed by brackets "[]" replaced with your own identifying
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * information: Portions Copyright [yyyy] [name of copyright owner]
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb *
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * CDDL HEADER END
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb/*
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * Use is subject to license terms.
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#pragma ident "%Z%%M% %I% %E% SMI"
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#include <stdio.h>
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#include <kstat.h>
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#include <stdlib.h>
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#include <string.h>
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#include <strings.h>
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#include <errno.h>
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#include <limits.h>
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#include <sys/types.h>
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#include <time.h>
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#include <sys/time.h>
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#include <sys/uio.h>
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#include <sys/vnode.h>
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#include <sys/vfs.h>
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#include <sys/statvfs.h>
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#include <sys/fstyp.h>
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#include <sys/fsid.h>
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#include <sys/mnttab.h>
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#include <values.h>
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#include <poll.h>
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#include <ctype.h>
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#include <libintl.h>
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#define OPTIONS "PT:afginv"
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb/* Time stamp values */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#define NODATE 0 /* Default: No time stamp */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#define DDATE 1 /* Standard date format */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#define UDATE 2 /* Internal representation of Unix time */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#define RETRY_DELAY 250 /* Timeout for poll() */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#define HEADERLINES 22 /* Number of lines between display headers */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#define LBUFSZ 64 /* Generic size for local buffer */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb/*
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * The following are used for the nicenum() function
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#define KILO_VAL 1024
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#define ONE_INDEX 3
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#define NENTITY_INIT 1 /* Initial number of entities to allocate */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb/*
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * We need to have a mechanism for an old/previous and new/current vopstat
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * structure. We only need two per entity and we can swap between them.
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#define VS_SIZE 2 /* Size of vopstat array */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#define CUR_INDEX (vs_i)
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#define PREV_INDEX ((vs_i == 0) ? 1 : 0) /* Opposite of CUR_INDEX */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#define BUMP_INDEX() vs_i = ((vs_i == 0) ? 1 : 0)
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb/*
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * An "entity" is anything we're collecting statistics on, it could
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * be a mountpoint or an FS-type.
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * e_name is the name of the entity (e.g. mount point or FS-type)
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * e_ksname is the name of the associated kstat
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * e_vs is an array of vopstats. This is used to keep track of "previous"
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * and "current" vopstats.
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbtypedef struct entity {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb char *e_name; /* name of entity */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb vopstats_t *e_vs; /* Array of vopstats */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb ulong_t e_fsid; /* fsid for ENTYPE_MNTPT only */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb int e_type; /* type of entity */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb char e_ksname[KSTAT_STRLEN]; /* kstat name */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb} entity_t;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb/* Types of entities (e_type) */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#define ENTYPE_UNKNOWN 0 /* UNKNOWN must be zero since we calloc() */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#define ENTYPE_FSTYPE 1
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#define ENTYPE_MNTPT 2
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb/* If more sub-one units are added, make sure to adjust ONE_INDEX above */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbstatic char units[] = "num KMGTPE";
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbstatic char *cmdname; /* name of this command */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbstatic int vs_i = 0; /* Index of current vs[] slot */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbstatic void
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbusage()
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb{
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) fprintf(stderr,
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb gettext("Usage: %s [-a|f|i|n|v] [-P] [ fstype | fspath ]... "
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb "[interval [count]]\n"), cmdname);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb exit(2);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb}
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb/*
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * Given a 64-bit number and a starting unit (e.g., n - nanoseconds),
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * convert the number to a 5-character representation including any
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * decimal point and single-character unit. Put that representation
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * into the array "buf" (which had better be big enough).
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbchar *
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbnicenum(uint64_t num, char unit, char *buf)
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb{
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb uint64_t n = num;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb int unit_index;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb int index;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb char u;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb /* If the user passed in a NUL/zero unit, use the blank value for 1 */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (unit == '\0')
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb unit = ' ';
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb unit_index = 0;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb while (units[unit_index] != unit) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb unit_index++;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (unit_index > sizeof (units) - 1) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) sprintf(buf, "??");
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb return (buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb index = 0;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb while (n >= KILO_VAL) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb n = (n + (KILO_VAL / 2)) / KILO_VAL; /* Round up or down */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb index++;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb unit_index++;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (unit_index >= sizeof (units) - 1) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) sprintf(buf, "??");
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb return (buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb u = units[unit_index];
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (unit_index == ONE_INDEX) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) sprintf(buf, "%llu", (u_longlong_t)n);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb } else if (n < 10 && (num & (num - 1)) != 0) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) sprintf(buf, "%.2f%c",
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (double)num / (1ULL << 10 * index), u);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb } else if (n < 100 && (num & (num - 1)) != 0) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) sprintf(buf, "%.1f%c",
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (double)num / (1ULL << 10 * index), u);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb } else {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) sprintf(buf, "%llu%c", (u_longlong_t)n, u);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb return (buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb}
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#define RAWVAL(ptr, member) ((ptr)->member.value.ui64)
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#define DELTA(member) \
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (newvsp->member.value.ui64 - (oldvsp ? oldvsp->member.value.ui64 : 0))
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#define OLDPRINTSTAT(isnice, nicestring, niceval, rawstring, rawval) \
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (isnice) ? \
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) printf((nicestring), (niceval)) \
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb : \
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) printf((rawstring), (rawval))
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#define PRINTSTAT(isnice, nicestring, rawstring, rawval, unit, buf) \
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (isnice) ? \
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) printf((nicestring), nicenum(rawval, unit, buf)) \
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb : \
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) printf((rawstring), (rawval))
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb/* Values for display flag */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#define DISP_HEADER 0x1
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#define DISP_RAW 0x2
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb/*
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * The policy for dealing with multiple flags is dealt with here.
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * Currently, if we are displaying raw output, then don't allow
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * headers to be printed.
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbint
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbdispflag_policy(int printhdr, int dispflag)
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb{
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb /* If we're not displaying raw output, then allow headers to print */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if ((dispflag & DISP_RAW) == 0) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (printhdr) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb dispflag |= DISP_HEADER;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb return (dispflag);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb}
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbstatic void
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbdflt_display(char *name, vopstats_t *oldvsp, vopstats_t *newvsp, int dispflag)
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb{
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb int niceflag = ((dispflag & DISP_RAW) == 0);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb longlong_t nnewfile;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb longlong_t nnamerm;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb longlong_t nnamechg;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb longlong_t nattrret;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb longlong_t nattrchg;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb longlong_t nlookup;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb longlong_t nreaddir;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb longlong_t ndataread;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb longlong_t ndatawrite;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb longlong_t readthruput;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb longlong_t writethruput;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb char buf[LBUFSZ];
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb nnewfile = DELTA(ncreate) + DELTA(nmkdir) + DELTA(nsymlink);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb nnamerm = DELTA(nremove) + DELTA(nrmdir);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb nnamechg = DELTA(nrename) + DELTA(nlink) + DELTA(nsymlink);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb nattrret = DELTA(ngetattr) + DELTA(naccess) +
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb DELTA(ngetsecattr) + DELTA(nfid);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb nattrchg = DELTA(nsetattr) + DELTA(nsetsecattr) + DELTA(nspace);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb nlookup = DELTA(nlookup);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb nreaddir = DELTA(nreaddir);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb ndataread = DELTA(nread);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb ndatawrite = DELTA(nwrite);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb readthruput = DELTA(read_bytes);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb writethruput = DELTA(write_bytes);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (dispflag & DISP_HEADER) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) printf(gettext(
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb" new name name attr attr lookup rddir read read write write\n"
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb" file remov chng get set ops ops ops bytes ops bytes\n"));
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, "%5s ", "%lld:", nnewfile, ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, "%5s ", "%lld:", nnamerm, ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, "%5s ", "%lld:", nnamechg, ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, "%5s ", "%lld:", nattrret, ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, "%5s ", "%lld:", nattrchg, ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, " %5s ", "%lld:", nlookup, ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, "%5s ", "%lld:", nreaddir, ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, "%5s ", "%lld:", ndataread, ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, "%5s ", "%lld:", readthruput, ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, "%5s ", "%lld:", ndatawrite, ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, "%5s ", "%lld:", writethruput, ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) printf("%s\n", name);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb}
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbstatic void
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbio_display(char *name, vopstats_t *oldvsp, vopstats_t *newvsp, int dispflag)
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb{
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb int niceflag = ((dispflag & DISP_RAW) == 0);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb char buf[LBUFSZ];
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (dispflag & DISP_HEADER) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) printf(gettext(
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb" read read write write rddir rddir rwlock rwulock\n"
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb" ops bytes ops bytes ops bytes ops ops\n"));
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, "%5s ", "%lld:", DELTA(nread), ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, "%5s ", "%lld:", DELTA(read_bytes), ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, "%5s ", "%lld:", DELTA(nwrite), ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, "%5s ", "%lld:", DELTA(write_bytes), ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, "%5s ", "%lld:", DELTA(nreaddir), ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, "%5s ", "%lld:", DELTA(readdir_bytes), ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, " %5s ", "%lld:", DELTA(nrwlock), ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, "%5s ", "%lld:", DELTA(nrwunlock), ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) printf("%s\n", name);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb}
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbstatic void
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbvm_display(char *name, vopstats_t *oldvsp, vopstats_t *newvsp, int dispflag)
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb{
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb int niceflag = ((dispflag & DISP_RAW) == 0);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb char buf[LBUFSZ];
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (dispflag & DISP_HEADER) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) printf(
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb gettext(" map addmap delmap getpag putpag pagio\n"));
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, "%5s ", "%lld:", DELTA(nmap), ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, " %5s ", "%lld:", DELTA(naddmap), ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, " %5s ", "%lld:", DELTA(ndelmap), ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, " %5s ", "%lld:", DELTA(ngetpage), ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, " %5s ", "%lld:", DELTA(nputpage), ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, "%5s ", "%lld:", DELTA(npageio), ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) printf("%s\n", name);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb}
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbstatic void
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbattr_display(char *name, vopstats_t *oldvsp, vopstats_t *newvsp, int dispflag)
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb{
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb int niceflag = ((dispflag & DISP_RAW) == 0);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb char buf[LBUFSZ];
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (dispflag & DISP_HEADER) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) printf(gettext("getattr setattr getsec setsec\n"));
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, " %5s ", "%lld:", DELTA(ngetattr), ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, " %5s ", "%lld:", DELTA(nsetattr), ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, " %5s ", "%lld:", DELTA(ngetsecattr), ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, " %5s ", "%lld:", DELTA(nsetsecattr), ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) printf("%s\n", name);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb}
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbstatic void
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbnaming_display(char *name, vopstats_t *oldvsp, vopstats_t *newvsp, int dispflag)
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb{
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb int niceflag = ((dispflag & DISP_RAW) == 0);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb char buf[LBUFSZ];
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (dispflag & DISP_HEADER) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) printf(gettext(
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb "lookup creat remov link renam mkdir rmdir rddir symlnk rdlnk\n"));
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, "%5s ", "%lld:", DELTA(nlookup), ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, "%5s ", "%lld:", DELTA(ncreate), ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, "%5s ", "%lld:", DELTA(nremove), ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, "%5s ", "%lld:", DELTA(nlink), ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, "%5s ", "%lld:", DELTA(nrename), ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, "%5s ", "%lld:", DELTA(nmkdir), ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, "%5s ", "%lld:", DELTA(nrmdir), ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, "%5s ", "%lld:", DELTA(nreaddir), ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, " %5s ", "%lld:", DELTA(nsymlink), ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, "%5s ", "%lld:", DELTA(nreadlink), ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) printf("%s\n", name);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb}
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#define PRINT_VOPSTAT_CMN(niceflag, vop) \
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (niceflag) \
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) printf("%10s ", #vop); \
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, "%5s ", "%lld:", DELTA(n##vop), ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#define PRINT_VOPSTAT(niceflag, vop) \
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT_CMN(niceflag, vop); \
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (niceflag) \
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) printf("\n");
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb#define PRINT_VOPSTAT_IO(niceflag, vop) \
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT_CMN(niceflag, vop); \
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINTSTAT(niceflag, " %5s\n", "%lld:", \
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb DELTA(vop##_bytes), ' ', buf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbstatic void
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbvop_display(char *name, vopstats_t *oldvsp, vopstats_t *newvsp, int dispflag)
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb{
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb int niceflag = ((dispflag & DISP_RAW) == 0);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb char buf[LBUFSZ];
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (niceflag) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) printf("%s\n", name);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) printf(gettext(" operation #ops bytes\n"));
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, open);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, close);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT_IO(niceflag, read);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT_IO(niceflag, write);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, ioctl);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, setfl);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, getattr);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, setattr);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, access);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, lookup);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, create);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, remove);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, link);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, rename);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, mkdir);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, rmdir);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT_IO(niceflag, readdir);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, symlink);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, readlink);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, fsync);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, inactive);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, fid);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, rwlock);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, rwunlock);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, seek);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, cmp);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, frlock);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, space);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, realvp);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, getpage);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, putpage);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, map);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, addmap);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, delmap);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, poll);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, dump);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, pathconf);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, pageio);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, dumpctl);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, dispose);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, getsecattr);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, setsecattr);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, shrlock);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb PRINT_VOPSTAT(niceflag, vnevent);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (niceflag) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb /* Make it easier on the eyes */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) printf("\n");
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb } else {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) printf("%s\n", name);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb}
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb/*
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * Retrieve the vopstats. If kspp (pointer to kstat_t pointer) is non-NULL,
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * then pass it back to the caller.
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb *
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * Returns 0 on success, non-zero on failure.
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbint
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbget_vopstats(kstat_ctl_t *kc, char *ksname, vopstats_t *vsp, kstat_t **kspp)
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb{
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb kstat_t *ksp;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (ksname == NULL || *ksname == 0)
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb return (1);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb errno = 0;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb /* wait for a possibly up-to-date chain */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb while (kstat_chain_update(kc) == -1) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (errno == EAGAIN) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb errno = 0;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) poll(NULL, 0, RETRY_DELAY);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb continue;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb perror(gettext("kstat_chain_update"));
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb exit(1);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if ((ksp = kstat_lookup(kc, NULL, -1, ksname)) == NULL) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb return (1);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (kstat_read(kc, ksp, vsp) == -1) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb return (1);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (kspp)
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb *kspp = ksp;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb return (0);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb}
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb/*
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * Given a file system type name, determine if it's part of the
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * exception list of file systems that are not to be displayed.
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbint
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbis_exception(char *fsname)
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb{
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb char **xlp; /* Pointer into the exception list */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb static char *exception_list[] = {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb "specfs",
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb "fifofs",
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb "fd",
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb "swapfs",
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb "ctfs",
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb "objfs",
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb "nfsdyn",
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb NULL
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb };
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb for (xlp = &exception_list[0]; *xlp != NULL; xlp++) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (strcmp(fsname, *xlp) == 0)
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb return (1);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb return (0);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb}
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb/*
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * Plain and simple, build an array of names for fstypes
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * Returns 0, if it encounters a problem.
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbint
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbbuild_fstype_list(char ***fstypep)
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb{
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb int i;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb int nfstype;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb char buf[FSTYPSZ + 1];
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if ((nfstype = sysfs(GETNFSTYP)) < 0) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb perror(gettext("sysfs(GETNFSTYP)"));
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb return (0);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if ((*fstypep = calloc(nfstype, sizeof (char *))) == NULL) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb perror(gettext("calloc on fstypes"));
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb return (0);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb for (i = 1; i < nfstype; i++) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (sysfs(GETFSTYP, i, buf) < 0) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb perror(gettext("sysfs(GETFSTYP)"));
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb return (0);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (buf[0] == 0)
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb continue;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb /* If this is part of the exception list, move on */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (is_exception(buf))
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb continue;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (((*fstypep)[i] = strdup(buf)) == NULL) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb perror(gettext("strdup() of fstype name"));
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb return (0);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb return (i);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb}
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb/*
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * After we're done with getopts(), process the rest of the
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * operands. We have three cases and this is the priority:
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb *
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * 1) [ operand... ] interval count
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * 2) [ operand... ] interval
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * 3) [ operand... ]
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb *
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * The trick is that any of the operands might start with a number or even
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * be made up exclusively of numbers (and we have to handle negative numbers
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * in case a user/script gets out of line). If we find two operands at the
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * end of the list then we claim case 1. If we find only one operand at the
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * end made up only of number, then we claim case 2. Otherwise, case 3.
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * BTW, argc, argv don't change.
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbint
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbparse_operands(
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb int argc,
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb char **argv,
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb int optind,
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb long *interval,
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb long *count,
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb entity_t **entityp) /* Array of stat-able entities */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb{
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb int nentities = 0; /* Number of entities found */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb int out_of_range; /* Set if 2nd-to-last operand out-of-range */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (argc == optind)
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb return (nentities); /* None found, returns 0 */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb /*
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * We know exactly what the maximum number of entities is going
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * to be: argc - optind
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if ((*entityp = calloc((argc - optind), sizeof (entity_t))) == NULL) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb perror(gettext("calloc"));
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb return (-1);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb for (/* void */; argc > optind; optind++) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb char *endptr;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb /* If we have more than two operands left to process */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if ((argc - optind) > 2) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (*entityp)[nentities++].e_name = strdup(argv[optind]);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb continue;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb /* If we're here, then we only have one or two operands left */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb errno = 0;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb out_of_range = 0;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb *interval = strtol(argv[optind], &endptr, 10);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (*endptr && !isdigit((int)*endptr)) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb /* Operand was not a number */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (*entityp)[nentities++].e_name = strdup(argv[optind]);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb continue;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb } else if (errno == ERANGE || *interval <= 0 ||
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb *interval > MAXLONG) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb /* Operand was a number, just out of range */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb out_of_range++;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb /*
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * The last operand we saw was a number. If it happened to
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * be the last operand, then it is the interval...
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if ((argc - optind) == 1) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb /* ...but we need to check the range. */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (out_of_range) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) fprintf(stderr, gettext(
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb "interval must be between 1 and "
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb "%ld (inclusive)\n"), MAXLONG);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb return (-1);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb } else {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb /*
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * The value of the interval is valid. Set
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * count to something really big so it goes
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * virtually forever.
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb *count = MAXLONG;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb break;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb /*
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * At this point, we *might* have the interval, but if the
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * next operand isn't a number, then we don't have either
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * the interval nor the count. Both must be set to the
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * defaults. In that case, both the current and the previous
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * operands are stat-able entities.
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb errno = 0;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb *count = strtol(argv[optind + 1], &endptr, 10);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (*endptr && !isdigit((int)*endptr)) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb /*
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * Faked out! The last operand wasn't a number so
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * the current and previous operands should be
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * stat-able entities. We also need to reset interval.
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb *interval = 0;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (*entityp)[nentities++].e_name = strdup(argv[optind++]);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (*entityp)[nentities++].e_name = strdup(argv[optind++]);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb } else if (out_of_range || errno == ERANGE || *count <= 0) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) fprintf(stderr, gettext(
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb "Both interval and count must be between 1 "
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb "and %ld (inclusive)\n"), MAXLONG);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb return (-1);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb break; /* Done! */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb return (nentities);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb}
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb/*
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * set_mntpt() looks at the entity's name (e_name) and finds its
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * mountpoint. To do this, we need to build a list of mountpoints
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * from /etc/mnttab. We only need to do this once and we don't do it
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * if we don't need to look at any mountpoints.
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * Returns 0 on success, non-zero if it couldn't find a mount-point.
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbint
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbset_mntpt(entity_t *ep)
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb{
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb static struct mnt {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb struct mnt *m_next;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb char *m_mntpt;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb ulong_t m_fsid; /* From statvfs(), set only as needed */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb } *mnt_list = NULL; /* Linked list of mount-points */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb struct mnt *mntp;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb struct statvfs statvfsbuf;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb char *original_name = ep->e_name;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb char path[PATH_MAX];
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (original_name == NULL) /* Shouldn't happen */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb return (1);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb /* We only set up mnt_list the first time this is called */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (mnt_list == NULL) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb FILE *fp;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb struct mnttab mnttab;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if ((fp = fopen(MNTTAB, "r")) == NULL) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb perror(MNTTAB);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb return (1);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb resetmnttab(fp);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb /*
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * We insert at the front of the list so that when we
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * search entries we'll have the last mounted entries
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * first in the list so that we can match the longest
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * mountpoint.
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb while (getmntent(fp, &mnttab) == 0) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if ((mntp = malloc(sizeof (*mntp))) == NULL) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb perror(gettext("Can't create mount list"));
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb return (1);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb mntp->m_mntpt = strdup(mnttab.mnt_mountp);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb mntp->m_next = mnt_list;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb mnt_list = mntp;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) fclose(fp);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (realpath(original_name, path) == NULL) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb perror(original_name);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb return (1);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb /*
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * Now that we have the path, walk through the mnt_list and
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * look for the first (best) match.
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb for (mntp = mnt_list; mntp; mntp = mntp->m_next) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (strncmp(path, mntp->m_mntpt, strlen(mntp->m_mntpt)) == 0) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (mntp->m_fsid == 0) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (statvfs(mntp->m_mntpt, &statvfsbuf)) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb /* Can't statvfs so no match */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb continue;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb } else {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb mntp->m_fsid = statvfsbuf.f_fsid;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (ep->e_fsid != mntp->m_fsid) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb /* No match - Move on */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb continue;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb break;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (mntp == NULL) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) fprintf(stderr, gettext(
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb "Can't find mount point for %s\n"), path);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb return (1);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb ep->e_name = strdup(mntp->m_mntpt);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb free(original_name);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb return (0);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb}
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb/*
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * We have an array of entities that are potentially stat-able. Using
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * the name (e_name) of the entity, attempt to construct a ksname suitable
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * for use by kstat_lookup(3kstat) and fill it into the e_ksname member.
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb *
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * We check the e_name against the list of file system types. If there is
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * no match then test to see if the path is valid. If the path is valid,
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * then determine the mountpoint.
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbvoid
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbset_ksnames(entity_t *entities, int nentities, char **fstypes, int nfstypes)
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb{
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb int i, j;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb struct statvfs statvfsbuf;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb for (i = 0; i < nentities; i++) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb entity_t *ep = &entities[i];
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb /* Check the name against the list of fstypes */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb for (j = 1; j < nfstypes; j++) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (fstypes[j] && ep->e_name &&
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb strcmp(ep->e_name, fstypes[j]) == 0) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb /* It's a file system type */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb ep->e_type = ENTYPE_FSTYPE;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) snprintf(ep->e_ksname,
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb KSTAT_STRLEN, "%s%s",
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb VOPSTATS_STR, ep->e_name);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb /* Now allocate the vopstats array */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb ep->e_vs = calloc(VS_SIZE, sizeof (vopstats_t));
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (entities[i].e_vs == NULL) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb perror(gettext("calloc() vopstats"));
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb exit(1);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb break;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (j < nfstypes) /* Found it! */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb continue;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb /*
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * If the entity in the exception list of fstypes, then
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * null out the entry so it isn't displayed and move along.
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (is_exception(ep->e_name)) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb ep->e_ksname[0] = 0;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb continue;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb /* If we didn't find it, see if it's a path */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (ep->e_name == NULL || statvfs(ep->e_name, &statvfsbuf)) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb /* Error - Make sure the entry is nulled out */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb ep->e_ksname[0] = 0;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb continue;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) snprintf(ep->e_ksname, KSTAT_STRLEN, "%s%lx",
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb VOPSTATS_STR, statvfsbuf.f_fsid);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb ep->e_fsid = statvfsbuf.f_fsid;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (set_mntpt(ep)) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) fprintf(stderr,
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb gettext("Can't determine type of \"%s\"\n"),
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb ep->e_name ? ep->e_name : gettext("<NULL>"));
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb } else {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb ep->e_type = ENTYPE_MNTPT;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb /* Now allocate the vopstats array */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb ep->e_vs = calloc(VS_SIZE, sizeof (vopstats_t));
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (entities[i].e_vs == NULL) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb perror(gettext("Can't calloc vopstats"));
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb exit(1);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb}
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbvoid
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbprint_time(int type)
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb{
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb time_t t;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (time(&t) != -1) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (type == UDATE) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) printf("%ld\n", t);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb } else if (type == DDATE) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb char *dstr;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb dstr = ctime(&t);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (dstr) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) printf("%s", dstr);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb}
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb/*
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * The idea is that 'dspfunc' should only be modified from the default
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * once since the display options are mutually exclusive. If 'dspfunc'
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * only contains the default display function, then all is good and we
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * can set it to the new display function. Otherwise, bail.
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbvoid
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbset_dispfunc(
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb void (**dspfunc)(char *, vopstats_t *, vopstats_t *, int),
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb void (*newfunc)(char *, vopstats_t *, vopstats_t *, int))
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb{
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (*dspfunc != dflt_display) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) fprintf(stderr, gettext(
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb "%s: Display options -{a|f|i|n|v} are mutually exclusive\n"),
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb cmdname);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb usage();
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb *dspfunc = newfunc;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb}
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbint
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbmain(int argc, char *argv[])
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb{
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb int c;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb int i, j; /* Generic counters */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb int nentities_found;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb int linesout; /* Keeps track of lines printed */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb int printhdr = 0; /* Print a header? 0 = no, 1 = yes */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb int nfstypes; /* Number of fstypes */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb int dispflag = 0; /* Flags for display control */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb int timestamp = NODATE; /* Default: no time stamp */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb long count = 0; /* Number of iterations for display */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb long interval = 0;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb boolean_t fstypes_only = B_FALSE; /* Display fstypes only */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb char **fstypes; /* Array of names of all fstypes */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb int nentities; /* Number of stat-able entities */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb entity_t *entities; /* Array of stat-able entities */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb kstat_ctl_t *kc;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb void (*dfunc)(char *, vopstats_t *, vopstats_t *, int) = dflt_display;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb extern int optind;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb cmdname = argv[0];
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb while ((c = getopt(argc, argv, OPTIONS)) != EOF) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb switch (c) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb default:
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb usage();
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb break;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb case 'P': /* Parsable output */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb dispflag |= DISP_RAW;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb break;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb case 'T': /* Timestamp */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (optarg) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (strcmp(optarg, "u") == 0) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb timestamp = UDATE;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb } else if (strcmp(optarg, "d") == 0) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb timestamp = DDATE;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb /* If it was never set properly... */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (timestamp == NODATE) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) fprintf(stderr, gettext(
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb "%s: -T option requires either 'u' or 'd'\n"),
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb cmdname);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb usage();
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb break;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb case 'a':
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb set_dispfunc(&dfunc, attr_display);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb break;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb case 'f':
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb set_dispfunc(&dfunc, vop_display);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb break;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb case 'i':
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb set_dispfunc(&dfunc, io_display);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb break;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb case 'n':
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb set_dispfunc(&dfunc, naming_display);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb break;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb case 'v':
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb set_dispfunc(&dfunc, vm_display);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb break;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if ((dispflag & DISP_RAW) && (timestamp != NODATE)) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) fprintf(stderr, gettext(
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb "-P and -T options are mutually exclusive\n"));
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb usage();
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb /* Gather the list of filesystem types */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if ((nfstypes = build_fstype_list(&fstypes)) == 0) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) fprintf(stderr,
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb gettext("Can't build list of fstypes\n"));
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb exit(1);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb nentities = parse_operands(
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb argc, argv, optind, &interval, &count, &entities);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (nentities == -1) /* Set of operands didn't parse properly */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb usage();
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb /*
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * If we had no operands (except for interval/count) then we
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * fill in the entities[] array with all the fstypes.
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (nentities == 0) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb fstypes_only = B_TRUE;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if ((entities = calloc(nfstypes, sizeof (entity_t))) == NULL) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) fprintf(stderr,
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb gettext("Can't calloc fstype stats\n"));
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb exit(1);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb for (i = 1; i < nfstypes; i++) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (fstypes[i]) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb entities[nentities].e_name = strdup(fstypes[i]);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb nentities++;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb set_ksnames(entities, nentities, fstypes, nfstypes);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if ((kc = kstat_open()) == NULL) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb perror(gettext("kstat_open"));
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb exit(1);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb /*
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * The following loop walks through the entities[] list to "prime
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * the pump"
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb for (j = 0, linesout = 0; j < nentities; j++) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb entity_t *ent = &entities[j];
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb vopstats_t *vsp = &ent->e_vs[CUR_INDEX];
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb kstat_t *ksp = NULL;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (get_vopstats(kc, ent->e_ksname, vsp, &ksp) == 0) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (*dfunc)(ent->e_name, NULL, vsp,
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb dispflag_policy(linesout == 0, dispflag));
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb linesout++;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb } else {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb /*
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * If we can't find it the first time through, then
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * get rid of it.
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb entities[j].e_ksname[0] = 0;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb /*
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * If we're only displaying the fstypes (default
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * with no other entities requested) then don't
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * complain about any file systems that might not
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * be loaded. Otherwise, let the user know that
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * he chose poorly.
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (fstypes_only == B_FALSE) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) fprintf(stderr, gettext(
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb "No statistics available for %s\n"),
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb entities[j].e_name);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb BUMP_INDEX(); /* Swap the previous/current indices */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb for (i = 1; i <= count; i++) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb /*
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * No telling how many lines will be printed in any interval.
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * There should be a minimum of HEADERLINES between any
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * header. If we exceed that, no big deal.
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (linesout > HEADERLINES) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb linesout = 0;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb printhdr = 1;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) poll(NULL, 0, interval*1000);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (timestamp) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb print_time(timestamp);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb linesout++;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb for (j = 0, nentities_found = 0; j < nentities; j++) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb entity_t *ent = &entities[j];
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb /*
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * If this entry has been cleared, don't attempt
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * to process it.
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (ent->e_ksname[0] == 0) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb continue;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (get_vopstats(kc, ent->e_ksname,
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb &ent->e_vs[CUR_INDEX], NULL) == 0) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (*dfunc)(ent->e_name, &ent->e_vs[PREV_INDEX],
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb &ent->e_vs[CUR_INDEX],
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb dispflag_policy(printhdr, dispflag));
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb linesout++;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb nentities_found++;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb } else {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (ent->e_type == ENTYPE_MNTPT) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) printf(gettext(
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb "<<mount point no longer "
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb "available: %s>>\n"), ent->e_name);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb } else if (ent->e_type == ENTYPE_FSTYPE) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) printf(gettext(
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb "<<file system module no longer "
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb "loaded: %s>>\n"), ent->e_name);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb } else {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) printf(gettext(
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb "<<%s no longer available>>\n"),
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb ent->e_name);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb /* Disable this so it doesn't print again */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb ent->e_ksname[0] = 0;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb printhdr = 0; /* Always shut this off */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb BUMP_INDEX(); /* Bump the previous/current indices */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb /*
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * If the entities we were observing are no longer there
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * (file system modules unloaded, file systems unmounted)
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * then we're done.
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (nentities_found == 0)
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb break;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb return (0);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb}