Blame local/mib2c.container.conf

Packit fcad23
## -*- c -*-
Packit fcad23
## Portions of this file ar Copyright (C) Apple, Inc.
Packit fcad23
## Use is subject to license terms specified in the COPYING file
Packit fcad23
## distributed with the Net-SNMP package.
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.container.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
@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.container.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 <net-snmp/agent/net-snmp-agent-includes.h>
Packit fcad23
#include <net-snmp/agent/table_container.h>
Packit fcad23
#include "${name}.h"
Packit fcad23
Packit fcad23
@foreach $i table@
Packit fcad23
#ifdef $i.uc_USE_CACHE
Packit fcad23
static void ${i}_cache_free(netsnmp_cache * cache, void *magic);
Packit fcad23
static int ${i}_cache_load(netsnmp_cache * cache, void *vmagic);
Packit fcad23
#endif
Packit fcad23
@end@
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 = NULL;
Packit fcad23
    netsnmp_mib_handler             *handler = NULL;
Packit fcad23
    netsnmp_container               *container = NULL;
Packit fcad23
    netsnmp_table_registration_info *table_info = NULL;
Packit fcad23
#ifdef $i.uc_USE_CACHE
Packit fcad23
    netsnmp_cache  *cache = NULL;
Packit fcad23
#endif
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
    if (NULL == reg) {
Packit fcad23
        snmp_log(LOG_ERR,"error creating handler registration for $i\n");
Packit fcad23
        goto bail;
Packit fcad23
    }
Packit fcad23
@if $i.settable@
Packit fcad23
    /** should a set on a non-existent row create a new one? */
Packit fcad23
    /** reg->modes |= HANDLER_CAN_NOT_CREATE; */
Packit fcad23
@end@
Packit fcad23
Packit fcad23
    container  = netsnmp_container_find( "$i:table_container" );
Packit fcad23
    if (NULL == container) {
Packit fcad23
        snmp_log(LOG_ERR,"error creating container for $i\n");
Packit fcad23
        goto bail;
Packit fcad23
    }
Packit fcad23
Packit fcad23
    table_info = SNMP_MALLOC_TYPEDEF( netsnmp_table_registration_info );
