main.c revision 161200
1/*-
2 * Copyright (c) 2002-2006 Sam Leffler, Errno Consulting
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer,
10 *    without modification.
11 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
12 *    similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
13 *    redistribution must be conditioned upon including a substantially
14 *    similar Disclaimer requirement for further binary redistribution.
15 * 3. Neither the names of the above-listed copyright holders nor the names
16 *    of any contributors may be used to endorse or promote products derived
17 *    from this software without specific prior written permission.
18 *
19 * Alternatively, this software may be distributed under the terms of the
20 * GNU General Public License ("GPL") version 2 as published by the Free
21 * Software Foundation.
22 *
23 * NO WARRANTY
24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26 * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
27 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
28 * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
29 * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
30 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
32 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
34 * THE POSSIBILITY OF SUCH DAMAGES.
35 *
36 * $FreeBSD: head/tools/tools/ath/athstats/main.c 161200 2006-08-10 19:01:16Z sam $
37 */
38
39/*
40 * Simple Atheros-specific tool to inspect and monitor network traffic
41 * statistics.
42 *
43 *	athstats [-i interface] [-l] [-o fmtstring] [interval]
44 *
45 * (default interface is ath0).  If interval is specified a rolling output
46 * a la netstat -i is displayed every interval seconds.  The format of
47 * the rolling display can be controlled a la ps.  The -l option will
48 * print a list of all possible statistics for use with the -o option.
49 */
50
51#include <stdio.h>
52#include <signal.h>
53#include <unistd.h>
54#include <err.h>
55
56#include "athstats.h"
57
58#define	S_DEFAULT \
59	"input,output,altrate,short,long,xretry,crcerr,crypt,phyerr,rssi,rate"
60
61static int signalled;
62
63static void
64catchalarm(int signo __unused)
65{
66	signalled = 1;
67}
68
69int
70main(int argc, char *argv[])
71{
72	struct athstatfoo *wf;
73	int c;
74
75	wf = athstats_new("ath0", S_DEFAULT);
76	while ((c = getopt(argc, argv, "i:lo:")) != -1) {
77		switch (c) {
78		case 'i':
79			wf->setifname(wf, optarg);
80			break;
81		case 'l':
82			wf->print_fields(wf, stdout);
83			return 0;
84		case 'o':
85			wf->setfmt(wf, optarg);
86			break;
87		default:
88			errx(-1, "usage: %s [-a] [-i ifname] [-l] [-o fmt] [interval]\n", argv[0]);
89			/*NOTREACHED*/
90		}
91	}
92	argc -= optind;
93	argv += optind;
94
95	if (argc > 0) {
96		u_long interval = strtoul(argv[0], NULL, 0);
97		int line, omask;
98
99		if (interval < 1)
100			interval = 1;
101		signal(SIGALRM, catchalarm);
102		signalled = 0;
103		alarm(interval);
104	banner:
105		wf->print_header(wf, stdout);
106		line = 0;
107	loop:
108		if (line != 0) {
109			wf->collect_cur(wf);
110			wf->print_current(wf, stdout);
111			wf->update_tot(wf);
112		} else {
113			wf->collect_tot(wf);
114			wf->print_total(wf, stdout);
115		}
116		fflush(stdout);
117		omask = sigblock(sigmask(SIGALRM));
118		if (!signalled)
119			sigpause(0);
120		sigsetmask(omask);
121		signalled = 0;
122		alarm(interval);
123		line++;
124		if (line == 21)		/* XXX tty line count */
125			goto banner;
126		else
127			goto loop;
128		/*NOTREACHED*/
129	} else {
130		wf->collect_tot(wf);
131		wf->print_verbose(wf, stdout);
132	}
133	return 0;
134}
135