/*
 * This file was generated by mib2c and is intended for use as
 * a mib module for the ucd-snmp snmpd agent. 
 */


/*
 * This should always be included first before anything else 
 */
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-features.h>
#if HAVE_STDLIB_H
#include <stdlib.h>
#endif
#if HAVE_STRING_H
#include <string.h>
#else
#include <strings.h>
#endif
#ifdef HAVE_LIMITS_H
#include <limits.h>
#endif

netsnmp_feature_require(mib_snprint_variable)
netsnmp_feature_require(tdomain_support)
netsnmp_feature_require(check_vb_uint)
netsnmp_feature_require(string_time_to_secs)
#ifndef NETSNMP_NO_WRITE_SUPPORT
netsnmp_feature_require(header_complex_find_entry)
#endif /* NETSNMP_NO_WRITE_SUPPORT */

/*
 * minimal include directives 
 */
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/agent/net-snmp-agent-includes.h>

#include "header_complex.h"
#include "mteTriggerTable.h"
#include "mteTriggerBooleanTable.h"
#include "mteTriggerDeltaTable.h"
#include "mteTriggerExistenceTable.h"
#include "mteTriggerThresholdTable.h"
#include "mteEventTable.h"
#include "mteObjectsTable.h"

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

/*
 * trap definitions 
 */
oid             mteTriggerFired[] = { 1, 3, 6, 1, 2, 1, 88, 2, 0, 1 };
oid             mteTriggerRising[] = { 1, 3, 6, 1, 2, 1, 88, 2, 0, 2 };
oid             mteTriggerFalling[] = { 1, 3, 6, 1, 2, 1, 88, 2, 0, 3 };
oid             mteTriggerFailure[] = { 1, 3, 6, 1, 2, 1, 88, 2, 0, 4 };
oid             mteEventSetFailure[] = { 1, 3, 6, 1, 2, 1, 88, 2, 0, 5 };

/*
 * trap objects 
 */
oid             mteHotTrigger[] = { 1, 3, 6, 1, 2, 1, 88, 2, 1, 1 };
oid             mteHotTargetName[] = { 1, 3, 6, 1, 2, 1, 88, 2, 1, 2 };
oid             mteHotContextName[] = { 1, 3, 6, 1, 2, 1, 88, 2, 1, 3 };
oid             mteHotOID[] = { 1, 3, 6, 1, 2, 1, 88, 2, 1, 4 };
oid             mteHotValue[] = { 1, 3, 6, 1, 2, 1, 88, 2, 1, 5 };
oid             mteFailedReason[] = { 1, 3, 6, 1, 2, 1, 88, 2, 1, 6 };

/*
 * For discontinuity checking.  
 */
oid             sysUpTimeInstance[] = { 1, 3, 6, 1, 2, 1, 1, 3, 0 };

oid             mteTriggerTable_variables_oid[] =
    { 1, 3, 6, 1, 2, 1, 88, 1, 2, 2 };


/*
 * variable2 mteTriggerTable_variables:
 *   this variable defines function callbacks and type return information 
 *   for the mteTriggerTable mib section 
 */


#ifndef NETSNMP_NO_WRITE_SUPPORT
struct variable2 mteTriggerTable_variables[] = {
    /*
     * magic number        , variable type , ro/rw , callback fn  , L, oidsuffix 
     */
#define   MTETRIGGERCOMMENT     5
    {MTETRIGGERCOMMENT, ASN_OCTET_STR, NETSNMP_OLDAPI_RWRITE,
     var_mteTriggerTable, 2, {1, 3}},
#define   MTETRIGGERTEST        6
    {MTETRIGGERTEST, ASN_OCTET_STR, NETSNMP_OLDAPI_RWRITE,
     var_mteTriggerTable, 2, {1, 4}},
#define   MTETRIGGERSAMPLETYPE  7
    {MTETRIGGERSAMPLETYPE, ASN_INTEGER, NETSNMP_OLDAPI_RWRITE,
     var_mteTriggerTable, 2, {1, 5}},
#define   MTETRIGGERVALUEID     8
    {MTETRIGGERVALUEID, ASN_OBJECT_ID, NETSNMP_OLDAPI_RWRITE,
     var_mteTriggerTable, 2, {1, 6}},
#define   MTETRIGGERVALUEIDWILDCARD  9
    {MTETRIGGERVALUEIDWILDCARD, ASN_INTEGER, NETSNMP_OLDAPI_RWRITE,
     var_mteTriggerTable, 2, {1, 7}},
#define   MTETRIGGERTARGETTAG   10
    {MTETRIGGERTARGETTAG, ASN_OCTET_STR, NETSNMP_OLDAPI_RWRITE,
     var_mteTriggerTable, 2, {1, 8}},
#define   MTETRIGGERCONTEXTNAME  11
    {MTETRIGGERCONTEXTNAME, ASN_OCTET_STR, NETSNMP_OLDAPI_RWRITE,
     var_mteTriggerTable, 2, {1, 9}},
#define   MTETRIGGERCONTEXTNAMEWILDCARD  12
    {MTETRIGGERCONTEXTNAMEWILDCARD, ASN_INTEGER, NETSNMP_OLDAPI_RWRITE,
     var_mteTriggerTable, 2, {1, 10}},
#define   MTETRIGGERFREQUENCY   13
    {MTETRIGGERFREQUENCY, ASN_UNSIGNED, NETSNMP_OLDAPI_RWRITE,
     var_mteTriggerTable, 2, {1, 11}},
#define   MTETRIGGEROBJECTSOWNER  14
    {MTETRIGGEROBJECTSOWNER, ASN_OCTET_STR, NETSNMP_OLDAPI_RWRITE,
     var_mteTriggerTable, 2, {1, 12}},
#define   MTETRIGGEROBJECTS     15
    {MTETRIGGEROBJECTS, ASN_OCTET_STR, NETSNMP_OLDAPI_RWRITE,
     var_mteTriggerTable, 2, {1, 13}},
#define   MTETRIGGERENABLED     16
    {MTETRIGGERENABLED, ASN_INTEGER, NETSNMP_OLDAPI_RWRITE,
     var_mteTriggerTable, 2, {1, 14}},
#define   MTETRIGGERENTRYSTATUS  17
    {MTETRIGGERENTRYSTATUS, ASN_INTEGER, NETSNMP_OLDAPI_RWRITE,
     var_mteTriggerTable, 2, {1, 15}},
};
#else /* !NETSNMP_NO_WRITE_SUPPORT */
struct variable2 mteTriggerTable_variables[] = {
    /*
     * magic number        , variable type , ro/rw , callback fn  , L, oidsuffix 
     */
#define   MTETRIGGERCOMMENT     5
    {MTETRIGGERCOMMENT, ASN_OCTET_STR, NETSNMP_OLDAPI_RONLY,
     var_mteTriggerTable, 2, {1, 3}},
#define   MTETRIGGERTEST        6
    {MTETRIGGERTEST, ASN_OCTET_STR, NETSNMP_OLDAPI_RONLY,
     var_mteTriggerTable, 2, {1, 4}},
#define   MTETRIGGERSAMPLETYPE  7
    {MTETRIGGERSAMPLETYPE, ASN_INTEGER, NETSNMP_OLDAPI_RONLY,
     var_mteTriggerTable, 2, {1, 5}},
#define   MTETRIGGERVALUEID     8
    {MTETRIGGERVALUEID, ASN_OBJECT_ID, NETSNMP_OLDAPI_RONLY,
     var_mteTriggerTable, 2, {1, 6}},
#define   MTETRIGGERVALUEIDWILDCARD  9
    {MTETRIGGERVALUEIDWILDCARD, ASN_INTEGER, NETSNMP_OLDAPI_RONLY,
     var_mteTriggerTable, 2, {1, 7}},
#define   MTETRIGGERTARGETTAG   10
    {MTETRIGGERTARGETTAG, ASN_OCTET_STR, NETSNMP_OLDAPI_RONLY,
     var_mteTriggerTable, 2, {1, 8}},
#define   MTETRIGGERCONTEXTNAME  11
    {MTETRIGGERCONTEXTNAME, ASN_OCTET_STR, NETSNMP_OLDAPI_RONLY,
     var_mteTriggerTable, 2, {1, 9}},
#define   MTETRIGGERCONTEXTNAMEWILDCARD  12
    {MTETRIGGERCONTEXTNAMEWILDCARD, ASN_INTEGER, NETSNMP_OLDAPI_RONLY,
     var_mteTriggerTable, 2, {1, 10}},
#define   MTETRIGGERFREQUENCY   13
    {MTETRIGGERFREQUENCY, ASN_UNSIGNED, NETSNMP_OLDAPI_RONLY,
     var_mteTriggerTable, 2, {1, 11}},
#define   MTETRIGGEROBJECTSOWNER  14
    {MTETRIGGEROBJECTSOWNER, ASN_OCTET_STR, NETSNMP_OLDAPI_RONLY,
     var_mteTriggerTable, 2, {1, 12}},
#define   MTETRIGGEROBJECTS     15
    {MTETRIGGEROBJECTS, ASN_OCTET_STR, NETSNMP_OLDAPI_RONLY,
     var_mteTriggerTable, 2, {1, 13}},
#define   MTETRIGGERENABLED     16
    {MTETRIGGERENABLED, ASN_INTEGER, NETSNMP_OLDAPI_RONLY,
     var_mteTriggerTable, 2, {1, 14}},
#define   MTETRIGGERENTRYSTATUS  17
    {MTETRIGGERENTRYSTATUS, ASN_INTEGER, NETSNMP_OLDAPI_RONLY,
     var_mteTriggerTable, 2, {1, 15}},
};
#endif /* !NETSNMP_NO_WRITE_SUPPORT */

/*
 * (L = length of the oidsuffix) 
 */


/*
 * global storage of our data, saved in and configured by header_complex() 
 */
struct header_complex_index *mteTriggerTableStorage = NULL;

netsnmp_session *mte_callback_sess = NULL;
extern int      callback_master_num;

/*
 * init_mteTriggerTable():
 *   Initialization routine.  This is called when the agent starts up.
 *   At a minimum, registration of your variables should take place here.
 */
void
init_mteTriggerTable(void)
{
    DEBUGMSGTL(("mteTriggerTable", "initializing...  "));

#ifndef NETSNMP_TRANSPORT_CALLBACK_DOMAIN
    snmp_log(LOG_WARNING,"mteTriggerTable has been disabled because "
               "the callback transport is not available.\n");
    return;
#endif

    /*
     * register ourselves with the agent to handle our mib tree 
     */
    REGISTER_MIB("mteTriggerTable", mteTriggerTable_variables, variable2,
                 mteTriggerTable_variables_oid);


    /*
     * register our config handler(s) to deal with registrations 
     */
    snmpd_register_config_handler("mteTriggerTable", parse_mteTriggerTable,
                                  NULL, NULL);

    snmpd_register_config_handler("monitor", parse_simple_monitor, NULL,
                                  "[options] monitor_expression [see \"man snmpd.conf\"]");
    snmpd_register_config_handler("defaultMonitors",
                                  parse_default_monitors, NULL, "yes|no");

    /*
     * we need to be called back later to store our data 
     */
    snmp_register_callback(SNMP_CALLBACK_LIBRARY, SNMP_CALLBACK_STORE_DATA,
                           store_mteTriggerTable, NULL);


    /*
     * place any other initialization junk you need here 
     */
    se_add_pair_to_slist("mteBooleanOperators", strdup("!="),
                         MTETRIGGERBOOLEANCOMPARISON_UNEQUAL);
    se_add_pair_to_slist("mteBooleanOperators", strdup("=="),
                         MTETRIGGERBOOLEANCOMPARISON_EQUAL);
    se_add_pair_to_slist("mteBooleanOperators", strdup("<"),
                         MTETRIGGERBOOLEANCOMPARISON_LESS);
    se_add_pair_to_slist("mteBooleanOperators", strdup("<="),
                         MTETRIGGERBOOLEANCOMPARISON_LESSOREQUAL);
    se_add_pair_to_slist("mteBooleanOperators", strdup(">"),
                         MTETRIGGERBOOLEANCOMPARISON_GREATER);
    se_add_pair_to_slist("mteBooleanOperators", strdup(">="),
                         MTETRIGGERBOOLEANCOMPARISON_GREATEROREQUAL);

    DEBUGMSGTL(("mteTriggerTable", "done.\n"));
}

struct mteTriggerTable_data *
create_mteTriggerTable_data(void)
{
    struct mteTriggerTable_data *StorageNew;

    StorageNew = SNMP_MALLOC_STRUCT(mteTriggerTable_data);

    /*
     * fill in default row values here into StorageNew 
     */
    /*
     * fill in values for all tables (even if not
     * appropriate), since its easier to do here than anywhere
     * else 
     */
    StorageNew->mteTriggerComment = strdup("");
    StorageNew->mteTriggerTest = strdup("");
    StorageNew->mteTriggerTest[0] |= (char) MTETRIGGERTEST_BOOLEAN;
    StorageNew->mteTriggerTestLen = 1;
    StorageNew->mteTriggerSampleType = MTETRIGGERSAMPLETYPE_ABSOLUTEVALUE;
    StorageNew->mteTriggerValueID = calloc(1, sizeof(oid) * sizeof(2)); /* 0.0 */
    StorageNew->mteTriggerValueIDLen = 2;
    StorageNew->mteTriggerValueIDWildcard =
        MTETRIGGERVALUEIDWILDCARD_FALSE;
    StorageNew->mteTriggerTargetTag = strdup("");
    StorageNew->mteTriggerContextName = strdup("");
    StorageNew->mteTriggerContextNameWildcard =
        MTETRIGGERCONTEXTNAMEWILDCARD_FALSE;
    StorageNew->mteTriggerFrequency = 600;
    StorageNew->mteTriggerObjectsOwner = strdup("");
    StorageNew->mteTriggerObjects = strdup("");
    StorageNew->mteTriggerEnabled = MTETRIGGERENABLED_FALSE;
    StorageNew->mteTriggerDeltaDiscontinuityID =
        netsnmp_memdup(sysUpTimeInstance, sizeof(sysUpTimeInstance));
    StorageNew->mteTriggerDeltaDiscontinuityIDLen =
        sizeof(sysUpTimeInstance) / sizeof(oid);
    StorageNew->mteTriggerDeltaDiscontinuityIDWildcard = TV_FALSE;
    StorageNew->mteTriggerDeltaDiscontinuityIDType =
        MTETRIGGERDELTADISCONTINUITYIDTYPE_TIMETICKS;
    StorageNew->mteTriggerExistenceTest = strdup("");
    StorageNew->mteTriggerExistenceTest[0] =
        (char) (MTETRIGGEREXISTENCETEST_PRESENT |
                MTETRIGGEREXISTENCETEST_ABSENT);
    StorageNew->mteTriggerExistenceTestLen = 1;
    StorageNew->mteTriggerExistenceStartup = strdup("");
    StorageNew->mteTriggerExistenceStartup[0] =
        (char) (MTETRIGGEREXISTENCESTARTUP_PRESENT);
    StorageNew->mteTriggerExistenceStartupLen = 1;
    StorageNew->mteTriggerExistenceObjectsOwner = strdup("");
    StorageNew->mteTriggerExistenceObjects = strdup("");
    StorageNew->mteTriggerExistenceEventOwner = strdup("");
    StorageNew->mteTriggerExistenceEvent = strdup("");
    StorageNew->mteTriggerBooleanComparison =
        MTETRIGGERBOOLEANCOMPARISON_UNEQUAL;
    StorageNew->mteTriggerBooleanStartup = MTETRIGGERBOOLEANSTARTUP_TRUE;
    StorageNew->mteTriggerBooleanObjectsOwner = strdup("");
    StorageNew->mteTriggerBooleanObjects = strdup("");
    StorageNew->mteTriggerBooleanEventOwner = strdup("");
    StorageNew->mteTriggerBooleanEvent = strdup("");
    StorageNew->mteTriggerThresholdStartup =
        MTETRIGGERTHRESHOLDSTARTUP_RISINGORFALLING;
    StorageNew->mteTriggerThresholdObjectsOwner = strdup("");
    StorageNew->mteTriggerThresholdObjects = strdup("");
    StorageNew->mteTriggerThresholdRisingEventOwner = strdup("");
    StorageNew->mteTriggerThresholdRisingEvent = strdup("");
    StorageNew->mteTriggerThresholdFallingEventOwner = strdup("");
    StorageNew->mteTriggerThresholdFallingEvent = strdup("");
    StorageNew->mteTriggerThresholdDeltaRisingEventOwner = strdup("");
    StorageNew->mteTriggerThresholdDeltaRisingEvent = strdup("");
    StorageNew->mteTriggerThresholdDeltaFallingEventOwner = strdup("");
    StorageNew->mteTriggerThresholdDeltaFallingEvent = strdup("");
    StorageNew->lastboolresult = -1;
    StorageNew->storageType = ST_NONVOLATILE;
    StorageNew->prevDiscoTicks = 0;
    StorageNew->prevUptimeTicks = 0;
    return StorageNew;
}

