diff options
-rw-r--r-- | include/usage.h | 6 | ||||
-rw-r--r-- | miscutils/watchdog.c | 54 |
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 */ | ||
31 | static unsigned int timer_duration = 30; | ||
32 | |||
33 | /* Watchdog file descriptor */ | ||
34 | static int fd; | ||
35 | |||
36 | static void watchdog_shutdown(int unused) | ||
37 | { | ||
38 | write(fd, "V", 1); /* Magic */ | ||
39 | close(fd); | ||
40 | exit(0); | ||
41 | } | ||
42 | |||
31 | extern int watchdog_main(int argc, char **argv) | 43 | extern 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 | } |