aboutsummaryrefslogtreecommitdiff
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 6f8558800..094eae8d9 100644
--- a/include/usage.h
+++ b/include/usage.h
@@ -2620,9 +2620,11 @@
2620 "Mon Dec 17 10:31:44 GMT 2000" 2620 "Mon Dec 17 10:31:44 GMT 2000"
2621 2621
2622#define watchdog_trivial_usage \ 2622#define watchdog_trivial_usage \
2623 "DEV" 2623 "[-t <seconds>] DEV"
2624#define watchdog_full_usage \ 2624#define watchdog_full_usage \
2625 "Periodically write to watchdog device DEV" 2625 "Periodically write to watchdog device DEV.\n" \
2626 "Options:\n" \
2627 "\t-t\tTimer period in seconds - default is 30."
2626 2628
2627#define wc_trivial_usage \ 2629#define wc_trivial_usage \
2628 "[OPTION]... [FILE]..." 2630 "[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 @@
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}