skalibs

Mirror/fork of https://skarnet.org/software/skalibs/
git clone https://ccx.te2000.cz/git/skalibs
Log | Files | Refs | README | LICENSE

commit 61b4199fe43e94d6753290a62eb45363503e0deb
parent 61e06f3b12afe464c3b4fcd23d4a3a07251c50ac
Author: Laurent Bercot <ska-skaware@skarnet.org>
Date:   Mon,  5 Sep 2022 06:59:43 +0000

 Better NSIG detection and fix

 Incredibly enough, OpenBSD defines NSIG correctly, so our workaround
was not accurate.

Signed-off-by: Laurent Bercot <ska@appnovation.com>

Diffstat:
Msrc/include/skalibs/nsig.h | 20++++++++++++--------
Msrc/include/skalibs/skalibs.h | 2+-
Msrc/libstddjb/selfpipe_trapset.c | 1-
Msrc/libstddjb/sig_catch.c | 10+++-------
4 files changed, 16 insertions(+), 17 deletions(-)

diff --git a/src/include/skalibs/nsig.h b/src/include/skalibs/nsig.h @@ -1,9 +1,8 @@ /* ISC license. */ /* - This header MUST be paired with skalibs/nonposix.h AND - skalibs/bsdsnowflake.h, both of which must be included - before system headers. + This header MUST be paired with skalibs/nonposix.h, + which must be included before system headers. */ #ifndef SKALIBS_NSIG_H @@ -18,17 +17,22 @@ # define NSIG (SIGMAX + 1) # elif defined(_SIGMAX) # define NSIG(_SIGMAX + 1) -# elif defined(SKALIBS_BSD_SUCKS) -# define NSIG 64 # else # define NSIG 65 # endif #endif -#ifdef SKALIBS_BSD_SUCKS -# define SKALIBS_NSIG (NSIG+1) -#else +/* + Some systems (FreeBSD, Darwin) incorrectly define NSIG as 32 + (their highest signal number) when it should be 33 (highest plus one). + OpenBSD gets this right so we can't use SKALIBS_BSD_SUCKS. + The heuristic we use is: if NSIG is a power of two, it's wrong. +*/ + +#if NSIG & (NSIG - 1) # define SKALIBS_NSIG NSIG +#else +# define SKALIBS_NSIG (NSIG+1) #endif #endif diff --git a/src/include/skalibs/skalibs.h b/src/include/skalibs/skalibs.h @@ -9,7 +9,7 @@ - skalibs/sysdeps.h: system-dependent feature test macros - skalibs/nonposix.h: pre-system headers definitions for POSIX extensions - skalibs/bsdsnowflake.h: pre-system headers BSD-specific workarounds - - skalibs/nsig.h: SKALIBS_NSIG definition, requires nonposix+bsdsnowflake + - skalibs/nsig.h: SKALIBS_NSIG definition, requires nonposix - skalibs/posixishard.h: post-system headers workarounds for conformance failures */ diff --git a/src/libstddjb/selfpipe_trapset.c b/src/libstddjb/selfpipe_trapset.c @@ -30,7 +30,6 @@ int selfpipe_trapset (sigset_t const *set) #else #include <skalibs/nonposix.h> -#include <skalibs/bsdsnowflake.h> #include <errno.h> #include <signal.h> diff --git a/src/libstddjb/sig_catch.c b/src/libstddjb/sig_catch.c @@ -3,7 +3,6 @@ /* MT-unsafe */ #include <skalibs/nonposix.h> -#include <skalibs/bsdsnowflake.h> #include <signal.h> #include <errno.h> @@ -13,8 +12,8 @@ #include <skalibs/nsig.h> /* - BSD fails sigaction() with EINVAL on non-catchable signals, whereas - every reasonable OS succeeds and simply ignores the signal handler. + We don't want to fail on non-catchable signals, + even if sigaction() does. */ int sig_catch (int sig, sig_func_ref f) @@ -22,8 +21,5 @@ int sig_catch (int sig, sig_func_ref f) struct sigaction action = { .sa_handler = f, .sa_flags = SA_RESTART | SA_NOCLDSTOP } ; sigfillset(&action.sa_mask) ; return sigaction(sig, &action, 0) >= 0 -#ifdef SKALIBS_BSD_SUCKS - || (errno == EINVAL && sig >= 1 && sig <= NSIG) -#endif - ; + || (errno == EINVAL && sig >= 1 && sig < SKALIBS_NSIG) ; }