#include #include #include #include #include #include #include #include #include #include #include "watchdog.h" #define TIMEOUT_DEFAULT 60 int fd; void sig_any() { syslog(LOG_EMERG, "feedthedog killed by untrapped signal. System will be rebooted by watchdog."); exit(0); } void sig_term() { syslog(LOG_NOTICE, "Exiting, shutting down watchdog..."); if (write(fd, "V", 1) == -1) { syslog(LOG_NOTICE, "Failed!"); exit(1); } if (close(fd) == -1) { syslog(LOG_NOTICE, "Failed!"); exit(1); } syslog(LOG_NOTICE, "Watchdog successfully shut down!"); exit(0); } void get_info() { int timeout; struct watchdog_info info; ioctl(fd, WDIOC_GETTIMEOUT, &timeout); syslog(LOG_INFO, "Watchdog timeout is %d seconds\n", timeout); ioctl(fd, WDIOC_GETSUPPORT, &info); syslog(LOG_INFO, "Watchdog options: 0x%04x", info.options); syslog(LOG_INFO, "Watchdog firmware ver: %d", info.firmware_version); syslog(LOG_INFO, "Watchdog type:%s", info.identity); } int main() { int i,timeout; openlog("feedthedog", LOG_PID, LOG_DAEMON); if ((fd = open("/dev/watchdog", O_WRONLY)) == -1) { perror("open"); exit(1); } timeout = atoi(getenv("WATCHDOG_TIMEOUT")); if (timeout <= 0) { syslog(LOG_WARNING, "Timeout set to %d. Using default.", timeout); timeout = TIMEOUT_DEFAULT; } get_info(); for (i=1;i<=_NSIG;i++) { switch (i) { case SIGSTOP: case SIGKILL: break; case SIGTERM: signal(SIGTERM, sig_term); break; default: signal(i, sig_any); break; } } if (fork()) exit(0); syslog(LOG_INFO, "Watchdog feeder started"); while (1) { write(fd, "\0", 1); sleep(10); } return 0; }