Annotation of embedaddon/miniupnpd/mac/getifstats.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * MiniUPnP project
                      3:  * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
                      4:  * (c) 2009 Jarder Weyrich
                      5:  * This software is subject to the conditions detailed
                      6:  * in the LICENCE file provided within the distribution
                      7:  */
                      8: 
                      9: #include <syslog.h>
                     10: #include <sys/sysctl.h>
                     11: #include <sys/types.h>
                     12: #include <netinet/in.h>
                     13: #include <net/if.h>
                     14: #include <net/if_types.h>
                     15: #include <net/route.h>
                     16: #include <nlist.h>
                     17: #include <stdio.h>
                     18: #include <stdlib.h>
                     19: #include <string.h>
                     20: 
                     21: #include "../getifstats.h"
                     22: #include "../config.h"
                     23: 
                     24: int getifstats(const char * ifname, struct ifdata * data) {
                     25:        int mib[] = { CTL_NET, PF_ROUTE, 0, AF_INET, NET_RT_IFLIST, if_nametoindex(ifname) };
                     26:        const size_t mib_len = sizeof(mib) / sizeof(mib[0]);
                     27:        size_t needed;
                     28:        char *buf, *end;
                     29:        struct if_msghdr *ifm;
                     30:        struct if_data ifdata;  
                     31: #ifdef ENABLE_GETIFSTATS_CACHING
                     32:        static time_t cache_timestamp = 0;
                     33:        static struct ifdata cache_data;
                     34:        time_t current_time;
                     35: #endif
                     36: 
                     37:        if (data == NULL || ifname == NULL || ifname[0] == '\0')
                     38:                return -1; // error
                     39: 
                     40:        data->baudrate = 4200000;
                     41:        data->opackets = 0;
                     42:        data->ipackets = 0;
                     43:        data->obytes = 0;
                     44:        data->ibytes = 0;
                     45: 
                     46: #ifdef ENABLE_GETIFSTATS_CACHING
                     47:        current_time = time(NULL);
                     48:        if (current_time == ((time_t)-1)) {
                     49:                syslog(LOG_ERR, "getifstats() : time() error : %m");
                     50:        } else {
                     51:                if (current_time < cache_timestamp + GETIFSTATS_CACHING_DURATION) {
                     52:                        memcpy(data, &cache_data, sizeof(struct ifdata));
                     53:                        return 0;
                     54:                }
                     55:        }
                     56: #endif
                     57: 
                     58:        if (sysctl(mib, mib_len, NULL, &needed, NULL, 0) == -1) {
                     59:                syslog(LOG_ERR, "sysctl(): %m");
                     60:                return -1;
                     61:        }
                     62:        buf = (char *) malloc(needed);
                     63:        if (buf == NULL)
                     64:                return -1; // error
                     65:        if (sysctl(mib, mib_len, buf, &needed, NULL, 0) == -1) {
                     66:                syslog(LOG_ERR, "sysctl(): %m");
                     67:                free(buf);
                     68:                return -1; // error
                     69:        } else {
                     70:                for (end = buf + needed; buf < end; buf += ifm->ifm_msglen) {
                     71:                        ifm = (struct if_msghdr *) buf;
                     72:                        if (ifm->ifm_type == RTM_IFINFO && ifm->ifm_data.ifi_type == IFT_ETHER) {
                     73:                                ifdata = ifm->ifm_data;
                     74:                                data->opackets = ifdata.ifi_opackets;
                     75:                                data->ipackets = ifdata.ifi_ipackets;
                     76:                                data->obytes = ifdata.ifi_obytes;
                     77:                                data->ibytes = ifdata.ifi_ibytes;
                     78:                                data->baudrate = ifdata.ifi_baudrate;
                     79:                                free(buf);
                     80: #ifdef ENABLE_GETIFSTATS_CACHING
                     81:                                if (current_time!=((time_t)-1)) {
                     82:                                        cache_timestamp = current_time;
                     83:                                        memcpy(&cache_data, data, sizeof(struct ifdata));
                     84:                                }
                     85: #endif
                     86:                                return 0; // found, ok
                     87:                        }
                     88:                }               
                     89:        }
                     90:        free(buf);
                     91:        return -1; // not found or error
                     92: }
                     93: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>