testhandler.c
上传用户:wxp200602
上传日期:2007-10-30
资源大小:4028k
文件大小:13k
- #include <net-snmp/net-snmp-config.h>
- #ifdef 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 "testhandler.h"
- #include <net-snmp/agent/table.h>
- #include <net-snmp/agent/instance.h>
- #include <net-snmp/agent/table_data.h>
- #include <net-snmp/agent/table_dataset.h>
- static oid my_test_oid[4] = { 1, 2, 3, 4 };
- static oid my_table_oid[4] = { 1, 2, 3, 5 };
- static oid my_instance_oid[5] = { 1, 2, 3, 6, 1 };
- static oid my_data_table_oid[4] = { 1, 2, 3, 7 };
- static oid my_data_table_set_oid[4] = { 1, 2, 3, 8 };
- static oid my_data_ulong_instance[4] = { 1, 2, 3, 9 };
- u_long my_ulong = 0;
- void
- init_testhandler(void)
- {
- /*
- * we're registering at .1.2.3.4
- */
- netsnmp_handler_registration *my_test;
- netsnmp_table_registration_info *table_info;
- u_long ind1;
- netsnmp_table_data *table;
- netsnmp_table_data_set *table_set;
- netsnmp_table_row *row;
- DEBUGMSGTL(("testhandler", "initializingn"));
- /*
- * basic handler test
- */
- netsnmp_register_handler(netsnmp_create_handler_registration
- ("myTest", my_test_handler, my_test_oid, 4,
- HANDLER_CAN_RONLY));
- /*
- * instance handler test
- */
- netsnmp_register_instance(netsnmp_create_handler_registration
- ("myInstance", my_test_instance_handler,
- my_instance_oid, 5, HANDLER_CAN_RWRITE));
- netsnmp_register_ulong_instance("myulong",
- my_data_ulong_instance, 4,
- &my_ulong, NULL);
- /*
- * table helper test
- */
- my_test = netsnmp_create_handler_registration("myTable",
- my_test_table_handler,
- my_table_oid, 4,
- HANDLER_CAN_RONLY);
- if (!my_test)
- return;
- table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info);
- netsnmp_table_helper_add_indexes(table_info, ASN_INTEGER, ASN_INTEGER,
- 0);
- table_info->min_column = 3;
- table_info->max_column = 3;
- netsnmp_register_table(my_test, table_info);
- /*
- * data table helper test
- */
- /*
- * we'll construct a simple table here with two indexes: an
- * integer and a string (why not). It'll contain only one
- * column so the data pointer is merely the data in that
- * column.
- */
- table = netsnmp_create_table_data("data_table_test");
- netsnmp_table_data_add_index(table, ASN_INTEGER);
- netsnmp_table_data_add_index(table, ASN_OCTET_STR);
- /*
- * 1 partridge in a pear tree
- */
- row = netsnmp_create_table_data_row();
- ind1 = 1;
- netsnmp_table_row_add_index(row, ASN_INTEGER, &ind1, sizeof(ind1));
- netsnmp_table_row_add_index(row, ASN_OCTET_STR, "partridge",
- strlen("partridge"));
- row->data = (void *) "pear tree";
- netsnmp_table_data_add_row(table, row);
- /*
- * 2 turtle doves
- */
- row = netsnmp_create_table_data_row();
- ind1 = 2;
- netsnmp_table_row_add_index(row, ASN_INTEGER, &ind1, sizeof(ind1));
- netsnmp_table_row_add_index(row, ASN_OCTET_STR, "turtle",
- strlen("turtle"));
- row->data = (void *) "doves";
- netsnmp_table_data_add_row(table, row);
- /*
- * we're going to register it as a normal table too, so we get the
- * automatically parsed column and index information
- */
- table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info);
- netsnmp_table_helper_add_indexes(table_info, ASN_INTEGER,
- ASN_OCTET_STR, 0);
- table_info->min_column = 3;
- table_info->max_column = 3;
- netsnmp_register_read_only_table_data
- (netsnmp_create_handler_registration
- ("12days", my_data_table_handler, my_data_table_oid, 4,
- HANDLER_CAN_RONLY), table, table_info);
- }
- int
- my_test_handler(netsnmp_mib_handler *handler,
- netsnmp_handler_registration *reginfo,
- netsnmp_agent_request_info *reqinfo,
- netsnmp_request_info *requests)
- {
- oid myoid1[] = { 1, 2, 3, 4, 5, 6 };
- static u_long accesses = 0;
- DEBUGMSGTL(("testhandler", "Got request:n"));
- /*
- * loop through requests
- */
- while (requests) {
- netsnmp_variable_list *var = requests->requestvb;
- DEBUGMSGTL(("testhandler", " oid:"));
- DEBUGMSGOID(("testhandler", var->name, var->name_length));
- DEBUGMSG(("testhandler", "n"));
- switch (reqinfo->mode) {
- case MODE_GET:
- if (netsnmp_oid_equals(var->name, var->name_length, myoid1, 6)
- == 0) {
- snmp_set_var_typed_value(var, ASN_INTEGER,
- (u_char *) & accesses,
- sizeof(accesses));
- return SNMP_ERR_NOERROR;
- }
- break;
- case MODE_GETNEXT:
- if (snmp_oid_compare(var->name, var->name_length, myoid1, 6)
- < 0) {
- snmp_set_var_objid(var, myoid1, 6);
- snmp_set_var_typed_value(var, ASN_INTEGER,
- (u_char *) & accesses,
- sizeof(accesses));
- return SNMP_ERR_NOERROR;
- }
- break;
- default:
- netsnmp_set_request_error(reqinfo, requests, SNMP_ERR_GENERR);
- break;
- }
- requests = requests->next;
- }
- return SNMP_ERR_NOERROR;
- }
- /*
- * functionally this is a simply a multiplication table for 12x12
- */
- #define MAX_COLONE 12
- #define MAX_COLTWO 12
- #define RESULT_COLUMN 3
- int
- my_test_table_handler(netsnmp_mib_handler *handler,
- netsnmp_handler_registration *reginfo,
- netsnmp_agent_request_info *reqinfo,
- netsnmp_request_info *requests)
- {
- netsnmp_table_registration_info
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- *handler_reg_info =
- (netsnmp_table_registration_info *) handler->prev->myvoid;
- netsnmp_table_request_info *table_info;
- u_long result;
- int x, y;
- while (requests) {
- netsnmp_variable_list *var = requests->requestvb;
- if (requests->processed != 0)
- continue;
- DEBUGMSGTL(("testhandler_table", "Got request:n"));
- DEBUGMSGTL(("testhandler_table", " oid:"));
- DEBUGMSGOID(("testhandler_table", var->name, var->name_length));
- DEBUGMSG(("testhandler_table", "n"));
- table_info = netsnmp_extract_table_info(requests);
- if (table_info == NULL) {
- requests = requests->next;
- continue;
- }
- switch (reqinfo->mode) {
- case MODE_GETNEXT:
- /*
- * beyond our search range?
- */
- if (table_info->colnum > RESULT_COLUMN)
- break;
- /*
- * below our minimum column?
- */
- if (table_info->colnum < RESULT_COLUMN ||
- /*
- * or no index specified
- */
- table_info->indexes->val.integer == 0) {
- table_info->colnum = RESULT_COLUMN;
- x = 0;
- y = 0;
- } else {
- x = *(table_info->indexes->val.integer);
- y = *(table_info->indexes->next_variable->val.integer);
- }
- if (table_info->number_indexes ==
- handler_reg_info->number_indexes) {
- y++; /* GETNEXT is basically just y+1 for this table */
- if (y > MAX_COLTWO) { /* (with wrapping) */
- y = 0;
- x++;
- }
- }
- if (x <= MAX_COLONE) {
- result = x * y;
- *(table_info->indexes->val.integer) = x;
- *(table_info->indexes->next_variable->val.integer) = y;
- netsnmp_table_build_result(reginfo, requests,
- table_info, ASN_INTEGER,
- (u_char *) & result,
- sizeof(result));
- }
- break;
- case MODE_GET:
- if (var->type == ASN_NULL) { /* valid request if ASN_NULL */
- /*
- * is it the right column?
- */
- if (table_info->colnum == RESULT_COLUMN &&
- /*
- * and within the max boundries?
- */
- *(table_info->indexes->val.integer) <= MAX_COLONE &&
- *(table_info->indexes->next_variable->val.integer)
- <= MAX_COLTWO) {
- /*
- * then, the result is column1 * column2
- */
- result = *(table_info->indexes->val.integer) *
- *(table_info->indexes->next_variable->val.integer);
- snmp_set_var_typed_value(var, ASN_INTEGER,
- (u_char *) & result,
- sizeof(result));
- }
- }
- break;
- }
- requests = requests->next;
- }
- return SNMP_ERR_NOERROR;
- }
- #define TESTHANDLER_SET_NAME "my_test"
- int
- my_test_instance_handler(netsnmp_mib_handler *handler,
- netsnmp_handler_registration *reginfo,
- netsnmp_agent_request_info *reqinfo,
- netsnmp_request_info *requests)
- {
- static u_long accesses = 0;
- u_long *accesses_cache = NULL;
- DEBUGMSGTL(("testhandler", "Got instance request:n"));
- switch (reqinfo->mode) {
- case MODE_GET:
- snmp_set_var_typed_value(requests->requestvb, ASN_UNSIGNED,
- (u_char *) & accesses, sizeof(accesses));
- break;
- case MODE_SET_RESERVE1:
- if (requests->requestvb->type != ASN_UNSIGNED)
- netsnmp_set_request_error(reqinfo, requests,
- SNMP_ERR_WRONGTYPE);
- break;
- case MODE_SET_RESERVE2:
- /*
- * store old info for undo later
- */
- memdup((u_char **) & accesses_cache,
- (u_char *) & accesses, sizeof(accesses));
- if (accesses_cache == NULL) {
- netsnmp_set_request_error(reqinfo, requests,
- SNMP_ERR_RESOURCEUNAVAILABLE);
- return SNMP_ERR_NOERROR;
- }
- netsnmp_request_add_list_data(requests,
- netsnmp_create_data_list
- (TESTHANDLER_SET_NAME,
- accesses_cache, free));
- break;
- case MODE_SET_ACTION:
- /*
- * update current
- */
- accesses = *(requests->requestvb->val.integer);
- DEBUGMSGTL(("testhandler", "updated accesses -> %dn", accesses));
- break;
- case MODE_SET_UNDO:
- accesses =
- *((u_long *) netsnmp_request_get_list_data(requests,
- TESTHANDLER_SET_NAME));
- break;
- case MODE_SET_COMMIT:
- case MODE_SET_FREE:
- /*
- * nothing to do
- */
- break;
- }
- return SNMP_ERR_NOERROR;
- }
- int
- my_data_table_handler(netsnmp_mib_handler *handler,
- netsnmp_handler_registration *reginfo,
- netsnmp_agent_request_info *reqinfo,
- netsnmp_request_info *requests)
- {
- char *column3;
- netsnmp_table_request_info *table_info;
- netsnmp_table_row *row;
- while (requests) {
- if (requests->processed)
- continue;
- /*
- * extract our stored data and table info
- */
- row = netsnmp_extract_table_row(requests);
- table_info = netsnmp_extract_table_info(requests);
- if (row)
- column3 = (char *) row->data;
- if (!row || !table_info || !column3)
- continue;
- /*
- * there's only one column, we don't need to check if it's right
- */
- netsnmp_table_data_build_result(reginfo, reqinfo, requests, row,
- table_info->colnum,
- ASN_OCTET_STR, column3,
- strlen(column3));
- requests = requests->next;
- }
- return SNMP_ERR_NOERROR;
- }