aboutsummaryrefslogtreecommitdiff
path: root/lib/libc/compat-43/sigcompat.c
diff options
context:
space:
mode:
authorJohn Polstra <jdp@FreeBSD.org>1999-10-09 00:25:29 +0000
committerJohn Polstra <jdp@FreeBSD.org>1999-10-09 00:25:29 +0000
commit2bc2b29270534caf13f0527c906137907ed32d7d (patch)
tree892b1ba3a0867fa1bc316b5c54677de3f370ea9b /lib/libc/compat-43/sigcompat.c
parentee774a4d62b27c99093755442e48a41188e08bc0 (diff)
downloadsrc-2bc2b29270534caf13f0527c906137907ed32d7d.tar.gz
src-2bc2b29270534caf13f0527c906137907ed32d7d.zip
Fix sigvec(). When the sigset_t changes came in, it was altered
to call osigaction(). But that's wrong because it causes the handler to receive a struct osigcontext instead of the expected struct sigcontext. Use sigaction() instead, copying the compatible portion of the signal mask. Reviewed by: marcel
Notes
Notes: svn path=/head/; revision=52040
Diffstat (limited to 'lib/libc/compat-43/sigcompat.c')
-rw-r--r--lib/libc/compat-43/sigcompat.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/lib/libc/compat-43/sigcompat.c b/lib/libc/compat-43/sigcompat.c
index 46431ef23044..0a870a759360 100644
--- a/lib/libc/compat-43/sigcompat.c
+++ b/lib/libc/compat-43/sigcompat.c
@@ -47,14 +47,25 @@ sigvec(signo, sv, osv)
int signo;
struct sigvec *sv, *osv;
{
+ struct sigaction sa, osa;
+ struct sigaction *sap, *osap;
int ret;
- if (sv)
- sv->sv_flags ^= SV_INTERRUPT; /* !SA_INTERRUPT */
- ret = osigaction(signo, (struct osigaction *)sv,
- (struct osigaction *)osv);
- if (ret == 0 && osv)
- osv->sv_flags ^= SV_INTERRUPT; /* !SA_INTERRUPT */
+ if (sv != NULL) {
+ sa.sa_handler = sv->sv_handler;
+ sa.sa_flags = sv->sv_flags ^ SV_INTERRUPT;
+ sigemptyset(&sa.sa_mask);
+ sa.sa_mask.__bits[0] = sv->sv_mask;
+ sap = &sa;
+ } else
+ sap = NULL;
+ osap = osv != NULL ? &osa : NULL;
+ ret = sigaction(signo, sap, osap);
+ if (ret == 0 && osv != NULL) {
+ osv->sv_handler = osa.sa_handler;
+ osv->sv_flags = osa.sa_flags ^ SV_INTERRUPT;
+ osv->sv_mask = osa.sa_mask.__bits[0];
+ }
return (ret);
}