1aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger/*
2aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * ifstat.c	handy utility to read net interface statistics
3aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *
4aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *		This program is free software; you can redistribute it and/or
5aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *		modify it under the terms of the GNU General Public License
6aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *		as published by the Free Software Foundation; either version
7aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *		2 of the License, or (at your option) any later version.
8aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *
9aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * Authors:	Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
10aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger */
11aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
12aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <stdio.h>
13aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <stdlib.h>
14aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <unistd.h>
15aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <fcntl.h>
16aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <string.h>
17aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <errno.h>
18aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <time.h>
19aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <sys/time.h>
20aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <fnmatch.h>
21aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <sys/file.h>
22aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <sys/socket.h>
23aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <sys/un.h>
24aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <sys/poll.h>
25aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <sys/wait.h>
26aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <sys/stat.h>
27aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <signal.h>
28aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <math.h>
299f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemminger#include <getopt.h>
30aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
31aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <libnetlink.h>
32daf7bd5c73aa3b7c91d83abf500c8749bec6e6d5Stephen Hemminger#include <linux/if.h>
33daf7bd5c73aa3b7c91d83abf500c8749bec6e6d5Stephen Hemminger#include <linux/if_link.h>
34aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
35aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <SNAPSHOT.h>
36aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
37aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint dump_zeros = 0;
38aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint reset_history = 0;
39aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint ignore_history = 0;
40aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint no_output = 0;
41aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint no_update = 0;
42aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint scan_interval = 0;
43aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint time_constant = 0;
44aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint show_errors = 0;
45aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerdouble W;
46aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerchar **patterns;
47aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint npatterns;
48aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
49aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerchar info_source[128];
50aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint source_mismatch;
51aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
52a571587d0b27a2c1492019c3abeb6fb0c0e606ceEric Dumazet#define MAXS (sizeof(struct rtnl_link_stats)/sizeof(__u32))
53aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
54aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstruct ifstat_ent
55aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
56aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct ifstat_ent	*next;
57aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	char			*name;
58aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	int			ifindex;
59aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	unsigned long long	val[MAXS];
60aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	double			rate[MAXS];
61a571587d0b27a2c1492019c3abeb6fb0c0e606ceEric Dumazet	__u32			ival[MAXS];
62aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger};
63aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
64aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstruct ifstat_ent *kern_db;
65aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstruct ifstat_ent *hist_db;
66aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
6750772dc51ac02239958e1ebcdb21277fcdf133a7osdl.net!shemmingerstatic int match(const char *id)
68aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
69aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	int i;
70aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
71aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (npatterns == 0)
72aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return 1;
73aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
74aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	for (i=0; i<npatterns; i++) {
75aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (!fnmatch(patterns[i], id, 0))
76aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			return 1;
77aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
78aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	return 0;
79aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
80aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
81ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemmingerstatic int get_nlmsg(const struct sockaddr_nl *who,
8250772dc51ac02239958e1ebcdb21277fcdf133a7osdl.net!shemminger		     struct nlmsghdr *m, void *arg)
83aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
84aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct ifinfomsg *ifi = NLMSG_DATA(m);
85aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct rtattr * tb[IFLA_MAX+1];
86aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	int len = m->nlmsg_len;
87aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct ifstat_ent *n;
88aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	int i;
89aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
90aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (m->nlmsg_type != RTM_NEWLINK)
91aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return 0;
92aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
93aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	len -= NLMSG_LENGTH(sizeof(*ifi));
94aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (len < 0)
95aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return -1;
96aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
97aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (!(ifi->ifi_flags&IFF_UP))
98aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return 0;
99aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
100aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	parse_rtattr(tb, IFLA_MAX, IFLA_RTA(ifi), len);
101aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (tb[IFLA_IFNAME] == NULL || tb[IFLA_STATS] == NULL)
102aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return 0;
103aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
104aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	n = malloc(sizeof(*n));
105aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (!n)
106aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		abort();
107aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	n->ifindex = ifi->ifi_index;
108aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	n->name = strdup(RTA_DATA(tb[IFLA_IFNAME]));
109aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	memcpy(&n->ival, RTA_DATA(tb[IFLA_STATS]), sizeof(n->ival));
110aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	memset(&n->rate, 0, sizeof(n->rate));
111aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	for (i=0; i<MAXS; i++)
112aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		n->val[i] = n->ival[i];
113aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	n->next = kern_db;
114aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	kern_db = n;
115aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	return 0;
116aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
117aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
118aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid load_info(void)
119aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
120aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct ifstat_ent *db, *n;
121aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct rtnl_handle rth;
122aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
123aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (rtnl_open(&rth, 0) < 0)
124aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		exit(1);
125aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
126aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (rtnl_wilddump_request(&rth, AF_INET, RTM_GETLINK) < 0) {
127aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		perror("Cannot send dump request");
128aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		exit(1);
129aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
130aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
131cd70f3f522e04b4d2fa80ae10292379bf223a53bStephen Hemminger	if (rtnl_dump_filter(&rth, get_nlmsg, NULL) < 0) {
132aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(stderr, "Dump terminated\n");
133aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		exit(1);
134aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
135aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
136aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	rtnl_close(&rth);
137aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
138aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	db = kern_db;
139aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	kern_db = NULL;
140aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
141aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	while (db) {
142aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		n = db;
143aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		db = db->next;
144aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		n->next = kern_db;
145aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		kern_db = n;
146aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
147aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
148aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
149aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid load_raw_table(FILE *fp)
150aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
151aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	char buf[4096];
152aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct ifstat_ent *db = NULL;
153aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct ifstat_ent *n;
154aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
155aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	while (fgets(buf, sizeof(buf), fp) != NULL) {
156aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		char *p;
157aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		char *next;
158aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		int i;
159aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
160aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (buf[0] == '#') {
161aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			buf[strlen(buf)-1] = 0;
162aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (info_source[0] && strcmp(info_source, buf+1))
163aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				source_mismatch = 1;
164aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			strncpy(info_source, buf+1, sizeof(info_source)-1);
165aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			continue;
166aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
167aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if ((n = malloc(sizeof(*n))) == NULL)
168aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			abort();
169aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
170aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (!(p = strchr(buf, ' ')))
171aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			abort();
172aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		*p++ = 0;
173aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
174aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (sscanf(buf, "%d", &n->ifindex) != 1)
175aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			abort();
176aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (!(next = strchr(p, ' ')))
177aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			abort();
178aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		*next++ = 0;
179aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
180aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		n->name = strdup(p);
181aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		p = next;
182aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
183aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		for (i=0; i<MAXS; i++) {
184aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			unsigned rate;
185aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (!(next = strchr(p, ' ')))
186aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				abort();
187aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			*next++ = 0;
188aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (sscanf(p, "%llu", n->val+i) != 1)
189aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				abort();
190a571587d0b27a2c1492019c3abeb6fb0c0e606ceEric Dumazet			n->ival[i] = (__u32)n->val[i];
191aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			p = next;
192aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (!(next = strchr(p, ' ')))
193aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				abort();
194aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			*next++ = 0;
195aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (sscanf(p, "%u", &rate) != 1)
196aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				abort();
197aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			n->rate[i] = rate;
198aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			p = next;
199aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
200aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		n->next = db;
201aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		db = n;
202aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
203aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
204aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	while (db) {
205aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		n = db;
206aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		db = db->next;
207aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		n->next = kern_db;
208aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		kern_db = n;
209aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
210aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
211aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
212aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid dump_raw_db(FILE *fp, int to_hist)
213aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
214aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct ifstat_ent *n, *h;
215aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	h = hist_db;
216aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	fprintf(fp, "#%s\n", info_source);
217aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
218aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	for (n=kern_db; n; n=n->next) {
219aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		int i;
220aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		unsigned long long *vals = n->val;
221aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		double *rates = n->rate;
222aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (!match(n->name)) {
223aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			struct ifstat_ent *h1;
224aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (!to_hist)
225aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				continue;
226aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			for (h1 = h; h1; h1 = h1->next) {
227aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				if (h1->ifindex == n->ifindex) {
228aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger					vals = h1->val;
229aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger					rates = h1->rate;
230aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger					h = h1->next;
231aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger					break;
232aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				}
233aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
234aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
235aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "%d %s ", n->ifindex, n->name);
236aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		for (i=0; i<MAXS; i++)
237aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(fp, "%llu %u ", vals[i], (unsigned)rates[i]);
238aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "\n");
239aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
240aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
241aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
2429f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemminger/* use communication definitions of meg/kilo etc */
2439f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemmingerstatic const unsigned long long giga = 1000000000ull;
244bb6a21a4fcaf400ca4766eea6064f2df30393d1eosdl.net!shemmingerstatic const unsigned long long mega = 1000000;
245bb6a21a4fcaf400ca4766eea6064f2df30393d1eosdl.net!shemmingerstatic const unsigned long long kilo = 1000;
246aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
247aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid format_rate(FILE *fp, unsigned long long *vals, double *rates, int i)
248aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
249aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	char temp[64];
2509f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemminger	if (vals[i] > giga)
2519f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemminger		fprintf(fp, "%7lluM ", vals[i]/mega);
2529f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemminger	else if (vals[i] > mega)
2539f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemminger		fprintf(fp, "%7lluK ", vals[i]/kilo);
254aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	else
255aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "%8llu ", vals[i]);
256aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
2579f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemminger	if (rates[i] > mega) {
2589f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemminger		sprintf(temp, "%uM", (unsigned)(rates[i]/mega));
259aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "%-6s ", temp);
2609f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemminger	} else if (rates[i] > kilo) {
2619f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemminger		sprintf(temp, "%uK", (unsigned)(rates[i]/kilo));
262aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "%-6s ", temp);
263aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	} else
264aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "%-6u ", (unsigned)rates[i]);
265aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
266aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
267aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid format_pair(FILE *fp, unsigned long long *vals, int i, int k)
268aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
269aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	char temp[64];
2709f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemminger	if (vals[i] > giga)
2719f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemminger		fprintf(fp, "%7lluM ", vals[i]/mega);
2729f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemminger	else if (vals[i] > mega)
2739f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemminger		fprintf(fp, "%7lluK ", vals[i]/kilo);
274aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	else
275aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "%8llu ", vals[i]);
276aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
2779f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemminger	if (vals[k] > giga) {
2789f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemminger		sprintf(temp, "%uM", (unsigned)(vals[k]/mega));
279aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "%-6s ", temp);
2809f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemminger	} else if (vals[k] > mega) {
2819f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemminger		sprintf(temp, "%uK", (unsigned)(vals[k]/kilo));
282aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "%-6s ", temp);
283aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	} else
284aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "%-6u ", (unsigned)vals[k]);
285aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
286aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
287aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid print_head(FILE *fp)
288aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
289aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	fprintf(fp, "#%s\n", info_source);
290aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	fprintf(fp, "%-15s ", "Interface");
291aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
292aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	fprintf(fp, "%8s/%-6s ", "RX Pkts", "Rate");
293aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	fprintf(fp, "%8s/%-6s ", "TX Pkts", "Rate");
294aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	fprintf(fp, "%8s/%-6s ", "RX Data", "Rate");
295aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	fprintf(fp, "%8s/%-6s\n","TX Data", "Rate");
296aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
297aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (!show_errors) {
298aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "%-15s ", "");
299aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "%8s/%-6s ", "RX Errs", "Drop");
300aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "%8s/%-6s ", "TX Errs", "Drop");
301aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "%8s/%-6s ", "RX Over", "Rate");
302aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "%8s/%-6s\n","TX Coll", "Rate");
303aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	} else {
304aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "%-15s ", "");
305aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "%8s/%-6s ", "RX Errs", "Rate");
306aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "%8s/%-6s ", "RX Drop", "Rate");
307aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "%8s/%-6s ", "RX Over", "Rate");
308aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "%8s/%-6s\n","RX Leng", "Rate");
309aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
310aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "%-15s ", "");
311aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "%8s/%-6s ", "RX Crc", "Rate");
312aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "%8s/%-6s ", "RX Frm", "Rate");
313aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "%8s/%-6s ", "RX Fifo", "Rate");
314aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "%8s/%-6s\n","RX Miss", "Rate");
315aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
316aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "%-15s ", "");
317aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "%8s/%-6s ", "TX Errs", "Rate");
318aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "%8s/%-6s ", "TX Drop", "Rate");
319aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "%8s/%-6s ", "TX Coll", "Rate");
320aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "%8s/%-6s\n","TX Carr", "Rate");
321aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
322aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "%-15s ", "");
323aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "%8s/%-6s ", "TX Abrt", "Rate");
324aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "%8s/%-6s ", "TX Fifo", "Rate");
325aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "%8s/%-6s ", "TX Hear", "Rate");
326aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "%8s/%-6s\n","TX Wind", "Rate");
327aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
328aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
329aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
330aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid print_one_if(FILE *fp, struct ifstat_ent *n, unsigned long long *vals)
331aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
332aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	int i;
333aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	fprintf(fp, "%-15s ", n->name);
334aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	for (i=0; i<4; i++)
335aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		format_rate(fp, vals, n->rate, i);
336aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	fprintf(fp, "\n");
337aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
338aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (!show_errors) {
339aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "%-15s ", "");
340aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		format_pair(fp, vals, 4, 6);
341aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		format_pair(fp, vals, 5, 7);
342aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		format_rate(fp, vals, n->rate, 11);
343aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		format_rate(fp, vals, n->rate, 9);
344aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "\n");
345aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	} else {
346aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "%-15s ", "");
347aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		format_rate(fp, vals, n->rate, 4);
348aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		format_rate(fp, vals, n->rate, 6);
349aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		format_rate(fp, vals, n->rate, 11);
350aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		format_rate(fp, vals, n->rate, 10);
351aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "\n");
352aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
353aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "%-15s ", "");
354aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		format_rate(fp, vals, n->rate, 12);
355aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		format_rate(fp, vals, n->rate, 13);
356aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		format_rate(fp, vals, n->rate, 14);
357aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		format_rate(fp, vals, n->rate, 15);
358aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "\n");
359aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
360aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "%-15s ", "");
361aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		format_rate(fp, vals, n->rate, 5);
362aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		format_rate(fp, vals, n->rate, 7);
363aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		format_rate(fp, vals, n->rate, 9);
364aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		format_rate(fp, vals, n->rate, 17);
365aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "\n");
366aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
367aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "%-15s ", "");
368aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		format_rate(fp, vals, n->rate, 16);
369aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		format_rate(fp, vals, n->rate, 18);
370aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		format_rate(fp, vals, n->rate, 19);
371aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		format_rate(fp, vals, n->rate, 20);
372aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(fp, "\n");
373aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
374aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
375aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
376aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
377aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid dump_kern_db(FILE *fp)
378aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
379dc484542a9d8d91db006af8a73d9ecddfef8f883Stephen Hemminger	struct ifstat_ent *n;
380aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
381aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	print_head(fp);
382aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
383aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	for (n=kern_db; n; n=n->next) {
384aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (!match(n->name))
385aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			continue;
386aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		print_one_if(fp, n, n->val);
387aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
388aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
389aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
390aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
391aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid dump_incr_db(FILE *fp)
392aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
393aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct ifstat_ent *n, *h;
394aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	h = hist_db;
395aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
396aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	print_head(fp);
397aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
398aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	for (n=kern_db; n; n=n->next) {
399aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		int i;
400aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		unsigned long long vals[MAXS];
401aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		struct ifstat_ent *h1;
402aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
403aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		memcpy(vals, n->val, sizeof(vals));
404aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
405aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		for (h1 = h; h1; h1 = h1->next) {
406aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (h1->ifindex == n->ifindex) {
407aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				for (i = 0; i < MAXS; i++)
408aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger					vals[i] -= h1->val[i];
409aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				h = h1->next;
410aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				break;
411aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
412aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
413aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (!match(n->name))
414aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			continue;
415aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		print_one_if(fp, n, vals);
416aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
417aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
418aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
419aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
420aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic int children;
421aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
422aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid sigchild(int signo)
423aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
424aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
425aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
426aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid update_db(int interval)
427aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
428aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct ifstat_ent *n, *h;
429aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
430aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	n = kern_db;
431aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	kern_db = NULL;
432aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
433aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	load_info();
434aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
435aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	h = kern_db;
436aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	kern_db = n;
437aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
438aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	for (n = kern_db; n; n = n->next) {
439aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		struct ifstat_ent *h1;
440aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		for (h1 = h; h1; h1 = h1->next) {
441aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (h1->ifindex == n->ifindex) {
442aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				int i;
443aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				for (i = 0; i < MAXS; i++) {
444aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger					if ((long)(h1->ival[i] - n->ival[i]) < 0) {
445ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger						memset(n->ival, 0, sizeof(n->ival));
446aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger						break;
447aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger					}
448aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				}
449ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger				for (i = 0; i < MAXS; i++) {
450aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger					double sample;
451aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger					unsigned long incr = h1->ival[i] - n->ival[i];
452aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger					n->val[i] += incr;
453aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger					n->ival[i] = h1->ival[i];
454aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger					sample = (double)(incr*1000)/interval;
455aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger					if (interval >= scan_interval) {
456aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger						n->rate[i] += W*(sample-n->rate[i]);
457aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger					} else if (interval >= 1000) {
458aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger						if (interval >= time_constant) {
459aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger							n->rate[i] = sample;
460aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger						} else {
461aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger							double w = W*(double)interval/scan_interval;
462aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger							n->rate[i] += w*(sample-n->rate[i]);
463aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger						}
464aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger					}
465aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				}
466aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
467aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				while (h != h1) {
468aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger					struct ifstat_ent *tmp = h;
469aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger					h = h->next;
470aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger					free(tmp->name);
471aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger					free(tmp);
472aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				};
473aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				h = h1->next;
474aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				free(h1->name);
475aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				free(h1);
476aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				break;
477aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
478aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
479aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
480aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
481aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
482aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#define T_DIFF(a,b) (((a).tv_sec-(b).tv_sec)*1000 + ((a).tv_usec-(b).tv_usec)/1000)
483aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
484aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
485aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid server_loop(int fd)
486aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
487737f15f6da0ed7512220f6fa5244a39777de4e0dshemminger	struct timeval snaptime = { 0 };
488aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct pollfd p;
489aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	p.fd = fd;
490aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	p.events = p.revents = POLLIN;
491aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
492aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	sprintf(info_source, "%d.%lu sampling_interval=%d time_const=%d",
493aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		getpid(), (unsigned long)random(), scan_interval/1000, time_constant/1000);
494aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
495aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	load_info();
496aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
497aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	for (;;) {
498aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		int status;
499aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		int tdiff;
500aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		struct timeval now;
501737f15f6da0ed7512220f6fa5244a39777de4e0dshemminger
502aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		gettimeofday(&now, NULL);
503aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		tdiff = T_DIFF(now, snaptime);
504aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (tdiff >= scan_interval) {
505aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			update_db(tdiff);
506aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			snaptime = now;
507aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			tdiff = 0;
508aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
509737f15f6da0ed7512220f6fa5244a39777de4e0dshemminger
510aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (poll(&p, 1, tdiff + scan_interval) > 0
511aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		    && (p.revents&POLLIN)) {
512aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			int clnt = accept(fd, NULL, NULL);
513aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (clnt >= 0) {
514aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				pid_t pid;
515aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				if (children >= 5) {
516aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger					close(clnt);
517aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				} else if ((pid = fork()) != 0) {
518aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger					if (pid>0)
519aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger						children++;
520aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger					close(clnt);
521aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				} else {
522aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger					FILE *fp = fdopen(clnt, "w");
523aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger					if (fp) {
524aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger						if (tdiff > 0)
525aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger							update_db(tdiff);
526aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger						dump_raw_db(fp, 0);
527aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger					}
528aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger					exit(0);
529aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				}
530aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
531aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
532aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		while (children && waitpid(-1, &status, WNOHANG) > 0)
533aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			children--;
534aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
535aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
536aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
537aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint verify_forging(int fd)
538aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
539aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct ucred cred;
540737f15f6da0ed7512220f6fa5244a39777de4e0dshemminger	socklen_t olen = sizeof(cred);
541737f15f6da0ed7512220f6fa5244a39777de4e0dshemminger
542aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (getsockopt(fd, SOL_SOCKET, SO_PEERCRED, (void*)&cred, &olen) ||
543aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	    olen < sizeof(cred))
544aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return -1;
545aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (cred.uid == getuid() || cred.uid == 0)
546aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return 0;
547aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	return -1;
548aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
549aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
550d7e0809ee622e7178e1524c5810eca2be8f08475osdl.org!shemmingerstatic void usage(void) __attribute__((noreturn));
551d7e0809ee622e7178e1524c5810eca2be8f08475osdl.org!shemminger
552aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic void usage(void)
553aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
554d7e0809ee622e7178e1524c5810eca2be8f08475osdl.org!shemminger	fprintf(stderr,
555d7e0809ee622e7178e1524c5810eca2be8f08475osdl.org!shemminger"Usage: ifstat [OPTION] [ PATTERN [ PATTERN ] ]\n"
556d7e0809ee622e7178e1524c5810eca2be8f08475osdl.org!shemminger"   -h, --help		this message\n"
557d7e0809ee622e7178e1524c5810eca2be8f08475osdl.org!shemminger"   -a, --ignore	ignore history\n"
558d7e0809ee622e7178e1524c5810eca2be8f08475osdl.org!shemminger"   -d, --scan=SECS	sample every statistics every SECS\n"
559d7e0809ee622e7178e1524c5810eca2be8f08475osdl.org!shemminger"   -e, --errors	show errors\n"
560d7e0809ee622e7178e1524c5810eca2be8f08475osdl.org!shemminger"   -n, --nooutput	do history only\n"
561d7e0809ee622e7178e1524c5810eca2be8f08475osdl.org!shemminger"   -r, --reset		reset history\n"
562d7e0809ee622e7178e1524c5810eca2be8f08475osdl.org!shemminger"   -s, --noupdate	don;t update history\n"
563d7e0809ee622e7178e1524c5810eca2be8f08475osdl.org!shemminger"   -t, --interval=SECS	report average over the last SECS\n"
564d7e0809ee622e7178e1524c5810eca2be8f08475osdl.org!shemminger"   -V, --version	output version information\n"
565d7e0809ee622e7178e1524c5810eca2be8f08475osdl.org!shemminger"   -z, --zeros		show entries with zero activity\n");
566d7e0809ee622e7178e1524c5810eca2be8f08475osdl.org!shemminger
567d7e0809ee622e7178e1524c5810eca2be8f08475osdl.org!shemminger	exit(-1);
568aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
569aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
5709f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemmingerstatic const struct option longopts[] = {
5719f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemminger	{ "help", 0, 0, 'h' },
5729f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemminger	{ "ignore",  0,  0, 'a' },
5739f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemminger	{ "scan", 1, 0, 'd'},
5749f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemminger	{ "errors", 0, 0, 'e' },
5759f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemminger	{ "nooutput", 0, 0, 'n' },
5769f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemminger	{ "reset", 0, 0, 'r' },
5779f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemminger	{ "noupdate", 0, 0, 's' },
5789f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemminger	{ "interval", 1, 0, 't' },
5799f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemminger	{ "version", 0, 0, 'V' },
5809f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemminger	{ "zeros", 0, 0, 'z' },
5819f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemminger	{ 0 }
5829f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemminger};
583aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
584aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint main(int argc, char *argv[])
585aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
586aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	char hist_name[128];
587aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct sockaddr_un sun;
588aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	FILE *hist_fp = NULL;
589aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	int ch;
590aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	int fd;
591aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
5929f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemminger	while ((ch = getopt_long(argc, argv, "hvVzrnasd:t:eK",
5939f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemminger			longopts, NULL)) != EOF) {
594aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		switch(ch) {
595aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		case 'z':
596aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			dump_zeros = 1;
597aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			break;
598aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		case 'r':
599aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			reset_history = 1;
600aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			break;
601aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		case 'a':
602aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			ignore_history = 1;
603aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			break;
604aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		case 's':
605aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			no_update = 1;
606aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			break;
607aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		case 'n':
608aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			no_output = 1;
609aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			break;
610aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		case 'e':
611aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			show_errors = 1;
612aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			break;
613aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		case 'd':
6149f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemminger			scan_interval = atoi(optarg) * 1000;
6159f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemminger			if (scan_interval <= 0) {
6169f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemminger				fprintf(stderr, "ifstat: invalid scan interval\n");
6179f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemminger				exit(-1);
6189f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemminger			}
619aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			break;
620aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		case 't':
6219f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemminger			time_constant = atoi(optarg);
6229f3ea25096ed67720fbe13644ce0d010c3f38df0osdl.org!shemminger			if (time_constant <= 0) {
623aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(stderr, "ifstat: invalid time constant divisor\n");
624aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				exit(-1);
625aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
626aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			break;
627aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		case 'v':
628aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		case 'V':
629aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			printf("ifstat utility, iproute2-ss%s\n", SNAPSHOT);
630aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			exit(0);
631aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		case 'h':
632aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		case '?':
633aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		default:
634aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			usage();
635aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
636aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
637aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
638aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	argc -= optind;
639aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	argv += optind;
640aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
641aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	sun.sun_family = AF_UNIX;
642aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	sun.sun_path[0] = 0;
643aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	sprintf(sun.sun_path+1, "ifstat%d", getuid());
644aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
645aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (scan_interval > 0) {
646aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (time_constant == 0)
647aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			time_constant = 60;
648aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		time_constant *= 1000;
649aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		W = 1 - 1/exp(log(10)*(double)scan_interval/time_constant);
650aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
651aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			perror("ifstat: socket");
652aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			exit(-1);
653aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
654aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (bind(fd, (struct sockaddr*)&sun, 2+1+strlen(sun.sun_path+1)) < 0) {
655aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			perror("ifstat: bind");
656aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			exit(-1);
657aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
658aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (listen(fd, 5) < 0) {
659aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			perror("ifstat: listen");
660aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			exit(-1);
661aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
662a7a9ddbb675b7fbd184c3ab40817265b0b207a23Mike Frysinger		if (daemon(0, 0)) {
663a7a9ddbb675b7fbd184c3ab40817265b0b207a23Mike Frysinger			perror("ifstat: daemon");
664a7a9ddbb675b7fbd184c3ab40817265b0b207a23Mike Frysinger			exit(-1);
665a7a9ddbb675b7fbd184c3ab40817265b0b207a23Mike Frysinger		}
666aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		signal(SIGPIPE, SIG_IGN);
667aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		signal(SIGCHLD, sigchild);
668aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		server_loop(fd);
669aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		exit(0);
670aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
671aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
672aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	patterns = argv;
673aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	npatterns = argc;
674aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
675aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (getenv("IFSTAT_HISTORY"))
676daf7bd5c73aa3b7c91d83abf500c8749bec6e6d5Stephen Hemminger		snprintf(hist_name, sizeof(hist_name),
677daf7bd5c73aa3b7c91d83abf500c8749bec6e6d5Stephen Hemminger			 "%s", getenv("IFSTAT_HISTORY"));
678aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	else
679daf7bd5c73aa3b7c91d83abf500c8749bec6e6d5Stephen Hemminger		snprintf(hist_name, sizeof(hist_name),
680daf7bd5c73aa3b7c91d83abf500c8749bec6e6d5Stephen Hemminger			 "%s/.ifstat.u%d", P_tmpdir, getuid());
681aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
682aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (reset_history)
683aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		unlink(hist_name);
684aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
685aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (!ignore_history || !no_update) {
686aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		struct stat stb;
687aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
688aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fd = open(hist_name, O_RDWR|O_CREAT|O_NOFOLLOW, 0600);
689aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (fd < 0) {
690aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			perror("ifstat: open history file");
691aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			exit(-1);
692aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
693aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if ((hist_fp = fdopen(fd, "r+")) == NULL) {
694aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			perror("ifstat: fdopen history file");
695aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			exit(-1);
696aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
697aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (flock(fileno(hist_fp), LOCK_EX)) {
698aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			perror("ifstat: flock history file");
699aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			exit(-1);
700aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
701aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (fstat(fileno(hist_fp), &stb) != 0) {
702aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			perror("ifstat: fstat history file");
703aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			exit(-1);
704aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
705aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (stb.st_nlink != 1 || stb.st_uid != getuid()) {
706aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(stderr, "ifstat: something is so wrong with history file, that I prefer not to proceed.\n");
707aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			exit(-1);
708aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
709aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (!ignore_history) {
710aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			FILE *tfp;
7119a230771c0a0b27e2f26bbbc29a93ad1ad591ce9Dan McGee			long uptime = -1;
712aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if ((tfp = fopen("/proc/uptime", "r")) != NULL) {
713aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				if (fscanf(tfp, "%ld", &uptime) != 1)
714aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger					uptime = -1;
715aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fclose(tfp);
716aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
717aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (uptime >= 0 && time(NULL) >= stb.st_mtime+uptime) {
718aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(stderr, "ifstat: history is aged out, resetting\n");
719aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				ftruncate(fileno(hist_fp), 0);
720aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
721aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
722aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
723aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		load_raw_table(hist_fp);
724aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
725aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		hist_db = kern_db;
726aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		kern_db = NULL;
727aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
728aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
729aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) >= 0 &&
730aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	    (connect(fd, (struct sockaddr*)&sun, 2+1+strlen(sun.sun_path+1)) == 0
731aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	     || (strcpy(sun.sun_path+1, "ifstat0"),
732aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		 connect(fd, (struct sockaddr*)&sun, 2+1+strlen(sun.sun_path+1)) == 0))
733aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	    && verify_forging(fd) == 0) {
734aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		FILE *sfp = fdopen(fd, "r");
735aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		load_raw_table(sfp);
736aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (hist_db && source_mismatch) {
737aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(stderr, "ifstat: history is stale, ignoring it.\n");
738aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			hist_db = NULL;
739aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
740aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fclose(sfp);
741aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	} else {
742aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (fd >= 0)
743aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			close(fd);
744aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (hist_db && info_source[0] && strcmp(info_source, "kernel")) {
745aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(stderr, "ifstat: history is stale, ignoring it.\n");
746aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			hist_db = NULL;
747aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			info_source[0] = 0;
748aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
749aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		load_info();
750aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (info_source[0] == 0)
751aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			strcpy(info_source, "kernel");
752aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
753aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
754aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (!no_output) {
755aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (ignore_history || hist_db == NULL)
756aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			dump_kern_db(stdout);
757aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		else
758aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			dump_incr_db(stdout);
759aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
760aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (!no_update) {
761aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		ftruncate(fileno(hist_fp), 0);
762aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		rewind(hist_fp);
763aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		dump_raw_db(hist_fp, 1);
764aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fflush(hist_fp);
765aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
766aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	exit(0);
767aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
768