xref: /aosp_15_r20/external/toybox/toys/other/watchdog.c (revision cf5a6c84e2b8763fc1a7db14496fd4742913b199)
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