1*cf5a6c84SAndroid Build Coastguard Worker /* watchdog - start a watchdog timer with configurable kick frequencies
2*cf5a6c84SAndroid Build Coastguard Worker *
3*cf5a6c84SAndroid Build Coastguard Worker * Copyright 2019 Chris Sarra <[email protected]>
4*cf5a6c84SAndroid Build Coastguard Worker *
5*cf5a6c84SAndroid Build Coastguard Worker * See kernel.org/doc/Documentation/watchdog/watchdog-api.txt
6*cf5a6c84SAndroid Build Coastguard Worker
7*cf5a6c84SAndroid Build Coastguard Worker USE_WATCHDOG(NEWTOY(watchdog, "<1>1Ft#=4<1T#=60<1", TOYFLAG_NEEDROOT|TOYFLAG_SBIN))
8*cf5a6c84SAndroid Build Coastguard Worker
9*cf5a6c84SAndroid Build Coastguard Worker config WATCHDOG
10*cf5a6c84SAndroid Build Coastguard Worker bool "watchdog"
11*cf5a6c84SAndroid Build Coastguard Worker default y
12*cf5a6c84SAndroid Build Coastguard Worker help
13*cf5a6c84SAndroid Build Coastguard Worker usage: watchdog [-F] [-t UPDATE] [-T DEADLINE] DEV
14*cf5a6c84SAndroid Build Coastguard Worker
15*cf5a6c84SAndroid Build Coastguard Worker Start the watchdog timer at DEV with optional timeout parameters.
16*cf5a6c84SAndroid Build Coastguard Worker
17*cf5a6c84SAndroid Build Coastguard Worker -F run in the foreground (do not daemonize)
18*cf5a6c84SAndroid Build Coastguard Worker -t poke watchdog every UPDATE seconds (default 4)
19*cf5a6c84SAndroid Build Coastguard Worker -T reboot if not poked for DEADLINE seconds (default 60)
20*cf5a6c84SAndroid Build Coastguard Worker */
21*cf5a6c84SAndroid Build Coastguard Worker
22*cf5a6c84SAndroid Build Coastguard Worker #define FOR_watchdog
23*cf5a6c84SAndroid Build Coastguard Worker #include "toys.h"
24*cf5a6c84SAndroid Build Coastguard Worker #include "linux/watchdog.h"
25*cf5a6c84SAndroid Build Coastguard Worker
GLOBALS(long T,t;int fd;)26*cf5a6c84SAndroid Build Coastguard Worker GLOBALS(
27*cf5a6c84SAndroid Build Coastguard Worker long T, t;
28*cf5a6c84SAndroid Build Coastguard Worker
29*cf5a6c84SAndroid Build Coastguard Worker int fd;
30*cf5a6c84SAndroid Build Coastguard Worker )
31*cf5a6c84SAndroid Build Coastguard Worker
32*cf5a6c84SAndroid Build Coastguard Worker static void safe_shutdown(int ignored)
33*cf5a6c84SAndroid Build Coastguard Worker {
34*cf5a6c84SAndroid Build Coastguard Worker (void)write(TT.fd, "V", 1);
35*cf5a6c84SAndroid Build Coastguard Worker close(TT.fd);
36*cf5a6c84SAndroid Build Coastguard Worker error_exit("safely exited watchdog.");
37*cf5a6c84SAndroid Build Coastguard Worker }
38*cf5a6c84SAndroid Build Coastguard Worker
watchdog_main(void)39*cf5a6c84SAndroid Build Coastguard Worker void watchdog_main(void)
40*cf5a6c84SAndroid Build Coastguard Worker {
41*cf5a6c84SAndroid Build Coastguard Worker if (!FLAG(F)) xvdaemon();
42*cf5a6c84SAndroid Build Coastguard Worker xsignal(SIGTERM, safe_shutdown);
43*cf5a6c84SAndroid Build Coastguard Worker xsignal(SIGINT, safe_shutdown);
44*cf5a6c84SAndroid Build Coastguard Worker xioctl(TT.fd = xopen(*toys.optargs, O_WRONLY), WDIOC_SETTIMEOUT, &TT.T);
45*cf5a6c84SAndroid Build Coastguard Worker
46*cf5a6c84SAndroid Build Coastguard Worker // Now that we've got the watchdog device open, kick it periodically.
47*cf5a6c84SAndroid Build Coastguard Worker for (;;) {
48*cf5a6c84SAndroid Build Coastguard Worker (void)write(TT.fd, "", 1);
49*cf5a6c84SAndroid Build Coastguard Worker sleep(TT.t);
50*cf5a6c84SAndroid Build Coastguard Worker }
51*cf5a6c84SAndroid Build Coastguard Worker }
52