Change the value of ${^TAINT} : 0 without taint checks,
[p5sagit/p5-mst-13.2.git] / mg.c
1 /*    mg.c
2  *
3  *    Copyright (c) 1991-2002, 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 /*
16 =head1 Magical Functions
17 */
18
19 #include "EXTERN.h"
20 #define PERL_IN_MG_C
21 #include "perl.h"
22
23 #if defined(HAS_GETGROUPS) || defined(HAS_SETGROUPS)
24 #  ifndef NGROUPS
25 #    define NGROUPS 32
26 #  endif
27 #  ifdef I_GRP
28 #    include <grp.h>
29 #  endif
30 #endif
31
32 #ifdef __hpux
33 #  include <sys/pstat.h>
34 #endif
35
36 /* if you only have signal() and it resets on each signal, FAKE_PERSISTENT_SIGNAL_HANDLERS fixes */
37 #if !defined(HAS_SIGACTION) && defined(VMS)
38 #  define  FAKE_PERSISTENT_SIGNAL_HANDLERS
39 #endif
40 /* if we're doing kill() with sys$sigprc on VMS, FAKE_DEFAULT_SIGNAL_HANDLERS */
41 #if defined(KILL_BY_SIGPRC)
42 #  define  FAKE_DEFAULT_SIGNAL_HANDLERS
43 #endif
44
45 static void restore_magic(pTHX_ void *p);
46 static void unwind_handler_stack(pTHX_ void *p);
47
48 /*
49  * Use the "DESTRUCTOR" scope cleanup to reinstate magic.
50  */
51
52 struct magic_state {
53     SV* mgs_sv;
54     U32 mgs_flags;
55     I32 mgs_ss_ix;
56 };
57 /* MGS is typedef'ed to struct magic_state in perl.h */
58
59 STATIC void
60 S_save_magic(pTHX_ I32 mgs_ix, SV *sv)
61 {
62     MGS* mgs;
63     assert(SvMAGICAL(sv));
64 #ifdef PERL_COPY_ON_WRITE
65     /* Turning READONLY off for a copy-on-write scalar is a bad idea.  */
66     if (SvIsCOW(sv))
67       sv_force_normal(sv);
68 #endif
69
70     SAVEDESTRUCTOR_X(restore_magic, INT2PTR(void*, (IV)mgs_ix));
71
72     mgs = SSPTR(mgs_ix, MGS*);
73     mgs->mgs_sv = sv;
74     mgs->mgs_flags = SvMAGICAL(sv) | SvREADONLY(sv);
75     mgs->mgs_ss_ix = PL_savestack_ix;   /* points after the saved destructor */
76
77     SvMAGICAL_off(sv);
78     SvREADONLY_off(sv);
79     SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_NOK|SVp_POK)) >> PRIVSHIFT;
80 }
81
82 /*
83 =for apidoc mg_magical
84
85 Turns on the magical status of an SV.  See C<sv_magic>.
86
87 =cut
88 */
89
90 void
91 Perl_mg_magical(pTHX_ SV *sv)
92 {
93     MAGIC* mg;
94     for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
95         MGVTBL* vtbl = mg->mg_virtual;
96         if (vtbl) {
97             if (vtbl->svt_get && !(mg->mg_flags & MGf_GSKIP))
98                 SvGMAGICAL_on(sv);
99             if (vtbl->svt_set)
100                 SvSMAGICAL_on(sv);
101             if (!(SvFLAGS(sv) & (SVs_GMG|SVs_SMG)) || vtbl->svt_clear)
102                 SvRMAGICAL_on(sv);
103         }
104     }
105 }
106
107 /*
108 =for apidoc mg_get
109
110 Do magic after a value is retrieved from the SV.  See C<sv_magic>.
111
112 =cut
113 */
114
115 int
116 Perl_mg_get(pTHX_ SV *sv)
117 {
118     int new = 0;
119     MAGIC *newmg, *head, *cur, *mg;
120     I32 mgs_ix = SSNEW(sizeof(MGS));
121
122     save_magic(mgs_ix, sv);
123
124     /* We must call svt_get(sv, mg) for each valid entry in the linked
125        list of magic. svt_get() may delete the current entry, add new
126        magic to the head of the list, or upgrade the SV. AMS 20010810 */
127
128     newmg = cur = head = mg = SvMAGIC(sv);
129     while (mg) {
130         MGVTBL *vtbl = mg->mg_virtual;
131
132         if (!(mg->mg_flags & MGf_GSKIP) && vtbl && vtbl->svt_get) {
133             CALL_FPTR(vtbl->svt_get)(aTHX_ sv, mg);
134             /* Don't restore the flags for this entry if it was deleted. */
135             if (mg->mg_flags & MGf_GSKIP)
136                 (SSPTR(mgs_ix, MGS *))->mgs_flags = 0;
137         }
138
139         mg = mg->mg_moremagic;
140
141         if (new) {
142             /* Have we finished with the new entries we saw? Start again
143                where we left off (unless there are more new entries). */
144             if (mg == head) {
145                 new  = 0;
146                 mg   = cur;
147                 head = newmg;
148             }
149         }
150
151         /* Were any new entries added? */
152         if (!new && (newmg = SvMAGIC(sv)) != head) {
153             new = 1;
154             cur = mg;
155             mg  = newmg;
156         }
157     }
158
159     restore_magic(aTHX_ INT2PTR(void *, (IV)mgs_ix));
160     return 0;
161 }
162
163 /*
164 =for apidoc mg_set
165
166 Do magic after a value is assigned to the SV.  See C<sv_magic>.
167
168 =cut
169 */
170
171 int
172 Perl_mg_set(pTHX_ SV *sv)
173 {
174     I32 mgs_ix;
175     MAGIC* mg;
176     MAGIC* nextmg;
177
178     mgs_ix = SSNEW(sizeof(MGS));
179     save_magic(mgs_ix, sv);
180
181     for (mg = SvMAGIC(sv); mg; mg = nextmg) {
182         MGVTBL* vtbl = mg->mg_virtual;
183         nextmg = mg->mg_moremagic;      /* it may delete itself */
184         if (mg->mg_flags & MGf_GSKIP) {
185             mg->mg_flags &= ~MGf_GSKIP; /* setting requires another read */
186             (SSPTR(mgs_ix, MGS*))->mgs_flags = 0;
187         }
188         if (vtbl && vtbl->svt_set)
189             CALL_FPTR(vtbl->svt_set)(aTHX_ sv, mg);
190     }
191
192     restore_magic(aTHX_ INT2PTR(void*, (IV)mgs_ix));
193     return 0;
194 }
195
196 /*
197 =for apidoc mg_length
198
199 Report on the SV's length.  See C<sv_magic>.
200
201 =cut
202 */
203
204 U32
205 Perl_mg_length(pTHX_ SV *sv)
206 {
207     MAGIC* mg;
208     STRLEN len;
209
210     for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
211         MGVTBL* vtbl = mg->mg_virtual;
212         if (vtbl && vtbl->svt_len) {
213             I32 mgs_ix;
214
215             mgs_ix = SSNEW(sizeof(MGS));
216             save_magic(mgs_ix, sv);
217             /* omit MGf_GSKIP -- not changed here */
218             len = CALL_FPTR(vtbl->svt_len)(aTHX_ sv, mg);
219             restore_magic(aTHX_ INT2PTR(void*, (IV)mgs_ix));
220             return len;
221         }
222     }
223
224     if (DO_UTF8(sv))
225     {
226         U8 *s = (U8*)SvPV(sv, len);
227         len = Perl_utf8_length(aTHX_ s, s + len);
228     }
229     else
230         (void)SvPV(sv, len);
231     return len;
232 }
233
234 I32
235 Perl_mg_size(pTHX_ SV *sv)
236 {
237     MAGIC* mg;
238     I32 len;
239
240     for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
241         MGVTBL* vtbl = mg->mg_virtual;
242         if (vtbl && vtbl->svt_len) {
243             I32 mgs_ix;
244
245             mgs_ix = SSNEW(sizeof(MGS));
246             save_magic(mgs_ix, sv);
247             /* omit MGf_GSKIP -- not changed here */
248             len = CALL_FPTR(vtbl->svt_len)(aTHX_ sv, mg);
249             restore_magic(aTHX_ INT2PTR(void*, (IV)mgs_ix));
250             return len;
251         }
252     }
253
254     switch(SvTYPE(sv)) {
255         case SVt_PVAV:
256             len = AvFILLp((AV *) sv); /* Fallback to non-tied array */
257             return len;
258         case SVt_PVHV:
259             /* FIXME */
260         default:
261             Perl_croak(aTHX_ "Size magic not implemented");
262             break;
263     }
264     return 0;
265 }
266
267 /*
268 =for apidoc mg_clear
269
270 Clear something magical that the SV represents.  See C<sv_magic>.
271
272 =cut
273 */
274
275 int
276 Perl_mg_clear(pTHX_ SV *sv)
277 {
278     I32 mgs_ix;
279     MAGIC* mg;
280
281     mgs_ix = SSNEW(sizeof(MGS));
282     save_magic(mgs_ix, sv);
283
284     for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
285         MGVTBL* vtbl = mg->mg_virtual;
286         /* omit GSKIP -- never set here */
287
288         if (vtbl && vtbl->svt_clear)
289             CALL_FPTR(vtbl->svt_clear)(aTHX_ sv, mg);
290     }
291
292     restore_magic(aTHX_ INT2PTR(void*, (IV)mgs_ix));
293     return 0;
294 }
295
296 /*
297 =for apidoc mg_find
298
299 Finds the magic pointer for type matching the SV.  See C<sv_magic>.
300
301 =cut
302 */
303
304 MAGIC*
305 Perl_mg_find(pTHX_ SV *sv, int type)
306 {
307     MAGIC* mg;
308     if (!sv)
309         return 0;
310     for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
311         if (mg->mg_type == type)
312             return mg;
313     }
314     return 0;
315 }
316
317 /*
318 =for apidoc mg_copy
319
320 Copies the magic from one SV to another.  See C<sv_magic>.
321
322 =cut
323 */
324
325 int
326 Perl_mg_copy(pTHX_ SV *sv, SV *nsv, const char *key, I32 klen)
327 {
328     int count = 0;
329     MAGIC* mg;
330     for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
331         MGVTBL* vtbl = mg->mg_virtual;
332         if ((mg->mg_flags & MGf_COPY) && vtbl->svt_copy){
333             count += CALL_FPTR(vtbl->svt_copy)(aTHX_ sv, mg, nsv, key, klen);
334         }
335         else if (isUPPER(mg->mg_type)) {
336             sv_magic(nsv,
337                      mg->mg_type == PERL_MAGIC_tied ? SvTIED_obj(sv, mg) :
338                      (mg->mg_type == PERL_MAGIC_regdata && mg->mg_obj)
339                                                         ? sv : mg->mg_obj,
340                      toLOWER(mg->mg_type), key, klen);
341             count++;
342         }
343     }
344     return count;
345 }
346
347 /*
348 =for apidoc mg_free
349
350 Free any magic storage used by the SV.  See C<sv_magic>.
351
352 =cut
353 */
354
355 int
356 Perl_mg_free(pTHX_ SV *sv)
357 {
358     MAGIC* mg;
359     MAGIC* moremagic;
360     for (mg = SvMAGIC(sv); mg; mg = moremagic) {
361         MGVTBL* vtbl = mg->mg_virtual;
362         moremagic = mg->mg_moremagic;
363         if (vtbl && vtbl->svt_free)
364             CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
365         if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
366             if (mg->mg_len > 0)
367                 Safefree(mg->mg_ptr);
368             else if (mg->mg_len == HEf_SVKEY)
369                 SvREFCNT_dec((SV*)mg->mg_ptr);
370         }
371         if (mg->mg_flags & MGf_REFCOUNTED)
372             SvREFCNT_dec(mg->mg_obj);
373         Safefree(mg);
374     }
375     SvMAGIC(sv) = 0;
376     return 0;
377 }
378
379
380 #if !defined(NSIG) || defined(M_UNIX) || defined(M_XENIX)
381 #include <signal.h>
382 #endif
383
384 U32
385 Perl_magic_regdata_cnt(pTHX_ SV *sv, MAGIC *mg)
386 {
387     register REGEXP *rx;
388
389     if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
390         if (mg->mg_obj)         /* @+ */
391             return rx->nparens;
392         else                    /* @- */
393             return rx->lastparen;
394     }
395
396     return (U32)-1;
397 }
398
399 int
400 Perl_magic_regdatum_get(pTHX_ SV *sv, MAGIC *mg)
401 {
402     register I32 paren;
403     register I32 s;
404     register I32 i;
405     register REGEXP *rx;
406     I32 t;
407
408     if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
409         paren = mg->mg_len;
410         if (paren < 0)
411             return 0;
412         if (paren <= (I32)rx->nparens &&
413             (s = rx->startp[paren]) != -1 &&
414             (t = rx->endp[paren]) != -1)
415             {
416                 if (mg->mg_obj)         /* @+ */
417                     i = t;
418                 else                    /* @- */
419                     i = s;
420
421                 if (i > 0 && PL_reg_match_utf8) {
422                     char *b = rx->subbeg;
423                     if (b)
424                         i = Perl_utf8_length(aTHX_ (U8*)b, (U8*)(b+i));
425                 }
426
427                 sv_setiv(sv, i);
428             }
429     }
430     return 0;
431 }
432
433 int
434 Perl_magic_regdatum_set(pTHX_ SV *sv, MAGIC *mg)
435 {
436     Perl_croak(aTHX_ PL_no_modify);
437     /* NOT REACHED */
438     return 0;
439 }
440
441 U32
442 Perl_magic_len(pTHX_ SV *sv, MAGIC *mg)
443 {
444     register I32 paren;
445     register I32 i;
446     register REGEXP *rx;
447     I32 s1, t1;
448
449     switch (*mg->mg_ptr) {
450     case '1': case '2': case '3': case '4':
451     case '5': case '6': case '7': case '8': case '9': case '&':
452         if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
453
454             paren = atoi(mg->mg_ptr); /* $& is in [0] */
455           getparen:
456             if (paren <= (I32)rx->nparens &&
457                 (s1 = rx->startp[paren]) != -1 &&
458                 (t1 = rx->endp[paren]) != -1)
459             {
460                 i = t1 - s1;
461               getlen:
462                 if (i > 0 && PL_reg_match_utf8) {
463                     char *s    = rx->subbeg + s1;
464                     char *send = rx->subbeg + t1;
465
466                     i = t1 - s1;
467                     if (is_utf8_string((U8*)s, i))
468                         i = Perl_utf8_length(aTHX_ (U8*)s, (U8*)send);
469                 }
470                 if (i < 0)
471                     Perl_croak(aTHX_ "panic: magic_len: %"IVdf, (IV)i);
472                 return i;
473             }
474             else {
475                 if (ckWARN(WARN_UNINITIALIZED))
476                     report_uninit();
477             }
478         }
479         else {
480             if (ckWARN(WARN_UNINITIALIZED))
481                 report_uninit();
482         }
483         return 0;
484     case '+':
485         if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
486             paren = rx->lastparen;
487             if (paren)
488                 goto getparen;
489         }
490         return 0;
491     case '\016': /* ^N */
492         if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
493             paren = rx->lastcloseparen;
494             if (paren)
495                 goto getparen;
496         }
497         return 0;
498     case '`':
499         if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
500             if (rx->startp[0] != -1) {
501                 i = rx->startp[0];
502                 if (i > 0) {
503                     s1 = 0;
504                     t1 = i;
505                     goto getlen;
506                 }
507             }
508         }
509         return 0;
510     case '\'':
511         if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
512             if (rx->endp[0] != -1) {
513                 i = rx->sublen - rx->endp[0];
514                 if (i > 0) {
515                     s1 = rx->endp[0];
516                     t1 = rx->sublen;
517                     goto getlen;
518                 }
519             }
520         }
521         return 0;
522     }
523     magic_get(sv,mg);
524     if (!SvPOK(sv) && SvNIOK(sv)) {
525         STRLEN n_a;
526         sv_2pv(sv, &n_a);
527     }
528     if (SvPOK(sv))
529         return SvCUR(sv);
530     return 0;
531 }
532
533 int
534 Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
535 {
536     register I32 paren;
537     register char *s;
538     register I32 i;
539     register REGEXP *rx;
540
541     switch (*mg->mg_ptr) {
542     case '\001':                /* ^A */
543         sv_setsv(sv, PL_bodytarget);
544         break;
545     case '\003':                /* ^C */
546         sv_setiv(sv, (IV)PL_minus_c);
547         break;
548
549     case '\004':                /* ^D */
550         sv_setiv(sv, (IV)(PL_debug & DEBUG_MASK));
551 #if defined(YYDEBUG) && defined(DEBUGGING)
552         PL_yydebug = DEBUG_p_TEST;
553 #endif
554         break;
555     case '\005':  /* ^E */
556          if (*(mg->mg_ptr+1) == '\0') {
557 #ifdef MACOS_TRADITIONAL
558              {
559                   char msg[256];
560
561                   sv_setnv(sv,(double)gMacPerl_OSErr);
562                   sv_setpv(sv, gMacPerl_OSErr ? GetSysErrText(gMacPerl_OSErr, msg) : "");
563              }
564 #else
565 #ifdef VMS
566              {
567 #                 include <descrip.h>
568 #                 include <starlet.h>
569                   char msg[255];
570                   $DESCRIPTOR(msgdsc,msg);
571                   sv_setnv(sv,(NV) vaxc$errno);
572                   if (sys$getmsg(vaxc$errno,&msgdsc.dsc$w_length,&msgdsc,0,0) & 1)
573                        sv_setpvn(sv,msgdsc.dsc$a_pointer,msgdsc.dsc$w_length);
574                   else
575                        sv_setpv(sv,"");
576              }
577 #else
578 #ifdef OS2
579              if (!(_emx_env & 0x200)) { /* Under DOS */
580                   sv_setnv(sv, (NV)errno);
581                   sv_setpv(sv, errno ? Strerror(errno) : "");
582              } else {
583                   if (errno != errno_isOS2) {
584                        int tmp = _syserrno();
585                        if (tmp) /* 2nd call to _syserrno() makes it 0 */
586                             Perl_rc = tmp;
587                   }
588                   sv_setnv(sv, (NV)Perl_rc);
589                   sv_setpv(sv, os2error(Perl_rc));
590              }
591 #else
592 #ifdef WIN32
593              {
594                   DWORD dwErr = GetLastError();
595                   sv_setnv(sv, (NV)dwErr);
596                   if (dwErr)
597                   {
598                        PerlProc_GetOSError(sv, dwErr);
599                   }
600                   else
601                        sv_setpv(sv, "");
602                   SetLastError(dwErr);
603              }
604 #else
605              sv_setnv(sv, (NV)errno);
606              sv_setpv(sv, errno ? Strerror(errno) : "");
607 #endif
608 #endif
609 #endif
610 #endif
611              SvNOK_on(sv);      /* what a wonderful hack! */
612          }
613          else if (strEQ(mg->mg_ptr+1, "NCODING"))
614               sv_setsv(sv, PL_encoding);
615          break;
616     case '\006':                /* ^F */
617         sv_setiv(sv, (IV)PL_maxsysfd);
618         break;
619     case '\010':                /* ^H */
620         sv_setiv(sv, (IV)PL_hints);
621         break;
622     case '\011':                /* ^I */ /* NOT \t in EBCDIC */
623         if (PL_inplace)
624             sv_setpv(sv, PL_inplace);
625         else
626             sv_setsv(sv, &PL_sv_undef);
627         break;
628     case '\017':                /* ^O & ^OPEN */
629         if (*(mg->mg_ptr+1) == '\0')
630             sv_setpv(sv, PL_osname);
631         else if (strEQ(mg->mg_ptr, "\017PEN")) {
632             if (!PL_compiling.cop_io)
633                 sv_setsv(sv, &PL_sv_undef);
634             else {
635                 sv_setsv(sv, PL_compiling.cop_io);
636             }
637         }
638         break;
639     case '\020':                /* ^P */
640         sv_setiv(sv, (IV)PL_perldb);
641         break;
642     case '\023':                /* ^S */
643         {
644             if (PL_lex_state != LEX_NOTPARSING)
645                 (void)SvOK_off(sv);
646             else if (PL_in_eval)
647                 sv_setiv(sv, PL_in_eval & ~(EVAL_INREQUIRE));
648             else
649                 sv_setiv(sv, 0);
650         }
651         break;
652     case '\024':                /* ^T */
653         if (*(mg->mg_ptr+1) == '\0') {
654 #ifdef BIG_TIME
655             sv_setnv(sv, PL_basetime);
656 #else
657             sv_setiv(sv, (IV)PL_basetime);
658 #endif
659         }
660         else if (strEQ(mg->mg_ptr, "\024AINT"))
661             sv_setiv(sv, PL_tainting
662                     ? (PL_taint_warn || PL_unsafe ? -1 : 1)
663                     : 0);
664         break;
665     case '\027':                /* ^W  & $^WARNING_BITS & ^WIDE_SYSTEM_CALLS */
666         if (*(mg->mg_ptr+1) == '\0')
667             sv_setiv(sv, (IV)((PL_dowarn & G_WARN_ON) ? TRUE : FALSE));
668         else if (strEQ(mg->mg_ptr+1, "ARNING_BITS")) {
669             if (PL_compiling.cop_warnings == pWARN_NONE ||
670                 PL_compiling.cop_warnings == pWARN_STD)
671             {
672                 sv_setpvn(sv, WARN_NONEstring, WARNsize) ;
673             }
674             else if (PL_compiling.cop_warnings == pWARN_ALL) {
675                 sv_setpvn(sv, WARN_ALLstring, WARNsize) ;
676             }
677             else {
678                 sv_setsv(sv, PL_compiling.cop_warnings);
679             }
680             SvPOK_only(sv);
681         }
682         else if (strEQ(mg->mg_ptr+1, "IDE_SYSTEM_CALLS"))
683             sv_setiv(sv, (IV)PL_widesyscalls);
684         break;
685     case '1': case '2': case '3': case '4':
686     case '5': case '6': case '7': case '8': case '9': case '&':
687         if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
688             I32 s1, t1;
689
690             /*
691              * Pre-threads, this was paren = atoi(GvENAME((GV*)mg->mg_obj));
692              * XXX Does the new way break anything?
693              */
694             paren = atoi(mg->mg_ptr); /* $& is in [0] */
695           getparen:
696             if (paren <= (I32)rx->nparens &&
697                 (s1 = rx->startp[paren]) != -1 &&
698                 (t1 = rx->endp[paren]) != -1)
699             {
700                 i = t1 - s1;
701                 s = rx->subbeg + s1;
702                 if (!rx->subbeg)
703                     break;
704
705               getrx:
706                 if (i >= 0) {
707                     sv_setpvn(sv, s, i);
708                     if (PL_reg_match_utf8 && is_utf8_string((U8*)s, i))
709                         SvUTF8_on(sv);
710                     else
711                         SvUTF8_off(sv);
712                     if (PL_tainting) {
713                         if (RX_MATCH_TAINTED(rx)) {
714                             MAGIC* mg = SvMAGIC(sv);
715                             MAGIC* mgt;
716                             PL_tainted = 1;
717                             SvMAGIC(sv) = mg->mg_moremagic;
718                             SvTAINT(sv);
719                             if ((mgt = SvMAGIC(sv))) {
720                                 mg->mg_moremagic = mgt;
721                                 SvMAGIC(sv) = mg;
722                             }
723                         } else
724                             SvTAINTED_off(sv);
725                     }
726                     break;
727                 }
728             }
729         }
730         sv_setsv(sv,&PL_sv_undef);
731         break;
732     case '+':
733         if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
734             paren = rx->lastparen;
735             if (paren)
736                 goto getparen;
737         }
738         sv_setsv(sv,&PL_sv_undef);
739         break;
740     case '\016':                /* ^N */
741         if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
742             paren = rx->lastcloseparen;
743             if (paren)
744                 goto getparen;
745         }
746         sv_setsv(sv,&PL_sv_undef);
747         break;
748     case '`':
749         if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
750             if ((s = rx->subbeg) && rx->startp[0] != -1) {
751                 i = rx->startp[0];
752                 goto getrx;
753             }
754         }
755         sv_setsv(sv,&PL_sv_undef);
756         break;
757     case '\'':
758         if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
759             if (rx->subbeg && rx->endp[0] != -1) {
760                 s = rx->subbeg + rx->endp[0];
761                 i = rx->sublen - rx->endp[0];
762                 goto getrx;
763             }
764         }
765         sv_setsv(sv,&PL_sv_undef);
766         break;
767     case '.':
768 #ifndef lint
769         if (GvIO(PL_last_in_gv)) {
770             sv_setiv(sv, (IV)IoLINES(GvIOp(PL_last_in_gv)));
771         }
772 #endif
773         break;
774     case '?':
775         {
776             sv_setiv(sv, (IV)STATUS_CURRENT);
777 #ifdef COMPLEX_STATUS
778             LvTARGOFF(sv) = PL_statusvalue;
779             LvTARGLEN(sv) = PL_statusvalue_vms;
780 #endif
781         }
782         break;
783     case '^':
784         s = IoTOP_NAME(GvIOp(PL_defoutgv));
785         if (s)
786             sv_setpv(sv,s);
787         else {
788             sv_setpv(sv,GvENAME(PL_defoutgv));
789             sv_catpv(sv,"_TOP");
790         }
791         break;
792     case '~':
793         s = IoFMT_NAME(GvIOp(PL_defoutgv));
794         if (!s)
795             s = GvENAME(PL_defoutgv);
796         sv_setpv(sv,s);
797         break;
798 #ifndef lint
799     case '=':
800         sv_setiv(sv, (IV)IoPAGE_LEN(GvIOp(PL_defoutgv)));
801         break;
802     case '-':
803         sv_setiv(sv, (IV)IoLINES_LEFT(GvIOp(PL_defoutgv)));
804         break;
805     case '%':
806         sv_setiv(sv, (IV)IoPAGE(GvIOp(PL_defoutgv)));
807         break;
808 #endif
809     case ':':
810         break;
811     case '/':
812         break;
813     case '[':
814         WITH_THR(sv_setiv(sv, (IV)PL_curcop->cop_arybase));
815         break;
816     case '|':
817         sv_setiv(sv, (IV)(IoFLAGS(GvIOp(PL_defoutgv)) & IOf_FLUSH) != 0 );
818         break;
819     case ',':
820         break;
821     case '\\':
822         if (PL_ors_sv)
823             sv_copypv(sv, PL_ors_sv);
824         break;
825     case '#':
826         sv_setpv(sv,PL_ofmt);
827         break;
828     case '!':
829 #ifdef VMS
830         sv_setnv(sv, (NV)((errno == EVMSERR) ? vaxc$errno : errno));
831         sv_setpv(sv, errno ? Strerror(errno) : "");
832 #else
833         {
834         int saveerrno = errno;
835         sv_setnv(sv, (NV)errno);
836 #ifdef OS2
837         if (errno == errno_isOS2 || errno == errno_isOS2_set)
838             sv_setpv(sv, os2error(Perl_rc));
839         else
840 #endif
841         sv_setpv(sv, errno ? Strerror(errno) : "");
842         errno = saveerrno;
843         }
844 #endif
845         SvNOK_on(sv);   /* what a wonderful hack! */
846         break;
847     case '<':
848         sv_setiv(sv, (IV)PL_uid);
849         break;
850     case '>':
851         sv_setiv(sv, (IV)PL_euid);
852         break;
853     case '(':
854         sv_setiv(sv, (IV)PL_gid);
855 #ifdef HAS_GETGROUPS
856         Perl_sv_setpvf(aTHX_ sv, "%"Gid_t_f, PL_gid);
857 #endif
858         goto add_groups;
859     case ')':
860         sv_setiv(sv, (IV)PL_egid);
861 #ifdef HAS_GETGROUPS
862         Perl_sv_setpvf(aTHX_ sv, "%"Gid_t_f, PL_egid);
863 #endif
864       add_groups:
865 #ifdef HAS_GETGROUPS
866         {
867             Groups_t gary[NGROUPS];
868             i = getgroups(NGROUPS,gary);
869             while (--i >= 0)
870                 Perl_sv_catpvf(aTHX_ sv, " %"Gid_t_f, gary[i]);
871         }
872 #endif
873         (void)SvIOK_on(sv);     /* what a wonderful hack! */
874         break;
875     case '*':
876         break;
877 #ifndef MACOS_TRADITIONAL
878     case '0':
879         break;
880 #endif
881     }
882     return 0;
883 }
884
885 int
886 Perl_magic_getuvar(pTHX_ SV *sv, MAGIC *mg)
887 {
888     struct ufuncs *uf = (struct ufuncs *)mg->mg_ptr;
889
890     if (uf && uf->uf_val)
891         (*uf->uf_val)(aTHX_ uf->uf_index, sv);
892     return 0;
893 }
894
895 int
896 Perl_magic_setenv(pTHX_ SV *sv, MAGIC *mg)
897 {
898     register char *s;
899     char *ptr;
900     STRLEN len, klen;
901
902     s = SvPV(sv,len);
903     ptr = MgPV(mg,klen);
904     my_setenv(ptr, s);
905
906 #ifdef DYNAMIC_ENV_FETCH
907      /* We just undefd an environment var.  Is a replacement */
908      /* waiting in the wings? */
909     if (!len) {
910         SV **valp;
911         if ((valp = hv_fetch(GvHVn(PL_envgv), ptr, klen, FALSE)))
912             s = SvPV(*valp, len);
913     }
914 #endif
915
916 #if !defined(OS2) && !defined(AMIGAOS) && !defined(WIN32) && !defined(MSDOS)
917                             /* And you'll never guess what the dog had */
918                             /*   in its mouth... */
919     if (PL_tainting) {
920         MgTAINTEDDIR_off(mg);
921 #ifdef VMS
922         if (s && klen == 8 && strEQ(ptr, "DCL$PATH")) {
923             char pathbuf[256], eltbuf[256], *cp, *elt = s;
924             Stat_t sbuf;
925             int i = 0, j = 0;
926
927             do {          /* DCL$PATH may be a search list */
928                 while (1) {   /* as may dev portion of any element */
929                     if ( ((cp = strchr(elt,'[')) || (cp = strchr(elt,'<'))) ) {
930                         if ( *(cp+1) == '.' || *(cp+1) == '-' ||
931                              cando_by_name(S_IWUSR,0,elt) ) {
932                             MgTAINTEDDIR_on(mg);
933                             return 0;
934                         }
935                     }
936                     if ((cp = strchr(elt, ':')) != Nullch)
937                         *cp = '\0';
938                     if (my_trnlnm(elt, eltbuf, j++))
939                         elt = eltbuf;
940                     else
941                         break;
942                 }
943                 j = 0;
944             } while (my_trnlnm(s, pathbuf, i++) && (elt = pathbuf));
945         }
946 #endif /* VMS */
947         if (s && klen == 4 && strEQ(ptr,"PATH")) {
948             char *strend = s + len;
949
950             while (s < strend) {
951                 char tmpbuf[256];
952                 Stat_t st;
953                 I32 i;
954                 s = delimcpy(tmpbuf, tmpbuf + sizeof tmpbuf,
955                              s, strend, ':', &i);
956                 s++;
957                 if (i >= sizeof tmpbuf   /* too long -- assume the worst */
958                       || *tmpbuf != '/'
959                       || (PerlLIO_stat(tmpbuf, &st) == 0 && (st.st_mode & 2)) ) {
960                     MgTAINTEDDIR_on(mg);
961                     return 0;
962                 }
963             }
964         }
965     }
966 #endif /* neither OS2 nor AMIGAOS nor WIN32 nor MSDOS */
967
968     return 0;
969 }
970
971 int
972 Perl_magic_clearenv(pTHX_ SV *sv, MAGIC *mg)
973 {
974     STRLEN n_a;
975     my_setenv(MgPV(mg,n_a),Nullch);
976     return 0;
977 }
978
979 int
980 Perl_magic_set_all_env(pTHX_ SV *sv, MAGIC *mg)
981 {
982 #if defined(VMS)
983     Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
984 #else
985     if (PL_localizing) {
986         HE* entry;
987         STRLEN n_a;
988         magic_clear_all_env(sv,mg);
989         hv_iterinit((HV*)sv);
990         while ((entry = hv_iternext((HV*)sv))) {
991             I32 keylen;
992             my_setenv(hv_iterkey(entry, &keylen),
993                       SvPV(hv_iterval((HV*)sv, entry), n_a));
994         }
995     }
996 #endif
997     return 0;
998 }
999
1000 int
1001 Perl_magic_clear_all_env(pTHX_ SV *sv, MAGIC *mg)
1002 {
1003 #if defined(VMS) || defined(EPOC)
1004     Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1005 #else
1006 #  if defined(PERL_IMPLICIT_SYS) || defined(WIN32)
1007     PerlEnv_clearenv();
1008 #  else
1009 #    ifdef USE_ENVIRON_ARRAY
1010 #      if defined(USE_ITHREADS)
1011     /* only the parent thread can clobber the process environment */
1012     if (PL_curinterp == aTHX)
1013 #      endif
1014     {
1015 #      ifndef PERL_USE_SAFE_PUTENV
1016     I32 i;
1017
1018     if (environ == PL_origenviron)
1019         environ = (char**)safesysmalloc(sizeof(char*));
1020     else
1021         for (i = 0; environ[i]; i++)
1022             safesysfree(environ[i]);
1023 #      endif /* PERL_USE_SAFE_PUTENV */
1024
1025     environ[0] = Nullch;
1026     }
1027 #    endif /* USE_ENVIRON_ARRAY */
1028 #   endif /* PERL_IMPLICIT_SYS || WIN32 */
1029 #endif /* VMS || EPC */
1030     return 0;
1031 }
1032
1033 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS)||defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1034 static int sig_handlers_initted = 0;
1035 #endif
1036 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1037 static int sig_ignoring[SIG_SIZE];      /* which signals we are ignoring */
1038 #endif
1039 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1040 static int sig_defaulting[SIG_SIZE];
1041 #endif
1042
1043 #ifndef PERL_MICRO
1044 int
1045 Perl_magic_getsig(pTHX_ SV *sv, MAGIC *mg)
1046 {
1047     I32 i;
1048     STRLEN n_a;
1049     /* Are we fetching a signal entry? */
1050     i = whichsig(MgPV(mg,n_a));
1051     if (i) {
1052         if(PL_psig_ptr[i])
1053             sv_setsv(sv,PL_psig_ptr[i]);
1054         else {
1055             Sighandler_t sigstate;
1056             sigstate = rsignal_state(i);
1057 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1058             if (sig_handlers_initted && sig_ignoring[i]) sigstate = SIG_IGN;
1059 #endif
1060 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1061             if (sig_handlers_initted && sig_defaulting[i]) sigstate = SIG_DFL;
1062 #endif
1063             /* cache state so we don't fetch it again */
1064             if(sigstate == SIG_IGN)
1065                 sv_setpv(sv,"IGNORE");
1066             else
1067                 sv_setsv(sv,&PL_sv_undef);
1068             PL_psig_ptr[i] = SvREFCNT_inc(sv);
1069             SvTEMP_off(sv);
1070         }
1071     }
1072     return 0;
1073 }
1074 int
1075 Perl_magic_clearsig(pTHX_ SV *sv, MAGIC *mg)
1076 {
1077     I32 i;
1078     STRLEN n_a;
1079     /* Are we clearing a signal entry? */
1080     i = whichsig(MgPV(mg,n_a));
1081     if (i) {
1082         if(PL_psig_ptr[i]) {
1083             SvREFCNT_dec(PL_psig_ptr[i]);
1084             PL_psig_ptr[i]=0;
1085         }
1086         if(PL_psig_name[i]) {
1087             SvREFCNT_dec(PL_psig_name[i]);
1088             PL_psig_name[i]=0;
1089         }
1090     }
1091     return 0;
1092 }
1093
1094 void
1095 Perl_raise_signal(pTHX_ int sig)
1096 {
1097     /* Set a flag to say this signal is pending */
1098     PL_psig_pend[sig]++;
1099     /* And one to say _a_ signal is pending */
1100     PL_sig_pending = 1;
1101 }
1102
1103 Signal_t
1104 Perl_csighandler(int sig)
1105 {
1106 #ifdef PERL_GET_SIG_CONTEXT
1107     dTHXa(PERL_GET_SIG_CONTEXT);
1108 #else
1109     dTHX;
1110 #endif
1111 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1112     (void) rsignal(sig, &Perl_csighandler);
1113     if (sig_ignoring[sig]) return;
1114 #endif
1115 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1116     if (sig_defaulting[sig])
1117 #ifdef KILL_BY_SIGPRC
1118             exit((Perl_sig_to_vmscondition(sig)&STS$M_COND_ID)|STS$K_SEVERE|STS$M_INHIB_MSG);
1119 #else
1120             exit(1);
1121 #endif
1122 #endif
1123
1124 #ifdef PERL_OLD_SIGNALS
1125     /* Call the perl level handler now with risk we may be in malloc() etc. */
1126     (*PL_sighandlerp)(sig);
1127 #else
1128     Perl_raise_signal(aTHX_ sig);
1129 #endif
1130 }
1131
1132 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1133 void
1134 Perl_csighandler_init(void)
1135 {
1136     int sig;
1137     if (sig_handlers_initted) return;
1138
1139     for (sig = 1; sig < SIG_SIZE; sig++) {
1140 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1141         dTHX;
1142         sig_defaulting[sig] = 1;
1143         (void) rsignal(sig, &Perl_csighandler);
1144 #endif
1145 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1146         sig_ignoring[sig] = 0;
1147 #endif
1148     }
1149     sig_handlers_initted = 1;
1150 }
1151 #endif
1152
1153 void
1154 Perl_despatch_signals(pTHX)
1155 {
1156     int sig;
1157     PL_sig_pending = 0;
1158     for (sig = 1; sig < SIG_SIZE; sig++) {
1159         if (PL_psig_pend[sig]) {
1160             PL_psig_pend[sig] = 0;
1161             (*PL_sighandlerp)(sig);
1162         }
1163     }
1164 }
1165
1166 int
1167 Perl_magic_setsig(pTHX_ SV *sv, MAGIC *mg)
1168 {
1169     register char *s;
1170     I32 i;
1171     SV** svp = 0;
1172     STRLEN len;
1173
1174     s = MgPV(mg,len);
1175     if (*s == '_') {
1176         if (strEQ(s,"__DIE__"))
1177             svp = &PL_diehook;
1178         else if (strEQ(s,"__WARN__"))
1179             svp = &PL_warnhook;
1180         else
1181             Perl_croak(aTHX_ "No such hook: %s", s);
1182         i = 0;
1183         if (*svp) {
1184             SvREFCNT_dec(*svp);
1185             *svp = 0;
1186         }
1187     }
1188     else {
1189         i = whichsig(s);        /* ...no, a brick */
1190         if (!i) {
1191             if (ckWARN(WARN_SIGNAL))
1192                 Perl_warner(aTHX_ packWARN(WARN_SIGNAL), "No such signal: SIG%s", s);
1193             return 0;
1194         }
1195 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1196         if (!sig_handlers_initted) Perl_csighandler_init();
1197 #endif
1198 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1199         sig_ignoring[i] = 0;
1200 #endif
1201 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1202           sig_defaulting[i] = 0;
1203 #endif
1204         SvREFCNT_dec(PL_psig_name[i]);
1205         SvREFCNT_dec(PL_psig_ptr[i]);
1206         PL_psig_ptr[i] = SvREFCNT_inc(sv);
1207         SvTEMP_off(sv); /* Make sure it doesn't go away on us */
1208         PL_psig_name[i] = newSVpvn(s, len);
1209         SvREADONLY_on(PL_psig_name[i]);
1210     }
1211     if (SvTYPE(sv) == SVt_PVGV || SvROK(sv)) {
1212         if (i)
1213             (void)rsignal(i, &Perl_csighandler);
1214         else
1215             *svp = SvREFCNT_inc(sv);
1216         return 0;
1217     }
1218     s = SvPV_force(sv,len);
1219     if (strEQ(s,"IGNORE")) {
1220         if (i) {
1221 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1222             sig_ignoring[i] = 1;
1223             (void)rsignal(i, &Perl_csighandler);
1224 #else
1225             (void)rsignal(i, SIG_IGN);
1226 #endif
1227         } else
1228             *svp = 0;
1229     }
1230     else if (strEQ(s,"DEFAULT") || !*s) {
1231         if (i)
1232 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1233           {
1234             sig_defaulting[i] = 1;
1235             (void)rsignal(i, &Perl_csighandler);
1236           }
1237 #else
1238             (void)rsignal(i, SIG_DFL);
1239 #endif
1240         else
1241             *svp = 0;
1242     }
1243     else {
1244         /*
1245          * We should warn if HINT_STRICT_REFS, but without
1246          * access to a known hint bit in a known OP, we can't
1247          * tell whether HINT_STRICT_REFS is in force or not.
1248          */
1249         if (!strchr(s,':') && !strchr(s,'\''))
1250             sv_insert(sv, 0, 0, "main::", 6);
1251         if (i)
1252             (void)rsignal(i, &Perl_csighandler);
1253         else
1254             *svp = SvREFCNT_inc(sv);
1255     }
1256     return 0;
1257 }
1258 #endif /* !PERL_MICRO */
1259
1260 int
1261 Perl_magic_setisa(pTHX_ SV *sv, MAGIC *mg)
1262 {
1263     PL_sub_generation++;
1264     return 0;
1265 }
1266
1267 int
1268 Perl_magic_setamagic(pTHX_ SV *sv, MAGIC *mg)
1269 {
1270     /* HV_badAMAGIC_on(Sv_STASH(sv)); */
1271     PL_amagic_generation++;
1272
1273     return 0;
1274 }
1275
1276 int
1277 Perl_magic_getnkeys(pTHX_ SV *sv, MAGIC *mg)
1278 {
1279     HV *hv = (HV*)LvTARG(sv);
1280     I32 i = 0;
1281
1282     if (hv) {
1283          (void) hv_iterinit(hv);
1284          if (! SvTIED_mg((SV*)hv, PERL_MAGIC_tied))
1285              i = HvKEYS(hv);
1286          else {
1287              while (hv_iternext(hv))
1288                  i++;
1289          }
1290     }
1291
1292     sv_setiv(sv, (IV)i);
1293     return 0;
1294 }
1295
1296 int
1297 Perl_magic_setnkeys(pTHX_ SV *sv, MAGIC *mg)
1298 {
1299     if (LvTARG(sv)) {
1300         hv_ksplit((HV*)LvTARG(sv), SvIV(sv));
1301     }
1302     return 0;
1303 }
1304
1305 /* caller is responsible for stack switching/cleanup */
1306 STATIC int
1307 S_magic_methcall(pTHX_ SV *sv, MAGIC *mg, char *meth, I32 flags, int n, SV *val)
1308 {
1309     dSP;
1310
1311     PUSHMARK(SP);
1312     EXTEND(SP, n);
1313     PUSHs(SvTIED_obj(sv, mg));
1314     if (n > 1) {
1315         if (mg->mg_ptr) {
1316             if (mg->mg_len >= 0)
1317                 PUSHs(sv_2mortal(newSVpvn(mg->mg_ptr, mg->mg_len)));
1318             else if (mg->mg_len == HEf_SVKEY)
1319                 PUSHs((SV*)mg->mg_ptr);
1320         }
1321         else if (mg->mg_type == PERL_MAGIC_tiedelem) {
1322             PUSHs(sv_2mortal(newSViv(mg->mg_len)));
1323         }
1324     }
1325     if (n > 2) {
1326         PUSHs(val);
1327     }
1328     PUTBACK;
1329
1330     return call_method(meth, flags);
1331 }
1332
1333 STATIC int
1334 S_magic_methpack(pTHX_ SV *sv, MAGIC *mg, char *meth)
1335 {
1336     dSP;
1337
1338     ENTER;
1339     SAVETMPS;
1340     PUSHSTACKi(PERLSI_MAGIC);
1341
1342     if (magic_methcall(sv, mg, meth, G_SCALAR, 2, NULL)) {
1343         sv_setsv(sv, *PL_stack_sp--);
1344     }
1345
1346     POPSTACK;
1347     FREETMPS;
1348     LEAVE;
1349     return 0;
1350 }
1351
1352 int
1353 Perl_magic_getpack(pTHX_ SV *sv, MAGIC *mg)
1354 {
1355     magic_methpack(sv,mg,"FETCH");
1356     if (mg->mg_ptr)
1357         mg->mg_flags |= MGf_GSKIP;
1358     return 0;
1359 }
1360
1361 int
1362 Perl_magic_setpack(pTHX_ SV *sv, MAGIC *mg)
1363 {
1364     dSP;
1365     ENTER;
1366     PUSHSTACKi(PERLSI_MAGIC);
1367     magic_methcall(sv, mg, "STORE", G_SCALAR|G_DISCARD, 3, sv);
1368     POPSTACK;
1369     LEAVE;
1370     return 0;
1371 }
1372
1373 int
1374 Perl_magic_clearpack(pTHX_ SV *sv, MAGIC *mg)
1375 {
1376     return magic_methpack(sv,mg,"DELETE");
1377 }
1378
1379
1380 U32
1381 Perl_magic_sizepack(pTHX_ SV *sv, MAGIC *mg)
1382 {
1383     dSP;
1384     U32 retval = 0;
1385
1386     ENTER;
1387     SAVETMPS;
1388     PUSHSTACKi(PERLSI_MAGIC);
1389     if (magic_methcall(sv, mg, "FETCHSIZE", G_SCALAR, 2, NULL)) {
1390         sv = *PL_stack_sp--;
1391         retval = (U32) SvIV(sv)-1;
1392     }
1393     POPSTACK;
1394     FREETMPS;
1395     LEAVE;
1396     return retval;
1397 }
1398
1399 int
1400 Perl_magic_wipepack(pTHX_ SV *sv, MAGIC *mg)
1401 {
1402     dSP;
1403
1404     ENTER;
1405     PUSHSTACKi(PERLSI_MAGIC);
1406     PUSHMARK(SP);
1407     XPUSHs(SvTIED_obj(sv, mg));
1408     PUTBACK;
1409     call_method("CLEAR", G_SCALAR|G_DISCARD);
1410     POPSTACK;
1411     LEAVE;
1412     return 0;
1413 }
1414
1415 int
1416 Perl_magic_nextpack(pTHX_ SV *sv, MAGIC *mg, SV *key)
1417 {
1418     dSP;
1419     const char *meth = SvOK(key) ? "NEXTKEY" : "FIRSTKEY";
1420
1421     ENTER;
1422     SAVETMPS;
1423     PUSHSTACKi(PERLSI_MAGIC);
1424     PUSHMARK(SP);
1425     EXTEND(SP, 2);
1426     PUSHs(SvTIED_obj(sv, mg));
1427     if (SvOK(key))
1428         PUSHs(key);
1429     PUTBACK;
1430
1431     if (call_method(meth, G_SCALAR))
1432         sv_setsv(key, *PL_stack_sp--);
1433
1434     POPSTACK;
1435     FREETMPS;
1436     LEAVE;
1437     return 0;
1438 }
1439
1440 int
1441 Perl_magic_existspack(pTHX_ SV *sv, MAGIC *mg)
1442 {
1443     return magic_methpack(sv,mg,"EXISTS");
1444 }
1445
1446 int
1447 Perl_magic_setdbline(pTHX_ SV *sv, MAGIC *mg)
1448 {
1449     OP *o;
1450     I32 i;
1451     GV* gv;
1452     SV** svp;
1453     STRLEN n_a;
1454
1455     gv = PL_DBline;
1456     i = SvTRUE(sv);
1457     svp = av_fetch(GvAV(gv),
1458                      atoi(MgPV(mg,n_a)), FALSE);
1459     if (svp && SvIOKp(*svp) && (o = INT2PTR(OP*,SvIVX(*svp))))
1460         o->op_private = (U8)i;
1461     return 0;
1462 }
1463
1464 int
1465 Perl_magic_getarylen(pTHX_ SV *sv, MAGIC *mg)
1466 {
1467     sv_setiv(sv, AvFILL((AV*)mg->mg_obj) + PL_curcop->cop_arybase);
1468     return 0;
1469 }
1470
1471 int
1472 Perl_magic_setarylen(pTHX_ SV *sv, MAGIC *mg)
1473 {
1474     av_fill((AV*)mg->mg_obj, SvIV(sv) - PL_curcop->cop_arybase);
1475     return 0;
1476 }
1477
1478 int
1479 Perl_magic_getpos(pTHX_ SV *sv, MAGIC *mg)
1480 {
1481     SV* lsv = LvTARG(sv);
1482
1483     if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv)) {
1484         mg = mg_find(lsv, PERL_MAGIC_regex_global);
1485         if (mg && mg->mg_len >= 0) {
1486             I32 i = mg->mg_len;
1487             if (DO_UTF8(lsv))
1488                 sv_pos_b2u(lsv, &i);
1489             sv_setiv(sv, i + PL_curcop->cop_arybase);
1490             return 0;
1491         }
1492     }
1493     (void)SvOK_off(sv);
1494     return 0;
1495 }
1496
1497 int
1498 Perl_magic_setpos(pTHX_ SV *sv, MAGIC *mg)
1499 {
1500     SV* lsv = LvTARG(sv);
1501     SSize_t pos;
1502     STRLEN len;
1503     STRLEN ulen = 0;
1504
1505     mg = 0;
1506
1507     if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv))
1508         mg = mg_find(lsv, PERL_MAGIC_regex_global);
1509     if (!mg) {
1510         if (!SvOK(sv))
1511             return 0;
1512         sv_magic(lsv, (SV*)0, PERL_MAGIC_regex_global, Nullch, 0);
1513         mg = mg_find(lsv, PERL_MAGIC_regex_global);
1514     }
1515     else if (!SvOK(sv)) {
1516         mg->mg_len = -1;
1517         return 0;
1518     }
1519     len = SvPOK(lsv) ? SvCUR(lsv) : sv_len(lsv);
1520
1521     pos = SvIV(sv) - PL_curcop->cop_arybase;
1522
1523     if (DO_UTF8(lsv)) {
1524         ulen = sv_len_utf8(lsv);
1525         if (ulen)
1526             len = ulen;
1527     }
1528
1529     if (pos < 0) {
1530         pos += len;
1531         if (pos < 0)
1532             pos = 0;
1533     }
1534     else if (pos > (SSize_t)len)
1535         pos = len;
1536
1537     if (ulen) {
1538         I32 p = pos;
1539         sv_pos_u2b(lsv, &p, 0);
1540         pos = p;
1541     }
1542
1543     mg->mg_len = pos;
1544     mg->mg_flags &= ~MGf_MINMATCH;
1545
1546     return 0;
1547 }
1548
1549 int
1550 Perl_magic_getglob(pTHX_ SV *sv, MAGIC *mg)
1551 {
1552     if (SvFAKE(sv)) {                   /* FAKE globs can get coerced */
1553         SvFAKE_off(sv);
1554         gv_efullname3(sv,((GV*)sv), "*");
1555         SvFAKE_on(sv);
1556     }
1557     else
1558         gv_efullname3(sv,((GV*)sv), "*");       /* a gv value, be nice */
1559     return 0;
1560 }
1561
1562 int
1563 Perl_magic_setglob(pTHX_ SV *sv, MAGIC *mg)
1564 {
1565     register char *s;
1566     GV* gv;
1567     STRLEN n_a;
1568
1569     if (!SvOK(sv))
1570         return 0;
1571     s = SvPV(sv, n_a);
1572     if (*s == '*' && s[1])
1573         s++;
1574     gv = gv_fetchpv(s,TRUE, SVt_PVGV);
1575     if (sv == (SV*)gv)
1576         return 0;
1577     if (GvGP(sv))
1578         gp_free((GV*)sv);
1579     GvGP(sv) = gp_ref(GvGP(gv));
1580     return 0;
1581 }
1582
1583 int
1584 Perl_magic_getsubstr(pTHX_ SV *sv, MAGIC *mg)
1585 {
1586     STRLEN len;
1587     SV *lsv = LvTARG(sv);
1588     char *tmps = SvPV(lsv,len);
1589     I32 offs = LvTARGOFF(sv);
1590     I32 rem = LvTARGLEN(sv);
1591
1592     if (SvUTF8(lsv))
1593         sv_pos_u2b(lsv, &offs, &rem);
1594     if (offs > (I32)len)
1595         offs = len;
1596     if (rem + offs > (I32)len)
1597         rem = len - offs;
1598     sv_setpvn(sv, tmps + offs, (STRLEN)rem);
1599     if (SvUTF8(lsv))
1600         SvUTF8_on(sv);
1601     return 0;
1602 }
1603
1604 int
1605 Perl_magic_setsubstr(pTHX_ SV *sv, MAGIC *mg)
1606 {
1607     STRLEN len;
1608     char *tmps = SvPV(sv, len);
1609     SV *lsv = LvTARG(sv);
1610     I32 lvoff = LvTARGOFF(sv);
1611     I32 lvlen = LvTARGLEN(sv);
1612
1613     if (DO_UTF8(sv)) {
1614         sv_utf8_upgrade(lsv);
1615         sv_pos_u2b(lsv, &lvoff, &lvlen);
1616         sv_insert(lsv, lvoff, lvlen, tmps, len);
1617         SvUTF8_on(lsv);
1618     }
1619     else if (lsv && SvUTF8(lsv)) {
1620         sv_pos_u2b(lsv, &lvoff, &lvlen);
1621         tmps = (char*)bytes_to_utf8((U8*)tmps, &len);
1622         sv_insert(lsv, lvoff, lvlen, tmps, len);
1623         Safefree(tmps);
1624     }
1625     else
1626         sv_insert(lsv, lvoff, lvlen, tmps, len);
1627
1628     return 0;
1629 }
1630
1631 int
1632 Perl_magic_gettaint(pTHX_ SV *sv, MAGIC *mg)
1633 {
1634     TAINT_IF((mg->mg_len & 1) ||
1635              ((mg->mg_len & 2) && mg->mg_obj == sv));   /* kludge */
1636     return 0;
1637 }
1638
1639 int
1640 Perl_magic_settaint(pTHX_ SV *sv, MAGIC *mg)
1641 {
1642     if (PL_localizing) {
1643         if (PL_localizing == 1)
1644             mg->mg_len <<= 1;
1645         else
1646             mg->mg_len >>= 1;
1647     }
1648     else if (PL_tainted)
1649         mg->mg_len |= 1;
1650     else
1651         mg->mg_len &= ~1;
1652     return 0;
1653 }
1654
1655 int
1656 Perl_magic_getvec(pTHX_ SV *sv, MAGIC *mg)
1657 {
1658     SV *lsv = LvTARG(sv);
1659
1660     if (!lsv) {
1661         (void)SvOK_off(sv);
1662         return 0;
1663     }
1664
1665     sv_setuv(sv, do_vecget(lsv, LvTARGOFF(sv), LvTARGLEN(sv)));
1666     return 0;
1667 }
1668
1669 int
1670 Perl_magic_setvec(pTHX_ SV *sv, MAGIC *mg)
1671 {
1672     do_vecset(sv);      /* XXX slurp this routine */
1673     return 0;
1674 }
1675
1676 int
1677 Perl_magic_getdefelem(pTHX_ SV *sv, MAGIC *mg)
1678 {
1679     SV *targ = Nullsv;
1680     if (LvTARGLEN(sv)) {
1681         if (mg->mg_obj) {
1682             SV *ahv = LvTARG(sv);
1683             HE *he = hv_fetch_ent((HV*)ahv, mg->mg_obj, FALSE, 0);
1684             if (he)
1685                 targ = HeVAL(he);
1686         }
1687         else {
1688             AV* av = (AV*)LvTARG(sv);
1689             if ((I32)LvTARGOFF(sv) <= AvFILL(av))
1690                 targ = AvARRAY(av)[LvTARGOFF(sv)];
1691         }
1692         if (targ && targ != &PL_sv_undef) {
1693             /* somebody else defined it for us */
1694             SvREFCNT_dec(LvTARG(sv));
1695             LvTARG(sv) = SvREFCNT_inc(targ);
1696             LvTARGLEN(sv) = 0;
1697             SvREFCNT_dec(mg->mg_obj);
1698             mg->mg_obj = Nullsv;
1699             mg->mg_flags &= ~MGf_REFCOUNTED;
1700         }
1701     }
1702     else
1703         targ = LvTARG(sv);
1704     sv_setsv(sv, targ ? targ : &PL_sv_undef);
1705     return 0;
1706 }
1707
1708 int
1709 Perl_magic_setdefelem(pTHX_ SV *sv, MAGIC *mg)
1710 {
1711     if (LvTARGLEN(sv))
1712         vivify_defelem(sv);
1713     if (LvTARG(sv)) {
1714         sv_setsv(LvTARG(sv), sv);
1715         SvSETMAGIC(LvTARG(sv));
1716     }
1717     return 0;
1718 }
1719
1720 void
1721 Perl_vivify_defelem(pTHX_ SV *sv)
1722 {
1723     MAGIC *mg;
1724     SV *value = Nullsv;
1725
1726     if (!LvTARGLEN(sv) || !(mg = mg_find(sv, PERL_MAGIC_defelem)))
1727         return;
1728     if (mg->mg_obj) {
1729         SV *ahv = LvTARG(sv);
1730         STRLEN n_a;
1731         HE *he = hv_fetch_ent((HV*)ahv, mg->mg_obj, TRUE, 0);
1732         if (he)
1733             value = HeVAL(he);
1734         if (!value || value == &PL_sv_undef)
1735             Perl_croak(aTHX_ PL_no_helem, SvPV(mg->mg_obj, n_a));
1736     }
1737     else {
1738         AV* av = (AV*)LvTARG(sv);
1739         if ((I32)LvTARGLEN(sv) < 0 && (I32)LvTARGOFF(sv) > AvFILL(av))
1740             LvTARG(sv) = Nullsv;        /* array can't be extended */
1741         else {
1742             SV** svp = av_fetch(av, LvTARGOFF(sv), TRUE);
1743             if (!svp || (value = *svp) == &PL_sv_undef)
1744                 Perl_croak(aTHX_ PL_no_aelem, (I32)LvTARGOFF(sv));
1745         }
1746     }
1747     (void)SvREFCNT_inc(value);
1748     SvREFCNT_dec(LvTARG(sv));
1749     LvTARG(sv) = value;
1750     LvTARGLEN(sv) = 0;
1751     SvREFCNT_dec(mg->mg_obj);
1752     mg->mg_obj = Nullsv;
1753     mg->mg_flags &= ~MGf_REFCOUNTED;
1754 }
1755
1756 int
1757 Perl_magic_killbackrefs(pTHX_ SV *sv, MAGIC *mg)
1758 {
1759     AV *av = (AV*)mg->mg_obj;
1760     SV **svp = AvARRAY(av);
1761     I32 i = AvFILLp(av);
1762     while (i >= 0) {
1763         if (svp[i] && svp[i] != &PL_sv_undef) {
1764             if (!SvWEAKREF(svp[i]))
1765                 Perl_croak(aTHX_ "panic: magic_killbackrefs");
1766             /* XXX Should we check that it hasn't changed? */
1767             SvRV(svp[i]) = 0;
1768             (void)SvOK_off(svp[i]);
1769             SvWEAKREF_off(svp[i]);
1770             svp[i] = &PL_sv_undef;
1771         }
1772         i--;
1773     }
1774     return 0;
1775 }
1776
1777 int
1778 Perl_magic_setmglob(pTHX_ SV *sv, MAGIC *mg)
1779 {
1780     mg->mg_len = -1;
1781     SvSCREAM_off(sv);
1782     return 0;
1783 }
1784
1785 int
1786 Perl_magic_setbm(pTHX_ SV *sv, MAGIC *mg)
1787 {
1788     sv_unmagic(sv, PERL_MAGIC_bm);
1789     SvVALID_off(sv);
1790     return 0;
1791 }
1792
1793 int
1794 Perl_magic_setfm(pTHX_ SV *sv, MAGIC *mg)
1795 {
1796     sv_unmagic(sv, PERL_MAGIC_fm);
1797     SvCOMPILED_off(sv);
1798     return 0;
1799 }
1800
1801 int
1802 Perl_magic_setuvar(pTHX_ SV *sv, MAGIC *mg)
1803 {
1804     struct ufuncs *uf = (struct ufuncs *)mg->mg_ptr;
1805
1806     if (uf && uf->uf_set)
1807         (*uf->uf_set)(aTHX_ uf->uf_index, sv);
1808     return 0;
1809 }
1810
1811 int
1812 Perl_magic_freeregexp(pTHX_ SV *sv, MAGIC *mg)
1813 {
1814     regexp *re = (regexp *)mg->mg_obj;
1815     ReREFCNT_dec(re);
1816     return 0;
1817 }
1818
1819 #ifdef USE_LOCALE_COLLATE
1820 int
1821 Perl_magic_setcollxfrm(pTHX_ SV *sv, MAGIC *mg)
1822 {
1823     /*
1824      * RenE<eacute> Descartes said "I think not."
1825      * and vanished with a faint plop.
1826      */
1827     if (mg->mg_ptr) {
1828         Safefree(mg->mg_ptr);
1829         mg->mg_ptr = NULL;
1830         mg->mg_len = -1;
1831     }
1832     return 0;
1833 }
1834 #endif /* USE_LOCALE_COLLATE */
1835
1836 int
1837 Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
1838 {
1839     register char *s;
1840     I32 i;
1841     STRLEN len;
1842     switch (*mg->mg_ptr) {
1843     case '\001':        /* ^A */
1844         sv_setsv(PL_bodytarget, sv);
1845         break;
1846     case '\003':        /* ^C */
1847         PL_minus_c = (bool)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
1848         break;
1849
1850     case '\004':        /* ^D */
1851         PL_debug = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) | DEBUG_TOP_FLAG;
1852         DEBUG_x(dump_all());
1853         break;
1854     case '\005':  /* ^E */
1855         if (*(mg->mg_ptr+1) == '\0') {
1856 #ifdef MACOS_TRADITIONAL
1857             gMacPerl_OSErr = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1858 #else
1859 #  ifdef VMS
1860             set_vaxc_errno(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
1861 #  else
1862 #    ifdef WIN32
1863             SetLastError( SvIV(sv) );
1864 #    else
1865 #      ifdef OS2
1866             os2_setsyserrno(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
1867 #      else
1868             /* will anyone ever use this? */
1869             SETERRNO(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv), 4);
1870 #      endif
1871 #    endif
1872 #  endif
1873 #endif
1874         }
1875         else if (strEQ(mg->mg_ptr+1, "NCODING")) {
1876             if (PL_encoding)
1877                 SvREFCNT_dec(PL_encoding);
1878             if (SvOK(sv) || SvGMAGICAL(sv)) {
1879                 PL_encoding = newSVsv(sv);
1880             }
1881             else {
1882                 PL_encoding = Nullsv;
1883             }
1884         }
1885         break;
1886     case '\006':        /* ^F */
1887         PL_maxsysfd = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1888         break;
1889     case '\010':        /* ^H */
1890         PL_hints = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1891         break;
1892     case '\011':        /* ^I */ /* NOT \t in EBCDIC */
1893         if (PL_inplace)
1894             Safefree(PL_inplace);
1895         if (SvOK(sv))
1896             PL_inplace = savepv(SvPV(sv,len));
1897         else
1898             PL_inplace = Nullch;
1899         break;
1900     case '\017':        /* ^O */
1901         if (*(mg->mg_ptr+1) == '\0') {
1902             if (PL_osname)
1903                 Safefree(PL_osname);
1904             if (SvOK(sv))
1905                 PL_osname = savepv(SvPV(sv,len));
1906             else
1907                 PL_osname = Nullch;
1908         }
1909         else if (strEQ(mg->mg_ptr, "\017PEN")) {
1910             if (!PL_compiling.cop_io)
1911                 PL_compiling.cop_io = newSVsv(sv);
1912             else
1913                 sv_setsv(PL_compiling.cop_io,sv);
1914         }
1915         break;
1916     case '\020':        /* ^P */
1917         PL_perldb = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1918         if (PL_perldb && !PL_DBsingle)
1919             init_debugger();
1920         break;
1921     case '\024':        /* ^T */
1922 #ifdef BIG_TIME
1923         PL_basetime = (Time_t)(SvNOK(sv) ? SvNVX(sv) : sv_2nv(sv));
1924 #else
1925         PL_basetime = (Time_t)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
1926 #endif
1927         break;
1928     case '\027':        /* ^W & $^WARNING_BITS & ^WIDE_SYSTEM_CALLS */
1929         if (*(mg->mg_ptr+1) == '\0') {
1930             if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
1931                 i = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1932                 PL_dowarn = (PL_dowarn & ~G_WARN_ON)
1933                                 | (i ? G_WARN_ON : G_WARN_OFF) ;
1934             }
1935         }
1936         else if (strEQ(mg->mg_ptr+1, "ARNING_BITS")) {
1937             if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
1938                 if (!SvPOK(sv) && PL_localizing) {
1939                     sv_setpvn(sv, WARN_NONEstring, WARNsize);
1940                     PL_compiling.cop_warnings = pWARN_NONE;
1941                     break;
1942                 }
1943                 {
1944                     STRLEN len, i;
1945                     int accumulate = 0 ;
1946                     int any_fatals = 0 ;
1947                     char * ptr = (char*)SvPV(sv, len) ;
1948                     for (i = 0 ; i < len ; ++i) {
1949                         accumulate |= ptr[i] ;
1950                         any_fatals |= (ptr[i] & 0xAA) ;
1951                     }
1952                     if (!accumulate)
1953                         PL_compiling.cop_warnings = pWARN_NONE;
1954                     else if (isWARN_on(sv, WARN_ALL) && !any_fatals) {
1955                         PL_compiling.cop_warnings = pWARN_ALL;
1956                         PL_dowarn |= G_WARN_ONCE ;
1957                     }
1958                     else {
1959                         if (specialWARN(PL_compiling.cop_warnings))
1960                             PL_compiling.cop_warnings = newSVsv(sv) ;
1961                         else
1962                             sv_setsv(PL_compiling.cop_warnings, sv);
1963                         if (isWARN_on(PL_compiling.cop_warnings, WARN_ONCE))
1964                             PL_dowarn |= G_WARN_ONCE ;
1965                     }
1966
1967                 }
1968             }
1969         }
1970         else if (strEQ(mg->mg_ptr+1, "IDE_SYSTEM_CALLS"))
1971             PL_widesyscalls = (bool)SvTRUE(sv);
1972         break;
1973     case '.':
1974         if (PL_localizing) {
1975             if (PL_localizing == 1)
1976                 SAVESPTR(PL_last_in_gv);
1977         }
1978         else if (SvOK(sv) && GvIO(PL_last_in_gv))
1979             IoLINES(GvIOp(PL_last_in_gv)) = SvIV(sv);
1980         break;
1981     case '^':
1982         Safefree(IoTOP_NAME(GvIOp(PL_defoutgv)));
1983         IoTOP_NAME(GvIOp(PL_defoutgv)) = s = savepv(SvPV(sv,len));
1984         IoTOP_GV(GvIOp(PL_defoutgv)) = gv_fetchpv(s,TRUE, SVt_PVIO);
1985         break;
1986     case '~':
1987         Safefree(IoFMT_NAME(GvIOp(PL_defoutgv)));
1988         IoFMT_NAME(GvIOp(PL_defoutgv)) = s = savepv(SvPV(sv,len));
1989         IoFMT_GV(GvIOp(PL_defoutgv)) = gv_fetchpv(s,TRUE, SVt_PVIO);
1990         break;
1991     case '=':
1992         IoPAGE_LEN(GvIOp(PL_defoutgv)) = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
1993         break;
1994     case '-':
1995         IoLINES_LEFT(GvIOp(PL_defoutgv)) = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
1996         if (IoLINES_LEFT(GvIOp(PL_defoutgv)) < 0L)
1997             IoLINES_LEFT(GvIOp(PL_defoutgv)) = 0L;
1998         break;
1999     case '%':
2000         IoPAGE(GvIOp(PL_defoutgv)) = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2001         break;
2002     case '|':
2003         {
2004             IO *io = GvIOp(PL_defoutgv);
2005             if(!io)
2006               break;
2007             if ((SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) == 0)
2008                 IoFLAGS(io) &= ~IOf_FLUSH;
2009             else {
2010                 if (!(IoFLAGS(io) & IOf_FLUSH)) {
2011                     PerlIO *ofp = IoOFP(io);
2012                     if (ofp)
2013                         (void)PerlIO_flush(ofp);
2014                     IoFLAGS(io) |= IOf_FLUSH;
2015                 }
2016             }
2017         }
2018         break;
2019     case '*':
2020         i = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2021         PL_multiline = (i != 0);
2022         break;
2023     case '/':
2024         SvREFCNT_dec(PL_rs);
2025         PL_rs = newSVsv(sv);
2026         break;
2027     case '\\':
2028         if (PL_ors_sv)
2029             SvREFCNT_dec(PL_ors_sv);
2030         if (SvOK(sv) || SvGMAGICAL(sv)) {
2031             PL_ors_sv = newSVsv(sv);
2032         }
2033         else {
2034             PL_ors_sv = Nullsv;
2035         }
2036         break;
2037     case ',':
2038         if (PL_ofs_sv)
2039             SvREFCNT_dec(PL_ofs_sv);
2040         if (SvOK(sv) || SvGMAGICAL(sv)) {
2041             PL_ofs_sv = newSVsv(sv);
2042         }
2043         else {
2044             PL_ofs_sv = Nullsv;
2045         }
2046         break;
2047     case '#':
2048         if (PL_ofmt)
2049             Safefree(PL_ofmt);
2050         PL_ofmt = savepv(SvPV(sv,len));
2051         break;
2052     case '[':
2053         PL_compiling.cop_arybase = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2054         break;
2055     case '?':
2056 #ifdef COMPLEX_STATUS
2057         if (PL_localizing == 2) {
2058             PL_statusvalue = LvTARGOFF(sv);
2059             PL_statusvalue_vms = LvTARGLEN(sv);
2060         }
2061         else
2062 #endif
2063 #ifdef VMSISH_STATUS
2064         if (VMSISH_STATUS)
2065             STATUS_NATIVE_SET((U32)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)));
2066         else
2067 #endif
2068             STATUS_POSIX_SET(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2069         break;
2070     case '!':
2071         {
2072 #ifdef VMS
2073 #   define PERL_VMS_BANG vaxc$errno
2074 #else
2075 #   define PERL_VMS_BANG 0
2076 #endif
2077         SETERRNO(SvIOK(sv) ? SvIVX(sv) : SvOK(sv) ? sv_2iv(sv) : 0,
2078                  (SvIV(sv) == EVMSERR) ? 4 : PERL_VMS_BANG);
2079         }
2080         break;
2081     case '<':
2082         PL_uid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2083         if (PL_delaymagic) {
2084             PL_delaymagic |= DM_RUID;
2085             break;                              /* don't do magic till later */
2086         }
2087 #ifdef HAS_SETRUID
2088         (void)setruid((Uid_t)PL_uid);
2089 #else
2090 #ifdef HAS_SETREUID
2091         (void)setreuid((Uid_t)PL_uid, (Uid_t)-1);
2092 #else
2093 #ifdef HAS_SETRESUID
2094       (void)setresuid((Uid_t)PL_uid, (Uid_t)-1, (Uid_t)-1);
2095 #else
2096         if (PL_uid == PL_euid)          /* special case $< = $> */
2097             (void)PerlProc_setuid(PL_uid);
2098         else {
2099             PL_uid = PerlProc_getuid();
2100             Perl_croak(aTHX_ "setruid() not implemented");
2101         }
2102 #endif
2103 #endif
2104 #endif
2105         PL_uid = PerlProc_getuid();
2106         PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2107         break;
2108     case '>':
2109         PL_euid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2110         if (PL_delaymagic) {
2111             PL_delaymagic |= DM_EUID;
2112             break;                              /* don't do magic till later */
2113         }
2114 #ifdef HAS_SETEUID
2115         (void)seteuid((Uid_t)PL_euid);
2116 #else
2117 #ifdef HAS_SETREUID
2118         (void)setreuid((Uid_t)-1, (Uid_t)PL_euid);
2119 #else
2120 #ifdef HAS_SETRESUID
2121         (void)setresuid((Uid_t)-1, (Uid_t)PL_euid, (Uid_t)-1);
2122 #else
2123         if (PL_euid == PL_uid)          /* special case $> = $< */
2124             PerlProc_setuid(PL_euid);
2125         else {
2126             PL_euid = PerlProc_geteuid();
2127             Perl_croak(aTHX_ "seteuid() not implemented");
2128         }
2129 #endif
2130 #endif
2131 #endif
2132         PL_euid = PerlProc_geteuid();
2133         PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2134         break;
2135     case '(':
2136         PL_gid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2137         if (PL_delaymagic) {
2138             PL_delaymagic |= DM_RGID;
2139             break;                              /* don't do magic till later */
2140         }
2141 #ifdef HAS_SETRGID
2142         (void)setrgid((Gid_t)PL_gid);
2143 #else
2144 #ifdef HAS_SETREGID
2145         (void)setregid((Gid_t)PL_gid, (Gid_t)-1);
2146 #else
2147 #ifdef HAS_SETRESGID
2148       (void)setresgid((Gid_t)PL_gid, (Gid_t)-1, (Gid_t) 1);
2149 #else
2150         if (PL_gid == PL_egid)                  /* special case $( = $) */
2151             (void)PerlProc_setgid(PL_gid);
2152         else {
2153             PL_gid = PerlProc_getgid();
2154             Perl_croak(aTHX_ "setrgid() not implemented");
2155         }
2156 #endif
2157 #endif
2158 #endif
2159         PL_gid = PerlProc_getgid();
2160         PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2161         break;
2162     case ')':
2163 #ifdef HAS_SETGROUPS
2164         {
2165             char *p = SvPV(sv, len);
2166             Groups_t gary[NGROUPS];
2167
2168             while (isSPACE(*p))
2169                 ++p;
2170             PL_egid = Atol(p);
2171             for (i = 0; i < NGROUPS; ++i) {
2172                 while (*p && !isSPACE(*p))
2173                     ++p;
2174                 while (isSPACE(*p))
2175                     ++p;
2176                 if (!*p)
2177                     break;
2178                 gary[i] = Atol(p);
2179             }
2180             if (i)
2181                 (void)setgroups(i, gary);
2182         }
2183 #else  /* HAS_SETGROUPS */
2184         PL_egid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2185 #endif /* HAS_SETGROUPS */
2186         if (PL_delaymagic) {
2187             PL_delaymagic |= DM_EGID;
2188             break;                              /* don't do magic till later */
2189         }
2190 #ifdef HAS_SETEGID
2191         (void)setegid((Gid_t)PL_egid);
2192 #else
2193 #ifdef HAS_SETREGID
2194         (void)setregid((Gid_t)-1, (Gid_t)PL_egid);
2195 #else
2196 #ifdef HAS_SETRESGID
2197         (void)setresgid((Gid_t)-1, (Gid_t)PL_egid, (Gid_t)-1);
2198 #else
2199         if (PL_egid == PL_gid)                  /* special case $) = $( */
2200             (void)PerlProc_setgid(PL_egid);
2201         else {
2202             PL_egid = PerlProc_getegid();
2203             Perl_croak(aTHX_ "setegid() not implemented");
2204         }
2205 #endif
2206 #endif
2207 #endif
2208         PL_egid = PerlProc_getegid();
2209         PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2210         break;
2211     case ':':
2212         PL_chopset = SvPV_force(sv,len);
2213         break;
2214 #ifndef MACOS_TRADITIONAL
2215     case '0':
2216         LOCK_DOLLARZERO_MUTEX;
2217 #ifdef HAS_SETPROCTITLE
2218         /* The BSDs don't show the argv[] in ps(1) output, they
2219          * show a string from the process struct and provide
2220          * the setproctitle() routine to manipulate that. */
2221         {
2222             s = SvPV(sv, len);
2223 #   if __FreeBSD_version > 410001
2224             /* The leading "-" removes the "perl: " prefix,
2225              * but not the "(perl) suffix from the ps(1)
2226              * output, because that's what ps(1) shows if the
2227              * argv[] is modified. */
2228             setproctitle("-%s", s);
2229 #   else        /* old FreeBSDs, NetBSD, OpenBSD, anyBSD */
2230             /* This doesn't really work if you assume that
2231              * $0 = 'foobar'; will wipe out 'perl' from the $0
2232              * because in ps(1) output the result will be like
2233              * sprintf("perl: %s (perl)", s)
2234              * I guess this is a security feature:
2235              * one (a user process) cannot get rid of the original name.
2236              * --jhi */
2237             setproctitle("%s", s);
2238 #   endif
2239         }
2240 #endif
2241 #if defined(__hpux) && defined(PSTAT_SETCMD)
2242         {
2243              union pstun un;
2244              s = SvPV(sv, len);
2245              un.pst_command = s;
2246              pstat(PSTAT_SETCMD, un, len, 0, 0);
2247         }
2248 #endif
2249         if (!PL_origalen) {
2250             s = PL_origargv[0];
2251             s += strlen(s);
2252             /* See if all the arguments are contiguous in memory */
2253             for (i = 1; i < PL_origargc; i++) {
2254                 if (PL_origargv[i] == s + 1
2255 #ifdef OS2
2256                     || PL_origargv[i] == s + 2
2257 #endif
2258                    )
2259                 {
2260                     ++s;
2261                     s += strlen(s);     /* this one is ok too */
2262                 }
2263                 else
2264                     break;
2265             }
2266             /* can grab env area too? */
2267             if (PL_origenviron
2268 #ifdef USE_ITHREADS
2269                 && PL_curinterp == aTHX
2270 #endif
2271                 && (PL_origenviron[0] == s + 1))
2272             {
2273                 my_setenv("NoNe  SuCh", Nullch);
2274                                             /* force copy of environment */
2275                 for (i = 0; PL_origenviron[i]; i++)
2276                     if (PL_origenviron[i] == s + 1) {
2277                         ++s;
2278                         s += strlen(s);
2279                     }
2280                     else
2281                         break;
2282             }
2283             PL_origalen = s - PL_origargv[0];
2284         }
2285         s = SvPV_force(sv,len);
2286         i = len;
2287         if (i >= (I32)PL_origalen) {
2288             i = PL_origalen;
2289             /* don't allow system to limit $0 seen by script */
2290             /* SvCUR_set(sv, i); *SvEND(sv) = '\0'; */
2291             Copy(s, PL_origargv[0], i, char);
2292             s = PL_origargv[0]+i;
2293             *s = '\0';
2294         }
2295         else {
2296             Copy(s, PL_origargv[0], i, char);
2297             s = PL_origargv[0]+i;
2298             *s++ = '\0';
2299             while (++i < (I32)PL_origalen)
2300                 *s++ = '\0';
2301             for (i = 1; i < PL_origargc; i++)
2302                 PL_origargv[i] = Nullch;
2303         }
2304         UNLOCK_DOLLARZERO_MUTEX;
2305         break;
2306 #endif
2307     }
2308     return 0;
2309 }
2310
2311 I32
2312 Perl_whichsig(pTHX_ char *sig)
2313 {
2314     register char **sigv;
2315
2316     for (sigv = PL_sig_name+1; *sigv; sigv++)
2317         if (strEQ(sig,*sigv))
2318             return PL_sig_num[sigv - PL_sig_name];
2319 #ifdef SIGCLD
2320     if (strEQ(sig,"CHLD"))
2321         return SIGCLD;
2322 #endif
2323 #ifdef SIGCHLD
2324     if (strEQ(sig,"CLD"))
2325         return SIGCHLD;
2326 #endif
2327     return 0;
2328 }
2329
2330 #if !defined(PERL_IMPLICIT_CONTEXT)
2331 static SV* sig_sv;
2332 #endif
2333
2334 Signal_t
2335 Perl_sighandler(int sig)
2336 {
2337 #ifdef PERL_GET_SIG_CONTEXT
2338     dTHXa(PERL_GET_SIG_CONTEXT);
2339 #else
2340     dTHX;
2341 #endif
2342     dSP;
2343     GV *gv = Nullgv;
2344     HV *st;
2345     SV *sv = Nullsv, *tSv = PL_Sv;
2346     CV *cv = Nullcv;
2347     OP *myop = PL_op;
2348     U32 flags = 0;
2349     XPV *tXpv = PL_Xpv;
2350
2351     if (PL_savestack_ix + 15 <= PL_savestack_max)
2352         flags |= 1;
2353     if (PL_markstack_ptr < PL_markstack_max - 2)
2354         flags |= 4;
2355     if (PL_retstack_ix < PL_retstack_max - 2)
2356         flags |= 8;
2357     if (PL_scopestack_ix < PL_scopestack_max - 3)
2358         flags |= 16;
2359
2360     if (!PL_psig_ptr[sig]) {
2361                 PerlIO_printf(Perl_error_log, "Signal SIG%s received, but no signal handler set.\n",
2362                                  PL_sig_name[sig]);
2363                 exit(sig);
2364         }
2365
2366     /* Max number of items pushed there is 3*n or 4. We cannot fix
2367        infinity, so we fix 4 (in fact 5): */
2368     if (flags & 1) {
2369         PL_savestack_ix += 5;           /* Protect save in progress. */
2370         SAVEDESTRUCTOR_X(unwind_handler_stack, (void*)&flags);
2371     }
2372     if (flags & 4)
2373         PL_markstack_ptr++;             /* Protect mark. */
2374     if (flags & 8) {
2375         PL_retstack_ix++;
2376         PL_retstack[PL_retstack_ix] = NULL;
2377     }
2378     if (flags & 16)
2379         PL_scopestack_ix += 1;
2380     /* sv_2cv is too complicated, try a simpler variant first: */
2381     if (!SvROK(PL_psig_ptr[sig]) || !(cv = (CV*)SvRV(PL_psig_ptr[sig]))
2382         || SvTYPE(cv) != SVt_PVCV)
2383         cv = sv_2cv(PL_psig_ptr[sig],&st,&gv,TRUE);
2384
2385     if (!cv || !CvROOT(cv)) {
2386         if (ckWARN(WARN_SIGNAL))
2387             Perl_warner(aTHX_ packWARN(WARN_SIGNAL), "SIG%s handler \"%s\" not defined.\n",
2388                 PL_sig_name[sig], (gv ? GvENAME(gv)
2389                                 : ((cv && CvGV(cv))
2390                                    ? GvENAME(CvGV(cv))
2391                                    : "__ANON__")));
2392         goto cleanup;
2393     }
2394
2395     if(PL_psig_name[sig]) {
2396         sv = SvREFCNT_inc(PL_psig_name[sig]);
2397         flags |= 64;
2398 #if !defined(PERL_IMPLICIT_CONTEXT)
2399         sig_sv = sv;
2400 #endif
2401     } else {
2402         sv = sv_newmortal();
2403         sv_setpv(sv,PL_sig_name[sig]);
2404     }
2405
2406     PUSHSTACKi(PERLSI_SIGNAL);
2407     PUSHMARK(SP);
2408     PUSHs(sv);
2409     PUTBACK;
2410
2411     call_sv((SV*)cv, G_DISCARD|G_EVAL);
2412
2413     POPSTACK;
2414     if (SvTRUE(ERRSV)) {
2415 #ifndef PERL_MICRO
2416 #ifdef HAS_SIGPROCMASK
2417         /* Handler "died", for example to get out of a restart-able read().
2418          * Before we re-do that on its behalf re-enable the signal which was
2419          * blocked by the system when we entered.
2420          */
2421         sigset_t set;
2422         sigemptyset(&set);
2423         sigaddset(&set,sig);
2424         sigprocmask(SIG_UNBLOCK, &set, NULL);
2425 #else
2426         /* Not clear if this will work */
2427         (void)rsignal(sig, SIG_IGN);
2428         (void)rsignal(sig, &Perl_csighandler);
2429 #endif
2430 #endif /* !PERL_MICRO */
2431         Perl_die(aTHX_ Nullformat);
2432     }
2433 cleanup:
2434     if (flags & 1)
2435         PL_savestack_ix -= 8; /* Unprotect save in progress. */
2436     if (flags & 4)
2437         PL_markstack_ptr--;
2438     if (flags & 8)
2439         PL_retstack_ix--;
2440     if (flags & 16)
2441         PL_scopestack_ix -= 1;
2442     if (flags & 64)
2443         SvREFCNT_dec(sv);
2444     PL_op = myop;                       /* Apparently not needed... */
2445
2446     PL_Sv = tSv;                        /* Restore global temporaries. */
2447     PL_Xpv = tXpv;
2448     return;
2449 }
2450
2451
2452 static void
2453 restore_magic(pTHX_ void *p)
2454 {
2455     MGS* mgs = SSPTR(PTR2IV(p), MGS*);
2456     SV* sv = mgs->mgs_sv;
2457
2458     if (!sv)
2459         return;
2460
2461     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
2462     {
2463         if (mgs->mgs_flags)
2464             SvFLAGS(sv) |= mgs->mgs_flags;
2465         else
2466             mg_magical(sv);
2467         if (SvGMAGICAL(sv))
2468             SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
2469     }
2470
2471     mgs->mgs_sv = NULL;  /* mark the MGS structure as restored */
2472
2473     /* If we're still on top of the stack, pop us off.  (That condition
2474      * will be satisfied if restore_magic was called explicitly, but *not*
2475      * if it's being called via leave_scope.)
2476      * The reason for doing this is that otherwise, things like sv_2cv()
2477      * may leave alloc gunk on the savestack, and some code
2478      * (e.g. sighandler) doesn't expect that...
2479      */
2480     if (PL_savestack_ix == mgs->mgs_ss_ix)
2481     {
2482         I32 popval = SSPOPINT;
2483         assert(popval == SAVEt_DESTRUCTOR_X);
2484         PL_savestack_ix -= 2;
2485         popval = SSPOPINT;
2486         assert(popval == SAVEt_ALLOC);
2487         popval = SSPOPINT;
2488         PL_savestack_ix -= popval;
2489     }
2490
2491 }
2492
2493 static void
2494 unwind_handler_stack(pTHX_ void *p)
2495 {
2496     U32 flags = *(U32*)p;
2497
2498     if (flags & 1)
2499         PL_savestack_ix -= 5; /* Unprotect save in progress. */
2500     /* cxstack_ix-- Not needed, die already unwound it. */
2501 #if !defined(PERL_IMPLICIT_CONTEXT)
2502     if (flags & 64)
2503         SvREFCNT_dec(sig_sv);
2504 #endif
2505 }
2506
2507