/*
 * mteTriggerTable_add(): adds a structure node to our data set 
 */
int
mteTriggerTable_add(struct mteTriggerTable_data *thedata)
{
    netsnmp_variable_list *vars = NULL;


    DEBUGMSGTL(("mteTriggerTable", "adding data...  "));
    /*
     * add the index variables to the varbind list, which is 
     * used by header_complex to index the data 
     */


    snmp_varlist_add_variable(&vars, NULL, 0, ASN_OCTET_STR, (char *) thedata->mteOwner, thedata->mteOwnerLen); /* mteOwner */
    snmp_varlist_add_variable(&vars, NULL, 0, ASN_PRIV_IMPLIED_OCTET_STR, (char *) thedata->mteTriggerName, thedata->mteTriggerNameLen);        /* mteTriggerName */



    header_complex_add_data(&mteTriggerTableStorage, vars, thedata);
    DEBUGMSGTL(("mteTriggerTable", "registered an entry\n"));


    DEBUGMSGTL(("mteTriggerTable", "done.\n"));
    return SNMPERR_SUCCESS;
}


#define MTE_PROCESS_LINE(line) \
  snprintf(buf, SPRINT_MAX_LEN, "-u %s %s", mte_default_user, line); \
  parse_simple_monitor("monitor", buf);

void
parse_default_monitors(const char *token, char *line)
{
    char            buf[SPRINT_MAX_LEN];
    char           *mte_default_user =
        netsnmp_ds_get_string(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_INTERNAL_SECNAME);

    if (strncmp(line, "yes", 3) == 0) {

        DEBUGMSGTL(("mteTriggerTable", "registering default monitors\n"));

        if (mte_default_user == NULL) {
            config_perror
                ("You must specify a user name first using the agentSecName token\n");
            return;
        }

        /*
         * we don't include many additional objects here as most of
         * the error messages are complete with the needed
         * information 
         */
        MTE_PROCESS_LINE
            ("-o prNames -o prErrMessage \"process table\" prErrorFlag != 0");
        MTE_PROCESS_LINE
            ("-o memErrorName -o memSwapErrorMsg \"memory\" memSwapError != 0");
        MTE_PROCESS_LINE
            ("-o extNames -o extOutput \"extTable\" extResult != 0");
        MTE_PROCESS_LINE
            ("-o dskPath -o dskErrorMsg \"dskTable\" dskErrorFlag != 0");
        MTE_PROCESS_LINE
            ("-o laNames -o laErrMessage  \"laTable\" laErrorFlag != 0");
        MTE_PROCESS_LINE
            ("-o fileName -o fileErrorMsg  \"fileTable\" fileErrorFlag != 0");
        /*
         * this one is not *all* that useful, because the error is
         * only kept for 30 seconds at most.  Maybe scan it every 30
         * seconds, but I'm not doing so without seeking other peoples
         * opinions first. 
         */
        MTE_PROCESS_LINE
            ("-o snmperrErrMessage  \"snmperrs\" snmperrErrorFlag != 0");
    }
}

static int      monitor_call_count = 0;
void
parse_simple_monitor(const char *token, char *line)
{
    char            buf[SPRINT_MAX_LEN], *cp, eventname[64];
    oid             obuf[MAX_OID_LEN];
    size_t          obufLen;
    struct mteTriggerTable_data *StorageNew;

    monitor_call_count++;
    eventname[0] = '\0';

    StorageNew = create_mteTriggerTable_data();
    StorageNew->storageType = ST_READONLY;
    StorageNew->mteTriggerEnabled = MTETRIGGERENABLED_TRUE;
    StorageNew->mteTriggerEntryStatus = RS_ACTIVE;
    StorageNew->mteTriggerValueIDWildcard = MTETRIGGERVALUEIDWILDCARD_TRUE;
    StorageNew->mteTriggerBooleanStartup = MTETRIGGERBOOLEANSTARTUP_TRUE;
    StorageNew->mteTriggerThresholdStartup =
        MTETRIGGERTHRESHOLDSTARTUP_RISINGORFALLING;
    StorageNew->mteTriggerExistenceTest[0] = 0;

    /*
     * owner = snmpd.conf, why not? 
     */
    StorageNew->mteOwner = strdup("snmpd.conf");
    StorageNew->mteOwnerLen = strlen(StorageNew->mteOwner);
    StorageNew->pdu_version = SNMP_VERSION_3;
    StorageNew->pdu_securityModel = SNMP_SEC_MODEL_USM;
    StorageNew->pdu_securityLevel = SNMP_SEC_LEVEL_AUTHNOPRIV;

    cp = line;

    while (cp && *cp == '-') {
        cp = copy_nword(cp, buf, sizeof(buf));
        switch (buf[1]) {
        case 't':
           /*
            * Threshold toggle
            */
           StorageNew->mteTriggerTest[0] = MTETRIGGERTEST_THRESHOLD;
           break;
        case 'i':
           /*
            * Single instance
            */
           StorageNew->mteTriggerValueIDWildcard = MTETRIGGERVALUEIDWILDCARD_FALSE;
           break;
        case 'r':
            if (cp) {
                int freq;
                cp = copy_nword(cp, buf, sizeof(buf));
                freq = netsnmp_string_time_to_secs(buf);
                if (freq == -1) {
                    config_perror("Invalid -r value\n");
                    /*
                     * XXX: free StorageNew 
                     */
                    return;
                }
                StorageNew->mteTriggerFrequency = (unsigend long) freq;
            } else {
                config_perror("No parameter after -r given\n");
                /*
                 * XXX: free StorageNew 
                 */
                return;
            }
            break;
        case 'u':
            if (cp) {
                cp = copy_nword(cp, buf, sizeof(buf));
                StorageNew->pdu_securityName = strdup(buf);
                StorageNew->pdu_securityNameLen = strlen(buf);
            } else {
                config_perror("No parameter after -u given\n");
                /*
                 * XXX: free StorageNew 
                 */
                return;
            }
            break;
        case 'e':
            if (cp) {
                cp = copy_nword(cp, eventname, sizeof(eventname));
            } else {
                config_perror("No parameter after -e given\n");
                /*
                 * XXX: free StorageNew 
                 */
                return;
            }
            break;
        case 'o':
            /*
             * oid 
             */
            cp = copy_nword(cp, buf, sizeof(buf));
            obufLen = MAX_OID_LEN;
            if (!snmp_parse_oid(buf, obuf, &obufLen)) {
		netsnmp_config_error("unable to parse oid: %s", buf);
                /*
                 * XXX: free StorageNew 
                 */
                return;
            }
            sprintf(buf, "snmpd.conf%d", monitor_call_count);
            mte_add_object_to_table("snmpd.conf", buf, obuf, obufLen, 1);

            if (StorageNew->mteTriggerObjectsOwnerLen == 0) {
                SNMP_FREE(StorageNew->mteTriggerObjectsOwner);
                StorageNew->mteTriggerObjectsOwner = strdup("snmpd.conf");
                StorageNew->mteTriggerObjectsOwnerLen =
                    strlen("snmpd.conf");
            }

            if (StorageNew->mteTriggerObjectsLen == 0) {
                SNMP_FREE(StorageNew->mteTriggerObjects);
                StorageNew->mteTriggerObjects = strdup(buf);
                StorageNew->mteTriggerObjectsLen = strlen(buf);
            }
            break;
        }
    }

    if (StorageNew->pdu_securityNameLen == 0) {
        char           *mte_default_user =
            netsnmp_ds_get_string(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_INTERNAL_SECNAME);
        if (mte_default_user) {
            StorageNew->pdu_securityName = strdup(mte_default_user);
            StorageNew->pdu_securityNameLen = strlen(mte_default_user);
        } else {
            config_perror("-u USER parameter required\n");
            /*
             * XXX: free StorageNew 
             */
            return;
        }
    }

    /*
     * name 
     */
    cp = copy_nword(cp, buf, sizeof(buf));
    if (!cp) {
        config_perror("illegal monitor: no name specified");
        /*
         * XXX: free StorageNew 
         */
        return;
    }

    StorageNew->mteTriggerName = strdup(buf);
    StorageNew->mteTriggerNameLen = strlen(StorageNew->mteTriggerName);

    /*
     * oid 
     */
    cp = copy_nword(cp, buf, sizeof(buf));
    obufLen = MAX_OID_LEN;
    if (!snmp_parse_oid(buf, obuf, &obufLen)) {
	netsnmp_config_error("unable to parse oid: %s", buf);
        /*
         * XXX: free StorageNew 
         */
        return;
    }
    if (StorageNew->mteTriggerValueID)
        free(StorageNew->mteTriggerValueID);
    StorageNew->mteTriggerValueID = snmp_duplicate_objid(obuf, obufLen);
    StorageNew->mteTriggerValueIDLen = obufLen;

    if (StorageNew->mteTriggerTest[0] == MTETRIGGERTEST_THRESHOLD) {
       /*
        * it's a threshold
        * grab 'low' and 'high' params
        */
        if (!cp) {
            config_perror("no lower threshold value specified");
       }
       cp = copy_nword(cp, buf, sizeof(buf));
       StorageNew->mteTriggerThresholdFalling = strtol(buf, NULL, 0);

        if (!cp) {
            config_perror("no upper threshold value specified");
       }
       cp = copy_nword(cp, buf, sizeof(buf));
       StorageNew->mteTriggerThresholdRising = strtol(buf, NULL, 0);
    } else {
        /*
         * if nothing beyond here, it's an existence test 
         */
        if (!cp) {
            StorageNew->mteTriggerTest[0] = (u_char)MTETRIGGERTEST_EXISTENCE;
            if (eventname[0] != '\0') {
                StorageNew->mteTriggerExistenceEventOwner =
                    strdup("snmpd.conf");
                StorageNew->mteTriggerExistenceEventOwnerLen =
                    strlen(StorageNew->mteTriggerExistenceEventOwner);
                StorageNew->mteTriggerExistenceEvent =
                    strdup(eventname);
                StorageNew->mteTriggerExistenceEventLen =
                    strlen(eventname);
            }
            mteTriggerTable_add(StorageNew);
            return;
        }

        /*
         * assume boolean (need to deal with threshold statements) 
         */
        cp = copy_nword(cp, buf, sizeof(buf));
        if ((StorageNew->mteTriggerBooleanComparison =
             se_find_value_in_slist("mteBooleanOperators", buf)) == -1) {
            config_perror("illegal boolean operator");
            return;
        }

        /*
         * XXX: add threshold 
         */
        StorageNew->mteTriggerTest[0] = MTETRIGGERTEST_BOOLEAN;
        if (!cp) {
            config_perror("no comparison value specified");
            /*
             * XXX: free StorageNew 
             */
            return;
        }

        cp = copy_nword(cp, buf, sizeof(buf));
        StorageNew->mteTriggerBooleanValue = strtol(buf, NULL, 0);

        if (eventname[0] != '\0') {
            StorageNew->mteTriggerBooleanEventOwner =
                strdup("snmpd.conf");
            StorageNew->mteTriggerBooleanEventOwnerLen =
                strlen(StorageNew->mteTriggerBooleanEventOwner);
            StorageNew->mteTriggerBooleanEvent =
                strdup(eventname);
            StorageNew->mteTriggerBooleanEventLen =
                strlen(eventname);
        }
    }
    mteTriggerTable_add(StorageNew);
    mte_enable_trigger(StorageNew);

    DEBUGMSGTL(("mteTriggerTable", "added simple monitor: %s\n",
                StorageNew->mteTriggerName));
} /* parse_simple_monitor */


/*
 * parse_mteTriggerTable():
 *   parses .conf file entries needed to configure the mib.
 */
