diff options
Diffstat (limited to 'src/libsystemd-daemon')
-rw-r--r-- | src/libsystemd-daemon/libsystemd-daemon.sym | 5 | ||||
-rw-r--r-- | src/libsystemd-daemon/sd-daemon.c | 66 |
2 files changed, 71 insertions, 0 deletions
diff --git a/src/libsystemd-daemon/libsystemd-daemon.sym b/src/libsystemd-daemon/libsystemd-daemon.sym index f440238931..aa9be51c6a 100644 --- a/src/libsystemd-daemon/libsystemd-daemon.sym +++ b/src/libsystemd-daemon/libsystemd-daemon.sym @@ -25,3 +25,8 @@ global: local: *; }; + +LIBSYSTEMD_DAEMON_209 { +global: + sd_watchdog_enabled; +} LIBSYSTEMD_DAEMON_31; diff --git a/src/libsystemd-daemon/sd-daemon.c b/src/libsystemd-daemon/sd-daemon.c index 485b301023..94230c9ed6 100644 --- a/src/libsystemd-daemon/sd-daemon.c +++ b/src/libsystemd-daemon/sd-daemon.c @@ -518,3 +518,69 @@ _sd_export_ int sd_booted(void) { return !!S_ISDIR(st.st_mode); #endif } + +_sd_export_ int sd_watchdog_enabled(int unset_environment, uint64_t *usec) { + +#if defined(DISABLE_SYSTEMD) || !defined(__linux__) + return 0; +#else + unsigned long long ll; + unsigned long l; + const char *e; + char *p = NULL; + int r; + + e = getenv("WATCHDOG_PID"); + if (!e) { + r = 0; + goto finish; + } + + errno = 0; + l = strtoul(e, &p, 10); + if (errno > 0) { + r = -errno; + goto finish; + } + if (!p || p == e || *p || l <= 0) { + r = -EINVAL; + goto finish; + } + + /* Is this for us? */ + if (getpid() != (pid_t) l) { + r = 0; + goto finish; + } + + e = getenv("WATCHDOG_USEC"); + if (!e) { + r = -EINVAL; + goto finish; + } + + errno = 0; + ll = strtoull(e, &p, 10); + if (errno > 0) { + r = -errno; + goto finish; + } + if (!p || p == e || *p || l <= 0) { + r = -EINVAL; + goto finish; + } + + if (usec) + *usec = ll; + + r = 1; + +finish: + if (unset_environment) { + unsetenv("WATCHDOG_PID"); + unsetenv("WATCHDOG_USEC"); + } + + return r; +#endif +} |