diff options
Diffstat (limited to 'hbeat.c')
-rw-r--r-- | hbeat.c | 72 |
1 files changed, 55 insertions, 17 deletions
@@ -17,7 +17,7 @@ struct hbeat_s { char *host; int max_timeout; - enum {HOST_ALIVE, HOST_QUIET, HOST_TIMEOUT, HOST_REBOOT} rhost_state; + hbeat_state_t rhost_state; unsigned int last_rhost_btime; time_t start_quiet_time; }; @@ -85,38 +85,76 @@ hbeat(hbeat_t hbh) struct hbeat_s *hbeatp = hbh; unsigned int hbeat; time_t current_time; + int retval; /* User disabled heart beating */ if (!hbeatp->max_timeout) { + hbeatp->rhost_state = HOST_HBEAT_DISABLED; return 1; } hbeat = btime(hbeatp->host); current_time = time(NULL); - if (!hbeat && (hbeatp->rhost_state == HOST_QUIET)) { - if (current_time - hbeatp->start_quiet_time - > hbeatp->max_timeout) { - hbeatp->rhost_state = HOST_TIMEOUT; - return 0; - } - } else { - hbeatp->rhost_state = HOST_QUIET; - hbeatp->start_quiet_time = time(NULL); + if (!hbeat) { + switch (hbeatp->rhost_state) { + case HOST_ALIVE: + hbeatp->rhost_state = HOST_QUIET; + hbeatp->start_quiet_time = time(NULL); + retval = 1; + break; + + case HOST_QUIET: + if (current_time - hbeatp->start_quiet_time + > hbeatp->max_timeout) { + hbeatp->rhost_state = HOST_TIMEOUT; + retval = 0; + } else { + retval = 1; + } + break; + + case HOST_TIMEOUT: + case HOST_REBOOT: + retval = 0; + break; + + case HOST_HBEAT_DISABLED: + retval = 1; + break; + } } if (hbeat) { - if (hbeatp->last_rhost_btime == 0) { + if (hbeatp->rhost_state == HOST_REBOOT) { + retval = 0; + } else { hbeatp->last_rhost_btime = hbeat; hbeatp->rhost_state = HOST_ALIVE; hbeatp->start_quiet_time = 0; - } + retval = 1; - if (abs(hbeat - hbeatp->last_rhost_btime) > 5) { - hbeatp->rhost_state = HOST_REBOOT; - return 0; - } + if (abs(hbeat - hbeatp->last_rhost_btime) > 5) { + hbeatp->rhost_state = HOST_REBOOT; + retval = 0; + } + } } - return 1; + return retval; +} + + +hbeat_state_t +hbeat_getstate(hbeat_t hbh) +{ + return ((struct hbeat_s *)hbh)->rhost_state; +} + + +void +hbeat_setstate(hbeat_t hbh, hbeat_state_t state) +{ + ((struct hbeat_s *)hbh)->rhost_state = state; + return; } |