[OpenWrt-Devel] [PATCH procd] service: start apps with LD_PRELOAD & lib disabling buffering

John Crispin blogic at openwrt.org
Sat Jun 20 03:07:48 EDT 2015


i dont like this idea at all. calling ld-preload on every started app
just seems wrong


On 20/06/2015 01:03, Rafał Miłecki wrote:
> 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 libsetnbf.so that disables stdout buffering and uses it
> for every service started by procd.
> 
> Signed-off-by: Rafał Miłecki <zajec5 at gmail.com>
> ---
>  CMakeLists.txt     |  7 +++++++
>  service/instance.c | 12 +++++++++++-
>  service/setnbf.c   |  6 ++++++
>  3 files changed, 24 insertions(+), 1 deletion(-)
>  create mode 100644 service/setnbf.c
> 
> diff --git a/CMakeLists.txt b/CMakeLists.txt
> index dfa9413..c3b7c1e 100644
> --- a/CMakeLists.txt
> +++ b/CMakeLists.txt
> @@ -10,6 +10,13 @@ IF(APPLE)
>    LINK_DIRECTORIES(/opt/local/lib)
>  ENDIF()
>  
> +
> +ADD_LIBRARY(setnbf SHARED service/setnbf.c)
> +INSTALL(TARGETS setnbf
> +	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..726f859 100644
> --- a/service/instance.c
> +++ b/service/instance.c
> @@ -224,6 +224,7 @@ 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 */
>  	int argc = 1; /* NULL terminated */
>  	int rem, _stdin;
>  
> @@ -238,8 +239,17 @@ 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])
> +			strcat(ld_preload, ":");
> +		strcat(ld_preload, "/lib/libpreload-seccomp.so");
>  	}
> +	if (_stdout >= 0) {
> +		if (ld_preload[0])
> +			strcat(ld_preload, ":");
> +		strcat(ld_preload, "/lib/libsetnbf.so");
> +	}
> +	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));
> diff --git a/service/setnbf.c b/service/setnbf.c
> new file mode 100644
> index 0000000..7b5f3bd
> --- /dev/null
> +++ b/service/setnbf.c
> @@ -0,0 +1,6 @@
> +#include <stdio.h>
> +
> +static void __attribute__((constructor)) setnbf(void)
> +{
> +	setbuf(stdout, NULL);
> +}
> 
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel


More information about the openwrt-devel mailing list