Blame local/mib2c.table_data.conf

Packit fcad23
## -*- c -*-
Packit fcad23
#
Packit fcad23
@if "$cache" eq "" @
Packit fcad23
@open -@
Packit fcad23
This framework can work in one of two ways:
Packit fcad23
Packit fcad23
  1)  Hold a local cached copy of some external data
Packit fcad23
      which is then used to service incoming requests.
Packit fcad23
Packit fcad23
  2)  Hold the data for the table solely within the agent
Packit fcad23
Packit fcad23
Which is more appropriate for your needs?
Packit fcad23
    @prompt $ans Select your choice : @
Packit fcad23
    @if $ans == 1 @
Packit fcad23
      @eval $cache = 1@
Packit fcad23
    @elsif $ans == 2@
Packit fcad23
      @eval $cache = 0@
Packit fcad23
    @else@
Packit fcad23
Invalid answer - generating caching code
Packit fcad23
      @eval $cache = 1@
Packit fcad23
    @end@
Packit fcad23
@else@       #  -S cache={something}
Packit fcad23
    @if "$cache" ne "1" && "$cache" ne "0" @
Packit fcad23
@open -@
Packit fcad23
Invalid value for 'cache' ($cache) - generating caching code
Packit fcad23
      @eval $cache = 1@
Packit fcad23
    @end@
Packit fcad23
@end@
Packit fcad23
Packit fcad23
######################################################################
Packit fcad23
## Do the .h file
Packit fcad23
######################################################################
Packit fcad23
@open ${name}.h@
Packit fcad23
/*
Packit fcad23
 * Note: this file originally auto-generated by mib2c
Packit fcad23
 * using mib2c.table_data.conf
Packit fcad23
 */
Packit fcad23
#ifndef $name.uc_H
Packit fcad23
#define $name.uc_H
Packit fcad23
Packit fcad23
/* function declarations */
Packit fcad23
void init_$name(void);
Packit fcad23
@foreach $i table@
Packit fcad23
void initialize_table_$i(void);
Packit fcad23
Netsnmp_Node_Handler ${i}_handler;
Packit fcad23
@if "$cache" == 1 @
Packit fcad23
NetsnmpCacheLoad ${i}_load;
Packit fcad23
NetsnmpCacheFree ${i}_free;
Packit fcad23
#define $i.uc_TIMEOUT  60
Packit fcad23
@end@
Packit fcad23
@end@
Packit fcad23
@foreach $i table@
Packit fcad23
Packit fcad23
/* column number definitions for table $i */
Packit fcad23
    @foreach $c column@
Packit fcad23
       #define COLUMN_$c.uc		$c.subid
Packit fcad23
    @end@
Packit fcad23
@end@
Packit fcad23
#endif /* $name.uc_H */
Packit fcad23
######################################################################
Packit fcad23
## Do the .c file
Packit fcad23
######################################################################
Packit fcad23
@open ${name}.c@
Packit fcad23
/*
Packit fcad23
 * Note: this file originally auto-generated by mib2c
Packit fcad23
 * using mib2c.table_data.conf
Packit fcad23
 */
Packit fcad23
Packit fcad23
#include <net-snmp/net-snmp-config.h>
Packit fcad23
#include <net-snmp/net-snmp-includes.h>
Packit fcad23
#include <net-snmp/agent/net-snmp-agent-includes.h>
Packit fcad23
#include "${name}.h"
Packit fcad23
Packit fcad23
/** Initializes the $name module */
Packit fcad23
void
Packit fcad23
init_$name(void)
Packit fcad23
{
Packit fcad23
  /* here we initialize all the tables we're planning on supporting */
Packit fcad23
  @foreach $i table@
Packit fcad23
    initialize_table_$i();
Packit fcad23
  @end@
Packit fcad23
}
Packit fcad23
Packit fcad23
@foreach $i table@
Packit fcad23
  ## Determine the first/last column names
Packit fcad23
  @eval $first_column = "-"@
Packit fcad23
  @eval $last_column = "-"@
Packit fcad23
  @foreach $c column@
Packit fcad23
    @if $c.readable@
Packit fcad23
      @if "$first_column" eq "-"@
Packit fcad23
        @eval $first_column = $c@
Packit fcad23
      @end@
Packit fcad23
      @eval $last_column = $c@
Packit fcad23
    @end@
Packit fcad23
  @end@
