#############################################################  -*- c -*-
## generic include for XXX. Do not use directly.
##
## $Id$
########################################################################
@if $m2c_mark_boundary == 1@
/** START code generated by $RCSfile$ $Revision$ */
@end@
########################################################################
##
########################################################################
@eval $m2c_processing_type = 'h'@
@open ${name}_interface.h@
@eval $hack = "Id"@
/*
 * Note: this file originally auto-generated by mib2c using
 *       version $Revision$ of $RCSfile$
 *
 * $$hack:$
 */
/** @ingroup interface: Routines to interface to Net-SNMP
 *
 * \warning This code should not be modified, called directly,
 *          or used to interpret functionality. It is subject to
 *          change at any time.
 * 
 * @{
 */
@include m2c-internal-warning.m2i@
##
@eval $m2c_save = "$name"@
@eval $name = "${name}_INTERFACE"@
@include generic-header-top.m2i@
@eval $name = "$m2c_save"@

#include "${name}.h"


/* ********************************************************************
 * Table declarations
 */
@foreach $table table@
@    include m2c_setup_table.m2i@

/* PUBLIC interface initialization routine */
void _${context}_initialize_interface(${context}_registration * user_ctx,
                                    u_long flags);
void _${context}_shutdown_interface(${context}_registration * user_ctx);

${context}_registration *
${context}_registration_get( void );

${context}_registration *
${context}_registration_set( ${context}_registration * newreg );

netsnmp_container *${context}_container_get( void );
int ${context}_container_size( void );

@   if $m2c_table_settable@
u_int ${context}_dirty_get( void );
void ${context}_dirty_set( u_int status );

@   end@
@   if $m2c_data_allocate == 1@
@      eval $m2c_tmp = "${context}_data *"@
@      if $m2c_data_init == 1@
@         eval $m2c_tmp = "$m2c_tmp, void *"@
@      @end@
@   elsif $m2c_data_init == 1@
@      eval $m2c_tmp = "void *"@
@   else@
@      eval $m2c_tmp = "void"@
@   end@
    ${context}_rowreq_ctx * ${context}_allocate_rowreq_ctx($m2c_tmp);
void ${context}_release_rowreq_ctx(${context}_rowreq_ctx *rowreq_ctx);

int ${context}_index_to_oid(netsnmp_index *oid_idx,
                            ${context}_mib_index *mib_idx);
int ${context}_index_from_oid(netsnmp_index *oid_idx,
                              ${context}_mib_index *mib_idx);

@   if $m2c_table_persistent == 1@
@      include mfd-persistence.m2i@

@   end@
/*
 * access to certain internals. use with caution!
 */
void ${context}_valid_columns_set(netsnmp_column_info *vc);

@end@ # for each
@eval $m2c_save = "$name"@
@eval $name = "${name}_INTERFACE"@
@include generic-header-bottom.m2i@
/** @} */
@eval $name = "$m2c_save"@
########################################################################
########################################################################
########################################################################
########################################################################
########################################################################
########################################################################
########################################################################
##
@open ${name}_interface.c@
/*
 * Note: this file originally auto-generated by mib2c using
 *       version $Revision$ of $RCSfile$ 
 *
 * $$hack:$
 */
@include m2c-internal-warning.m2i@

@include generic-source-includes.m2i@

#include <net-snmp/agent/table_container.h>
#include <net-snmp/library/container.h>

#include "${name}_interface.h"

#include <ctype.h>

@eval $m2c_processing_type = 'i'@
@foreach $table table@
@   include m2c_setup_table.m2i@
@   include details-table.m2i@
########################################################################
typedef struct ${context}_interface_ctx_s {

   netsnmp_container              *container;
@   if $m2c_data_cache == 1@
   netsnmp_cache                  *cache;
@   end@

   ${context}_registration *      user_ctx;
   
   netsnmp_table_registration_info  tbl_info;

   netsnmp_baby_steps_access_methods access_multiplexer;

@  if $m2c_table_settable@
    u_int                             table_dirty;

@  end@
} ${context}_interface_ctx;

static ${context}_interface_ctx ${context}_if_ctx;

static void _${context}_container_init(
    ${context}_interface_ctx *if_ctx);
static void _${context}_container_shutdown(
    ${context}_interface_ctx *if_ctx);


netsnmp_container *
${context}_container_get( void )
{
    return ${context}_if_ctx.container;
}

${context}_registration *
${context}_registration_get( void )
{
    return ${context}_if_ctx.user_ctx;
}

${context}_registration *
${context}_registration_set( ${context}_registration * newreg )
{
    ${context}_registration * old = ${context}_if_ctx.user_ctx;
    ${context}_if_ctx.user_ctx = newreg;
    return old;
}

int
${context}_container_size( void )
{
    return CONTAINER_SIZE(${context}_if_ctx.container);
}

@  if $m2c_table_settable@
u_int
${context}_dirty_get( void )
{
    return ${context}_if_ctx.table_dirty;
}

void
${context}_dirty_set( u_int status )
{
    DEBUGMSGTL(("${context}:${context}_dirty_set",
                "called. was %d, now %d\n",
                ${context}_if_ctx.table_dirty, status));
    ${context}_if_ctx.table_dirty = status;
}

@end@
/*
 * mfd multiplexer modes
 */
static Netsnmp_Node_Handler _mfd_${context}_pre_request;
static Netsnmp_Node_Handler _mfd_${context}_post_request;
static Netsnmp_Node_Handler _mfd_${context}_object_lookup;
static Netsnmp_Node_Handler _mfd_${context}_get_values;
@   if $m2c_table_settable@
static Netsnmp_Node_Handler _mfd_${context}_check_objects;
static Netsnmp_Node_Handler _mfd_${context}_undo_setup;
static Netsnmp_Node_Handler _mfd_${context}_set_values;
static Netsnmp_Node_Handler _mfd_${context}_undo_cleanup;
static Netsnmp_Node_Handler _mfd_${context}_undo_values;
static Netsnmp_Node_Handler _mfd_${context}_commit;
static Netsnmp_Node_Handler _mfd_${context}_undo_commit;
static Netsnmp_Node_Handler _mfd_${context}_irreversible_commit;
@      if $m2c_table_dependencies == 1@
static Netsnmp_Node_Handler _mfd_${context}_check_dependencies;
@      end@

@   end@ # writable
@   if ("$m2c_data_context" eq "generated") && (($m2c_undo_embed == 0) || ($m2c_data_allocate == 1))@
${context}_data *${context}_allocate_data(void);

@   end@
/**
 * @internal
 * Initialize the table $context 
 *    (Define its contents and how it's structured)
 */
void
_${context}_initialize_interface(${context}_registration * reg_ptr,  u_long flags)
{
    netsnmp_baby_steps_access_methods *access_multiplexer =
        &${context}_if_ctx.access_multiplexer;
    netsnmp_table_registration_info *tbl_info = &${context}_if_ctx.tbl_info;
    netsnmp_handler_registration *reginfo;
    netsnmp_mib_handler *handler;
    int    mfd_modes = 0;

    DEBUGMSGTL(("internal:${context}:_${context}_initialize_interface","called\n"));


    /*************************************************
     *
     * save interface context for ${context}
     */
    /*
     * Setting up the table's definition
     */
    netsnmp_table_helper_add_indexes(tbl_info,
    @foreach $tabledx index@
                                  $tabledx.type, /** index: $tabledx */
    @end@
                             0);

    /*  Define the minimum and maximum accessible columns.  This
        optimizes retrieval. */
    tbl_info->min_column = $context.uc_MIN_COL;
    tbl_info->max_column = $context.uc_MAX_COL;

    /*
     * save users context
     */
    ${context}_if_ctx.user_ctx = reg_ptr;

    /*
     * call data access initialization code
     */
    ${context}_init_data(reg_ptr);

    /*
     * set up the container
     */
    _${context}_container_init(&${context}_if_ctx);
    if (NULL == ${context}_if_ctx.container) {
        snmp_log(LOG_ERR,"could not initialize container for ${context}\n");
        return;
    }
    
    /*
     * access_multiplexer: REQUIRED wrapper for get request handling
     */
    access_multiplexer->object_lookup = _mfd_${context}_object_lookup;
    access_multiplexer->get_values = _mfd_${context}_get_values;

    /*
     * no wrappers yet
     */
    access_multiplexer->pre_request = _mfd_${context}_pre_request;
    access_multiplexer->post_request = _mfd_${context}_post_request;

#ifndef NETSNMP_DISABLE_SET_SUPPORT
##
@   if $m2c_table_settable@

    /*
     * REQUIRED wrappers for set request handling
     */
    access_multiplexer->object_syntax_checks = _mfd_${context}_check_objects;
    access_multiplexer->undo_setup = _mfd_${context}_undo_setup;
    access_multiplexer->undo_cleanup = _mfd_${context}_undo_cleanup;
    access_multiplexer->set_values = _mfd_${context}_set_values;
    access_multiplexer->undo_sets = _mfd_${context}_undo_values;

    /*
     * no wrappers yet
     */
    access_multiplexer->commit = _mfd_${context}_commit;
    access_multiplexer->undo_commit = _mfd_${context}_undo_commit;
    access_multiplexer->irreversible_commit = _mfd_${context}_irreversible_commit;
##
@      if $m2c_table_dependencies == 1@
    
    /*
     * REQUIRED for tables with dependencies
     */
    access_multiplexer->consistency_checks = _mfd_${context}_check_dependencies;
@      end@
@   end@ # writable
#endif

    /*************************************************
     *
     * Create a registration, save our reg data, register table.
     */
    DEBUGMSGTL(("$name:init_$context",
                "Registering $context as a mibs-for-dummies table.\n"));		 
    handler = netsnmp_baby_steps_access_multiplexer_get(access_multiplexer);
    reginfo = netsnmp_handler_registration_create("${context}", handler,
                                                  ${context}_oid,
                                                  ${context}_oid_size,
                                                  HANDLER_CAN_BABY_STEP |
#ifdef NETSNMP_DISABLE_SET_SUPPORT
                                                  HANDLER_CAN_RONLY
#else
@if $m2c_table_settable == 1@
                                                  HANDLER_CAN_RWRITE
@else@
                                                  HANDLER_CAN_RONLY
@end@
#endif /* NETSNMP_DISABLE_SET_SUPPORT */
                                                  );
    if(NULL == reginfo) {
        snmp_log(LOG_ERR,"error registering table ${context}\n");
        return;
    }
    reginfo->my_reg_void = &${context}_if_ctx;

    /*************************************************
     *
     * set up baby steps handler, create it and inject it
     */
    if( access_multiplexer->object_lookup )
        mfd_modes |= BABY_STEP_OBJECT_LOOKUP;
    if( access_multiplexer->pre_request )
        mfd_modes |= BABY_STEP_PRE_REQUEST;
    if( access_multiplexer->post_request )
        mfd_modes |= BABY_STEP_POST_REQUEST;
    
#ifndef NETSNMP_DISABLE_SET_SUPPORT
    if( access_multiplexer->set_values )
        mfd_modes |= BABY_STEP_SET_VALUES;
    if( access_multiplexer->irreversible_commit )
        mfd_modes |= BABY_STEP_IRREVERSIBLE_COMMIT;
    if( access_multiplexer->object_syntax_checks )
        mfd_modes |= BABY_STEP_CHECK_OBJECT;

    if( access_multiplexer->undo_setup )
        mfd_modes |= BABY_STEP_UNDO_SETUP;
    if( access_multiplexer->undo_cleanup )
        mfd_modes |= BABY_STEP_UNDO_CLEANUP;
    if( access_multiplexer->undo_sets )
        mfd_modes |= BABY_STEP_UNDO_SETS;
    
    if( access_multiplexer->row_creation )
        mfd_modes |= BABY_STEP_ROW_CREATE;
    if( access_multiplexer->consistency_checks )
        mfd_modes |= BABY_STEP_CHECK_CONSISTENCY;
    if( access_multiplexer->commit )
        mfd_modes |= BABY_STEP_COMMIT;
    if( access_multiplexer->undo_commit )
        mfd_modes |= BABY_STEP_UNDO_COMMIT;
#endif
    
    handler = netsnmp_baby_steps_handler_get(mfd_modes);
    netsnmp_inject_handler(reginfo, handler);

    /*************************************************
     *
     * inject row_merge helper with prefix rootoid_len + 2 (entry.col)
     */
    handler = netsnmp_get_row_merge_handler(reginfo->rootoid_len + 2);
    netsnmp_inject_handler(reginfo, handler);

    /*************************************************
     *
     * inject container_table helper
     */
    handler =
        netsnmp_container_table_handler_get(tbl_info,
                                            ${context}_if_ctx.container,
                                            TABLE_CONTAINER_KEY_NETSNMP_INDEX);
    netsnmp_inject_handler( reginfo, handler );

@   if $m2c_data_cache == 1@
    /*************************************************
     *
     * inject cache helper
     */
    if(NULL != ${context}_if_ctx.cache) {
        handler = netsnmp_cache_handler_get(${context}_if_ctx.cache);
        netsnmp_inject_handler( reginfo, handler );
    }

@   end@
    /*
     * register table
     */
    netsnmp_register_table(reginfo, tbl_info);

@if $m2c_table_persistent == 1@
    /*
     * register config/persistence callbacks
     */
    ${context}_container_init_persistence(${context}_if_ctx.container);
    
@end@
} /* _${context}_initialize_interface */

/**
 * @internal
 * Shutdown the table $context
 */
void
_${context}_shutdown_interface(${context}_registration * reg_ptr)
{
    /*
     * shutdown the container
     */
    _${context}_container_shutdown(&${context}_if_ctx);
}

void
${context}_valid_columns_set(netsnmp_column_info *vc)
{
    ${context}_if_ctx.tbl_info.valid_columns = vc;
} /* ${context}_valid_columns_set */

@include generic-table-indexes-to-oid.m2i@
@include generic-table-indexes-from-oid.m2i@

########################################################################
##
@    if (($m2c_data_allocate == 1) || ($m2c_undo_embed == 0)) && ("$m2c_data_context" eq "generated")@
@        eval $m2c_gda_todo_suppress = 1@ # no todo comments
@        include generic-data-allocate.m2i@ # resets suppress
@    end@
########################################################################
/* *********************************************************************
 * @internal
 * allocate resources for a ${context}_rowreq_ctx
 */
${context}_rowreq_ctx *
@if $m2c_data_allocate == 1@
@   eval $m2c_tmp = "${context}_data *data"@
@   if $m2c_data_init == 1@
@     eval $m2c_tmp = "$m2c_tmp, void *user_init_ctx"@
@   end@
@elsif $m2c_data_init == 1@
@   eval $m2c_tmp = "void *user_init_ctx"@
@else@
@   eval $m2c_tmp = "void"@
@end@
${context}_allocate_rowreq_ctx($m2c_tmp)
{
    ${context}_rowreq_ctx *rowreq_ctx =
                  SNMP_MALLOC_TYPEDEF(${context}_rowreq_ctx);

    DEBUGMSGTL(("internal:${context}:${context}_allocate_rowreq_ctx","called\n"));

    if(NULL == rowreq_ctx) {
        snmp_log(LOG_ERR,"Couldn't allocate memory for a "
                 "${context}_rowreq_ctx.\n");
        return NULL;
    }
@if $m2c_data_allocate == 1@
    else {
        if(NULL != data) {
            /*
             * track if we got data from user
             */
            rowreq_ctx->rowreq_flags |= MFD_ROW_DATA_FROM_USER;
            rowreq_ctx->data = data;
        }
        else if (NULL == (rowreq_ctx->data = ${context}_allocate_data())) {
            SNMP_FREE(rowreq_ctx);
            return NULL;
        }
    }

    /*
     * undo context will be allocated when needed (in *_undo_setup)
     */
@end@

    rowreq_ctx->oid_idx.oids = rowreq_ctx->oid_tmp;

    rowreq_ctx->${context}_data_list = NULL;

@if $m2c_data_init == 1@
    /*
     * if we allocated data, call init routine
     */
    if (!(rowreq_ctx->rowreq_flags & MFD_ROW_DATA_FROM_USER)) {
        if(SNMPERR_SUCCESS !=
            ${context}_rowreq_ctx_init(rowreq_ctx, user_init_ctx)) {
           ${context}_release_rowreq_ctx(rowreq_ctx);
           rowreq_ctx = NULL;
        }
    }
@end@

    return rowreq_ctx;
} /* ${context}_allocate_rowreq_ctx */

/*
 * @internal
 * release resources for a ${context}_rowreq_ctx
 */
void
${context}_release_rowreq_ctx(${context}_rowreq_ctx *rowreq_ctx)
{
    DEBUGMSGTL(("internal:${context}:${context}_release_rowreq_ctx","called\n"));

    netsnmp_assert(NULL != rowreq_ctx);
    
@if $m2c_data_init == 1@
    ${context}_rowreq_ctx_cleanup(rowreq_ctx);
@end@

@if $m2c_data_allocate == 1@
    /*
     * for non-transient data, don't free data we got from the user
     */
    if ((rowreq_ctx->data) &&
        !(rowreq_ctx->rowreq_flags & MFD_ROW_DATA_FROM_USER))
        ${context}_release_data(rowreq_ctx->data);
 
@end@ 
@if $m2c_undo_embed == 0@
    if(rowreq_ctx->undo)
        ${context}_release_data(rowreq_ctx->undo);
 
@end@ 
    /*
     * free index oid pointer
     */
    if(rowreq_ctx->oid_idx.oids != rowreq_ctx->oid_tmp)
        free(rowreq_ctx->oid_idx.oids);

    SNMP_FREE(rowreq_ctx);
} /* ${context}_release_rowreq_ctx */

########################################################################
##
/**
 * @internal
 * wrapper
 */
static int
_mfd_${context}_pre_request(netsnmp_mib_handler *handler,
                            netsnmp_handler_registration *reginfo,
                            netsnmp_agent_request_info *agtreq_info,
                            netsnmp_request_info *requests)
{
    int rc;

    DEBUGMSGTL(("internal:${context}:_mfd_${context}_pre_request",
                "called\n"));
    
    if (1 != netsnmp_row_merge_status_first(reginfo, agtreq_info)) {
        DEBUGMSGTL(("internal:${context}",
                    "skipping additional pre_request\n"));
        return SNMP_ERR_NOERROR;
    }
        
    rc = ${context}_pre_request(${context}_if_ctx.user_ctx);
    if (MFD_SUCCESS != rc) {
        /*
         * nothing we can do about it but log it
         */
        DEBUGMSGTL(("${context}","error %d from "
                    "${context}_pre_request\n", rc));
        netsnmp_request_set_error_all(requests, SNMP_VALIDATE_ERR(rc));
    }
    
    return SNMP_ERR_NOERROR;
} /* _mfd_${context}_pre_request */

/**
 * @internal
 * wrapper
 */
static int
_mfd_${context}_post_request(netsnmp_mib_handler *handler,
                             netsnmp_handler_registration *reginfo,
                             netsnmp_agent_request_info *agtreq_info,
                             netsnmp_request_info *requests)
{
    ${context}_rowreq_ctx *rowreq_ctx = (${context}_rowreq_ctx*)
                  netsnmp_container_table_row_extract(requests);
    int rc, packet_rc;

    DEBUGMSGTL(("internal:${context}:_mfd_${context}_post_request",
                "called\n"));

    /*
     * release row context, if deleted
     */
    if (rowreq_ctx && (rowreq_ctx->rowreq_flags & MFD_ROW_DELETED))
        ${context}_release_rowreq_ctx(rowreq_ctx);

    /*
     * wait for last call before calling user
     */
    if (1 != netsnmp_row_merge_status_last(reginfo, agtreq_info)) {
        DEBUGMSGTL(("internal:${context}",
                    "waiting for last post_request\n"));
        return SNMP_ERR_NOERROR;
    }
    
    packet_rc = netsnmp_check_all_requests_error(agtreq_info->asp, 0);
@  if $m2c_table_settable@
    if ((MFD_SUCCESS != packet_rc) && ${context}_dirty_get()) {
        /*
         * we shouldn't get here. the undo steps should also clear
         * the dirty flags.
         */
        snmp_log(LOG_WARNING, "${context} dirty flag set in post_request "
                 "but status != SUCCESS.\n");
    }

@   end@
    rc = ${context}_post_request(${context}_if_ctx.user_ctx,packet_rc);
    if (MFD_SUCCESS != rc) {
        /*
         * nothing we can do about it but log it
         */
        DEBUGMSGTL(("${context}","error %d from "
                    "${context}_post_request\n", rc));
    }
    
    return SNMP_ERR_NOERROR;
} /* _mfd_${context}_post_request */

########################################################################
##
@if ($m2c_table_row_creation == 1) || ($m2c_table_persistent == 1)@
NETSNMP_STATIC_INLINE int
_${context}_check_indexes(${context}_rowreq_ctx * rowreq_ctx)
{
    int                          rc = SNMPERR_SUCCESS;

    DEBUGMSGTL(("internal:${context}:_${context}_check_indexes","called\n"));

    netsnmp_assert(NULL != rowreq_ctx);

##
@if $m2c_table_external_indexes != 0@
    /*
     * check that the corresponding EXTERNAL row exists
     */
@   foreach $node externalindex@
@      include m2c_setup_node.m2i@

    /* (INDEX) $m2c_node_summary */
    rc = ${context}_${node}_check_index( rowreq_ctx );
    if(MFD_SUCCESS != rc)
        return SNMP_ERR_NOCREATION;
@   end@ # for each nonindex

@end@ # external index
@   foreach $node internalindex@
@      include m2c_setup_node.m2i@

    /* (INDEX) $m2c_node_summary */
@   eval $m2c_nv_val = "rowreq_ctx->tbl_idx.$node"@
@   eval $m2c_nv_len = "rowreq_ctx->tbl_idx.${node}_len"@
@   eval $m2c_nv_str = "rowreq_ctx->tbl_idx.$node"@
@   include node-validate.m2i@
       if (MFD_SUCCESS != rc)
          return rc;
        rc = ${node}_check_index( rowreq_ctx );
       if(MFD_SUCCESS != rc)
           return SNMP_ERR_NOCREATION;
@   end@ # for each internalindex

    /*
     * if individual parts look ok, check them as a whole
     */
    return ${context}_validate_index( ${context}_if_ctx.user_ctx, rowreq_ctx );
} /* _${context}_check_indexes */
##----------------------------------------------------------------------
/**
 * @internal
 * wrapper
 */
static ${table}_rowreq_ctx *
_mfd_${context}_rowreq_from_index(netsnmp_index *oid_idx, int * rc_ptr)
{
    ${context}_rowreq_ctx * rowreq_ctx;
    ${context}_mib_index mib_idx;
    int rc;

    DEBUGMSGTL(("internal:${context}:_mfd_${context}_rowreq_from_index",
                "called\n"));

    if (NULL == rc_ptr)
        rc_ptr = &rc;
    *rc_ptr = MFD_SUCCESS;

    memset(&mib_idx, 0x0, sizeof(mib_idx));
    
    /*
     * try to parse oid
     */
    *rc_ptr = ${context}_index_from_oid(oid_idx, &mib_idx);
    if(MFD_SUCCESS != *rc_ptr) {
        DEBUGMSGT(("$context", "error parsing index\n"));
        return NULL;
    }

    /*
     * allocate new context
     */
@   eval $m2c_tmp = ""@
@   if ($m2c_data_allocate == 1) || ($m2c_data_init == 1)@
@      eval $m2c_tmp = "NULL"@
@      if ($m2c_data_allocate == 1) && ($m2c_data_init == 1)@
@         eval $m2c_tmp = "$m2c_tmp, NULL"@
@      @end@
@   end@
    rowreq_ctx = ${context}_allocate_rowreq_ctx($m2c_tmp);
    if (NULL == rowreq_ctx) {
        *rc_ptr = MFD_ERROR;
        return NULL; /* msg already logged */
    }
    
    memcpy(&rowreq_ctx->tbl_idx, &mib_idx, sizeof(mib_idx));

    /*
     * check indexes
     */
    *rc_ptr = _${context}_check_indexes(rowreq_ctx);
    if(MFD_SUCCESS != *rc_ptr) {
        netsnmp_assert((*rc_ptr == SNMP_ERR_NOCREATION) ||
                       (*rc_ptr == SNMP_ERR_INCONSISTENTNAME));
        ${context}_release_rowreq_ctx(rowreq_ctx);
        return NULL;
    }

    /*
     * copy indexes
     */
    rowreq_ctx->oid_idx.len = oid_idx->len;
    memcpy(rowreq_ctx->oid_idx.oids, oid_idx->oids, oid_idx->len * sizeof(oid));

    return rowreq_ctx;
} /* _mfd_${context}_rowreq_from_index */


@end@ # row creation
/**
 * @internal
 * wrapper
 */
static int
_mfd_${context}_object_lookup(netsnmp_mib_handler *handler,
                         netsnmp_handler_registration *reginfo,
                         netsnmp_agent_request_info *agtreq_info,
                         netsnmp_request_info *requests)
{
    int                    rc = SNMP_ERR_NOERROR;
    ${context}_rowreq_ctx *rowreq_ctx = (${context}_rowreq_ctx*)
                  netsnmp_container_table_row_extract(requests);
    
    DEBUGMSGTL(("internal:${context}:_mfd_${context}_object_lookup","called\n"));

    /*
     * get our context from mfd
     * ${context}_interface_ctx *if_ctx =
     *             (${context}_interface_ctx *)reginfo->my_reg_void;
     */

    if(NULL == rowreq_ctx) {
@   if $m2c_table_row_creation == 0@
        rc = SNMP_ERR_NOCREATION;
@   else@
        netsnmp_table_request_info *tblreq_info;
        netsnmp_index oid_idx;

        tblreq_info = netsnmp_extract_table_info(requests);
        if(NULL == tblreq_info) {
            snmp_log(LOG_ERR, "request had no table info\n");
            return MFD_ERROR;
        }

        /*
         * try create rowreq
         */
        oid_idx.oids = tblreq_info->index_oid;
        oid_idx.len = tblreq_info->index_oid_len;

        rowreq_ctx = _mfd_${context}_rowreq_from_index(&oid_idx, &rc);
        if(MFD_SUCCESS == rc) {
            netsnmp_assert(NULL != rowreq_ctx);
            rowreq_ctx->rowreq_flags |= MFD_ROW_CREATED;
            /*
             * add rowreq_ctx to request data lists
             */
            netsnmp_container_table_row_insert(requests, (netsnmp_index*)rowreq_ctx);
        }
@   end@ // row creation
    }

    if (MFD_SUCCESS != rc)
        netsnmp_request_set_error_all(requests, rc);
    else
        ${context}_row_prep(rowreq_ctx);

    return SNMP_VALIDATE_ERR(rc);
} /* _mfd_${context}_object_lookup */

########################################################################
##
/***********************************************************************
 *
 * GET processing
 *
 ***********************************************************************/
/*
 * @internal
 * Retrieve the value for a particular column
 */
NETSNMP_STATIC_INLINE int
_${context}_get_column( ${context}_rowreq_ctx *rowreq_ctx,
                       netsnmp_variable_list *var, int column )
{
    int rc = SNMPERR_SUCCESS;
    
    DEBUGMSGTL(("internal:${context}:_mfd_${context}_get_column",
                "called for %d\n", column));


    netsnmp_assert(NULL != rowreq_ctx);

    switch(column) {
@   foreach $node internalindex@
@      include m2c_setup_node.m2i@
@      if $node.accessible == 1@

    /* (INDEX) $m2c_node_summary */
    case COLUMN_$node.uc:
    var->type = $node.type;
@         if $m2c_node_needlength == 1@
    /*
     * NOTE: val_len is in bytes, ${node}_len might not be (e.g. oids)
     */
        if (var->val_len < (rowreq_ctx->tbl_idx.${node}_len *
                            sizeof(rowreq_ctx->tbl_idx.${node}[0]))) {
           var->val.string = malloc(rowreq_ctx->tbl_idx.${node}_len *
                                    sizeof(rowreq_ctx->tbl_idx.${node}[0]));
        }
        var->val_len = rowreq_ctx->tbl_idx.${node}_len * sizeof(rowreq_ctx->tbl_idx.${node}[0]);
        memcpy( var->val.string, rowreq_ctx->tbl_idx.$node, var->val_len );
@         else@
        var->val_len = sizeof($m2c_decl);
        (*var->val.integer) = rowreq_ctx->tbl_idx.$node;
@         end@
        break;
@      end@ ## accessible
@   end@ ## index
@   foreach $node nonindex@
@      include m2c_setup_node.m2i@
@      if $node.accessible == 1@

    /* $m2c_node_summary */
    case COLUMN_$node.uc:
@   if $m2c_table_sparse == 1@
        if (! (COLUMN_$node.uc_FLAG & rowreq_ctx->column_exists_flags)) {
            DEBUGMSGTL(("internal:${context}:_mfd_${context}_get_column",
                        "column %d ($node) doesn't exist\n", column));
            return MFD_SKIP;
        }

@   end@
##         use sizeof except for BITS
@         if $m2c_node_needlength == 0@
@            if "$node.perltype" eq "BITS"@
    {
        $m2c_decl mask = 0xff << ((sizeof($m2c_decl) - 1) * 8);
        int       idx = 0;
@            else@
    var->val_len = sizeof($m2c_decl);
@            end@
@         end@
    var->type = $node.type;
rc = ${node}_get(rowreq_ctx, $m2c_node_var_ref );
@         if ($m2c_node_needlength == 0) && ("$node.perltype" eq "BITS")@
        /*
         * check for length of bits string
         */
        var->val_len = 0;
        while( 0 != mask ) {
            ++idx;
            if ( *(($m2c_decl *) var->val.string) & mask )
                var->val_len = idx;
            mask = mask >> 8;
        }
    }
@         end@
        break;
 @      end@ # accessible
@   end@ # for each column

     default:
        if ($context.uc_MIN_COL <= column && column <= $context.uc_MAX_COL) {
            DEBUGMSGTL(("internal:${context}:_mfd_${context}_get_column",
                "assume column %d is reserved\n", column));
            rc = MFD_SKIP;
        } else {
            snmp_log(LOG_ERR,
                "unknown column %d in _${context}_get_column\n", column);
        }
        break;
    }

    return rc;
} /* _${context}_get_column */

########################################################################
##
int
_mfd_${context}_get_values(netsnmp_mib_handler *handler,
                         netsnmp_handler_registration *reginfo,
                         netsnmp_agent_request_info *agtreq_info,
                         netsnmp_request_info *requests)
{
    ${context}_rowreq_ctx *rowreq_ctx = (${context}_rowreq_ctx*)
                  netsnmp_container_table_row_extract(requests);
    netsnmp_table_request_info * tri;
    u_char                     * old_string;
    void                      (*dataFreeHook)(void *);
    int                        rc;

    DEBUGMSGTL(("internal:${context}:_mfd_${context}_get_values","called\n"));

    netsnmp_assert(NULL != rowreq_ctx);
    
@if $m2c_table_sparse == 1@
    DEBUGMSGTL(("9:${context}:_mfd_${context}_get_values",
                "exists %p\n", (void*)rowreq_ctx->column_exists_flags));

@end@
    for(;requests; requests = requests->next) {
        /*
         * save old pointer, so we can free it if replaced
         */
        old_string = requests->requestvb->val.string;
        dataFreeHook = requests->requestvb->dataFreeHook;
        if(NULL == requests->requestvb->val.string) {
            requests->requestvb->val.string = requests->requestvb->buf;
            requests->requestvb->val_len = sizeof(requests->requestvb->buf);
        }
        else if(requests->requestvb->buf == requests->requestvb->val.string) {
            if(requests->requestvb->val_len != sizeof(requests->requestvb->buf))
                requests->requestvb->val_len = sizeof(requests->requestvb->buf);
        }

        /*
         * get column data
         */
        tri = netsnmp_extract_table_info(requests);
        if(NULL == tri)
            continue;
        
        rc = _${context}_get_column(rowreq_ctx, requests->requestvb, tri->colnum);
        if(rc) {
            if(MFD_SKIP == rc) {
                requests->requestvb->type = SNMP_NOSUCHINSTANCE;
                rc = SNMP_ERR_NOERROR;
            }
        }
        else if (NULL == requests->requestvb->val.string) {
            snmp_log(LOG_ERR,"NULL varbind data pointer!\n");
            rc = SNMP_ERR_GENERR;
        }
        if(rc)
            netsnmp_request_set_error(requests, SNMP_VALIDATE_ERR(rc));

        /*
         * if the buffer wasn't used previously for the old data (i.e. it
         * was allcoated memory)  and the get routine replaced the pointer,
         * we need to free the previous pointer.
         */
        if(old_string && (old_string != requests->requestvb->buf) &&
           (requests->requestvb->val.string != old_string)) {
            if(dataFreeHook)
                (*dataFreeHook)(old_string);
            else
                free(old_string);
        }
    } /* for results */

    return SNMP_ERR_NOERROR;
} /* _mfd_${context}_get_values */

########################################################################
##
/***********************************************************************
 *
 * SET processing
 *
 ***********************************************************************/

@if $m2c_table_settable == 0@
/*
 * SET PROCESSING NOT APPLICABLE (per MIB or user setting)
 */
@else@
/*----------------------------------------------------------------------
 *
 * SET: Syntax checks
 *
 *---------------------------------------------------------------------*/
/*
 * @internal
 * Check the syntax for a particular column
 */
NETSNMP_STATIC_INLINE int
_${context}_check_column( ${context}_rowreq_ctx *rowreq_ctx,
                         netsnmp_variable_list *var, int column )
{
    int rc = SNMPERR_SUCCESS;
    
    DEBUGMSGTL(("internal:${context}:_${context}_check_column",
                "called for %d\n", column));

    netsnmp_assert(NULL != rowreq_ctx);

    switch(column) {
@   eval $m2c_nvv_item = "${m2c_context_item}tbl_idx."@
@   foreach $node internalindex@
@      include m2c_setup_node.m2i@
    /* (INDEX) $m2c_node_summary */
    case COLUMN_$node.uc:
        rc = SNMP_ERR_NOTWRITABLE; /* can not change index of active row */
        break;
@   end@ ## index
@   eval $m2c_nvv_item = "$m2c_data_item"@
@   foreach $node nonindex@
@      include m2c_setup_node.m2i@
@      if $node.settable == 0@

    /* $m2c_node_summary */
    case COLUMN_$node.uc:
        rc = SNMP_ERR_NOTWRITABLE;
        break;
@          next@
@      end@

    /* $m2c_node_summary */
    case COLUMN_$node.uc:
@      include node-varbind-validate.m2i@
    if(SNMPERR_SUCCESS != rc) {
        DEBUGMSGTL(("${context}:_${context}_check_column:$node",
                    "varbind validation failed (eg bad type or size)\n"));
    }
    else {
        rc = ${node}_check_value( rowreq_ctx, $m2c_node_var_val );
        if((MFD_SUCCESS != rc) && (MFD_NOT_VALID_EVER != rc) &&
           (MFD_NOT_VALID_NOW != rc)) {
            snmp_log(LOG_ERR, "bad rc %d from ${node}_check_value\n", rc);
            rc = SNMP_ERR_GENERR;
        }
    }
        break;
@   end@ # for each nonindex

        default: /** We shouldn't get here */
            rc = SNMP_ERR_GENERR;
            snmp_log(LOG_ERR, "unknown column %d in _${context}_check_column\n", column);
    }

    return rc;
} /* _${context}_check_column */

##----------------------------------------------------------------------
int
_mfd_${context}_check_objects(netsnmp_mib_handler *handler,
                         netsnmp_handler_registration *reginfo,
                         netsnmp_agent_request_info *agtreq_info,
                         netsnmp_request_info *requests)
{
    ${context}_rowreq_ctx *rowreq_ctx = (${context}_rowreq_ctx*)
                  netsnmp_container_table_row_extract(requests);
    netsnmp_table_request_info * tri;
    int                          rc;

    DEBUGMSGTL(("internal:${context}:_mfd_${context}_check_objects","called\n"));

    netsnmp_assert(NULL != rowreq_ctx);
    
    for(;requests; requests = requests->next) {

        /*
         * get column number from table request info, and check that column
         */
        tri = netsnmp_extract_table_info(requests);
        if(NULL == tri)
            continue;

        rc = _${context}_check_column(rowreq_ctx, requests->requestvb, tri->colnum);
        if(rc) {
            netsnmp_request_set_error(requests, SNMP_VALIDATE_ERR(rc));
            break;
        }

    } /* for results */

    return SNMP_ERR_NOERROR;
} /* _mfd_${context}_check_objects */


@      if $m2c_table_dependencies == 1@
/*----------------------------------------------------------------------
 *
 * SET: check dependencies
 *
 *---------------------------------------------------------------------*/
/*
 * @internal
 * Check dependencies wrapper
 */
static int
_mfd_${context}_check_dependencies(netsnmp_mib_handler *handler,
                         netsnmp_handler_registration *reginfo,
                         netsnmp_agent_request_info *agtreq_info,
                         netsnmp_request_info *requests)
{
    int                    rc;
    ${context}_rowreq_ctx *rowreq_ctx = (${context}_rowreq_ctx*)
                  netsnmp_container_table_row_extract(requests);
    DEBUGMSGTL(("internal:${context}:_mfd_${context}_check_dependencies","called\n"));

    netsnmp_assert(NULL != rowreq_ctx);

    rc = ${context}_check_dependencies(rowreq_ctx);
    if(rc){
        DEBUGMSGTL(("${context}:mfd","error %d from "
                    "${context}_check_dependencies\n", rc));
        netsnmp_request_set_error_all(requests, SNMP_VALIDATE_ERR(rc));
    }

    return SNMP_ERR_NOERROR;
} /* _mfd_${context}_check_dependencies */

@end@ // dependencies
/*----------------------------------------------------------------------
 *
 * SET: Undo setup
 *
 *---------------------------------------------------------------------*/
/*
 * @internal
 * Set the value for a particular column
 */
NETSNMP_STATIC_INLINE int
_${context}_undo_setup_column( ${context}_rowreq_ctx *rowreq_ctx, int column )
{
    int rc = SNMPERR_SUCCESS;
    
    DEBUGMSGTL(("internal:${context}:_${context}_undo_setup_column",
                "called for %d\n", column));

    netsnmp_assert(NULL != rowreq_ctx);

    switch(column) {
@   foreach $node nonindex@
@      include m2c_setup_node.m2i@
@      if $node.settable == 1@

    /* $m2c_node_summary */
    case COLUMN_$node.uc:
        rowreq_ctx->column_set_flags |= COLUMN_$node.uc_FLAG;
        rc = ${node}_undo_setup(rowreq_ctx );
        break;
 @      end@ # settable
@   end@ # for each column

     default:
         snmp_log(LOG_ERR,"unknown column %d in _${context}_undo_setup_column\n", column);
         break;
    }

    return rc;
} /* _${context}_undo_setup_column */


##----------------------------------------------------------------------
/**
 * @internal
 * undo setup
 */
int
_mfd_${context}_undo_setup(netsnmp_mib_handler *handler,
                         netsnmp_handler_registration *reginfo,
                         netsnmp_agent_request_info *agtreq_info,
                         netsnmp_request_info *requests)
{
    int                    rc;
    ${context}_rowreq_ctx *rowreq_ctx = (${context}_rowreq_ctx*)
                  netsnmp_container_table_row_extract(requests);

    DEBUGMSGTL(("internal:${context}:_mfd_${context}_undo_setup","called\n"));

    netsnmp_assert(NULL != rowreq_ctx);

@if $m2c_undo_embed == 0@
    /*
     * allocate undo context
     */
    rowreq_ctx->undo = ${context}_allocate_data();
    if(NULL == rowreq_ctx->undo) {
        /** msg already logged */
        netsnmp_request_set_error_all(requests, SNMP_ERR_RESOURCEUNAVAILABLE);
        return SNMP_ERR_NOERROR;
    }

@end@
    /*
     * row undo setup
     */
    rowreq_ctx->column_set_flags = 0;
    rc = ${context}_undo_setup(rowreq_ctx);
    if (MFD_SUCCESS != rc)  {
        DEBUGMSGTL(("${context}:mfd","error %d from "
                    "${context}_undo_setup\n", rc));
        netsnmp_request_set_error_all(requests, SNMP_VALIDATE_ERR(rc));
    }
    else {
        /*
         * column undo setup
         */
        netsnmp_table_request_info * tri;
        for(;requests; requests = requests->next) {
            /*
             * set column data
             */
            tri = netsnmp_extract_table_info(requests);
            if(NULL == tri)
                continue;
            
            rc = _${context}_undo_setup_column(rowreq_ctx, tri->colnum);
            if(MFD_SUCCESS != rc)  {
                DEBUGMSGTL(("${context}:mfd","error %d from "
                            "${context}_undo_setup_column\n", rc));
                netsnmp_set_request_error(agtreq_info, requests, SNMP_VALIDATE_ERR(rc));
            }
        } /* for results */
    }
    
    return SNMP_ERR_NOERROR;
} /* _mfd_${context}_undo_setup */

/**
 * @internal
 * undo setup
 */
int
_mfd_${context}_undo_cleanup(netsnmp_mib_handler *handler,
                             netsnmp_handler_registration *reginfo,
                             netsnmp_agent_request_info *agtreq_info,
                             netsnmp_request_info *requests)
{
    ${context}_rowreq_ctx *rowreq_ctx = (${context}_rowreq_ctx*)
                  netsnmp_container_table_row_extract(requests);
    int rc;

    DEBUGMSGTL(("internal:${context}:_mfd_${context}_undo_cleanup","called\n"));

    /*
     * failed row create in early stages has no rowreq_ctx
     */
    if (NULL == rowreq_ctx)
        return MFD_SUCCESS;

    /*
     * call user cleanup
     */
    rc = ${context}_undo_cleanup(rowreq_ctx);
    if (MFD_SUCCESS != rc) {
        /*
         * nothing we can do about it but log it
         */
        DEBUGMSGTL(("${context}:mfd","error %d from "
                    "${context}_undo_cleanup\n", rc));
    }

@if $m2c_undo_embed == 0@
    /*
     * release undo context, if needed
     */
    if(rowreq_ctx->undo) {
         ${context}_release_data(rowreq_ctx->undo);
         rowreq_ctx->undo = NULL;
    }

@end@

    return SNMP_ERR_NOERROR;
} /* _mfd_${context}_undo_cleanup */

/*----------------------------------------------------------------------
 *
 * SET: Set values
 *
 *---------------------------------------------------------------------*/
/*
 * @internal
 * Set the value for a particular column
 */
NETSNMP_STATIC_INLINE int
_${context}_set_column( ${context}_rowreq_ctx *rowreq_ctx,
                       netsnmp_variable_list *var, int column )
{
    int rc = SNMPERR_SUCCESS;
    
    DEBUGMSGTL(("internal:${context}:_${context}_set_column",
                "called for %d\n", column));

    netsnmp_assert(NULL != rowreq_ctx);

    switch(column) {
@   foreach $node nonindex@
@      include m2c_setup_node.m2i@
@      if $node.settable == 1@

    /* $m2c_node_summary */
    case COLUMN_$node.uc:
        rowreq_ctx->column_set_flags |= COLUMN_$node.uc_FLAG;
        rc = ${node}_set(rowreq_ctx, $m2c_node_var_val );
        break;
 @      end@ # settable
@   end@ # for each column

     default:
         snmp_log(LOG_ERR,"unknown column %d in _${context}_set_column\n", column);
         rc = SNMP_ERR_GENERR;
         break;
    }
    
    return rc;
} /* _${context}_set_column */

########################################################################
##
int
_mfd_${context}_set_values(netsnmp_mib_handler *handler,
                         netsnmp_handler_registration *reginfo,
                         netsnmp_agent_request_info *agtreq_info,
                         netsnmp_request_info *requests)
{
    ${context}_rowreq_ctx *rowreq_ctx = (${context}_rowreq_ctx*)
                  netsnmp_container_table_row_extract(requests);
    netsnmp_table_request_info * tri;
    int                          rc = SNMP_ERR_NOERROR;

    DEBUGMSGTL(("internal:${context}:_mfd_${context}_set_values","called\n"));

    netsnmp_assert(NULL != rowreq_ctx);
    
    rowreq_ctx->column_set_flags = 0;
    for(;requests; requests = requests->next) {
        /*
         * set column data
         */
        tri = netsnmp_extract_table_info(requests);
        if(NULL == tri)
            continue;
        
        rc = _${context}_set_column(rowreq_ctx,
                                    requests->requestvb, tri->colnum);
        if(MFD_SUCCESS != rc)  {
            DEBUGMSGTL(("${context}:mfd","error %d from "
                        "${context}_set_column\n", rc));
            netsnmp_set_request_error(agtreq_info, requests, SNMP_VALIDATE_ERR(rc));
        }
    } /* for results */

    return SNMP_ERR_NOERROR;
} /* _mfd_${context}_set_values */

/*----------------------------------------------------------------------
 *
 * SET: commit
 *
 *---------------------------------------------------------------------*/
/**
 * @internal
 * commit the values
 */
int
_mfd_${context}_commit(netsnmp_mib_handler *handler,
                         netsnmp_handler_registration *reginfo,
                         netsnmp_agent_request_info *agtreq_info,
                         netsnmp_request_info *requests)
{
    int                    rc;
    ${context}_rowreq_ctx *rowreq_ctx = (${context}_rowreq_ctx*)
                  netsnmp_container_table_row_extract(requests);

    DEBUGMSGTL(("internal:${context}:_mfd_${context}_commit","called\n"));

    netsnmp_assert(NULL != rowreq_ctx);
    
    rc = ${context}_commit(rowreq_ctx);
    if (MFD_SUCCESS != rc) {
        DEBUGMSGTL(("${context}:mfd","error %d from "
                    "${context}_commit\n", rc));
        netsnmp_request_set_error_all(requests, SNMP_VALIDATE_ERR(rc));
    }

    if (rowreq_ctx->rowreq_flags & MFD_ROW_DIRTY) {
        /*
         * if we successfully commited this row, set the dirty flag. Use the
         * current value + 1 (i.e. dirty = # rows changed).
         * this is checked in post_request...
         */
        ${context}_dirty_set( ${context}_dirty_get() + 1 ); /* set table dirty flag */
    }

    return SNMP_ERR_NOERROR;
}

int
_mfd_${context}_undo_commit(netsnmp_mib_handler *handler,
                         netsnmp_handler_registration *reginfo,
                         netsnmp_agent_request_info *agtreq_info,
                         netsnmp_request_info *requests)
{
    int                    rc;
    ${context}_rowreq_ctx *rowreq_ctx = (${context}_rowreq_ctx*)
                  netsnmp_container_table_row_extract(requests);

    DEBUGMSGTL(("internal:${context}:_mfd_${context}_undo_commit","called\n"));

    netsnmp_assert(NULL != rowreq_ctx);

    if (rowreq_ctx->rowreq_flags & MFD_ROW_DIRTY) {
        u_int  d = ${context}_dirty_get();

        netsnmp_assert(d != 0);
        if(d)
            ${context}_dirty_set( d - 1 );
    }

    rc = ${context}_undo_commit(rowreq_ctx);
    if (MFD_SUCCESS != rc) {
        /*
         * nothing we can do about it but log it
         */
        DEBUGMSGTL(("${context}:mfd","error %d from "
                    "${context}_undo_commit\n", rc));
    }

    if (rowreq_ctx->rowreq_flags & MFD_ROW_DIRTY) {
        snmp_log(LOG_WARNING, "${context} row dirty flag still set after undo_commit\n");
        rowreq_ctx->rowreq_flags &= ~MFD_ROW_DIRTY;
    }

    return SNMP_ERR_NOERROR;
} /* _mfd_${context}_commit */

/*----------------------------------------------------------------------
 *
 * SET: Undo
 *
 *---------------------------------------------------------------------*/
/**
 * @internal
 * undo the value for a particular column
 */
NETSNMP_STATIC_INLINE int
_${context}_undo_column( ${context}_rowreq_ctx *rowreq_ctx,
                       netsnmp_variable_list *var, int column )
{
    int rc = SNMPERR_SUCCESS;
    
    DEBUGMSGTL(("internal:${context}:_${context}_undo_column",
                "called for %d\n", column));

    netsnmp_assert(NULL != rowreq_ctx);

    switch(column) {
@   foreach $node nonindex@
@      include m2c_setup_node.m2i@
@      if $node.settable == 1@

    /* $m2c_node_summary */
    case COLUMN_$node.uc:
        rc = ${node}_undo(rowreq_ctx);
        break;
 @      end@ # settable
@   end@ # for each column

     default:
         snmp_log(LOG_ERR,"unknown column %d in _${context}_undo_column\n", column);
         break;
    }

    return rc;
} /* _${context}_undo_column */

########################################################################
##
int
_mfd_${context}_undo_values(netsnmp_mib_handler *handler,
                         netsnmp_handler_registration *reginfo,
                         netsnmp_agent_request_info *agtreq_info,
                         netsnmp_request_info *requests)
{
    int                    rc;
    ${context}_rowreq_ctx *rowreq_ctx = (${context}_rowreq_ctx*)
                  netsnmp_container_table_row_extract(requests);
    netsnmp_table_request_info * tri;

    DEBUGMSGTL(("internal:${context}:_mfd_${context}_undo_values","called\n"));

    netsnmp_assert(NULL != rowreq_ctx);
    
    rc = ${context}_undo(rowreq_ctx);
    if (MFD_SUCCESS != rc) {
        /*
         * nothing we can do about it but log it
         */
        DEBUGMSGTL(("${context}:mfd","error %d from "
                    "${context}_undo\n", rc));
    }
    
    for(;requests; requests = requests->next) {
        /*
         * set column data
         */
        tri = netsnmp_extract_table_info(requests);
        if(NULL == tri)
            continue;
        
        rc = _${context}_undo_column(rowreq_ctx, requests->requestvb,
                                     tri->colnum);
        if (MFD_SUCCESS != rc) {
            /*
             * nothing we can do about it but log it
             */
            DEBUGMSGTL(("${context}:mfd","error %d from "
                        "${context}_undo_column\n", rc));
        }
    } /* for results */

    return SNMP_ERR_NOERROR;
} /* _mfd_${context}_undo_values */

/*----------------------------------------------------------------------
 *
 * SET: irreversible commit
 *
 *---------------------------------------------------------------------*/
/**
 * @internal
 * commit irreversible actions
 */
int
_mfd_${context}_irreversible_commit(netsnmp_mib_handler *handler,
                         netsnmp_handler_registration *reginfo,
                         netsnmp_agent_request_info *agtreq_info,
                         netsnmp_request_info *requests)
{
@   if $m2c_irreversible_commit == 1@
    int                    rc;
@   end@
    ${context}_rowreq_ctx *rowreq_ctx = (${context}_rowreq_ctx*)
                  netsnmp_container_table_row_extract(requests);
    
    DEBUGMSGTL(("internal:${context}:_mfd_${context}_irreversible:commit","called\n"));
   
    netsnmp_assert(NULL != rowreq_ctx);
    
@   if $m2c_irreversible_commit == 1@
    rc = ${context}_irreversible_commit(rowreq_ctx);
    if (MFD_SUCCESS != rc) {
        netsnmp_request_set_error_all(requests, SNMP_ERR_COMMITFAILED);
        DEBUGMSGTL(("${context}:mfd","error %d from "
                    "${context}_irreversible_commit\n", rc));
    }

@   end@
    /*
     * check for and handle row creation/deletion
     * and update column exist flags...
     */
    if (rowreq_ctx->rowreq_flags & MFD_ROW_DELETED) {
        if (! (rowreq_ctx->rowreq_flags & MFD_ROW_CREATED))
            CONTAINER_REMOVE(${context}_if_ctx.container, rowreq_ctx);
    }
    else {
        if (rowreq_ctx->column_set_flags) {
@if $m2c_table_sparse == 1@
           DEBUGMSGTL(("internal:${context}:_mfd_irreversible_commit",
                       "updating exists (%p) w/set (%p) = %p\n",
                       rowreq_ctx->column_exists_flags,
                       rowreq_ctx->column_set_flags,
                       (rowreq_ctx->column_exists_flags |
                        rowreq_ctx->column_set_flags)));
           rowreq_ctx->column_exists_flags |=
           rowreq_ctx->column_set_flags;
@end@ # sparse
           rowreq_ctx->column_set_flags = 0;
        }
@if ($m2c_table_row_creation == 1)@
        if (rowreq_ctx->rowreq_flags & MFD_ROW_CREATED) {
            rowreq_ctx->rowreq_flags &= ~MFD_ROW_CREATED;
            CONTAINER_INSERT(${context}_if_ctx.container, rowreq_ctx);
        }
@end@ # creation
    }

    return SNMP_ERR_NOERROR;
} /* _mfd_${context}_irreversible_commit */

@end@ # settable
/***********************************************************************
 *
 * DATA ACCESS
 *
 ***********************************************************************/
@    include mfd-access-${m2c_table_access}-defines.m2i@
@    if $m2c_table_persistent == 1@
@       include mfd-persistence.m2i@
@    end@

${context}_rowreq_ctx *
${context}_row_find_by_mib_index(${context}_mib_index *mib_idx)
{
    ${context}_rowreq_ctx   *rowreq_ctx;
    oid                      oid_tmp[MAX_OID_LEN];
    netsnmp_index            oid_idx;
    int                      rc;

    /*
     * set up storage for OID
     */
    oid_idx.oids = oid_tmp;
    oid_idx.len = sizeof(oid_tmp)/sizeof(oid);

    /*
     * convert
     */
    rc = ${context}_index_to_oid(&oid_idx, mib_idx);
    if (MFD_SUCCESS != rc)
        return NULL;

    rowreq_ctx = (${context}_rowreq_ctx*)CONTAINER_FIND(${context}_if_ctx.container, &oid_idx);

    return rowreq_ctx;
}

@   if $m2c_table_refcounts == 1@
int
${context}_row_ref_increment(${context}_rowreq_ctx *rowreq_ctx)
{
    if (NULL == rowreq_ctx)
        return -1;
    
    ++rowreq_ctx->ref_count;
    DEBUGMSGTL(("${context}:${context}_row_ref_increment",
                "row %p ref count is %d\n",rowreq_ctx,
                rowreq_ctx->ref_count));

    return MFD_SUCCESS;
}

int
${context}_row_ref_decrement(${context}_rowreq_ctx *rowreq_ctx)
{
    if (NULL == rowreq_ctx)
        return -1;
    
    if (0 == rowreq_ctx->ref_count) {
        snmp_log(LOG_WARNING,"attempt to decrement ref_count below 0\n");
        return -2;
    }
    --rowreq_ctx->ref_count;
    DEBUGMSGTL(("${context}:${context}_row_ref_decrement",
                "row %p ref count is %d\n",rowreq_ctx,
                rowreq_ctx->ref_count));

    return MFD_SUCCESS;
}
    
@   end@ // refcounts
@end@ # foreach table
##
########################################################################
@if $m2c_mark_boundary == 1@
/** END code generated by $RCSfile$ $Revision$ */
@end@
