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/*
c242f9a02a2ef021449275ae0a1d2581ee77231dchunli zhang - Sun Microsystems - Irvine United States * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * Use is subject to license terms.
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb */
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>
13c7b6ac430bc41eee84ba0b625cf5fde3241b10rsb#include <locale.h>
00c76d6fcc0e3d5821ed5ac5165f1835f8151454tc#include <signal.h>
00c76d6fcc0e3d5821ed5ac5165f1835f8151454tc
00c76d6fcc0e3d5821ed5ac5165f1835f8151454tc#include "statcommon.h"
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
3a401a6b073cd295066706e0825db167a9322c28rsb/*
3a401a6b073cd295066706e0825db167a9322c28rsb * For now, parsable output is turned off. Once we gather feedback and
3a401a6b073cd295066706e0825db167a9322c28rsb * stablize the output format, we'll turn it back on. This prevents
3a401a6b073cd295066706e0825db167a9322c28rsb * the situation where users build tools which depend on a specific
3a401a6b073cd295066706e0825db167a9322c28rsb * format before we declare the output stable.
3a401a6b073cd295066706e0825db167a9322c28rsb */
3a401a6b073cd295066706e0825db167a9322c28rsb#define PARSABLE_OUTPUT 0
3a401a6b073cd295066706e0825db167a9322c28rsb
3a401a6b073cd295066706e0825db167a9322c28rsb#if PARSABLE_OUTPUT
3a401a6b073cd295066706e0825db167a9322c28rsb#define OPTIONS "FPT:afginv"
3a401a6b073cd295066706e0825db167a9322c28rsb#else
3a401a6b073cd295066706e0825db167a9322c28rsb#define OPTIONS "FT:afginv"
3a401a6b073cd295066706e0825db167a9322c28rsb#endif
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() */
3a401a6b073cd295066706e0825db167a9322c28rsb#define HEADERLINES 12 /* 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
00c76d6fcc0e3d5821ed5ac5165f1835f8151454tcchar *cmdname; /* name of this command */
00c76d6fcc0e3d5821ed5ac5165f1835f8151454tcint caught_cont = 0; /* have caught a SIGCONT */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
26fd77009b17f8c8fb32eb362584cfd635e87ad9Krishnendu Sadhukhan - Sun Microsystemsstatic uint_t timestamp_fmt = NODATE; /* print timestamp with stats */
4944376cd5de3dcd3b4feeaad9cbedbc024d1474John Levon
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbstatic int vs_i = 0; /* Index of current vs[] slot */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbstatic void
5a59a8b3d86e67dbe75588879c46e3629f40efecrsbusage()
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb{
3a401a6b073cd295066706e0825db167a9322c28rsb (void) fprintf(stderr, gettext(
3a401a6b073cd295066706e0825db167a9322c28rsb "Usage: %s [-a|f|i|n|v] [-T d|u] {-F | {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))
3a401a6b073cd295066706e0825db167a9322c28rsb
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) +
f5cd957f512eb3fe078de1043418ae6acf52a4c6Robert Harris 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) {
757bea67fc2c5b2af5e20d850267ce65984173bcrsb (void) printf(
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb" new name name attr attr lookup rddir read read write write\n"
757bea67fc2c5b2af5e20d850267ce65984173bcrsb" 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) {
757bea67fc2c5b2af5e20d850267ce65984173bcrsb (void) printf(
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb" read read write write rddir rddir rwlock rwulock\n"
757bea67fc2c5b2af5e20d850267ce65984173bcrsb" 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) {
757bea67fc2c5b2af5e20d850267ce65984173bcrsb (void) printf(" 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) {
757bea67fc2c5b2af5e20d850267ce65984173bcrsb (void) printf("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) {
757bea67fc2c5b2af5e20d850267ce65984173bcrsb (void) printf(
757bea67fc2c5b2af5e20d850267ce65984173bcrsb "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);
757bea67fc2c5b2af5e20d850267ce65984173bcrsb (void) printf(" 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);
c242f9a02a2ef021449275ae0a1d2581ee77231dchunli zhang - Sun Microsystems - Irvine United States PRINT_VOPSTAT(niceflag, reqzcbuf);
c242f9a02a2ef021449275ae0a1d2581ee77231dchunli zhang - Sun Microsystems - Irvine United States PRINT_VOPSTAT(niceflag, retzcbuf);
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 }
757bea67fc2c5b2af5e20d850267ce65984173bcrsb perror("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) {
757bea67fc2c5b2af5e20d850267ce65984173bcrsb perror("sysfs(GETNFSTYP)");
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb return (0);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if ((*fstypep = calloc(nfstype, sizeof (char *))) == NULL) {
757bea67fc2c5b2af5e20d850267ce65984173bcrsb perror("calloc() fstypes");
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb return (0);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb for (i = 1; i < nfstype; i++) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (sysfs(GETFSTYP, i, buf) < 0) {
757bea67fc2c5b2af5e20d850267ce65984173bcrsb perror("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) {
757bea67fc2c5b2af5e20d850267ce65984173bcrsb perror("strdup() 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) {
757bea67fc2c5b2af5e20d850267ce65984173bcrsb perror("calloc() entities");
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 ||
f5cd957f512eb3fe078de1043418ae6acf52a4c6Robert Harris *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;
06f33e8d08c75ccdc623b7f778570223d880eca4rsb struct statvfs64 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) {
757bea67fc2c5b2af5e20d850267ce65984173bcrsb perror("malloc() 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) {
06f33e8d08c75ccdc623b7f778570223d880eca4rsb if (statvfs64(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;
06f33e8d08c75ccdc623b7f778570223d880eca4rsb struct statvfs64 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;
f5cd957f512eb3fe078de1043418ae6acf52a4c6Robert Harris (void) snprintf(ep->e_ksname, KSTAT_STRLEN,
f5cd957f512eb3fe078de1043418ae6acf52a4c6Robert Harris "%s%s", 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) {
757bea67fc2c5b2af5e20d850267ce65984173bcrsb perror("calloc() fstype 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 */
06f33e8d08c75ccdc623b7f778570223d880eca4rsb if (ep->e_name == NULL || statvfs64(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) {
757bea67fc2c5b2af5e20d850267ce65984173bcrsb perror("calloc() vopstats array");
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb exit(1);
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;
4944376cd5de3dcd3b4feeaad9cbedbc024d1474John Levon int linesout = 0; /* 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 long count = 0; /* Number of iterations for display */
00c76d6fcc0e3d5821ed5ac5165f1835f8151454tc int forever; /* Run forever */
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;
00c76d6fcc0e3d5821ed5ac5165f1835f8151454tc hrtime_t start_n; /* Start time */
00c76d6fcc0e3d5821ed5ac5165f1835f8151454tc hrtime_t period_n; /* Interval in nanoseconds */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb extern int optind;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
13c7b6ac430bc41eee84ba0b625cf5fde3241b10rsb (void) setlocale(LC_ALL, "");
13c7b6ac430bc41eee84ba0b625cf5fde3241b10rsb#if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */
13c7b6ac430bc41eee84ba0b625cf5fde3241b10rsb#define TEXT_DOMAIN "SYS_TEST" /* Use this only if it weren't */
13c7b6ac430bc41eee84ba0b625cf5fde3241b10rsb#endif
13c7b6ac430bc41eee84ba0b625cf5fde3241b10rsb (void) textdomain(TEXT_DOMAIN);
13c7b6ac430bc41eee84ba0b625cf5fde3241b10rsb
f5cd957f512eb3fe078de1043418ae6acf52a4c6Robert Harris /* Don't let buffering interfere with piped output. */
f5cd957f512eb3fe078de1043418ae6acf52a4c6Robert Harris (void) setvbuf(stdout, NULL, _IOLBF, 0);
f5cd957f512eb3fe078de1043418ae6acf52a4c6Robert Harris
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb cmdname = argv[0];
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb while ((c = getopt(argc, argv, OPTIONS)) != EOF) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb switch (c) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb default:
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb usage();
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb break;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
3a401a6b073cd295066706e0825db167a9322c28rsb case 'F': /* Only display available FStypes */
3a401a6b073cd295066706e0825db167a9322c28rsb fstypes_only = B_TRUE;
3a401a6b073cd295066706e0825db167a9322c28rsb break;
3a401a6b073cd295066706e0825db167a9322c28rsb
3a401a6b073cd295066706e0825db167a9322c28rsb#if PARSABLE_OUTPUT
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb case 'P': /* Parsable output */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb dispflag |= DISP_RAW;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb break;
3a401a6b073cd295066706e0825db167a9322c28rsb#endif /* PARSABLE_OUTPUT */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb case 'T': /* Timestamp */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (optarg) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (strcmp(optarg, "u") == 0) {
4944376cd5de3dcd3b4feeaad9cbedbc024d1474John Levon timestamp_fmt = UDATE;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb } else if (strcmp(optarg, "d") == 0) {
4944376cd5de3dcd3b4feeaad9cbedbc024d1474John Levon timestamp_fmt = DDATE;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb /* If it was never set properly... */
4944376cd5de3dcd3b4feeaad9cbedbc024d1474John Levon if (timestamp_fmt == NODATE) {
f5cd957f512eb3fe078de1043418ae6acf52a4c6Robert Harris (void) fprintf(stderr, gettext("%s: -T option "
f5cd957f512eb3fe078de1043418ae6acf52a4c6Robert Harris "requires either 'u' or 'd'\n"), 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
3a401a6b073cd295066706e0825db167a9322c28rsb#if PARSABLE_OUTPUT
4944376cd5de3dcd3b4feeaad9cbedbc024d1474John Levon if ((dispflag & DISP_RAW) && (timestamp_fmt != NODATE)) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb (void) fprintf(stderr, gettext(
f5cd957f512eb3fe078de1043418ae6acf52a4c6Robert Harris "-P and -T options are mutually exclusive\n"));
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb usage();
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
3a401a6b073cd295066706e0825db167a9322c28rsb#endif /* PARSABLE_OUTPUT */
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);
00c76d6fcc0e3d5821ed5ac5165f1835f8151454tc forever = count == MAXLONG;
00c76d6fcc0e3d5821ed5ac5165f1835f8151454tc period_n = (hrtime_t)interval * NANOSEC;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if (nentities == -1) /* Set of operands didn't parse properly */
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb usage();
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
3a401a6b073cd295066706e0825db167a9322c28rsb if ((nentities == 0) && (fstypes_only == B_FALSE)) {
3a401a6b073cd295066706e0825db167a9322c28rsb (void) fprintf(stderr, gettext(
3a401a6b073cd295066706e0825db167a9322c28rsb "Must specify -F or at least one fstype or mount point\n"));
3a401a6b073cd295066706e0825db167a9322c28rsb usage();
3a401a6b073cd295066706e0825db167a9322c28rsb }
3a401a6b073cd295066706e0825db167a9322c28rsb
3a401a6b073cd295066706e0825db167a9322c28rsb if ((nentities > 0) && (fstypes_only == B_TRUE)) {
3a401a6b073cd295066706e0825db167a9322c28rsb (void) fprintf(stderr, gettext(
3a401a6b073cd295066706e0825db167a9322c28rsb "Cannot use -F with fstypes or mount points\n"));
3a401a6b073cd295066706e0825db167a9322c28rsb usage();
3a401a6b073cd295066706e0825db167a9322c28rsb }
3a401a6b073cd295066706e0825db167a9322c28rsb
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb /*
3a401a6b073cd295066706e0825db167a9322c28rsb * If we had no operands (except for interval/count) and we
3a401a6b073cd295066706e0825db167a9322c28rsb * requested FStypes only (-F), then fill in the entities[]
3a401a6b073cd295066706e0825db167a9322c28rsb * array with all available fstypes.
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb */
3a401a6b073cd295066706e0825db167a9322c28rsb if ((nentities == 0) && (fstypes_only == B_TRUE)) {
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb if ((entities = calloc(nfstypes, sizeof (entity_t))) == NULL) {
757bea67fc2c5b2af5e20d850267ce65984173bcrsb perror("calloc() fstype stats");
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) {
757bea67fc2c5b2af5e20d850267ce65984173bcrsb perror("kstat_open");
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb exit(1);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
00c76d6fcc0e3d5821ed5ac5165f1835f8151454tc /* Set start time */
00c76d6fcc0e3d5821ed5ac5165f1835f8151454tc start_n = gethrtime();
00c76d6fcc0e3d5821ed5ac5165f1835f8151454tc
4944376cd5de3dcd3b4feeaad9cbedbc024d1474John Levon /* Initial timestamp */
4944376cd5de3dcd3b4feeaad9cbedbc024d1474John Levon if (timestamp_fmt != NODATE) {
26fd77009b17f8c8fb32eb362584cfd635e87ad9Krishnendu Sadhukhan - Sun Microsystems print_timestamp(timestamp_fmt);
4944376cd5de3dcd3b4feeaad9cbedbc024d1474John Levon linesout++;
4944376cd5de3dcd3b4feeaad9cbedbc024d1474John Levon }
4944376cd5de3dcd3b4feeaad9cbedbc024d1474John Levon
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb /*
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * The following loop walks through the entities[] list to "prime
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb * the pump"
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb */
4944376cd5de3dcd3b4feeaad9cbedbc024d1474John Levon for (j = 0, printhdr = 1; 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,
4944376cd5de3dcd3b4feeaad9cbedbc024d1474John Levon dispflag_policy(printhdr, 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 /*
3a401a6b073cd295066706e0825db167a9322c28rsb * If we're only displaying FStypes (-F) 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 }
4944376cd5de3dcd3b4feeaad9cbedbc024d1474John Levon printhdr = 0;
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb }
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
00c76d6fcc0e3d5821ed5ac5165f1835f8151454tc if (count > 1)
00c76d6fcc0e3d5821ed5ac5165f1835f8151454tc /* Set up signal handler for SIGCONT */
00c76d6fcc0e3d5821ed5ac5165f1835f8151454tc if (signal(SIGCONT, cont_handler) == SIG_ERR)
00c76d6fcc0e3d5821ed5ac5165f1835f8151454tc fail(1, "signal failed");
00c76d6fcc0e3d5821ed5ac5165f1835f8151454tc
00c76d6fcc0e3d5821ed5ac5165f1835f8151454tc
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb BUMP_INDEX(); /* Swap the previous/current indices */
00c76d6fcc0e3d5821ed5ac5165f1835f8151454tc i = 1;
00c76d6fcc0e3d5821ed5ac5165f1835f8151454tc while (forever || i++ <= count) {
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 }
00c76d6fcc0e3d5821ed5ac5165f1835f8151454tc /* Have a kip */
00c76d6fcc0e3d5821ed5ac5165f1835f8151454tc sleep_until(&start_n, period_n, forever, &caught_cont);
5a59a8b3d86e67dbe75588879c46e3629f40efecrsb
4944376cd5de3dcd3b4feeaad9cbedbc024d1474John Levon if (timestamp_fmt != NODATE) {
26fd77009b17f8c8fb32eb362584cfd635e87ad9Krishnendu Sadhukhan - Sun Microsystems print_timestamp(timestamp_fmt);
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}