
  /*
   * 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_SNMPTARGETPARAMSENTRY_H
  #define _MIBGROUP_SNMPTARGETPARAMSENTRY_H
 
      /*
       * Magic number definitions: 
       */
  #define   SNMPTARGETPARAMSMPMODEL        1
  #define   SNMPTARGETPARAMSSECURITYMODEL  2
  #define   SNMPTARGETPARAMSSECURITYNAME   3
  #define   SNMPTARGETPARAMSSECURITYLEVEL  4
  #define   SNMPTARGETPARAMSSTORAGETYPE    5
  #define   SNMPTARGETPARAMSROWSTATUS      6
  #define   SNMPTARGETPARAMSMPMODELCOLUMN        2
  #define   SNMPTARGETPARAMSSECURITYMODELCOLUMN  3
  #define   SNMPTARGETPARAMSSECURITYNAMECOLUMN   4
  #define   SNMPTARGETPARAMSSECURITYLEVELCOLUMN  5
  #define   SNMPTARGETPARAMSSTORAGETYPECOLUMN    6
  #define   SNMPTARGETPARAMSROWSTATUSCOLUMN      7
      /*
       * structure definitions 
       */
       struct targetParamTable_struct {
           char           *paramName;
           int             mpModel;
           int             secModel;
           char           *secName;
           int             secLevel;
           int             storageType;
           int             rowStatus;
           struct targetParamTable_struct *next;
           time_t          updateTime;
       };
 
  /*
   * utility functions 
   */
       struct targetParamTable_struct *get_paramEntry(char *name);
       void            snmpTargetParamTable_add(struct
                                                targetParamTable_struct
                                                *newEntry);
       struct targetParamTable_struct *snmpTargetParamTable_create(void);
       void snmpTargetParamTable_dispose(struct targetParamTable_struct *);
 
  /*
   * function definitions 
   */
 
       void            init_snmpTargetParamsEntry(void);
       void            shutdown_snmpTargetParamsEntry(void);
       int             store_snmpTargetParamsEntry(int majorID, int minorID,
                                                   void *serverarg,
                                                   void *clientarg);
       extern FindVarMethod var_snmpTargetParamsEntry;
 
       void            snmpd_parse_config_targetParams(const char *, char *);
 
#ifndef NETSNMP_NO_WRITE_SUPPORT
     WriteMethod     write_snmpTargetParamsMPModel;
     WriteMethod     write_snmpTargetParamsSecModel;
     WriteMethod     write_snmpTargetParamsSecName;
     WriteMethod     write_snmpTargetParamsSecLevel;
     WriteMethod     write_snmpTargetParamsStorageType;
     WriteMethod     write_snmpTargetParamsRowStatus;
#endif /* !NETSNMP_NO_WRITE_SUPPORT */


#endif                          /* _MIBGROUP_SNMPTARGETPARAMSENTRY_H */
