From 5f2475376640b19c95c254cee2e0a15dbd9fa43c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Bollo?= Date: Mon, 4 Sep 2017 12:01:15 +0200 Subject: [PATCH] afb-hook: output hooks to stderr directly MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Change-Id: Ife66db644c62ea4a3e7be11e7f454234c093a824 Signed-off-by: José Bollo --- src/afb-hook.c | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/src/afb-hook.c b/src/afb-hook.c index a8c836f8..664ef125 100644 --- a/src/afb-hook.c +++ b/src/afb-hook.c @@ -24,6 +24,7 @@ #include #include #include +#include #include @@ -135,7 +136,7 @@ static void init_hookid(struct afb_hookid *hookid) * section: default callbacks for tracing requests *****************************************************************************/ -static char *_pbuf_(const char *fmt, va_list args, char **palloc, char *sbuf, size_t szsbuf) +static char *_pbuf_(const char *fmt, va_list args, char **palloc, char *sbuf, size_t szsbuf, size_t *outlen) { int rc; va_list cp; @@ -151,18 +152,21 @@ static char *_pbuf_(const char *fmt, va_list args, char **palloc, char *sbuf, si sbuf = *palloc; } va_end(cp); + if (rc >= 0 && outlen) + *outlen = (size_t)rc; return sbuf; } +#if 0 /* old behaviour: use NOTICE */ static void _hook_(const char *fmt1, const char *fmt2, va_list arg2, ...) { char *tag, *data, *mem1, *mem2, buf1[256], buf2[2000]; va_list arg1; - data = _pbuf_(fmt2, arg2, &mem2, buf2, sizeof buf2); + data = _pbuf_(fmt2, arg2, &mem2, buf2, sizeof buf2, NULL); va_start(arg1, arg2); - tag = _pbuf_(fmt1, arg1, &mem1, buf1, sizeof buf1); + tag = _pbuf_(fmt1, arg1, &mem1, buf1, sizeof buf1, NULL); va_end(arg1); NOTICE("[HOOK %s] %s", tag, data); @@ -170,6 +174,35 @@ static void _hook_(const char *fmt1, const char *fmt2, va_list arg2, ...) free(mem1); free(mem2); } +#else /* new behaviour: emits directly to stderr */ +static void _hook_(const char *fmt1, const char *fmt2, va_list arg2, ...) +{ + static const char chars[] = "[HOOK ] \n"; + char *mem1, *mem2, buf1[256], buf2[2000]; + struct iovec iov[5]; + va_list arg1; + + iov[0].iov_base = (void*)&chars[0]; + iov[0].iov_len = 6; + + va_start(arg1, arg2); + iov[1].iov_base = _pbuf_(fmt1, arg1, &mem1, buf1, sizeof buf1, &iov[1].iov_len); + va_end(arg1); + + iov[2].iov_base = (void*)&chars[6]; + iov[2].iov_len = 2; + + iov[3].iov_base = _pbuf_(fmt2, arg2, &mem2, buf2, sizeof buf2, &iov[3].iov_len); + + iov[4].iov_base = (void*)&chars[8]; + iov[4].iov_len = 1; + + writev(2, iov, 5); + + free(mem1); + free(mem2); +} +#endif static void _hook_xreq_(const struct afb_xreq *xreq, const char *format, ...) { -- 2.16.6