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>