Packit fcad23
Packit fcad23
/** Initialize the $i table by defining its contents and how it's structured */
Packit fcad23
void
Packit fcad23
initialize_table_$i(void)
Packit fcad23
{
Packit fcad23
    const oid ${i}_oid[] = {$i.commaoid};
Packit fcad23
    const size_t ${i}_oid_len   = OID_LENGTH(${i}_oid);
Packit fcad23
    netsnmp_handler_registration    *reg;
Packit fcad23
    netsnmp_tdata                   *table_data;
Packit fcad23
    netsnmp_table_registration_info *table_info;
Packit fcad23
@if "$cache" == 1 @
Packit fcad23
    netsnmp_cache                   *cache;
Packit fcad23
@end@
Packit fcad23
Packit fcad23
    DEBUGMSGTL(("${name}:init", "initializing table $i\n"));
Packit fcad23
Packit fcad23
    reg = netsnmp_create_handler_registration(
Packit fcad23
              "$i",     ${i}_handler,
Packit fcad23
              ${i}_oid, ${i}_oid_len,
Packit fcad23
@if $i.settable@
Packit fcad23
              HANDLER_CAN_RWRITE
Packit fcad23
@else@
Packit fcad23
              HANDLER_CAN_RONLY
Packit fcad23
@end@
Packit fcad23
              );
Packit fcad23
Packit fcad23
    table_data = netsnmp_tdata_create_table( "$i", 0 );
Packit fcad23
    if (NULL == table_data) {
Packit fcad23
        snmp_log(LOG_ERR,"error creating tdata table for $i\n");
Packit fcad23
        return;
Packit fcad23
    }
Packit fcad23
@if "$cache" == 1 @
Packit fcad23
    cache = netsnmp_cache_create($i.uc_TIMEOUT,
Packit fcad23
                                  ${i}_load, ${i}_free,
Packit fcad23
                                  ${i}_oid, ${i}_oid_len);
Packit fcad23
    if (NULL == cache) {
Packit fcad23
        snmp_log(LOG_ERR,"error creating cache for $i\n");
Packit fcad23
    }
Packit fcad23
    else
Packit fcad23
        cache->magic = (void *)table_data;
Packit fcad23
@end@
Packit fcad23
    table_info = SNMP_MALLOC_TYPEDEF( netsnmp_table_registration_info );
Packit fcad23
    if (NULL == table_info) {
Packit fcad23
        snmp_log(LOG_ERR,"error creating table info for $i\n");
Packit fcad23
        return;
Packit fcad23
    }
Packit fcad23
    netsnmp_table_helper_add_indexes(table_info,
Packit fcad23
    @foreach $idx index@
Packit fcad23
                           $idx.type,  /* index: $idx */
Packit fcad23
    @end@
Packit fcad23
                           0);
Packit fcad23
Packit fcad23
    table_info->min_column = COLUMN_$first_column.uc;
Packit fcad23
    table_info->max_column = COLUMN_$last_column.uc;
Packit fcad23
    
Packit fcad23
    netsnmp_tdata_register( reg, table_data, table_info );
Packit fcad23
@if "$cache" == 1 @
Packit fcad23
    if (cache) 
Packit fcad23
        netsnmp_inject_handler_before( reg, netsnmp_cache_handler_GET(cache),
Packit fcad23
                                       TABLE_TDATA_NAME);
Packit fcad23
@end@
Packit fcad23
Packit fcad23
    /* Initialise the contents of the table here */
Packit fcad23
}
Packit fcad23
Packit fcad23
    /* Typical data structure for a row entry */
