diff options
author | John Polstra <jdp@FreeBSD.org> | 1999-10-09 00:25:29 +0000 |
---|---|---|
committer | John Polstra <jdp@FreeBSD.org> | 1999-10-09 00:25:29 +0000 |
commit | 2bc2b29270534caf13f0527c906137907ed32d7d (patch) | |
tree | 892b1ba3a0867fa1bc316b5c54677de3f370ea9b /lib/libc/compat-43/sigcompat.c | |
parent | ee774a4d62b27c99093755442e48a41188e08bc0 (diff) | |
download | src-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.c | 23 |
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); } |