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