suppress warnings about easch <applet>_main() having
[oweals/busybox.git] / miscutils / watchdog.c
1 /* vi: set sw=4 ts=4: */
2 /*
3  * Mini watchdog implementation for busybox
4  *
5  * Copyright (C) 2003  Paul Mundt <lethal@linux-sh.org>
6  * Copyright (C) 2006  Bernhard Fischer <busybox@busybox.net>
7  *
8  * Licensed under the GPL v2 or later, see the file LICENSE in this tarball.
9  */
10
11 #include "busybox.h"
12
13 #define OPT_FOREGROUND 0x01
14 #define OPT_TIMER      0x02
15
16 /* Watchdog file descriptor */
17 static int fd;
18
19 static void watchdog_shutdown(int ATTRIBUTE_UNUSED unused)
20 {
21         write(fd, "V", 1);      /* Magic, see watchdog-api.txt in kernel */
22         close(fd);
23         exit(0);
24 }
25
26 int watchdog_main(int argc, char **argv);
27 int watchdog_main(int argc, char **argv)
28 {
29         unsigned opts;
30         unsigned timer_duration = 30; /* Userspace timer duration, in seconds */
31         char *t_arg;
32
33         opts = getopt32(argc, argv, "Ft:", &t_arg);
34
35         if (opts & OPT_TIMER)
36                 timer_duration = xatou(t_arg);
37
38         /* We're only interested in the watchdog device .. */
39         if (optind < argc - 1 || argc == 1)
40                 bb_show_usage();
41
42 #ifdef BB_NOMMU
43         if (!(opts & OPT_FOREGROUND))
44                 vfork_daemon_rexec(0, 1, argc, argv, "-F");
45 #else
46         xdaemon(0, 1);
47 #endif
48
49         signal(SIGHUP, watchdog_shutdown);
50         signal(SIGINT, watchdog_shutdown);
51
52         fd = xopen(argv[argc - 1], O_WRONLY);
53
54         while (1) {
55                 /*
56                  * Make sure we clear the counter before sleeping, as the counter value
57                  * is undefined at this point -- PFM
58                  */
59                 write(fd, "\0", 1);
60                 sleep(timer_duration);
61         }
62
63         watchdog_shutdown(0);
64
65         return EXIT_SUCCESS;
66 }