void
parse_mteTriggerTable(const char *token, char *line)
{
    size_t          tmpint;
    oid            *tmpoid = NULL;
    struct mteTriggerTable_data *StorageTmp =
        SNMP_MALLOC_STRUCT(mteTriggerTable_data);

    DEBUGMSGTL(("mteTriggerTable", "parsing config...  "));

    if (StorageTmp == NULL) {
        config_perror("malloc failure");
        return;
    }

    line =
        read_config_read_data(ASN_OCTET_STR, line, &StorageTmp->mteOwner,
                              &StorageTmp->mteOwnerLen);
    if (StorageTmp->mteOwner == NULL) {
        config_perror("invalid specification for mteOwner");
        return;
    }

    line =
        read_config_read_data(ASN_OCTET_STR, line,
                              &StorageTmp->mteTriggerName,
                              &StorageTmp->mteTriggerNameLen);
    if (StorageTmp->mteTriggerName == NULL) {
        config_perror("invalid specification for mteTriggerName");
        return;
    }

    line =
        read_config_read_data(ASN_OCTET_STR, line,
                              &StorageTmp->mteTriggerComment,
                              &StorageTmp->mteTriggerCommentLen);
    if (StorageTmp->mteTriggerComment == NULL) {
        config_perror("invalid specification for mteTriggerComment");
        return;
    }

    line =
        read_config_read_data(ASN_OCTET_STR, line,
                              &StorageTmp->mteTriggerTest,
                              &StorageTmp->mteTriggerTestLen);
    if (StorageTmp->mteTriggerTest == NULL) {
        config_perror("invalid specification for mteTriggerTest");
        return;
    }

    line =
        read_config_read_data(ASN_INTEGER, line,
                              &StorageTmp->mteTriggerSampleType, &tmpint);

    line =
        read_config_read_data(ASN_OBJECT_ID, line,
                              &StorageTmp->mteTriggerValueID,
                              &StorageTmp->mteTriggerValueIDLen);
    if (StorageTmp->mteTriggerValueID == NULL) {
        config_perror("invalid specification for mteTriggerValueID");
        return;
    }

    line =
        read_config_read_data(ASN_INTEGER, line,
                              &StorageTmp->mteTriggerValueIDWildcard,
                              &tmpint);

    line =
        read_config_read_data(ASN_OCTET_STR, line,
                              &StorageTmp->mteTriggerTargetTag,
                              &StorageTmp->mteTriggerTargetTagLen);
    if (StorageTmp->mteTriggerTargetTag == NULL) {
        config_perror("invalid specification for mteTriggerTargetTag");
        return;
    }

    line =
        read_config_read_data(ASN_OCTET_STR, line,
                              &StorageTmp->mteTriggerContextName,
                              &StorageTmp->mteTriggerContextNameLen);
    if (StorageTmp->mteTriggerContextName == NULL) {
        config_perror("invalid specification for mteTriggerContextName");
        return;
    }

    line =
        read_config_read_data(ASN_INTEGER, line,
                              &StorageTmp->mteTriggerContextNameWildcard,
                              &tmpint);

    line =
        read_config_read_data(ASN_UNSIGNED, line,
                              &StorageTmp->mteTriggerFrequency, &tmpint);

    line =
        read_config_read_data(ASN_OCTET_STR, line,
                              &StorageTmp->mteTriggerObjectsOwner,
                              &StorageTmp->mteTriggerObjectsOwnerLen);
    if (StorageTmp->mteTriggerObjectsOwner == NULL) {
        config_perror("invalid specification for mteTriggerObjectsOwner");
        return;
    }

    line =
        read_config_read_data(ASN_OCTET_STR, line,
                              &StorageTmp->mteTriggerObjects,
                              &StorageTmp->mteTriggerObjectsLen);
    if (StorageTmp->mteTriggerObjects == NULL) {
        config_perror("invalid specification for mteTriggerObjects");
        return;
    }

    line =
        read_config_read_data(ASN_INTEGER, line,
                              &StorageTmp->mteTriggerEnabled, &tmpint);

    line =
        read_config_read_data(ASN_INTEGER, line,
                              &StorageTmp->mteTriggerEntryStatus, &tmpint);

    /*
     * delta table 
     */
    line =
        read_config_read_data(ASN_OBJECT_ID, line,
                              &StorageTmp->mteTriggerDeltaDiscontinuityID,
                              &StorageTmp->
                              mteTriggerDeltaDiscontinuityIDLen);
    if (StorageTmp->mteTriggerDeltaDiscontinuityID == NULL) {
        config_perror
            ("invalid specification for mteTriggerDeltaDiscontinuityID");
        return;
    }

    line =
        read_config_read_data(ASN_INTEGER, line,
                              &StorageTmp->
                              mteTriggerDeltaDiscontinuityIDWildcard,
                              &tmpint);

    line =
        read_config_read_data(ASN_INTEGER, line,
                              &StorageTmp->
                              mteTriggerDeltaDiscontinuityIDType, &tmpint);

    /*
     * existence table 
     */
    line =
        read_config_read_data(ASN_OCTET_STR, line,
                              &StorageTmp->mteTriggerExistenceTest,
                              &StorageTmp->mteTriggerExistenceTestLen);
    if (StorageTmp->mteTriggerExistenceTest == NULL) {
        config_perror("invalid specification for mteTriggerExistenceTest");
        return;
    }

    line =
        read_config_read_data(ASN_OCTET_STR, line,
                              &StorageTmp->mteTriggerExistenceStartup,
                              &StorageTmp->mteTriggerExistenceStartupLen);
    if (StorageTmp->mteTriggerExistenceStartup == NULL) {
        config_perror
            ("invalid specification for mteTriggerExistenceStartup");
        return;
    }

    line =
        read_config_read_data(ASN_OCTET_STR, line,
                              &StorageTmp->mteTriggerExistenceObjectsOwner,
                              &StorageTmp->
                              mteTriggerExistenceObjectsOwnerLen);
    if (StorageTmp->mteTriggerExistenceObjectsOwner == NULL) {
        config_perror
            ("invalid specification for mteTriggerExistenceObjectsOwner");
        return;
    }

    line =
        read_config_read_data(ASN_OCTET_STR, line,
                              &StorageTmp->mteTriggerExistenceObjects,
                              &StorageTmp->mteTriggerExistenceObjectsLen);
    if (StorageTmp->mteTriggerExistenceObjects == NULL) {
        config_perror
            ("invalid specification for mteTriggerExistenceObjects");
        return;
    }

    line =
        read_config_read_data(ASN_OCTET_STR, line,
                              &StorageTmp->mteTriggerExistenceEventOwner,
                              &StorageTmp->
                              mteTriggerExistenceEventOwnerLen);
    if (StorageTmp->mteTriggerExistenceEventOwner == NULL) {
        config_perror
            ("invalid specification for mteTriggerExistenceEventOwner");
        return;
    }

    line =
        read_config_read_data(ASN_OCTET_STR, line,
                              &StorageTmp->mteTriggerExistenceEvent,
                              &StorageTmp->mteTriggerExistenceEventLen);
    if (StorageTmp->mteTriggerExistenceEvent == NULL) {
        config_perror
            ("invalid specification for mteTriggerExistenceEvent");
        return;
    }

    /*
     * boolean table 
     */
    line =
        read_config_read_data(ASN_INTEGER, line,
                              &StorageTmp->mteTriggerBooleanComparison,
                              &tmpint);

    line =
        read_config_read_data(ASN_INTEGER, line,
                              &StorageTmp->mteTriggerBooleanValue,
                              &tmpint);

    line =
        read_config_read_data(ASN_INTEGER, line,
                              &StorageTmp->mteTriggerBooleanStartup,
                              &tmpint);

    line =
        read_config_read_data(ASN_OCTET_STR, line,
                              &StorageTmp->mteTriggerBooleanObjectsOwner,
                              &StorageTmp->
                              mteTriggerBooleanObjectsOwnerLen);
    if (StorageTmp->mteTriggerBooleanObjectsOwner == NULL) {
        config_perror
            ("invalid specification for mteTriggerBooleanObjectsOwner");
        return;
    }

    line =
        read_config_read_data(ASN_OCTET_STR, line,
                              &StorageTmp->mteTriggerBooleanObjects,
                              &StorageTmp->mteTriggerBooleanObjectsLen);
    if (StorageTmp->mteTriggerBooleanObjects == NULL) {
        config_perror
            ("invalid specification for mteTriggerBooleanObjects");
        return;
    }

    line =
        read_config_read_data(ASN_OCTET_STR, line,
                              &StorageTmp->mteTriggerBooleanEventOwner,
                              &StorageTmp->mteTriggerBooleanEventOwnerLen);
    if (StorageTmp->mteTriggerBooleanEventOwner == NULL) {
        config_perror
            ("invalid specification for mteTriggerBooleanEventOwner");
        return;
    }

    line =
        read_config_read_data(ASN_OCTET_STR, line,
                              &StorageTmp->mteTriggerBooleanEvent,
                              &StorageTmp->mteTriggerBooleanEventLen);
    if (StorageTmp->mteTriggerBooleanEvent == NULL) {
        config_perror("invalid specification for mteTriggerBooleanEvent");
        return;
    }

    /*
     * threshold table 
     */
    line =
        read_config_read_data(ASN_INTEGER, line,
                              &StorageTmp->mteTriggerThresholdStartup,
                              &tmpint);

    line =
        read_config_read_data(ASN_INTEGER, line,
                              &StorageTmp->mteTriggerThresholdRising,
                              &tmpint);

    line =
        read_config_read_data(ASN_INTEGER, line,
                              &StorageTmp->mteTriggerThresholdFalling,
                              &tmpint);

    line =
        read_config_read_data(ASN_INTEGER, line,
                              &StorageTmp->mteTriggerThresholdDeltaRising,
                              &tmpint);

    line =
        read_config_read_data(ASN_INTEGER, line,
                              &StorageTmp->mteTriggerThresholdDeltaFalling,
                              &tmpint);

    line =
        read_config_read_data(ASN_OCTET_STR, line,
                              &StorageTmp->mteTriggerThresholdObjectsOwner,
                              &StorageTmp->
                              mteTriggerThresholdObjectsOwnerLen);
    if (StorageTmp->mteTriggerThresholdObjectsOwner == NULL) {
        config_perror
            ("invalid specification for mteTriggerThresholdObjectsOwner");
        return;
    }

    line =
        read_config_read_data(ASN_OCTET_STR, line,
                              &StorageTmp->mteTriggerThresholdObjects,
                              &StorageTmp->mteTriggerThresholdObjectsLen);
    if (StorageTmp->mteTriggerThresholdObjects == NULL) {
        config_perror
            ("invalid specification for mteTriggerThresholdObjects");
        return;
    }

    line =
        read_config_read_data(ASN_OCTET_STR, line,
                              &StorageTmp->
                              mteTriggerThresholdRisingEventOwner,
                              &StorageTmp->
                              mteTriggerThresholdRisingEventOwnerLen);
    if (StorageTmp->mteTriggerThresholdRisingEventOwner == NULL) {
        config_perror
            ("invalid specification for mteTriggerThresholdRisingEventOwner");
        return;
    }

    line =
        read_config_read_data(ASN_OCTET_STR, line,
                              &StorageTmp->mteTriggerThresholdRisingEvent,
                              &StorageTmp->
                              mteTriggerThresholdRisingEventLen);
    if (StorageTmp->mteTriggerThresholdRisingEvent == NULL) {
        config_perror
            ("invalid specification for mteTriggerThresholdRisingEvent");
        return;
    }

    line =
        read_config_read_data(ASN_OCTET_STR, line,
                              &StorageTmp->
                              mteTriggerThresholdFallingEventOwner,
                              &StorageTmp->
                              mteTriggerThresholdFallingEventOwnerLen);
    if (StorageTmp->mteTriggerThresholdFallingEventOwner == NULL) {
        config_perror
            ("invalid specification for mteTriggerThresholdFallingEventOwner");
        return;
    }

    line =
        read_config_read_data(ASN_OCTET_STR, line,
                              &StorageTmp->mteTriggerThresholdFallingEvent,
                              &StorageTmp->
                              mteTriggerThresholdFallingEventLen);
    if (StorageTmp->mteTriggerThresholdFallingEvent == NULL) {
        config_perror
            ("invalid specification for mteTriggerThresholdFallingEvent");
        return;
    }

    line =
        read_config_read_data(ASN_OCTET_STR, line,
                              &StorageTmp->
                              mteTriggerThresholdDeltaRisingEventOwner,
                              &StorageTmp->
                              mteTriggerThresholdDeltaRisingEventOwnerLen);
    if (StorageTmp->mteTriggerThresholdDeltaRisingEventOwner == NULL) {
        config_perror
            ("invalid specification for mteTriggerThresholdDeltaRisingEventOwner");
        return;
    }

    line =
        read_config_read_data(ASN_OCTET_STR, line,
                              &StorageTmp->
                              mteTriggerThresholdDeltaRisingEvent,
                              &StorageTmp->
                              mteTriggerThresholdDeltaRisingEventLen);
    if (StorageTmp->mteTriggerThresholdDeltaRisingEvent == NULL) {
        config_perror
            ("invalid specification for mteTriggerThresholdDeltaRisingEvent");
        return;
    }

    line =
        read_config_read_data(ASN_OCTET_STR, line,
                              &StorageTmp->
                              mteTriggerThresholdDeltaFallingEventOwner,
                              &StorageTmp->
                              mteTriggerThresholdDeltaFallingEventOwnerLen);
    if (StorageTmp->mteTriggerThresholdDeltaFallingEventOwner == NULL) {
        config_perror
            ("invalid specification for mteTriggerThresholdDeltaFallingEventOwner");
        return;
    }

    line =
        read_config_read_data(ASN_OCTET_STR, line,
                              &StorageTmp->
                              mteTriggerThresholdDeltaFallingEvent,
                              &StorageTmp->
                              mteTriggerThresholdDeltaFallingEventLen);
    if (StorageTmp->mteTriggerThresholdDeltaFallingEvent == NULL) {
        config_perror
            ("invalid specification for mteTriggerThresholdDeltaFallingEvent");
        return;
    }

    /*
     * local internal variables 
     */
    line =
        read_config_read_data(ASN_INTEGER, line,
                              &StorageTmp->have_copied_auth_info, &tmpint);
    if (StorageTmp->have_copied_auth_info) {
        line =
            read_config_read_data(ASN_INTEGER, line,
                                  &StorageTmp->pdu_version, &tmpint);
        line =
            read_config_read_data(ASN_INTEGER, line,
                                  &StorageTmp->pdu_securityModel, &tmpint);
        line =
            read_config_read_data(ASN_INTEGER, line,
                                  &StorageTmp->pdu_securityLevel, &tmpint);
        line =
            read_config_read_data(ASN_OBJECT_ID, line, &tmpoid, &tmpint);
        if (!netsnmp_tdomain_support
            (tmpoid, tmpint, &StorageTmp->pdu_tDomain,
             &StorageTmp->pdu_tDomainLen)) {
            config_perror
                ("unsupported transport domain for mteTriggerEntry");
            return;
        }
        if (tmpoid != NULL) {
            free(tmpoid);
        }

        /*
         * can be NULL?  Yes.  
         */
        line = read_config_read_data(ASN_OCTET_STR, line,
                                     &(StorageTmp->pdu_transport),
                                     &StorageTmp->pdu_transportLen);

        line =
            read_config_read_data(ASN_OCTET_STR, line,
                                  &StorageTmp->pdu_community,
                                  &StorageTmp->pdu_community_len);
        if (StorageTmp->pdu_community == NULL) {
            config_perror("invalid specification for pdu_community");
            return;
        }
        line =
            read_config_read_data(ASN_OCTET_STR, line,
                                  &StorageTmp->pdu_securityName,
                                  &StorageTmp->pdu_securityNameLen);
        if (StorageTmp->pdu_securityName == NULL) {
            config_perror("invalid specification for pdu_securityName");
            return;
        }
    }
    StorageTmp->storageType = ST_NONVOLATILE;   /* the only type stored */

    mteTriggerTable_add(StorageTmp);

    /*
     * technically this is too early 
     */
    if (StorageTmp->mteTriggerEnabled == MTETRIGGERENABLED_TRUE &&
        StorageTmp->mteTriggerEntryStatus == RS_ACTIVE)
        mte_enable_trigger(StorageTmp);

    DEBUGMSGTL(("mteTriggerTable", "done.\n"));
} /* parse_mteTriggerTable */


/*
 * store_mteTriggerTable():
 *   stores .conf file entries needed to configure the mib.
 */
