[OpenWrt-Devel] [PATCH V3] service: if logging start app with LD_PRELOAD & lib for line buffering

Steven Barth cyrus at openwrt.org
Tue Jul 7 04:42:30 EDT 2015


Applied.

Am 06.07.2015 um 23:37 schrieb Rafał Miłecki:
> 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 <zajec5 at gmail.com>
> ---
> V2: Use strncat for safety
>     Use line buffering instead of no buffering
> V3: Use asprintf & putenv as suggested byu cyrus
> ---
>  CMakeLists.txt     |  7 +++++++
>  service/instance.c | 19 ++++++++++++++++++-
>  service/setlbf.c   |  6 ++++++
>  3 files changed, 31 insertions(+), 1 deletion(-)
>  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..0bd0bed 100644
> --- a/service/instance.c
> +++ b/service/instance.c
> @@ -12,6 +12,7 @@
>   * GNU General Public License for more details.
>   */
>  
> +#define _GNU_SOURCE
>  #include <sys/resource.h>
>  #include <sys/types.h>
>  #include <sys/socket.h>
> @@ -19,6 +20,7 @@
>  #include <net/if.h>
>  #include <unistd.h>
>  #include <stdint.h>
> +#include <stdio.h>
>  #include <fcntl.h>
>  #include <pwd.h>
>  #include <libgen.h>
> @@ -224,6 +226,9 @@ instance_run(struct service_instance *in, int _stdout, int _stderr)
>  	struct blobmsg_list_node *var;
>  	struct blob_attr *cur;
>  	char **argv;
> +	char *ld_preload;
> +	bool ld_preload_seccomp = false;
> +	bool ld_preload_setlbf = false;
>  	int argc = 1; /* NULL terminated */
>  	int rem, _stdin;
>  
> @@ -238,7 +243,19 @@ 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);
> +		ld_preload_seccomp = true;
> +	}
> +	if (_stdout >= 0) {
> +		ld_preload_setlbf = true;
> +	}
> +
> +	if (ld_preload_seccomp || ld_preload_setlbf) {
> +		int bytes = asprintf(&ld_preload, "LD_PRELOAD=%s%s%s",
> +				     ld_preload_seccomp ? "/lib/libpreload-seccomp.so" : "",
> +				     ld_preload_seccomp && ld_preload_setlbf ? ":" : "",
> +				     ld_preload_setlbf ? "/lib/libsetlbf.so" : "");
> +		if (bytes)
> +			putenv(ld_preload);
>  	}
>  
>  	blobmsg_list_for_each(&in->limits, var)
> diff --git a/service/setlbf.c b/service/setlbf.c
> new file mode 100644
> index 0000000..df00366
> --- /dev/null
> +++ b/service/setlbf.c
> @@ -0,0 +1,6 @@
> +#include <stdio.h>
> +
> +static void __attribute__((constructor)) setlbf(void)
> +{
> +	setlinebuf(stdout);
> +}
_______________________________________________
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