summaryrefslogtreecommitdiff
path: root/miscutils
diff options
context:
space:
mode:
Diffstat (limited to 'miscutils')
-rw-r--r--miscutils/watchdog.c54
1 files changed, 43 insertions, 11 deletions
diff --git a/miscutils/watchdog.c b/miscutils/watchdog.c
index cfe19ab..b1167dc 100644
--- a/miscutils/watchdog.c
+++ b/miscutils/watchdog.c
@@ -2,7 +2,7 @@
/*
* Mini watchdog implementation for busybox
*
- * Copyright (C) 2000 spoon <spoon@ix.netcom.com>.
+ * Copyright (C) 2003 Paul Mundt <lethal@linux-sh.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -20,30 +20,62 @@
*
*/
-/* getopt not needed */
-
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
+#include <signal.h>
#include "busybox.h"
+/* Userspace timer duration, in seconds */
+static unsigned int timer_duration = 30;
+
+/* Watchdog file descriptor */
+static int fd;
+
+static void watchdog_shutdown(int unused)
+{
+ write(fd, "V", 1); /* Magic */
+ close(fd);
+ exit(0);
+}
+
extern int watchdog_main(int argc, char **argv)
{
- int fd;
+ int opt;
- if (argc != 2) {
- bb_show_usage();
+ while ((opt = getopt(argc, argv, "t:")) > 0) {
+ switch (opt) {
+ case 't':
+ timer_duration = bb_xgetlarg(optarg, 10, 0, INT_MAX);
+ break;
+ default:
+ bb_show_usage();
+ }
}
- if ((fd=open(argv[1], O_WRONLY)) == -1) {
- bb_perror_msg_and_die(argv[1]);
- }
+ /* We're only interested in the watchdog device .. */
+ if (optind < argc - 1 || argc == 1)
+ bb_show_usage();
+
+ if (daemon(0, 1) < 0)
+ bb_perror_msg_and_die("Failed forking watchdog daemon");
+
+ signal(SIGHUP, watchdog_shutdown);
+ signal(SIGINT, watchdog_shutdown);
+
+ fd = bb_xopen(argv[argc - 1], O_WRONLY);
while (1) {
- sleep(30);
+ /*
+ * Make sure we clear the counter before sleeping, as the counter value
+ * is undefined at this point -- PFM
+ */
write(fd, "\0", 1);
+ sleep(timer_duration);
}
- return EXIT_FAILURE;
+ watchdog_shutdown(0);
+
+ return EXIT_SUCCESS;
}