From 4dfc092a7176f74102b6be205f11008e1de59bb3 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 22 Sep 2011 03:29:51 +0200 Subject: [PATCH] service: if StandardInput=socket and StandardOutput=inherit imply socket for output, don't imply default output This is useful for inetd-style per-connection services, so that they again can simply specify StandardOutput=socket to connect all three fds to the socket. --- TODO | 4 ---- src/service.c | 29 ++++++++++++++++++++++++----- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/TODO b/TODO index 2f6358c5a..d05e3e055 100644 --- a/TODO +++ b/TODO @@ -21,8 +21,6 @@ Features: * https://bugzilla.redhat.com/show_bug.cgi?id=727068 -* for socket units don't inherit global stdout setting. - * internal restart counter for units (focus on auto-respawn) * finer-grained auto-respawn settings (rate-limit) @@ -102,8 +100,6 @@ Features: * GC unreferenced jobs (such as .device jobs) -* avoid DefaultStandardOutput=syslog to have any effect on StandardInput=socket services - * cgroup_notify_empty(): recursively check groups up the tree, too * when failing to start a service due to ratelimiting, try again later, if restart=always is set diff --git a/src/service.c b/src/service.c index 5050bcafa..a40e01b88 100644 --- a/src/service.c +++ b/src/service.c @@ -121,8 +121,6 @@ static void service_init(Unit *u) { s->guess_main_pid = true; exec_context_init(&s->exec_context); - s->exec_context.std_output = u->meta.manager->default_std_output; - s->exec_context.std_error = u->meta.manager->default_std_error; RATELIMIT_INIT(s->ratelimit, 10*USEC_PER_SEC, 5); @@ -832,9 +830,10 @@ static int service_load_sysv_path(Service *s, const char *path) { s->type = SERVICE_FORKING; s->remain_after_exit = !s->pid_file; s->restart = SERVICE_RESTART_NO; - s->exec_context.std_output = - (s->meta.manager->sysv_console || s->exec_context.std_input == EXEC_INPUT_TTY) - ? EXEC_OUTPUT_TTY : s->meta.manager->default_std_output; + + if (s->meta.manager->sysv_console) + s->exec_context.std_output = EXEC_OUTPUT_TTY; + s->exec_context.kill_mode = KILL_PROCESS; /* We use the long description only if @@ -1100,6 +1099,24 @@ static int service_add_default_dependencies(Service *s) { return unit_add_two_dependencies_by_name(UNIT(s), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_SHUTDOWN_TARGET, NULL, true); } +static void service_fix_output(Service *s) { + assert(s); + + /* If nothing has been explicitly configured, patch default + * output in. If input is socket/tty we avoid this however, + * since in that case we want output to default to the same + * place as we read input from. */ + + if (s->exec_context.std_error == EXEC_OUTPUT_INHERIT && + s->exec_context.std_output == EXEC_OUTPUT_INHERIT && + s->exec_context.std_input == EXEC_INPUT_NULL) + s->exec_context.std_error = s->meta.manager->default_std_error; + + if (s->exec_context.std_output == EXEC_OUTPUT_INHERIT && + s->exec_context.std_input == EXEC_INPUT_NULL) + s->exec_context.std_output = s->meta.manager->default_std_output; +} + static int service_load(Unit *u) { int r; Service *s = SERVICE(u); @@ -1156,6 +1173,8 @@ static int service_load(Unit *u) { if (s->meta.default_dependencies) if ((r = service_add_default_dependencies(s)) < 0) return r; + + service_fix_output(s); } return service_verify(s); -- 2.30.2