int
store_mteTriggerTable(int majorID, int minorID, void *serverarg,
                      void *clientarg)
{
    char            line[SNMP_MAXBUF];
    char           *cptr;
    size_t          tmpint;
    struct mteTriggerTable_data *StorageTmp;
    struct header_complex_index *hcindex;

    DEBUGMSGTL(("mteTriggerTable", "storing data...  "));

    for (hcindex = mteTriggerTableStorage; hcindex != NULL;
         hcindex = hcindex->next) {
        StorageTmp = (struct mteTriggerTable_data *) hcindex->data;


        if (StorageTmp->storageType == ST_NONVOLATILE) {

            memset(line, 0, sizeof(line));
            strcat(line, "mteTriggerTable ");
            cptr = line + strlen(line);

            cptr =
                read_config_store_data(ASN_OCTET_STR, cptr,
                                       &StorageTmp->mteOwner,
                                       &StorageTmp->mteOwnerLen);
            cptr =
                read_config_store_data(ASN_OCTET_STR, cptr,
                                       &StorageTmp->mteTriggerName,
                                       &StorageTmp->mteTriggerNameLen);
            cptr =
                read_config_store_data(ASN_OCTET_STR, cptr,
                                       &StorageTmp->mteTriggerComment,
                                       &StorageTmp->mteTriggerCommentLen);
            cptr =
                read_config_store_data(ASN_OCTET_STR, cptr,
                                       &StorageTmp->mteTriggerTest,
                                       &StorageTmp->mteTriggerTestLen);
            cptr =
                read_config_store_data(ASN_INTEGER, cptr,
                                       &StorageTmp->mteTriggerSampleType,
                                       &tmpint);
            cptr =
                read_config_store_data(ASN_OBJECT_ID, cptr,
                                       &StorageTmp->mteTriggerValueID,
                                       &StorageTmp->mteTriggerValueIDLen);
            cptr =
                read_config_store_data(ASN_INTEGER, cptr,
                                       &StorageTmp->
                                       mteTriggerValueIDWildcard, &tmpint);
            cptr =
                read_config_store_data(ASN_OCTET_STR, cptr,
                                       &StorageTmp->mteTriggerTargetTag,
                                       &StorageTmp->
                                       mteTriggerTargetTagLen);
            cptr =
                read_config_store_data(ASN_OCTET_STR, cptr,
                                       &StorageTmp->mteTriggerContextName,
                                       &StorageTmp->
                                       mteTriggerContextNameLen);
            cptr =
                read_config_store_data(ASN_INTEGER, cptr,
                                       &StorageTmp->
                                       mteTriggerContextNameWildcard,
                                       &tmpint);
            cptr =
                read_config_store_data(ASN_UNSIGNED, cptr,
                                       &StorageTmp->mteTriggerFrequency,
                                       &tmpint);
            cptr =
                read_config_store_data(ASN_OCTET_STR, cptr,
                                       &StorageTmp->mteTriggerObjectsOwner,
                                       &StorageTmp->
                                       mteTriggerObjectsOwnerLen);
            cptr =
                read_config_store_data(ASN_OCTET_STR, cptr,
                                       &StorageTmp->mteTriggerObjects,
                                       &StorageTmp->mteTriggerObjectsLen);
            cptr =
                read_config_store_data(ASN_INTEGER, cptr,
                                       &StorageTmp->mteTriggerEnabled,
                                       &tmpint);
            cptr =
                read_config_store_data(ASN_INTEGER, cptr,
                                       &StorageTmp->mteTriggerEntryStatus,
                                       &tmpint);

            /*
             * delta table 
             */
            cptr =
                read_config_store_data(ASN_OBJECT_ID, cptr,
                                       &StorageTmp->
                                       mteTriggerDeltaDiscontinuityID,
                                       &StorageTmp->
                                       mteTriggerDeltaDiscontinuityIDLen);
            cptr =
                read_config_store_data(ASN_INTEGER, cptr,
                                       &StorageTmp->
                                       mteTriggerDeltaDiscontinuityIDWildcard,
                                       &tmpint);
            cptr =
                read_config_store_data(ASN_INTEGER, cptr,
                                       &StorageTmp->
                                       mteTriggerDeltaDiscontinuityIDType,
                                       &tmpint);

            /*
             * existence table 
             */
            cptr =
                read_config_store_data(ASN_OCTET_STR, cptr,
                                       &StorageTmp->
                                       mteTriggerExistenceTest,
                                       &StorageTmp->
                                       mteTriggerExistenceTestLen);
            cptr =
                read_config_store_data(ASN_OCTET_STR, cptr,
                                       &StorageTmp->
                                       mteTriggerExistenceStartup,
                                       &StorageTmp->
                                       mteTriggerExistenceStartupLen);
            cptr =
                read_config_store_data(ASN_OCTET_STR, cptr,
                                       &StorageTmp->
                                       mteTriggerExistenceObjectsOwner,
                                       &StorageTmp->
                                       mteTriggerExistenceObjectsOwnerLen);
            cptr =
                read_config_store_data(ASN_OCTET_STR, cptr,
                                       &StorageTmp->
                                       mteTriggerExistenceObjects,
                                       &StorageTmp->
                                       mteTriggerExistenceObjectsLen);
            cptr =
                read_config_store_data(ASN_OCTET_STR, cptr,
                                       &StorageTmp->
                                       mteTriggerExistenceEventOwner,
                                       &StorageTmp->
                                       mteTriggerExistenceEventOwnerLen);
            cptr =
                read_config_store_data(ASN_OCTET_STR, cptr,
                                       &StorageTmp->
                                       mteTriggerExistenceEvent,
                                       &StorageTmp->
                                       mteTriggerExistenceEventLen);

            /*
             * boolean table 
             */
            cptr =
                read_config_store_data(ASN_INTEGER, cptr,
                                       &StorageTmp->
                                       mteTriggerBooleanComparison,
                                       &tmpint);
            cptr =
                read_config_store_data(ASN_INTEGER, cptr,
                                       &StorageTmp->mteTriggerBooleanValue,
                                       &tmpint);
            cptr =
                read_config_store_data(ASN_INTEGER, cptr,
                                       &StorageTmp->
                                       mteTriggerBooleanStartup, &tmpint);
            cptr =
                read_config_store_data(ASN_OCTET_STR, cptr,
                                       &StorageTmp->
                                       mteTriggerBooleanObjectsOwner,
                                       &StorageTmp->
                                       mteTriggerBooleanObjectsOwnerLen);
            cptr =
                read_config_store_data(ASN_OCTET_STR, cptr,
                                       &StorageTmp->
                                       mteTriggerBooleanObjects,
                                       &StorageTmp->
                                       mteTriggerBooleanObjectsLen);
            cptr =
                read_config_store_data(ASN_OCTET_STR, cptr,
                                       &StorageTmp->
                                       mteTriggerBooleanEventOwner,
                                       &StorageTmp->
                                       mteTriggerBooleanEventOwnerLen);
            cptr =
                read_config_store_data(ASN_OCTET_STR, cptr,
                                       &StorageTmp->mteTriggerBooleanEvent,
                                       &StorageTmp->
                                       mteTriggerBooleanEventLen);

            /*
             * threshold table 
             */
            cptr =
                read_config_store_data(ASN_INTEGER, cptr,
                                       &StorageTmp->
                                       mteTriggerThresholdStartup,
                                       &tmpint);
            cptr =
                read_config_store_data(ASN_INTEGER, cptr,
                                       &StorageTmp->
                                       mteTriggerThresholdRising, &tmpint);
            cptr =
                read_config_store_data(ASN_INTEGER, cptr,
                                       &StorageTmp->
                                       mteTriggerThresholdFalling,
                                       &tmpint);
            cptr =
                read_config_store_data(ASN_INTEGER, cptr,
                                       &StorageTmp->
                                       mteTriggerThresholdDeltaRising,
                                       &tmpint);
            cptr =
                read_config_store_data(ASN_INTEGER, cptr,
                                       &StorageTmp->
                                       mteTriggerThresholdDeltaFalling,
                                       &tmpint);
            cptr =
                read_config_store_data(ASN_OCTET_STR, cptr,
                                       &StorageTmp->
                                       mteTriggerThresholdObjectsOwner,
                                       &StorageTmp->
                                       mteTriggerThresholdObjectsOwnerLen);
            cptr =
                read_config_store_data(ASN_OCTET_STR, cptr,
                                       &StorageTmp->
                                       mteTriggerThresholdObjects,
                                       &StorageTmp->
                                       mteTriggerThresholdObjectsLen);
            cptr =
                read_config_store_data(ASN_OCTET_STR, cptr,
                                       &StorageTmp->
                                       mteTriggerThresholdRisingEventOwner,
                                       &StorageTmp->
                                       mteTriggerThresholdRisingEventOwnerLen);
            cptr =
                read_config_store_data(ASN_OCTET_STR, cptr,
                                       &StorageTmp->
                                       mteTriggerThresholdRisingEvent,
                                       &StorageTmp->
                                       mteTriggerThresholdRisingEventLen);
            cptr =
                read_config_store_data(ASN_OCTET_STR, cptr,
                                       &StorageTmp->
                                       mteTriggerThresholdFallingEventOwner,
                                       &StorageTmp->
                                       mteTriggerThresholdFallingEventOwnerLen);
            cptr =
                read_config_store_data(ASN_OCTET_STR, cptr,
                                       &StorageTmp->
                                       mteTriggerThresholdFallingEvent,
                                       &StorageTmp->
                                       mteTriggerThresholdFallingEventLen);
            cptr =
                read_config_store_data(ASN_OCTET_STR, cptr,
                                       &StorageTmp->
                                       mteTriggerThresholdDeltaRisingEventOwner,
                                       &StorageTmp->
                                       mteTriggerThresholdDeltaRisingEventOwnerLen);
            cptr =
                read_config_store_data(ASN_OCTET_STR, cptr,
                                       &StorageTmp->
                                       mteTriggerThresholdDeltaRisingEvent,
                                       &StorageTmp->
                                       mteTriggerThresholdDeltaRisingEventLen);
            cptr =
                read_config_store_data(ASN_OCTET_STR, cptr,
                                       &StorageTmp->
                                       mteTriggerThresholdDeltaFallingEventOwner,
                                       &StorageTmp->
                                       mteTriggerThresholdDeltaFallingEventOwnerLen);
            cptr =
                read_config_store_data(ASN_OCTET_STR, cptr,
                                       &StorageTmp->
                                       mteTriggerThresholdDeltaFallingEvent,
                                       &StorageTmp->
                                       mteTriggerThresholdDeltaFallingEventLen);

            /*
             * local internal variables 
             */
            cptr =
                read_config_store_data(ASN_INTEGER, cptr,
                                       &StorageTmp->have_copied_auth_info,
                                       &tmpint);
            if (StorageTmp->have_copied_auth_info) {
                cptr =
                    read_config_store_data(ASN_INTEGER, cptr,
                                           &StorageTmp->pdu_version,
                                           &tmpint);
                cptr =
                    read_config_store_data(ASN_INTEGER, cptr,
                                           &StorageTmp->pdu_securityModel,
                                           &tmpint);
                cptr =
                    read_config_store_data(ASN_INTEGER, cptr,
                                           &StorageTmp->pdu_securityLevel,
                                           &tmpint);
                cptr =
                    read_config_store_data(ASN_OBJECT_ID, cptr,
                                           (void *)(&StorageTmp->pdu_tDomain),
                                           &StorageTmp->pdu_tDomainLen);
                cptr =
                    read_config_store_data(ASN_OCTET_STR, cptr,
                                           &StorageTmp->pdu_transport,
                                           &StorageTmp->pdu_transportLen);
                cptr =
                    read_config_store_data(ASN_OCTET_STR, cptr,
                                           &StorageTmp->pdu_community,
                                           &StorageTmp->pdu_community_len);
                cptr =
                    read_config_store_data(ASN_OCTET_STR, cptr,
                                           &StorageTmp->pdu_securityName,
                                           &StorageTmp->
                                           pdu_securityNameLen);
            }

            snmpd_store_config(line);
        }
    }
    DEBUGMSGTL(("mteTriggerTable", "done.\n"));
    return SNMPERR_SUCCESS;
}




/*
 * var_mteTriggerTable():
 *   Handle this table separately from the scalar value case.
 *   The workings of this are basically the same as for var_mteTriggerTable above.
 */
unsigned char  *
var_mteTriggerTable(struct variable *vp,
                    oid * name,
                    size_t * length,
                    int exact,
                    size_t * var_len, WriteMethod ** write_method)
{


    struct mteTriggerTable_data *StorageTmp = NULL;


    DEBUGMSGTL(("mteTriggerTable",
                "var_mteTriggerTable: Entering...  \n"));

	/* set default value */
	*write_method = NULL;

    /*
     * this assumes you have registered all your data properly
     */
    if ((StorageTmp =
         header_complex(mteTriggerTableStorage, vp, name, length, exact,
                        var_len, write_method)) == NULL) {
#ifndef NETSNMP_NO_WRITE_SUPPORT
        if (vp->magic == MTETRIGGERENTRYSTATUS)
            *write_method = write_mteTriggerEntryStatus;
#endif /* !NETSNMP_NO_WRITE_SUPPORT */
        return NULL;
    }


    /*
     * this is where we do the value assignments for the mib results.
     */
    switch (vp->magic) {


    case MTETRIGGERCOMMENT:
#ifndef NETSNMP_NO_WRITE_SUPPORT
        *write_method = write_mteTriggerComment;
#endif /* !NETSNMP_NO_WRITE_SUPPORT */
        *var_len = StorageTmp->mteTriggerCommentLen;
        return (u_char *) StorageTmp->mteTriggerComment;

    case MTETRIGGERTEST:
#ifndef NETSNMP_NO_WRITE_SUPPORT
        *write_method = write_mteTriggerTest;
#endif /* !NETSNMP_NO_WRITE_SUPPORT */
        *var_len = StorageTmp->mteTriggerTestLen;
        return (u_char *) StorageTmp->mteTriggerTest;

    case MTETRIGGERSAMPLETYPE:
#ifndef NETSNMP_NO_WRITE_SUPPORT
        *write_method = write_mteTriggerSampleType;
#endif /* !NETSNMP_NO_WRITE_SUPPORT */
        *var_len = sizeof(StorageTmp->mteTriggerSampleType);
        return (u_char *) & StorageTmp->mteTriggerSampleType;

    case MTETRIGGERVALUEID:
#ifndef NETSNMP_NO_WRITE_SUPPORT
        *write_method = write_mteTriggerValueID;
#endif /* !NETSNMP_NO_WRITE_SUPPORT */
        *var_len = StorageTmp->mteTriggerValueIDLen * sizeof(oid);
        return (u_char *) StorageTmp->mteTriggerValueID;

    case MTETRIGGERVALUEIDWILDCARD:
#ifndef NETSNMP_NO_WRITE_SUPPORT
        *write_method = write_mteTriggerValueIDWildcard;
#endif /* !NETSNMP_NO_WRITE_SUPPORT */
        *var_len = sizeof(StorageTmp->mteTriggerValueIDWildcard);
        return (u_char *) & StorageTmp->mteTriggerValueIDWildcard;

    case MTETRIGGERTARGETTAG:
#ifndef NETSNMP_NO_WRITE_SUPPORT
        *write_method = write_mteTriggerTargetTag;
#endif /* !NETSNMP_NO_WRITE_SUPPORT */
        *var_len = StorageTmp->mteTriggerTargetTagLen;
        return (u_char *) StorageTmp->mteTriggerTargetTag;

    case MTETRIGGERCONTEXTNAME:
#ifndef NETSNMP_NO_WRITE_SUPPORT
        *write_method = write_mteTriggerContextName;
#endif /* !NETSNMP_NO_WRITE_SUPPORT */
        *var_len = StorageTmp->mteTriggerContextNameLen;
        return (u_char *) StorageTmp->mteTriggerContextName;

    case MTETRIGGERCONTEXTNAMEWILDCARD:
#ifndef NETSNMP_NO_WRITE_SUPPORT
        *write_method = write_mteTriggerContextNameWildcard;
#endif /* !NETSNMP_NO_WRITE_SUPPORT */
        *var_len = sizeof(StorageTmp->mteTriggerContextNameWildcard);
        return (u_char *) & StorageTmp->mteTriggerContextNameWildcard;

    case MTETRIGGERFREQUENCY:
#ifndef NETSNMP_NO_WRITE_SUPPORT
        *write_method = write_mteTriggerFrequency;
#endif /* !NETSNMP_NO_WRITE_SUPPORT */
        *var_len = sizeof(StorageTmp->mteTriggerFrequency);
        return (u_char *) & StorageTmp->mteTriggerFrequency;

    case MTETRIGGEROBJECTSOWNER:
#ifndef NETSNMP_NO_WRITE_SUPPORT
        *write_method = write_mteTriggerObjectsOwner;
#endif /* !NETSNMP_NO_WRITE_SUPPORT */
        *var_len = StorageTmp->mteTriggerObjectsOwnerLen;
        return (u_char *) StorageTmp->mteTriggerObjectsOwner;

    case MTETRIGGEROBJECTS:
#ifndef NETSNMP_NO_WRITE_SUPPORT
        *write_method = write_mteTriggerObjects;
#endif /* !NETSNMP_NO_WRITE_SUPPORT */
        *var_len = StorageTmp->mteTriggerObjectsLen;
        return (u_char *) StorageTmp->mteTriggerObjects;

    case MTETRIGGERENABLED:
#ifndef NETSNMP_NO_WRITE_SUPPORT
        *write_method = write_mteTriggerEnabled;
#endif /* !NETSNMP_NO_WRITE_SUPPORT */
        *var_len = sizeof(StorageTmp->mteTriggerEnabled);
        return (u_char *) & StorageTmp->mteTriggerEnabled;

    case MTETRIGGERENTRYSTATUS:
#ifndef NETSNMP_NO_WRITE_SUPPORT
        *write_method = write_mteTriggerEntryStatus;
#endif /* !NETSNMP_NO_WRITE_SUPPORT */
        *var_len = sizeof(StorageTmp->mteTriggerEntryStatus);
        return (u_char *) & StorageTmp->mteTriggerEntryStatus;


    default:
        ERROR_MSG("");
    }
    return NULL;
}



