diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-09-07 23:22:08 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-09-07 23:22:08 +0000 |
commit | 8d89bed8401bfbca9c5ef18f201439b3502e733b (patch) | |
tree | b5db7bd373d32b4891610cd2c58f6307d4808447 /miscutils | |
parent | ee9deb863e089e1b607cc5771123257c3223bea0 (diff) | |
download | busybox-w32-8d89bed8401bfbca9c5ef18f201439b3502e733b.tar.gz busybox-w32-8d89bed8401bfbca9c5ef18f201439b3502e733b.tar.bz2 busybox-w32-8d89bed8401bfbca9c5ef18f201439b3502e733b.zip |
watchdog: add -T option
function old new delta
watchdog_main 159 219 +60
mdev: support match by major,minor. See bug 4714.
+100 bytes.
Diffstat (limited to 'miscutils')
-rw-r--r-- | miscutils/watchdog.c | 59 |
1 files changed, 33 insertions, 26 deletions
diff --git a/miscutils/watchdog.c b/miscutils/watchdog.c index 9b1a110ea..e102a598a 100644 --- a/miscutils/watchdog.c +++ b/miscutils/watchdog.c | |||
@@ -4,14 +4,17 @@ | |||
4 | * | 4 | * |
5 | * Copyright (C) 2003 Paul Mundt <lethal@linux-sh.org> | 5 | * Copyright (C) 2003 Paul Mundt <lethal@linux-sh.org> |
6 | * Copyright (C) 2006 Bernhard Fischer <busybox@busybox.net> | 6 | * Copyright (C) 2006 Bernhard Fischer <busybox@busybox.net> |
7 | * Copyright (C) 2008 Darius Augulis <augulis.darius@gmail.com> | ||
7 | * | 8 | * |
8 | * Licensed under the GPL v2 or later, see the file LICENSE in this tarball. | 9 | * Licensed under the GPL v2 or later, see the file LICENSE in this tarball. |
9 | */ | 10 | */ |
10 | 11 | ||
11 | #include "libbb.h" | 12 | #include "libbb.h" |
13 | #include "linux/watchdog.h" | ||
12 | 14 | ||
13 | #define OPT_FOREGROUND 0x01 | 15 | #define OPT_FOREGROUND (1 << 0) |
14 | #define OPT_TIMER 0x02 | 16 | #define OPT_STIMER (1 << 1) |
17 | #define OPT_HTIMER (1 << 2) | ||
15 | 18 | ||
16 | static void watchdog_shutdown(int sig UNUSED_PARAM) | 19 | static void watchdog_shutdown(int sig UNUSED_PARAM) |
17 | { | 20 | { |
@@ -26,38 +29,42 @@ static void watchdog_shutdown(int sig UNUSED_PARAM) | |||
26 | int watchdog_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 29 | int watchdog_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
27 | int watchdog_main(int argc, char **argv) | 30 | int watchdog_main(int argc, char **argv) |
28 | { | 31 | { |
29 | unsigned opts; | 32 | static const struct suffix_mult suffixes[] = { |
30 | unsigned timer_duration = 30000; /* Userspace timer duration, in milliseconds */ | 33 | { "ms", 1 }, |
31 | char *t_arg; | 34 | { "", 1000 }, |
35 | { } | ||
36 | }; | ||
32 | 37 | ||
33 | opt_complementary = "=1"; /* must have 1 argument */ | 38 | unsigned opts; |
34 | opts = getopt32(argv, "Ft:", &t_arg); | 39 | unsigned stimer_duration; /* how often to restart */ |
40 | unsigned htimer_duration = 60000; /* reboots after N ms if not restarted */ | ||
41 | char *st_arg; | ||
42 | char *ht_arg; | ||
35 | 43 | ||
36 | if (opts & OPT_TIMER) { | 44 | opt_complementary = "=1"; /* must have exactly 1 argument */ |
37 | static const struct suffix_mult suffixes[] = { | 45 | opts = getopt32(argv, "Ft:T:", &st_arg, &ht_arg); |
38 | { "ms", 1 }, | ||
39 | { "", 1000 }, | ||
40 | { } | ||
41 | }; | ||
42 | timer_duration = xatou_sfx(t_arg, suffixes); | ||
43 | } | ||
44 | 46 | ||
45 | if (!(opts & OPT_FOREGROUND)) { | 47 | if (opts & OPT_HTIMER) |
46 | bb_daemonize_or_rexec(DAEMON_CHDIR_ROOT, argv); | 48 | htimer_duration = xatou_sfx(ht_arg, suffixes); |
47 | } | 49 | stimer_duration = htimer_duration / 2; |
50 | if (opts & OPT_STIMER) | ||
51 | stimer_duration = xatou_sfx(st_arg, suffixes); | ||
48 | 52 | ||
49 | bb_signals(BB_FATAL_SIGS, watchdog_shutdown); | 53 | bb_signals(BB_FATAL_SIGS, watchdog_shutdown); |
50 | 54 | ||
51 | /* Use known fd # - avoid needing global 'int fd' */ | 55 | /* Use known fd # - avoid needing global 'int fd' */ |
52 | xmove_fd(xopen(argv[argc - 1], O_WRONLY), 3); | 56 | xmove_fd(xopen(argv[argc - 1], O_WRONLY), 3); |
53 | 57 | ||
54 | // TODO? | 58 | ioctl_or_warn(3, WDIOC_SETTIMEOUT, &htimer_duration); |
55 | // if (!(opts & OPT_TIMER)) { | 59 | #if 0 |
56 | // if (ioctl(fd, WDIOC_GETTIMEOUT, &timer_duration) == 0) | 60 | ioctl_or_warn(3, WDIOC_GETTIMEOUT, &htimer_duration); |
57 | // timer_duration *= 500; | 61 | printf("watchdog: SW timer is %dms, HW timer is %dms\n", |
58 | // else | 62 | stimer_duration, htimer_duration * 1000); |
59 | // timer_duration = 30000; | 63 | #endif |
60 | // } | 64 | |
65 | if (!(opts & OPT_FOREGROUND)) { | ||
66 | bb_daemonize_or_rexec(DAEMON_CHDIR_ROOT, argv); | ||
67 | } | ||
61 | 68 | ||
62 | while (1) { | 69 | while (1) { |
63 | /* | 70 | /* |
@@ -65,7 +72,7 @@ int watchdog_main(int argc, char **argv) | |||
65 | * is undefined at this point -- PFM | 72 | * is undefined at this point -- PFM |
66 | */ | 73 | */ |
67 | write(3, "", 1); /* write zero byte */ | 74 | write(3, "", 1); /* write zero byte */ |
68 | usleep(timer_duration * 1000L); | 75 | usleep(stimer_duration * 1000L); |
69 | } | 76 | } |
70 | return EXIT_SUCCESS; /* - not reached, but gcc 4.2.1 is too dumb! */ | 77 | return EXIT_SUCCESS; /* - not reached, but gcc 4.2.1 is too dumb! */ |
71 | } | 78 | } |