summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2010-07-07 04:37:42 +0200
committerLennart Poettering <lennart@poettering.net>2010-07-07 04:37:42 +0200
commitacb591e4523af82be3d76fde342e91c90a4bed38 (patch)
tree1e6306d013be64b2c20a3be98454ab10710a3796 /src
parentecdbca40bd985f269cd77fc122a648630f330c28 (diff)
execute: change stdout inherit logic, when run as PID 1 use /dev/null
Diffstat (limited to 'src')
-rw-r--r--src/execute.c14
-rw-r--r--src/service.c1
2 files changed, 8 insertions, 7 deletions
diff --git a/src/execute.c b/src/execute.c
index 2acb11192d..d7239d5440 100644
--- a/src/execute.c
+++ b/src/execute.c
@@ -305,16 +305,16 @@ static int setup_output(const ExecContext *context, int socket_fd, const char *i
case EXEC_OUTPUT_INHERIT:
- /* If the input is connected to a terminal, inherit that... */
+ /* If the input is connected to anything that's not a /dev/null, inherit that... */
if (i != EXEC_INPUT_NULL)
return dup2(STDIN_FILENO, STDOUT_FILENO) < 0 ? -errno : STDOUT_FILENO;
- /* For PID 1 stdout is always connected to /dev/null,
- * hence reopen the console if out parent is PID1. */
- if (getppid() == 1)
- return open_terminal_as(tty_path(context), O_WRONLY, STDOUT_FILENO);
+ /* If we are not started from PID 1 we just inherit STDOUT from our parent process. */
+ if (getppid() != 1)
+ return STDOUT_FILENO;
- return STDOUT_FILENO;
+ /* We need to open /dev/null here anew, to get the
+ * right access mode. So we fall through */
case EXEC_OUTPUT_NULL:
return open_null_as(O_WRONLY, STDOUT_FILENO);
@@ -356,7 +356,7 @@ static int setup_error(const ExecContext *context, int socket_fd, const char *id
* the way and are not on a tty */
if (e == EXEC_OUTPUT_INHERIT &&
o == EXEC_OUTPUT_INHERIT &&
- i != EXEC_INPUT_NULL &&
+ i == EXEC_INPUT_NULL &&
getppid () != 1)
return STDERR_FILENO;
diff --git a/src/service.c b/src/service.c
index ecfd054105..9086590cbb 100644
--- a/src/service.c
+++ b/src/service.c
@@ -686,6 +686,7 @@ static int service_load_sysv_path(Service *s, const char *path) {
s->valid_no_process = true;
s->kill_mode = KILL_PROCESS_GROUP;
s->restart = SERVICE_ONCE;
+ s->exec_context.std_output = EXEC_OUTPUT_TTY;
u->meta.load_state = UNIT_LOADED;
r = 0;