Annotation of embedaddon/miniupnpd/solaris/getifstats.c, revision 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>