[BusyBox-cvs] busybox/miscutils watchdog.c,1.6,1.7

Erik Andersen andersen at busybox.net
Tue Jul 22 07:39:21 UTC 2003


Update of /var/cvs/busybox/miscutils
In directory winder:/tmp/cvs-serv28226/miscutils

Modified Files:
	watchdog.c 
Log Message:
Paul Mundt <lethal at 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.



Index: watchdog.c
===================================================================
RCS file: /var/cvs/busybox/miscutils/watchdog.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- watchdog.c	19 Mar 2003 09:12:29 -0000	1.6
+++ watchdog.c	22 Jul 2003 07:39:17 -0000	1.7
@@ -2,7 +2,7 @@
 /*
  * Mini watchdog implementation for busybox
  *
- * Copyright (C) 2000  spoon <spoon at ix.netcom.com>.
+ * Copyright (C) 2003  Paul Mundt <lethal at 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;
 }




More information about the busybox-cvs mailing list