Blame local/mib2c.raw-table.conf

Packit fcad23
## -*- c -*-
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.raw-table.conf
Packit fcad23
 */
Packit fcad23
#ifndef $name.uc_H
Packit fcad23
#define $name.uc_H
Packit fcad23
Packit fcad23
void init_$name(void);
Packit fcad23
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.raw-table.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
@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
/* column number definitions for table $i */
Packit fcad23
  @foreach $c column@
Packit fcad23
#define COLUMN_$c.uc		$c.subid
Packit fcad23
  @end@
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 nonindex@
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
static struct ${i}_entry *
Packit fcad23
${i}_createEntry( int dummy
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
Packit fcad23
    entry = SNMP_MALLOC_TYPEDEF(struct ${i}_entry);
Packit fcad23
    if (!entry)
Packit fcad23
        return NULL;
Packit fcad23
Packit fcad23
    /* XXX - insert entry into local data structure */
Packit fcad23
    return entry;
Packit fcad23
}
Packit fcad23
Packit fcad23
/* remove a row from the table */
Packit fcad23
static void
Packit fcad23
${i}_removeEntry(struct ${i}_entry *entry) {
Packit fcad23
    if (!entry)
Packit fcad23
        return;    /* Nothing to remove */
Packit fcad23
Packit fcad23
    /* XXX - remove entry from local data structure */
Packit fcad23
Packit fcad23
    if (entry)
Packit fcad23
        SNMP_FREE( entry );   /* XXX - release any other internal resources */
Packit fcad23
}
Packit fcad23
Packit fcad23
Packit fcad23
/** determine the appropriate row for an exact request */
Packit fcad23
static struct ${i}_entry *
Packit fcad23
${i}_get_entry( netsnmp_variable_list *indexes ) {
Packit fcad23
    struct ${i}_entry *row = NULL;
Packit fcad23
Packit fcad23
    /* XXX - Use the 'indexes' parameter to retrieve the data
Packit fcad23
       structure for the requested row, and return this. */
Packit fcad23
    return row;
Packit fcad23
}
Packit fcad23
Packit fcad23
/** determine the appropriate row for an fuzzy request */
Packit fcad23
static struct ${i}_entry *
Packit fcad23
${i}_get_next_entry( netsnmp_handler_registration *reginfo,
Packit fcad23
                     netsnmp_request_info         *request,
Packit fcad23
                     int                           column,
Packit fcad23
                     netsnmp_variable_list        *indexes ) {
Packit fcad23
    struct ${i}_entry *row = NULL;
Packit fcad23
    oid             build_space[MAX_OID_LEN];
Packit fcad23
    size_t          build_space_len = 0;
Packit fcad23
    size_t          index_oid_len = 0;
Packit fcad23
Packit fcad23
    /* XXX - Use the 'indexes' parameter to identify the
Packit fcad23
             next row in the table.... */
Packit fcad23
Packit fcad23
    /* XXX   .... update the 'indexes' parameter with the
Packit fcad23
             appropriate index values ... */
Packit fcad23
Packit fcad23
    /* ... and update the requested OID to match this instance */
Packit fcad23
    memcpy(build_space, reginfo->rootoid,   /* registered oid */
Packit fcad23
                        reginfo->rootoid_len * sizeof(oid));
Packit fcad23
    build_space_len = reginfo->rootoid_len;
Packit fcad23
    build_space[build_space_len++] = 1;  /* entry */
Packit fcad23
    build_space[build_space_len++] = column; /* column */
Packit fcad23
    build_oid_noalloc(build_space + build_space_len,
Packit fcad23
                      MAX_OID_LEN - build_space_len, &index_oid_len,
Packit fcad23
                      NULL, 0, indexes);
Packit fcad23
    snmp_set_var_objid(request->requestvb, build_space,
Packit fcad23
                       build_space_len + index_oid_len);
Packit fcad23
Packit fcad23
    /*  Finally, return the data structure for this row */
Packit fcad23
    return row;
Packit fcad23
}
Packit fcad23
Packit fcad23
Packit fcad23
/** handles requests for the $i table */
Packit fcad23
static 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
    struct ${i}_entry          *table_entry;
Packit fcad23
    @if $i.settable@
Packit fcad23
    int                         ret;
Packit fcad23
    @end@
Packit fcad23
Packit fcad23
    switch (reqinfo->mode) {
Packit fcad23
        /*
Packit fcad23
         * Read-support
Packit fcad23
         */
Packit fcad23
    case MODE_GET:
Packit fcad23
        for (request=requests; request; request=request->next) {
Packit fcad23
            table_info  =     netsnmp_extract_table_info( request);
Packit fcad23
            table_entry =     ${i}_get_entry( table_info->indexes );
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
    case MODE_GETNEXT:
Packit fcad23
        for (request=requests; request; request=request->next) {
Packit fcad23
            table_info  =     netsnmp_extract_table_info( request);
Packit fcad23
            table_entry =     ${i}_get_next_entry( reginfo, request,
Packit fcad23
                                   table_info->colnum, table_info->indexes );
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
            table_info  =     netsnmp_extract_table_info( request);
Packit fcad23
            table_entry =     ${i}_get_entry( table_info->indexes );
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
            table_info = netsnmp_extract_table_info( request);
Packit fcad23
            table_entry =     ${i}_get_entry( table_info->indexes );
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_entry = ${i}_createEntry( 0
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_entry ) {
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_entry ) {
Packit fcad23
                    table_entry = ${i}_createEntry( 0
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_entry ) {
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
            table_info  =     netsnmp_extract_table_info( request);
Packit fcad23
            table_entry =     ${i}_get_entry( table_info->indexes );
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_entry);
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_entry);
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
            table_info  =     netsnmp_extract_table_info( request);
Packit fcad23
            table_entry =     ${i}_get_entry( table_info->indexes );
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_info  =     netsnmp_extract_table_info( request);
Packit fcad23
            table_entry =     ${i}_get_entry( table_info->indexes );
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
            table_info  =     netsnmp_extract_table_info( request);
Packit fcad23
            table_entry =     ${i}_get_entry( table_info->indexes );
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_entry);
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_entry);
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
            table_info  =     netsnmp_extract_table_info(    request);
Packit fcad23
            table_entry =     ${i}_get_entry( table_info->indexes );
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_entry);
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
Packit fcad23
/** Initialize the $i table by defining its contents and how it's structured */
Packit fcad23
static void
Packit fcad23
initialize_table_$i(void)
Packit fcad23
{
Packit fcad23
    const oid ${i}_oid[] = {$i.commaoid};
Packit fcad23
    netsnmp_handler_registration    *reg;
Packit fcad23
    netsnmp_table_registration_info *table_info;
Packit fcad23
Packit fcad23
    reg = netsnmp_create_handler_registration(
Packit fcad23
              "$i",     ${i}_handler,
Packit fcad23
              ${i}_oid, OID_LENGTH(${i}_oid),
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_info = SNMP_MALLOC_TYPEDEF( netsnmp_table_registration_info );
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_register_table( reg, table_info );
Packit fcad23
Packit fcad23
    /* Initialise the contents of the table here */
Packit fcad23
}
Packit fcad23
Packit fcad23
@end@
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
}