summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/usage.h6
-rw-r--r--miscutils/watchdog.c54
2 files changed, 47 insertions, 13 deletions
diff --git a/include/usage.h b/include/usage.h
index 6f85588..094eae8 100644
--- a/include/usage.h
+++ b/include/usage.h
@@ -2620,9 +2620,11 @@
"Mon Dec 17 10:31:44 GMT 2000"
#define watchdog_trivial_usage \
- "DEV"
+ "[-t <seconds>] DEV"
#define watchdog_full_usage \
- "Periodically write to watchdog device DEV"
+ "Periodically write to watchdog device DEV.\n" \
+ "Options:\n" \
+ "\t-t\tTimer period in seconds - default is 30."
#define wc_trivial_usage \
"[OPTION]... [FILE]..."
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;
}