Author: maxim
Date: Mon Mar 23 09:00:33 2009
New Revision: 190316
URL: http://svn.freebsd.org/changeset/base/190316

Log:
  MFC r175118: when the ms/req fields exceed 1 second, drop the fractions
  to fit more digits.
  MFC r183665: batch mode.
  MFC r189738: fix man page sinopsys; remove BUG section.
  MFC r189739: turn the batch mode on if stdout is not tty.
  > Description of fields to fill in above:                     76 columns --|
  > PR:            If a GNATS PR is affected by the change.
  > Submitted by:  If someone else sent in the change.
  > Reviewed by:   If someone else reviewed your modification.
  > Approved by:   If you needed approval for this commit.
  > Obtained from: If the change is from a third party.
  > MFC after:     N [day[s]|week[s]|month[s]].  Request a reminder email.
  > Security:      Vulnerability reference (one per line) or description.
  > Empty fields above will be automatically removed.
  
  _M   gstat
  M    gstat/gstat.c
  M    gstat/gstat.8

Modified:
  stable/7/usr.sbin/gstat/   (props changed)
  stable/7/usr.sbin/gstat/gstat.8
  stable/7/usr.sbin/gstat/gstat.c

Modified: stable/7/usr.sbin/gstat/gstat.8
==============================================================================
--- stable/7/usr.sbin/gstat/gstat.8     Mon Mar 23 08:33:19 2009        
(r190315)
+++ stable/7/usr.sbin/gstat/gstat.8     Mon Mar 23 09:00:33 2009        
(r190316)
@@ -24,7 +24,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd May 20, 2006
+.Dd March 12, 2009
 .Dt GSTAT 8
 .Os
 .Sh NAME
@@ -32,7 +32,7 @@
 .Nd print statistics about GEOM disks
 .Sh SYNOPSIS
 .Nm
-.Op Fl acd
+.Op Fl abcd
 .Op Fl f Ar filter
 .Op Fl I Ar interval
 .Sh DESCRIPTION
@@ -46,6 +46,10 @@ The options are as follows:
 .Bl -tag -width indent
 .It Fl a
 Only display providers that are at least 0.1% busy.
+.It Fl b
+Batch mode.
+Collect numbers, print and exit.
+Default if stdout is not a tty.
 .It Fl c
 Enable display of
 .Xr geom 4
@@ -90,15 +94,3 @@ A
 .Nm
 utility appeared in
 .Fx 5.0 .
-.Sh BUGS
-The
-.Nm
-utility only works interactively.
-It should probably detect when it is run non-interactively and produce
-simple
-.Tn ASCII
-text output.
-Otherwise, this utility should probably be folded into
-.Xr systat 1
-which only works interactively and is the obvious utility to run for
-various other forms of system statistics.

Modified: stable/7/usr.sbin/gstat/gstat.c
==============================================================================
--- stable/7/usr.sbin/gstat/gstat.c     Mon Mar 23 08:33:19 2009        
(r190315)
+++ stable/7/usr.sbin/gstat/gstat.c     Mon Mar 23 09:00:33 2009        
(r190316)
@@ -51,9 +51,16 @@
 #include <sysexits.h>
 #include <unistd.h>
 
-static int flag_a, flag_c, flag_d;
+static int flag_a, flag_b, flag_c, flag_d;
 static int flag_I = 1000000;
 
+#define PRINTMSG(...) do {                                             \
+               if (flag_b && !loop)                                    \
+                       printf(__VA_ARGS__);                            \
+               else if (!flag_b)                                       \
+                       printw(__VA_ARGS__);                            \
+       } while(0)
+
 static void usage(void);
 
 static const char*
@@ -67,7 +74,7 @@ int
 main(int argc, char **argv)
 {
        int error, i, quit;
-       int curx, cury, maxx, maxy, line_len, max_flen;
+       int curx, cury, maxx, maxy, line_len, loop, max_flen;
        struct devstat *gsp, *gsq;
        void *sp, *sq;
        double dt;
@@ -87,12 +94,24 @@ main(int argc, char **argv)
        History *hist;
        HistEvent hist_ev;
 
+       hist = NULL;
+       el = NULL;
+       maxx = -1;
+       curx = -1;
+       loop = 1;
+       /* Turn on batch mode if output is not tty. */
+       if (!isatty(fileno(stdout)))
+               flag_b = 1;
+
        f_s[0] = '\0';
-       while ((i = getopt(argc, argv, "adcf:I:")) != -1) {
+       while ((i = getopt(argc, argv, "adcf:I:b")) != -1) {
                switch (i) {
                case 'a':
                        flag_a = 1;
                        break;
+               case 'b':
+                       flag_b = 1;
+                       break;
                case 'c':
                        flag_c = 1;
                        break;
@@ -141,34 +160,36 @@ main(int argc, char **argv)
        sq = geom_stats_snapshot_get();
        if (sq == NULL)
                err(1, "geom_stats_snapshot()");
-       /* Setup curses */
-       initscr();
-       start_color();
-       use_default_colors();
-       pair_content(0, &cf, &cb);
-       init_pair(1, COLOR_GREEN, cb);
-       init_pair(2, COLOR_MAGENTA, cb);
-       init_pair(3, COLOR_RED, cb);
-       cbreak();
-       noecho();
-       nonl();
-       nodelay(stdscr, 1);
-       intrflush(stdscr, FALSE);
-       keypad(stdscr, TRUE);
-       /* Setup libedit */
-       hist = history_init();
-       if (hist == NULL)
-               err(EX_SOFTWARE, "history_init()");
-       history(hist, &hist_ev, H_SETSIZE, 100);
-       el = el_init("gstat", stdin, stdout, stderr);
-       if (el == NULL)
-               err(EX_SOFTWARE, "el_init");
-       el_set(el, EL_EDITOR, "emacs");
-       el_set(el, EL_SIGNAL, 1);
-       el_set(el, EL_HIST, history, hist);
-       el_set(el, EL_PROMPT, el_prompt);
-       if (f_s[0] != '\0')
-               history(hist, &hist_ev, H_ENTER, f_s);
+       if (!flag_b) {
+               /* Setup curses */
+               initscr();
+               start_color();
+               use_default_colors();
+               pair_content(0, &cf, &cb);
+               init_pair(1, COLOR_GREEN, cb);
+               init_pair(2, COLOR_MAGENTA, cb);
+               init_pair(3, COLOR_RED, cb);
+               cbreak();
+               noecho();
+               nonl();
+               nodelay(stdscr, 1);
+               intrflush(stdscr, FALSE);
+               keypad(stdscr, TRUE);
+               /* Setup libedit */
+               hist = history_init();
+               if (hist == NULL)
+                       err(EX_SOFTWARE, "history_init()");
+               history(hist, &hist_ev, H_SETSIZE, 100);
+               el = el_init("gstat", stdin, stdout, stderr);
+               if (el == NULL)
+                       err(EX_SOFTWARE, "el_init");
+               el_set(el, EL_EDITOR, "emacs");
+               el_set(el, EL_SIGNAL, 1);
+               el_set(el, EL_HIST, history, hist);
+               el_set(el, EL_PROMPT, el_prompt);
+               if (f_s[0] != '\0')
+                       history(hist, &hist_ev, H_ENTER, f_s);
+       }
        geom_stats_snapshot_timestamp(sq, &tq);
        for (quit = 0; !quit;) {
                sp = geom_stats_snapshot_get();
@@ -182,12 +203,13 @@ main(int argc, char **argv)
                geom_stats_snapshot_reset(sp);
                geom_stats_snapshot_reset(sq);
                move(0,0);
-               printw("dT: %5.3fs  w: %.3fs",
-                   dt, (float)flag_I / 1000000);
+               PRINTMSG("dT: %5.3fs  w: %.3fs", dt, (float)flag_I / 1000000);
                if (f_s[0] != '\0') {
-                       printw("  filter: ");
-                       getyx(stdscr, cury, curx);
-                       getmaxyx(stdscr, maxy, maxx);
+                       PRINTMSG("  filter: ");
+                       if (!flag_b) {
+                               getyx(stdscr, cury, curx);
+                               getmaxyx(stdscr, maxy, maxx);
+                       }
                        strncpy(pf_s, f_s, sizeof(pf_s));
                        max_flen = maxx - curx - 1;
                        if ((int)strlen(f_s) > max_flen && max_flen >= 0) {
@@ -199,15 +221,15 @@ main(int argc, char **argv)
                                        pf_s[max_flen - 1] = '.';
                                pf_s[max_flen] = '\0';
                        }
-                       printw("%s", pf_s);
+                       PRINTMSG("%s", pf_s);
                }
-               printw("\n");
-               printw(" L(q)  ops/s   ");
-               printw(" r/s   kBps   ms/r   ");
-               printw(" w/s   kBps   ms/w   ");
+               PRINTMSG("\n");
+               PRINTMSG(" L(q)  ops/s   ");
+               PRINTMSG(" r/s   kBps   ms/r   ");
+               PRINTMSG(" w/s   kBps   ms/w   ");
                if (flag_d)
-                       printw(" d/s   kBps   ms/d   ");
-               printw("%%busy Name\n");
+                       PRINTMSG(" d/s   kBps   ms/d   ");
+               PRINTMSG("%%busy Name\n");
                for (;;) {
                        gsp = geom_stats_snapshot_next(sp);
                        gsq = geom_stats_snapshot_next(sq);
@@ -228,9 +250,11 @@ main(int argc, char **argv)
                        if (gid->lg_what == ISCONSUMER && !flag_c)
                                continue;
                        /* Do not print past end of window */
-                       getyx(stdscr, cury, curx);
-                       if (curx > 0)
-                               continue;
+                       if (!flag_b) {
+                               getyx(stdscr, cury, curx);
+                               if (curx > 0)
+                                       continue;
+                       }
                        if ((gid->lg_what == ISPROVIDER
                            || gid->lg_what == ISCONSUMER) && f_s[0] != '\0') {
                                pp = gid->lg_ptr;
@@ -239,7 +263,7 @@ main(int argc, char **argv)
                                  continue;
                        }
                        if (gsp->sequence0 != gsp->sequence1) {
-                               printw("*\n");
+                               PRINTMSG("*\n");
                                continue;
                        }
                        devstat_compute_statistics(gsp, gsq, dt, 
@@ -265,19 +289,28 @@ main(int argc, char **argv)
                                continue;
                        }
 
-                       printw(" %4ju", (uintmax_t)u64);
-                       printw(" %6.0f", (double)ld[0]);
-                       printw(" %6.0f", (double)ld[1]);
-                       printw(" %6.0f", (double)ld[2] * 1024);
-                       printw(" %6.1f", (double)ld[3]);
-                       printw(" %6.0f", (double)ld[4]);
-                       printw(" %6.0f", (double)ld[5] * 1024);
-                       printw(" %6.1f", (double)ld[6]);
+                       PRINTMSG(" %4ju", (uintmax_t)u64);
+                       PRINTMSG(" %6.0f", (double)ld[0]);
+                       PRINTMSG(" %6.0f", (double)ld[1]);
+                       PRINTMSG(" %6.0f", (double)ld[2] * 1024);
+                       if (ld[3] > 1e3) 
+                               PRINTMSG(" %6.0f", (double)ld[3]);
+                       else
+                               PRINTMSG(" %6.1f", (double)ld[3]);
+                       PRINTMSG(" %6.0f", (double)ld[4]);
+                       PRINTMSG(" %6.0f", (double)ld[5] * 1024);
+                       if (ld[6] > 1e3) 
+                               PRINTMSG(" %6.0f", (double)ld[6]);
+                       else
+                               PRINTMSG(" %6.1f", (double)ld[6]);
 
                        if (flag_d) {
-                               printw(" %6.0f", (double)ld[8]);
-                               printw(" %6.0f", (double)ld[9] * 1024);
-                               printw(" %6.1f", (double)ld[10]);
+                               PRINTMSG(" %6.0f", (double)ld[8]);
+                               PRINTMSG(" %6.0f", (double)ld[9] * 1024);
+                               if (ld[10] > 1e3) 
+                                       PRINTMSG(" %6.0f", (double)ld[10]);
+                               else
+                                       PRINTMSG(" %6.1f", (double)ld[10]);
                        }
 
                        if (ld[7] > 80)
@@ -286,27 +319,40 @@ main(int argc, char **argv)
                                i = 2;
                        else 
                                i = 1;
-                       attron(COLOR_PAIR(i));
-                       printw(" %6.1lf", (double)ld[7]);
-                       attroff(COLOR_PAIR(i));
-                       printw("|");
+                       if (!flag_b)
+                               attron(COLOR_PAIR(i));
+                       PRINTMSG(" %6.1lf", (double)ld[7]);
+                       if (!flag_b) {
+                               attroff(COLOR_PAIR(i));
+                               PRINTMSG("|");
+                       } else
+                               PRINTMSG(" ");
                        if (gid == NULL) {
-                               printw(" ??");
+                               PRINTMSG(" ??");
                        } else if (gid->lg_what == ISPROVIDER) {
                                pp = gid->lg_ptr;
-                               printw(" %s", pp->lg_name);
+                               PRINTMSG(" %s", pp->lg_name);
                        } else if (gid->lg_what == ISCONSUMER) {
                                cp = gid->lg_ptr;
-                               printw(" %s/%s/%s",
+                               PRINTMSG(" %s/%s/%s",
                                    cp->lg_geom->lg_class->lg_name,
                                    cp->lg_geom->lg_name,
                                    cp->lg_provider->lg_name);
                        }
-                       clrtoeol();
-                       printw("\n");
+                       if (!flag_b)
+                               clrtoeol();
+                       PRINTMSG("\n");
                        *gsq = *gsp;
                }
                geom_stats_snapshot_free(sp);
+               if (flag_b) {
+                       /* We loop extra to make sure we get the information. */
+                       if (!loop)
+                               break;
+                       loop = 0;
+                       usleep(flag_I);
+                       continue;
+               }
                getyx(stdscr, cury, curx);
                getmaxyx(stdscr, maxy, maxx);
                clrtobot();
@@ -369,15 +415,17 @@ main(int argc, char **argv)
                }
        }
 
-       endwin();
-       el_end(el);
+       if (!flag_b) {
+               endwin();
+               el_end(el);
+       }
        exit(EX_OK);
 }
 
 static void
 usage(void)
 {
-       fprintf(stderr, "usage: gstat [-acd] [-f filter] [-I interval]\n");
+       fprintf(stderr, "usage: gstat [-abcd] [-f filter] [-I interval]\n");
        exit(EX_USAGE);
         /* NOTREACHED */
 }
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to