From 731f45ed5012ddfd2a34a272359eab1062f13e7b Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Thu, 10 Jun 2021 08:33:36 +1000 Subject: [PATCH] test: add sigabbrev_np() for systems where it's not available sigabbrev_np() was first added to glibc 2.32 (Aug 2020) which is too recent for some of the distributions we support. --- config.h.meson | 1 + meson.build | 4 ++++ test/meson.build | 8 +++++++ test/pwtest-compat.c | 55 ++++++++++++++++++++++++++++++++++++++++++++ test/pwtest.c | 2 ++ test/test-pwtest.c | 55 ++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 125 insertions(+) create mode 100644 test/pwtest-compat.c create mode 100644 test/test-pwtest.c diff --git a/config.h.meson b/config.h.meson index 64315ef57..a9dd827d7 100644 --- a/config.h.meson +++ b/config.h.meson @@ -474,6 +474,7 @@ #mesondefine HAVE_DECL_STRSIGNAL #mesondefine HAVE_MEMFD_CREATE #mesondefine HAVE_GETRANDOM +#mesondefine HAVE_SIGABBREV_NP #mesondefine PIPEWIRE_VERSION_MAJOR #mesondefine PIPEWIRE_VERSION_MINOR diff --git a/meson.build b/meson.build index 508aba886..7ecc1bc6a 100644 --- a/meson.build +++ b/meson.build @@ -278,6 +278,10 @@ if cc.has_function('getrandom', prefix : '#include ', args : [ '-D cdata.set('HAVE_GETRANDOM', 1) endif +if cc.has_function('sigabbrev_np', prefix : '#include ', args : [ '-D_GNU_SOURCE' ]) + cdata.set('HAVE_SIGABBREV_NP', 1) +endif + systemd = dependency('systemd', required: get_option('systemd')) systemd_dep = dependency('libsystemd',required: get_option('systemd')) if systemd.found() and systemd_dep.found() diff --git a/test/meson.build b/test/meson.build index c1f0db100..599a894e1 100644 --- a/test/meson.build +++ b/test/meson.build @@ -2,6 +2,7 @@ pwtest_sources = [ 'pwtest.h', 'pwtest-implementation.h', 'pwtest.c', + 'pwtest-compat.c', ] pwtest_deps = [ @@ -30,6 +31,13 @@ pwtest_lib = static_library( include_directories: pwtest_inc, ) +test('test pwtest', + executable('test-pwtest', + 'test-pwtest.c', + include_directories: pwtest_inc, + link_with: pwtest_lib) +) + # Compilation only, this is the example file for how pwtest works and most # of its tests will fail. executable('test-example', diff --git a/test/pwtest-compat.c b/test/pwtest-compat.c new file mode 100644 index 000000000..b10d04ec1 --- /dev/null +++ b/test/pwtest-compat.c @@ -0,0 +1,55 @@ +/* PipeWire + * + * Copyright © 2021 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "config.h" + +#if !HAVE_SIGABBREV_NP +#include +#include + +/* glibc >= 2.32 */ +static inline const char *sigabbrev_np(int sig) +{ +#define SIGABBREV(a_) case SIG##a_: return #a_ + switch(sig) { + SIGABBREV(INT); + SIGABBREV(ABRT); + SIGABBREV(BUS); + SIGABBREV(SEGV); + SIGABBREV(ALRM); + SIGABBREV(CHLD); + SIGABBREV(HUP); + SIGABBREV(PIPE); + SIGABBREV(CONT); + SIGABBREV(STOP); + SIGABBREV(ILL); + SIGABBREV(KILL); + SIGABBREV(TERM); + } +#undef SIGABBREV + + return NULL; +} + +#endif /* HAVE_SIGABBREV_NP */ diff --git a/test/pwtest.c b/test/pwtest.c index a0cc21dd1..359adad4a 100644 --- a/test/pwtest.c +++ b/test/pwtest.c @@ -59,6 +59,8 @@ #include "pwtest.h" +#include "pwtest-compat.c" + #define pwtest_log(...) dprintf(testlog_fd, __VA_ARGS__) #define pwtest_vlog(format_, args_) vdprintf(testlog_fd, format_, args_) diff --git a/test/test-pwtest.c b/test/test-pwtest.c new file mode 100644 index 000000000..03cad70cd --- /dev/null +++ b/test/test-pwtest.c @@ -0,0 +1,55 @@ +/* PipeWire + * + * Copyright © 2021 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "config.h" + +#include "pwtest.h" + +#include + +#include "pwtest-compat.c" + +PWTEST(compat_sigabbrev_np) +{ +#if !HAVE_SIGABBREV_NP + pwtest_str_eq(sigabbrev_np(SIGABRT), "ABRT"); + pwtest_str_eq(sigabbrev_np(SIGSEGV), "SEGV"); + pwtest_str_eq(sigabbrev_np(SIGSTOP), "STOP"); + pwtest_str_eq(sigabbrev_np(SIGCHLD), "CHLD"); + pwtest_str_eq(sigabbrev_np(SIGTERM), "TERM"); + pwtest_str_eq(sigabbrev_np(SIGKILL), "KILL"); + pwtest_str_eq(sigabbrev_np(12345), NULL); + + return PWTEST_PASS; +#else + return PWTEST_SKIP; +#endif +} + +PWTEST_SUITE(pwtest) +{ + pwtest_add(compat_sigabbrev_np, PWTEST_NOARG); + + return PWTEST_PASS; +}