File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / miniupnpd / solaris / getifstats.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 23:16:02 2012 UTC (12 years, 4 months ago) by misho
Branches: miniupnpd, elwix, MAIN
CVS tags: v1_6elwix, v1_5, HEAD
miniupnpd

    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>