#ifndef NETSNMP_NO_WRITE_SUPPORT
int
write_mteTriggerComment(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)
{
    static char    *tmpvar;
    struct mteTriggerTable_data *StorageTmp = NULL;
    static size_t   tmplen;
    size_t          newlen =
        name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
                    3 - 1);


    DEBUGMSGTL(("mteTriggerTable",
                "write_mteTriggerComment entering action=%d...  \n",
                action));
    if ((StorageTmp =
         header_complex(mteTriggerTableStorage, NULL,
                        &name[sizeof(mteTriggerTable_variables_oid) /
                              sizeof(oid) + 3 - 1], &newlen, 1, NULL,
                        NULL)) == NULL)
        return SNMP_ERR_NOSUCHNAME;     /* remove if you support creation here */


    switch (action) {
    case RESERVE1:
        if (var_val_type != ASN_OCTET_STR) {
            snmp_log(LOG_ERR,
                     "write to mteTriggerComment not ASN_OCTET_STR\n");
            return SNMP_ERR_WRONGTYPE;
        }
        if (StorageTmp->storageType != ST_NONVOLATILE)
            return SNMP_ERR_NOTWRITABLE;

        break;


    case RESERVE2:
        /*
         * memory reseveration, final preparation... 
         */
        break;


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


    case ACTION:
        /*
         * The variable has been stored in string 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 
         */
        tmpvar = StorageTmp->mteTriggerComment;
        tmplen = StorageTmp->mteTriggerCommentLen;
        StorageTmp->mteTriggerComment = netsnmp_memdup(var_val, var_val_len);
        StorageTmp->mteTriggerCommentLen = var_val_len;
        break;


    case UNDO:
        /*
         * Back out any changes made in the ACTION case 
         */
        SNMP_FREE(StorageTmp->mteTriggerComment);
        StorageTmp->mteTriggerComment = tmpvar;
        StorageTmp->mteTriggerCommentLen = tmplen;
        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! 
         */
        SNMP_FREE(tmpvar);
        snmp_store_needed(NULL);
        break;
    }
    return SNMP_ERR_NOERROR;
} /* write_mteTriggerComment */



int
write_mteTriggerTest(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)
{
    static char    *tmpvar;
    struct mteTriggerTable_data *StorageTmp = NULL;
    static size_t   tmplen;
    size_t          newlen =
        name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
                    3 - 1);


    DEBUGMSGTL(("mteTriggerTable",
                "write_mteTriggerTest entering action=%d...  \n", action));
    if ((StorageTmp =
         header_complex(mteTriggerTableStorage, NULL,
                        &name[sizeof(mteTriggerTable_variables_oid) /
                              sizeof(oid) + 3 - 1], &newlen, 1, NULL,
                        NULL)) == NULL)
        return SNMP_ERR_NOSUCHNAME;     /* remove if you support creation here */


    switch (action) {
    case RESERVE1:
        if (var_val_type != ASN_OCTET_STR) {
            snmp_log(LOG_ERR, "write to mteTriggerTest not ASN_OCTET_STR\n");
            return SNMP_ERR_WRONGTYPE;
        }
        if (StorageTmp->storageType != ST_NONVOLATILE)
            return SNMP_ERR_NOTWRITABLE;
        break;


    case RESERVE2:
        /*
         * memory reseveration, final preparation... 
         */
        break;


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


    case ACTION:
        /*
         * The variable has been stored in string 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 
         */
        tmpvar = StorageTmp->mteTriggerTest;
        tmplen = StorageTmp->mteTriggerTestLen;
        StorageTmp->mteTriggerTest = netsnmp_memdup(var_val, var_val_len);
        StorageTmp->mteTriggerTestLen = var_val_len;
        break;


    case UNDO:
        /*
         * Back out any changes made in the ACTION case 
         */
        SNMP_FREE(StorageTmp->mteTriggerTest);
        StorageTmp->mteTriggerTest = tmpvar;
        StorageTmp->mteTriggerTestLen = tmplen;
        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! 
         */
        SNMP_FREE(tmpvar);
        snmp_store_needed(NULL);
        break;
    }
    return SNMP_ERR_NOERROR;
} /* write_mteTriggerTest */



int
write_mteTriggerSampleType(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)
{
    static int      tmpvar;
    struct mteTriggerTable_data *StorageTmp = NULL;
    size_t          newlen =
        name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
                    3 - 1);


    DEBUGMSGTL(("mteTriggerTable",
                "write_mteTriggerSampleType entering action=%d...  \n",
                action));
    if ((StorageTmp =
         header_complex(mteTriggerTableStorage, NULL,
                        &name[sizeof(mteTriggerTable_variables_oid) /
                              sizeof(oid) + 3 - 1], &newlen, 1, NULL,
                        NULL)) == NULL)
        return SNMP_ERR_NOSUCHNAME;     /* remove if you support creation here */


    switch (action) {
    case RESERVE1:
        if (var_val_type != ASN_INTEGER) {
            snmp_log(LOG_ERR,
                     "write to mteTriggerSampleType not ASN_INTEGER\n");
            return SNMP_ERR_WRONGTYPE;
        }
        if (StorageTmp->storageType != ST_NONVOLATILE)
            return SNMP_ERR_NOTWRITABLE;
        break;


    case RESERVE2:
        /*
         * memory reseveration, final preparation... 
         */
        break;


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


    case ACTION:
        /*
         * The variable has been stored in long_ret 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 
         */
        tmpvar = StorageTmp->mteTriggerSampleType;
        StorageTmp->mteTriggerSampleType = *((long *) var_val);
        break;


    case UNDO:
        /*
         * Back out any changes made in the ACTION case 
         */
        StorageTmp->mteTriggerSampleType = tmpvar;
        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! 
         */
        snmp_store_needed(NULL);
        break;
    }
    return SNMP_ERR_NOERROR;
} /* write_mteTriggerSampleType */



int
write_mteTriggerValueID(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)
{
    static oid     *tmpvar;
    struct mteTriggerTable_data *StorageTmp = NULL;
    static size_t   tmplen;
    size_t          newlen =
        name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
                    3 - 1);


    DEBUGMSGTL(("mteTriggerTable",
                "write_mteTriggerValueID entering action=%d...  \n",
                action));
    if ((StorageTmp =
         header_complex(mteTriggerTableStorage, NULL,
                        &name[sizeof(mteTriggerTable_variables_oid) /
                              sizeof(oid) + 3 - 1], &newlen, 1, NULL,
                        NULL)) == NULL)
        return SNMP_ERR_NOSUCHNAME;     /* remove if you support creation here */


    switch (action) {
    case RESERVE1:
        if (var_val_type != ASN_OBJECT_ID) {
            snmp_log(LOG_ERR,
                     "write to mteTriggerValueID not ASN_OBJECT_ID\n");
            return SNMP_ERR_WRONGTYPE;
        }
        if (StorageTmp->storageType != ST_NONVOLATILE)
            return SNMP_ERR_NOTWRITABLE;
        break;


    case RESERVE2:
        /*
         * memory reseveration, final preparation... 
         */
        break;


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


    case ACTION:
        /*
         * The variable has been stored in objid 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 
         */
        tmpvar = StorageTmp->mteTriggerValueID;
        tmplen = StorageTmp->mteTriggerValueIDLen;
        StorageTmp->mteTriggerValueID = netsnmp_memdup(var_val, var_val_len);
        StorageTmp->mteTriggerValueIDLen = var_val_len / sizeof(oid);
        break;


    case UNDO:
        /*
         * Back out any changes made in the ACTION case 
         */
        SNMP_FREE(StorageTmp->mteTriggerValueID);
        StorageTmp->mteTriggerValueID = tmpvar;
        StorageTmp->mteTriggerValueIDLen = tmplen;
        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! 
         */

        /*
         * XXX: if the valueID has actually changed, shouldn't we dump any
         * previous values, as these are from a different object?  
         */
        SNMP_FREE(tmpvar);
        snmp_store_needed(NULL);
        break;
    }
    return SNMP_ERR_NOERROR;
} /* write_mteTriggerValueID */



int
write_mteTriggerValueIDWildcard(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)
{
    static int      tmpvar;
    struct mteTriggerTable_data *StorageTmp = NULL;
    size_t          newlen =
        name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
                    3 - 1);


    DEBUGMSGTL(("mteTriggerTable",
                "write_mteTriggerValueIDWildcard entering action=%d...  \n",
                action));
    if ((StorageTmp =
         header_complex(mteTriggerTableStorage, NULL,
                        &name[sizeof(mteTriggerTable_variables_oid) /
                              sizeof(oid) + 3 - 1], &newlen, 1, NULL,
                        NULL)) == NULL)
        return SNMP_ERR_NOSUCHNAME;     /* remove if you support creation here */


    switch (action) {
    case RESERVE1:
        if (var_val_type != ASN_INTEGER) {
            snmp_log(LOG_ERR,
                     "write to mteTriggerValueIDWildcard not ASN_INTEGER\n");
            return SNMP_ERR_WRONGTYPE;
        }
        if (StorageTmp->storageType != ST_NONVOLATILE)
            return SNMP_ERR_NOTWRITABLE;
        break;


    case RESERVE2:
        /*
         * memory reseveration, final preparation... 
         */
        break;


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


    case ACTION:
        /*
         * The variable has been stored in long_ret 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 
         */
        tmpvar = StorageTmp->mteTriggerValueIDWildcard;
        StorageTmp->mteTriggerValueIDWildcard = *((long *) var_val);
        break;


    case UNDO:
        /*
         * Back out any changes made in the ACTION case 
         */
        StorageTmp->mteTriggerValueIDWildcard = tmpvar;
        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! 
         */
        snmp_store_needed(NULL);
        break;
    }
    return SNMP_ERR_NOERROR;
} /* write_mteTriggerValueIDWildcard */



int
write_mteTriggerTargetTag(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)
{
    static char    *tmpvar;
    struct mteTriggerTable_data *StorageTmp = NULL;
    static size_t   tmplen;
    size_t          newlen =
        name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
                    3 - 1);


    DEBUGMSGTL(("mteTriggerTable",
                "write_mteTriggerTargetTag entering action=%d...  \n",
                action));
    if ((StorageTmp =
         header_complex(mteTriggerTableStorage, NULL,
                        &name[sizeof(mteTriggerTable_variables_oid) /
                              sizeof(oid) + 3 - 1], &newlen, 1, NULL,
                        NULL)) == NULL)
        return SNMP_ERR_NOSUCHNAME;     /* remove if you support creation here */


    switch (action) {
    case RESERVE1:
        if (var_val_type != ASN_OCTET_STR) {
            snmp_log(LOG_ERR,
                     "write to mteTriggerTargetTag not ASN_OCTET_STR\n");
            return SNMP_ERR_WRONGTYPE;
        }
        if (StorageTmp->storageType != ST_NONVOLATILE)
            return SNMP_ERR_NOTWRITABLE;
        break;


    case RESERVE2:
        /*
         * memory reseveration, final preparation... 
         */
        break;


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


    case ACTION:
        /*
         * The variable has been stored in string 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 
         */
        tmpvar = StorageTmp->mteTriggerTargetTag;
        tmplen = StorageTmp->mteTriggerTargetTagLen;
        StorageTmp->mteTriggerTargetTag = netsnmp_memdup(var_val, var_val_len);
        StorageTmp->mteTriggerTargetTagLen = var_val_len;
        break;


    case UNDO:
        /*
         * Back out any changes made in the ACTION case 
         */
        SNMP_FREE(StorageTmp->mteTriggerTargetTag);
        StorageTmp->mteTriggerTargetTag = tmpvar;
        StorageTmp->mteTriggerTargetTagLen = tmplen;
        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! 
         */
        SNMP_FREE(tmpvar);
        snmp_store_needed(NULL);
        break;
    }
    return SNMP_ERR_NOERROR;
} /* write_mteTriggerTargetTag */



int
write_mteTriggerContextName(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)
{
    static char    *tmpvar;
    struct mteTriggerTable_data *StorageTmp = NULL;
    static size_t   tmplen;
    size_t          newlen =
        name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
                    3 - 1);


    DEBUGMSGTL(("mteTriggerTable",
                "write_mteTriggerContextName entering action=%d...  \n",
                action));
    if ((StorageTmp =
         header_complex(mteTriggerTableStorage, NULL,
                        &name[sizeof(mteTriggerTable_variables_oid) /
                              sizeof(oid) + 3 - 1], &newlen, 1, NULL,
                        NULL)) == NULL)
        return SNMP_ERR_NOSUCHNAME;     /* remove if you support creation here */


    switch (action) {
    case RESERVE1:
        if (var_val_type != ASN_OCTET_STR) {
            snmp_log(LOG_ERR,
                     "write to mteTriggerContextName not ASN_OCTET_STR\n");
            return SNMP_ERR_WRONGTYPE;
        }
        if (StorageTmp->storageType != ST_NONVOLATILE)
            return SNMP_ERR_NOTWRITABLE;
        break;


    case RESERVE2:
        /*
         * memory reseveration, final preparation... 
         */
        break;


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


    case ACTION:
        /*
         * The variable has been stored in string 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 
         */
        tmpvar = StorageTmp->mteTriggerContextName;
        tmplen = StorageTmp->mteTriggerContextNameLen;
        StorageTmp->mteTriggerContextName =
            netsnmp_memdup(var_val, var_val_len);
        StorageTmp->mteTriggerContextNameLen = var_val_len;
        break;


    case UNDO:
        /*
         * Back out any changes made in the ACTION case 
         */
        SNMP_FREE(StorageTmp->mteTriggerContextName);
        StorageTmp->mteTriggerContextName = tmpvar;
        StorageTmp->mteTriggerContextNameLen = tmplen;
        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! 
         */
        SNMP_FREE(tmpvar);
        snmp_store_needed(NULL);
        break;
    }
    return SNMP_ERR_NOERROR;
} /* write_mteTriggerContextName */



int
write_mteTriggerContextNameWildcard(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)
{
    static int      tmpvar;
    struct mteTriggerTable_data *StorageTmp = NULL;
    size_t          newlen =
        name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
                    3 - 1);


    DEBUGMSGTL(("mteTriggerTable",
                "write_mteTriggerContextNameWildcard entering action=%d...  \n",
                action));
    if ((StorageTmp =
         header_complex(mteTriggerTableStorage, NULL,
                        &name[sizeof(mteTriggerTable_variables_oid) /
                              sizeof(oid) + 3 - 1], &newlen, 1, NULL,
                        NULL)) == NULL)
        return SNMP_ERR_NOSUCHNAME;     /* remove if you support creation here */


    switch (action) {
    case RESERVE1:
        if (var_val_type != ASN_INTEGER) {
            snmp_log(LOG_ERR,
                     "write to mteTriggerContextNameWildcard not ASN_INTEGER\n");
            return SNMP_ERR_WRONGTYPE;
        }
        if (StorageTmp->storageType != ST_NONVOLATILE)
            return SNMP_ERR_NOTWRITABLE;
        break;


    case RESERVE2:
        /*
         * memory reseveration, final preparation... 
         */
        break;


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


    case ACTION:
        /*
         * The variable has been stored in long_ret 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 
         */
        tmpvar = StorageTmp->mteTriggerContextNameWildcard;
        StorageTmp->mteTriggerContextNameWildcard = *((long *) var_val);
        break;


    case UNDO:
        /*
         * Back out any changes made in the ACTION case 
         */
        StorageTmp->mteTriggerContextNameWildcard = tmpvar;
        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! 
         */
        snmp_store_needed(NULL);
        break;
    }
    return SNMP_ERR_NOERROR;
} /* write_mteTriggerContextNameWildcard */



int
write_mteTriggerFrequency(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)
{
    static int      tmpvar;
    struct mteTriggerTable_data *StorageTmp = NULL;
    size_t          newlen =
        name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
                    3 - 1);


    DEBUGMSGTL(("mteTriggerTable",
                "write_mteTriggerFrequency entering action=%d...  \n",
                action));
    if ((StorageTmp =
         header_complex(mteTriggerTableStorage, NULL,
                        &name[sizeof(mteTriggerTable_variables_oid) /
                              sizeof(oid) + 3 - 1], &newlen, 1, NULL,
                        NULL)) == NULL)
        return SNMP_ERR_NOSUCHNAME;     /* remove if you support creation here */


    switch (action) {
    case RESERVE1:
        if (var_val_type != ASN_UNSIGNED) {
            snmp_log(LOG_ERR,
                     "write to mteTriggerFrequency not ASN_UNSIGNED\n");
            return SNMP_ERR_WRONGTYPE;
        }
        if (StorageTmp->storageType != ST_NONVOLATILE)
            return SNMP_ERR_NOTWRITABLE;
        break;


    case RESERVE2:
        /*
         * memory reseveration, final preparation... 
         */
        break;


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


    case ACTION:
        /*
         * The variable has been stored in ulong_ret 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 
         */
        tmpvar = StorageTmp->mteTriggerFrequency;
        StorageTmp->mteTriggerFrequency = *((unsigned long *) var_val);
        break;


    case UNDO:
        /*
         * Back out any changes made in the ACTION case 
         */
        StorageTmp->mteTriggerFrequency = tmpvar;
        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! 
         */
        if (StorageTmp->mteTriggerEnabled == MTETRIGGERENABLED_TRUE &&
            StorageTmp->mteTriggerEntryStatus == RS_ACTIVE)
            mte_enable_trigger(StorageTmp);

        snmp_store_needed(NULL);
        break;
    }
    return SNMP_ERR_NOERROR;
} /* write_mteTriggerFrequency */



int
write_mteTriggerObjectsOwner(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)
{
    static char    *tmpvar;
    struct mteTriggerTable_data *StorageTmp = NULL;
    static size_t   tmplen;
    size_t          newlen =
        name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
                    3 - 1);


    DEBUGMSGTL(("mteTriggerTable",
                "write_mteTriggerObjectsOwner entering action=%d...  \n",
                action));
    if ((StorageTmp =
         header_complex(mteTriggerTableStorage, NULL,
                        &name[sizeof(mteTriggerTable_variables_oid) /
                              sizeof(oid) + 3 - 1], &newlen, 1, NULL,
                        NULL)) == NULL)
        return SNMP_ERR_NOSUCHNAME;     /* remove if you support creation here */


    switch (action) {
    case RESERVE1:
        if (var_val_type != ASN_OCTET_STR) {
            snmp_log(LOG_ERR,
                     "write to mteTriggerObjectsOwner not ASN_OCTET_STR\n");
            return SNMP_ERR_WRONGTYPE;
        }
        if (StorageTmp->storageType != ST_NONVOLATILE)
            return SNMP_ERR_NOTWRITABLE;
        break;


    case RESERVE2:
        /*
         * memory reseveration, final preparation... 
         */
        break;


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


    case ACTION:
        /*
         * The variable has been stored in string 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 
         */
        tmpvar = StorageTmp->mteTriggerObjectsOwner;
        tmplen = StorageTmp->mteTriggerObjectsOwnerLen;
        StorageTmp->mteTriggerObjectsOwner =
            netsnmp_memdup(var_val, var_val_len);
        StorageTmp->mteTriggerObjectsOwnerLen = var_val_len;
        break;


    case UNDO:
        /*
         * Back out any changes made in the ACTION case 
         */
        SNMP_FREE(StorageTmp->mteTriggerObjectsOwner);
        StorageTmp->mteTriggerObjectsOwner = tmpvar;
        StorageTmp->mteTriggerObjectsOwnerLen = tmplen;
        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! 
         */
        SNMP_FREE(tmpvar);
        snmp_store_needed(NULL);
        break;
    }
    return SNMP_ERR_NOERROR;
} /* write_mteTriggerObjectsOwner */



int
write_mteTriggerObjects(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)
{
    static char    *tmpvar;
    struct mteTriggerTable_data *StorageTmp = NULL;
    static size_t   tmplen;
    size_t          newlen =
        name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
                    3 - 1);


    DEBUGMSGTL(("mteTriggerTable",
                "write_mteTriggerObjects entering action=%d...  \n",
                action));
    if ((StorageTmp =
         header_complex(mteTriggerTableStorage, NULL,
                        &name[sizeof(mteTriggerTable_variables_oid) /
                              sizeof(oid) + 3 - 1], &newlen, 1, NULL,
                        NULL)) == NULL)
        return SNMP_ERR_NOSUCHNAME;     /* remove if you support creation here */


    switch (action) {
    case RESERVE1:
        if (var_val_type != ASN_OCTET_STR) {
            snmp_log(LOG_ERR,
                     "write to mteTriggerObjects not ASN_OCTET_STR\n");
            return SNMP_ERR_WRONGTYPE;
        }
        if (StorageTmp->storageType != ST_NONVOLATILE)
            return SNMP_ERR_NOTWRITABLE;
        break;


    case RESERVE2:
        /*
         * memory reseveration, final preparation... 
         */
        break;


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


    case ACTION:
        /*
         * The variable has been stored in string 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 
         */
        tmpvar = StorageTmp->mteTriggerObjects;
        tmplen = StorageTmp->mteTriggerObjectsLen;
        StorageTmp->mteTriggerObjects = netsnmp_memdup(var_val, var_val_len);
        StorageTmp->mteTriggerObjectsLen = var_val_len;
        break;


    case UNDO:
        /*
         * Back out any changes made in the ACTION case 
         */
        SNMP_FREE(StorageTmp->mteTriggerObjects);
        StorageTmp->mteTriggerObjects = tmpvar;
        StorageTmp->mteTriggerObjectsLen = tmplen;
        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! 
         */
        SNMP_FREE(tmpvar);
        snmp_store_needed(NULL);
        break;
    }
    return SNMP_ERR_NOERROR;
} /* write_mteTriggerObjects */



int
write_mteTriggerEnabled(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)
{
    static int      tmpvar;
    struct mteTriggerTable_data *StorageTmp = NULL;
    size_t          newlen =
        name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
                    3 - 1);


    DEBUGMSGTL(("mteTriggerTable",
                "write_mteTriggerEnabled entering action=%d...  \n",
                action));
    if ((StorageTmp =
         header_complex(mteTriggerTableStorage, NULL,
                        &name[sizeof(mteTriggerTable_variables_oid) /
                              sizeof(oid) + 3 - 1], &newlen, 1, NULL,
                        NULL)) == NULL)
        return SNMP_ERR_NOSUCHNAME;     /* remove if you support creation here */


    switch (action) {
    case RESERVE1:
        if (var_val_type != ASN_INTEGER) {
            snmp_log(LOG_ERR,
                     "write to mteTriggerEnabled not ASN_INTEGER\n");
            return SNMP_ERR_WRONGTYPE;
        }
        if (StorageTmp->storageType != ST_NONVOLATILE)
            return SNMP_ERR_NOTWRITABLE;
        break;


    case RESERVE2:
        /*
         * memory reseveration, final preparation... 
         */
        break;


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


    case ACTION:
        /*
         * The variable has been stored in long_ret 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 
         */
        tmpvar = StorageTmp->mteTriggerEnabled;
        StorageTmp->mteTriggerEnabled = *((long *) var_val);
        break;


    case UNDO:
        /*
         * Back out any changes made in the ACTION case 
         */
        StorageTmp->mteTriggerEnabled = tmpvar;
        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! 
         */
        if (StorageTmp->mteTriggerEnabled == MTETRIGGERENABLED_TRUE &&
            StorageTmp->mteTriggerEntryStatus == RS_ACTIVE)
            mte_enable_trigger(StorageTmp);
        else if (StorageTmp->mteTriggerEnabled == MTETRIGGERENABLED_FALSE)
            mte_disable_trigger(StorageTmp);

        snmp_store_needed(NULL);
        break;
    }
    return SNMP_ERR_NOERROR;
} /* write_mteTriggerEnabled */



int
write_mteTriggerEntryStatus(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)
{
    struct mteTriggerTable_data *StorageTmp = NULL;
    static struct mteTriggerTable_data *StorageNew, *StorageDel;
    size_t          newlen =
        name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
                    3 - 1);
    static int      old_value;
    int             set_value;
    static netsnmp_variable_list *vars, *vp;
    struct header_complex_index *hciptr;

    StorageTmp =
        header_complex(mteTriggerTableStorage, NULL,
                       &name[sizeof(mteTriggerTable_variables_oid) /
                             sizeof(oid) + 3 - 1], &newlen, 1, NULL, NULL);




    if (var_val_type != ASN_INTEGER || var_val == NULL) {
        snmp_log(LOG_ERR,
                 "write to mteTriggerEntryStatus not ASN_INTEGER\n");
        return SNMP_ERR_WRONGTYPE;
    }
    set_value = *((long *) var_val);


    /*
     * check legal range, and notReady is reserved for us, not a user 
     */
    if (set_value < 1 || set_value > 6 || set_value == RS_NOTREADY)
        return SNMP_ERR_INCONSISTENTVALUE;


    switch (action) {
    case RESERVE1:
        /*
         * stage one: test validity 
         */
        if (StorageTmp == NULL) {
            /*
             * create the row now? 
             */


            /*
             * ditch illegal values now 
             */
            if (set_value == RS_ACTIVE || set_value == RS_NOTINSERVICE)
                return SNMP_ERR_INCONSISTENTVALUE;


            /*
             * destroying a non-existent row is actually legal 
             */
            if (set_value == RS_DESTROY) {
                return SNMP_ERR_NOERROR;
            }


            /*
             * illegal creation values 
             */
            if (set_value == RS_ACTIVE || set_value == RS_NOTINSERVICE) {
                return SNMP_ERR_INCONSISTENTVALUE;
            }
        } else {
            /*
             * row exists.  Check for a valid state change 
             */
            if (set_value == RS_CREATEANDGO
                || set_value == RS_CREATEANDWAIT) {
                /*
                 * can't create a row that exists 
                 */
                return SNMP_ERR_INCONSISTENTVALUE;
            }

            if (StorageTmp->mteTriggerEntryStatus == RS_ACTIVE &&
                set_value != RS_DESTROY) {
                /*
                 * "Once made active an entry may not be modified except to 
                 * delete it."  XXX: doesn't this in fact apply to ALL
                 * columns of the table and not just this one?  
                 */
                return SNMP_ERR_INCONSISTENTVALUE;
            }
            if (StorageTmp->storageType != ST_NONVOLATILE)
                return SNMP_ERR_NOTWRITABLE;
        }
        break;




    case RESERVE2:
        /*
         * memory reseveration, final preparation... 
         */
        if (StorageTmp == NULL) {
            /*
             * creation 
             */
            vars = NULL;


            snmp_varlist_add_variable(&vars, NULL, 0, ASN_OCTET_STR, NULL, 0);  /* mteOwner */
            snmp_varlist_add_variable(&vars, NULL, 0, ASN_PRIV_IMPLIED_OCTET_STR, NULL, 0);     /* mteTriggerName */



            if (header_complex_parse_oid
                (&
                 (name
                  [sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
                   2]), newlen, vars) != SNMPERR_SUCCESS) {
                /*
                 * XXX: free, zero vars 
                 */
                return SNMP_ERR_INCONSISTENTNAME;
            }
            vp = vars;


            StorageNew = create_mteTriggerTable_data();

            StorageNew->mteOwner = malloc(vp->val_len + 1);
            memcpy(StorageNew->mteOwner, vp->val.string, vp->val_len);
            StorageNew->mteOwner[vp->val_len] = '\0';
            StorageNew->mteOwnerLen = vp->val_len;

            vp = vp->next_variable;
            StorageNew->mteTriggerName = malloc(vp->val_len + 1);
            memcpy(StorageNew->mteTriggerName, vp->val.string,
                   vp->val_len);
            StorageNew->mteTriggerName[vp->val_len] = '\0';
            StorageNew->mteTriggerNameLen = vp->val_len;

            vp = vp->next_variable;

            StorageNew->mteTriggerEntryStatus = set_value;

        }


        break;




    case FREE:
        /*
         * XXX: free, zero vars 
         */
        /*
         * Release any resources that have been allocated 
         */
        break;




    case ACTION:
        /*
         * The variable has been stored in set_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 
         */


        if (StorageTmp == NULL) {
            /*
             * row creation, so add it 
             */
            if (StorageNew != NULL)
                mteTriggerTable_add(StorageNew);
            /*
             * XXX: ack, and if it is NULL? 
             */
        } else if (set_value != RS_DESTROY) {
            /*
             * set the flag? 
             */
            old_value = StorageTmp->mteTriggerEntryStatus;
            StorageTmp->mteTriggerEntryStatus = *((long *) var_val);
        } else {
            /*
             * destroy...  extract it for now 
             */
            hciptr =
                header_complex_find_entry(mteTriggerTableStorage,
                                          StorageTmp);
            StorageDel =
                header_complex_extract_entry(&mteTriggerTableStorage,
                                             hciptr);
        }
        break;




    case UNDO:
        /*
         * Back out any changes made in the ACTION case 
         */
        if (StorageTmp == NULL) {
            /*
             * row creation, so remove it again 
             */
            hciptr =
                header_complex_find_entry(mteTriggerTableStorage,
                                          StorageTmp);
            StorageDel =
                header_complex_extract_entry(&mteTriggerTableStorage,
                                             hciptr);
            /*
             * XXX: free it 
             */
        } else if (StorageDel != NULL) {
            /*
             * row deletion, so add it again 
             */
            mteTriggerTable_add(StorageDel);
        } else {
            StorageTmp->mteTriggerEntryStatus = old_value;
        }
        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! 
         */
        if (StorageDel != NULL) {
            mte_disable_trigger(StorageDel);
            StorageDel = 0;
            /*
             * XXX: free it, its dead 
             */
        } else {
            if (StorageTmp
                && StorageTmp->mteTriggerEntryStatus == RS_CREATEANDGO) {
                StorageTmp->mteTriggerEntryStatus = RS_ACTIVE;
            } else if (StorageTmp &&
                       StorageTmp->mteTriggerEntryStatus ==
                       RS_CREATEANDWAIT) {
                StorageTmp->mteTriggerEntryStatus = RS_NOTINSERVICE;
            }
        }
        if (StorageTmp &&
            StorageTmp->mteTriggerEntryStatus == RS_ACTIVE &&
            !StorageTmp->have_copied_auth_info) {

            netsnmp_agent_session *asp =
                netsnmp_get_current_agent_session();
            netsnmp_pdu    *pdu = NULL;

            if (!asp) {
                snmp_log(LOG_ERR,
                         "snmpTriggerTable: can't get master session for authentication params\n");
            } else {
                pdu = asp->orig_pdu;
                if (!pdu) {
                    snmp_log(LOG_ERR,
                             "snmpTriggerTable: can't get master pdu for authentication params\n");
                }
            }

            if (pdu) {
                DEBUGMSGTL(("mteTriggerTest", "copying PDU auth info\n"));
                StorageTmp->pdu_version = pdu->version;
                StorageTmp->pdu_securityModel = pdu->securityModel;
                StorageTmp->pdu_securityLevel = pdu->securityLevel;
                StorageTmp->pdu_tDomain = pdu->tDomain;
                StorageTmp->pdu_tDomainLen = pdu->tDomainLen;
                if (pdu->transport_data != NULL) {
                    StorageTmp->pdu_transport =
                        malloc(pdu->transport_data_length);
                    memcpy(StorageTmp->pdu_transport, pdu->transport_data,
                           pdu->transport_data_length);
                }
                StorageTmp->pdu_transportLen = pdu->transport_data_length;
                if (pdu->community) {
                    StorageTmp->pdu_community =
                        calloc(1, pdu->community_len + 1);
                    memcpy(StorageTmp->pdu_community, pdu->community,
                           pdu->community_len);
                    StorageTmp->pdu_community_len = pdu->community_len;
                } else {
                    StorageTmp->pdu_community = NULL;
                    StorageTmp->pdu_community_len = 0;
                }
                if (pdu->securityName) {
                    StorageTmp->pdu_securityName =
                        calloc(1, pdu->securityNameLen + 1);
                    memcpy(StorageTmp->pdu_securityName, pdu->securityName,
                           pdu->securityNameLen);
                    StorageTmp->pdu_securityNameLen = pdu->securityNameLen;
                } else {
                    StorageTmp->pdu_securityName = NULL;
                    StorageTmp->pdu_securityNameLen = 0;
                }
                StorageTmp->have_copied_auth_info = 1;
            }
        }

        if (StorageTmp &&
            StorageTmp->mteTriggerEnabled == MTETRIGGERENABLED_TRUE &&
            StorageTmp->mteTriggerEntryStatus == RS_ACTIVE)
            mte_enable_trigger(StorageTmp);
        snmp_store_needed(NULL);
        break;
    }
    return SNMP_ERR_NOERROR;
} /* write_mteTriggerEntryStatus */