Packit fcad23
    if (NULL == table_info) {
Packit fcad23
        snmp_log(LOG_ERR,"error allocating table registration for $i\n");
Packit fcad23
        goto bail;
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
    table_info->min_column = COLUMN_$first_column.uc;
Packit fcad23
    table_info->max_column = COLUMN_$last_column.uc;
Packit fcad23
    
Packit fcad23
    /*************************************************
Packit fcad23
     *
Packit fcad23
     * inject container_table helper
Packit fcad23
     */
Packit fcad23
    handler = netsnmp_container_table_handler_get(table_info, container,
Packit fcad23
                                                  TABLE_CONTAINER_KEY_NETSNMP_INDEX);
Packit fcad23
    if (NULL == handler) {
Packit fcad23
        snmp_log(LOG_ERR,"error allocating table registration for $i\n");
Packit fcad23
        goto bail;
Packit fcad23
    }
Packit fcad23
    if (SNMPERR_SUCCESS != netsnmp_inject_handler(reg, handler)) {
Packit fcad23
        snmp_log(LOG_ERR,"error injecting container_table handler for $i\n");
Packit fcad23
        goto bail;
Packit fcad23
    }
Packit fcad23
    handler = NULL; /* reg has it, will reuse below */
Packit fcad23
Packit fcad23
#ifdef $i.uc_USE_CACHE
Packit fcad23
    /*************************************************
Packit fcad23
     *
Packit fcad23
     * inject cache helper
Packit fcad23
     */
Packit fcad23
    cache = netsnmp_cache_create(30,    /* timeout in seconds */
Packit fcad23
                                 ${i}_cache_load, ${i}_cache_free,
Packit fcad23
                                 ${i}_oid, ${i}_oid_len);
Packit fcad23
Packit fcad23
    if (NULL == cache) {
Packit fcad23
        snmp_log(LOG_ERR, "error creating cache for $i\n");
Packit fcad23
        goto bail;
Packit fcad23
    }
Packit fcad23
    cache->flags = NETSNMP_CACHE_DONT_INVALIDATE_ON_SET;
Packit fcad23
    cache->magic = container;
Packit fcad23
Packit fcad23
    handler = netsnmp_cache_handler_get(cache);
Packit fcad23
    if (NULL == handler) {
Packit fcad23
        snmp_log(LOG_ERR, "error creating cache handler for $i\n");
Packit fcad23
        goto bail;
Packit fcad23
    }
Packit fcad23
Packit fcad23
    if (SNMPERR_SUCCESS != netsnmp_inject_handler(reg, handler)) {
Packit fcad23
        snmp_log(LOG_ERR,"error injecting cache handler for $i\n");
Packit fcad23
        goto bail;
Packit fcad23
    }
Packit fcad23
    handler = NULL; /* reg has it*/
Packit fcad23
#endif
Packit fcad23
Packit fcad23
    /*
Packit fcad23
     * register the table
Packit fcad23
     */
Packit fcad23
    if (SNMPERR_SUCCESS != netsnmp_register_table(reg, table_info)) {
Packit fcad23
        snmp_log(LOG_ERR,"error registering table handler for $i\n");
Packit fcad23
        reg = NULL; /* it was freed inside netsnmp_register_table */
Packit fcad23
        goto bail;
Packit fcad23
    }
Packit fcad23
Packit fcad23
    /*
Packit fcad23
     * Initialise the contents of the table here
Packit fcad23
     */
Packit fcad23
Packit fcad23
    
Packit fcad23
    return; /* ok */
Packit fcad23
Packit fcad23
    /*
Packit fcad23
     * Some error occurred during registration. Clean up and bail.
Packit fcad23
     */
Packit fcad23
  bail: /* not ok */
Packit fcad23
    
Packit fcad23
    if (handler)
Packit fcad23
        netsnmp_handler_free(handler);
Packit fcad23
Packit fcad23
#ifdef $i.uc_USE_CACHE
Packit fcad23
    if (cache)
Packit fcad23
        netsnmp_cache_free(cache);
Packit fcad23
#endif
Packit fcad23
    
Packit fcad23
    if (table_info)
Packit fcad23
        netsnmp_table_registration_info_free(table_info);
Packit fcad23
Packit fcad23
    if (container)
Packit fcad23
        CONTAINER_FREE(container);
Packit fcad23
Packit fcad23
    if (reg) 
Packit fcad23
        netsnmp_handler_registration_free(reg);
Packit fcad23
}
Packit fcad23
Packit fcad23
/** Typical data structure for a row entry */
Packit fcad23
typedef struct ${i}_entry_s {
Packit fcad23
    netsnmp_index oid_index;
Packit fcad23
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
} ${i}_entry;
Packit fcad23
Packit fcad23
/** create a new row in the table */
Packit fcad23
${i}_entry *
Packit fcad23
${i}_createEntry(netsnmp_container *container, 
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
    ${i}_entry *entry;
Packit fcad23
Packit fcad23
    entry = SNMP_MALLOC_TYPEDEF(${i}_entry);
Packit fcad23
    if (!entry)
Packit fcad23
        return NULL;
Packit fcad23
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
   @else@
Packit fcad23
    entry->$idx = $idx;
Packit fcad23
   @end@
Packit fcad23
  @end@
Packit fcad23
    entry->oid_index.len  = XXX;
Packit fcad23
    entry->oid_index.oids = YYY;
Packit fcad23
    CONTAINER_INSERT( container, entry );
Packit fcad23
    return entry;
Packit fcad23
}
Packit fcad23
Packit fcad23
/** remove a row from the table */
Packit fcad23
void
Packit fcad23
${i}_removeEntry(netsnmp_container *container, 
Packit fcad23
                 ${i}_entry *entry) {
Packit fcad23
Packit fcad23
    if (!entry)
Packit fcad23
        return;    /* Nothing to remove */
Packit fcad23
    CONTAINER_REMOVE( container, entry );
Packit fcad23
    if (entry)
Packit fcad23
        SNMP_FREE( entry );   /* XXX - release any other internal resources */
Packit fcad23
}
Packit fcad23
Packit fcad23
/** remove a row from the table */
Packit fcad23
void
Packit fcad23
${i}_freeEntry(${i}_entry *entry) {
Packit fcad23
Packit fcad23
    if (!entry)
Packit fcad23
        return;    /* Nothing to remove */
Packit fcad23
    SNMP_FREE( entry );   /* XXX - release any other internal resources */
Packit fcad23
}
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_container          *container;
Packit fcad23
    ${i}_entry                 *table_entry;
