diff options
Diffstat (limited to 'miscutils')
| -rw-r--r-- | miscutils/watchdog.c | 54 |
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 */ | ||
| 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 | } |
