From fbfa6f980d7460b3e12b0ce88ed3b6018edf4711 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Sun, 11 Feb 2018 21:25:11 +1300 Subject: Move signal compat code into bsd-signal.{c,h} --- openbsd-compat/bsd-signal.c | 62 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 openbsd-compat/bsd-signal.c (limited to 'openbsd-compat/bsd-signal.c') diff --git a/openbsd-compat/bsd-signal.c b/openbsd-compat/bsd-signal.c new file mode 100644 index 00000000..979010e8 --- /dev/null +++ b/openbsd-compat/bsd-signal.c @@ -0,0 +1,62 @@ +/* + * Copyright (c) 1999-2004 Damien Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "includes.h" + +#include +#include +#include + +#include "openbsd-compat/bsd-signal.h" + +#undef signal + +mysig_t +mysignal(int sig, mysig_t act) +{ +#ifdef HAVE_SIGACTION + struct sigaction sa, osa; + + if (sigaction(sig, NULL, &osa) == -1) + return (mysig_t) -1; + if (osa.sa_handler != act) { + memset(&sa, 0, sizeof(sa)); + sigemptyset(&sa.sa_mask); + sa.sa_flags = 0; +#ifdef SA_INTERRUPT + if (sig == SIGALRM) + sa.sa_flags |= SA_INTERRUPT; +#endif + sa.sa_handler = act; + if (sigaction(sig, &sa, NULL) == -1) + return (mysig_t) -1; + } + return (osa.sa_handler); +#else + return (signal(sig, act)); +#endif +} + +#if !defined(HAVE_STRSIGNAL) +char *strsignal(int sig) +{ + static char buf[16]; + + (void)snprintf(buf, sizeof(buf), "%d", sig); + return buf; +} +#endif + -- cgit v1.2.3 From fbec7dba01b70b49ac47f56031310865dff86200 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Mon, 30 Sep 2019 18:01:12 +1000 Subject: Include stdio.h for snprintf. Patch from vapier@gentoo.org. --- openbsd-compat/bsd-signal.c | 1 + 1 file changed, 1 insertion(+) (limited to 'openbsd-compat/bsd-signal.c') diff --git a/openbsd-compat/bsd-signal.c b/openbsd-compat/bsd-signal.c index 979010e8..0b816a3a 100644 --- a/openbsd-compat/bsd-signal.c +++ b/openbsd-compat/bsd-signal.c @@ -17,6 +17,7 @@ #include "includes.h" #include +#include #include #include -- cgit v1.2.3 From 9b9e3ca6945351eefb821ff783a4a8e6d9b98b9a Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 11 Oct 2019 14:12:16 +1100 Subject: Re-add SA_RESTART to mysignal. This makes mysignal implement reliable BSD semantics according to Stevens' APUE. This was first attempted in 2001 but was reverted due to problems with HP-UX 10.20 and select() and possibly grantpt(). Modern systems should be fine with it, but if any current platforms have a problem with it now we can disable it just for those. ok djm@ --- openbsd-compat/bsd-signal.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'openbsd-compat/bsd-signal.c') diff --git a/openbsd-compat/bsd-signal.c b/openbsd-compat/bsd-signal.c index 0b816a3a..104ab653 100644 --- a/openbsd-compat/bsd-signal.c +++ b/openbsd-compat/bsd-signal.c @@ -37,10 +37,15 @@ mysignal(int sig, mysig_t act) memset(&sa, 0, sizeof(sa)); sigemptyset(&sa.sa_mask); sa.sa_flags = 0; + if (sig == SIGALRM) { #ifdef SA_INTERRUPT - if (sig == SIGALRM) sa.sa_flags |= SA_INTERRUPT; #endif + } else { +#ifdef SA_RESTART + sa.sa_flags |= SA_RESTART; +#endif + } sa.sa_handler = act; if (sigaction(sig, &sa, NULL) == -1) return (mysig_t) -1; -- cgit v1.2.3 From 84226b447d45fe4542613de68c2ca59a890d7c01 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Thu, 23 Jan 2020 18:55:24 +1100 Subject: Remove mysignal wrapper. We switched the main code to use sigaction(), so the wrapper is no longer used. --- openbsd-compat/bsd-signal.c | 33 --------------------------------- 1 file changed, 33 deletions(-) (limited to 'openbsd-compat/bsd-signal.c') diff --git a/openbsd-compat/bsd-signal.c b/openbsd-compat/bsd-signal.c index 104ab653..38d5e972 100644 --- a/openbsd-compat/bsd-signal.c +++ b/openbsd-compat/bsd-signal.c @@ -23,39 +23,6 @@ #include "openbsd-compat/bsd-signal.h" -#undef signal - -mysig_t -mysignal(int sig, mysig_t act) -{ -#ifdef HAVE_SIGACTION - struct sigaction sa, osa; - - if (sigaction(sig, NULL, &osa) == -1) - return (mysig_t) -1; - if (osa.sa_handler != act) { - memset(&sa, 0, sizeof(sa)); - sigemptyset(&sa.sa_mask); - sa.sa_flags = 0; - if (sig == SIGALRM) { -#ifdef SA_INTERRUPT - sa.sa_flags |= SA_INTERRUPT; -#endif - } else { -#ifdef SA_RESTART - sa.sa_flags |= SA_RESTART; -#endif - } - sa.sa_handler = act; - if (sigaction(sig, &sa, NULL) == -1) - return (mysig_t) -1; - } - return (osa.sa_handler); -#else - return (signal(sig, act)); -#endif -} - #if !defined(HAVE_STRSIGNAL) char *strsignal(int sig) { -- cgit v1.2.3