summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwens <wens@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2010-10-20 21:06:50 +0800
committerwens <wens@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2010-10-20 21:06:50 +0800
commitc5ba1213257007a6aed0e3fbf1ba5cb5263cd781 (patch)
tree057aaf87690f2b4144f6bb08e3e1e29acb4edd09
parent156d40d3904a13fad79c14330c8bc0285edb3727 (diff)
downloadpttbbs-c5ba1213257007a6aed0e3fbf1ba5cb5263cd781.tar
pttbbs-c5ba1213257007a6aed0e3fbf1ba5cb5263cd781.tar.gz
pttbbs-c5ba1213257007a6aed0e3fbf1ba5cb5263cd781.tar.bz2
pttbbs-c5ba1213257007a6aed0e3fbf1ba5cb5263cd781.tar.lz
pttbbs-c5ba1213257007a6aed0e3fbf1ba5cb5263cd781.tar.xz
pttbbs-c5ba1213257007a6aed0e3fbf1ba5cb5263cd781.tar.zst
pttbbs-c5ba1213257007a6aed0e3fbf1ba5cb5263cd781.zip
Remove diskstat. We shouldn't have to maintain this in our tree.
git-svn-id: http://opensvn.csie.org/pttbbs/trunk@5133 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
-rw-r--r--pttbbs/util/Makefile10
-rw-r--r--pttbbs/util/diskstat.c788
2 files changed, 0 insertions, 798 deletions
diff --git a/pttbbs/util/Makefile b/pttbbs/util/Makefile
index 011cda58..7235b9f6 100644
--- a/pttbbs/util/Makefile
+++ b/pttbbs/util/Makefile
@@ -86,16 +86,6 @@ installfiltermail:
mv $(BBSHOME)/bin/bbsmail $(BBSHOME)/bin/realbbsmail
ln -s $(BBSHOME)/bin/filtermail.pl $(BBSHOME)/bin/bbsmail
-# for diskstat(FreeBSD 4.x only) .
-# diskstat should be compiled with bbs and installed with root
-diskstat: diskstat.c
- $(CC) $(CFLAGS) -o diskstat diskstat.c -ldevstat -lkvm
-
-installdiskstat: diskstat
- cp -f diskstat /usr/local/bin/
- chgrp kmem /usr/local/bin/diskstat
- chmod 2755 /usr/local/bin/diskstat
-
# for bbsctl. bbsctl should be compiled with bbs and installed with root
bbsctl: bbsctl.c
$(CC) $(CFLAGS) ${LDFLAGS} -o $@ $@.c $(LDLIBS)
diff --git a/pttbbs/util/diskstat.c b/pttbbs/util/diskstat.c
deleted file mode 100644
index bc80ece1..00000000
--- a/pttbbs/util/diskstat.c
+++ /dev/null
@@ -1,788 +0,0 @@
-#ifndef __FreeBSD__
- #include <stdio.h>
- int main(int argc, char **argv)
- {
- puts("sorry, this program is designed for FreeBSD only");
- return 0;
- }
-#else
-/*
- * Copyright (c) 1997, 1998 Kenneth D. Merry.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD: src/usr.sbin/iostat/iostat.c,v 1.17.2.2 2001/07/19 04:15:42 kris Exp $
- */
-/*
- * Parts of this program are derived from the original FreeBSD iostat
- * program:
- */
-/*-
- * Copyright (c) 1986, 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-/*
- * Ideas for the new iostat statistics output modes taken from the NetBSD
- * version of iostat:
- */
-/*
- * Copyright (c) 1996 John M. Vinopal
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed for the NetBSD Project
- * by John M. Vinopal.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-
-#include <sys/param.h>
-#include <sys/errno.h>
-#include <sys/dkstat.h>
-
-#include <err.h>
-#include <ctype.h>
-#include <fcntl.h>
-#include <kvm.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <limits.h>
-#include <devstat.h>
-
-struct nlist namelist[] = {
-#define X_TK_NIN 0
- { "_tk_nin" },
-#define X_TK_NOUT 1
- { "_tk_nout" },
-#define X_CP_TIME 2
- { "_cp_time" },
-#define X_HZ 3
- { "_hz" },
-#define X_STATHZ 4
- { "_stathz" },
-#define X_END 4
- { NULL },
-};
-
-struct statinfo cur, last;
-int num_devices;
-struct device_selection *dev_select;
-int maxshowdevs;
-int dflag = 1, Iflag = 0, Cflag = 0, Tflag = 0, oflag = 0, Kflag = 0, Bflag = 1, qflag = 0, sflag = 0, aflag = 0, fflag = 1;
-
-#define nlread(x, v) \
- kvm_read(kd, namelist[x].n_value, &(v), sizeof(v))
-
-/* local function declarations */
-static void usage(void);
-static void phdr(int signo);
-static void devstats(int perf_select);
-static void cpustats(void);
-static void printresult(int p);
-
-static void
-usage(void)
-{
- /*
- * We also support the following 'traditional' syntax:
- * iostat [drives] [wait [count]]
- * This isn't mentioned in the man page, or the usage statement,
- * but it is supported.
- */
- fprintf(stderr, "usage: iostat [-CdhIKoT?] [-c count] [-M core]"
- " [-n devs] [-N system]\n"
- "\t [-t type,if,pass] [-w wait] [drives]\n");
-}
-
-char firsttime = 1;
-int
-main(int argc, char **argv)
-{
- int c;
- register int i;
- int tflag = 0, hflag = 0, cflag = 0, wflag = 1, nflag = 0;
- int count = 0, waittime = 2;
- char *memf = NULL, *nlistf = NULL;
- struct devstat_match *matches;
- int num_matches = 0;
- char errbuf[_POSIX2_LINE_MAX];
- kvm_t *kd;
- int hz, stathz;
- int headercount;
- long generation;
- int num_devices_specified;
- int num_selected, num_selections;
- long select_generation;
- char **specified_devices;
- devstat_select_mode select_mode;
-
- matches = NULL;
- maxshowdevs = 10;
-
- while ((c = getopt(argc, argv, "c:CdhIKM:n:N:ot:Tw:?qsaf:")) != -1) {
- switch(c) {
- case 'c':
- cflag++;
- count = atoi(optarg);
- if (count < 1)
- errx(1, "count %d is < 1", count);
- break;
- case 'C':
- Cflag++;
- break;
- case 'd':
- dflag++;
- break;
- case 'h':
- hflag++;
- break;
- case 'I':
- Iflag++;
- break;
- case 'K':
- Kflag++;
- break;
- case 'M':
- memf = optarg;
- break;
- case 'n':
- nflag++;
- maxshowdevs = atoi(optarg);
- if (maxshowdevs < 0)
- errx(1, "number of devices %d is < 0",
- maxshowdevs);
- break;
- case 'N':
- nlistf = optarg;
- break;
- case 'o':
- oflag++;
- break;
- case 't':
- tflag++;
- if (buildmatch(optarg, &matches,
- &num_matches) != 0)
- errx(1, "%s", devstat_errbuf);
- break;
- case 'T':
- Tflag++;
- break;
- case 'w':
- wflag++;
- waittime = atoi(optarg);
- if (waittime < 1)
- errx(1, "wait time is < 1");
- break;
- case 'q': /* statistics only */
- qflag++;
- break;
- case 's': /* scsi only */
- sflag++;
- break;
- case 'a': /* average only */
- aflag++;
- break;
- case 'f': /* factor output */
- fflag = atoi(optarg);
- break;
- default:
- usage();
- exit(1);
- break;
- }
- }
-
- argc -= optind;
- argv += optind;
-
- /*
- * Discard setgid privileges if not the running kernel so that bad
- * guys can't print interesting stuff from kernel memory.
- */
- if (nlistf != NULL || memf != NULL)
- setgid(getgid());
-
- /*
- * Make sure that the userland devstat version matches the kernel
- * devstat version. If not, exit and print a message informing
- * the user of his mistake.
- */
- if (checkversion() < 0)
- errx(1, "%s", devstat_errbuf);
-
-#if 0
- /*
- * Figure out how many devices we should display.
- */
- if (nflag == 0) {
- if (oflag > 0) {
- if ((dflag > 0) && (Cflag == 0) && (Tflag == 0))
- maxshowdevs = 5;
- else if ((dflag > 0) && (Tflag > 0) && (Cflag == 0))
- maxshowdevs = 5;
- else
- maxshowdevs = 4;
- } else {
- if ((dflag > 0) && (Cflag == 0))
- maxshowdevs = 4;
- else
- maxshowdevs = 3;
- }
- }
-#endif
-
- Signal(SIGINT, printresult);
- /* find out how many devices we have */
- if ((num_devices = getnumdevs()) < 0)
- err(1, "can't get number of devices");
-
- if ((cur.dinfo = (struct devinfo *)malloc(sizeof(struct devinfo))) ==
- NULL)
- err(1, "devinfo malloc failed");
- if ((last.dinfo = (struct devinfo *)malloc(sizeof(struct devinfo))) ==
- NULL)
- err(1, "devinfo malloc failed");
- bzero(cur.dinfo, sizeof(struct devinfo));
- bzero(last.dinfo, sizeof(struct devinfo));
-
- /*
- * Grab all the devices. We don't look to see if the list has
- * changed here, since it almost certainly has. We only look for
- * errors.
- */
- if (getdevs(&cur) == -1)
- errx(1, "%s", devstat_errbuf);
-
- num_devices = cur.dinfo->numdevs;
- generation = cur.dinfo->generation;
-
- /*
- * If the user specified any devices on the command line, see if
- * they are in the list of devices we have now.
- */
- if ((specified_devices = (char **)malloc(sizeof(char *))) == NULL)
- err(1, "specified_devices malloc failed");
- for (num_devices_specified = 0; *argv; ++argv) {
- if (isdigit(**argv))
- break;
- num_devices_specified++;
- specified_devices = (char **)realloc(specified_devices,
- sizeof(char *) *
- num_devices_specified);
- specified_devices[num_devices_specified - 1] = *argv;
-
- }
- if (nflag == 0 && maxshowdevs < num_devices_specified)
- maxshowdevs = num_devices_specified;
-
- dev_select = NULL;
-
- if ((num_devices_specified == 0) && (num_matches == 0))
- select_mode = DS_SELECT_ADD;
- else
- select_mode = DS_SELECT_ONLY;
-
- /*
- * At this point, selectdevs will almost surely indicate that the
- * device list has changed, so we don't look for return values of 0
- * or 1. If we get back -1, though, there is an error.
- */
- if (selectdevs(&dev_select, &num_selected,
- &num_selections, &select_generation,
- generation, cur.dinfo->devices, num_devices,
- matches, num_matches,
- specified_devices, num_devices_specified,
- select_mode, maxshowdevs, hflag) == -1)
- errx(1, "%s", devstat_errbuf);
-
- /*
- * Look for the traditional wait time and count arguments.
- */
- if (*argv) {
- waittime = atoi(*argv);
-
- /* Let the user know he goofed, but keep going anyway */
- if (wflag != 0)
- warnx("discarding previous wait interval, using"
- " %d instead", waittime);
- wflag++;
-
- if (*++argv) {
- count = atoi(*argv);
- if (cflag != 0)
- warnx("discarding previous count, using %d"
- " instead", count);
- cflag++;
- } else
- count = -1;
- }
-
- /*
- * If the user specified a count, but not an interval, we default
- * to an interval of 1 second.
- */
- if ((wflag == 0) && (cflag > 0))
- waittime = 1;
-
- /*
- * If the user specified a wait time, but not a count, we want to
- * go on ad infinitum. This can be redundant if the user uses the
- * traditional method of specifying the wait, since in that case we
- * already set count = -1 above. Oh well.
- */
- if ((wflag > 0) && (cflag == 0))
- count = -1;
-
- kd = kvm_openfiles(nlistf, memf, NULL, O_RDONLY, errbuf);
-
- if (kd == 0)
- errx(1, "kvm_openfiles: %s", errbuf);
-
- if (kvm_nlist(kd, namelist) == -1)
- errx(1, "kvm_nlist: %s", kvm_geterr(kd));
-
- (void)nlread(X_HZ, hz);
- (void)nlread(X_STATHZ, stathz);
- if (stathz)
- hz = stathz;
-
- /*
- * If the user stops the program (control-Z) and then resumes it,
- * print out the header again.
- */
- (void)Signal(SIGCONT, phdr);
-
- for (headercount = 1;;) {
- struct devinfo *tmp_dinfo;
- long tmp;
- double etime;
-
- if (!--headercount) {
- phdr(0);
- headercount = 20;
- }
- (void)kvm_read(kd, namelist[X_TK_NIN].n_value,
- &cur.tk_nin, sizeof(cur.tk_nin));
- (void)kvm_read(kd, namelist[X_TK_NOUT].n_value,
- &cur.tk_nout, sizeof(cur.tk_nout));
- (void)kvm_read(kd, namelist[X_CP_TIME].n_value,
- cur.cp_time, sizeof(cur.cp_time));
-
- tmp_dinfo = last.dinfo;
- last.dinfo = cur.dinfo;
- cur.dinfo = tmp_dinfo;
-
- last.busy_time = cur.busy_time;
-
- /*
- * Here what we want to do is refresh our device stats.
- * getdevs() returns 1 when the device list has changed.
- * If the device list has changed, we want to go through
- * the selection process again, in case a device that we
- * were previously displaying has gone away.
- */
- switch (getdevs(&cur)) {
- case -1:
- errx(1, "%s", devstat_errbuf);
- break;
- case 1: {
- int retval;
-
- num_devices = cur.dinfo->numdevs;
- generation = cur.dinfo->generation;
- retval = selectdevs(&dev_select, &num_selected,
- &num_selections, &select_generation,
- generation, cur.dinfo->devices,
- num_devices, matches, num_matches,
- specified_devices,
- num_devices_specified,
- select_mode, maxshowdevs, hflag);
- switch(retval) {
- case -1:
- errx(1, "%s", devstat_errbuf);
- break;
- case 1:
- phdr(0);
- headercount = 20;
- break;
- default:
- break;
- }
- break;
- }
- default:
- break;
- }
-
- /*
- * We only want to re-select devices if we're in 'top'
- * mode. This is the only mode where the devices selected
- * could actually change.
- */
- if (hflag > 0) {
- int retval;
- retval = selectdevs(&dev_select, &num_selected,
- &num_selections, &select_generation,
- generation, cur.dinfo->devices,
- num_devices, matches, num_matches,
- specified_devices,
- num_devices_specified,
- select_mode, maxshowdevs, hflag);
- switch(retval) {
- case -1:
- errx(1,"%s", devstat_errbuf);
- break;
- case 1:
- phdr(0);
- headercount = 20;
- break;
- default:
- break;
- }
- }
-
- tmp = cur.tk_nin;
- cur.tk_nin -= last.tk_nin;
- last.tk_nin = tmp;
- tmp = cur.tk_nout;
- cur.tk_nout -= last.tk_nout;
- last.tk_nout = tmp;
-
- etime = 0.0;
-
-#define X(fld) tmp = cur.fld[i]; cur.fld[i] -= last.fld[i]; last.fld[i] = tmp
-
- for (i = 0; i < CPUSTATES; i++) {
- X(cp_time);
- etime += cur.cp_time[i];
- }
- if (etime == 0.0)
- etime = 1.0;
- etime /= (float)hz;
- if ((dflag == 0) || (Tflag > 0))
- printf("%4.0f%5.0f", cur.tk_nin / etime,
- cur.tk_nout/etime);
- devstats(hflag);
- if ((dflag == 0) || (Cflag > 0))
- cpustats();
- if( !qflag ) printf("\n");
- fflush(stdout);
-
- if (count >= 0 && --count <= 0)
- break;
-
- sleep(waittime);
- firsttime = 0;
- }
-
- printresult(0);
- exit(0);
-}
-
-static void
-phdr(int signo)
-{
- register int i;
- int printed;
- if( firsttime ){
- for( i = 0 ; i < num_devices ; ++i ){
- int di = dev_select[i].position;
- if( strcmp(cur.dinfo->devices[di].device_name, "ad") != 0 &&
- strcmp(cur.dinfo->devices[di].device_name, "da") != 0 ){
- maxshowdevs = i;
- break;
- }
- }
- }
-
- if( qflag )
- return;
- if ((dflag == 0) || (Tflag > 0))
- (void)printf(" tty");
- for (i = 0, printed=0;(i < num_devices) && (printed < maxshowdevs);i++){
- int di;
- if ((dev_select[i].selected != 0)
- && (dev_select[i].selected <= maxshowdevs)) {
- di = dev_select[i].position;
- if (oflag > 0)
- (void)printf("%12.6s%d ",
- cur.dinfo->devices[di].device_name,
- cur.dinfo->devices[di].unit_number);
- else
- printf(cur.dinfo->devices[di].unit_number < 10 ? "%6s%d" : "%5s%2d",
- cur.dinfo->devices[di].device_name,
- cur.dinfo->devices[di].unit_number);
- printed++;
- }
- }
- if ((dflag == 0) || (Cflag > 0))
- (void)printf(" cpu\n");
- else
- (void)printf("\n");
-
- if ((dflag == 0) || (Tflag > 0))
- (void)printf(" tin tout");
-
- for (i=0, printed = 0;(i < num_devices) && (printed < maxshowdevs);i++){
- if ((dev_select[i].selected != 0)
- && (dev_select[i].selected <= maxshowdevs)) {
- if (oflag > 0) {
- if (Iflag == 0)
- (void)printf(" sps tps msps ");
- else
- (void)printf(" blk xfr msps ");
- } else {
- if(Bflag)
- printf(" busy");
- else if (Iflag == 0)
- printf(" KB/t tps MB/s ");
- else
- printf(" KB/t xfrs MB ");
- }
- printed++;
- }
- }
- if ((dflag == 0) || (Cflag > 0))
- (void)printf(" us ni sy in id\n");
- else
- printf("\n");
-
-}
-
-int counttimes = -1;
-float busydata[1024];
-int sf(const void *a, const void *b)
-{
- if( busydata[*(int *)b] > busydata[*(int *)a] )
- return 1;
- return -1;
-}
-
-static void printresult(int p)
-{
- int dn, id[1024], i;
- if( counttimes > 0 ){
- if( aflag ){
- float dat = 0;
- int nDrivers = 0;
- for( i = 0 ; i < maxshowdevs ; ++i )
- if( !sflag ||
- strcmp(cur.dinfo->devices[i].device_name, "da") == 0 ){
- dat += busydata[i];
- ++nDrivers;
- }
- printf("%f\n", dat * fflag / nDrivers / counttimes);
- }
- else{
- printf("\n");
- for( i = 0 ; i < maxshowdevs ; ++i )
- id[i] = i;
- qsort(id, maxshowdevs, sizeof(int), sf);
-
- printf("--- diskstat statistics (%d samples)---\n", counttimes);
- for (dn = 0; dn < maxshowdevs; dn++)
- printf(" %s%d: %10f%%\n",
- cur.dinfo->devices[ id[dn] ].device_name,
- cur.dinfo->devices[ id[dn] ].unit_number,
- (float)busydata[ id[dn] ] / counttimes);
- printf("\n");
- }
- }
- exit(0);
-}
-
-static void
-devstats(int perf_select)
-{
- register int dn;
- long double transfers_per_second;
- long double kb_per_transfer, mb_per_second;
- u_int64_t total_bytes, total_transfers, total_blocks;
- long double busy_seconds;
- long double total_mb;
- long double blocks_per_second, ms_per_transaction;
- long double device_busy;
-
- /*
- * Calculate elapsed time up front, since it's the same for all
- * devices.
- */
- busy_seconds = compute_etime(cur.busy_time, last.busy_time);
-
- for (dn = 0; dn < num_devices; dn++) {
- int di;
- float thisbusy;
-
- if (((perf_select == 0) && (dev_select[dn].selected == 0))
- || (dev_select[dn].selected > maxshowdevs))
- continue;
-
- di = dev_select[dn].position;
-
- device_busy = compute_etime(cur.dinfo->devices[di].busy_time,
- last.dinfo->devices[di].busy_time);
-
- if (compute_stats(&cur.dinfo->devices[di],
- &last.dinfo->devices[di], busy_seconds,
- &total_bytes, &total_transfers,
- &total_blocks, &kb_per_transfer,
- &transfers_per_second, &mb_per_second,
- &blocks_per_second, &ms_per_transaction)!= 0)
- errx(1, "%s", devstat_errbuf);
-
- if( (device_busy == 0) && (transfers_per_second > 5) )
- /* the device has been 100% busy, fake it because
- * as long as the device is 100% busy the busy_time
- * field in the devstat struct is not updated */
- device_busy = busy_seconds;
- if (device_busy > busy_seconds)
- /* this normally happens after one or more periods
- * where the device has been 100% busy, correct it */
- device_busy = busy_seconds;
-
- thisbusy = (firsttime) ? 0 : device_busy * 100 / busy_seconds;
- busydata[dn] += thisbusy;
-
-
- if (perf_select != 0) {
- dev_select[dn].bytes = total_bytes;
- if ((dev_select[dn].selected == 0)
- || (dev_select[dn].selected > maxshowdevs))
- continue;
- }
-
- if (Kflag) {
- int block_size = cur.dinfo->devices[di].block_size;
- total_blocks = total_blocks * (block_size ?
- block_size : 512) / 1024;
- }
-
- if (oflag > 0) {
- int msdig = (ms_per_transaction < 100.0) ? 1 : 0;
-
- if (Iflag == 0)
- printf("%4.0Lf%4.0Lf%5.*Lf ",
- blocks_per_second,
- transfers_per_second,
- msdig,
- ms_per_transaction);
- else
- printf("%4.1qu%4.1qu%5.*Lf ",
- total_blocks,
- total_transfers,
- msdig,
- ms_per_transaction);
- } else if( !qflag ) {
-
- if (Bflag)
- printf(" %5.1f%%", thisbusy);
- else if (Iflag == 0){
- printf(" %5.2Lf %3.0Lf %5.2Lf ",
- kb_per_transfer,
- transfers_per_second,
- mb_per_second);
-
- }
- else {
- total_mb = total_bytes;
- total_mb /= 1024 * 1024;
-
- printf(" %5.2Lf %3.1qu %5.2Lf ",
- kb_per_transfer,
- total_transfers,
- total_mb);
- }
- }
- }
- ++counttimes;
-}
-
-static void
-cpustats(void)
-{
- register int state;
- double time;
-
- time = 0.0;
-
- for (state = 0; state < CPUSTATES; ++state)
- time += cur.cp_time[state];
- for (state = 0; state < CPUSTATES; ++state)
- printf("%3.0f",
- 100. * cur.cp_time[state] / (time ? time : 1));
-}
-#endif // __FreeBSD__