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