Paul Mundt
No binary (build failed)
—
(log yok)
| @@ -2620,9 +2620,11 @@ | |
| "Mon Dec 17 10:31:44 GMT 2000" | |
| #define watchdog_trivial_usage \ | |
| - | "DEV" |
| + | "[-t <seconds>] DEV" |
| #define watchdog_full_usage \ | |
| - | "Periodically write to watchdog device DEV" |
| + | "Periodically write to watchdog device DEV.\n" \ |
| + | "Options:\n" \ |
| + | "\t-t\tTimer period in seconds - default is 30." |
| #define wc_trivial_usage \ | |
| "[OPTION]... [FILE]..." | |
| @@ -2,7 +2,7 @@ | |
| /* | |
| * Mini watchdog implementation for busybox | |
| * | |
| - | * Copyright (C) 2000 spoon <[email protected]>. |
| + | * Copyright (C) 2003 Paul Mundt <[email protected]> |
| * | |
| * This program is free software; you can redistribute it and/or modify | |
| * it under the terms of the GNU General Public License as published by | |
| @@ -20,30 +20,62 @@ | |
| * | |
| */ | |
| - | /* getopt not needed */ |
| - | |
| #include <stdio.h> | |
| #include <fcntl.h> | |
| #include <unistd.h> | |
| #include <stdlib.h> | |
| + | #include <signal.h> |
| #include "busybox.h" | |
| + | /* Userspace timer duration, in seconds */ |
| + | static unsigned int timer_duration = 30; |
| + | |
| + | /* Watchdog file descriptor */ |
| + | static int fd; |
| + | |
| + | static void watchdog_shutdown(int unused) |
| + | { |
| + | write(fd, "V", 1); /* Magic */ |
| + | close(fd); |
| + | exit(0); |
| + | } |
| + | |
| extern int watchdog_main(int argc, char **argv) | |
| { | |
| - | int fd; |
| + | int opt; |
| - | if (argc != 2) { |
| - | bb_show_usage(); |
| + | while ((opt = getopt(argc, argv, "t:")) > 0) { |
| + | switch (opt) { |
| + | case 't': |
| + | timer_duration = bb_xgetlarg(optarg, 10, 0, INT_MAX); |
| + | break; |
| + | default: |
| + | bb_show_usage(); |
| + | } |
| } | |
| - | if ((fd=open(argv[1], O_WRONLY)) == -1) { |
| - | bb_perror_msg_and_die(argv[1]); |
| - | } |
| + | /* We're only interested in the watchdog device .. */ |
| + | if (optind < argc - 1 || argc == 1) |
| + | bb_show_usage(); |
| + | |
| + | if (daemon(0, 1) < 0) |
| + | bb_perror_msg_and_die("Failed forking watchdog daemon"); |
| + | |
| + | signal(SIGHUP, watchdog_shutdown); |
| + | signal(SIGINT, watchdog_shutdown); |
| + | |
| + | fd = bb_xopen(argv[argc - 1], O_WRONLY); |
| while (1) { | |
| - | sleep(30); |
| + | /* |
| + | * Make sure we clear the counter before sleeping, as the counter value |
| + | * is undefined at this point -- PFM |
| + | */ |
| write(fd, "\0", 1); | |
| + | sleep(timer_duration); |
| } | |
| - | return EXIT_FAILURE; |
| + | watchdog_shutdown(0); |
| + | |
| + | return EXIT_SUCCESS; |
| } | |