#ifndef SNMP_ALARM_H
#define SNMP_ALARM_H

/*
 * For 'timeval'
 */
#ifdef TIME_WITH_SYS_TIME
# include <sys/time.h>
# include <time.h>
#else
# ifdef HAVE_SYS_TIME_H
#  include <sys/time.h>
# else
#  include <time.h>
# endif
#endif

#ifdef __cplusplus
extern          "C" {
#endif

    typedef void    (SNMPAlarmCallback) (unsigned int clientreg,
                                         void *clientarg);

    /*
     * alarm flags 
     */
#define SA_REPEAT 0x01          /* keep repeating every X seconds */
#define SA_FIRED 0x10          /* Being processed in run_alarms */

    struct snmp_alarm {
        /** Alarm interval. Zero if single-shot. */
        struct timeval  t;
        unsigned int    flags;
        unsigned int    clientreg;
        /** Last time the alarm fired [monotonic clock]. */
        struct timeval  t_lastM;
        /** Next time the alarm will fire [monotonic clock]. */
        struct timeval  t_nextM;
        void           *clientarg;
        SNMPAlarmCallback *thecallback;
        struct snmp_alarm *next;
    };

    /*
     * the ones you should need 
     */
    NETSNMP_IMPORT
    void            snmp_alarm_unregister(unsigned int clientreg);
    void	    snmp_alarm_unregister_all(void);
    NETSNMP_IMPORT
    unsigned int    snmp_alarm_register(unsigned int when,
                                        unsigned int flags,
                                        SNMPAlarmCallback * thecallback,
                                        void *clientarg);

    unsigned int    snmp_alarm_register_hr(struct timeval t,
                                           unsigned int flags,
                                           SNMPAlarmCallback * cb,
                                           void *cd);
    NETSNMP_IMPORT
    int             snmp_alarm_reset(unsigned int clientreg);


    /*
     * the ones you shouldn't 
     */
    NETSNMP_IMPORT void init_snmp_alarm(void);
    int             init_alarm_post_config(int majorid, int minorid,
                                           void *serverarg,
                                           void *clientarg);
    void            sa_update_entry(struct snmp_alarm *alrm);
    struct snmp_alarm *sa_find_next(void);
    NETSNMP_IMPORT void run_alarms(void);
    RETSIGTYPE      alarm_handler(int a);
    void            set_an_alarm(void);
    int             netsnmp_get_next_alarm_time(struct timeval *alarm_tm,
                                                const struct timeval *now);
    int             get_next_alarm_delay_time(struct timeval *delta);


#ifdef __cplusplus
}
#endif
#endif                          /* SNMP_ALARM_H */
