summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2013-12-22 22:14:05 +0100
committerLennart Poettering <lennart@poettering.net>2013-12-22 22:19:03 +0100
commit09812eb764b440651f3ff4cb5d37bd343f800560 (patch)
tree75a7a86e915c814ded076cd0efc84d20018ff13b /src/core
parent565a9388f261c6e459e1726e358284ff687ec941 (diff)
sd-daemon: introduce sd_watchdog_enabled() for parsing $WATCHDOG_USEC
Also, introduce a new environment variable named $WATCHDOG_PID which cotnains the PID of the process that is supposed to send the keep-alive events. This is similar how $LISTEN_FDS and $LISTEN_PID work together, and protects against confusing processes further down the process tree due to inherited environment.
Diffstat (limited to 'src/core')
-rw-r--r--src/core/execute.c18
-rw-r--r--src/core/execute.h1
-rw-r--r--src/core/mount.c1
-rw-r--r--src/core/service.c9
-rw-r--r--src/core/socket.c1
-rw-r--r--src/core/swap.c1
6 files changed, 21 insertions, 10 deletions
diff --git a/src/core/execute.c b/src/core/execute.c
index 4265717895..9b33ec0ec5 100644
--- a/src/core/execute.c
+++ b/src/core/execute.c
@@ -1020,6 +1020,7 @@ static void do_idle_pipe_dance(int idle_pipe[4]) {
static int build_environment(
ExecContext *c,
unsigned n_fds,
+ usec_t watchdog_usec,
const char *home,
const char *username,
const char *shell,
@@ -1032,7 +1033,7 @@ static int build_environment(
assert(c);
assert(ret);
- our_env = new(char*, 8);
+ our_env = new0(char*, 10);
if (!our_env)
return -ENOMEM;
@@ -1046,6 +1047,16 @@ static int build_environment(
our_env[n_env++] = x;
}
+ if (watchdog_usec > 0) {
+ if (asprintf(&x, "WATCHDOG_PID=%lu", (unsigned long) getpid()) < 0)
+ return -ENOMEM;
+ our_env[n_env++] = x;
+
+ if (asprintf(&x, "WATCHDOG_USEC=%llu", (unsigned long long) watchdog_usec) < 0)
+ return -ENOMEM;
+ our_env[n_env++] = x;
+ }
+
if (home) {
x = strappend("HOME=", home);
if (!x)
@@ -1084,7 +1095,7 @@ static int build_environment(
}
our_env[n_env++] = NULL;
- assert(n_env <= 8);
+ assert(n_env <= 10);
*ret = our_env;
our_env = NULL;
@@ -1104,6 +1115,7 @@ int exec_spawn(ExecCommand *command,
CGroupControllerMask cgroup_supported,
const char *cgroup_path,
const char *unit_id,
+ usec_t watchdog_usec,
int idle_pipe[4],
ExecRuntime *runtime,
pid_t *ret) {
@@ -1560,7 +1572,7 @@ int exec_spawn(ExecCommand *command,
}
}
- err = build_environment(context, n_fds, home, username, shell, &our_env);
+ err = build_environment(context, n_fds, watchdog_usec, home, username, shell, &our_env);
if (r < 0) {
r = EXIT_MEMORY;
goto fail_child;
diff --git a/src/core/execute.h b/src/core/execute.h
index bd3db0b633..989373f481 100644
--- a/src/core/execute.h
+++ b/src/core/execute.h
@@ -181,6 +181,7 @@ int exec_spawn(ExecCommand *command,
CGroupControllerMask cgroup_mask,
const char *cgroup_path,
const char *unit_id,
+ usec_t watchdog_usec,
int pipe_fd[2],
ExecRuntime *runtime,
pid_t *ret);
diff --git a/src/core/mount.c b/src/core/mount.c
index 2b7934e404..09efa1b6e0 100644
--- a/src/core/mount.c
+++ b/src/core/mount.c
@@ -787,6 +787,7 @@ static int mount_spawn(Mount *m, ExecCommand *c, pid_t *_pid) {
UNIT(m)->manager->cgroup_supported,
UNIT(m)->cgroup_path,
UNIT(m)->id,
+ 0,
NULL,
m->exec_runtime,
&pid);
diff --git a/src/core/service.c b/src/core/service.c
index 87eaa29378..4eb3d9e668 100644
--- a/src/core/service.c
+++ b/src/core/service.c
@@ -1750,7 +1750,7 @@ static int service_spawn(
if (r < 0)
goto fail;
- our_env = new0(char*, 5);
+ our_env = new0(char*, 4);
if (!our_env) {
r = -ENOMEM;
goto fail;
@@ -1768,12 +1768,6 @@ static int service_spawn(
goto fail;
}
- if (s->watchdog_usec > 0)
- if (asprintf(our_env + n_env++, "WATCHDOG_USEC=%llu", (unsigned long long) s->watchdog_usec) < 0) {
- r = -ENOMEM;
- goto fail;
- }
-
if (UNIT(s)->manager->running_as != SYSTEMD_SYSTEM)
if (asprintf(our_env + n_env++, "MANAGERPID=%lu", (unsigned long) getpid()) < 0) {
r = -ENOMEM;
@@ -1804,6 +1798,7 @@ static int service_spawn(
UNIT(s)->manager->cgroup_supported,
path,
UNIT(s)->id,
+ s->watchdog_usec,
s->type == SERVICE_IDLE ? UNIT(s)->manager->idle_pipe : NULL,
s->exec_runtime,
&pid);
diff --git a/src/core/socket.c b/src/core/socket.c
index 2442221355..31fc2a2526 100644
--- a/src/core/socket.c
+++ b/src/core/socket.c
@@ -1254,6 +1254,7 @@ static int socket_spawn(Socket *s, ExecCommand *c, pid_t *_pid) {
UNIT(s)->manager->cgroup_supported,
UNIT(s)->cgroup_path,
UNIT(s)->id,
+ 0,
NULL,
s->exec_runtime,
&pid);
diff --git a/src/core/swap.c b/src/core/swap.c
index 79862e5b87..e0627db965 100644
--- a/src/core/swap.c
+++ b/src/core/swap.c
@@ -645,6 +645,7 @@ static int swap_spawn(Swap *s, ExecCommand *c, pid_t *_pid) {
UNIT(s)->manager->cgroup_supported,
UNIT(s)->cgroup_path,
UNIT(s)->id,
+ 0,
NULL,
s->exec_runtime,
&pid);