Annotation of embedaddon/miniupnpd/solaris/getifstats.c, revision 1.1.1.1
1.1 misho 1: /* MiniUPnP project
2: * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
3: * author: Ryan Wagoner and Thomas Bernard
4: * (c) 2007 Darren Reed
5: * This software is subject to the conditions detailed
6: * in the LICENCE file provided within the distribution */
7:
8: #include <syslog.h>
9: #include <string.h>
10: #include <stdlib.h>
11: #include <ctype.h>
12: #include <kstat.h>
13: #include <sys/sysmacros.h>
14:
15: #include "../getifstats.h"
16:
17: int
18: getifstats(const char * ifname, struct ifdata * data)
19: {
20: char buffer[64], *s;
21: kstat_named_t *kn;
22: kstat_ctl_t *kc;
23: int instance;
24: kstat_t *ksp;
25: uint32_t cnt32;
26: void *ptr;
27:
28: if (data == NULL)
29: goto error;
30:
31: if (ifname == NULL || *ifname == '\0')
32: goto error;
33:
34: s = (char *)ifname + strlen(ifname);
35: s--;
36: while ((s > ifname) && isdigit(*s))
37: s--;
38:
39: s++;
40: instance = atoi(s);
41: strlcpy(buffer, ifname, MIN(s - ifname + 1, 64));
42:
43: kc = kstat_open();
44: if (kc != NULL) {
45: ksp = kstat_lookup(kc, buffer, instance, (char *)ifname);
46: if (ksp && (kstat_read(kc, ksp, NULL) != -1)) {
47: /* found the right interface */
48: if (sizeof(long) == 8) {
49: uint64_t cnt64;
50: kn = kstat_data_lookup(ksp, "rbytes64");
51: if (kn != NULL) {
52: data->ibytes = kn->value.i64;
53: }
54: kn = kstat_data_lookup(ksp, "ipackets64");
55: if (kn != NULL) {
56: data->ipackets = kn->value.i64;
57: }
58: kn = kstat_data_lookup(ksp, "obytes64");
59: if (kn != NULL) {
60: data->obytes = kn->value.i64;
61: }
62: kn = kstat_data_lookup(ksp, "opackets64");
63: if (kn != NULL) {
64: data->opackets = kn->value.i64;
65: }
66: } else {
67: kn = kstat_data_lookup(ksp, "rbytes");
68: if (kn != NULL) {
69: data->ibytes = kn->value.i32;
70: }
71: kn = kstat_data_lookup(ksp, "ipackets");
72: if (kn != NULL) {
73: data->ipackets = kn->value.i32;
74: }
75: kn = kstat_data_lookup(ksp, "obytes");
76: if (kn != NULL) {
77: data->obytes = kn->value.i32;
78: }
79: kn = kstat_data_lookup(ksp, "opackets");
80: if (kn != NULL) {
81: data->ipackets = kn->value.i32;
82: }
83: }
84: kn = kstat_data_lookup(ksp, "ifspeed");
85: if (kn != NULL) {
86: data->baudrate = kn->value.i32;
87: }
88: kstat_close(kc);
89: return 0; /* ok */
90: }
91: syslog(LOG_ERR, "kstat_lookup/read() failed: %m");
92: kstat_close(kc);
93: return -1;
94: } else {
95: syslog(LOG_ERR, "kstat_open() failed: %m");
96: }
97: error:
98: return -1; /* not found or error */
99: }
100:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>