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

/* function declarations */
void init_$name(void);
FindVarMethod var_$name;
@foreach $i table@
FindVarMethod var_${i};
@end@
@foreach $i scalar@
    @if $i.settable@
    WriteMethod write_${i};
    @end@
@end@
@foreach $i table@
 @foreach $c column@
    @if $c.settable@
    WriteMethod write_${c};
    @end@
 @end@
@end@

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

#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/agent/net-snmp-agent-includes.h>
#include "${name}.h"

/* 
 * ${name}_variables_oid:
 *   this is the top level oid that we want to register under.  This
 *   is essentially a prefix, with the suffix appearing in the
 *   variable below.
 */

oid ${name}_variables_oid[] = { $name.commaoid };

/* 
 * variable4 ${name}_variables:
 *   this variable defines function callbacks and type return information 
 *   for the $name mib section 
 */

struct variable4 ${name}_variables[] = {
/*  magic number        , variable type , ro/rw , callback fn  , L, oidsuffix */
@eval $magic = 0@
@eval $namelen = length("$name.commaoid")@
@foreach $i scalar@
    @eval $magic = $magic + 1@
    @eval $suffix = substr("$i.commaoid", $namelen + 1)@
    @eval $suffixlen = $i.oidlength - $name.oidlength@
#define $i.uc		$magic
    @if $i.settable@
{$i.uc,  $i.type,  RWRITE,  var_${name}, $suffixlen,  { $suffix }},
    @end@
    @if !$i.settable@
{$i.uc,  $i.type,  RONLY ,  var_${name}, $suffixlen,  { $suffix }},
    @end@
@end@

@foreach $i table@
 @eval $magic = 0@
 @eval $nlen2 = length("$i.commaoid")@
 @if $nlen2 > $namelen@
  @eval $suffix = substr("$i.commaoid", $namelen + 1)@
  @eval $ctmp = ","@
 @else@
  @eval $suffix = ""@
  @eval $ctmp = ""@
 @end@
 @eval $suffixlen = $i.oidlength - $name.oidlength + 2@
 @foreach $c column@
    @eval $magic = $magic + 1@
#define $c.uc		$magic
    @if $c.settable@
{$c.uc,  $c.type,  RWRITE,  var_${i}, $suffixlen,  { $suffix $ctmp 1, $c.subid }},
    @end@
    @if !$c.settable@
{$c.uc,  $c.type,  RONLY,   var_${i}, $suffixlen,  { $suffix $ctmp 1, $c.subid }},
    @end@
 @end@
@end@
};
/*    (L = length of the oidsuffix) */


/** Initializes the $name module */
void
init_$name(void)
{

    DEBUGMSGTL(("$name", "Initializing\n"));

    /* register ourselves with the agent to handle our mib tree */
    REGISTER_MIB("$name", ${name}_variables, variable4,
               ${name}_variables_oid);

    /* place any other initialization junk you need here */
}

/*
 * var_$name():
 *   This function is called every time the agent gets a request for
 *   a scalar variable that might be found within your mib section
 *   registered above.  It is up to you to do the right thing and
 *   return the correct value.
 *     You should also correct the value of "var_len" if necessary.
 *
 *   Please see the documentation for more information about writing
 *   module extensions, and check out the examples in the examples
 *   and mibII directories.
 */
unsigned char *
var_$name(struct variable *vp, 
                oid     *name, 
                size_t  *length, 
                int     exact, 
                size_t  *var_len, 
                WriteMethod **write_method)
{
    /* variables we may use later */
    static long long_ret;
    static u_long ulong_ret;
    static unsigned char string[SPRINT_MAX_LEN];
    static oid objid[MAX_OID_LEN];
    static struct counter64 c64;

    if (header_generic(vp,name,length,exact,var_len,write_method)
                                  == MATCH_FAILED )
    return NULL;

    /* 
   * this is where we do the value assignments for the mib results.
   */
    switch(vp->magic) {
@foreach $i scalar@
    case $i.uc:
    @if $i.settable@
        *write_method = write_${i};
    @end@
        VAR = VALUE;	/* XXX */
        return (u_char*) &VAR;
@end@
    default:
      ERROR_MSG("");
    }
    return NULL;
}