Packit fcad23
@if $i.settable@
Packit fcad23
    int                         ret;
Packit fcad23
@end@
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
            table_entry = (${i}_entry *)
Packit fcad23
                              netsnmp_container_table_extract_context(request);
Packit fcad23
            table_info  =     netsnmp_extract_table_info(request);
Packit fcad23
            if ((NULL == table_entry) || (NULL == table_info)) {
Packit fcad23
                snmp_log(LOG_ERR,
Packit fcad23
                         "could not extract table entry or info for $i\n");
Packit fcad23
                snmp_set_var_typed_value(request->requestvb, SNMP_ERR_GENERR,
Packit fcad23
                                         NULL, 0);
Packit fcad23
                continue;
Packit fcad23
            }
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
            table_entry = (${i}_entry *)
Packit fcad23
                              netsnmp_container_table_extract_context(request);
Packit fcad23
            table_info  =     netsnmp_extract_table_info(request);
Packit fcad23
            if ((NULL == table_entry) || (NULL == table_info)) {
Packit fcad23
                snmp_log(LOG_ERR,
Packit fcad23
                         "could not extract table entry or info for $i\n");
Packit fcad23
                snmp_set_var_typed_value(request->requestvb, SNMP_ERR_GENERR,
Packit fcad23
                                         NULL, 0);
Packit fcad23
                continue;
Packit fcad23
            }
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
            table_entry = (${i}_entry *)
Packit fcad23
                              netsnmp_container_table_extract_context(request);
Packit fcad23
            table_info  =     netsnmp_extract_table_info(request);
Packit fcad23
            if ((NULL == table_entry) || (NULL == table_info)) {
Packit fcad23
                snmp_log(LOG_ERR,
Packit fcad23
                         "could not extract table entry or info for $i\n");
Packit fcad23
                snmp_set_var_typed_value(request->requestvb, SNMP_ERR_GENERR,
Packit fcad23
                                         NULL, 0);
Packit fcad23
                continue;
Packit fcad23
            }
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
                    container   =     netsnmp_container_table_extract(request);
Packit fcad23
                    if (NULL == container) {
Packit fcad23
                        snmp_log(LOG_ERR,
Packit fcad23
                                 "could not extract table container for $i\n");
Packit fcad23
                        snmp_set_var_typed_value(request->requestvb,
Packit fcad23
                                                 SNMP_ERR_GENERR, NULL, 0);
Packit fcad23
                        continue;
Packit fcad23
                    }
