@run mib2c.check_values_local.conf@
## -*- c -*-
######################################################################
## Do the .h file
######################################################################
@open ${name}_checkfns.h@
/*
 * Note: this file originally auto-generated by mib2c
 * using mib2c.check_values.conf
 *        : mib2c.iterate.conf,v 5.6 2003/02/20 00:52:07 hardaker Exp $
 */

/***********************************************************************
 *   This file is auto-generated and SHOULD NOT BE EDITED by hand.
 *   Modify the ${name}_checkfns_local.[ch] files insead.
 *   (so that you can regenerate this one as mib2c improvements are made)
 ***********************************************************************/
#ifndef $name.uc_CHECKFNS_H
#define $name.uc_CHECKFNS_H

/** make sure we load the functions that you can modify */
config_require(${name}_checkfns_local)

@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.
 */

  @foreach $i column@
    @if $i.access =~ /(Write|Create)/@
      int check_${i}(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.c@
/*
 * Note: this file originally auto-generated by mib2c
 * using mib2c.check_values.conf
 */

/********************************************************************
 *                       NOTE   NOTE   NOTE
 *   This file is auto-generated and SHOULD NOT BE EDITED by hand.
 *   Modify the ${name}_checkfns_local.[ch] files insead so that you
 *   can regenerate this one as mib2c improvements are made.
 ********************************************************************/

/* standard headers */
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include "${name}_checkfns.h"
#include "${name}_checkfns_local.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.
 *  @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}(int type, $i.decl *val, size_t val_len,
             $i.decl *old_val, size_t old_val_len) {

    int ret;

    /** Check to see that we were called legally */
      if (!val)
        return SNMP_ERR_GENERR;

    /** Check the incoming type for correctness */
      if (type != $i.type)
        return SNMP_ERR_WRONGTYPE;

      @if $i.type =~ /int/i@
        @eval $x = 0@
      	@foreach $l, $v enum@
           @if $x == 0@
    /** Check the enums.  Legal values will continue, others return error. */
           switch (*val) {
	       @eval $x = 1@
	   @end@
      	  case $i.uc_$l.uc:
      	@end@
        @if $x == 1@
      	    break;

    /** not a legal enum value.  return an error */
      	  default:
      	    return SNMP_ERR_INCONSISTENTVALUE;
      	}
        @end@
	ret = SNMP_ERR_NOERROR;
        @eval $x = 0@
        @foreach $min $max range $i@
          @if $x == 0@
    /** Check the ranges of the passed value for legality */
            @eval $x = 1@
	    if (
	  @else@
	        &&
          @end@
	       !(*val >= $min && *val <= $max)
        @end@
        @if $x != 0@
            ) {
            return SNMP_ERR_WRONGVALUE;
            }
        @end@
      @end@
      @if $i.type =~ /str/i@
        @eval $x = 0@
        @foreach $min $max range $i@
          @if $x == 0@
    /** Check the ranges of the passed value for legality */
            @eval $x = 1@
	    if (
	  @else@
	        &&
          @end@
	       !(val_len >= $min && val_len <= $max)
        @end@
        @if $x == 1@
            ) {
            return SNMP_ERR_WRONGVALUE;
            }
        @end@
      @end@

      @if "$i.syntax" eq "RowStatus"@
      if (ret = check_rowstatus_transition((old_val) ? *old_val : RS_NONEXISTENT, *val))
          return ret;
      @end@
      @if "$i.syntax" eq "StorageType"@
      if (ret = check_storage_transition((old_val) ? *old_val : SNMP_STORAGE_NONE, *val))
          return ret;
      @end@

    /** looks ok, call the local version of the same function. */
      return check_${i}_local(type, val, val_len, old_val, old_val_len);
    }
    @end@
  @end@
@end@
