summaryrefslogtreecommitdiff
path: root/ext/POSIX
diff options
context:
space:
mode:
authorAlan Burlison <Alan.Burlison@uk.sun.com>2004-07-19 13:07:02 +0100
committerRafael Garcia-Suarez <rgarciasuarez@gmail.com>2004-08-04 07:18:49 +0000
commitb13bbac74f763cf278bfb06cd617733e42684c46 (patch)
tree91f111733695aff44eb8f281b0a41a79f165e496 /ext/POSIX
parent112dcc46caa17a77552bb7535e1be2c9417728e7 (diff)
downloadperl-b13bbac74f763cf278bfb06cd617733e42684c46.tar.gz
Re: POSIX::sigprocmask implemented incorrectly
Message-ID: <40FBAB56.1030208@sun.com> (last chunk only) p4raw-id: //depot/perl@23194
Diffstat (limited to 'ext/POSIX')
-rw-r--r--ext/POSIX/POSIX.xs23
1 files changed, 14 insertions, 9 deletions
diff --git a/ext/POSIX/POSIX.xs b/ext/POSIX/POSIX.xs
index d56c379588..c6a6114a72 100644
--- a/ext/POSIX/POSIX.xs
+++ b/ext/POSIX/POSIX.xs
@@ -1390,20 +1390,25 @@ sigpending(sigset)
SysRet
sigprocmask(how, sigset, oldsigset = 0)
int how
- POSIX::SigSet sigset
+ POSIX::SigSet sigset = NO_INIT
POSIX::SigSet oldsigset = NO_INIT
INIT:
- if ( items < 3 ) {
- oldsigset = 0;
+ if (SvTYPE(ST(1)) == SVt_NULL) {
+ sigset = NULL;
+ } else if (sv_derived_from(ST(1), "POSIX::SigSet")) {
+ IV tmp = SvIV((SV*)SvRV(ST(1)));
+ sigset = INT2PTR(POSIX__SigSet,tmp);
+ } else {
+ croak("sigset is not of type POSIX::SigSet");
}
- else if (sv_derived_from(ST(2), "POSIX::SigSet")) {
+
+ if ( items < 3 || SvTYPE(ST(2)) == SVt_NULL) {
+ oldsigset = NULL;
+ } else if (sv_derived_from(ST(2), "POSIX::SigSet")) {
IV tmp = SvIV((SV*)SvRV(ST(2)));
oldsigset = INT2PTR(POSIX__SigSet,tmp);
- }
- else {
- New(0, oldsigset, 1, sigset_t);
- sigemptyset(oldsigset);
- sv_setref_pv(ST(2), "POSIX::SigSet", (void*)oldsigset);
+ } else {
+ croak("oldsigset is not of type POSIX::SigSet");
}
SysRet