From 90ade199e63134fda8002b053e38a662211dc0a0 Mon Sep 17 00:00:00 2001 From: Greg V Date: Mon, 9 Nov 2020 00:40:40 +0300 Subject: [PATCH] Provide a strndupa implementation when it is absent strndupa is a glibc exclusive, not even musl implements it --- meson.build | 4 ++++ src/pipewire/utils.h | 16 ++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/meson.build b/meson.build index afc4bbb9e..96c004b68 100644 --- a/meson.build +++ b/meson.build @@ -267,6 +267,10 @@ if cc.has_type('ptrdiff_t', prefix : '#include ') cdata.set('HAVE_PTRDIFF_T', 1) endif +if cc.has_function('strndupa', prefix : '#include ', args : [ '-D_GNU_SOURCE' ]) + cdata.set('HAVE_STRNDUPA', 1) +endif + if cc.has_function('mkstemp', prefix : '#include ') cdata.set('HAVE_MKSTEMP', 1) endif diff --git a/src/pipewire/utils.h b/src/pipewire/utils.h index bdb506357..db9322403 100644 --- a/src/pipewire/utils.h +++ b/src/pipewire/utils.h @@ -29,6 +29,8 @@ extern "C" { #endif +#include "config.h" + #include #include @@ -52,6 +54,20 @@ pw_free_strv(char **str); char * pw_strip(char *str, const char *whitespace); +#if defined(HAVE_STRNDUPA) +#include +#else +# define strndupa(s, n) \ + ({ \ + const char *__old = (s); \ + size_t __len = strnlen(__old, (n)); \ + char *__new = (char *) __builtin_alloca(__len + 1); \ + memcpy(__new, __old, __len); \ + __new[__len] = '\0'; \ + __new; \ + }) +#endif + #ifdef __cplusplus } /* extern "C" */ #endif