Packit fcad23
                    table_entry = ${i}_createEntry(container
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_container_table_insert_row( request, table_entry );
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_entry ) {
Packit fcad23
                    container   =     netsnmp_container_table_extract(request);
Packit fcad23
                    if (NULL == container) {
Packit fcad23
                        snmp_log(LOG_ERR,
Packit fcad23
                                 "could not extract table container for $i\n");
Packit fcad23
                        snmp_set_var_typed_value(request->requestvb,
Packit fcad23
                                                 SNMP_ERR_GENERR, NULL, 0);
Packit fcad23
                        continue;
Packit fcad23
                    }
Packit fcad23
                    table_entry = ${i}_createEntry(container
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_container_table_insert_row( request, table_entry );
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
            container   =     netsnmp_container_table_extract(request);
Packit fcad23
            if (NULL == container) {
Packit fcad23
                snmp_log(LOG_ERR,
Packit fcad23
                         "could not extract table container for $i\n");
Packit fcad23
                snmp_set_var_typed_value(request->requestvb,
Packit fcad23
                                         SNMP_ERR_GENERR, NULL, 0);
Packit fcad23
                continue;
Packit fcad23
            }
Packit fcad23
            table_entry = (${i}_entry *)
Packit fcad23
                              netsnmp_container_table_extract_context(request);
Packit fcad23
            table_info  =     netsnmp_extract_table_info(request);
Packit fcad23
            if ((NULL == table_entry) || (NULL == table_info)) {
Packit fcad23
                snmp_log(LOG_ERR,
Packit fcad23
                         "could not extract table entry or info for $i\n");
Packit fcad23
                snmp_set_var_typed_value(request->requestvb, SNMP_ERR_GENERR,
Packit fcad23
                                         NULL, 0);
Packit fcad23
                continue;
Packit fcad23
            }
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(container, 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(container, 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
            if (request->processed)
Packit fcad23
               continue;
Packit fcad23
            table_entry = (${i}_entry *)
Packit fcad23
                              netsnmp_container_table_extract_context(request);
Packit fcad23
            table_info  =     netsnmp_extract_table_info(request);
Packit fcad23
            if ((NULL == table_entry) || (NULL == table_info)) {
Packit fcad23
                snmp_log(LOG_ERR,
Packit fcad23
                         "could not extract table entry or info for $i\n");
Packit fcad23
                snmp_set_var_typed_value(request->requestvb, SNMP_ERR_GENERR,
Packit fcad23
                                         NULL, 0);
Packit fcad23
                continue;
Packit fcad23
            }
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
            if (request->processed)
Packit fcad23
               continue;
Packit fcad23
            table_entry = (${i}_entry *)
Packit fcad23
                              netsnmp_container_table_extract_context(request);
Packit fcad23
            table_info  =     netsnmp_extract_table_info(request);
Packit fcad23
            if ((NULL == table_entry) || (NULL == table_info)) {
Packit fcad23
                snmp_log(LOG_ERR,
Packit fcad23
                         "could not extract table entry or info for $i\n");
Packit fcad23
                snmp_set_var_typed_value(request->requestvb, SNMP_ERR_GENERR,
Packit fcad23
                                         NULL, 0);
Packit fcad23
                continue;
Packit fcad23
            }
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
            container   =     netsnmp_container_table_extract(request);
Packit fcad23
            if (NULL == container) {
Packit fcad23
                snmp_log(LOG_ERR,
Packit fcad23
                         "could not extract table container for $i\n");
Packit fcad23
                snmp_set_var_typed_value(request->requestvb,
Packit fcad23
                                         SNMP_ERR_GENERR, NULL, 0);
Packit fcad23
                continue;
Packit fcad23
            }
Packit fcad23
            table_entry = (${i}_entry *)
Packit fcad23
                              netsnmp_container_table_extract_context(request);
Packit fcad23
            table_info  =     netsnmp_extract_table_info(request);
Packit fcad23
            if ((NULL == table_entry) || (NULL == table_info)) {
Packit fcad23
                snmp_log(LOG_ERR,
Packit fcad23
                         "could not extract table entry or info for $i\n");
Packit fcad23
                snmp_set_var_typed_value(request->requestvb, SNMP_ERR_GENERR,
Packit fcad23
                                         NULL, 0);
Packit fcad23
                continue;
Packit fcad23
            }
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(container, 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(container, 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
            table_entry = (${i}_entry *)
Packit fcad23
                              netsnmp_container_table_extract_context(request);
Packit fcad23
            table_info  =     netsnmp_extract_table_info(request);
Packit fcad23
            if ((NULL == table_entry) || (NULL == table_info)) {
Packit fcad23
                snmp_log(LOG_ERR,
Packit fcad23
                         "could not extract table entry or info for $i\n");
Packit fcad23
                snmp_set_var_typed_value(request->requestvb, SNMP_ERR_GENERR,
Packit fcad23
                                         NULL, 0);
Packit fcad23
                continue;
Packit fcad23
            }
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
                    container = netsnmp_container_table_extract(request);
Packit fcad23
                    if (NULL == container) {
Packit fcad23
                        snmp_log(LOG_ERR,
Packit fcad23
                                 "could not extract table container for $i\n");
Packit fcad23
                        snmp_set_var_typed_value(request->requestvb,
Packit fcad23
                                                 SNMP_ERR_GENERR, NULL, 0);
Packit fcad23
                        continue;
Packit fcad23
                    }
Packit fcad23
                    ${i}_removeEntry(container, 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
#ifdef $i.uc_USE_CACHE
Packit fcad23
/**
Packit fcad23
 * @internal
Packit fcad23
 */
Packit fcad23
static int
Packit fcad23
${i}_cache_load(netsnmp_cache * cache, void *vmagic)
Packit fcad23
{
Packit fcad23
    netsnmp_container *container;
Packit fcad23
    
Packit fcad23
    DEBUGMSGTL(("internal:${i}:_cache_load", "called\n"));
Packit fcad23
Packit fcad23
    if ((NULL == cache) || (NULL == cache->magic)) {
Packit fcad23
        snmp_log(LOG_ERR, "invalid cache for ${i}_cache_load\n");
Packit fcad23
        return -1;
Packit fcad23
    }
Packit fcad23
    container = (netsnmp_container *)cache->magic;
Packit fcad23
Packit fcad23
    /** should only be called for an invalid or expired cache */
Packit fcad23
    netsnmp_assert((0 == cache->valid) || (1 == cache->expired));
Packit fcad23
Packit fcad23
    /*
Packit fcad23
     * load cache here (or call function to do it)
Packit fcad23
     */
Packit fcad23
    /** CONTAINER_INSERT(container, record); */
Packit fcad23
Packit fcad23
    return 0;
Packit fcad23
}                               /* _cache_load */
Packit fcad23
Packit fcad23
/**
Packit fcad23
 * @Internal
Packit fcad23
 */
Packit fcad23
/** remove a row from the table */
Packit fcad23
static void
Packit fcad23
${i}_freeEntry_cb(${i}_entry *entry, void *magic) {
Packit fcad23
Packit fcad23
    ${i}_freeEntry(entry);
Packit fcad23
}
Packit fcad23
Packit fcad23
/**
Packit fcad23
 * @internal
Packit fcad23
 */
Packit fcad23
static void
Packit fcad23
${i}_cache_free(netsnmp_cache * cache, void *magic)
Packit fcad23
{
Packit fcad23
    netsnmp_container *container;
Packit fcad23
Packit fcad23
    DEBUGMSGTL(("internal:${i}:_cache_free", "called\n"));
Packit fcad23
Packit fcad23
    if ((NULL == cache) || (NULL == cache->magic)) {
Packit fcad23
        snmp_log(LOG_ERR, "invalid cache in ${i}_cache_free\n");
Packit fcad23
        return;
Packit fcad23
    }
Packit fcad23
    container = (netsnmp_container *) cache->magic;
Packit fcad23
Packit fcad23
    /*
Packit fcad23
     * empty (but don't free) cache here
Packit fcad23
     */
Packit fcad23
    CONTAINER_CLEAR(container,
Packit fcad23
                    (netsnmp_container_obj_func*)${i}_freeEntry_cb,
Packit fcad23
                    NULL);
Packit fcad23
}                               /* _cache_free */
Packit fcad23
#endif /* $i.uc_USE_CACHE */
Packit fcad23
@end@