Rob Sullivan sent in some cleanups, which I beat on slightly.
[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 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         if (daemon(0, 1) < 0)
44                 bb_perror_msg_and_die("Failed forking watchdog daemon");
45
46         signal(SIGHUP, watchdog_shutdown);
47         signal(SIGINT, watchdog_shutdown);
48
49         fd = bb_xopen(argv[argc - 1], O_WRONLY);
50
51         while (1) {
52                 /*
53                  * Make sure we clear the counter before sleeping, as the counter value
54                  * is undefined at this point -- PFM
55                  */
56                 write(fd, "\0", 1);
57                 sleep(timer_duration);
58         }
59
60         watchdog_shutdown(0);
61
62         return EXIT_SUCCESS;
63 }