Packit fcad23
struct ${i}_entry {
Packit fcad23
    /* Index values */
Packit fcad23
    @foreach $idx index@
Packit fcad23
     @if $idx.needlength@
Packit fcad23
    $idx.decl $idx[NNN];
Packit fcad23
    size_t ${idx}_len;
Packit fcad23
     @else@
Packit fcad23
    $idx.decl $idx;
Packit fcad23
     @end@
Packit fcad23
    @end@
Packit fcad23
Packit fcad23
    /* Column values */
Packit fcad23
    @foreach $c column@
Packit fcad23
    @if $c.readable@
Packit fcad23
     @if $c.needlength@
Packit fcad23
    $c.decl $c[NNN];
Packit fcad23
    size_t ${c}_len;
Packit fcad23
     @else@
Packit fcad23
    $c.decl $c;
Packit fcad23
     @end@
Packit fcad23
     @if $c.settable@
Packit fcad23
      @if !$c.rowstatus@
Packit fcad23
       @if $c.needlength@
Packit fcad23
    $c.decl old_$c[NNN];
Packit fcad23
    size_t old_${c}_len;
Packit fcad23
       @else@
Packit fcad23
    $c.decl old_$c;
Packit fcad23
       @end@
Packit fcad23
      @end@
Packit fcad23
     @end@
Packit fcad23
    @end@
Packit fcad23
    @end@
Packit fcad23
Packit fcad23
    int   valid;
Packit fcad23
};
Packit fcad23
Packit fcad23
/* create a new row in the table */
Packit fcad23
netsnmp_tdata_row *
Packit fcad23
${i}_createEntry(netsnmp_tdata *table_data
Packit fcad23
  @foreach $idx index@
Packit fcad23
    @if $idx.needlength@
Packit fcad23
                 , $idx.decl* $idx
Packit fcad23
                 , size_t ${idx}_len
Packit fcad23
    @else@
Packit fcad23
                 , $idx.decl  $idx
Packit fcad23
    @end@
Packit fcad23
  @end@
Packit fcad23
                ) {
Packit fcad23
    struct ${i}_entry *entry;
Packit fcad23
    netsnmp_tdata_row *row;
Packit fcad23
Packit fcad23
    entry = SNMP_MALLOC_TYPEDEF(struct ${i}_entry);
Packit fcad23
    if (!entry)
Packit fcad23
        return NULL;
Packit fcad23
Packit fcad23
    row = netsnmp_tdata_create_row();
Packit fcad23
    if (!row) {
Packit fcad23
        SNMP_FREE(entry);
Packit fcad23
        return NULL;
Packit fcad23
    }
Packit fcad23
    row->data = entry;
Packit fcad23
Packit fcad23
    DEBUGMSGT(("${i}:entry:create", "row 0x%x\n", (uintptr_t)row));
Packit fcad23
  @foreach $idx index@
Packit fcad23
   @if $idx.needlength@
Packit fcad23
    memcpy(entry->$idx, $idx, ${idx}_len);
Packit fcad23
    entry->${idx}_len = ${idx}_len;
Packit fcad23
    netsnmp_tdata_row_add_index( row, $idx.type,
Packit fcad23
                                 entry->$idx, ${idx}_len);
Packit fcad23
   @else@
Packit fcad23
    entry->$idx = $idx;
Packit fcad23
    netsnmp_tdata_row_add_index( row, $idx.type,
Packit fcad23
                                 &(entry->$idx),
Packit fcad23
                                 sizeof(entry->$idx));
Packit fcad23
   @end@
Packit fcad23
  @end@
Packit fcad23
    if (table_data)
Packit fcad23
        netsnmp_tdata_add_row( table_data, row );
Packit fcad23
    return row;
Packit fcad23
}
Packit fcad23
Packit fcad23
/* remove a row from the table */
Packit fcad23
void
Packit fcad23
${i}_removeEntry(netsnmp_tdata     *table_data, 
Packit fcad23
                 netsnmp_tdata_row *row) {
Packit fcad23
    struct ${i}_entry *entry;
Packit fcad23
Packit fcad23
    if (!row)
Packit fcad23
        return;    /* Nothing to remove */
Packit fcad23
Packit fcad23
    DEBUGMSGT(("${i}:entry:remove", "row 0x%x\n", (uintptr_t)row));
Packit fcad23
Packit fcad23
    entry = (struct ${i}_entry *)row->data;
Packit fcad23
    SNMP_FREE( entry );   /* XXX - release any other internal resources */
Packit fcad23
Packit fcad23
    if (table_data)
Packit fcad23
        netsnmp_tdata_remove_and_delete_row( table_data, row );
Packit fcad23
    else
Packit fcad23
        netsnmp_tdata_delete_row( row );    
Packit fcad23
}
Packit fcad23
Packit fcad23
@if "$cache" == 1 @
Packit fcad23
/* Example cache handling - set up table_data list from a suitable file */
Packit fcad23
int
Packit fcad23
${i}_load( netsnmp_cache *cache, void *vmagic ) {
Packit fcad23
    netsnmp_tdata     *table = (netsnmp_tdata *)vmagic;
Packit fcad23
    netsnmp_tdata_row *row;
Packit fcad23
    struct ${i}_entry *this;
Packit fcad23
    FILE *fp;
Packit fcad23
    char buf[STRMAX];
Packit fcad23
  @foreach $idx index@
Packit fcad23
    @if $idx.needlength@
Packit fcad23
    $idx.decl* $idx;
Packit fcad23
    size_t ${idx}_len;
Packit fcad23
    @else@
Packit fcad23
    $idx.decl  $idx;
Packit fcad23
    @end@
Packit fcad23
  @end@
Packit fcad23
Packit fcad23
    /* The basic load routine template assumes that the data to
Packit fcad23
       be reported is held in a file - with one row of the file
Packit fcad23
       for each row of the table.
Packit fcad23
          If your data is available via a different API, you
Packit fcad23
       should amend this initial block (and the control of the
Packit fcad23
       'while' loop) accordingly.
Packit fcad23
          'XXX' marks places where the template is incomplete and
Packit fcad23
       code will definitely need to be added. */
Packit fcad23
Packit fcad23
    fp = fopen( "/data/for/${i}", "r" );
Packit fcad23
    if ( !fp ) {
Packit fcad23
        return -1;
Packit fcad23
    }
Packit fcad23
    while ( fgets( buf, STRMAX, fp )) {
Packit fcad23
        /* XXX - Unpick 'buf' to extract the individual field values
Packit fcad23
                 (or at least the index values for this row) ... */
Packit fcad23
        row = ${i}_createEntry(table
Packit fcad23
  @foreach $idx index@
Packit fcad23
    @if $idx.needlength@
Packit fcad23
                         , $idx
Packit fcad23
                         , ${idx}_len
Packit fcad23
    @else@
Packit fcad23
                         , $idx
Packit fcad23
    @end@
Packit fcad23
  @end@
Packit fcad23
                        );
Packit fcad23
        if (row == NULL)
Packit fcad23
            continue;
Packit fcad23
        this = (struct ${i}_entry *)row->entry;
Packit fcad23
        /* XXX - ... and then populate the 'this' data structure with
Packit fcad23
                 column values (typically) extracted from 'buf' above */
Packit fcad23
    }
Packit fcad23
    fclose(fp);
Packit fcad23
    return 0;  /* OK */
Packit fcad23
}
Packit fcad23
Packit fcad23
void
Packit fcad23
${i}_free( netsnmp_cache *cache, void *vmagic ) {
Packit fcad23
    netsnmp_tdata     *table = (netsnmp_tdata *)vmagic;
Packit fcad23
    netsnmp_tdata_row *this;
Packit fcad23
Packit fcad23
    while ((this = netsnmp_tdata_get_first_row(table))) {
Packit fcad23
        netsnmp_tdata_remove_and_delete_row(table, this);
Packit fcad23
    }
Packit fcad23
}
Packit fcad23
@end@
Packit fcad23
Packit fcad23
/** handles requests for the $i table */
Packit fcad23
int
Packit fcad23
${i}_handler(
Packit fcad23
    netsnmp_mib_handler               *handler,
Packit fcad23
    netsnmp_handler_registration      *reginfo,
Packit fcad23
    netsnmp_agent_request_info        *reqinfo,
Packit fcad23
    netsnmp_request_info              *requests) {
Packit fcad23
Packit fcad23
    netsnmp_request_info       *request;
Packit fcad23
    netsnmp_table_request_info *table_info;
Packit fcad23
    netsnmp_tdata              *table_data;
Packit fcad23
    netsnmp_tdata_row          *table_row;
Packit fcad23
    struct ${i}_entry          *table_entry;
Packit fcad23
    int                         ret;
Packit fcad23
Packit fcad23
    DEBUGMSGTL(("${name}:handler", "Processing request (%d)\n", reqinfo->mode));
Packit fcad23
Packit fcad23
    switch (reqinfo->mode) {
Packit fcad23
        /*
Packit fcad23
         * Read-support (also covers GetNext requests)
Packit fcad23
         */
Packit fcad23
    case MODE_GET:
Packit fcad23
        for (request=requests; request; request=request->next) {
Packit fcad23
            if (request->processed)
Packit fcad23
                continue;
Packit fcad23
Packit fcad23
            table_entry = (struct ${i}_entry *)
Packit fcad23
                              netsnmp_tdata_extract_entry(request);
Packit fcad23
            table_info  =     netsnmp_extract_table_info( request);
Packit fcad23
    
Packit fcad23
            switch (table_info->colnum) {
Packit fcad23
            @foreach $c column@
Packit fcad23
            @if $c.readable@
Packit fcad23
            case COLUMN_$c.uc:
Packit fcad23
                if ( !table_entry ) {
Packit fcad23
                    netsnmp_set_request_error(reqinfo, request,
Packit fcad23
                                              SNMP_NOSUCHINSTANCE);
Packit fcad23
                    continue;
Packit fcad23
                }
Packit fcad23
            @if $c.needlength@
Packit fcad23
                snmp_set_var_typed_value( request->requestvb, $c.type,
Packit fcad23
                                          table_entry->$c,
Packit fcad23
                                          table_entry->${c}_len);
Packit fcad23
            @else@
Packit fcad23
                snmp_set_var_typed_integer( request->requestvb, $c.type,
Packit fcad23
                                            table_entry->$c);
Packit fcad23
            @end@
Packit fcad23
                break;
Packit fcad23
            @end@
Packit fcad23
            @end@
Packit fcad23
            default:
Packit fcad23
                netsnmp_set_request_error(reqinfo, request,
Packit fcad23
                                          SNMP_NOSUCHOBJECT);
Packit fcad23
                break;
Packit fcad23
            }
Packit fcad23
        }
Packit fcad23
        break;
Packit fcad23
Packit fcad23
@if $i.settable@
Packit fcad23
        /*
Packit fcad23
         * Write-support
Packit fcad23
         */
Packit fcad23
    case MODE_SET_RESERVE1:
Packit fcad23
        for (request=requests; request; request=request->next) {
Packit fcad23
            if (request->processed)
Packit fcad23
                continue;
Packit fcad23
Packit fcad23
            table_entry = (struct ${i}_entry *)
Packit fcad23
                              netsnmp_tdata_extract_entry(request);
Packit fcad23
            table_info  =     netsnmp_extract_table_info( request);
Packit fcad23
    
Packit fcad23
            switch (table_info->colnum) {
Packit fcad23
            @foreach $c column@
Packit fcad23
            @if $c.settable@
Packit fcad23
            case COLUMN_$c.uc:
Packit fcad23
            @if $c.rowstatus@
Packit fcad23
                ret = netsnmp_check_vb_rowstatus(request->requestvb,
Packit fcad23
                         (table_entry ? RS_ACTIVE : RS_NONEXISTENT ));
Packit fcad23
            @else@
Packit fcad23
            @if $c.needlength@
Packit fcad23
	        /* or possibly 'netsnmp_check_vb_type_and_size' */
Packit fcad23
                ret = netsnmp_check_vb_type_and_max_size(
Packit fcad23
                          request->requestvb, $c.type, sizeof(table_entry->$c));
Packit fcad23
            @else@
Packit fcad23
                /* or possibly 'netsnmp_check_vb_int_range' */
Packit fcad23
                ret = netsnmp_check_vb_int( request->requestvb );
Packit fcad23
            @end@
Packit fcad23
            @end@
Packit fcad23
                if ( ret != SNMP_ERR_NOERROR ) {
Packit fcad23
                    netsnmp_set_request_error( reqinfo, request, ret );
Packit fcad23
                    return SNMP_ERR_NOERROR;
Packit fcad23
                }
Packit fcad23
                break;
Packit fcad23
            @end@
Packit fcad23
            @end@
Packit fcad23
            default:
Packit fcad23
                netsnmp_set_request_error( reqinfo, request,
Packit fcad23
                                           SNMP_ERR_NOTWRITABLE );
Packit fcad23
                return SNMP_ERR_NOERROR;
Packit fcad23
            }
Packit fcad23
        }
Packit fcad23
        break;
Packit fcad23
Packit fcad23
    case MODE_SET_RESERVE2:
Packit fcad23
@if $i.creatable@
Packit fcad23
        for (request=requests; request; request=request->next) {
Packit fcad23
            if (request->processed)
Packit fcad23
                continue;
Packit fcad23
Packit fcad23
            table_row  = netsnmp_tdata_extract_row(  request);
Packit fcad23
            table_data = netsnmp_tdata_extract_table(request);
Packit fcad23
            table_info = netsnmp_extract_table_info( request);
Packit fcad23
    
Packit fcad23
            switch (table_info->colnum) {
Packit fcad23
@if $i.rowstatus@
Packit fcad23
            @foreach $c column@
Packit fcad23
            @if $c.rowstatus@
Packit fcad23
            case COLUMN_$c.uc:
Packit fcad23
                switch (*request->requestvb->val.integer) {
Packit fcad23
                case RS_CREATEANDGO:
Packit fcad23
                case RS_CREATEANDWAIT:
Packit fcad23
                    table_row = ${i}_createEntry(table_data
Packit fcad23
  @foreach $idx index@
Packit fcad23
    @if $idx.needlength@
Packit fcad23
                        ,  table_info->indexes->val.string
Packit fcad23
                        ,  table_info->indexes->val_len
Packit fcad23
    @else@
Packit fcad23
                        , *table_info->indexes->val.integer
Packit fcad23
    @end@
Packit fcad23
  @end@
Packit fcad23
                        );
Packit fcad23
                    if (table_row) {
Packit fcad23
                        netsnmp_insert_tdata_row( request, table_row );
Packit fcad23
                    } else {
Packit fcad23
                        netsnmp_set_request_error( reqinfo, request,
Packit fcad23
                                                   SNMP_ERR_RESOURCEUNAVAILABLE );
Packit fcad23
                        return SNMP_ERR_NOERROR;
Packit fcad23
                    }
Packit fcad23
                }
Packit fcad23
            @end@
Packit fcad23
            @end@
Packit fcad23
@else@
Packit fcad23
            @foreach $c column@
Packit fcad23
            @if $c.creatable@
Packit fcad23
            case COLUMN_$c.uc:
Packit fcad23
            @end@
Packit fcad23
            @end@
Packit fcad23
                if ( !table_row ) {
Packit fcad23
                    table_row = ${i}_createEntry(table_data
Packit fcad23
  @foreach $idx index@
Packit fcad23
    @if $idx.needlength@
Packit fcad23
                        ,  table_info->indexes->val.string
Packit fcad23
                        ,  table_info->indexes->val_len
Packit fcad23
    @else@
Packit fcad23
                        , *table_info->indexes->val.integer
Packit fcad23
    @end@
Packit fcad23
  @end@
Packit fcad23
                        );
Packit fcad23
                    if (table_row) {
Packit fcad23
                        netsnmp_insert_tdata_row( request, table_row );
Packit fcad23
                    } else {
Packit fcad23
                        netsnmp_set_request_error( reqinfo, request,
Packit fcad23
                                                   SNMP_ERR_RESOURCEUNAVAILABLE );
Packit fcad23
                        return SNMP_ERR_NOERROR;
Packit fcad23
                    }
Packit fcad23
                }
Packit fcad23
                break;
Packit fcad23
@end@
Packit fcad23
            }
Packit fcad23
        }
Packit fcad23
@end@
Packit fcad23
        break;
Packit fcad23
Packit fcad23
    case MODE_SET_FREE:
Packit fcad23
@if $i.creatable@
Packit fcad23
        for (request=requests; request; request=request->next) {
Packit fcad23
            if (request->processed)
Packit fcad23
                continue;
Packit fcad23
Packit fcad23
            table_entry = (struct ${i}_entry *)
Packit fcad23
                              netsnmp_tdata_extract_entry(request);
Packit fcad23
            table_row   =     netsnmp_tdata_extract_row(  request);
Packit fcad23
            table_data  =     netsnmp_tdata_extract_table(request);
Packit fcad23
            table_info  =     netsnmp_extract_table_info( request);
Packit fcad23
    
Packit fcad23
            switch (table_info->colnum) {
Packit fcad23
@if $i.rowstatus@
Packit fcad23
            @foreach $c column@
Packit fcad23
            @if $c.rowstatus@
Packit fcad23
            case COLUMN_$c.uc:
Packit fcad23
                switch (*request->requestvb->val.integer) {
Packit fcad23
                case RS_CREATEANDGO:
Packit fcad23
                case RS_CREATEANDWAIT:
Packit fcad23
                    if (table_entry && !table_entry->valid) {
Packit fcad23
                        ${i}_removeEntry(table_data, table_row );
Packit fcad23
                    }
Packit fcad23
                }
Packit fcad23
            @end@
Packit fcad23
            @end@
Packit fcad23
@else@
Packit fcad23
            @foreach $c column@
Packit fcad23
            @if $c.creatable@
Packit fcad23
            case COLUMN_$c.uc:
Packit fcad23
            @end@
Packit fcad23
            @end@
Packit fcad23
                if ( table_entry && !table_entry->valid ) {
Packit fcad23
                    ${i}_removeEntry(table_data, table_row );
Packit fcad23
                }
Packit fcad23
                break;
Packit fcad23
@end@
Packit fcad23
            }
Packit fcad23
        }
Packit fcad23
@end@
Packit fcad23
        break;
Packit fcad23
Packit fcad23
    case MODE_SET_ACTION:
Packit fcad23
        for (request=requests; request; request=request->next) {
Packit fcad23
            if (request->processed)
Packit fcad23
                continue;
Packit fcad23
Packit fcad23
            table_entry = (struct ${i}_entry *)
Packit fcad23
                              netsnmp_tdata_extract_entry(request);
Packit fcad23
            table_info  =     netsnmp_extract_table_info( request);
Packit fcad23
    
Packit fcad23
            switch (table_info->colnum) {
Packit fcad23
            @foreach $c column@
Packit fcad23
            @if $c.settable@
Packit fcad23
            @if !$c.rowstatus@
Packit fcad23
            case COLUMN_$c.uc:
Packit fcad23
                @if $c.needlength@
Packit fcad23
                memcpy( table_entry->old_$c,
Packit fcad23
                        table_entry->$c,
Packit fcad23
                        sizeof(table_entry->$c));
Packit fcad23
                table_entry->old_${c}_len =
Packit fcad23
                        table_entry->${c}_len;
Packit fcad23
                memset( table_entry->$c, 0,
Packit fcad23
                        sizeof(table_entry->$c));
Packit fcad23
                memcpy( table_entry->$c,
Packit fcad23
                        request->requestvb->val.string,
Packit fcad23
                        request->requestvb->val_len);
Packit fcad23
                table_entry->${c}_len =
Packit fcad23
                        request->requestvb->val_len;
Packit fcad23
                @else@
Packit fcad23
                table_entry->old_$c = table_entry->$c;
Packit fcad23
                table_entry->$c     = *request->requestvb->val.integer;
Packit fcad23
                @end@
Packit fcad23
                break;
Packit fcad23
            @end@
Packit fcad23
            @end@
Packit fcad23
            @end@
Packit fcad23
            }
Packit fcad23
        }
Packit fcad23
@if $i.rowstatus@
Packit fcad23
        /* Check the internal consistency of an active row */
Packit fcad23
        for (request=requests; request; request=request->next) {
Packit fcad23
            table_entry = (struct ${i}_entry *)
Packit fcad23
                              netsnmp_tdata_extract_entry(request);
Packit fcad23
            table_info  =     netsnmp_extract_table_info( request);
Packit fcad23
    
Packit fcad23
            switch (table_info->colnum) {
Packit fcad23
            @foreach $c column@
Packit fcad23
            @if $c.rowstatus@
Packit fcad23
            case COLUMN_$c.uc:
Packit fcad23
                switch (*request->requestvb->val.integer) {
Packit fcad23
                case RS_ACTIVE:
Packit fcad23
                case RS_CREATEANDGO:
Packit fcad23
                    if (/* XXX */) {
Packit fcad23
                        netsnmp_set_request_error( reqinfo, request,
Packit fcad23
                                                   SNMP_ERR_INCONSISTENTVALUE );
Packit fcad23
                        return SNMP_ERR_NOERROR;
Packit fcad23
                    }
Packit fcad23
                }
Packit fcad23
            @end@
Packit fcad23
            @end@
Packit fcad23
            }
Packit fcad23
        }
Packit fcad23
@end@
Packit fcad23
        break;
Packit fcad23
Packit fcad23
    case MODE_SET_UNDO:
Packit fcad23
        for (request=requests; request; request=request->next) {
Packit fcad23
            if (request->processed)
Packit fcad23
                continue;
Packit fcad23
Packit fcad23
            table_entry = (struct ${i}_entry *)
Packit fcad23
                              netsnmp_tdata_extract_entry(request);
Packit fcad23
            table_row   =     netsnmp_tdata_extract_row(  request);
Packit fcad23
            table_data  =     netsnmp_tdata_extract_table(request);
Packit fcad23
            table_info  =     netsnmp_extract_table_info( request);
Packit fcad23
    
Packit fcad23
            switch (table_info->colnum) {
Packit fcad23
            @foreach $c column@
Packit fcad23
            @if $c.settable@
Packit fcad23
            case COLUMN_$c.uc:
Packit fcad23
@if $i.rowstatus@
Packit fcad23
  @if $c.rowstatus@
Packit fcad23
                switch (*request->requestvb->val.integer) {
Packit fcad23
                case RS_CREATEANDGO:
Packit fcad23
                case RS_CREATEANDWAIT:
Packit fcad23
                    if (table_entry && !table_entry->valid) {
Packit fcad23
                        ${i}_removeEntry(table_data, table_row );
Packit fcad23
                    }
Packit fcad23
                }
Packit fcad23
  @else@
Packit fcad23
                @if $c.needlength@
Packit fcad23
                memcpy( table_entry->$c,
Packit fcad23
                        table_entry->old_$c,
Packit fcad23
                        sizeof(table_entry->$c));
Packit fcad23
                memset( table_entry->old_$c, 0,
Packit fcad23
                        sizeof(table_entry->$c));
Packit fcad23
                table_entry->${c}_len =
Packit fcad23
                        table_entry->old_${c}_len;
Packit fcad23
                @else@
Packit fcad23
                table_entry->$c     = table_entry->old_$c;
Packit fcad23
                table_entry->old_$c = 0;
Packit fcad23
                @end@
Packit fcad23
  @end@
Packit fcad23
@else@
Packit fcad23
  @if $c.creatable@
Packit fcad23
                if ( table_entry && !table_entry->valid ) {
Packit fcad23
                    ${i}_removeEntry(table_data, table_row );
Packit fcad23
                } else {
Packit fcad23
                    @if $c.needlength@
Packit fcad23
                    memcpy( table_entry->$c,
Packit fcad23
                            table_entry->old_$c,
Packit fcad23
                            sizeof(table_entry->$c));
Packit fcad23
                    memset( table_entry->old_$c, 0,
Packit fcad23
                            sizeof(table_entry->$c));
Packit fcad23
                    table_entry->${c}_len =
Packit fcad23
                            table_entry->old_${c}_len;
Packit fcad23
                    @else@
Packit fcad23
                    table_entry->$c     = table_entry->old_$c;
Packit fcad23
                    table_entry->old_$c = 0;
Packit fcad23
                    @end@
Packit fcad23
                }
Packit fcad23
  @else@
Packit fcad23
                @if $c.needlength@
Packit fcad23
                memcpy( table_entry->$c,
Packit fcad23
                        table_entry->old_$c,
Packit fcad23
                        sizeof(table_entry->$c));
Packit fcad23
                memset( table_entry->old_$c, 0,
Packit fcad23
                        sizeof(table_entry->$c));
Packit fcad23
                table_entry->${c}_len =
Packit fcad23
                        table_entry->old_${c}_len;
Packit fcad23
                @else@
Packit fcad23
                table_entry->$c     = table_entry->old_$c;
Packit fcad23
                table_entry->old_$c = 0;
Packit fcad23
                @end@
Packit fcad23
  @end@
Packit fcad23
@end@
Packit fcad23
                break;
Packit fcad23
            @end@
Packit fcad23
            @end@
Packit fcad23
            }
Packit fcad23
        }
Packit fcad23
        break;
Packit fcad23
Packit fcad23
    case MODE_SET_COMMIT:
Packit fcad23
@if $i.creatable@
Packit fcad23
        for (request=requests; request; request=request->next) {
Packit fcad23
            if (request->processed)
Packit fcad23
                continue;
Packit fcad23
Packit fcad23
            table_entry = (struct ${i}_entry *)
Packit fcad23
                              netsnmp_tdata_extract_entry(request);
Packit fcad23
@if $i.rowstatus@
Packit fcad23
            table_row   =     netsnmp_tdata_extract_row(  request);
Packit fcad23
            table_data  =     netsnmp_tdata_extract_table(request);
Packit fcad23
@end@
Packit fcad23
            table_info  =     netsnmp_extract_table_info(    request);
Packit fcad23
    
Packit fcad23
            switch (table_info->colnum) {
Packit fcad23
@if $i.rowstatus@
Packit fcad23
            @foreach $c column@
Packit fcad23
            @if $c.rowstatus@
Packit fcad23
            case COLUMN_$c.uc:
Packit fcad23
                switch (*request->requestvb->val.integer) {
Packit fcad23
                case RS_CREATEANDGO:
Packit fcad23
                    table_entry->valid = 1;
Packit fcad23
                    /* Fall-through */
Packit fcad23
                case RS_ACTIVE:
Packit fcad23
                    table_entry->$c = RS_ACTIVE;
Packit fcad23
                    break;
Packit fcad23
Packit fcad23
                case RS_CREATEANDWAIT:
Packit fcad23
                    table_entry->valid = 1;
Packit fcad23
                    /* Fall-through */
Packit fcad23
                case RS_NOTINSERVICE:
Packit fcad23
                    table_entry->$c = RS_NOTINSERVICE;
Packit fcad23
                    break;
Packit fcad23
Packit fcad23
                case RS_DESTROY:
Packit fcad23
                    ${i}_removeEntry(table_data, table_row );
Packit fcad23
                }
Packit fcad23
            @end@
Packit fcad23
            @end@
Packit fcad23
@else@
Packit fcad23
            @foreach $c column@
Packit fcad23
            @if $c.creatable@
Packit fcad23
            case COLUMN_$c.uc:
Packit fcad23
            @end@
Packit fcad23
            @end@
Packit fcad23
                if ( table_entry && !table_entry->valid ) {
Packit fcad23
                    table_entry->valid = 1;
Packit fcad23
                }
Packit fcad23
@end@
Packit fcad23
            }
Packit fcad23
        }
Packit fcad23
@end@
Packit fcad23
        break;
Packit fcad23
@end@
Packit fcad23
    }
Packit fcad23
    return SNMP_ERR_NOERROR;
Packit fcad23
}
Packit fcad23
@end@