@foreach $i table@
/*
 * var_$i():
 *   Handle this table separately from the scalar value case.
 *   The workings of this are basically the same as for var_$name above.
 */
unsigned char *
var_$i(struct variable *vp,
    	    oid     *name,
    	    size_t  *length,
    	    int     exact,
    	    size_t  *var_len,
    	    WriteMethod **write_method)
{
    /* variables we may use later */
    static long long_ret;
    static u_long ulong_ret;
    static unsigned char string[SPRINT_MAX_LEN];
    static oid objid[MAX_OID_LEN];
    static struct counter64 c64;

    /* 
   * This assumes that the table is a 'simple' table.
   *	See the implementation documentation for the meaning of this.
   *	You will need to provide the correct value for the TABLE_SIZE parameter
   *
   * If this table does not meet the requirements for a simple table,
   *	you will need to provide the replacement code yourself.
   *	Mib2c is not smart enough to write this for you.
   *    Again, see the implementation documentation for what is required.
   */
    if (header_simple_table(vp,name,length,exact,var_len,write_method, TABLE_SIZE)
                                                == MATCH_FAILED )
    return NULL;

    /* 
   * this is where we do the value assignments for the mib results.
   */
    switch(vp->magic) {
@foreach $c column@
    case $c.uc:
    @if $c.settable@
        *write_method = write_${c};
    @end@
        VAR = VALUE;	/* XXX */
        return (u_char*) &VAR;
@end@
    default:
      ERROR_MSG("");
    }
    return NULL;
}
@end@

@foreach $i scalar@
@if $i.settable@


int
write_$i(int      action,
            u_char   *var_val,
            u_char   var_val_type,
            size_t   var_val_len,
            u_char   *statP,
            oid      *name,
            size_t   name_len)
{
    $i.decl value;
    int size;

    switch ( action ) {
        case RESERVE1:
          if (var_val_type != $i.type) {
              fprintf(stderr, "write to $name not $i.type\n");
              return SNMP_ERR_WRONGTYPE;
          }
          if (var_val_len > sizeof($i.decl)) {
              fprintf(stderr,"write to $name: bad length\n");
              return SNMP_ERR_WRONGLENGTH;
          }
          break;

        case RESERVE2:
          size  = var_val_len;
          value = * ($i.decl *) var_val;

          break;

        case FREE:
             /* Release any resources that have been allocated */
          break;

        case ACTION:
             /*
              * The variable has been stored in 'value' for you to use,
              * and you have just been asked to do something with it.
              * Note that anything done here must be reversable in the UNDO case
              */
          break;

        case UNDO:
             /* Back out any changes made in the ACTION case */
          break;

        case COMMIT:
             /*
              * Things are working well, so it's now safe to make the change
              * permanently.  Make sure that anything done here can't fail!
              */
          break;
    }
    return SNMP_ERR_NOERROR;
}
@end@
@end@

@foreach $i table@
@foreach $c column@
@if $c.settable@
int
write_$c(int      action,
            u_char   *var_val,
            u_char   var_val_type,
            size_t   var_val_len,
            u_char   *statP,
            oid      *name,
            size_t   name_len)
{
    $c.decl value;
    int size;

    switch ( action ) {
        case RESERVE1:
          if (var_val_type != $c.type) {
              fprintf(stderr, "write to $name not $c.type\n");
              return SNMP_ERR_WRONGTYPE;
          }
          if (var_val_len > sizeof($c.decl)) {
              fprintf(stderr,"write to $name: bad length\n");
              return SNMP_ERR_WRONGLENGTH;
          }
          break;

        case RESERVE2:
          size  = var_val_len;
          value = * ($c.decl *) var_val;

          break;

        case FREE:
             /* Release any resources that have been allocated */
          break;

        case ACTION:
             /*
              * The variable has been stored in 'value' for you to use,
              * and you have just been asked to do something with it.
              * Note that anything done here must be reversable in the UNDO case
              */
          break;

        case UNDO:
             /* Back out any changes made in the ACTION case */
          break;

        case COMMIT:
             /*
              * Things are working well, so it's now safe to make the change
              * permanently.  Make sure that anything done here can't fail!
              */
          break;
    }
    return SNMP_ERR_NOERROR;
}
@end@
@end@
@end@
