
/*
 * This file was generated by mib2c and is intended for use as a mib module
 * for the ucd-snmp snmpd agent.  Edited by Michael Baer
 * 
 * last changed 2/2/99.
 */

#ifndef _MIBGROUP_SNMPTARGETADDRENTRY_H
#define _MIBGROUP_SNMPTARGETADDRENTRY_H

/*
 * we use header_generic from the util_funcs module
 */

config_require(util_funcs/header_generic)


    /*
     * add the SNMPv2-TM mib into the default list of mibs to load, since
     * it contains the Domain definitions (EG, netsnmpUDPDomain) 
     */
config_add_mib(SNMPv2-TM)

    /*
     * Magic number definitions: 
     */
#define   SNMPTARGETADDRTDOMAIN      1
#define   SNMPTARGETADDRTADDRESS     2
#define   SNMPTARGETADDRTIMEOUT      3
#define   SNMPTARGETADDRRETRYCOUNT   4
#define   SNMPTARGETADDRTAGLIST      5
#define   SNMPTARGETADDRPARAMS       6
#define   SNMPTARGETADDRSTORAGETYPE  7
#define   SNMPTARGETADDRROWSTATUS    8
#define	  SNMPTARGETSPINLOCK	     99
#define   SNMPTARGETADDRTDOMAINCOLUMN      2
#define   SNMPTARGETADDRTADDRESSCOLUMN     3
#define   SNMPTARGETADDRTIMEOUTCOLUMN      4
#define   SNMPTARGETADDRRETRYCOUNTCOLUMN   5
#define   SNMPTARGETADDRTAGLISTCOLUMN      6
#define   SNMPTARGETADDRPARAMSCOLUMN       7
#define   SNMPTARGETADDRSTORAGETYPECOLUMN  8
#define   SNMPTARGETADDRROWSTATUSCOLUMN    9
    /*
     * structure definitions 
     */
     struct targetAddrTable_struct {
         char           *name;
         oid             tDomain[MAX_OID_LEN];
         int             tDomainLen;
         unsigned char  *tAddress;
         size_t          tAddressLen;
         int             timeout;	/* Timeout in centiseconds */
         int             retryCount;
         char           *tagList;
         char           *params;
         int             storageType;
         int             rowStatus;
         struct targetAddrTable_struct *next;
         netsnmp_session *sess; /* a snmp session to the target host */
         time_t          sessionCreationTime;
     };

/*
 * function definitions 
 */

     void            init_snmpTargetAddrEntry(void);
     int             store_snmpTargetAddrEntry(int majorID, int minorID,
                                               void *serverarg,
                                               void *clientarg);
     FindVarMethod   var_snmpTargetAddrEntry;

     struct targetAddrTable_struct *get_addrTable(void);
     struct targetAddrTable_struct *get_addrForName(char *name);
     struct targetAddrTable_struct *snmpTargetAddrTable_create(void);
     void            snmpTargetAddrTable_add(struct targetAddrTable_struct
                                             *newEntry);

     void            snmpd_parse_config_targetAddr(const char *, char *);

     WriteMethod     write_snmpTargetAddrTDomain;
     WriteMethod     write_snmpTargetAddrTAddress;
     WriteMethod     write_snmpTargetAddrTimeout;
     WriteMethod     write_snmpTargetAddrRetryCount;
     WriteMethod     write_snmpTargetAddrTagList;
     WriteMethod     write_snmpTargetAddrParams;
     WriteMethod     write_snmpTargetAddrStorageType;
     WriteMethod     write_snmpTargetAddrRowStatus;

     FindVarMethod   var_targetSpinLock;
     WriteMethod     write_targetSpinLock;

#endif                          /* _MIBGROUP_SNMPTARGETADDRENTRY_H */
