Digital UNIX hints
[p5sagit/p5-mst-13.2.git] / mg.c
1 /*    mg.c
2  *
3  *    Copyright (c) 1991-1994, Larry Wall
4  *
5  *    You may distribute under the terms of either the GNU General Public
6  *    License or the Artistic License, as specified in the README file.
7  *
8  */
9
10 /*
11  * "Sam sat on the ground and put his head in his hands.  'I wish I had never
12  * come here, and I don't want to see no more magic,' he said, and fell silent."
13  */
14
15 #include "EXTERN.h"
16 #include "perl.h"
17
18 /* XXX If this causes problems, set i_unistd=undef in the hint file.  */
19 #ifdef I_UNISTD
20 # include <unistd.h>
21 #endif
22
23 #ifdef HAS_GETGROUPS
24 #  ifndef NGROUPS
25 #    define NGROUPS 32
26 #  endif
27 #endif
28
29 /*
30  * Use the "DESTRUCTOR" scope cleanup to reinstate magic.
31  */
32
33 struct magic_state {
34     SV* mgs_sv;
35     U32 mgs_flags;
36 };
37 typedef struct magic_state MGS;
38
39 static void restore_magic _((void *p));
40
41 static void
42 save_magic(mgs, sv)
43 MGS* mgs;
44 SV* sv;
45 {
46     assert(SvMAGICAL(sv));
47
48     mgs->mgs_sv = sv;
49     mgs->mgs_flags = SvMAGICAL(sv) | SvREADONLY(sv);
50     SAVEDESTRUCTOR(restore_magic, mgs);
51
52     SvMAGICAL_off(sv);
53     SvREADONLY_off(sv);
54     SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
55 }
56
57 static void
58 restore_magic(p)
59 void* p;
60 {
61     MGS* mgs = (MGS*)p;
62     SV* sv = mgs->mgs_sv;
63
64     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
65     {
66         if (mgs->mgs_flags)
67             SvFLAGS(sv) |= mgs->mgs_flags;
68         else
69             mg_magical(sv);
70         if (SvGMAGICAL(sv))
71             SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
72     }
73 }
74
75
76 void
77 mg_magical(sv)
78 SV* sv;
79 {
80     MAGIC* mg;
81     for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
82         MGVTBL* vtbl = mg->mg_virtual;
83         if (vtbl) {
84             if (vtbl->svt_get && !(mg->mg_flags & MGf_GSKIP))
85                 SvGMAGICAL_on(sv);
86             if (vtbl->svt_set)
87                 SvSMAGICAL_on(sv);
88             if (!(SvFLAGS(sv) & (SVs_GMG|SVs_SMG)) || vtbl->svt_clear)
89                 SvRMAGICAL_on(sv);
90         }
91     }
92 }
93
94 int
95 mg_get(sv)
96 SV* sv;
97 {
98     MGS mgs;
99     MAGIC* mg;
100     MAGIC** mgp;
101     int mgp_valid = 0;
102
103     ENTER;
104     save_magic(&mgs, sv);
105
106     mgp = &SvMAGIC(sv);
107     while ((mg = *mgp) != 0) {
108         MGVTBL* vtbl = mg->mg_virtual;
109         if (!(mg->mg_flags & MGf_GSKIP) && vtbl && vtbl->svt_get) {
110             (*vtbl->svt_get)(sv, mg);
111             /* Ignore this magic if it's been deleted */
112             if ((mg == (mgp_valid ? *mgp : SvMAGIC(sv))) &&
113                   (mg->mg_flags & MGf_GSKIP))
114                 mgs.mgs_flags = 0;
115         }
116         /* Advance to next magic (complicated by possible deletion) */
117         if (mg == (mgp_valid ? *mgp : SvMAGIC(sv))) {
118             mgp = &mg->mg_moremagic;
119             mgp_valid = 1;
120         }
121         else
122             mgp = &SvMAGIC(sv); /* Re-establish pointer after sv_upgrade */
123     }
124
125     LEAVE;
126     return 0;
127 }
128
129 int
130 mg_set(sv)
131 SV* sv;
132 {
133     MGS mgs;
134     MAGIC* mg;
135     MAGIC* nextmg;
136
137     ENTER;
138     save_magic(&mgs, sv);
139
140     for (mg = SvMAGIC(sv); mg; mg = nextmg) {
141         MGVTBL* vtbl = mg->mg_virtual;
142         nextmg = mg->mg_moremagic;      /* it may delete itself */
143         if (mg->mg_flags & MGf_GSKIP) {
144             mg->mg_flags &= ~MGf_GSKIP; /* setting requires another read */
145             mgs.mgs_flags = 0;
146         }
147         if (vtbl && vtbl->svt_set)
148             (*vtbl->svt_set)(sv, mg);
149     }
150
151     LEAVE;
152     return 0;
153 }
154
155 U32
156 mg_len(sv)
157 SV* sv;
158 {
159     MAGIC* mg;
160     char *junk;
161     STRLEN len;
162
163     for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
164         MGVTBL* vtbl = mg->mg_virtual;
165         if (vtbl && vtbl->svt_len) {
166             MGS mgs;
167
168             ENTER;
169             save_magic(&mgs, sv);
170             /* omit MGf_GSKIP -- not changed here */
171             len = (*vtbl->svt_len)(sv, mg);
172             LEAVE;
173             return len;
174         }
175     }
176
177     junk = SvPV(sv, len);
178     return len;
179 }
180
181 int
182 mg_clear(sv)
183 SV* sv;
184 {
185     MGS mgs;
186     MAGIC* mg;
187
188     ENTER;
189     save_magic(&mgs, sv);
190
191     for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
192         MGVTBL* vtbl = mg->mg_virtual;
193         /* omit GSKIP -- never set here */
194         
195         if (vtbl && vtbl->svt_clear)
196             (*vtbl->svt_clear)(sv, mg);
197     }
198
199     LEAVE;
200     return 0;
201 }
202
203 MAGIC*
204 mg_find(sv, type)
205 SV* sv;
206 int type;
207 {
208     MAGIC* mg;
209     for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
210         if (mg->mg_type == type)
211             return mg;
212     }
213     return 0;
214 }
215
216 int
217 mg_copy(sv, nsv, key, klen)
218 SV* sv;
219 SV* nsv;
220 char *key;
221 I32 klen;
222 {
223     int count = 0;
224     MAGIC* mg;
225     for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
226         if (isUPPER(mg->mg_type)) {
227             sv_magic(nsv, mg->mg_obj, toLOWER(mg->mg_type), key, klen);
228             count++;
229         }
230     }
231     return count;
232 }
233
234 int
235 mg_free(sv)
236 SV* sv;
237 {
238     MAGIC* mg;
239     MAGIC* moremagic;
240     for (mg = SvMAGIC(sv); mg; mg = moremagic) {
241         MGVTBL* vtbl = mg->mg_virtual;
242         moremagic = mg->mg_moremagic;
243         if (vtbl && vtbl->svt_free)
244             (*vtbl->svt_free)(sv, mg);
245         if (mg->mg_ptr && mg->mg_type != 'g')
246             if (mg->mg_len >= 0)
247                 Safefree(mg->mg_ptr);
248             else if (mg->mg_len == HEf_SVKEY)
249                 SvREFCNT_dec((SV*)mg->mg_ptr);
250         if (mg->mg_flags & MGf_REFCOUNTED)
251             SvREFCNT_dec(mg->mg_obj);
252         Safefree(mg);
253     }
254     SvMAGIC(sv) = 0;
255     return 0;
256 }
257
258 #if !defined(NSIG) || defined(M_UNIX) || defined(M_XENIX)
259 #include <signal.h>
260 #endif
261
262 U32
263 magic_len(sv, mg)
264 SV *sv;
265 MAGIC *mg;
266 {
267     register I32 paren;
268     register char *s;
269     register I32 i;
270     register REGEXP *rx;
271     char *t;
272
273     switch (*mg->mg_ptr) {
274     case '1': case '2': case '3': case '4':
275     case '5': case '6': case '7': case '8': case '9': case '&':
276         if (curpm && (rx = curpm->op_pmregexp)) {
277             paren = atoi(mg->mg_ptr);
278           getparen:
279             if (paren <= rx->nparens &&
280                 (s = rx->startp[paren]) &&
281                 (t = rx->endp[paren]))
282             {
283                 i = t - s;
284                 if (i >= 0)
285                     return i;
286             }
287         }
288         return 0;
289         break;
290     case '+':
291         if (curpm && (rx = curpm->op_pmregexp)) {
292             paren = rx->lastparen;
293             if (paren)
294                 goto getparen;
295         }
296         return 0;
297         break;
298     case '`':
299         if (curpm && (rx = curpm->op_pmregexp)) {
300             if ((s = rx->subbeg) && rx->startp[0]) {
301                 i = rx->startp[0] - s;
302                 if (i >= 0)
303                     return i;
304             }
305         }
306         return 0;
307     case '\'':
308         if (curpm && (rx = curpm->op_pmregexp)) {
309             if (rx->subend && (s = rx->endp[0])) {
310                 i = rx->subend - s;
311                 if (i >= 0)
312                     return 0;
313             }
314         }
315         return 0;
316     case ',':
317         return (STRLEN)ofslen;
318     case '\\':
319         return (STRLEN)orslen;
320     }
321     magic_get(sv,mg);
322     if (!SvPOK(sv) && SvNIOK(sv))
323         sv_2pv(sv, &na);
324     if (SvPOK(sv))
325         return SvCUR(sv);
326     return 0;
327 }
328
329 int
330 magic_get(sv, mg)
331 SV *sv;
332 MAGIC *mg;
333 {
334     register I32 paren;
335     register char *s;
336     register I32 i;
337     register REGEXP *rx;
338     char *t;
339
340     switch (*mg->mg_ptr) {
341     case '\001':                /* ^A */
342         sv_setsv(sv, bodytarget);
343         break;
344     case '\004':                /* ^D */
345         sv_setiv(sv, (IV)(debug & 32767));
346         break;
347     case '\005':  /* ^E */
348 #ifdef VMS
349         {
350 #           include <descrip.h>
351 #           include <starlet.h>
352             char msg[255];
353             $DESCRIPTOR(msgdsc,msg);
354             sv_setnv(sv,(double) vaxc$errno);
355             if (sys$getmsg(vaxc$errno,&msgdsc.dsc$w_length,&msgdsc,0,0) & 1)
356                 sv_setpvn(sv,msgdsc.dsc$a_pointer,msgdsc.dsc$w_length);
357             else
358                 sv_setpv(sv,"");
359         }
360 #else
361 #ifdef OS2
362         sv_setnv(sv, (double)Perl_rc);
363         sv_setpv(sv, os2error(Perl_rc));
364 #else
365         sv_setnv(sv, (double)errno);
366         sv_setpv(sv, errno ? Strerror(errno) : "");
367 #endif
368 #endif
369         SvNOK_on(sv);   /* what a wonderful hack! */
370         break;
371     case '\006':                /* ^F */
372         sv_setiv(sv, (IV)maxsysfd);
373         break;
374     case '\010':                /* ^H */
375         sv_setiv(sv, (IV)hints);
376         break;
377     case '\t':                  /* ^I */
378         if (inplace)
379             sv_setpv(sv, inplace);
380         else
381             sv_setsv(sv, &sv_undef);
382         break;
383     case '\017':                /* ^O */
384         sv_setpv(sv, osname);
385         break;
386     case '\020':                /* ^P */
387         sv_setiv(sv, (IV)perldb);
388         break;
389     case '\023':                /* ^S */
390         if (STATUS_NATIVE == -1)
391             sv_setiv(sv, (IV)-1);
392         else
393             sv_setuv(sv, (UV)STATUS_NATIVE);
394         break;
395     case '\024':                /* ^T */
396 #ifdef BIG_TIME
397         sv_setnv(sv, basetime);
398 #else
399         sv_setiv(sv, (IV)basetime);
400 #endif
401         break;
402     case '\027':                /* ^W */
403         sv_setiv(sv, (IV)dowarn);
404         break;
405     case '1': case '2': case '3': case '4':
406     case '5': case '6': case '7': case '8': case '9': case '&':
407         if (curpm && (rx = curpm->op_pmregexp)) {
408             paren = atoi(GvENAME((GV*)mg->mg_obj));
409           getparen:
410             if (paren <= rx->nparens &&
411                 (s = rx->startp[paren]) &&
412                 (t = rx->endp[paren]))
413             {
414                 i = t - s;
415               getrx:
416                 if (i >= 0) {
417                     bool was_tainted;
418                     if (tainting) {
419                         was_tainted = tainted;
420                         tainted = FALSE;
421                     }
422                     sv_setpvn(sv,s,i);
423                     if (tainting)
424                         tainted = was_tainted || rx->exec_tainted;
425                     break;
426                 }
427             }
428         }
429         sv_setsv(sv,&sv_undef);
430         break;
431     case '+':
432         if (curpm && (rx = curpm->op_pmregexp)) {
433             paren = rx->lastparen;
434             if (paren)
435                 goto getparen;
436         }
437         sv_setsv(sv,&sv_undef);
438         break;
439     case '`':
440         if (curpm && (rx = curpm->op_pmregexp)) {
441             if ((s = rx->subbeg) && rx->startp[0]) {
442                 i = rx->startp[0] - s;
443                 goto getrx;
444             }
445         }
446         sv_setsv(sv,&sv_undef);
447         break;
448     case '\'':
449         if (curpm && (rx = curpm->op_pmregexp)) {
450             if (rx->subend && (s = rx->endp[0])) {
451                 i = rx->subend - s;
452                 goto getrx;
453             }
454         }
455         sv_setsv(sv,&sv_undef);
456         break;
457     case '.':
458 #ifndef lint
459         if (GvIO(last_in_gv)) {
460             sv_setiv(sv, (IV)IoLINES(GvIO(last_in_gv)));
461         }
462 #endif
463         break;
464     case '?':
465         sv_setiv(sv, (IV)STATUS_POSIX);
466         break;
467     case '^':
468         s = IoTOP_NAME(GvIOp(defoutgv));
469         if (s)
470             sv_setpv(sv,s);
471         else {
472             sv_setpv(sv,GvENAME(defoutgv));
473             sv_catpv(sv,"_TOP");
474         }
475         break;
476     case '~':
477         s = IoFMT_NAME(GvIOp(defoutgv));
478         if (!s)
479             s = GvENAME(defoutgv);
480         sv_setpv(sv,s);
481         break;
482 #ifndef lint
483     case '=':
484         sv_setiv(sv, (IV)IoPAGE_LEN(GvIOp(defoutgv)));
485         break;
486     case '-':
487         sv_setiv(sv, (IV)IoLINES_LEFT(GvIOp(defoutgv)));
488         break;
489     case '%':
490         sv_setiv(sv, (IV)IoPAGE(GvIOp(defoutgv)));
491         break;
492 #endif
493     case ':':
494         break;
495     case '/':
496         break;
497     case '[':
498         sv_setiv(sv, (IV)curcop->cop_arybase);
499         break;
500     case '|':
501         sv_setiv(sv, (IV)(IoFLAGS(GvIOp(defoutgv)) & IOf_FLUSH) != 0 );
502         break;
503     case ',':
504         sv_setpvn(sv,ofs,ofslen);
505         break;
506     case '\\':
507         sv_setpvn(sv,ors,orslen);
508         break;
509     case '#':
510         sv_setpv(sv,ofmt);
511         break;
512     case '!':
513 #ifdef VMS
514         sv_setnv(sv, (double)((errno == EVMSERR) ? vaxc$errno : errno));
515         sv_setpv(sv, errno ? Strerror(errno) : "");
516 #else
517         {
518         int saveerrno = errno;
519         sv_setnv(sv, (double)errno);
520 #ifdef OS2
521         if (errno == errno_isOS2) sv_setpv(sv, os2error(Perl_rc));
522         else
523 #endif
524         sv_setpv(sv, errno ? Strerror(errno) : "");
525         errno = saveerrno;
526         }
527 #endif
528         SvNOK_on(sv);   /* what a wonderful hack! */
529         break;
530     case '<':
531         sv_setiv(sv, (IV)uid);
532         break;
533     case '>':
534         sv_setiv(sv, (IV)euid);
535         break;
536     case '(':
537         sv_setiv(sv, (IV)gid);
538         s = buf;
539         (void)sprintf(s,"%d",(int)gid);
540         goto add_groups;
541     case ')':
542         sv_setiv(sv, (IV)egid);
543         s = buf;
544         (void)sprintf(s,"%d",(int)egid);
545       add_groups:
546         while (*s) s++;
547 #ifdef HAS_GETGROUPS
548         {
549             Groups_t gary[NGROUPS];
550
551             i = getgroups(NGROUPS,gary);
552             while (--i >= 0) {
553                 (void)sprintf(s," %d", (int)gary[i]);
554                 while (*s) s++;
555             }
556         }
557 #endif
558         sv_setpv(sv,buf);
559         SvIOK_on(sv);   /* what a wonderful hack! */
560         break;
561     case '*':
562         break;
563     case '0':
564         break;
565     }
566     return 0;
567 }
568
569 int
570 magic_getuvar(sv, mg)
571 SV *sv;
572 MAGIC *mg;
573 {
574     struct ufuncs *uf = (struct ufuncs *)mg->mg_ptr;
575
576     if (uf && uf->uf_val)
577         (*uf->uf_val)(uf->uf_index, sv);
578     return 0;
579 }
580
581 int
582 magic_setenv(sv,mg)
583 SV* sv;
584 MAGIC* mg;
585 {
586     register char *s;
587     char *ptr;
588     STRLEN len;
589     I32 i;
590     s = SvPV(sv,len);
591     ptr = MgPV(mg);
592     my_setenv(ptr, s);
593 #ifdef DYNAMIC_ENV_FETCH
594      /* We just undefd an environment var.  Is a replacement */
595      /* waiting in the wings? */
596     if (!len) {
597         HE *envhe;
598         SV *keysv;
599         if (mg->mg_len == HEf_SVKEY) keysv = (SV *)mg->mg_ptr;
600         else keysv = newSVpv(mg->mg_ptr,mg->mg_len);
601         if (envhe = hv_fetch_ent(GvHVn(envgv),keysv,FALSE,0))
602             s = SvPV(HeVAL(envhe),len);
603         if (mg->mg_len != HEf_SVKEY) SvREFCNT_dec(keysv);
604     }
605 #endif
606                             /* And you'll never guess what the dog had */
607                             /*   in its mouth... */
608     if (tainting) {
609         if (s && strEQ(ptr,"PATH")) {
610             char *strend = s + len;
611
612             while (s < strend) {
613                 s = cpytill(tokenbuf,s,strend,':',&i);
614                 s++;
615                 if (*tokenbuf != '/'
616                   || (Stat(tokenbuf,&statbuf) && (statbuf.st_mode & 2)) )
617                     MgTAINTEDDIR_on(mg);
618             }
619         }
620     }
621     return 0;
622 }
623
624 int
625 magic_clearenv(sv,mg)
626 SV* sv;
627 MAGIC* mg;
628 {
629     my_setenv(MgPV(mg),Nullch);
630     return 0;
631 }
632
633 int
634 magic_getsig(sv,mg)
635 SV* sv;
636 MAGIC* mg;
637 {
638     I32 i;
639     /* Are we fetching a signal entry? */
640     i = whichsig(MgPV(mg));
641     if (i) {
642         if(psig_ptr[i])
643             sv_setsv(sv,psig_ptr[i]);
644         else {
645             Sighandler_t sigstate = rsignal_state(i);
646
647             /* cache state so we don't fetch it again */
648             if(sigstate == SIG_IGN)
649                 sv_setpv(sv,"IGNORE");
650             else
651                 sv_setsv(sv,&sv_undef);
652             psig_ptr[i] = SvREFCNT_inc(sv);
653             SvTEMP_off(sv);
654         }
655     }
656     return 0;
657 }
658 int
659 magic_clearsig(sv,mg)
660 SV* sv;
661 MAGIC* mg;
662 {
663     I32 i;
664     /* Are we clearing a signal entry? */
665     i = whichsig(MgPV(mg));
666     if (i) {
667         if(psig_ptr[i]) {
668             SvREFCNT_dec(psig_ptr[i]);
669             psig_ptr[i]=0;
670         }
671         if(psig_name[i]) {
672             SvREFCNT_dec(psig_name[i]);
673             psig_name[i]=0;
674         }
675     }
676     return 0;
677 }
678
679 int
680 magic_setsig(sv,mg)
681 SV* sv;
682 MAGIC* mg;
683 {
684     register char *s;
685     I32 i;
686     SV** svp;
687
688     s = MgPV(mg);
689     if (*s == '_') {
690         if (strEQ(s,"__DIE__"))
691             svp = &diehook;
692         else if (strEQ(s,"__WARN__"))
693             svp = &warnhook;
694         else if (strEQ(s,"__PARSE__"))
695             svp = &parsehook;
696         else
697             croak("No such hook: %s", s);
698         i = 0;
699         if (*svp) {
700             SvREFCNT_dec(*svp);
701             *svp = 0;
702         }
703     }
704     else {
705         i = whichsig(s);        /* ...no, a brick */
706         if (!i) {
707             if (dowarn || strEQ(s,"ALARM"))
708                 warn("No such signal: SIG%s", s);
709             return 0;
710         }
711         if(psig_ptr[i])
712             SvREFCNT_dec(psig_ptr[i]);
713         psig_ptr[i] = SvREFCNT_inc(sv);
714         if(psig_name[i])
715             SvREFCNT_dec(psig_name[i]);
716         psig_name[i] = newSVpv(s,strlen(s));
717         SvTEMP_off(sv); /* Make sure it doesn't go away on us */
718         SvREADONLY_on(psig_name[i]);
719     }
720     if (SvTYPE(sv) == SVt_PVGV || SvROK(sv)) {
721         if (i)
722             (void)rsignal(i, sighandler);
723         else
724             *svp = SvREFCNT_inc(sv);
725         return 0;
726     }
727     s = SvPV_force(sv,na);
728     if (strEQ(s,"IGNORE")) {
729         if (i)
730             (void)rsignal(i, SIG_IGN);
731         else
732             *svp = 0;
733     }
734     else if (strEQ(s,"DEFAULT") || !*s) {
735         if (i)
736             (void)rsignal(i, SIG_DFL);
737         else
738             *svp = 0;
739     }
740     else {
741         if(hints & HINT_STRICT_REFS)
742                 die(no_symref,s,"a subroutine");
743         if (!strchr(s,':') && !strchr(s,'\'')) {
744             sprintf(tokenbuf, "main::%s",s);
745             sv_setpv(sv,tokenbuf);
746         }
747         if (i)
748             (void)rsignal(i, sighandler);
749         else
750             *svp = SvREFCNT_inc(sv);
751     }
752     return 0;
753 }
754
755 int
756 magic_setisa(sv,mg)
757 SV* sv;
758 MAGIC* mg;
759 {
760     sub_generation++;
761     return 0;
762 }
763
764 #ifdef OVERLOAD
765
766 int
767 magic_setamagic(sv,mg)
768 SV* sv;
769 MAGIC* mg;
770 {
771     /* HV_badAMAGIC_on(Sv_STASH(sv)); */
772     amagic_generation++;
773
774     return 0;
775 }
776 #endif /* OVERLOAD */
777
778 int
779 magic_setnkeys(sv,mg)
780 SV* sv;
781 MAGIC* mg;
782 {
783     if (LvTARG(sv)) {
784         hv_ksplit((HV*)LvTARG(sv), SvIV(sv));
785         LvTARG(sv) = Nullsv;    /* Don't allow a ref to reassign this. */
786     }
787     return 0;
788 }
789
790 static int
791 magic_methpack(sv,mg,meth)
792 SV* sv;
793 MAGIC* mg;
794 char *meth;
795 {
796     dSP;
797
798     ENTER;
799     SAVETMPS;
800     PUSHMARK(sp);
801     EXTEND(sp, 2);
802     PUSHs(mg->mg_obj);
803     if (mg->mg_ptr) {
804         if (mg->mg_len >= 0)
805             PUSHs(sv_2mortal(newSVpv(mg->mg_ptr, mg->mg_len)));
806         else if (mg->mg_len == HEf_SVKEY)
807             PUSHs((SV*)mg->mg_ptr);
808     }
809     else if (mg->mg_type == 'p')
810         PUSHs(sv_2mortal(newSViv(mg->mg_len)));
811     PUTBACK;
812
813     if (perl_call_method(meth, G_SCALAR))
814         sv_setsv(sv, *stack_sp--);
815
816     FREETMPS;
817     LEAVE;
818     return 0;
819 }
820
821 int
822 magic_getpack(sv,mg)
823 SV* sv;
824 MAGIC* mg;
825 {
826     magic_methpack(sv,mg,"FETCH");
827     if (mg->mg_ptr)
828         mg->mg_flags |= MGf_GSKIP;
829     return 0;
830 }
831
832 int
833 magic_setpack(sv,mg)
834 SV* sv;
835 MAGIC* mg;
836 {
837     dSP;
838
839     PUSHMARK(sp);
840     EXTEND(sp, 3);
841     PUSHs(mg->mg_obj);
842     if (mg->mg_ptr) {
843         if (mg->mg_len >= 0)
844             PUSHs(sv_2mortal(newSVpv(mg->mg_ptr, mg->mg_len)));
845         else if (mg->mg_len == HEf_SVKEY)
846             PUSHs((SV*)mg->mg_ptr);
847     }
848     else if (mg->mg_type == 'p')
849         PUSHs(sv_2mortal(newSViv(mg->mg_len)));
850     PUSHs(sv);
851     PUTBACK;
852
853     perl_call_method("STORE", G_SCALAR|G_DISCARD);
854
855     return 0;
856 }
857
858 int
859 magic_clearpack(sv,mg)
860 SV* sv;
861 MAGIC* mg;
862 {
863     return magic_methpack(sv,mg,"DELETE");
864 }
865
866 int magic_wipepack(sv,mg)
867 SV* sv;
868 MAGIC* mg;
869 {
870     dSP;
871
872     PUSHMARK(sp);
873     XPUSHs(mg->mg_obj);
874     PUTBACK;
875
876     perl_call_method("CLEAR", G_SCALAR|G_DISCARD);
877
878     return 0;
879 }
880
881 int
882 magic_nextpack(sv,mg,key)
883 SV* sv;
884 MAGIC* mg;
885 SV* key;
886 {
887     dSP;
888     char *meth = SvOK(key) ? "NEXTKEY" : "FIRSTKEY";
889
890     ENTER;
891     SAVETMPS;
892     PUSHMARK(sp);
893     EXTEND(sp, 2);
894     PUSHs(mg->mg_obj);
895     if (SvOK(key))
896         PUSHs(key);
897     PUTBACK;
898
899     if (perl_call_method(meth, G_SCALAR))
900         sv_setsv(key, *stack_sp--);
901
902     FREETMPS;
903     LEAVE;
904     return 0;
905 }
906
907 int
908 magic_existspack(sv,mg)
909 SV* sv;
910 MAGIC* mg;
911 {
912     return magic_methpack(sv,mg,"EXISTS");
913
914
915 int
916 magic_setdbline(sv,mg)
917 SV* sv;
918 MAGIC* mg;
919 {
920     OP *o;
921     I32 i;
922     GV* gv;
923     SV** svp;
924
925     gv = DBline;
926     i = SvTRUE(sv);
927     svp = av_fetch(GvAV(gv),
928                      atoi(MgPV(mg)), FALSE);
929     if (svp && SvIOKp(*svp) && (o = (OP*)SvSTASH(*svp)))
930         o->op_private = i;
931     else
932         warn("Can't break at that line\n");
933     return 0;
934 }
935
936 int
937 magic_getarylen(sv,mg)
938 SV* sv;
939 MAGIC* mg;
940 {
941     sv_setiv(sv, AvFILL((AV*)mg->mg_obj) + curcop->cop_arybase);
942     return 0;
943 }
944
945 int
946 magic_setarylen(sv,mg)
947 SV* sv;
948 MAGIC* mg;
949 {
950     av_fill((AV*)mg->mg_obj, SvIV(sv) - curcop->cop_arybase);
951     return 0;
952 }
953
954 int
955 magic_getpos(sv,mg)
956 SV* sv;
957 MAGIC* mg;
958 {
959     SV* lsv = LvTARG(sv);
960     
961     if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv)) {
962         mg = mg_find(lsv, 'g');
963         if (mg && mg->mg_len >= 0) {
964             sv_setiv(sv, mg->mg_len + curcop->cop_arybase);
965             return 0;
966         }
967     }
968     (void)SvOK_off(sv);
969     return 0;
970 }
971
972 int
973 magic_setpos(sv,mg)
974 SV* sv;
975 MAGIC* mg;
976 {
977     SV* lsv = LvTARG(sv);
978     SSize_t pos;
979     STRLEN len;
980
981     mg = 0;
982     
983     if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv))
984         mg = mg_find(lsv, 'g');
985     if (!mg) {
986         if (!SvOK(sv))
987             return 0;
988         sv_magic(lsv, (SV*)0, 'g', Nullch, 0);
989         mg = mg_find(lsv, 'g');
990     }
991     else if (!SvOK(sv)) {
992         mg->mg_len = -1;
993         return 0;
994     }
995     len = SvPOK(lsv) ? SvCUR(lsv) : sv_len(lsv);
996
997     pos = SvIV(sv) - curcop->cop_arybase;
998     if (pos < 0) {
999         pos += len;
1000         if (pos < 0)
1001             pos = 0;
1002     }
1003     else if (pos > len)
1004         pos = len;
1005     mg->mg_len = pos;
1006     mg->mg_flags &= ~MGf_MINMATCH;
1007
1008     return 0;
1009 }
1010
1011 int
1012 magic_getglob(sv,mg)
1013 SV* sv;
1014 MAGIC* mg;
1015 {
1016     if (SvFAKE(sv)) {                   /* FAKE globs can get coerced */
1017         SvFAKE_off(sv);
1018         gv_efullname3(sv,((GV*)sv), "*");
1019         SvFAKE_on(sv);
1020     }
1021     else
1022         gv_efullname3(sv,((GV*)sv), "*");       /* a gv value, be nice */
1023     return 0;
1024 }
1025
1026 int
1027 magic_setglob(sv,mg)
1028 SV* sv;
1029 MAGIC* mg;
1030 {
1031     register char *s;
1032     GV* gv;
1033
1034     if (!SvOK(sv))
1035         return 0;
1036     s = SvPV(sv, na);
1037     if (*s == '*' && s[1])
1038         s++;
1039     gv = gv_fetchpv(s,TRUE, SVt_PVGV);
1040     if (sv == (SV*)gv)
1041         return 0;
1042     if (GvGP(sv))
1043         gp_free((GV*)sv);
1044     GvGP(sv) = gp_ref(GvGP(gv));
1045     return 0;
1046 }
1047
1048 int
1049 magic_setsubstr(sv,mg)
1050 SV* sv;
1051 MAGIC* mg;
1052 {
1053     STRLEN len;
1054     char *tmps = SvPV(sv,len);
1055     sv_insert(LvTARG(sv),LvTARGOFF(sv),LvTARGLEN(sv), tmps, len);
1056     return 0;
1057 }
1058
1059 int
1060 magic_gettaint(sv,mg)
1061 SV* sv;
1062 MAGIC* mg;
1063 {
1064     TAINT_IF((mg->mg_len & 1) ||
1065              (mg->mg_len & 2) && mg->mg_obj == sv);     /* kludge */
1066     return 0;
1067 }
1068
1069 int
1070 magic_settaint(sv,mg)
1071 SV* sv;
1072 MAGIC* mg;
1073 {
1074     if (localizing) {
1075         if (localizing == 1)
1076             mg->mg_len <<= 1;
1077         else
1078             mg->mg_len >>= 1;
1079     }
1080     else if (tainted)
1081         mg->mg_len |= 1;
1082     else
1083         mg->mg_len &= ~1;
1084     return 0;
1085 }
1086
1087 int
1088 magic_setvec(sv,mg)
1089 SV* sv;
1090 MAGIC* mg;
1091 {
1092     do_vecset(sv);      /* XXX slurp this routine */
1093     return 0;
1094 }
1095
1096 int
1097 magic_getitervar(sv,mg)
1098 SV* sv;
1099 MAGIC* mg;
1100 {
1101     SV *targ = Nullsv;
1102     if (LvTARGLEN(sv)) {
1103         AV* av = (AV*)LvTARG(sv);
1104         if (LvTARGOFF(sv) <= AvFILL(av))
1105             targ = AvARRAY(av)[LvTARGOFF(sv)];
1106     }
1107     else
1108         targ = LvTARG(sv);
1109     sv_setsv(sv, targ ? targ : &sv_undef);
1110     return 0;
1111 }
1112
1113 int
1114 magic_setitervar(sv,mg)
1115 SV* sv;
1116 MAGIC* mg;
1117 {
1118     if (LvTARGLEN(sv))
1119         vivify_itervar(sv);
1120     if (LvTARG(sv))
1121         sv_setsv(LvTARG(sv), sv);
1122     return 0;
1123 }
1124
1125 int
1126 magic_freeitervar(sv,mg)
1127 SV* sv;
1128 MAGIC* mg;
1129 {
1130     SvREFCNT_dec(LvTARG(sv));
1131     return 0;
1132 }
1133
1134 void
1135 vivify_itervar(sv)
1136 SV* sv;
1137 {
1138     AV* av;
1139
1140     if (!LvTARGLEN(sv))
1141         return;
1142     av = (AV*)LvTARG(sv);
1143     if (LvTARGOFF(sv) <= AvFILL(av)) {
1144         SV** svp = AvARRAY(av) + LvTARGOFF(sv);
1145         LvTARG(sv) = newSVsv(*svp);
1146         SvREFCNT_dec(*svp);
1147         *svp = SvREFCNT_inc(LvTARG(sv));
1148     }
1149     else
1150         LvTARG(sv) = Nullsv;
1151     SvREFCNT_dec(av);
1152     LvTARGLEN(sv) = 0;
1153 }
1154
1155 int
1156 magic_setmglob(sv,mg)
1157 SV* sv;
1158 MAGIC* mg;
1159 {
1160     mg->mg_len = -1;
1161     SvSCREAM_off(sv);
1162     return 0;
1163 }
1164
1165 int
1166 magic_setbm(sv,mg)
1167 SV* sv;
1168 MAGIC* mg;
1169 {
1170     sv_unmagic(sv, 'B');
1171     SvVALID_off(sv);
1172     return 0;
1173 }
1174
1175 int
1176 magic_setfm(sv,mg)
1177 SV* sv;
1178 MAGIC* mg;
1179 {
1180     sv_unmagic(sv, 'f');
1181     SvCOMPILED_off(sv);
1182     return 0;
1183 }
1184
1185 int
1186 magic_setuvar(sv,mg)
1187 SV* sv;
1188 MAGIC* mg;
1189 {
1190     struct ufuncs *uf = (struct ufuncs *)mg->mg_ptr;
1191
1192     if (uf && uf->uf_set)
1193         (*uf->uf_set)(uf->uf_index, sv);
1194     return 0;
1195 }
1196
1197 #ifdef USE_LOCALE_COLLATE
1198 int
1199 magic_setcollxfrm(sv,mg)
1200 SV* sv;
1201 MAGIC* mg;
1202 {
1203     /*
1204      * RenĂ© Descartes said "I think not."
1205      * and vanished with a faint plop.
1206      */
1207     if (mg->mg_ptr) {
1208         Safefree(mg->mg_ptr);
1209         mg->mg_ptr = NULL;
1210         mg->mg_len = -1;
1211     }
1212     return 0;
1213 }
1214 #endif /* USE_LOCALE_COLLATE */
1215
1216 int
1217 magic_set(sv,mg)
1218 SV* sv;
1219 MAGIC* mg;
1220 {
1221     register char *s;
1222     I32 i;
1223     STRLEN len;
1224     switch (*mg->mg_ptr) {
1225     case '\001':        /* ^A */
1226         sv_setsv(bodytarget, sv);
1227         break;
1228     case '\004':        /* ^D */
1229         debug = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) | 0x80000000;
1230         DEBUG_x(dump_all());
1231         break;
1232     case '\005':  /* ^E */
1233 #ifdef VMS
1234         set_vaxc_errno(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
1235 #else
1236         /* will anyone ever use this? */
1237         SETERRNO(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv), 4);
1238 #endif
1239         break;
1240     case '\006':        /* ^F */
1241         maxsysfd = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1242         break;
1243     case '\010':        /* ^H */
1244         hints = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1245         break;
1246     case '\t':  /* ^I */
1247         if (inplace)
1248             Safefree(inplace);
1249         if (SvOK(sv))
1250             inplace = savepv(SvPV(sv,na));
1251         else
1252             inplace = Nullch;
1253         break;
1254     case '\017':        /* ^O */
1255         if (osname)
1256             Safefree(osname);
1257         if (SvOK(sv))
1258             osname = savepv(SvPV(sv,na));
1259         else
1260             osname = Nullch;
1261         break;
1262     case '\020':        /* ^P */
1263         i = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1264         if (i != perldb) {
1265             if (perldb)
1266                 oldlastpm = curpm;
1267             else
1268                 curpm = oldlastpm;
1269         }
1270         perldb = i;
1271         break;
1272     case '\023':        /* ^S */
1273         STATUS_NATIVE_SET(SvIOK(sv) ? SvUVX(sv) : sv_2uv(sv));
1274         break;
1275     case '\024':        /* ^T */
1276 #ifdef BIG_TIME
1277         basetime = (Time_t)(SvNOK(sv) ? SvNVX(sv) : sv_2nv(sv));
1278 #else
1279         basetime = (Time_t)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
1280 #endif
1281         break;
1282     case '\027':        /* ^W */
1283         dowarn = (bool)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
1284         break;
1285     case '.':
1286         if (localizing) {
1287             if (localizing == 1)
1288                 save_sptr((SV**)&last_in_gv);
1289         }
1290         else if (SvOK(sv) && GvIO(last_in_gv))
1291             IoLINES(GvIOp(last_in_gv)) = (long)SvIV(sv);
1292         break;
1293     case '^':
1294         Safefree(IoTOP_NAME(GvIOp(defoutgv)));
1295         IoTOP_NAME(GvIOp(defoutgv)) = s = savepv(SvPV(sv,na));
1296         IoTOP_GV(GvIOp(defoutgv)) = gv_fetchpv(s,TRUE, SVt_PVIO);
1297         break;
1298     case '~':
1299         Safefree(IoFMT_NAME(GvIOp(defoutgv)));
1300         IoFMT_NAME(GvIOp(defoutgv)) = s = savepv(SvPV(sv,na));
1301         IoFMT_GV(GvIOp(defoutgv)) = gv_fetchpv(s,TRUE, SVt_PVIO);
1302         break;
1303     case '=':
1304         IoPAGE_LEN(GvIOp(defoutgv)) = (long)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
1305         break;
1306     case '-':
1307         IoLINES_LEFT(GvIOp(defoutgv)) = (long)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
1308         if (IoLINES_LEFT(GvIOp(defoutgv)) < 0L)
1309             IoLINES_LEFT(GvIOp(defoutgv)) = 0L;
1310         break;
1311     case '%':
1312         IoPAGE(GvIOp(defoutgv)) = (long)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
1313         break;
1314     case '|':
1315         IoFLAGS(GvIOp(defoutgv)) &= ~IOf_FLUSH;
1316         if ((SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) != 0) {
1317             IoFLAGS(GvIOp(defoutgv)) |= IOf_FLUSH;
1318         }
1319         break;
1320     case '*':
1321         i = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1322         multiline = (i != 0);
1323         break;
1324     case '/':
1325         SvREFCNT_dec(nrs);
1326         nrs = newSVsv(sv);
1327         SvREFCNT_dec(rs);
1328         rs = SvREFCNT_inc(nrs);
1329         break;
1330     case '\\':
1331         if (ors)
1332             Safefree(ors);
1333         if (SvOK(sv) || SvGMAGICAL(sv))
1334             ors = savepv(SvPV(sv,orslen));
1335         else {
1336             ors = Nullch;
1337             orslen = 0;
1338         }
1339         break;
1340     case ',':
1341         if (ofs)
1342             Safefree(ofs);
1343         ofs = savepv(SvPV(sv, ofslen));
1344         break;
1345     case '#':
1346         if (ofmt)
1347             Safefree(ofmt);
1348         ofmt = savepv(SvPV(sv,na));
1349         break;
1350     case '[':
1351         compiling.cop_arybase = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1352         break;
1353     case '?':
1354         STATUS_POSIX_SET(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
1355         break;
1356     case '!':
1357         SETERRNO(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv),
1358                  (SvIV(sv) == EVMSERR) ? 4 : vaxc$errno);
1359         break;
1360     case '<':
1361         uid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1362         if (delaymagic) {
1363             delaymagic |= DM_RUID;
1364             break;                              /* don't do magic till later */
1365         }
1366 #ifdef HAS_SETRUID
1367         (void)setruid((Uid_t)uid);
1368 #else
1369 #ifdef HAS_SETREUID
1370         (void)setreuid((Uid_t)uid, (Uid_t)-1);
1371 #else
1372 #ifdef HAS_SETRESUID
1373       (void)setresuid((Uid_t)uid, (Uid_t)-1, (Uid_t)-1);
1374 #else
1375         if (uid == euid)                /* special case $< = $> */
1376             (void)setuid(uid);
1377         else {
1378             uid = (I32)getuid();
1379             croak("setruid() not implemented");
1380         }
1381 #endif
1382 #endif
1383 #endif
1384         uid = (I32)getuid();
1385         tainting |= (uid && (euid != uid || egid != gid));
1386         break;
1387     case '>':
1388         euid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1389         if (delaymagic) {
1390             delaymagic |= DM_EUID;
1391             break;                              /* don't do magic till later */
1392         }
1393 #ifdef HAS_SETEUID
1394         (void)seteuid((Uid_t)euid);
1395 #else
1396 #ifdef HAS_SETREUID
1397         (void)setreuid((Uid_t)-1, (Uid_t)euid);
1398 #else
1399 #ifdef HAS_SETRESUID
1400         (void)setresuid((Uid_t)-1, (Uid_t)euid, (Uid_t)-1);
1401 #else
1402         if (euid == uid)                /* special case $> = $< */
1403             setuid(euid);
1404         else {
1405             euid = (I32)geteuid();
1406             croak("seteuid() not implemented");
1407         }
1408 #endif
1409 #endif
1410 #endif
1411         euid = (I32)geteuid();
1412         tainting |= (uid && (euid != uid || egid != gid));
1413         break;
1414     case '(':
1415         gid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1416         if (delaymagic) {
1417             delaymagic |= DM_RGID;
1418             break;                              /* don't do magic till later */
1419         }
1420 #ifdef HAS_SETRGID
1421         (void)setrgid((Gid_t)gid);
1422 #else
1423 #ifdef HAS_SETREGID
1424         (void)setregid((Gid_t)gid, (Gid_t)-1);
1425 #else
1426 #ifdef HAS_SETRESGID
1427       (void)setresgid((Gid_t)gid, (Gid_t)-1, (Gid_t) 1);
1428 #else
1429         if (gid == egid)                        /* special case $( = $) */
1430             (void)setgid(gid);
1431         else {
1432             gid = (I32)getgid();
1433             croak("setrgid() not implemented");
1434         }
1435 #endif
1436 #endif
1437 #endif
1438         gid = (I32)getgid();
1439         tainting |= (uid && (euid != uid || egid != gid));
1440         break;
1441     case ')':
1442         egid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1443         if (delaymagic) {
1444             delaymagic |= DM_EGID;
1445             break;                              /* don't do magic till later */
1446         }
1447 #ifdef HAS_SETEGID
1448         (void)setegid((Gid_t)egid);
1449 #else
1450 #ifdef HAS_SETREGID
1451         (void)setregid((Gid_t)-1, (Gid_t)egid);
1452 #else
1453 #ifdef HAS_SETRESGID
1454         (void)setresgid((Gid_t)-1, (Gid_t)egid, (Gid_t)-1);
1455 #else
1456         if (egid == gid)                        /* special case $) = $( */
1457             (void)setgid(egid);
1458         else {
1459             egid = (I32)getegid();
1460             croak("setegid() not implemented");
1461         }
1462 #endif
1463 #endif
1464 #endif
1465         egid = (I32)getegid();
1466         tainting |= (uid && (euid != uid || egid != gid));
1467         break;
1468     case ':':
1469         chopset = SvPV_force(sv,na);
1470         break;
1471     case '0':
1472         if (!origalen) {
1473             s = origargv[0];
1474             s += strlen(s);
1475             /* See if all the arguments are contiguous in memory */
1476             for (i = 1; i < origargc; i++) {
1477                 if (origargv[i] == s + 1)
1478                     s += strlen(++s);   /* this one is ok too */
1479             }
1480             /* can grab env area too? */
1481             if (origenviron && origenviron[0] == s + 1) {
1482                 my_setenv("NoNeSuCh", Nullch);
1483                                             /* force copy of environment */
1484                 for (i = 0; origenviron[i]; i++)
1485                     if (origenviron[i] == s + 1)
1486                         s += strlen(++s);
1487             }
1488             origalen = s - origargv[0];
1489         }
1490         s = SvPV_force(sv,len);
1491         i = len;
1492         if (i >= origalen) {
1493             i = origalen;
1494             SvCUR_set(sv, i);
1495             *SvEND(sv) = '\0';
1496             Copy(s, origargv[0], i, char);
1497         }
1498         else {
1499             Copy(s, origargv[0], i, char);
1500             s = origargv[0]+i;
1501             *s++ = '\0';
1502             while (++i < origalen)
1503                 *s++ = ' ';
1504             s = origargv[0]+i;
1505             for (i = 1; i < origargc; i++)
1506                 origargv[i] = Nullch;
1507         }
1508         break;
1509     }
1510     return 0;
1511 }
1512
1513 I32
1514 whichsig(sig)
1515 char *sig;
1516 {
1517     register char **sigv;
1518
1519     for (sigv = sig_name+1; *sigv; sigv++)
1520         if (strEQ(sig,*sigv))
1521             return sig_num[sigv - sig_name];
1522 #ifdef SIGCLD
1523     if (strEQ(sig,"CHLD"))
1524         return SIGCLD;
1525 #endif
1526 #ifdef SIGCHLD
1527     if (strEQ(sig,"CLD"))
1528         return SIGCHLD;
1529 #endif
1530     return 0;
1531 }
1532
1533 Signal_t
1534 sighandler(sig)
1535 int sig;
1536 {
1537     dSP;
1538     GV *gv;
1539     HV *st;
1540     SV *sv;
1541     CV *cv;
1542     AV *oldstack;
1543     
1544     if(!psig_ptr[sig])
1545         die("Signal SIG%s received, but no signal handler set.\n",
1546         sig_name[sig]);
1547
1548     cv = sv_2cv(psig_ptr[sig],&st,&gv,TRUE);
1549     if (!cv || !CvROOT(cv)) {
1550         if (dowarn)
1551             warn("SIG%s handler \"%s\" not defined.\n",
1552                 sig_name[sig], GvENAME(gv) );
1553         return;
1554     }
1555
1556     oldstack = curstack;
1557     if (curstack != signalstack)
1558         AvFILL(signalstack) = 0;
1559     SWITCHSTACK(curstack, signalstack);
1560
1561     if(psig_name[sig])
1562         sv = SvREFCNT_inc(psig_name[sig]);
1563     else {
1564         sv = sv_newmortal();
1565         sv_setpv(sv,sig_name[sig]);
1566     }
1567     PUSHMARK(sp);
1568     PUSHs(sv);
1569     PUTBACK;
1570
1571     perl_call_sv((SV*)cv, G_DISCARD);
1572
1573     SWITCHSTACK(signalstack, oldstack);
1574
1575     return;
1576 }