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

📄 header_complex.c

📁 snmp的源代码,已经在我的ubuntu下编译通过
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * header complex:  More complex storage and data sorting for mib modules  */#include <net-snmp/net-snmp-config.h>#include <sys/types.h>#if HAVE_WINSOCK_H#include <winsock.h>#endif#if HAVE_STDLIB_H#include <stdlib.h>#endif#if HAVE_STRING_H#include <string.h>#else#include <strings.h>#endif#include <net-snmp/net-snmp-includes.h>#include <net-snmp/agent/net-snmp-agent-includes.h>#include "header_complex.h"intheader_complex_generate_varoid(netsnmp_variable_list * var){    int             i;    if (var->name == NULL) {        /*         * assume cached value is correct          */        switch (var->type) {        case ASN_INTEGER:        case ASN_COUNTER:        case ASN_GAUGE:        case ASN_TIMETICKS:            var->name_length = 1;            var->name = (oid *) malloc(sizeof(oid));            if (var->name == NULL)                return SNMPERR_GENERR;            var->name[0] = *(var->val.integer);            break;        case ASN_PRIV_IMPLIED_OBJECT_ID:            var->name_length = var->val_len / sizeof(oid);            var->name = (oid *) malloc(sizeof(oid) * (var->name_length));            if (var->name == NULL)                return SNMPERR_GENERR;            for (i = 0; i < (int) var->name_length; i++)                var->name[i] = var->val.objid[i];            break;        case ASN_OBJECT_ID:            var->name_length = var->val_len / sizeof(oid) + 1;            var->name = (oid *) malloc(sizeof(oid) * (var->name_length));            if (var->name == NULL)                return SNMPERR_GENERR;            var->name[0] = var->name_length - 1;            for (i = 0; i < (int) var->name_length - 1; i++)                var->name[i + 1] = var->val.objid[i];            break;        case ASN_PRIV_IMPLIED_OCTET_STR:            var->name_length = var->val_len;            var->name = (oid *) malloc(sizeof(oid) * (var->name_length));            if (var->name == NULL)                return SNMPERR_GENERR;            for (i = 0; i < (int) var->val_len; i++)                var->name[i] = (oid) var->val.string[i];            break;        case ASN_OPAQUE:        case ASN_OCTET_STR:            var->name_length = var->val_len + 1;            var->name = (oid *) malloc(sizeof(oid) * (var->name_length));            if (var->name == NULL)                return SNMPERR_GENERR;            var->name[0] = (oid) var->val_len;            for (i = 0; i < (int) var->val_len; i++)                var->name[i + 1] = (oid) var->val.string[i];            break;        default:            DEBUGMSGTL(("header_complex_generate_varoid",                        "invalid asn type: %d\n", var->type));            return SNMPERR_GENERR;        }    }    if (var->name_length > MAX_OID_LEN) {        DEBUGMSGTL(("header_complex_generate_varoid",                    "Something terribly wrong, namelen = %d\n",                    var->name_length));        return SNMPERR_GENERR;    }    return SNMPERR_SUCCESS;}/* * header_complex_parse_oid(): parses an index to the usmTable to * break it down into a engineID component and a name component. * The results are stored in the data pointer, as a varbindlist: *  *  * returns 1 if an error is encountered, or 0 if successful. */intheader_complex_parse_oid(oid * oidIndex, size_t oidLen,                         netsnmp_variable_list * data){    netsnmp_variable_list *var = data;    int             i, itmp;    while (var && oidLen > 0) {        switch (var->type) {        case ASN_INTEGER:        case ASN_COUNTER:        case ASN_GAUGE:        case ASN_TIMETICKS:            var->val.integer = (long *) calloc(1, sizeof(long));            if (var->val.string == NULL)                return SNMPERR_GENERR;            *var->val.integer = (long) *oidIndex++;            var->val_len = sizeof(long);            oidLen--;            DEBUGMSGTL(("header_complex_parse_oid",                        "Parsed int(%d): %d\n", var->type,                        *var->val.integer));            break;        case ASN_OBJECT_ID:        case ASN_PRIV_IMPLIED_OBJECT_ID:            if (var->type == ASN_PRIV_IMPLIED_OBJECT_ID) {                itmp = oidLen;            } else {                itmp = (long) *oidIndex++;                oidLen--;                if (itmp > (int) oidLen)                    return SNMPERR_GENERR;            }            if (itmp == 0)                break;          /* zero length strings shouldn't malloc */            var->val_len = itmp * sizeof(oid);            var->val.objid = (oid *) calloc(1, var->val_len);            if (var->val.objid == NULL)                return SNMPERR_GENERR;            for (i = 0; i < itmp; i++)                var->val.objid[i] = (u_char) * oidIndex++;            oidLen -= itmp;            DEBUGMSGTL(("header_complex_parse_oid", "Parsed oid: "));            DEBUGMSGOID(("header_complex_parse_oid", var->val.objid,                         var->val_len / sizeof(oid)));            DEBUGMSG(("header_complex_parse_oid", "\n"));            break;        case ASN_OPAQUE:        case ASN_OCTET_STR:        case ASN_PRIV_IMPLIED_OCTET_STR:            if (var->type == ASN_PRIV_IMPLIED_OCTET_STR) {                itmp = oidLen;            } else {                itmp = (long) *oidIndex++;                oidLen--;                if (itmp > (int) oidLen)                    return SNMPERR_GENERR;            }            if (itmp == 0)                break;          /* zero length strings shouldn't malloc */            /*             * malloc by size+1 to allow a null to be appended.              */            var->val_len = itmp;            var->val.string = (u_char *) calloc(1, itmp + 1);            if (var->val.string == NULL)                return SNMPERR_GENERR;            for (i = 0; i < itmp; i++)                var->val.string[i] = (u_char) * oidIndex++;            var->val.string[itmp] = '\0';            oidLen -= itmp;            DEBUGMSGTL(("header_complex_parse_oid",                        "Parsed str(%d): %s\n", var->type,                        var->val.string));            break;        default:            DEBUGMSGTL(("header_complex_parse_oid",                        "invalid asn type: %d\n", var->type));            return SNMPERR_GENERR;        }        var = var->next_variable;    }    if (var != NULL || oidLen > 0)        return SNMPERR_GENERR;    return SNMPERR_SUCCESS;}voidheader_complex_generate_oid(oid * name, /* out */                            size_t * length,    /* out */                            oid * prefix,                            size_t prefix_len,                            netsnmp_variable_list * data){    oid            *oidptr;    netsnmp_variable_list *var;    if (prefix) {        memcpy(name, prefix, prefix_len * sizeof(oid));        oidptr = (name + (prefix_len));        *length = prefix_len;    } else {        oidptr = name;        *length = 0;    }    for (var = data; var != NULL; var = var->next_variable) {        header_complex_generate_varoid(var);        memcpy(oidptr, var->name, sizeof(oid) * var->name_length);        oidptr = oidptr + var->name_length;        *length += var->name_length;    }    DEBUGMSGTL(("header_complex_generate_oid", "generated: "));    DEBUGMSGOID(("header_complex_generate_oid", name, *length));    DEBUGMSG(("header_complex_generate_oid", "\n"));}/* * finds the data in "datalist" stored at "index"  */void           *header_complex_get(struct header_complex_index *datalist,                   netsnmp_variable_list * index){    oid             searchfor[MAX_OID_LEN];    size_t          searchfor_len;    header_complex_generate_oid(searchfor,      /* out */                                &searchfor_len, /* out */                                NULL, 0, index);    return header_complex_get_from_oid(datalist, searchfor, searchfor_len);}void           *header_complex_get_from_oid(struct header_complex_index *datalist,                            oid * searchfor, size_t searchfor_len){    struct header_complex_index *nptr;    for (nptr = datalist; nptr != NULL; nptr = nptr->next) {        if (netsnmp_oid_equals(searchfor, searchfor_len,                             nptr->name, nptr->namelen) == 0)            return nptr->data;    }    return NULL;}void           *header_complex(struct header_complex_index *datalist,               struct variable *vp,               oid * name,               size_t * length,               int exact, size_t * var_len, WriteMethod ** write_method){    struct header_complex_index *nptr, *found = NULL;    oid             indexOid[MAX_OID_LEN];    size_t          len;    int             result;    /*     * set up some nice defaults for the user      */    if (write_method)        *write_method = NULL;    if (var_len)

⌨️ 快捷键说明

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