blob: e0e44533dfd91700939cccd224b0af1218c4bb61 [file] [log] [blame]
/* $Header: /cvsroot/watchdog/watchdog/src/keep_alive.c,v 1.2 2006/07/31 09:39:23 meskes Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <errno.h>
#include <sys/syslog.h>
#include <unistd.h>
#include <time.h>
#include <string.h>
#include "extern.h"
#include "watch_err.h"
/* write a heartbeat file */
int write_heartbeat(void)
{
time_t timenow;
struct tm *tm;
char tbuf[TS_SIZE + 1];
char tbufw[TS_SIZE + 1];
if (hb == NULL)
return (ENOERR);
/* MJ 16/2/2001 keep a rolling buffer in a file of writes to the
watchdog device, any gaps in this will indicate a reboot */
timenow = time(NULL);
if (timenow != -1) {
tm = gmtime(&timenow);
/* Get the seconds since seconds since 00:00:00, Jan 1, 1970 */
strftime(tbuf, TS_SIZE - 1, "%s", tm);
/* Make it the right width */
sprintf(tbufw, "%*s\n", TS_SIZE - 1, tbuf);
/* copy it to the buffer */
memcpy(timestamps + (lastts * TS_SIZE), tbufw, TS_SIZE);
// success
if (nrts < hbstamps)
nrts++;
++lastts;
lastts = lastts % hbstamps;
// write the buffer to the file
rewind(hb);
if (nrts == hbstamps) {
// write from the logical start of the buffer to the physical end
if (fwrite(timestamps + (lastts * TS_SIZE), TS_SIZE, hbstamps - lastts, hb) == 0) {
int err = errno;
#if USE_SYSLOG
syslog(LOG_ERR, "write heartbeat file gave error %d = '%m'!", err);
#else /* USE_SYSLOG */
perror(progname);
#endif /* USE_SYSLOG */
}
// write from the physical start of the buffer to the logical end
if (fwrite(timestamps, TS_SIZE, lastts, hb) == 0) {
int err = errno;
#if USE_SYSLOG
syslog(LOG_ERR, "write heartbeat file gave error %d = '%m'!", err);
#else /* USE_SYSLOG */
perror(progname);
#endif /* USE_SYSLOG */
}
}
else {
// write from the physical start of the buffer to the logical end
if (fwrite(timestamps, TS_SIZE, nrts, hb) == 0) {
int err = errno;
#if USE_SYSLOG
syslog(LOG_ERR, "write heartbeat file gave error %d = '%m'!", err);
#else /* USE_SYSLOG */
perror(progname);
#endif /* USE_SYSLOG */
}
}
fflush(hb);
}
return(ENOERR);
}
/* write to the watchdog device */
int keep_alive(void)
{
if (watchdog == -1)
return (ENOERR);
if (write(watchdog, "\0", 1) < 0) {
int err = errno;
#if USE_SYSLOG
syslog(LOG_ERR, "write watchdog device gave error %d = '%m'!", err);
#else /* USE_SYSLOG */
perror(progname);
#endif /* USE_SYSLOG */
if (softboot)
return (err);
}
/* MJ 20/2/2001 write a heartbeat to a file outside the syslog, because:
- there is no guarantee the system logger is up and running
- easier and quicker to parse checkpoint information */
write_heartbeat();
return(ENOERR);
}