📄 nsmoduletable.c
字号:
/* * Note: this file originally auto-generated by mib2c using * : mib2c.iterate.conf,v 1.5 2001/12/04 21:36:27 hardaker 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 "nsModuleTable.h"voidnsModuleTable_free(void *context, netsnmp_iterator_info *dont_care){ free(context);} /** Initialize the nsModuleTable table by defining it's contents and how it's structured */voidinitialize_table_nsModuleTable(void){ static oid nsModuleTable_oid[] = { 1, 3, 6, 1, 4, 1, 8072, 1, 2, 1 }; netsnmp_table_registration_info *table_info; netsnmp_handler_registration *my_handler; netsnmp_iterator_info *iinfo; /* * create the table structure itself */ table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info); iinfo = SNMP_MALLOC_TYPEDEF(netsnmp_iterator_info); /* * if your table is read only, it's easiest to change the * HANDLER_CAN_RWRITE definition below to HANDLER_CAN_RONLY */ my_handler = netsnmp_create_handler_registration("nsModuleTable", nsModuleTable_handler, nsModuleTable_oid, OID_LENGTH (nsModuleTable_oid), HANDLER_CAN_RWRITE); if (!my_handler || !table_info || !iinfo) return; /* mallocs failed */ /*************************************************** * Setting up the table's definition */ netsnmp_table_helper_add_indexes(table_info, ASN_OCTET_STR, /* context name */ ASN_OBJECT_ID, /* reg point */ ASN_INTEGER, /* priority */ 0); table_info->min_column = 4; table_info->max_column = 6; /* * iterator access routines */ iinfo->get_first_data_point = nsModuleTable_get_first_data_point; iinfo->get_next_data_point = nsModuleTable_get_next_data_point; iinfo->free_loop_context_at_end = nsModuleTable_free; iinfo->table_reginfo = table_info; /*************************************************** * registering the table with the master agent */ DEBUGMSGTL(("initialize_table_nsModuleTable", "Registering table nsModuleTable as a table iterator\n")); netsnmp_register_table_iterator(my_handler, iinfo);}/** Initialzies the nsModuleTable module */voidinit_nsModuleTable(void){ /* * here we initialize all the tables we're planning on supporting */ initialize_table_nsModuleTable();}/** returns the first data point within the nsModuleTable table data. Set the my_loop_context variable to the first data point structure of your choice (from which you can find the next one). This could be anything from the first node in a linked list, to an integer pointer containing the beginning of an array variable. Set the my_data_context variable to something to be returned to you later that will provide you with the data to return in a given row. This could be the same pointer as what my_loop_context is set to, or something different. The put_index_data variable contains a list of snmp variable bindings, one for each index in your table. Set the values of each appropriately according to the data matching the first row and return the put_index_data variable at the end of the function.*/typedef struct context_tree_ptr_s { netsnmp_subtree *tree; subtree_context_cache *context_ptr;} context_tree_ptr;netsnmp_variable_list *nsModuleTable_get_first_data_point(void **my_loop_context, void **my_data_context, netsnmp_variable_list * put_index_data, netsnmp_iterator_info *otherstuff){ struct variable_list *vptr; u_long ultmp; context_tree_ptr *ctree; ctree = SNMP_MALLOC_TYPEDEF(context_tree_ptr); ctree->context_ptr = get_top_context_cache(); /* Skip empty context registrations */ while (!ctree->context_ptr->first_subtree) { ctree->context_ptr = ctree->context_ptr->next; if (!ctree->context_ptr) return NULL; } ctree->tree = ctree->context_ptr->first_subtree; *my_loop_context = ctree; *my_data_context = ctree->tree; vptr = put_index_data; snmp_set_var_value(vptr, (u_char *) ctree->context_ptr->context_name, strlen(ctree->context_ptr->context_name)); vptr = vptr->next_variable; snmp_set_var_value(vptr, (u_char *)ctree->context_ptr->first_subtree->name_a, ctree->context_ptr->first_subtree->namelen * sizeof(oid)); ultmp = ctree->context_ptr->first_subtree->priority; vptr = vptr->next_variable; snmp_set_var_value(vptr, (u_char *) & ultmp, sizeof(ultmp)); return put_index_data;}/** functionally the same as nsModuleTable_get_first_data_point, but my_loop_context has already been set to a previous value and should be updated to the next in the list. For example, if it was a linked list, you might want to cast it and the return my_loop_context->next. The my_data_context pointer should be set to something you need later and the indexes in put_index_data updated again. */struct variable_list *nsModuleTable_get_next_data_point(void **my_loop_context, void **my_data_context, struct variable_list *put_index_data, netsnmp_iterator_info *otherstuff){ struct variable_list *vptr; context_tree_ptr *ctree = (context_tree_ptr *) * my_loop_context; u_long ultmp; if (ctree->tree->next) ctree->tree = ctree->tree->next; else { ctree->context_ptr = ctree->context_ptr->next; if (!ctree->context_ptr) { return NULL; } ctree->tree = ctree->context_ptr->first_subtree; } *my_data_context = ctree->tree; vptr = put_index_data; snmp_set_var_value(vptr, (u_char *) ctree->context_ptr->context_name, strlen(ctree->context_ptr->context_name)); vptr = vptr->next_variable; snmp_set_var_value(vptr, (u_char *) ctree->tree->name_a, ctree->tree->namelen * sizeof(oid)); ultmp = ctree->tree->priority; vptr = vptr->next_variable; snmp_set_var_value(vptr, (u_char *) & ultmp, sizeof(ultmp)); return put_index_data;}/** handles requests for the nsModuleTable table, if anything else needs to be done */intnsModuleTable_handler(netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests){ netsnmp_table_request_info *table_info; netsnmp_request_info *request; netsnmp_variable_list *var; netsnmp_subtree *tree; u_long ultmp; u_char modes[1]; for (request = requests; request; request = request->next) { var = request->requestvb; if (request->processed != 0) continue; /* * perform anything here that you need to do. The request have * already been processed by the master table_dataset handler, but * this gives you chance to act on the request in some other way if * need be. */ /* * the following extracts the my_data_context pointer set in the * loop functions above. You can then use the results to help * return data for the columns of the nsModuleTable table in * question */ tree = (netsnmp_subtree *)netsnmp_extract_iterator_context(request); if (tree == NULL) { if (reqinfo->mode == MODE_GET) { netsnmp_set_request_error(reqinfo, request, SNMP_NOSUCHINSTANCE); continue; } /* * XXX: no row existed, if you support creation and this is a * set, start dealing with it here, else continue */ } /* * extracts the information about the table from the request */ table_info = netsnmp_extract_table_info(request); /* * table_info->colnum contains the column number requested */ /* * table_info->indexes contains a linked list of snmp variable * bindings for the indexes of the table. Values in the list have * been set corresponding to the indexes of the request */ if (table_info == NULL) { continue; } switch (reqinfo->mode) { /* * the table_iterator helper should change all GETNEXTs into * GETs for you automatically, so you don't have to worry * about the GETNEXT case. Only GETs and SETs need to be * dealt with here */ case MODE_GET: switch (table_info->colnum) { case COLUMN_NSMODULENAME: if (tree->reginfo->handlerName) { snmp_set_var_typed_value(var, ASN_OCTET_STR, tree->reginfo->handlerName, strlen(tree->reginfo->handlerName)); } else { snmp_set_var_typed_value(var, ASN_OCTET_STR, "", 0); } break; case COLUMN_NSMODULEMODES: /* * basically, these BITS needs to be inverted in order */ modes[0] = ((HANDLER_CAN_GETANDGETNEXT & tree->reginfo-> modes) << 7) | ((HANDLER_CAN_SET & tree->reginfo-> modes) << 5) | ((HANDLER_CAN_GETBULK & tree->reginfo-> modes) << 3); /* yuck */ snmp_set_var_typed_value(var, ASN_OCTET_STR, modes, 1); break; case COLUMN_NSMODULETIMEOUT: ultmp = tree->timeout; snmp_set_var_typed_value(var, ASN_INTEGER, (u_char *) & ultmp, sizeof(u_long)); break; default: /* * We shouldn't get here */ snmp_log(LOG_ERR, "problem encountered in nsModuleTable_handler: unknown column\n"); } break; default: snmp_log(LOG_ERR, "problem encountered in nsModuleTable_handler: unsupported mode\n"); } } return SNMP_ERR_NOERROR;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -