#############################################################  -*- 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@

NETSNMP_STATIC_INLINE int _${context}_undo_column( ${context}_rowreq_ctx *rowreq_ctx,
                                                   netsnmp_variable_list *var, int column );

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

@end@
@   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 retrival. */
    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 =
                  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)@
/**
 * @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 =
                  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 =
                  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 */

##----------------------------------------------------------------------
@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 */
@end@ # $m2c_table_row_creation

########################################################################
##
/***********************************************************************
 *
 * 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 =
                  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 =
                  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 =
                  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 =
                  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 =
                  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 =
                  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 =
                  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 =
                  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 =
                  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 = 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@