#endif /* !NETSNMP_NO_WRITE_SUPPORT */



/*
 * send trap 
 */
void
send_mte_trap(struct mteTriggerTable_data *item,
              oid * trap_oid, size_t trap_oid_len,
              oid * name_oid, size_t name_oid_len,
              long *value, const char *objowner, const char *objname,
              const char *reason)
{
    static oid      objid_snmptrap[] = { 1, 3, 6, 1, 6, 3, 1, 1, 4, 1, 0 };     /* snmpTrapIOD.0 */

    netsnmp_variable_list *var_list = NULL;

    /*
     * snmpTrap oid 
     */
    snmp_varlist_add_variable(&var_list, objid_snmptrap,
                              sizeof(objid_snmptrap) / sizeof(oid),
                              ASN_OBJECT_ID, (u_char *) trap_oid,
                              trap_oid_len * sizeof(oid));

    /*
     * mteHotTrigger 
     */
    snmp_varlist_add_variable(&var_list, mteHotTrigger,
                              sizeof(mteHotTrigger) / sizeof(oid),
                              ASN_OCTET_STR,
                              (u_char *) item->mteTriggerName,
                              item->mteTriggerNameLen);

    /*
     * mteHotTargetName 
     */
    snmp_varlist_add_variable(&var_list, mteHotTargetName, sizeof(mteHotTargetName) / sizeof(oid), ASN_OCTET_STR, (u_char *) item->mteTriggerTargetTag, /*XXX: targetName,not tag */
                              item->mteTriggerTargetTagLen);    /*XXX */

    /*
     * mteHotContextName 
     */
    snmp_varlist_add_variable(&var_list, mteHotContextName,
                              sizeof(mteHotContextName) / sizeof(oid),
                              ASN_OCTET_STR,
                              (u_char *) item->mteTriggerContextName,
                              item->mteTriggerContextNameLen);

    snmp_varlist_add_variable(&var_list, mteHotOID,
                              sizeof(mteHotOID) / sizeof(oid),
                              ASN_OBJECT_ID, (u_char *) name_oid,
                              sizeof(oid) * name_oid_len);

    if (trap_oid == mteTriggerFailure || trap_oid == mteEventSetFailure) {
        /*
         * mteFailedReason  
         */
        snmp_varlist_add_variable(&var_list, mteFailedReason,
                                  sizeof(mteFailedReason) / sizeof(oid),
                                  ASN_INTEGER, (u_char *) value,
                                  sizeof(value));
    } else {
        /*
         * mteHotValue  
         */
        snmp_varlist_add_variable(&var_list, mteHotValue,
                                  sizeof(mteHotValue) / sizeof(oid),
                                  ASN_INTEGER, (u_char *) value,
                                  sizeof(value));
    }

    /*
     * add in traps from main table 
     */
    mte_add_objects(var_list, item, item->mteTriggerObjectsOwner,
                    item->mteTriggerObjects,
                    name_oid + item->mteTriggerValueIDLen,
                    name_oid_len - item->mteTriggerValueIDLen);
    /*
     * add in traps from sub table 
     */
    mte_add_objects(var_list, item, objowner, objname,
                    name_oid + item->mteTriggerValueIDLen,
                    name_oid_len - item->mteTriggerValueIDLen);

    /*
     * XXX: stuff based on event table 
     */
    DEBUGMSGTL(("mteTriggerTest:send_mte_trap", "sending the trap (%s): ",
                reason));
    DEBUGMSGOID(("mteTriggerTest:send_mte_trap", name_oid, name_oid_len));
    DEBUGMSG(("mteTriggerTest:send_mte_trap", " = %ld\n", *value));

    send_v2trap(var_list);
    snmp_free_varbind(var_list);
} /* send_mte_trap */


void
last_state_clean(void *data)
{
    struct last_state *cleanme = (struct last_state *) data;
    SNMP_FREE(cleanme->value);
    SNMP_FREE(cleanme);
}


/*
 * retrieves requested info in pdu from the current target 
 */
netsnmp_pdu    *
mte_get_response(struct mteTriggerTable_data *item, netsnmp_pdu *pdu)
{
    netsnmp_pdu    *response = NULL;
    int             status = 0;
    char            buf[SPRINT_MAX_LEN];

    /*
     * local agent check 
     */
    pdu->errstat = SNMPERR_SUCCESS;
    pdu->errindex = 0;
    pdu->version = item->pdu_version;
    pdu->securityModel = item->pdu_securityModel;
    pdu->securityLevel = item->pdu_securityLevel;
    pdu->tDomain = item->pdu_tDomain;
    pdu->tDomainLen = item->pdu_tDomainLen;
    pdu->transport_data = netsnmp_memdup(item->pdu_transport,
                                         item->pdu_transportLen);
    pdu->transport_data_length = item->pdu_transportLen;
    pdu->community = netsnmp_memdup(item->pdu_community,
                                    item->pdu_community_len);
    pdu->community_len = item->pdu_community_len;
    pdu->contextName = netsnmp_memdup(item->mteTriggerContextName,
                                      item->mteTriggerContextNameLen);
    pdu->contextNameLen = item->mteTriggerContextNameLen;
    pdu->securityName = netsnmp_memdup(item->pdu_securityName,
                                       item->pdu_securityNameLen);
    pdu->securityNameLen = item->pdu_securityNameLen;
    DEBUGMSGTL(("mteTriggerTable",
                "accessing locally with secName \"%s\" community \"%s\"\n",
                item->pdu_securityName ? (char *) item->
                pdu_securityName : "[NIL]",
                item->pdu_community ? (char *) item->
                pdu_community : "[NIL]"));

    if (item->mteTriggerTargetTagLen == 0) {
        /*
         * send to the local agent 
         */

        if (mte_callback_sess == NULL)
            mte_callback_sess =  netsnmp_query_get_default_session();
        if (!mte_callback_sess)
            return NULL;

        status = snmp_synch_response(mte_callback_sess, pdu, &response);

        if (status != SNMP_ERR_NOERROR ||
            response->errstat != SNMP_ERR_NOERROR) {
            /*
             * xxx 
             */
            char           *errstr;
            snmp_error(mte_callback_sess, 0, 0, &errstr);
            if (response) {
                DEBUGMSGTL(("mteTriggerTable",
                            "Error received: status=%d, sess_error=%s, pduerr=%d/%s, pdu version=%d\n",
                            status, errstr,
                            response->errstat,
                            snmp_api_errstring(response->errstat),
                            response->version));
            } else {
                DEBUGMSGTL(("mteTriggerTable",
                            "Error received: status=%d, sess_error=%s [no response pointer]\n",
                            status, errstr));
            }
            if (errstr)
                free(errstr);
            return NULL;        /* XXX: proper failure, trap sent, etc */
        }
    } else {
        /*
         * remote target list 
         */
        /*
         * XXX 
         */
    }
    if (response->variables)
        snprint_variable(buf, sizeof(buf), response->variables->name,
                         response->variables->name_length,
                         response->variables);
    else
        strcpy(buf, "empty");
    buf[sizeof(buf) - 1] = '\0';
    DEBUGMSGTL(("mteTriggerTable", "got a variables: %s\n", buf));
    return response;
} /* mte_get_response */


/*
 * Return 1 if `type' is an integer type; specifically, to quote RFC 2981,
 * p. 13, "anything that ends up encoded for transmission (that is, in BER,
 * not ASN.1) as an integer".  Return 0 for all other types.  
 */

int
mte_is_integer_type(unsigned char type)
{
    switch (type) {
    case ASN_INTEGER:
    case ASN_COUNTER:
    case ASN_GAUGE:
    case ASN_TIMETICKS:
    case ASN_UINTEGER:
    case ASN_COUNTER64:
#ifdef NETSNMP_WITH_OPAQUE_SPECIAL_TYPES
    case ASN_OPAQUE_COUNTER64:
    case ASN_OPAQUE_U64:
    case ASN_OPAQUE_I64:
#endif                          /* NETSNMP_WITH_OPAQUE_SPECIAL_TYPES */
        return 1;
    default:
        return 0;
    }
}


/*
 * Return 0 if the discontinuity object was checked and no discontinuity has
 * occurred, 1 if the discontinuity object was checked and a discontinuity
 * has occurred or -1 if the discontinuity object is not accessible.  
 */

int
mte_discontinuity_occurred(struct mteTriggerTable_data *item)
{
    netsnmp_pdu    *pdu = NULL, *response = NULL;
    unsigned long   discoTicks = 0;     /*  cool var name  */

    if (item->mteTriggerDeltaDiscontinuityIDLen == 0 ||
        (snmp_oid_compare(item->mteTriggerDeltaDiscontinuityID,
                          item->mteTriggerDeltaDiscontinuityIDLen,
                          sysUpTimeInstance,
                          sizeof(sysUpTimeInstance) / sizeof(oid)) == 0)) {
        DEBUGMSGTL(("mte_disco",
                    "discoID either zero-length or sysUpTimeInstance\n"));
    } else {
        if (item->mteTriggerValueIDWildcard == TV_TRUE) {
            pdu = snmp_pdu_create(SNMP_MSG_GETNEXT);
        } else {
            pdu = snmp_pdu_create(SNMP_MSG_GET);
        }
        snmp_add_null_var(pdu, item->mteTriggerDeltaDiscontinuityID,
                          item->mteTriggerDeltaDiscontinuityIDLen);
        response = mte_get_response(item, pdu);
        if (response == NULL) {
            /*
             * XXX:  send a mteTriggerFailure notification with the appropriate
             * error code here.  
             */
            /*
             * "If the object identified is not accessible the sample attempt is in 
             * error, with the error code as from an SNMP request."  
             */
            DEBUGMSGTL(("mte_disco", "failure (auth?) getting discoID\n"));
            return -1;
        } else {
            if (item->mteTriggerDeltaDiscontinuityIDType ==
                MTETRIGGERDELTADISCONTINUITYIDTYPE_TIMETICKS ||
                item->mteTriggerDeltaDiscontinuityIDType ==
                MTETRIGGERDELTADISCONTINUITYIDTYPE_TIMESTAMP) {
                if (response->errstat == SNMPERR_SUCCESS) {
                    if (response->variables != NULL &&
                        response->variables->type == ASN_TIMETICKS) {
                        DEBUGMSGTL(("mte_disco",
                                    "got ASN_TIMETICKS-valued variable\n"));
                        discoTicks =
                            *((unsigned long *) response->variables->val.
                              integer);
                        if (item->prevDiscoTicks != 0) {
                            if (discoTicks != item->prevDiscoTicks) {
                                /*
                                 * Danger Will Robinson: there has been a discontinuity!  
                                 */
                                DEBUGMSGTL(("mte_disco",
                                            "a discontinuity has occurred\n"));
                                item->prevDiscoTicks = discoTicks;
                                snmp_free_pdu(response);
                                return 1;
                            }
                        }
                        item->prevDiscoTicks = discoTicks;
                    } else {
                        /*
                         * XXX: send a mteTriggerFailure notification with the
                         * appropriate error code here.  
                         */
                        if (response->variables != NULL &&
                            (response->variables->type == SNMP_NOSUCHOBJECT
                             || response->variables->type ==
                             SNMP_NOSUCHINSTANCE
                             || response->variables->type ==
                             SNMP_ENDOFMIBVIEW)) {
                            /*
                             * noSuchName I guess.  
                             */
                        } else {
                            /*
                             * badType.  
                             */
                        }
                        DEBUGMSGTL(("mte_disco",
                                    "failure getting discoID\n"));
                        snmp_free_pdu(response);
                        return -1;
                    }
                } else {
                    /*
                     * XXX: send a mteTriggerFailure notification with the appropriate
                     * error code (just use response->errstat) here.  
                     */
                    DEBUGMSGTL(("mte_disco", "failure getting discoID\n"));
                    snmp_free_pdu(response);
                    return -1;
                }
            } else {
                /*
                 * Don't handle dateAndTime type queries yet.  
                 */
                DEBUGMSGTL(("mte_disco",
                            "dateAndTime query UNIMPLEMENTED\n"));
            }
            snmp_free_pdu(response);
        }
    }

    /*
     * "...if this object does not point to sysUpTime discontinuity checking
     * MUST still check sysUpTime for an overall discontinuity."  
     */
    if (snmp_oid_compare(item->mteTriggerDeltaDiscontinuityID,
                         item->mteTriggerDeltaDiscontinuityIDLen,
                         sysUpTimeInstance,
                         sizeof(sysUpTimeInstance) / sizeof(oid)) != 0) {
        DEBUGMSGTL(("mte_disco", "discoID != sysUpTimeInstance\n"));
        /*
         * At the moment we only support checking the local system so there's no
         * point doing anything extra here.  
         */
    }

    /*
     * Well if we got all the way to here, then there has been neither a
     * discontinuity nor an error.  
     */
    DEBUGMSGTL(("mte_disco", "no discontinuity\n"));
    return 0;
} /* mte_discontinuity_occurred */


