-
Notifications
You must be signed in to change notification settings - Fork 0
/
sd_watchdog_enabled.c
63 lines (55 loc) · 1.14 KB
/
sd_watchdog_enabled.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <errno.h>
#include <limits.h>
#include <stdlib.h>
#include <unistd.h>
#include "systemd/sd-daemon.h"
#define WATCHDOG_PID "WATCHDOG_PID"
#define WATCHDOG_USEC "WATCHDOG_USEC"
#ifdef UINT64_MAX
int sd_watchdog_enabled(int unset, uint64_t *usec) {
const char *value;
unsigned long long tmp;
char *end;
int r;
if (*usec)
*usec = UINT64_MAX;
/* WATCHDOG_PID is optional, unlike LISTEN_PID, because systemd. */
if ((value = getenv(WATCHDOG_PID))) {
long pid;
if (!*value) {
r = -EINVAL; goto bail;
}
errno = 0;
pid = strtol(value, &end, 0);
if (*end || ((pid == LONG_MIN || pid == LONG_MAX) && errno == ERANGE)) {
r = -errno; goto bail;
}
if (pid != getpid()) {
r = 0; goto bail;
}
}
if (!(value = getenv(WATCHDOG_USEC))) {
r = 0; goto bail;
}
if (!*value) {
r = -EINVAL; goto bail;
}
errno = 0;
tmp = strtoull(value, &end, 0);
if (*end || (tmp == ULLONG_MAX && errno == ERANGE)) {
r = -errno; goto bail;
}
if (!tmp || tmp >= UINT64_MAX) {
r = -ERANGE; goto bail;
}
if (*usec)
*usec = tmp;
r = 1;
bail:
if (unset) {
unsetenv(WATCHDOG_PID);
unsetenv(WATCHDOG_USEC);
}
return r;
}
#endif