Blame local/mib2c.iterate_access.conf

Packit Service b38f0b
## -*- c -*-
Packit Service b38f0b
######################################################################
Packit Service b38f0b
## Do the .h file
Packit Service b38f0b
######################################################################
Packit Service b38f0b
@open ${name}.h@
Packit Service b38f0b
/*
Packit Service b38f0b
 * Note: this file originally auto-generated by mib2c
Packit Service b38f0b
 * using mib2c.iterate_access.conf
Packit Service b38f0b
 */
Packit Service b38f0b
#ifndef $name.uc_H
Packit Service b38f0b
#define $name.uc_H
Packit Service b38f0b
Packit Service b38f0b
/** other required module components */
Packit Service b38f0b
config_require(${name}_access)
Packit Service b38f0b
config_require(${name}_checkfns)
Packit Service b38f0b
Packit Service b38f0b
/* function declarations */
Packit Service b38f0b
void init_$name(void);
Packit Service b38f0b
@foreach $i table@
Packit Service b38f0b
void initialize_table_$i(void);
Packit Service b38f0b
Netsnmp_Node_Handler ${i}_handler;
Packit Service b38f0b
Packit Service b38f0b
@end@
Packit Service b38f0b
@foreach $i table@
Packit Service b38f0b
Packit Service b38f0b
/* column number definitions for table $i */
Packit Service b38f0b
#include "${name}_columns.h"
Packit Service b38f0b
@run mib2c.column_defines.conf@
Packit Service b38f0b
Packit Service b38f0b
/* enum definions */
Packit Service b38f0b
#include "${name}_enums.h"
Packit Service b38f0b
@run mib2c.column_enums.conf@
Packit Service b38f0b
Packit Service b38f0b
@end@
Packit Service b38f0b
#endif /** $name.uc_H */
Packit Service b38f0b
######################################################################
Packit Service b38f0b
## Do the .c file
Packit Service b38f0b
######################################################################
Packit Service b38f0b
@open ${name}.c@
Packit Service b38f0b
/*
Packit Service b38f0b
 * Note: this file originally auto-generated by mib2c
Packit Service b38f0b
 * using mib2c.iterate_access.conf
Packit Service b38f0b
 */
Packit Service b38f0b
Packit Service b38f0b
#include <net-snmp/net-snmp-config.h>
Packit Service b38f0b
#include <net-snmp/net-snmp-includes.h>
Packit Service b38f0b
#include <net-snmp/agent/net-snmp-agent-includes.h>
Packit Service b38f0b
#include "${name}.h"
Packit Service b38f0b
#include "${name}_checkfns.h"
Packit Service b38f0b
#include "${name}_access.h"
Packit Service b38f0b
Packit Service b38f0b
static netsnmp_oid_stash_node *undoStorage = NULL;
Packit Service b38f0b
static netsnmp_oid_stash_node *commitStorage = NULL;
Packit Service b38f0b
Packit Service b38f0b
struct undoInfo {
Packit Service b38f0b
   void *ptr;
Packit Service b38f0b
   size_t len;
Packit Service b38f0b
};
Packit Service b38f0b
Packit Service b38f0b
struct commitInfo {
Packit Service b38f0b
   void *data_context;
Packit Service b38f0b
   int have_committed;
Packit Service b38f0b
   int new_row;
Packit Service b38f0b
};
Packit Service b38f0b
Packit Service b38f0b
void
Packit Service b38f0b
${name}_free_undoInfo(void *vptr) {
Packit Service b38f0b
    struct undoInfo *ui = vptr;
Packit Service b38f0b
    if (!ui)
Packit Service b38f0b
        return;
Packit Service b38f0b
    SNMP_FREE(ui->ptr);
Packit Service b38f0b
    SNMP_FREE(ui);
Packit Service b38f0b
}
Packit Service b38f0b
Packit Service b38f0b
@foreach $i table@
Packit Service b38f0b
/** Initialize the $i table by defining its contents and how it's structured */
Packit Service b38f0b
void
Packit Service b38f0b
initialize_table_$i(void)
Packit Service b38f0b
{
Packit Service b38f0b
    const oid ${i}_oid[] = {$i.commaoid};
Packit Service b38f0b
    netsnmp_table_registration_info *table_info;
Packit Service b38f0b
    netsnmp_handler_registration *my_handler;
Packit Service b38f0b
    netsnmp_iterator_info *iinfo;
Packit Service b38f0b
Packit Service b38f0b
    DEBUGMSGTL(("${name}:init", "initializing table $i\n"));
Packit Service b38f0b
Packit Service b38f0b
    /** create the table registration information structures */
Packit Service b38f0b
    table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info);
Packit Service b38f0b
    iinfo = SNMP_MALLOC_TYPEDEF(netsnmp_iterator_info);
Packit Service b38f0b
Packit Service b38f0b
    my_handler = netsnmp_create_handler_registration("$i",
Packit Service b38f0b
                                             ${i}_handler,
Packit Service b38f0b
                                             ${i}_oid,
Packit Service b38f0b
                                             OID_LENGTH(${i}_oid),
Packit Service b38f0b
@if $i.settable@
Packit Service b38f0b
                                             HANDLER_CAN_RWRITE
Packit Service b38f0b
@else@
Packit Service b38f0b
                                             HANDLER_CAN_RONLY
Packit Service b38f0b
@end@
Packit Service b38f0b
                                             );
Packit Service b38f0b
            
Packit Service b38f0b
    if (!my_handler || !table_info || !iinfo) {
Packit Service b38f0b
        snmp_log(LOG_ERR, "malloc failed in initialize_table_$i");
Packit Service b38f0b
        return; /** Serious error. */
Packit Service b38f0b
    }
Packit Service b38f0b
Packit Service b38f0b
    /***************************************************
Packit Service b38f0b
     * Setting up the table's definition
Packit Service b38f0b
     */
Packit Service b38f0b
    netsnmp_table_helper_add_indexes(table_info,
Packit Service b38f0b
    @foreach $idx index@
Packit Service b38f0b
                                  $idx.type, /** index: $idx */
Packit Service b38f0b
    @end@
Packit Service b38f0b
                             0);
Packit Service b38f0b
Packit Service b38f0b
    /** Define the minimum and maximum accessible columns.  This
Packit Service b38f0b
        optimizes retrieval. */
Packit Service b38f0b
    @eval $minv = 0xffffffff@
Packit Service b38f0b
    @eval $maxv = 0@
Packit Service b38f0b
    @foreach $c column@
Packit Service b38f0b
        @if $c.access =~ /(Read|Create)/@
Packit Service b38f0b
          @eval $minv = min($minv, $c.subid)@
Packit Service b38f0b
          @eval $maxv = max($maxv, $c.subid)@
Packit Service b38f0b
        @end@
Packit Service b38f0b
    @end@
Packit Service b38f0b
    table_info->min_column = $minv;
Packit Service b38f0b
    table_info->max_column = $maxv;
Packit Service b38f0b
Packit Service b38f0b
    /** iterator access routines */
Packit Service b38f0b
    iinfo->get_first_data_point = ${i}_get_first_data_point;
Packit Service b38f0b
    iinfo->get_next_data_point = ${i}_get_next_data_point;
Packit Service b38f0b
Packit Service b38f0b
    /** you may wish to set these as well */
Packit Service b38f0b
#ifdef MAYBE_USE_THESE
Packit Service b38f0b
    iinfo->make_data_context = ${i}_context_convert_function;
Packit Service b38f0b
    iinfo->free_data_context = ${i}_data_free;
Packit Service b38f0b
Packit Service b38f0b
    /** pick *only* one of these if you use them */
Packit Service b38f0b
    iinfo->free_loop_context = ${i}_loop_free;
Packit Service b38f0b
    iinfo->free_loop_context_at_end = ${i}_loop_free;
Packit Service b38f0b
#endif
Packit Service b38f0b
Packit Service b38f0b
    /** tie the two structures together */
