2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Use is subject to license terms.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * BSD 3 Clause License
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Copyright (c) 2007, The Storage Networking Industry Association.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Redistribution and use in source and binary forms, with or without
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * modification, are permitted provided that the following conditions
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * are met:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * - Redistributions of source code must retain the above copyright
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * notice, this list of conditions and the following disclaimer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * - Redistributions in binary form must reproduce the above copyright
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * notice, this list of conditions and the following disclaimer in
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * the documentation and/or other materials provided with the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * distribution.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * - Neither the name of The Storage Networking Industry Association (SNIA)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * nor the names of its contributors may be used to endorse or promote
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * products derived from this software without specific prior written
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * permission.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * POSSIBILITY OF SUCH DAMAGE.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <stdio.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <stdlib.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <stdarg.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <ctype.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <unistd.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <memory.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <string.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <fcntl.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <errno.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <signal.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <values.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <poll.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <locale.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <libndmp.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define MAX_DEV_STAT 16
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define REPRINT 19
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define VAL(v) (new->ns_##v)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define DELTA(v) (new->ns_##v - (old ? old->ns_##v : 0))
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define ADJ(n) ((adj <= 0) ? n : (adj >= n) ? 1 : n - adj)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define adjprintf(fmt, n, val) adj -= (n + 1) - printf(fmt, ADJ(n), val)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#if !defined(TEXT_DOMAIN)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TEXT_DOMAIN "SYS_TEST"
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#endif
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int adj; /* number of excess columns */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic long iter = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int blksize = 1024;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int poll_interval = 1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic ndmp_stat_t *nstat;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int lines = 1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void dostats(ndmp_stat_t *, ndmp_stat_t *);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void printhdr(int);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void usage(void);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarmain(int argc, char **argv)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_stat_t *old = NULL;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) setlocale(LC_ALL, "");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) textdomain(TEXT_DOMAIN);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar argc--, argv++;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (argc > 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar long interval;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *endptr;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar errno = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar interval = strtol(argv[0], &endptr, 10);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (errno > 0 || *endptr != '\0' || interval <= 0 ||
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar interval > MAXLONG) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar usage();
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar poll_interval = 1000 * interval;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (poll_interval <= 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar usage();
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar iter = MAXLONG;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (argc > 1) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar iter = strtol(argv[1], NULL, 10);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (errno > 0 || *endptr != '\0' || iter <= 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar usage();
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (argc > 2) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar usage();
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_door_status()) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) fprintf(stdout,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar gettext(" Error: ndmpd service not running.\n"));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) sigset(SIGCONT, printhdr);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar printhdr(0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((nstat = malloc(sizeof (ndmp_stat_t))) == NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) fprintf(stdout, gettext("Out of memory"));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_get_stats(nstat) != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(nstat);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dostats(old, nstat);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar while (--iter > 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) poll(NULL, 0, poll_interval);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(old);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar old = nstat;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((nstat = malloc(sizeof (ndmp_stat_t))) == NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) fprintf(stdout, gettext("Out of memory"));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(old);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_get_stats(nstat) != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(old);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(nstat);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dostats(old, nstat);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* ARGSUSED */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarprinthdr(int sig)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) printf(" wthr ops file disk tape ");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) printf("bytes perf prcnt\n");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) printf(" r w bk rs rd wr rd wr rd wr rd ");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) printf("wr bk rs dsk tpe idl\n");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar lines = REPRINT;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdardostats(ndmp_stat_t *old, ndmp_stat_t *new)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar long long dskop = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar long long tpop = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar long dpcnt, tpcnt;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar long ipcnt;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int totl;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar long rbytes;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar long wbytes;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar adj = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (--lines == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar printhdr(0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!old) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) printf(" 0 0 0 0 0 0 0 ");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) printf("0 0 0 0 0 0 0 0 0 100\n");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar adjprintf(" %*u", 1, VAL(trun));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar adjprintf(" %*u", 1, VAL(twait));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar adjprintf(" %*u", 2, VAL(nbk));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar adjprintf(" %*u", 2, VAL(nrs));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar adjprintf(" %*u", 4, DELTA(rfile));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar adjprintf(" %*u", 4, DELTA(wfile));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar adjprintf(" %*u", 4, (unsigned)(DELTA(rdisk) / blksize));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar adjprintf(" %*u", 4, (unsigned)(DELTA(wdisk) / blksize));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar adjprintf(" %*u", 4, (unsigned)(DELTA(rtape) / blksize));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar adjprintf(" %*u", 4, (unsigned)(DELTA(wtape) / blksize));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* Get the average throughput */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rbytes = (DELTA(wtape) + DELTA(rdisk)) / 2;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar wbytes = (DELTA(rtape) + DELTA(wdisk)) / 2;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rbytes /= blksize;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar wbytes /= blksize;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar adjprintf(" %*lu", 4, rbytes);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar adjprintf(" %*lu", 4, wbytes);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar adjprintf(" %*lu", 3, rbytes / poll_interval);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar adjprintf(" %*lu", 2, wbytes / poll_interval);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dskop += DELTA(rdisk);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dskop += DELTA(wdisk);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tpop += DELTA(rtape);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tpop += DELTA(wtape);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar totl = (dskop + tpop) ? (dskop + tpop) : 1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dpcnt = (dskop * 100) / totl;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tpcnt = (tpop * 100) / totl;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ipcnt = 100 - dpcnt - tpcnt;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar adjprintf(" %*lu", 4, dpcnt);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar adjprintf(" %*lu", 3, tpcnt);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar adjprintf(" %*lu\n", 3, ipcnt);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) fflush(stdout);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarusage(void)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) fprintf(stderr, "Usage: ndmpstat [interval [count]]\n");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}