# include <mqueue.h>
#endif
+#include "util.h"
#include "sd-daemon.h"
#if (__GNUC__ >= 4)
goto finish;
}
- memset(&sockaddr, 0, sizeof(sockaddr));
+ memzero(&sockaddr, sizeof(sockaddr));
sockaddr.sa.sa_family = AF_UNIX;
strncpy(sockaddr.un.sun_path, e, sizeof(sockaddr.un.sun_path));
if (sockaddr.un.sun_path[0] == '@')
sockaddr.un.sun_path[0] = 0;
- memset(&iovec, 0, sizeof(iovec));
+ memzero(&iovec, sizeof(iovec));
iovec.iov_base = (char*) state;
iovec.iov_len = strlen(state);
- memset(&msghdr, 0, sizeof(msghdr));
+ memzero(&msghdr, sizeof(msghdr));
msghdr.msg_name = &sockaddr;
msghdr.msg_namelen = offsetof(struct sockaddr_un, sun_path) + strlen(e);
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
+}