X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fprocd.git;a=blobdiff_plain;f=watchdog.c;h=592ae7e74f771472ef7a670f8badbac1084d4ed5;hp=98961d32bb1d9fa5bdd093cdf2c27d134916dc2b;hb=ad3ddbf04850a9ab229e21b70bf637090b33bf00;hpb=9bd712e309421f75363f4a356f4c1ab2c93f8f87 diff --git a/watchdog.c b/watchdog.c index 98961d3..592ae7e 100644 --- a/watchdog.c +++ b/watchdog.c @@ -32,21 +32,39 @@ static struct uloop_timeout wdt_timeout; static int wdt_fd = -1; static int wdt_frequency = 5; +void watchdog_ping(void) +{ + DEBUG(4, "Ping\n"); + if (wdt_fd >= 0 && write(wdt_fd, "X", 1) < 0) + ERROR("WDT failed to write: %s\n", strerror(errno)); +} + static void watchdog_timeout_cb(struct uloop_timeout *t) { - DEBUG(2, "Ping\n"); - if (write(wdt_fd, "X", 1) < 0) - perror("WDT failed to write\n"); + watchdog_ping(); uloop_timeout_set(t, wdt_frequency * 1000); } +void watchdog_set_stopped(bool val) +{ + if (val) + uloop_timeout_cancel(&wdt_timeout); + else + watchdog_timeout_cb(&wdt_timeout); +} + +bool watchdog_get_stopped(void) +{ + return !wdt_timeout.pending; +} + int watchdog_timeout(int timeout) { if (wdt_fd < 0) return 0; if (timeout) { - DEBUG(2, "Set watchdog timeout: %ds\n", timeout); + DEBUG(4, "Set watchdog timeout: %ds\n", timeout); ioctl(wdt_fd, WDIOC_SETTIMEOUT, &timeout); } ioctl(wdt_fd, WDIOC_GETTIMEOUT, &timeout); @@ -60,7 +78,7 @@ int watchdog_frequency(int frequency) return 0; if (frequency) { - DEBUG(2, "Set watchdog frequency: %ds\n", frequency); + DEBUG(4, "Set watchdog frequency: %ds\n", frequency); wdt_frequency = frequency; } @@ -78,26 +96,40 @@ char* watchdog_fd(void) return fd_buf; } -void watchdog_init(void) +void watchdog_init(int preinit) { char *env = getenv("WDTFD"); + if (wdt_fd >= 0) + return; + wdt_timeout.cb = watchdog_timeout_cb; if (env) { - LOG("- watchdog -\n"); - DEBUG(1, "Watchdog handover: fd=%s\n", env); + DEBUG(2, "Watchdog handover: fd=%s\n", env); wdt_fd = atoi(env); - fcntl(wdt_fd, F_SETFD, fcntl(wdt_fd, F_GETFD) | FD_CLOEXEC); unsetenv("WDTFD"); } else { wdt_fd = open("/dev/watchdog", O_WRONLY); - if (getpid() != 1) - fcntl(wdt_fd, F_SETFD, fcntl(wdt_fd, F_GETFD) | FD_CLOEXEC); } + if (wdt_fd < 0) return; + + if (!preinit) + fcntl(wdt_fd, F_SETFD, fcntl(wdt_fd, F_GETFD) | FD_CLOEXEC); + + LOG("- watchdog -\n"); watchdog_timeout(30); watchdog_timeout_cb(&wdt_timeout); - DEBUG(2, "Opened watchdog with timeout %ds\n", watchdog_timeout(0)); + DEBUG(4, "Opened watchdog with timeout %ds\n", watchdog_timeout(0)); +} + + +void watchdog_no_cloexec(void) +{ + if (wdt_fd < 0) + return; + + fcntl(wdt_fd, F_SETFD, fcntl(wdt_fd, F_GETFD) & ~FD_CLOEXEC); }