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


#ifndef _MIBGROUP_MTEOBJECTSTABLE_H
#define _MIBGROUP_MTEOBJECTSTABLE_H


/*
 * we may use header_complex from the header_complex module 
 */


config_require(header_complex)


    /*
     * our storage structure(s) 
     */
     struct mteObjectsTable_data {

         char           *mteOwner;
         size_t          mteOwnerLen;
         char           *mteObjectsName;
         size_t          mteObjectsNameLen;
         unsigned long   mteObjectsIndex;
         oid            *mteObjectsID;
         size_t          mteObjectsIDLen;
         long            mteObjectsIDWildcard;
         long            mteObjectsEntryStatus;
         int             storagetype;
     };

/*
 * enum definitions from the covered mib sections 
 */


#define MTEOBJECTSIDWILDCARD_TRUE                1
#define MTEOBJECTSIDWILDCARD_FALSE               2

/*
 * function prototypes 
 */


     void            init_mteObjectsTable(void);
     FindVarMethod   var_mteObjectsTable;
     void            parse_mteObjectsTable(const char *, char *);
     SNMPCallback    store_mteObjectsTable;
     void            mte_add_objects(netsnmp_variable_list *,
                                     struct mteTriggerTable_data *,
                                     const char *, const char *, oid *,
                                     size_t);
     int             mte_add_object_to_table(const char *owner,
                                             const char *objname,
                                             oid * oidname,
                                             size_t oidname_len,
                                             int iswild);

#ifndef NETSNMP_NO_WRITE_SUPPORT
     WriteMethod     write_mteObjectsID;
     WriteMethod     write_mteObjectsIDWildcard;
     WriteMethod     write_mteObjectsEntryStatus;
#endif /* !NETSNMP_NO_WRITE_SUPPORT */



#endif                          /* _MIBGROUP_MTEOBJECTSTABLE_H */
