## -*- 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 */
@foreach $i notifications@
int send_${i}_trap(void);
@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"

static const oid snmptrap_oid[] = {1, 3, 6, 1, 6, 3, 1, 1, 4, 1, 0};

@foreach $i notifications@
int
send_${i}_trap( void )
{
    netsnmp_variable_list  *var_list = NULL;
    const oid ${i}_oid[] = { $i.commaoid };
    @foreach $v varbinds@
    @if $v.isscalar@
    const oid ${v}_oid[] = { $v.commaoid, 0 };
    @end@
    @if !$v.isscalar@
    const oid ${v}_oid[] = { $v.commaoid, /* insert index here */ };
    @end@
    @end@

    /*
     * Set the snmpTrapOid.0 value
     */
    snmp_varlist_add_variable(&var_list,
        snmptrap_oid, OID_LENGTH(snmptrap_oid),
        ASN_OBJECT_ID,
        ${i}_oid, sizeof(${i}_oid));
    
    @if count_varbinds($i) > 0@
    /*
     * Add any objects from the trap definition
     */
    @end@
    @foreach $v varbinds@
    snmp_varlist_add_variable(&var_list,
        ${v}_oid, OID_LENGTH(${v}_oid),
        $v.type,
        /* Set an appropriate value for $v */
        NULL, 0);
    @end@

    /*
     * Add any extra (optional) objects here
     */

    /*
     * Send the trap to the list of configured destinations
     *  and clean up
     */
    send_v2trap( var_list );
    snmp_free_varbind( var_list );

    return SNMP_ERR_NOERROR;
}
@end@
