Annotation of embedaddon/miniupnpd/linux/getifstats.c, revision 1.1.1.1
1.1 misho 1: /* $Id: getifstats.c,v 1.7 2010/02/15 10:11:34 nanard Exp $ */
2: /* MiniUPnP project
3: * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
4: * (c) 2006,2007 Thomas Bernard
5: * This software is subject to the conditions detailed
6: * in the LICENCE file provided within the distribution */
7:
8: #include <stdio.h>
9: #include <stdlib.h>
10: #include <syslog.h>
11: #include <string.h>
12: #include <time.h>
13:
14: #include "../getifstats.h"
15: #include "../config.h"
16:
17: int
18: getifstats(const char * ifname, struct ifdata * data)
19: {
20: FILE *f;
21: char line[512];
22: char * p;
23: int i;
24: int r = -1;
25: #ifdef ENABLE_GETIFSTATS_CACHING
26: static time_t cache_timestamp = 0;
27: static struct ifdata cache_data;
28: time_t current_time;
29: #endif
30: if(!data)
31: return -1;
32: data->baudrate = 4200000;
33: data->opackets = 0;
34: data->ipackets = 0;
35: data->obytes = 0;
36: data->ibytes = 0;
37: if(!ifname || ifname[0]=='\0')
38: return -1;
39: #ifdef ENABLE_GETIFSTATS_CACHING
40: current_time = time(NULL);
41: if(current_time == ((time_t)-1)) {
42: syslog(LOG_ERR, "getifstats() : time() error : %m");
43: } else {
44: if(current_time < cache_timestamp + GETIFSTATS_CACHING_DURATION) {
45: memcpy(data, &cache_data, sizeof(struct ifdata));
46: return 0;
47: }
48: }
49: #endif
50: f = fopen("/proc/net/dev", "r");
51: if(!f) {
52: syslog(LOG_ERR, "getifstats() : cannot open /proc/net/dev : %m");
53: return -1;
54: }
55: /* discard the two header lines */
56: if(!fgets(line, sizeof(line), f) || !fgets(line, sizeof(line), f)) {
57: syslog(LOG_ERR, "getifstats() : error reading /proc/net/dev : %m");
58: }
59: while(fgets(line, sizeof(line), f)) {
60: p = line;
61: while(*p==' ') p++;
62: i = 0;
63: while(ifname[i] == *p) {
64: p++; i++;
65: }
66: /* TODO : how to handle aliases ? */
67: if(ifname[i] || *p != ':')
68: continue;
69: p++;
70: while(*p==' ') p++;
71: data->ibytes = strtoul(p, &p, 0);
72: while(*p==' ') p++;
73: data->ipackets = strtoul(p, &p, 0);
74: /* skip 6 columns */
75: for(i=6; i>0 && *p!='\0'; i--) {
76: while(*p==' ') p++;
77: while(*p!=' ' && *p) p++;
78: }
79: while(*p==' ') p++;
80: data->obytes = strtoul(p, &p, 0);
81: while(*p==' ') p++;
82: data->opackets = strtoul(p, &p, 0);
83: r = 0;
84: break;
85: }
86: fclose(f);
87: #ifdef ENABLE_GETIFSTATS_CACHING
88: if(r==0 && current_time!=((time_t)-1)) {
89: cache_timestamp = current_time;
90: memcpy(&cache_data, data, sizeof(struct ifdata));
91: }
92: #endif
93: return r;
94: }
95:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>