📄 header_complex.c
字号:
/* * 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 + -