From 6f841e89dfe9200a6f3a2f93a9dd83f66f8ef550 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Rafa=C5=82=20Mi=C5=82ecki?= Date: Mon, 6 Jul 2015 23:37:11 +0200 Subject: [PATCH] service: if logging start app with LD_PRELOAD & lib for line buffering MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Using pipe automatically switches service to block buffering which kind of breaks our logging. We won't get anything from stdout FD until the buffer gets filled fully or the service exits. This makes log messages appear with an unwanted delay. This change adds a tiny libsetlbf.so switching stdout to line buffering and uses this lib for every logging-enabled service started by procd. We don't need any extra change for stderr as it's unbuffered by default. Signed-off-by: Rafał Miłecki Modified to use no buffering to align with stderr. Several cleanups. Signed-off-by: Steven Barth --- CMakeLists.txt | 7 +++++++ service/instance.c | 15 ++++++++++++--- service/setlbf.c | 6 ++++++ 3 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 service/setlbf.c diff --git a/CMakeLists.txt b/CMakeLists.txt index dfa9413..6af17a3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,6 +10,13 @@ IF(APPLE) LINK_DIRECTORIES(/opt/local/lib) ENDIF() + +ADD_LIBRARY(setlbf SHARED service/setlbf.c) +INSTALL(TARGETS setlbf + LIBRARY DESTINATION lib +) + + SET(SOURCES procd.c signal.c watchdog.c state.c inittab.c rcS.c ubus.c system.c service/service.c service/instance.c service/validate.c service/trigger.c service/watch.c plug/coldplug.c plug/hotplug.c utils/utils.c) diff --git a/service/instance.c b/service/instance.c index 35b2def..40ff021 100644 --- a/service/instance.c +++ b/service/instance.c @@ -12,6 +12,7 @@ * GNU General Public License for more details. */ +#define _GNU_SOURCE #include #include #include @@ -19,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -224,8 +226,11 @@ instance_run(struct service_instance *in, int _stdout, int _stderr) struct blobmsg_list_node *var; struct blob_attr *cur; char **argv; + char *ld_preload; int argc = 1; /* NULL terminated */ int rem, _stdin; + bool seccomp = !in->trace && !in->has_jail && in->seccomp; + bool setlbf = _stdout >= 0; if (in->nice) setpriority(PRIO_PROCESS, 0, in->nice); @@ -236,10 +241,14 @@ instance_run(struct service_instance *in, int _stdout, int _stderr) blobmsg_list_for_each(&in->env, var) setenv(blobmsg_name(var->data), blobmsg_data(var->data), 1); - if (!in->trace && !in->has_jail && in->seccomp) { + if (seccomp) setenv("SECCOMP_FILE", in->seccomp, 1); - setenv("LD_PRELOAD", "/lib/libpreload-seccomp.so", 1); - } + + if ((seccomp || setlbf) && asprintf(&ld_preload, "LD_PRELOAD=%s%s%s", + seccomp ? "/lib/libpreload-seccomp.so" : "", + seccomp && setlbf ? ":" : "", + setlbf ? "/lib/libsetlbf.so" : "") > 0) + putenv(ld_preload); blobmsg_list_for_each(&in->limits, var) instance_limits(blobmsg_name(var->data), blobmsg_data(var->data)); diff --git a/service/setlbf.c b/service/setlbf.c new file mode 100644 index 0000000..94c251e --- /dev/null +++ b/service/setlbf.c @@ -0,0 +1,6 @@ +#include + +static void __attribute__((constructor)) setlbf(void) +{ + setbuf(stdout, NULL); +} -- 2.11.0