mib2c.iterate.conf
上传用户:wxp200602
上传日期:2007-10-30
资源大小:4028k
文件大小:18k
- ## -*- c -*-
- ######################################################################
- ## Do the .h file
- ######################################################################
- @open ${name}.h@
- /*
- * Note: this file originally auto-generated by mib2c using
- * $Id: mib2c.iterate.conf,v 5.14.2.2 2005/05/09 08:13:01 dts12 Exp $
- */
- #ifndef $name.uc_H
- #define $name.uc_H
- /* function declarations */
- void init_$name(void);
- @foreach $i table@
- void initialize_table_$i(void);
- Netsnmp_Node_Handler ${i}_handler;
- Netsnmp_First_Data_Point ${i}_get_first_data_point;
- Netsnmp_Next_Data_Point ${i}_get_next_data_point;
- @if "$cache" ne "" @
- NetsnmpCacheLoad ${i}_load;
- NetsnmpCacheFree ${i}_free;
- #define $i.uc_TIMEOUT 60
- @end@
- @end@
- @foreach $i table@
- /* column number definitions for table $i */
- @foreach $c column@
- #define COLUMN_$c.uc $c.subid
- @end@
- @end@
- #endif /* $name.uc_H */
- ######################################################################
- ## Do the .c file
- ######################################################################
- @open ${name}.c@
- /*
- * Note: this file originally auto-generated by mib2c using
- * $Id: mib2c.iterate.conf,v 5.14.2.2 2005/05/09 08:13:01 dts12 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 "${name}.h"
- /** Initializes the $name module */
- void
- init_$name(void)
- {
- /* here we initialize all the tables we're planning on supporting */
- @foreach $i table@
- initialize_table_$i();
- @end@
- }
- @foreach $i table@
- /** Initialize the $i table by defining its contents and how it's structured */
- void
- initialize_table_$i(void)
- {
- static oid ${i}_oid[] = {$i.commaoid};
- size_t ${i}_oid_len = OID_LENGTH(${i}_oid);
- netsnmp_handler_registration *reg;
- netsnmp_iterator_info *iinfo;
- netsnmp_table_registration_info *table_info;
- reg = netsnmp_create_handler_registration(
- "$i", ${i}_handler,
- ${i}_oid, ${i}_oid_len,
- @if $i.settable@
- HANDLER_CAN_RWRITE
- @else@
- HANDLER_CAN_RONLY
- @end@
- );
- table_info = SNMP_MALLOC_TYPEDEF( netsnmp_table_registration_info );
- netsnmp_table_helper_add_indexes(table_info,
- @foreach $idx index@
- $idx.type, /* index: $idx */
- @end@
- 0);
- table_info->min_column = XXX;
- table_info->max_column = YYY;
-
- iinfo = SNMP_MALLOC_TYPEDEF( netsnmp_iterator_info );
- iinfo->get_first_data_point = ${i}_get_first_data_point;
- iinfo->get_next_data_point = ${i}_get_next_data_point;
- iinfo->table_reginfo = table_info;
-
- netsnmp_register_table_iterator( reg, iinfo );
- @if "$cache" ne "" @
- netsnmp_inject_handler_before( reg,
- netsnmp_get_cache_handler($i.uc_TIMEOUT,
- ${i}_load, ${i}_free,
- ${i}_oid, ${i}_oid_len),
- TABLE_ITERATOR_NAME);
- @end@
- /* Initialise the contents of the table here */
- }
- /* Typical data structure for a row entry */
- struct ${i}_entry {
- /* Index values */
- @foreach $idx index@
- $idx.decl $idx;
- @end@
- /* Column values */
- @foreach $c column@
- @if $c.readable@
- $c.decl $c;
- @if $c.settable@
- @if !$c.rowstatus@
- $c.decl old_$c;
- @end@
- @end@
- @end@
- @end@
- /* Illustrate using a simple linked list */
- int valid;
- struct ${i}_entry *next;
- };
- struct ${i}_entry *${i}_head;
- /* create a new row in the (unsorted) table */
- struct ${i}_entry *
- ${i}_createEntry(
- @foreach $idx index@
- $idx.decl $idx,
- @end@
- ) {
- struct ${i}_entry *entry;
- entry = SNMP_TYPEDEF_MALLOC(struct ${i}_entry);
- if (!entry)
- return NULL;
- @foreach $idx index@
- entry->$idx = $idx;
- @end@
- entry->next = ${i}_head;
- ${i}_head = entry;
- return entry;
- }
- /* remove a row from the table */
- void
- ${i}_removeEntry( struct ${i}_entry *entry ) {
- struct ${i}_entry *ptr, *prev;
- if (!entry)
- return; /* Nothing to remove */
- for ( ptr = ${i}_head, prev = NULL;
- ptr != NULL;
- prev = ptr, ptr = ptr->next ) {
- if ( ptr == entry )
- break;
- }
- if ( !ptr )
- return; /* Can't find it */
- if ( prev == NULL )
- ${i}_head = ptr->next;
- else
- prev->next = ptr->next;
- SNMP_FREE( entry ); /* XXX - release any other internal resources */
- }
- @if "$cache" ne "" @
- /* Example cache handling - set up linked list from a suitable file */
- int
- ${i}_load( netsnmp_cache *cache, void *vmagic ) {
- FILE *fp;
- struct ${i}_entry *this;
- char buf[STRMAX];
- fp = fopen( "/data/for/${i}", "r" );
- while ( fgets( buf, STRMAX, fp )) {
- this = SNMP_MALLOC_TYPEDEF( struct ${i}_entry );
- /* Unpick 'buf' and populate 'this' */
- this->next = ${i}_head;
- ${i}_head = this; /* Iterate helper is fine with unordered lists! */+ }
- fclose(fp);
- }
- int
- ${i}_free( netsnmp_cache *cache, void *vmagic ) {
- struct ${i}_entry *this, *that;
- for ( this = ${i}_head; this; this=that ) {
- that = this->next;
- SNMP_FREE( this ); /* XXX - release any other internal resources */
- }
- ${i}_head = NULL;
- }
- @end@
- /* Example iterator hook routines - using 'get_next' to do most of the work */
- netsnmp_variable_list *
- ${i}_get_first_data_point(void **my_loop_context,
- void **my_data_context,
- netsnmp_variable_list *put_index_data,
- netsnmp_iterator_info *mydata)
- {
- *my_loop_context = ${i}_head;
- return ${i}_get_next_data_point(my_loop_context, my_data_context,
- put_index_data, mydata );
- }
- netsnmp_variable_list *
- ${i}_get_next_data_point(void **my_loop_context,
- void **my_data_context,
- netsnmp_variable_list *put_index_data,
- netsnmp_iterator_info *mydata)
- {
- struct ${i}_entry *entry = (struct ${i}_entry *)*my_loop_context;
- netsnmp_variable_list *idx = put_index_data;
- if ( entry ) {
- @foreach $idx index@
- snmp_set_var_value( idx, entry->${idx}, sizeof(entry->${idx}) );
- idx = idx->next_variable;
- @end@
- *my_data_context = (void *)entry;
- *my_loop_context = (void *)entry->next;
- } else {
- return NULL;
- }
- }
- /** handles requests for the $i table */
- int
- ${i}_handler(
- netsnmp_mib_handler *handler,
- netsnmp_handler_registration *reginfo,
- netsnmp_agent_request_info *reqinfo,
- netsnmp_request_info *requests) {
- netsnmp_request_info *request;
- netsnmp_table_request_info *table_info;
- struct ${i}_entry *table_entry;
- switch (reqinfo->mode) {
- /*
- * Read-support (also covers GetNext requests)
- */
- case MODE_GET:
- for (request=requests; request; request=request->next) {
- table_entry = (struct ${i}_entry *)
- netsnmp_extract_iterator_context(request);
- table_info = netsnmp_extract_table_info( request);
-
- switch (table_info->colnum) {
- @foreach $c column@
- @if $c.readable@
- case COLUMN_$c.uc:
- snmp_set_var_typed_value( request->requestvb, $c.type,
- table_entry->$c,
- sizeof(table_entry->$c));
- break;
- @end@
- @end@
- }
- }
- break;
- @if $i.settable@
- /*
- * Write-support
- */
- case MODE_SET_RESERVE1:
- for (request=requests; request; request=request->next) {
- table_entry = (struct ${i}_entry *)
- netsnmp_extract_iterator_context(request);
- table_info = netsnmp_extract_table_info( request);
-
- switch (table_info->colnum) {
- @foreach $c column@
- @if $c.settable@
- case COLUMN_$c.uc:
- if ( request->requestvb->type != $c.type ) {
- netsnmp_set_request_error( reqinfo, request,
- SNMP_ERR_WRONGTYPE );
- return SNMP_ERR_NOERROR;
- }
- /* Also may need to check size/value */
- @if $c.rowstatus@
- switch (*request->requestvb->val.integer) {
- case RS_ACTIVE:
- case RS_NOTINSERVICE:
- if (!table_entry) {
- netsnmp_set_request_error( reqinfo, request,
- SNMP_ERR_INCONSISTENTVALUE );
- return SNMP_ERR_NOERROR;
- }
- break;
- case RS_CREATEANDGO:
- case RS_CREATEANDWAIT:
- if (table_entry) {
- netsnmp_set_request_error( reqinfo, request,
- SNMP_ERR_INCONSISTENTVALUE );
- return SNMP_ERR_NOERROR;
- }
- break;
- case RS_DESTROY:
- /* Valid in all circumstances */
- break;
- case RS_NOTREADY:
- default:
- netsnmp_set_request_error( reqinfo, request,
- SNMP_ERR_WRONGVALUE );
- return SNMP_ERR_NOERROR;
- break;
- }
- @end@
- break;
- @end@
- @end@
- default:
- netsnmp_set_request_error( reqinfo, request,
- SNMP_ERR_NOTWRITABLE );
- return SNMP_ERR_NOERROR;
- }
- }
- break;
- case MODE_SET_RESERVE2:
- @if $i.creatable@
- for (request=requests; request; request=request->next) {
- table_entry = (struct ${i}_entry *)
- netsnmp_extract_iterator_context(request);
- table_info = netsnmp_extract_table_info( request);
-
- switch (table_info->colnum) {
- @if $i.rowstatus@
- @foreach $c column@
- @if $c.rowstatus@
- case COLUMN_$c.uc:
- switch (*request->requestvb->val.integer) {
- case RS_CREATEANDGO:
- case RS_CREATEANDWAIT:
- table_row = ${i}_createEntry(
- @foreach $idx index@
- , table_info->indexes->val.YYY
- @end@
- );
- if (table_row) {
- netsnmp_insert_table_row( request, table_row );
- } else {
- netsnmp_set_request_error( reqinfo, request,
- SNMP_ERR_RESOURCEUNAVAILABLE );
- return SNMP_ERR_NOERROR;
- }
- }
- @end@
- @end@
- @else@
- @foreach $c column@
- @if $c.creatable@
- case COLUMN_$c.uc:
- @end@
- @end@
- if ( !table_row ) {
- table_row = ${i}_createEntry(
- @foreach $idx index@
- , table_info->indexes->val.YYY
- @end@
- );
- if (table_row) {
- netsnmp_insert_table_row( request, table_row );
- } else {
- netsnmp_set_request_error( reqinfo, request,
- SNMP_ERR_RESOURCEUNAVAILABLE );
- return SNMP_ERR_NOERROR;
- }
- }
- break;
- @end@
- }
- }
- @end@
- break;
- case MODE_SET_FREE:
- @if $i.creatable@
- for (request=requests; request; request=request->next) {
- table_entry = (struct ${i}_entry *)
- netsnmp_extract_iterator_context(request);
- table_info = netsnmp_extract_table_info( request);
-
- switch (table_info->colnum) {
- @if $i.rowstatus@
- @foreach $c column@
- @if $c.rowstatus@
- case COLUMN_$c.uc:
- switch (*request->requestvb->val.integer) {
- case RS_CREATEANDGO:
- case RS_CREATEANDWAIT:
- if (table_entry && !table_entry->valid) {
- ${i}_removeEntry(table_data, table_row );
- }
- }
- @end@
- @end@
- @else@
- @foreach $c column@
- @if $c.creatable@
- case COLUMN_$c.uc:
- @end@
- @end@
- if ( table_entry && !table_entry->valid ) {
- ${i}_removeEntry(table_data, table_row );
- }
- break;
- @end@
- }
- }
- @end@
- break;
- case MODE_SET_ACTION:
- for (request=requests; request; request=request->next) {
- table_entry = (struct ${i}_entry *)
- netsnmp_extract_iterator_context(request);
- table_info = netsnmp_extract_table_info( request);
-
- switch (table_info->colnum) {
- @foreach $c column@
- @if $c.settable@
- @if !$c.rowstatus@
- case COLUMN_$c.uc:
- /* Need to save old 'table_entry->$c' value.
- May need to use 'memcpy' */
- table_entry->old_$c = table_entry->$c;
- table_entry->$c = request->requestvb->val.YYY;
- break;
- @end@
- @end@
- @end@
- }
- }
- @if $i.rowstatus@
- /* Check the internal consistency of an active row */
- for (request=requests; request; request=request->next) {
- table_entry = (struct ${i}_entry *)
- netsnmp_extract_iterator_context(request);
- table_info = netsnmp_extract_table_info( request);
-
- switch (table_info->colnum) {
- @foreach $c column@
- @if $c.rowstatus@
- case COLUMN_$c.uc:
- switch (*request->requestvb->val.integer) {
- case RS_ACTIVE:
- case RS_CREATEANDGO:
- if (/* XXX */) {
- netsnmp_set_request_error( reqinfo, request,
- SNMP_ERR_INCONSISTENTVALUE );
- return SNMP_ERR_NOERROR;
- }
- }
- @end@
- @end@
- }
- }
- @end@
- break;
- case MODE_SET_UNDO:
- for (request=requests; request; request=request->next) {
- table_entry = (struct ${i}_entry *)
- netsnmp_extract_iterator_context(request);
- table_info = netsnmp_extract_table_info( request);
-
- switch (table_info->colnum) {
- @foreach $c column@
- @if $c.settable@
- case COLUMN_$c.uc:
- @if $i.rowstatus@
- @if $c.rowstatus@
- switch (*request->requestvb->val.integer) {
- case RS_CREATEANDGO:
- case RS_CREATEANDWAIT:
- if (table_entry && !table_entry->valid) {
- ${i}_removeEntry(table_data, table_row );
- }
- }
- @else@
- /* Need to restore old 'table_entry->$c' value.
- May need to use 'memcpy' */
- table_entry->$c = table_entry->old_$c;
- @end@
- @else@
- @if $c.creatable@
- if ( table_entry && !table_entry->valid ) {
- ${i}_removeEntry(table_data, table_row );
- } else {
- /* Need to restore old 'table_entry->$c' value.
- May need to use 'memcpy' */
- table_entry->$c = table_entry->old_$c;
- }
- @else@
- /* Need to restore old 'table_entry->$c' value.
- May need to use 'memcpy' */
- table_entry->$c = table_entry->old_$c;
- @end@
- @end@
- break;
- @end@
- @end@
- }
- }
- break;
- case MODE_SET_COMMIT:
- @if $i.creatable@
- for (request=requests; request; request=request->next) {
- table_entry = (struct ${i}_entry *)
- netsnmp_extract_iterator_context(request);
- table_info = netsnmp_extract_table_info( request);
-
- switch (table_info->colnum) {
- @if $i.rowstatus@
- @foreach $c column@
- @if $c.rowstatus@
- case COLUMN_$c.uc:
- switch (*request->requestvb->val.integer) {
- case RS_CREATEANDGO:
- table_entry->valid = 1;
- /* Fall-through */
- case RS_ACTIVE:
- table_entry->$c = RS_ACTIVE;
- break;
- case RS_CREATEANDWAIT:
- table_entry->valid = 1;
- /* Fall-through */
- case RS_NOTINSERVICE:
- table_entry->$c = RS_NOTINSERVICE;
- break;
- case RS_DESTROY:
- ${i}_removeEntry(table_data, table_row );
- }
- @end@
- @end@
- @else@
- @foreach $c column@
- @if $c.creatable@
- case COLUMN_$c.uc:
- @end@
- @end@
- if ( table_entry && !table_entry->valid ) {
- table_entry->valid = 1;
- }
- @end@
- }
- }
- @end@
- break;
- @end@
- }
- return SNMP_ERR_NOERROR;
- }
- @end@