| From 9d1f2858cd2ba49066ca319164b4e3e2769fc0fb Mon Sep 17 00:00:00 2001 |
| From: "Edward A. James" <eajames@us.ibm.com> |
| Date: Fri, 8 Dec 2017 11:26:30 -0600 |
| Subject: [PATCH 1/3] watchdog: allow a device path to be specified |
| |
| Currently systemd hardcodes the use of /dev/watchdog. This is a legacy |
| chardev that points to watchdog0 in the system. |
| |
| Modify the watchdog API to allow a different device path to be passed |
| and stored. Opening the watchdog defaults to /dev/watchdog, maintaining |
| existing behavior. |
| --- |
| src/shared/watchdog.c | 9 ++++++++- |
| src/shared/watchdog.h | 5 +++++ |
| 2 files changed, 13 insertions(+), 1 deletion(-) |
| |
| diff --git a/src/shared/watchdog.c b/src/shared/watchdog.c |
| index 4f3e012..8068e95 100644 |
| --- a/src/shared/watchdog.c |
| +++ b/src/shared/watchdog.c |
| @@ -26,10 +26,12 @@ |
| |
| #include "fd-util.h" |
| #include "log.h" |
| +#include "string-util.h" |
| #include "time-util.h" |
| #include "watchdog.h" |
| |
| static int watchdog_fd = -1; |
| +static char *watchdog_device = NULL; |
| static usec_t watchdog_timeout = USEC_INFINITY; |
| |
| static int update_timeout(void) { |
| @@ -83,7 +85,8 @@ static int open_watchdog(void) { |
| if (watchdog_fd >= 0) |
| return 0; |
| |
| - watchdog_fd = open("/dev/watchdog", O_WRONLY|O_CLOEXEC); |
| + watchdog_fd = open(watchdog_device ?: "/dev/watchdog", |
| + O_WRONLY|O_CLOEXEC); |
| if (watchdog_fd < 0) |
| return -errno; |
| |
| @@ -95,6 +98,10 @@ static int open_watchdog(void) { |
| return update_timeout(); |
| } |
| |
| +int watchdog_set_device(char *path) { |
| + return free_and_strdup(&watchdog_device, path); |
| +} |
| + |
| int watchdog_set_timeout(usec_t *usec) { |
| int r; |
| |
| diff --git a/src/shared/watchdog.h b/src/shared/watchdog.h |
| index f6ec178..90a075a 100644 |
| --- a/src/shared/watchdog.h |
| +++ b/src/shared/watchdog.h |
| @@ -24,6 +24,11 @@ |
| #include "time-util.h" |
| #include "util.h" |
| |
| +int watchdog_set_device(char *path); |
| int watchdog_set_timeout(usec_t *usec); |
| int watchdog_ping(void); |
| void watchdog_close(bool disarm); |
| + |
| +static inline void watchdog_free_device(void) { |
| + (void) watchdog_set_device(NULL); |
| +} |
| -- |
| 1.8.3.1 |
| |