@@ -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)
@@ -224,6 +224,8 @@ instance_run(struct service_instance *in, int _stdout, int _stderr)
struct blobmsg_list_node *var;
struct blob_attr *cur;
char **argv;
+ char ld_preload[64] = {}; /* Has to be big enough for all cases */
+ size_t ld_preload_space = sizeof(ld_preload) - 1;
int argc = 1; /* NULL terminated */
int rem, _stdin;
@@ -238,8 +240,23 @@ instance_run(struct service_instance *in, int _stdout, int _stderr)
if (!in->trace && !in->has_jail && in->seccomp) {
setenv("SECCOMP_FILE", in->seccomp, 1);
- setenv("LD_PRELOAD", "/lib/libpreload-seccomp.so", 1);
+ if (ld_preload[0] && ld_preload_space > 0) {
+ strcat(ld_preload, ":");
+ ld_preload_space--;
+ }
+ strncat(ld_preload, "/lib/libpreload-seccomp.so", ld_preload_space);
+ ld_preload_space = sizeof(ld_preload) - strlen(ld_preload) - 1;
+ }
+ if (_stdout >= 0) {
+ if (ld_preload[0] && ld_preload_space > 0) {
+ strcat(ld_preload, ":");
+ ld_preload_space--;
+ }
+ strncat(ld_preload, "/lib/libsetlbf.so", ld_preload_space);
+ ld_preload_space = sizeof(ld_preload) - strlen(ld_preload) - 1;
}
+ if (ld_preload[0])
+ setenv("LD_PRELOAD", ld_preload, 1);
blobmsg_list_for_each(&in->limits, var)
instance_limits(blobmsg_name(var->data), blobmsg_data(var->data));
new file mode 100644
@@ -0,0 +1,6 @@
+#include <stdio.h>
+
+static void __attribute__((constructor)) setlbf(void)
+{
+ setlinebuf(stdout);
+}
Using pipe automatically switches service to block buffering which kind of breaks our logging. We won't get anything from FD until the buffer gets filled fully or the service exits. This makes log messages appear with an unwanted delay. This adds a tiny libsetlbf.so that switches stdout to line buffering and uses this lib for every logging-enabled service started by procd. Signed-off-by: Rafał Miłecki <zajec5@gmail.com> --- V2: Use strncat for safety Use line buffering instead of no buffering --- CMakeLists.txt | 7 +++++++ service/instance.c | 19 ++++++++++++++++++- service/setlbf.c | 6 ++++++ 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 service/setlbf.c