## -*- 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,  NETSNMP_OLDAPI_RWRITE,
 var_${name}, $suffixlen,  { $suffix }},
    @end@
    @if !$i.settable@
{$i.uc,  $i.type,  NETSNMP_OLDAPI_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,  NETSNMP_OLDAPI_RWRITE,
 var_${i}, $suffixlen,  { $suffix $ctmp 1, $c.subid }},
    @end@
    @if !$c.settable@
{$c.uc,  $c.type,  NETSNMP_OLDAPI_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@