Packit Service b38f0b
    iinfo->table_reginfo = table_info;
Packit Service b38f0b
Packit Service b38f0b
    /***************************************************
Packit Service b38f0b
     * registering the table with the master agent
Packit Service b38f0b
     */
Packit Service b38f0b
    DEBUGMSGTL(("initialize_table_$i",
Packit Service b38f0b
                "Registering table $i as a table iterator\n"));		 
Packit Service b38f0b
    netsnmp_register_table_iterator(my_handler, iinfo);
Packit Service b38f0b
}
Packit Service b38f0b
@end@
Packit Service b38f0b
Packit Service b38f0b
/** Initializes the $name module */
Packit Service b38f0b
void
Packit Service b38f0b
init_$name(void)
Packit Service b38f0b
{
Packit Service b38f0b
Packit Service b38f0b
  /** here we initialize all the tables we're planning on supporting */
Packit Service b38f0b
  @foreach $i table@
Packit Service b38f0b
    initialize_table_$i();
Packit Service b38f0b
  @end@
Packit Service b38f0b
}
Packit Service b38f0b
@foreach $i table@
Packit Service b38f0b
Packit Service b38f0b
/** handles requests for the $i table, if anything else needs to be done */
Packit Service b38f0b
int
Packit Service b38f0b
${i}_handler(
Packit Service b38f0b
    netsnmp_mib_handler               *handler,
Packit Service b38f0b
    netsnmp_handler_registration      *reginfo,
Packit Service b38f0b
    netsnmp_agent_request_info        *reqinfo,
Packit Service b38f0b
    netsnmp_request_info              *requests) {
Packit Service b38f0b
Packit Service b38f0b
    netsnmp_request_info *request;
Packit Service b38f0b
    netsnmp_table_request_info *table_info;
Packit Service b38f0b
    netsnmp_variable_list *var;
Packit Service b38f0b
    struct commitInfo *ci = NULL;
Packit Service b38f0b
Packit Service b38f0b
    void *data_context = NULL;
Packit Service b38f0b
Packit Service b38f0b
    /** column and row index encoded portion */
Packit Service b38f0b
    const oid * const suffix =
Packit Service b38f0b
        requests->requestvb->name + reginfo->rootoid_len + 1;
Packit Service b38f0b
    const size_t suffix_len = requests->requestvb->name_length -
Packit Service b38f0b
        (reginfo->rootoid_len + 1);
Packit Service b38f0b
    
Packit Service b38f0b
    DEBUGMSGTL(("${name}:handler", "Processing request (%d)\n", reqinfo->mode));
Packit Service b38f0b
Packit Service b38f0b
    for(request = requests; request; request = request->next) {
Packit Service b38f0b
        var = request->requestvb;
Packit Service b38f0b
        if (request->processed != 0)
Packit Service b38f0b
            continue;
Packit Service b38f0b
Packit Service b38f0b
        switch (reqinfo->mode) {
Packit Service b38f0b
        case MODE_GET:
Packit Service b38f0b
            data_context =  netsnmp_extract_iterator_context(request);
Packit Service b38f0b
            if (data_context == NULL) {
Packit Service b38f0b
                netsnmp_set_request_error(reqinfo, request,
Packit Service b38f0b
                                          SNMP_NOSUCHINSTANCE);
Packit Service b38f0b
                continue;
Packit Service b38f0b
            }
Packit Service b38f0b
            break;
Packit Service b38f0b
Packit Service b38f0b
@if $i.settable@
Packit Service b38f0b
        case MODE_SET_RESERVE1:
Packit Service b38f0b
            data_context =  netsnmp_extract_iterator_context(request);
Packit Service b38f0b
@if !$i.creatable@
Packit Service b38f0b
            if (data_context == NULL) {
Packit Service b38f0b
                netsnmp_set_request_error(reqinfo, request,
Packit Service b38f0b
                                          SNMP_ERR_NOCREATION);
Packit Service b38f0b
                continue;
Packit Service b38f0b
            }
Packit Service b38f0b
@end@
Packit Service b38f0b
            break;
Packit Service b38f0b
Packit Service b38f0b
        default: /* == the other SET modes */
Packit Service b38f0b
            ci = netsnmp_oid_stash_get_data(commitStorage,
Packit Service b38f0b
                                            suffix+1, suffix_len-1);
Packit Service b38f0b
            break;
Packit Service b38f0b
@end@
Packit Service b38f0b
        }
Packit Service b38f0b
Packit Service b38f0b
        /** extracts the information about the table from the request */
Packit Service b38f0b
        table_info = netsnmp_extract_table_info(request);
Packit Service b38f0b
        /** table_info->colnum contains the column number requested */
Packit Service b38f0b
        /** table_info->indexes contains a linked list of snmp variable
Packit Service b38f0b
           bindings for the indexes of the table.  Values in the list
Packit Service b38f0b
           have been set corresponding to the indexes of the
Packit Service b38f0b
           request */
Packit Service b38f0b
        if (table_info == NULL) {
Packit Service b38f0b
            continue;
Packit Service b38f0b
        }
Packit Service b38f0b
Packit Service b38f0b
        switch(reqinfo->mode) {
Packit Service b38f0b
            case MODE_GET:
Packit Service b38f0b
                switch(table_info->colnum) {
Packit Service b38f0b
                    @foreach $c column@
Packit Service b38f0b
                        @if $c.access =~ /(Read|Create)/@
Packit Service b38f0b
                    case COLUMN_$c.uc:
Packit Service b38f0b
                            {
Packit Service b38f0b
                                $c.decl *retval;
Packit Service b38f0b
                                size_t retval_len = 0;
Packit Service b38f0b
                                retval = get_$c(data_context, &retval_len);
Packit Service b38f0b
                                if (retval)
Packit Service b38f0b
                                    snmp_set_var_typed_value(var, $c.type,
Packit Service b38f0b
                                                             retval,
Packit Service b38f0b
                                                             retval_len);
Packit Service b38f0b
                            }
Packit Service b38f0b
                        break;
Packit Service b38f0b
Packit Service b38f0b
                        @end@
Packit Service b38f0b
                    @end@
Packit Service b38f0b
                    default:
Packit Service b38f0b
                /** We shouldn't get here */
Packit Service b38f0b
                        snmp_log(LOG_ERR, "problem encountered in ${i}_handler: unknown column\n");
Packit Service b38f0b
                }
Packit Service b38f0b
                break;
Packit Service b38f0b
Packit Service b38f0b
@if $i.settable@
Packit Service b38f0b
            case MODE_SET_RESERVE1:
Packit Service b38f0b
                ci = netsnmp_oid_stash_get_data(commitStorage,
Packit Service b38f0b
                                                suffix+1, suffix_len-1);
Packit Service b38f0b
                
Packit Service b38f0b
                if (!ci) {
Packit Service b38f0b
                    /** create the commit storage info */
Packit Service b38f0b
                    ci = SNMP_MALLOC_STRUCT(commitInfo);
Packit Service b38f0b
                    if (!data_context) {
Packit Service b38f0b
                        ci->data_context = ${i}_create_data_context(table_info->indexes, table_info->colnum);
Packit Service b38f0b
                        ci->new_row = 1;
Packit Service b38f0b
                    } else {
Packit Service b38f0b
                        ci->data_context = data_context;
Packit Service b38f0b
                    }
Packit Service b38f0b
                    netsnmp_oid_stash_add_data(&commitStorage,
Packit Service b38f0b
                                               suffix+1, suffix_len-1, ci);
Packit Service b38f0b
                }
Packit Service b38f0b
            break;
Packit Service b38f0b
                
Packit Service b38f0b
            case MODE_SET_RESERVE2:
Packit Service b38f0b
                switch(table_info->colnum) {
Packit Service b38f0b
                    @foreach $c column@
Packit Service b38f0b
                        @if $c.access =~ /(Write|Create)/@
Packit Service b38f0b
                          case COLUMN_$c.uc:
Packit Service b38f0b
                            {
Packit Service b38f0b
                                $c.decl *retval;
Packit Service b38f0b
                                size_t retval_len = 0;
Packit Service b38f0b
                                struct undoInfo *ui = NULL;
Packit Service b38f0b
                                int ret;
Packit Service b38f0b
                                
Packit Service b38f0b
                    /** first, get the old value */
Packit Service b38f0b
                                retval = get_$c(ci->data_context, &retval_len);
Packit Service b38f0b
                                if (retval) {
Packit Service b38f0b
                                    ui = SNMP_MALLOC_STRUCT(undoInfo);
Packit Service b38f0b
                                    ui->len = retval_len;
Packit Service b38f0b
                                    ui->ptr = netsnmp_memdup(retval, ui->len);
Packit Service b38f0b
                                }
Packit Service b38f0b
Packit Service b38f0b
                    /** check the new value, possibly against the
Packit Service b38f0b
                        older value for a valid state transition */
Packit Service b38f0b
                                ret = check_$c(request->requestvb->type,
Packit Service b38f0b
                                                   ($c.decl *) request->requestvb->val.string,
Packit Service b38f0b
                                                   request->requestvb->val_len,
Packit Service b38f0b
                                                   retval, retval_len);
Packit Service b38f0b
                                if (ret != 0) {
Packit Service b38f0b
                                    netsnmp_set_request_error(reqinfo, request,
Packit Service b38f0b
                                                              ret);
Packit Service b38f0b
                                    ${name}_free_undoInfo(ui);
Packit Service b38f0b
                                } else if (ui) {
Packit Service b38f0b
                        /** remember information for undo purposes later */
Packit Service b38f0b
                                    netsnmp_oid_stash_add_data(&undoStorage,
Packit Service b38f0b
                                                               suffix,
Packit Service b38f0b
                                                               suffix_len,
Packit Service b38f0b
                                                               ui);
Packit Service b38f0b
                                }
Packit Service b38f0b
                                
Packit Service b38f0b
                            }
Packit Service b38f0b
                            break;
Packit Service b38f0b
                         @end@
Packit Service b38f0b
                    @end@
Packit Service b38f0b
                    default:
Packit Service b38f0b
                       netsnmp_set_request_error(reqinfo, request,
Packit Service b38f0b
                                                 SNMP_ERR_NOTWRITABLE);
Packit Service b38f0b
                       break;
Packit Service b38f0b
                 }
Packit Service b38f0b
                break;
Packit Service b38f0b
Packit Service b38f0b
            case MODE_SET_ACTION:
Packit Service b38f0b
            /** save a variable copy */
Packit Service b38f0b
                switch(table_info->colnum) {
Packit Service b38f0b
                    @foreach $c column@
Packit Service b38f0b
                        @if $c.access =~ /(Write|Create)/@
Packit Service b38f0b
                          case COLUMN_$c.uc:
Packit Service b38f0b
                            {
Packit Service b38f0b
                                int ret;
Packit Service b38f0b
                                ret = set_$c(ci->data_context,
Packit Service b38f0b
                                             ($c.decl *) request->requestvb->val.string,
Packit Service b38f0b
                                             request->requestvb->val_len);
Packit Service b38f0b
                                if (ret) {
Packit Service b38f0b
                                    netsnmp_set_request_error(reqinfo, request,
Packit Service b38f0b
                                                              ret);
Packit Service b38f0b
                                }
Packit Service b38f0b
                                @if $c.syntax eq "RowStatus"@
Packit Service b38f0b
                                  if (*request->requestvb->val.integer ==
Packit Service b38f0b
                                      RS_DESTROY) {
Packit Service b38f0b
                                          ci->new_row = -1;
Packit Service b38f0b
                                  }
Packit Service b38f0b
                                @end@
Packit Service b38f0b
                            }
Packit Service b38f0b
                            break;
Packit Service b38f0b
                         @end@
Packit Service b38f0b
                    @end@
Packit Service b38f0b
                 }
Packit Service b38f0b
                break;
Packit Service b38f0b
Packit Service b38f0b
            case MODE_SET_COMMIT:
Packit Service b38f0b
                if (!ci->have_committed) {
Packit Service b38f0b
                    /** do this once per row only */
Packit Service b38f0b
                    ${i}_commit_row(&ci->data_context, ci->new_row);
Packit Service b38f0b
                    ci->have_committed = 1;
Packit Service b38f0b
                }
Packit Service b38f0b
                break;
Packit Service b38f0b
Packit Service b38f0b
            case MODE_SET_UNDO:
Packit Service b38f0b
             /** save a variable copy */
Packit Service b38f0b
                switch(table_info->colnum) {
Packit Service b38f0b
                    @foreach $c column@
Packit Service b38f0b
                        @if $c.access =~ /(Write|Create)/@
Packit Service b38f0b
                          case COLUMN_$c.uc:
Packit Service b38f0b
                            {
Packit Service b38f0b
                                int retval;
Packit Service b38f0b
                                struct undoInfo *ui;
Packit Service b38f0b
                                ui = netsnmp_oid_stash_get_data(undoStorage,
Packit Service b38f0b
                                                                suffix,
Packit Service b38f0b
                                                                suffix_len);
Packit Service b38f0b
                                retval = set_$c(ci->data_context, ui->ptr,
Packit Service b38f0b
                                                ui->len);
Packit Service b38f0b
                                if (retval) {
Packit Service b38f0b
                                    netsnmp_set_request_error(reqinfo, request,
Packit Service b38f0b
                                                              SNMP_ERR_UNDOFAILED);
Packit Service b38f0b
                                }
Packit Service b38f0b
                            }
Packit Service b38f0b
                            break;
Packit Service b38f0b
                        @end@
Packit Service b38f0b
                    @end@
Packit Service b38f0b
                }
Packit Service b38f0b
                break;
Packit Service b38f0b
                
Packit Service b38f0b
            case MODE_SET_FREE:
Packit Service b38f0b
                break;
Packit Service b38f0b
@end@
Packit Service b38f0b
Packit Service b38f0b
            default:
Packit Service b38f0b
                snmp_log(LOG_ERR, "problem encountered in ${i}_handler: unsupported mode\n");
Packit Service b38f0b
        }
Packit Service b38f0b
    }
Packit Service b38f0b
Packit Service b38f0b
@if $i.settable@
Packit Service b38f0b
    /** clean up after all requset processing has ended */
Packit Service b38f0b
    switch(reqinfo->mode) {
Packit Service b38f0b
    case MODE_SET_UNDO:
Packit Service b38f0b
    case MODE_SET_FREE:
Packit Service b38f0b
    case MODE_SET_COMMIT:
Packit Service b38f0b
        /** clear out the undo cache */
Packit Service b38f0b
        netsnmp_oid_stash_free(&undoStorage, ${name}_free_undoInfo);
Packit Service b38f0b
        netsnmp_oid_stash_free(&commitStorage, netsnmp_oid_stash_no_free);
Packit Service b38f0b
    }
Packit Service b38f0b
@end@
Packit Service b38f0b
Packit Service b38f0b
    return SNMP_ERR_NOERROR;
Packit Service b38f0b
}
Packit Service b38f0b
@end@
Packit Service b38f0b
@run mib2c.check_values.conf@
Packit Service b38f0b
@run mib2c.access_functions.conf@
Packit Service b38f0b
@open -@
Packit Service b38f0b
Packit Service b38f0b
**********************************************************************
Packit Service b38f0b
NOTE:  The only files you MUST modify should be the following:
Packit Service b38f0b
  ${name}_access.c
Packit Service b38f0b
  ${name}_access.h
Packit Service b38f0b
  ${name}_checkfns_local.h
Packit Service b38f0b
  ${name}_checkfns_local.c
Packit Service b38f0b
**********************************************************************
Packit Service b38f0b