- add central knob to turn off getopt_long everywhere. EXPERIMENTAL!
[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  *
7  * Licensed under the GPL v2 or later, see the file LICENSE in this tarball.
8  */
9
10 #include <stdio.h>
11 #include <fcntl.h>
12 #include <unistd.h>
13 #include <stdlib.h>
14 #include <signal.h>
15 #include "busybox.h"
16
17 /* Userspace timer duration, in seconds */
18 static unsigned int timer_duration = 30;
19
20 /* Watchdog file descriptor */
21 static int fd;
22
23 static void watchdog_shutdown(int ATTRIBUTE_UNUSED unused)
24 {
25         write(fd, "V", 1);      /* Magic */
26         close(fd);
27         exit(0);
28 }
29
30 int watchdog_main(int argc, char **argv)
31 {
32
33         char *t_arg;
34         unsigned long flags;
35         flags = bb_getopt_ulflags(argc, argv, "t:", &t_arg);
36         if (flags & 1)
37                 timer_duration = bb_xgetlarg(t_arg, 10, 0, INT_MAX);
38
39         /* We're only interested in the watchdog device .. */
40         if (optind < argc - 1 || argc == 1)
41                 bb_show_usage();
42
43         bb_xdaemon(0, 1);
44
45         signal(SIGHUP, watchdog_shutdown);
46         signal(SIGINT, watchdog_shutdown);
47
48         fd = bb_xopen(argv[argc - 1], O_WRONLY);
49
50         while (1) {
51                 /*
52                  * Make sure we clear the counter before sleeping, as the counter value
53                  * is undefined at this point -- PFM
54                  */
55                 write(fd, "\0", 1);
56                 sleep(timer_duration);
57         }
58
59         watchdog_shutdown(0);
60
61         return EXIT_SUCCESS;
62 }