aboutsummaryrefslogtreecommitdiff
path: root/miscutils/watchdog.c
diff options
context:
space:
mode:
authorandersen <andersen@69ca8d6d-28ef-0310-b511-8ec308f3f277>2003-07-22 07:39:18 +0000
committerandersen <andersen@69ca8d6d-28ef-0310-b511-8ec308f3f277>2003-07-22 07:39:18 +0000
commit89595bd42fb99bc4da9d1b01941a5fadd2c3d300 (patch)
tree819a67150ee269aa34b58b8189f190e8ab5a8cb5 /miscutils/watchdog.c
parentebef0e42b05ce0f2f00d654a553c0d8273bd6fbd (diff)
downloadbusybox-w32-89595bd42fb99bc4da9d1b01941a5fadd2c3d300.tar.gz
busybox-w32-89595bd42fb99bc4da9d1b01941a5fadd2c3d300.tar.bz2
busybox-w32-89595bd42fb99bc4da9d1b01941a5fadd2c3d300.zip
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. git-svn-id: svn://busybox.net/trunk/busybox@7083 69ca8d6d-28ef-0310-b511-8ec308f3f277
Diffstat (limited to 'miscutils/watchdog.c')
-rw-r--r--miscutils/watchdog.c54
1 files changed, 43 insertions, 11 deletions
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 @@
2/* 2/*
3 * Mini watchdog implementation for busybox 3 * Mini watchdog implementation for busybox
4 * 4 *
5 * Copyright (C) 2000 spoon <spoon@ix.netcom.com>. 5 * Copyright (C) 2003 Paul Mundt <lethal@linux-sh.org>
6 * 6 *
7 * This program is free software; you can redistribute it and/or modify 7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by 8 * it under the terms of the GNU General Public License as published by
@@ -20,30 +20,62 @@
20 * 20 *
21 */ 21 */
22 22
23/* getopt not needed */
24
25#include <stdio.h> 23#include <stdio.h>
26#include <fcntl.h> 24#include <fcntl.h>
27#include <unistd.h> 25#include <unistd.h>
28#include <stdlib.h> 26#include <stdlib.h>
27#include <signal.h>
29#include "busybox.h" 28#include "busybox.h"
30 29
30/* Userspace timer duration, in seconds */
31static unsigned int timer_duration = 30;
32
33/* Watchdog file descriptor */
34static int fd;
35
36static void watchdog_shutdown(int unused)
37{
38 write(fd, "V", 1); /* Magic */
39 close(fd);
40 exit(0);
41}
42
31extern int watchdog_main(int argc, char **argv) 43extern int watchdog_main(int argc, char **argv)
32{ 44{
33 int fd; 45 int opt;
34 46
35 if (argc != 2) { 47 while ((opt = getopt(argc, argv, "t:")) > 0) {
36 bb_show_usage(); 48 switch (opt) {
49 case 't':
50 timer_duration = bb_xgetlarg(optarg, 10, 0, INT_MAX);
51 break;
52 default:
53 bb_show_usage();
54 }
37 } 55 }
38 56
39 if ((fd=open(argv[1], O_WRONLY)) == -1) { 57 /* We're only interested in the watchdog device .. */
40 bb_perror_msg_and_die(argv[1]); 58 if (optind < argc - 1 || argc == 1)
41 } 59 bb_show_usage();
60
61 if (daemon(0, 1) < 0)
62 bb_perror_msg_and_die("Failed forking watchdog daemon");
63
64 signal(SIGHUP, watchdog_shutdown);
65 signal(SIGINT, watchdog_shutdown);
66
67 fd = bb_xopen(argv[argc - 1], O_WRONLY);
42 68
43 while (1) { 69 while (1) {
44 sleep(30); 70 /*
71 * Make sure we clear the counter before sleeping, as the counter value
72 * is undefined at this point -- PFM
73 */
45 write(fd, "\0", 1); 74 write(fd, "\0", 1);
75 sleep(timer_duration);
46 } 76 }
47 77
48 return EXIT_FAILURE; 78 watchdog_shutdown(0);
79
80 return EXIT_SUCCESS;
49} 81}