Use fork if available.
[p5sagit/p5-mst-13.2.git] / mg.c
diff --git a/mg.c b/mg.c
index 555c7a1..d58b0cf 100644 (file)
--- a/mg.c
+++ b/mg.c
@@ -21,6 +21,7 @@
 #endif
 */
 
+
 void
 mg_magical(sv)
 SV* sv;
@@ -79,6 +80,7 @@ SV* sv;
     U32 savemagic = SvMAGICAL(sv);
 
     SvMAGICAL_off(sv);
+    SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
 
     for (mg = SvMAGIC(sv); mg; mg = nextmg) {
        MGVTBL* vtbl = mg->mg_virtual;
@@ -549,6 +551,10 @@ MAGIC* mg;
        else
            croak("No such hook: %s", s);
        i = 0;
+       if (*svp) {
+           SvREFCNT_dec(*svp);
+           *svp = 0;
+       }
     }
     else {
        i = whichsig(s);        /* ...no, a brick */
@@ -1092,7 +1098,7 @@ MAGIC* mg;
 #endif
 #endif
        uid = (I32)getuid();
-       tainting |= (euid != uid || egid != gid);
+       tainting |= (uid && (euid != uid || egid != gid));
        break;
     case '>':
        euid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
@@ -1119,7 +1125,7 @@ MAGIC* mg;
 #endif
 #endif
        euid = (I32)geteuid();
-       tainting |= (euid != uid || egid != gid);
+       tainting |= (uid && (euid != uid || egid != gid));
        break;
     case '(':
        gid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
@@ -1146,7 +1152,7 @@ MAGIC* mg;
 #endif
 #endif
        gid = (I32)getgid();
-       tainting |= (euid != uid || egid != gid);
+       tainting |= (uid && (euid != uid || egid != gid));
        break;
     case ')':
        egid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
@@ -1173,7 +1179,7 @@ MAGIC* mg;
 #endif
 #endif
        egid = (I32)getegid();
-       tainting |= (euid != uid || egid != gid);
+       tainting |= (uid && (euid != uid || egid != gid));
        break;
     case ':':
        chopset = SvPV_force(sv,na);
@@ -1227,7 +1233,7 @@ char *sig;
 
     for (sigv = sig_name+1; *sigv; sigv++)
        if (strEQ(sig,*sigv))
-           return sigv - sig_name;
+           return sig_num[sigv - sig_name];
 #ifdef SIGCLD
     if (strEQ(sig,"CHLD"))
        return SIGCLD;
@@ -1249,18 +1255,20 @@ int sig;
     SV *sv;
     CV *cv;
     AV *oldstack;
+    char *signame; 
 
 #ifdef OS2             /* or anybody else who requires SIG_ACK */
     signal(sig, SIG_ACK);
 #endif
 
-    cv = sv_2cv(*hv_fetch(GvHVn(siggv),sig_name[sig],strlen(sig_name[sig]),
+    signame = sig_name[sig];
+    cv = sv_2cv(*hv_fetch(GvHVn(siggv),signame,strlen(signame),
                          TRUE),
                &st, &gv, TRUE);
     if (!cv || !CvROOT(cv) &&
-       *sig_name[sig] == 'C' && instr(sig_name[sig],"LD")) {
+       *signame == 'C' && instr(signame,"LD")) {
        
-       if (sig_name[sig][1] == 'H')
+       if (signame[1] == 'H')
            cv = sv_2cv(*hv_fetch(GvHVn(siggv),"CLD",3,TRUE),
                        &st, &gv, TRUE);
        else
@@ -1271,7 +1279,7 @@ int sig;
     if (!cv || !CvROOT(cv)) {
        if (dowarn)
            warn("SIG%s handler \"%s\" not defined.\n",
-               sig_name[sig], GvENAME(gv) );
+               signame, GvENAME(gv) );
        return;
     }
 
@@ -1281,7 +1289,7 @@ int sig;
     SWITCHSTACK(stack, signalstack);
 
     sv = sv_newmortal();
-    sv_setpv(sv,sig_name[sig]);
+    sv_setpv(sv,signame);
     PUSHMARK(sp);
     PUSHs(sv);
     PUTBACK;