Re: POSIX::sigprocmask implemented incorrectly
Alan Burlison [Mon, 19 Jul 2004 12:07:02 +0000 (13:07 +0100)]
Message-ID: <40FBAB56.1030208@sun.com>

(last chunk only)

p4raw-id: //depot/perl@23194

ext/POSIX/POSIX.xs

index d56c379..c6a6114 100644 (file)
@@ -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