⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 systemstats_linux.c

📁 snmp的源代码,已经在我的ubuntu下编译通过
💻 C
字号:
/* *  Interface MIB architecture support * * $Id: systemstats_linux.c,v 1.3.2.1 2004/12/10 17:56:40 rstory Exp $ */#include <net-snmp/net-snmp-config.h>#include <net-snmp/net-snmp-includes.h>#include <net-snmp/agent/net-snmp-agent-includes.h>#include <net-snmp/data_access/ipstats.h>#include <net-snmp/data_access/systemstats.h>static int _systemstats_v4(netsnmp_container* container, u_int load_flags);static int _systemstats_v6(netsnmp_container* container, u_int load_flags);voidnetsnmp_access_systemstats_arch_init(void){    /*     * nothing to do     */}/*  /proc/net/snmp  Ip: Forwarding DefaultTTL InReceives InHdrErrors InAddrErrors ForwDatagrams InUnknownProtos InDiscards InDelivers OutRequests OutDiscards OutNoRoutes ReasmTimeout ReasmReqds ReasmOKs ReasmFails FragOKs FragFails FragCreates  Ip: 2 64 7083534 0 0 0 0 0 6860233 6548963 0 0 1 286623 63322 1 259920 0 0    Icmp: InMsgs InErrors InDestUnreachs InTimeExcds InParmProbs InSrcQuenchs InRedirects InEchos InEchoReps InTimestamps InTimestampReps InAddrMasks InAddrMaskReps OutMsgs OutErrors OutDestUnreachs OutTimeExcds OutParmProbs OutSrcQuenchs OutRedirects OutEchos OutEchoReps OutTimestamps OutTimestampReps OutAddrMasks OutAddrMaskReps  Icmp: 335 36 254 72 0 0 0 0 9 0 0 0 0 257 0 257 0 0 0 0 0 0 0 0 0 0    Tcp: RtoAlgorithm RtoMin RtoMax MaxConn ActiveOpens PassiveOpens AttemptFails EstabResets CurrEstab InSegs OutSegs RetransSegs InErrs OutRsts  Tcp: 1 200 120000 -1 5985 55 27 434 10 5365077 5098096 10902 2 4413    Udp: InDatagrams NoPorts InErrors OutDatagrams  Udp: 1491094 122 0 1466178*//* * * @retval  0 success * @retval -1 no container specified * @retval -2 could not open file * @retval -3 could not create entry (probably malloc) * @retval -4 file format error */intnetsnmp_access_systemstats_container_arch_load(netsnmp_container* container,                                             u_int load_flags){    int rc1,rc2;    if (NULL == container) {        snmp_log(LOG_ERR, "no container specified/found for access_systemstats_\n");        return -1;    }    /*     * load v4 and v6 stats. Even if one fails, try the other.     * If they have the same rc, return it. if the differ, return     * the smaller one. No log messages, since each individual function     * would have logged its own message.     */    rc1 = _systemstats_v4(container, load_flags);    rc2 = _systemstats_v6(container, load_flags);    if ((rc1 == rc2) || (rc1 < rc2))        return rc1;            return rc2;}static int_systemstats_v4(netsnmp_container* container, u_int load_flags){    FILE           *devin;    char            line[1024];    netsnmp_systemstats_entry *entry = NULL;    int             scan_count;    char           *stats, *start = line;    int             len;    uintmax_t       scan_vals[19];    DEBUGMSGTL(("access:systemstats:container:arch", "load v4 (flags %p)\n",                load_flags));    netsnmp_assert(container != NULL); /* load function shoulda checked this */    if (!(devin = fopen("/proc/net/snmp", "r"))) {        DEBUGMSGTL(("access:systemstats",                    "Failed to load Systemstats Table (linux1)\n"));        snmp_log(LOG_ERR, "cannot open /proc/net/snmp ...\n");        return -2;    }    /*     * skip header, but make sure it's the length we expect...     */    fgets(line, sizeof(line), devin);    len = strlen(line);    if (224 != len) {        snmp_log(LOG_ERR, "unexpected header length in /proc/net/snmp."                 " %d != 224\n", len);        return -4;    }    /*     * This file provides the statistics for each systemstats.     * Read in each line in turn, isolate the systemstats name     *   and retrieve (or create) the corresponding data structure.     */    start = fgets(line, sizeof(line), devin);    fclose(devin);    if (start) {        len = strlen(line);        if (line[len - 1] == '\n')            line[len - 1] = '\0';        while (*start && *start == ' ')            start++;        if ((!*start) || ((stats = strrchr(start, ':')) == NULL)) {            snmp_log(LOG_ERR,                     "systemstats data format error 1, line ==|%s|\n", line);            return -4;        }        DEBUGMSGTL(("access:systemstats", "processing '%s'\n", start));        *stats++ = 0; /* null terminate name */        while (*stats == ' ') /* skip spaces before stats */            stats++;        entry = netsnmp_access_systemstats_entry_create(1);        if(NULL == entry) {            netsnmp_access_systemstats_container_free(container,                                                      NETSNMP_ACCESS_SYSTEMSTATS_FREE_NOFLAGS);            return -3;        }        /*         * OK - we've now got (or created) the data structure for         *      this systemstats, including any "static" information.         * Now parse the rest of the line (i.e. starting from 'stats')         *      to extract the relevant statistics, and populate         *      data structure accordingly.         */        memset(scan_vals, 0x0, sizeof(scan_vals));        scan_count = sscanf(stats,                            "%llu %llu %llu %llu %llu %llu %llu %llu %llu %llu"                            "%llu %llu %llu %llu %llu %llu %llu %llu %llu",                            &scan_vals[0],&scan_vals[1],&scan_vals[2],                            &scan_vals[3],&scan_vals[4],&scan_vals[5],                            &scan_vals[6],&scan_vals[7],&scan_vals[8],                            &scan_vals[9],&scan_vals[10],&scan_vals[11],                            &scan_vals[12],&scan_vals[13],&scan_vals[14],                            &scan_vals[15],&scan_vals[16],&scan_vals[17],                            &scan_vals[18]);        DEBUGMSGTL(("access:systemstats", "  read %d values\n", scan_count));        if(scan_count != 19) {            snmp_log(LOG_ERR,                     "error scanning systemstats data (expected %d, got %d)\n",                     19, scan_count);            netsnmp_access_systemstats_entry_free(entry);            return -4;        }        /* entry->stats. = scan_vals[0]; /* Forwarding */        /* entry->stats. = scan_vals[1]; /* DefaultTTL */        entry->stats.HCInReceives.low = scan_vals[2] & 0xffffffff;        entry->stats.HCInReceives.high = scan_vals[2] >> 32;        entry->stats.InHdrErrors = scan_vals[3];        entry->stats.InAddrErrors = scan_vals[4];        entry->stats.HCInForwDatagrams.low = scan_vals[5] & 0xffffffff;        entry->stats.HCInForwDatagrams.high = scan_vals[5] >> 32;        entry->stats.InUnknownProtos = scan_vals[6];        entry->stats.InDiscards = scan_vals[7];        entry->stats.HCInDelivers.low = scan_vals[8] & 0xffffffff;        entry->stats.HCInDelivers.high = scan_vals[8] >> 32;        entry->stats.HCOutRequests.low = scan_vals[9] & 0xffffffff;        entry->stats.HCOutRequests.high = scan_vals[9] >> 32;        entry->stats.OutDiscards = scan_vals[10];        entry->stats.OutNoRoutes = scan_vals[11];        /* entry->stats. = scan_vals[12]; /* ReasmTimeout */        entry->stats.ReasmReqds = scan_vals[13];        entry->stats.ReasmOKs = scan_vals[14];        entry->stats.ReasmFails = scan_vals[15];        entry->stats.OutFragOKs = scan_vals[16];        entry->stats.OutFragFails = scan_vals[17];        entry->stats.OutFragCreates = scan_vals[18];        /*         * add to container         */        CONTAINER_INSERT(container, entry);    }    return 0;}    static int_systemstats_v6(netsnmp_container* container, u_int load_flags){    FILE           *devin;    char            line[1024];    netsnmp_systemstats_entry *entry = NULL;    int             scan_count = 0;    char           *stats, *start = line;    int             len, rc;    uintmax_t       scan_val;    const char     *filename = "/proc/net/snmp6";    DEBUGMSGTL(("access:systemstats:container:arch", "load v6 (flags %p)\n",                load_flags));    netsnmp_assert(container != NULL); /* load function shoulda checked this */    entry = netsnmp_access_systemstats_entry_create(2);    if(NULL == entry)        return -3;        if (!(devin = fopen(filename, "r"))) {        DEBUGMSGTL(("access:systemstats",                    "Failed to load Systemstats Table (linux1)\n"));        snmp_log(LOG_ERR, "cannot open %s ...\n", filename);        free(entry);        return -2;    }    /*     * This file provides the statistics for each systemstats.     * Read in each line in turn, isolate the systemstats name     *   and retrieve (or create) the corresponding data structure.     */    while (1) {        start = fgets(line, sizeof(line), devin);        if (NULL == start)            break;        len = strlen(line);        if (line[len - 1] == '\n')            line[len - 1] = '\0';        if (('I' != line[0]) || ('6' != line[2]))            continue;        stats = strrchr(line, ' ');        if (NULL == stats) {            snmp_log(LOG_ERR,                     "systemstats data format error 1, line ==|%s|\n", line);            continue;        }        DEBUGMSGTL(("access:systemstats", "processing '%s'\n", line));        /*         * OK - we've now got (or created) the data structure for         *      this systemstats, including any "static" information.         * Now parse the rest of the line (i.e. starting from 'stats')         *      to extract the relevant statistics, and populate         *      data structure accordingly.         */        scan_val = atoll(stats);        if (0 == scan_val)            continue;        rc = 0;        if ('I' == line[3]) { /* In */            if ('A' == line[5]) {                entry->stats.InAddrErrors = scan_val;            } else if ('D' == line[5]) {                if ('e' == line[6]) {                    entry->stats.HCInDelivers.low = scan_val  & 0xffffffff;                    entry->stats.HCInDelivers.high = scan_val >> 32;                } else if ('i' == line[6])                    entry->stats.InDiscards = scan_val;                else                    rc = 1;            } else if ('H' == line[5]) {                entry->stats.InHdrErrors = scan_val;            } else if ('M' == line[5]) {                entry->stats.HCInMcastPkts.low = scan_val  & 0xffffffff;                entry->stats.HCInMcastPkts.high = scan_val >> 32;            } else if ('N' == line[5]) {                entry->stats.InNoRoutes = scan_val;            } else if ('R' == line[5]) {                entry->stats.HCInReceives.low = scan_val & 0xffffffff;                entry->stats.HCInReceives.high = scan_val >> 32;            } else if ('T' == line[5]) {                if ('r' == line[6]) {                    entry->stats.InTruncatedPkts = scan_val  & 0xffffffff;                } else if ('o' == line[6])                    ; /* TooBig isn't in the MIB, so ignore it */                else                    rc = 1;            } else if ('U' == line[5]) {                entry->stats.InUnknownProtos = scan_val;            } else                rc = 1;        } else if ('O' == line[3]) { /* Out */            if ('D' == line[6]) {                entry->stats.OutDiscards = scan_val;            } else if ('F' == line[6]) {                entry->stats.HCOutForwDatagrams.low = scan_val & 0xffffffff;                entry->stats.HCOutForwDatagrams.high = scan_val >> 32;            } else if ('M' == line[6]) {                entry->stats.HCOutMcastPkts.low = scan_val & 0xffffffff;                entry->stats.HCOutMcastPkts.high = scan_val >> 32;            } else if ('N' == line[6]) {                entry->stats.OutNoRoutes = scan_val;            } else if ('R' == line[6]) {                entry->stats.HCOutRequests.low = scan_val & 0xffffffff;                entry->stats.HCOutRequests.high = scan_val >> 32;            } else                rc = 1;        } else if ('R' == line[3]) { /* Reasm */            if ('F' == line[8]) {                entry->stats.ReasmFails = scan_val;            } else if ('O' == line[8]) {                entry->stats.ReasmOKs = scan_val;            } else if ('R' == line[8]) {                entry->stats.ReasmReqds = scan_val;            } else if ('T' == line[8]) {                ; /* no mib entry for reasm timeout */            } else                rc = 1;        } else if ('F' == line[3]) { /* Frag */            if ('C' == line[7])                entry->stats.OutFragCreates = scan_val;            else if ('O' == line[7])                entry->stats.OutFragOKs = scan_val;            else if ('F' == line[7])                entry->stats.OutFragFails = scan_val;            else                rc = 1;        } else            rc = 1;                if (rc)            DEBUGMSGTL(("access:systemstats", "unknown stat %s\n", line));        else            ++scan_count;    }    fclose(devin);    /*     * add to container     */    CONTAINER_INSERT(container, entry);    return rc;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -