#endif
*/
+
void
mg_magical(sv)
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;
return 0;
}
+#ifdef HAS_SIGACTION
+/* set up reliable signal() clone */
+
+typedef void (*Sigfunc) _((int));
+
+static
+Sigfunc rsignal(signo,handler)
+int signo;
+Sigfunc handler;
+{
+ struct sigaction act,oact;
+
+ act.sa_handler = handler;
+ sigemptyset(&act.sa_mask);
+ act.sa_flags = 0;
+#ifdef SIGALRM
+ if (signo == SIGALRM) {
+#else
+ if (0) {
+#endif
+#ifdef SA_INTERRUPT
+ act.sa_flags |= SA_INTERRUPT; /* SunOS */
+#endif
+ } else {
+#ifdef SA_RESTART
+ act.sa_flags |= SA_RESTART; /* SVR4, 4.3+BSD */
+#endif
+ }
+ if (sigaction(signo, &act, &oact) < 0)
+ return(SIG_ERR);
+ else
+ return(oact.sa_handler);
+}
+
+#else
+
+/* ah well, so much for reliability */
+
+#define rsignal(x,y) signal(x,y)
+
+#endif
+
+
int
magic_setsig(sv,mg)
SV* sv;
else
croak("No such hook: %s", s);
i = 0;
+ if (*svp) {
+ SvREFCNT_dec(*svp);
+ *svp = 0;
+ }
}
else {
i = whichsig(s); /* ...no, a brick */
}
if (SvTYPE(sv) == SVt_PVGV || SvROK(sv)) {
if (i)
- (void)signal(i,sighandler);
+ (void)rsignal(i,sighandler);
else
*svp = SvREFCNT_inc(sv);
return 0;
s = SvPV_force(sv,na);
if (strEQ(s,"IGNORE")) {
if (i)
- (void)signal(i,SIG_IGN);
+ (void)rsignal(i,SIG_IGN);
else
*svp = 0;
}
else if (strEQ(s,"DEFAULT") || !*s) {
if (i)
- (void)signal(i,SIG_DFL);
+ (void)rsignal(i,SIG_DFL);
else
*svp = 0;
}
sv_setpv(sv,tokenbuf);
}
if (i)
- (void)signal(i,sighandler);
+ (void)rsignal(i,sighandler);
else
*svp = SvREFCNT_inc(sv);
}
#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);
#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);
#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);
#endif
#endif
egid = (I32)getegid();
- tainting |= (euid != uid || egid != gid);
+ tainting |= (uid && (euid != uid || egid != gid));
break;
case ':':
chopset = SvPV_force(sv,na);
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;
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
if (!cv || !CvROOT(cv)) {
if (dowarn)
warn("SIG%s handler \"%s\" not defined.\n",
- sig_name[sig], GvENAME(gv) );
+ signame, GvENAME(gv) );
return;
}
SWITCHSTACK(stack, signalstack);
sv = sv_newmortal();
- sv_setpv(sv,sig_name[sig]);
+ sv_setpv(sv,signame);
PUSHMARK(sp);
PUSHs(sv);
PUTBACK;