aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2003-07-22 07:39:18 +0000
committerEric Andersen <andersen@codepoet.org>2003-07-22 07:39:18 +0000
commitcde8f53c6054d35e1ec327bb2952aebeadc9ae48 (patch)
tree819a67150ee269aa34b58b8189f190e8ab5a8cb5
parent592ebd507a444a69e6d0f2183060fbb1c795eac4 (diff)
downloadbusybox-cde8f53c6054d35e1ec327bb2952aebeadc9ae48.tar.gz
Paul Mundt <lethal@linux-sh.org> writes:
Here's a bunch of fixes for the watchdog app in busybox. This does a couple of things: - configurable timer duration (userspace timer duration is usually configurable within the device drivers themselves). - run as a daemon - shutdown the device properly on SIGINT or SIGHUP - clear the counter immediately instead of sleeping first as well as updating the usage information. This has also been switched over to getopt to deal with the optional timer duration specifier. The changes themselves are harmless and isolated, and I've veried that this works on sh and x86 without any problems.
-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 6f8558800..094eae8d9 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 cfe19abc3..b1167dc90 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;
}