void
mte_run_trigger(unsigned int clientreg, void *clientarg)
{

    struct mteTriggerTable_data *item =
        (struct mteTriggerTable_data *) clientarg;
    netsnmp_pdu    *pdu = NULL, *response = NULL;
    char            buf[SPRINT_MAX_LEN];
    int             msg_type = SNMP_MSG_GET, disco;

    oid            *next_oid;
    size_t          next_oid_len;
    long           *value, *old_value, x;
    struct last_state *laststate;
    char            lastbool = 0, boolresult = 0, lastthresh = 0;

    if (!item) {
        /*
         * ack 
         */
        snmp_alarm_unregister(clientreg);
        return;
    }
    DEBUGMSGTL(("mteTriggertable", "Running trigger for %s/%s\n",
                item->mteOwner, item->mteTriggerName));

    next_oid = item->mteTriggerValueID;
    next_oid_len = item->mteTriggerValueIDLen;
    if (item->mteTriggerValueIDWildcard == TV_TRUE)
        msg_type = SNMP_MSG_GETNEXT;

    item->hc_storage_old = item->hc_storage;
    item->hc_storage = NULL;
    do {
        pdu = snmp_pdu_create(msg_type);
        snmp_add_null_var(pdu, next_oid, next_oid_len);

        if(response)
            snmp_free_pdu(response);
		
        response = mte_get_response(item, pdu);
        if (!response)
            break;              /* XXX: proper failure */

        if (item->mteTriggerValueIDWildcard == TV_TRUE &&
            ((response->variables->type >= SNMP_NOSUCHOBJECT &&
              response->variables->type <= SNMP_ENDOFMIBVIEW) ||
             snmp_oid_compare(item->mteTriggerValueID,
                              item->mteTriggerValueIDLen,
                              response->variables->name,
                              item->mteTriggerValueIDLen) != 0)) {
            DEBUGMSGTL(("mteTriggerTable",
                        "DONE, last varbind processed\n"));
            break;
        }

        /*
         * shorter pointers 
         */
        next_oid = response->variables->name;
        next_oid_len = response->variables->name_length;

        /*
         * Send a "bad type" notification if the type of the target object is 
         * non-INTEGER and the test type is either `boolean' or `threshold'
         * (which want to do arithmetic).  
         */
        if (((item->mteTriggerTest[0] & MTETRIGGERTEST_BOOLEAN) ||
             (item->mteTriggerTest[0] & MTETRIGGERTEST_THRESHOLD)) &&
            response->errstat == SNMPERR_SUCCESS &&
            !mte_is_integer_type(response->variables->type)) {
            long            failure = MTE_FAILURE_BADTYPE;
            send_mte_trap(item, mteTriggerFailure,
                          sizeof(mteTriggerFailure) / sizeof(oid),
                          next_oid, next_oid_len, &failure,
                          NULL, NULL, "failure: bad type");
            /*
             * RFC2981, p.15: "If the value syntax of those objects
             * [returned by a getNext-style match] is not usable, that
             * results in a `badType' error THAT TERMINATES THE SCAN."
             * (my emphasis).  
             */
            break;
        }

        /*
         * Clone the value.  XXX: What happens if it's an unsigned type? Or a
         * 64-bit type, or an OCTET STRING for the sake of argument.  Do
         * everything in 64-bit arithmetic perhaps?  Generate "bad type"
         * notifications for non-INTEGER cases (except for existence).  
         */
        if (response->errstat == SNMPERR_SUCCESS &&
            response->variables->val.integer)
            value = netsnmp_memdup(response->variables->val.integer,
                                   sizeof(*response->variables->val.integer));
        else
            value = NULL;

        snprint_variable(buf, sizeof(buf),
                         next_oid, next_oid_len, response->variables);
        buf[sizeof(buf) - 1] = '\0';
        DEBUGMSGTL(("mteTriggerTable", "received %s (type %d)\n", buf,
                    response->variables->type));

        /*
         * see if we have old values for this 
         */
        laststate = header_complex_get_from_oid(item->hc_storage_old,
                                                next_oid, next_oid_len);
        if (laststate) {
            old_value = laststate->value;
            lastbool = laststate->lastbool;
            lastthresh = laststate->lastthreshold;
        } else {
            old_value = NULL;
            lastthresh = MTE_THRESHOLD_BEGIN;
        }

        /*
         * deal with existence tests 
         */
        if (item->mteTriggerTest[0] & MTETRIGGERTEST_EXISTENCE) {
            if ((item->mteTriggerExistenceTest[0] &
                 MTETRIGGEREXISTENCETEST_PRESENT)
                && value && !old_value &&
                (item->started ||
                 (item->mteTriggerExistenceStartup[0] &
                  MTETRIGGEREXISTENCESTARTUP_PRESENT))) {
                /*
                 * XXX: if mteTriggerExistenceTest is not "present", for
                 * example, and then turned on when has been previously
                 * off, do we respect the value of the last known
                 * existence status? 
                 */
                send_mte_trap(item, mteTriggerFired,
                              sizeof(mteTriggerFired) / sizeof(oid),
                              next_oid, next_oid_len,
                              value, item->mteTriggerExistenceObjectsOwner,
                              item->mteTriggerExistenceObjects,
                              "existence: present");
                run_mte_events(item, next_oid, next_oid_len,
                               item->mteTriggerExistenceEventOwner,
                               item->mteTriggerExistenceEvent);
            }

            if ((item->mteTriggerExistenceTest[0] &
                 MTETRIGGEREXISTENCETEST_CHANGED)
                && value && old_value && *old_value != *value) {
                /*
                 * XXX: if mteTriggerExistenceTest is not "present", for
                 * example, and then turned on when has been previously
                 * off, do we respect the value of the last known
                 * existence status? 
                 */
                send_mte_trap(item, mteTriggerFired,
                              sizeof(mteTriggerFired) / sizeof(oid),
                              next_oid, next_oid_len,
                              value, item->mteTriggerExistenceObjectsOwner,
                              item->mteTriggerExistenceObjects,
                              "existence: changed");
                run_mte_events(item, next_oid, next_oid_len,
                               item->mteTriggerExistenceEventOwner,
                               item->mteTriggerExistenceEvent);
            }
        }

        /*
         * Deal with boolean tests.  
         */
        if ((item->mteTriggerTest[0] & MTETRIGGERTEST_BOOLEAN) &&
            ((item->mteTriggerSampleType ==
              MTETRIGGERSAMPLETYPE_ABSOLUTEVALUE && value)
             || (item->mteTriggerSampleType ==
                 MTETRIGGERSAMPLETYPE_DELTAVALUE && value && old_value))) {
            if (item->mteTriggerSampleType ==
                MTETRIGGERSAMPLETYPE_DELTAVALUE) {
                /*
                 * XXX: Must check the discontinuity OID here.  
                 */
                disco = mte_discontinuity_occurred(item);
                if (disco == -1) {
                    /*
                     * An error notification has already been sent; just bail
                     * out now.  
                     */
                    /*
                     * XXX: should save values here?  
                     */
                    return;
                } else if (disco == 1) {
                    /*
                     * A discontinuity has occurred; the right thing to do here
                     * depends on the exact type.  FOR NOW, assume long.  
                     */
                    x = *((long *) value) + (INT_MAX -
                                             *((long *) old_value));
                } else {
                    x = *((long *) value) - *((long *) old_value);
                }
            } else {
                x = *((long *) value);
            }

            switch (item->mteTriggerBooleanComparison) {
            case MTETRIGGERBOOLEANCOMPARISON_UNEQUAL:
                boolresult = (x != item->mteTriggerBooleanValue);
                break;

            case MTETRIGGERBOOLEANCOMPARISON_EQUAL:
                boolresult = (x == item->mteTriggerBooleanValue);
                break;

            case MTETRIGGERBOOLEANCOMPARISON_LESS:
                boolresult = (x < item->mteTriggerBooleanValue);
                break;

            case MTETRIGGERBOOLEANCOMPARISON_LESSOREQUAL:
                boolresult = (x <= item->mteTriggerBooleanValue);
                break;

            case MTETRIGGERBOOLEANCOMPARISON_GREATER:
                boolresult = (x > item->mteTriggerBooleanValue);
                break;

            case MTETRIGGERBOOLEANCOMPARISON_GREATEROREQUAL:
                boolresult = (x >= item->mteTriggerBooleanValue);
                break;

            default:
                snmp_log(LOG_WARNING,
                         "illegal value in mteTriggerBooleanComparison object: %ld",
                         item->mteTriggerBooleanComparison);
                boolresult = item->lastboolresult;      /* to fail next test */
            }

            if (boolresult &&
                ((item->mteTriggerBooleanStartup ==
                  MTETRIGGERBOOLEANSTARTUP_TRUE
                  && lastbool == (char)-1) || lastbool != boolresult)) {
                send_mte_trap(item, mteTriggerFired,
                              sizeof(mteTriggerFired) / sizeof(oid),
                              next_oid, next_oid_len,
                              &x, item->mteTriggerBooleanObjectsOwner,
                              item->mteTriggerBooleanObjects,
                              "boolean: true");
                run_mte_events(item, next_oid, next_oid_len,
                               item->mteTriggerBooleanEventOwner,
                               item->mteTriggerBooleanEvent);
            }

            DEBUGMSGTL(("mteTriggerTable",
                        "value: %d %ld %lu x: %d %ld %lu\n", *value,
                        *value, *value, x, x, x));

            DEBUGMSGTL(("mteTriggerTable",
                        "boolean result: x=%d %s configured=%d = %d\n",
                        x,
                        se_find_label_in_slist("mteBooleanOperators",
                                               item->
                                               mteTriggerBooleanComparison),
                        item->mteTriggerBooleanValue, boolresult));
        }

        /*
         * Deal with threshold tests.  XXX: doesn't handle "delta-type"
         * sampling.  
         */
        if ((item->mteTriggerTest[0] & MTETRIGGERTEST_THRESHOLD) &&
            ((item->mteTriggerSampleType ==
              MTETRIGGERSAMPLETYPE_ABSOLUTEVALUE && value)
             || (item->mteTriggerSampleType ==
                 MTETRIGGERSAMPLETYPE_DELTAVALUE && value && old_value))) {
            /*
             * XXX: correct intepretation of mteTriggerThresholdStartup? 
             */
            /*
             * only fires when passed and just set to active?  What
             * about a newly discovered node that is past a
             * threshold once we've been active for a turn at least? 
             */
            /*
             * XXX: Check notions of > vs >= 
             */
            if (((item->started == MTE_STARTED && laststate &&
                  lastthresh == MTE_THRESHOLD_LOW) ||
                 (item->started != MTE_STARTED &&
                  (item->mteTriggerThresholdStartup ==
                   MTETRIGGERTHRESHOLDSTARTUP_RISING
                   || item->mteTriggerThresholdStartup ==
                   MTETRIGGERTHRESHOLDSTARTUP_RISINGORFALLING)))
                && (*value >= item->mteTriggerThresholdRising)) {
                send_mte_trap(item, mteTriggerRising,
                              sizeof(mteTriggerRising) / sizeof(oid),
                              next_oid, next_oid_len, value,
                              item->mteTriggerThresholdObjectsOwner,
                              item->mteTriggerThresholdObjects,
                              "threshold: rising");
                run_mte_events(item, next_oid, next_oid_len,
                               item->mteTriggerThresholdRisingEventOwner,
                               item->mteTriggerThresholdRisingEvent);
            }
            if (((item->started == MTE_STARTED && laststate &&
                  lastthresh == MTE_THRESHOLD_HIGH) ||
                 (item->started != MTE_STARTED &&
                  (item->mteTriggerThresholdStartup ==
                   MTETRIGGERTHRESHOLDSTARTUP_FALLING
                   || item->mteTriggerThresholdStartup ==
                   MTETRIGGERTHRESHOLDSTARTUP_RISINGORFALLING)))
                && (*value <= item->mteTriggerThresholdFalling)) {
                send_mte_trap(item, mteTriggerFalling,
                              sizeof(mteTriggerFalling) / sizeof(oid),
                              next_oid, next_oid_len, value,
                              item->mteTriggerThresholdObjectsOwner,
                              item->mteTriggerThresholdObjects,
                              "threshold: falling");
                run_mte_events(item, next_oid, next_oid_len,
                               item->mteTriggerThresholdFallingEventOwner,
                               item->mteTriggerThresholdFallingEvent);
            }

        }

        if (value) {
            struct last_state *new_last_state =
                SNMP_MALLOC_STRUCT(last_state);
            new_last_state->value = value;
            new_last_state->lastbool = boolresult;
            header_complex_add_data_by_oid(&item->hc_storage, next_oid,
                                           next_oid_len, new_last_state);

            /*
             * set our notion of the current known threshold state 
             */
            if (lastthresh == MTE_THRESHOLD_LOW &&
                *value >= item->mteTriggerThresholdRising &&
                *value > item->mteTriggerThresholdFalling)
                new_last_state->lastthreshold = MTE_THRESHOLD_HIGH;
            else if (lastthresh == MTE_THRESHOLD_HIGH &&
                     *value < item->mteTriggerThresholdRising &&
                     *value <= item->mteTriggerThresholdFalling)
                new_last_state->lastthreshold = MTE_THRESHOLD_LOW;
            else if (lastthresh == MTE_THRESHOLD_BEGIN) {
                if (*value >= item->mteTriggerThresholdRising)
                    new_last_state->lastthreshold = MTE_THRESHOLD_HIGH;
                else if (*value <= item->mteTriggerThresholdFalling)
                    new_last_state->lastthreshold = MTE_THRESHOLD_LOW;
                /*
                 * XXX: else???  in between?  undefined? 
                 */
            } else {
                new_last_state->lastthreshold = lastthresh;
            }
        }

        /*
         * extract from old hc storage 
         */
        if (laststate) {
            header_complex_extract_entry(&item->hc_storage_old,
                                         header_complex_find_entry(item->
                                                                   hc_storage_old,
                                                                   (void *)
                                                                   laststate));
            last_state_clean(laststate);
        }

    } while (item->mteTriggerValueIDWildcard == TV_TRUE);

    if(response)
        snmp_free_pdu(response);

    /*
     * loop through old values for DNE cases 
     */
    if (item->mteTriggerExistenceTest[0] & MTETRIGGEREXISTENCETEST_ABSENT) {

        struct header_complex_index *iter;

        /*
         * XXX: broken 
         */
        if ((item->mteTriggerExistenceStartup[0] &
             MTETRIGGEREXISTENCESTARTUP_ABSENT)) {
            /*
             * XXX: send trap that nothing was found? 
             */
            /*
             * only if !wild? (see mib)
             */
        }
        for (iter = item->hc_storage_old; iter; iter = iter->next) {
            laststate = (struct last_state *) iter->data;
            send_mte_trap(item, mteTriggerFired,
                          sizeof(mteTriggerFired) / sizeof(oid),
                          iter->name, iter->namelen, laststate->value,
                          item->mteTriggerExistenceObjectsOwner,
                          item->mteTriggerExistenceObjects,
                          "existence: absent");
        }
        header_complex_free_all(item->hc_storage_old, last_state_clean);
        item->hc_storage_old = NULL;
    }

    item->started = MTE_STARTED;
} /* mte_run_trigger */



/*
 * handling routines 
 */
void
mte_enable_trigger(struct mteTriggerTable_data *item)
{
    if (!item)
        return;

    if (item->alarmreg)
        snmp_alarm_unregister(item->alarmreg);

    if (item->mteTriggerFrequency > 0) {
        DEBUGMSGTL(("mteTriggertable", "Enabling trigger for %s/%s @ %u\n",
                    item->mteOwner, item->mteTriggerName,
                    item->mteTriggerFrequency));
        item->alarmreg =
            snmp_alarm_register(item->mteTriggerFrequency, SA_REPEAT,
                                mte_run_trigger, item);
    }
}

void
mte_disable_trigger(struct mteTriggerTable_data *item)
{
    if (!item)
        return;

    if (item->alarmreg) {
        DEBUGMSGTL(("mteTriggertable", "Disabling trigger for %s/%s\n",
                    item->mteOwner, item->mteTriggerName));
        snmp_alarm_unregister(item->alarmreg);
        item->alarmreg = 0;
    }
    item->started = MTE_NOTSTARTED;
}
