summaryrefslogtreecommitdiff
path: root/usr/src/cmd/avs/dsstat/dsstat.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/cmd/avs/dsstat/dsstat.c')
-rw-r--r--usr/src/cmd/avs/dsstat/dsstat.c546
1 files changed, 0 insertions, 546 deletions
diff --git a/usr/src/cmd/avs/dsstat/dsstat.c b/usr/src/cmd/avs/dsstat/dsstat.c
deleted file mode 100644
index a10ffc0a35..0000000000
--- a/usr/src/cmd/avs/dsstat/dsstat.c
+++ /dev/null
@@ -1,546 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-#include <inttypes.h>
-#include <locale.h>
-
-#include <kstat.h>
-
-#include "dsstat.h"
-#include "multi_stats.h"
-
-/* Globals */
-int mode = 0;
-int interval = 1;
-int iterations = 1;
-int zflag = 0;
-int linesout = 0;
-
-short hflags = HEADERS_EXL;
-short dflags = 0;
-short rflags = 0;
-vslist_t *vs_top = NULL;
-
-void
-errout(char *msg)
-{
-
- (void) fprintf(stderr, msg);
-}
-
-void
-usage()
-{
- errout(gettext(
- "\ndsstat [-m <mode>[,<mode>]] [-f | -F] [-z] [-s <sets>] "
- "[-r <flags>] \\\n[-d <flags>] [<interval> [<count>]]\n\n"));
-}
-
-void
-help()
-{
- usage();
-
- errout(gettext("\t"
- "-d <flags> Specifies the statistics to be displayed\n\n"));
- errout(gettext("\t"
- " For 'cache' mode\n"));
- errout(gettext("\t"
- " Valid <flags> are 'rwfsdc', default <flags> are 'sf'\n"));
- errout(gettext("\t"
- " r=read, w=write, f=flags, s=summary,\n"));
- errout(gettext("\t"
- " only available for cache mode, need to combine with '-m'\n"));
- errout(gettext("\t"
- " d=destaged, c=write cancellations\n\n"));
- errout(gettext("\t"
- " For 'ii' mode;\n"));
- errout(gettext("\t"
- " Valid <flags> are 'rwtfps', default <flags> are 'sf'\n"));
- errout(gettext("\t"
- " r=read, w=write, t=timing, f=flags, p=percentages,\n"));
- errout(gettext("\t"
- " s=summary\n\n"));
- errout(gettext("\t"
- " For 'sndr' mode;\n"));
- errout(gettext("\t"
- " Valid <flags> are'rwtfpsq', default <flags> are 'spf'\n"));
- errout(gettext("\t"
- " r=read, w=write, t=timing, f=flags, p=percentages,\n"));
- errout(gettext("\t"
- " s=summary\n"));
- errout(gettext("\t"
- " only available for sndr mode, need to combine with '-m'\n"));
- errout(gettext("\t"
- " q=queue\n\n"));
- errout(gettext("\t"
- "-f prints field headers once for each iteration\n\n"));
- errout(gettext("\t"
- "-F prints field headers once, at the start of reporting\n\n"));
- errout(gettext("\t"
- "-h prints detailed usage message\n\n"));
- errout(gettext("\t"
- "-m <mode>[,<mode>] where mode is, 'cache', 'ii', or 'sndr'\n\n"));
- errout(gettext("\t"
- " Multiple modes may be specified as a comma separated list,\n"));
- errout(gettext("\t"
- " or multiple -m switches may be used.\n\n"));
- errout(gettext("\t"
- "-r <flags> specifies components to be reported\n\n"));
- errout(gettext("\t"
- " For 'cache' mode, this option is not used.\n\n"));
- errout(gettext("\t"
- " For 'ii' mode;\n"));
- errout(gettext("\t"
- " Valid <flags> are 'msbo', default <flags> are 'msbo'\n"));
- errout(gettext("\t"
- " m=master, s=shadow, b=bitmap, o=overflow\n\n"));
- errout(gettext("\t"
- " For 'sndr' mode;\n"));
- errout(gettext("\t"
- " Valid <flags> are 'nb', default <flags> are 'nb'\n"));
- errout(gettext("\t"
- " n=network, b=bitmap\n\n"));
- errout(gettext("\t"
- "-s <sets> outputs specified sets\n"));
- errout(gettext("\t"
- " Where <sets> is a comma delimited list of set names\n\n"));
- errout(gettext("\t"
- "-z suppress reports with zero value (no activity)\n\n"));
- errout(gettext("\t"
- "<interval> is the number of seconds between reports\n\n"));
- errout(gettext("\t"
- "<count> is the number of reports to be generated\n\n"));
-}
-
-void
-fail(int err, char *msg)
-{
- errout(gettext("\ndsstat: "));
- errout(msg);
-
- usage();
-
- errout(gettext("For detailed usage run \"dsstat -h\"\n"));
-
- exit(err);
-}
-
-int
-set_mode(char *user_modes)
-{
- char *m;
- int local_mode = 0;
-
- for (m = strtok(user_modes, ","); m != NULL; m = strtok(NULL, ",")) {
- if (local_mode != 0) {
- local_mode |= MULTI;
- }
-
- if (strncasecmp("sndr", m, strlen(m)) == 0) {
- local_mode |= SNDR;
- continue;
- }
-
- if (strncasecmp("ii", m, strlen(m)) == 0) {
- local_mode |= IIMG;
- continue;
- }
-
- if (strncasecmp("cache", m, strlen(m)) == 0) {
- local_mode |= SDBC;
- continue;
- }
-
- fail(DSSTAT_EINVAL, gettext("Invalid mode specified"));
- }
-
- return (local_mode);
-}
-
-short
-set_dflags(char *flags)
-{
- int index;
- short user_dflags = 0;
-
- for (index = 0; index < strlen(flags); index++) {
- switch (flags[index]) {
- case 'r':
- user_dflags |= READ;
- break;
- case 'w':
- user_dflags |= WRITE;
- break;
- case 't':
- user_dflags |= TIMING;
- break;
- case 'f':
- user_dflags |= FLAGS;
- break;
- case 'p':
- user_dflags |= PCTS;
- break;
- case 's':
- user_dflags |= SUMMARY;
- break;
- case 'd':
- user_dflags |= DESTAGED;
- break;
- case 'c':
- user_dflags |= WRCANCEL;
- break;
- case 'h':
- user_dflags |= RATIO;
- break;
- case 'q':
- user_dflags |= ASYNC_QUEUE;
- break;
- default:
- fail(DSSTAT_EINVAL,
- gettext("Invalid display-flags set\n"));
- }
- }
-
- return (user_dflags);
-}
-
-short
-set_rflags(char *flags)
-{
- int index;
- short user_rflags = 0;
-
- for (index = 0; index < strlen(flags); index++) {
- switch (flags[index]) {
- case 'm':
- user_rflags |= IIMG_MST;
- break;
- case 's':
- user_rflags |= IIMG_SHD;
- break;
- case 'b':
- user_rflags |= IIMG_BMP;
- user_rflags |= SNDR_BMP;
- break;
- case 'o':
- user_rflags |= IIMG_OVR;
- break;
- case 'n':
- user_rflags |= SNDR_NET;
- break;
- default:
- fail(DSSTAT_EINVAL,
- gettext("Invalid report-flags set\n"));
- }
- }
-
- return (user_rflags);
-}
-
-void
-set_vol_list(char *list)
-{
- vslist_t *pre;
- vslist_t *newvol;
- vslist_t *vslist;
- char *volume;
-
- for (volume = strtok(list, ","); volume != NULL;
- volume = strtok(NULL, ",")) {
- int dup = 0;
- char *vh = NULL;
- char *vn = NULL;
-
- /* get user-specified set information */
- if ((vn = strchr(volume, ':')) == NULL) {
- vn = volume;
- } else {
- *vn = '\0';
- vn++;
- vh = volume;
- }
-
- /* check for duplicates */
- dup = 0;
-
- for (vslist = vs_top; vslist != NULL; vslist = vslist->next) {
- if (vslist->volhost && vh) {
- if (strcmp(vslist->volhost, vh) == 0 &&
- strcmp(vslist->volname, vn) == 0)
- dup = 1;
- } else {
- if (strcmp(vslist->volname, vn) == 0)
- dup = 1;
- }
-
- pre = vslist;
- }
-
- if (dup)
- continue;
-
- /* initialize new vslist record */
- newvol = (vslist_t *)calloc(1, sizeof (vslist_t));
-
- newvol->volname = (char *)calloc((strlen(vn) + 1),
- sizeof (char));
- (void) strcpy(newvol->volname, vn);
-
- if (vh == NULL)
- goto save;
-
- newvol->volhost = (char *)calloc((strlen(vh) + 1),
- sizeof (char));
- (void) strcpy(newvol->volhost, vh);
-
-save:
- /* save record */
- if (vs_top == NULL) {
- vslist = vs_top = newvol;
- vslist->next = NULL;
- continue;
- }
-
- if (vslist == NULL) {
- vslist = pre->next = newvol;
- vslist->next = NULL;
- continue;
- }
- }
-}
-
-int
-main(int argc, char **argv)
-{
- extern char *optarg;
- extern int optind;
-
- int c;
- int error;
- short user_dflags = 0;
- short user_rflags = 0;
-
- /* Parse command line */
- while ((c = getopt(argc, argv, "d:fFhm:r:s:z")) != EOF) {
- switch (c) {
- case 'd': /* what to display */
- user_dflags = set_dflags(optarg);
- break;
- case 'f':
- hflags = HEADERS_ATT;
- break;
- case 'F':
- hflags = HEADERS_BOR;
- break;
- case 'h': /* usage */
- help();
- exit(0);
- break;
- case 'm': /* Mode */
- mode |= set_mode(optarg);
- break;
- case 'r': /* what to report on */
- user_rflags = set_rflags(optarg);
- break;
- case 's':
- set_vol_list(optarg);
- break;
- case 'z':
- zflag = 1;
- break;
-
- default:
- fail(DSSTAT_EINVAL,
- "Invalid argument specified\n");
- }
- }
-
- /* Parse additional arguments */
- if (optind < argc) {
- if ((interval = atoi(argv[optind])) <= 0) {
- fail(DSSTAT_EINVAL,
- gettext("Invalid interval specified.\n"));
- } else {
- iterations = -1;
- }
-
- optind++;
-
- if (optind < argc) {
- if ((iterations = atoi(argv[optind])) <= 0) {
- fail(DSSTAT_EINVAL,
- gettext("Invalid count specified.\n"));
- }
- }
-
- optind++;
- }
-
- if (optind < argc) {
- fail(DSSTAT_EINVAL,
- gettext("Too many parameters specified.\n"));
- }
-
- if (mode == 0)
- mode |= MULTI | IIMG | SNDR | SDBC;
-
- /* Select statistics to gather */
- if (mode & SNDR) {
- if (! (mode & MULTI)) {
- if (user_rflags & IIMG_BMP)
- user_rflags ^= IIMG_BMP;
-
- if ((user_dflags | SNDR_DIS_MASK) != SNDR_DIS_MASK) {
- fail(DSSTAT_EINVAL, gettext("Invalid "
- "display-flags for RemoteMirror\n"));
- }
-
- if ((user_rflags | SNDR_REP_MASK) != SNDR_REP_MASK) {
- fail(DSSTAT_EINVAL,
- gettext("Invalid report-flags for "
- "Remote Mirror\n"));
- }
- }
-
- if ((mode & MULTI) && (user_dflags & ASYNC_QUEUE)) {
- fail(DSSTAT_EINVAL, gettext("Remote Mirror async. queue"
- "statistics can not be displayed with mutiple "
- "modes."));
- }
-
- if (user_dflags)
- dflags = user_dflags;
- else
- dflags |= (SUMMARY | PCTS | FLAGS | RATIO);
-
- if (user_rflags)
- rflags = user_rflags;
- else
- rflags |= (SNDR_NET | SNDR_BMP);
- }
-
- if (mode & IIMG) {
- if (! (mode & MULTI)) {
- if (user_rflags & SNDR_BMP)
- user_rflags ^= SNDR_BMP;
-
- if ((user_dflags | IIMG_DIS_MASK) != IIMG_DIS_MASK) {
- fail(DSSTAT_EINVAL,
- gettext("Invalid display-flags for "
- "Point-in-Time Copy\n"));
- }
-
- if ((user_rflags | IIMG_REP_MASK) != IIMG_REP_MASK) {
- fail(DSSTAT_EINVAL,
- gettext("Invalid report-flags for "
- "Point-in-Time Copy\n"));
- }
- }
-
- if (user_dflags)
- dflags = user_dflags;
- else
- dflags |= (SUMMARY | PCTS | FLAGS | RATIO);
-
- if (user_rflags)
- rflags = user_rflags;
- else
- rflags |= (IIMG_MST | IIMG_SHD | IIMG_BMP | IIMG_OVR);
- }
-
- if (mode & SDBC) {
- if (! (mode & MULTI)) {
- if ((user_dflags | CACHE_DIS_MASK) != CACHE_DIS_MASK) {
- fail(DSSTAT_EINVAL, gettext("Invalid "
- "display-flags for CACHE\n"));
- }
-
- if ((user_rflags | CACHE_REP_MASK) != CACHE_REP_MASK) {
- fail(DSSTAT_EINVAL, gettext("Invalid "
- "report-flags for CACHE\n"));
- }
- } else {
- if ((user_dflags & DESTAGED) || (user_dflags & WRCANCEL)) {
- if (user_dflags & DESTAGED)
- fail(DSSTAT_EINVAL, gettext("Cache, destaged "
- "statistics can not be displayed with mutiple "
- "modes."));
- else
- fail(DSSTAT_EINVAL, gettext("Cache, write "
- "cancellations "
- "statistics can not be displayed with mutiple "
- "modes."));
- }
- }
-
- if (user_dflags)
- dflags = user_dflags;
- else
- if (mode & MULTI)
- dflags |= (SUMMARY);
- else
- dflags |= (SUMMARY | FLAGS);
-
- if (user_rflags)
- rflags = user_rflags;
- else
- rflags |= user_rflags;
- }
-
- error = do_stats();
-
- if (error == EAGAIN) {
- fail(DSSTAT_NOSTAT, gettext("No statistics available for the "
- "specified mode(s).\n"));
- }
-
- if (error == EINVAL) {
- fail(DSSTAT_EINVAL,
- gettext("Invalid kstat format detected.\n"));
- }
-
- if (error == ENOMEM) {
- fail(DSSTAT_ENOMEM,
- gettext("Unable to open kstat device for reading.\n"));
- }
-
- if (error == -1) {
- if (execv("/usr/sbin/dsstat", argv) != 0) {
- fail(DSSTAT_EMAP, gettext("Kstat is invalid.\n"));
- }
- }
-
- if (error) {
- fail(DSSTAT_EUNKNWN, gettext("An unknown error occured.\n"));
- }
-
- return (0);
-}