From e8ff755cba9e249d0e43212acbc0c3bf38af1622 Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Wed, 21 Oct 2020 01:17:35 -0500 Subject: Promote watchdog. --- toys/other/watchdog.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 toys/other/watchdog.c (limited to 'toys/other/watchdog.c') diff --git a/toys/other/watchdog.c b/toys/other/watchdog.c new file mode 100644 index 00000000..7a49c0b0 --- /dev/null +++ b/toys/other/watchdog.c @@ -0,0 +1,50 @@ +/* watchdog - start a watchdog timer with configurable kick frequencies + * + * Copyright 2019 Chris Sarra + * + * See kernel.org/doc/Documentation/watchdog/watchdog-api.txt + +USE_WATCHDOG(NEWTOY(watchdog, "<1>1Ft#=4<1T#=60<1", TOYFLAG_NEEDROOT|TOYFLAG_BIN)) + +config WATCHDOG + bool "watchdog" + default y + depends on TOYBOX_FORK + help + usage: watchdog [-F] [-t SW_TIMER_S] [-T HW_TIMER_S] DEV + + Start the watchdog timer at DEV with optional timeout parameters. + + -F run in the foreground (do not daemonize) + -t software timer (in seconds) + -T hardware timer (in seconds) +*/ +#define FOR_watchdog +#include "toys.h" +#include "linux/watchdog.h" + +GLOBALS( + long T, t; + + int fd; +) + +void safe_shutdown(int ignored) { + write(TT.fd, "V", 1); + close(TT.fd); + error_exit("safely exited watchdog."); +} + +void watchdog_main(void) +{ + if (!FLAG(F) && daemon(1, 1)) perror_exit("failed to daemonize"); + xsignal(SIGTERM, safe_shutdown); + xsignal(SIGINT, safe_shutdown); + xioctl(TT.fd = xopen(*toys.optargs, O_WRONLY), WDIOC_SETTIMEOUT, &TT.T); + + // Now that we've got the watchdog device open, kick it periodically. + for (;;) { + write(TT.fd, "", 1); + sleep(TT.t); + } +} -- cgit v1.2.3