## -*- c -*-
######################################################################
## Do the .h file
######################################################################
@open ${name}_checkfns_local.h@
/*
 * Note: this file originally auto-generated by mib2c using
 *        : $Id$
 * 
 */
#ifndef $name.uc_CHECKFNS_H
#define $name.uc_CHECKFNS_H

@foreach $t table@
/* these functions are designed to check incoming values for 
columns in the $t table for legality with respect to 
datatype and value according to local conventions.  You should modify
them as appropriate.  They will be called from parent check_value
functions that are auto-generated using mib2c and the parent functions
should NOT be modified.
 */

  @foreach $i column@
    @if $i.access =~ /(Write|Create)/@
    int check_${i}_local(int type, $i.decl *val, size_t val_len, $i.decl *old_val, size_t old_val_len);
    @end@
  @end@
@end@

#endif /* $name.uc_CHECKFNS_H */

######################################################################
## Do the .c file
######################################################################
@open ${name}_checkfns_local.c@
/*
 * Note: this file originally auto-generated by mib2c using
 *        $Id$
 */

/* standard headers */
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include "${name}_checkfns.h"
#include "${name}_enums.h"
@run mib2c.column_enums.conf@

@foreach $t table@
  @foreach $i column@
    @if $i.access =~ /(Write|Create)/@
/** Decides if an incoming value for the $i mib node is legal, from a local implementation specific viewpoint.
 *  @param type    The incoming data type.
 *  @param val     The value to be checked.
 *  @param val_len The length of data stored in val (in bytes).
 *  @return 0 if the incoming value is legal, an SNMP error code otherwise.
 */
    int
    check_${i}_local(int type, $i.decl *val, size_t val_len, $i.decl *old_val, size_t old_val_len) {

    /** XXX: you may want to check aspects of the new value that
       were not covered by the automatic checks by the parent function. */

    /** XXX: you make want to check that the requested change from
        the old value to the new value is legal (ie, the transistion
        from one value to another is legal */
      
    /** if everything looks ok, return SNMP_ERR_NOERROR */
      return SNMP_ERR_NOERROR;
    }
    @end@
  @end@
@end@
