/*
 *Copyright(c)2004,Cisco URP imburses and Network Information Center in Beijing University of Posts and Telecommunications researches.
 *
 *All right reserved
 *
 *File Name: expErrorTable.c
 *File Description: expErrorTable MIB operation.
 *
 *Current Version:1.0
 *Author:JianShun Tong
 *Date:2004.8.20
 */


/*
 * 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>
#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


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

#include "header_complex.h"
#include "expErrorTable.h"
#include "expExpressionTable.h"



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

oid             expErrorTable_variables_oid[] =
    { 1, 3, 6, 1, 2, 1, 90, 1, 2, 2 };

/*
 * variable2 expErrorTable_variables:
 */

struct variable2 expErrorTable_variables[] = {
    /*
     * magic number        , variable type , ro/rw , callback fn  , L, oidsuffix 
     */
#define	EXPERRORTIME  1
    {EXPERRORTIME,  ASN_UNSIGNED, NETSNMP_OLDAPI_RONLY,
     var_expErrorTable, 2, {1, 1}},
#define	EXPERRORINDEX 2
    {EXPERRORINDEX, ASN_INTEGER,  NETSNMP_OLDAPI_RONLY,
     var_expErrorTable, 2, {1, 2}},
#define	EXPERRORCODE 3
    {EXPERRORCODE,  ASN_INTEGER,  NETSNMP_OLDAPI_RONLY,
     var_expErrorTable, 2, {1, 3}},
#define	EXPERRORINSTANCE 4
    {EXPERRORINSTANCE, ASN_OBJECT_ID, NETSNMP_OLDAPI_RONLY,
     var_expErrorTable, 2, {1, 4}}
};

extern struct header_complex_index *expExpressionTableStorage;


void
init_expErrorTable(void)
{
    DEBUGMSGTL(("expErrorTable", "initializing...  "));



    /*
     * register ourselves with the agent to handle our mib tree 
     */
    REGISTER_MIB("expErrorTable",
                 expErrorTable_variables, variable2,
                 expErrorTable_variables_oid);

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



unsigned char  *
var_expErrorTable(struct variable *vp,
                  oid * name,
                  size_t *length,
                  int exact, size_t *var_len, WriteMethod ** write_method)
{
    struct expExpressionTable_data *StorageTmp = NULL;

    DEBUGMSGTL(("expErrorTable", "var_expErrorTable: Entering...  \n"));
    /*
     * this assumes you have registered all your data properly
     */
    if ((StorageTmp =
         header_complex(expExpressionTableStorage, vp, name, length, exact,
                        var_len, write_method)) == NULL)
        return NULL;

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

    case EXPERRORTIME:
        *var_len = sizeof(StorageTmp->expErrorTime);
        return (u_char *) & StorageTmp->expErrorTime;

    case EXPERRORINDEX:
        *var_len = sizeof(StorageTmp->expErrorIndex);
        return (u_char *) & StorageTmp->expErrorIndex;

    case EXPERRORCODE:
        *var_len = sizeof(StorageTmp->expErrorCode);
        return (u_char *) & StorageTmp->expErrorCode;

    case EXPERRORINSTANCE:
        *var_len = StorageTmp->expErrorInstanceLen * sizeof(oid);
        return (u_char *) StorageTmp->expErrorInstance;
    }
}
