Commit 7053e788 authored by Dmitry Safonov's avatar Dmitry Safonov Committed by Jakub Kicinski

selftests/net: Provide test_snprintf() helper

Instead of pre-allocating a fixed-sized buffer of TEST_MSG_BUFFER_SIZE
and printing into it, call vsnprintf() with str = NULL, which will
return the needed size of the buffer. This hack is documented in
man 3 vsnprintf.

Essentially, in C++ terms, it re-invents std::stringstream, which is
going to be used to print different tracing paths and formatted strings.
Use it straight away in __test_print() - which is thread-safe version of
printing in selftests.
Signed-off-by: default avatarDmitry Safonov <0x7f454c46@gmail.com>
Link: https://patch.msgid.link/20240823-tcp-ao-selftests-upd-6-12-v4-2-05623636fe8c@gmail.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 79504a47
...@@ -37,17 +37,58 @@ extern void __test_xfail(const char *buf); ...@@ -37,17 +37,58 @@ extern void __test_xfail(const char *buf);
extern void __test_error(const char *buf); extern void __test_error(const char *buf);
extern void __test_skip(const char *buf); extern void __test_skip(const char *buf);
__attribute__((__format__(__printf__, 2, 3))) static inline char *test_snprintf(const char *fmt, va_list vargs)
static inline void __test_print(void (*fn)(const char *), const char *fmt, ...)
{ {
#define TEST_MSG_BUFFER_SIZE 4096 char *ret = NULL;
char buf[TEST_MSG_BUFFER_SIZE]; size_t size = 0;
va_list arg; va_list tmp;
int n = 0;
va_start(arg, fmt);
vsnprintf(buf, sizeof(buf), fmt, arg); va_copy(tmp, vargs);
va_end(arg); n = vsnprintf(ret, size, fmt, tmp);
fn(buf); if (n < 0)
return NULL;
size = n + 1;
ret = malloc(size);
if (!ret)
return NULL;
n = vsnprintf(ret, size, fmt, vargs);
if (n < 0 || n > size - 1) {
free(ret);
return NULL;
}
return ret;
}
static __printf(1, 2) inline char *test_sprintf(const char *fmt, ...)
{
va_list vargs;
char *ret;
va_start(vargs, fmt);
ret = test_snprintf(fmt, vargs);
va_end(vargs);
return ret;
}
static __printf(2, 3) inline void __test_print(void (*fn)(const char *),
const char *fmt, ...)
{
va_list vargs;
char *msg;
va_start(vargs, fmt);
msg = test_snprintf(fmt, vargs);
va_end(vargs);
if (!msg)
return;
fn(msg);
free(msg);
} }
#define test_print(fmt, ...) \ #define test_print(fmt, ...) \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment