3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4 * 2000, 2001, 2002, 2003, 2004, 2005 by Larry Wall and others
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
12 * "Sam sat on the ground and put his head in his hands. 'I wish I had never
13 * come here, and I don't want to see no more magic,' he said, and fell silent."
17 =head1 Magical Functions
19 "Magic" is special data attached to SV structures in order to give them
20 "magical" properties. When any Perl code tries to read from, or assign to,
21 an SV marked as magical, it calls the 'get' or 'set' function associated
22 with that SV's magic. A get is called prior to reading an SV, in order to
23 give it a chance to update its internal value (get on $. writes the line
24 number of the last read filehandle into to the SV's IV slot), while
25 set is called after an SV has been written to, in order to allow it to make
26 use of its changed value (set on $/ copies the SV's new value to the
27 PL_rs global variable).
29 Magic is implemented as a linked list of MAGIC structures attached to the
30 SV. Each MAGIC struct holds the type of the magic, a pointer to an array
31 of functions that implement the get(), set(), length() etc functions,
32 plus space for some flags and pointers. For example, a tied variable has
33 a MAGIC structure that contains a pointer to the object associated with the
42 #if defined(HAS_GETGROUPS) || defined(HAS_SETGROUPS)
52 # include <sys/pstat.h>
55 Signal_t Perl_csighandler(int sig);
57 /* if you only have signal() and it resets on each signal, FAKE_PERSISTENT_SIGNAL_HANDLERS fixes */
58 #if !defined(HAS_SIGACTION) && defined(VMS)
59 # define FAKE_PERSISTENT_SIGNAL_HANDLERS
61 /* if we're doing kill() with sys$sigprc on VMS, FAKE_DEFAULT_SIGNAL_HANDLERS */
62 #if defined(KILL_BY_SIGPRC)
63 # define FAKE_DEFAULT_SIGNAL_HANDLERS
66 static void restore_magic(pTHX_ const void *p);
67 static void unwind_handler_stack(pTHX_ const void *p);
70 /* Missing protos on LynxOS */
71 void setruid(uid_t id);
72 void seteuid(uid_t id);
73 void setrgid(uid_t id);
74 void setegid(uid_t id);
78 * Use the "DESTRUCTOR" scope cleanup to reinstate magic.
86 /* MGS is typedef'ed to struct magic_state in perl.h */
89 S_save_magic(pTHX_ I32 mgs_ix, SV *sv)
92 assert(SvMAGICAL(sv));
93 #ifdef PERL_COPY_ON_WRITE
94 /* Turning READONLY off for a copy-on-write scalar is a bad idea. */
99 SAVEDESTRUCTOR_X(restore_magic, INT2PTR(void*, (IV)mgs_ix));
101 mgs = SSPTR(mgs_ix, MGS*);
103 mgs->mgs_flags = SvMAGICAL(sv) | SvREADONLY(sv);
104 mgs->mgs_ss_ix = PL_savestack_ix; /* points after the saved destructor */
108 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_NOK|SVp_POK)) >> PRIVSHIFT;
112 =for apidoc mg_magical
114 Turns on the magical status of an SV. See C<sv_magic>.
120 Perl_mg_magical(pTHX_ SV *sv)
123 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
124 const MGVTBL* const vtbl = mg->mg_virtual;
126 if (vtbl->svt_get && !(mg->mg_flags & MGf_GSKIP))
130 if (!(SvFLAGS(sv) & (SVs_GMG|SVs_SMG)) || vtbl->svt_clear)
139 Do magic after a value is retrieved from the SV. See C<sv_magic>.
145 Perl_mg_get(pTHX_ SV *sv)
147 const I32 mgs_ix = SSNEW(sizeof(MGS));
148 const bool was_temp = (bool)SvTEMP(sv);
150 MAGIC *newmg, *head, *cur, *mg;
151 /* guard against sv having being freed midway by holding a private
154 /* sv_2mortal has this side effect of turning on the TEMP flag, which can
155 cause the SV's buffer to get stolen (and maybe other stuff).
158 sv_2mortal(SvREFCNT_inc(sv));
163 save_magic(mgs_ix, sv);
165 /* We must call svt_get(sv, mg) for each valid entry in the linked
166 list of magic. svt_get() may delete the current entry, add new
167 magic to the head of the list, or upgrade the SV. AMS 20010810 */
169 newmg = cur = head = mg = SvMAGIC(sv);
171 const MGVTBL * const vtbl = mg->mg_virtual;
173 if (!(mg->mg_flags & MGf_GSKIP) && vtbl && vtbl->svt_get) {
174 CALL_FPTR(vtbl->svt_get)(aTHX_ sv, mg);
176 /* guard against magic having been deleted - eg FETCH calling
181 /* Don't restore the flags for this entry if it was deleted. */
182 if (mg->mg_flags & MGf_GSKIP)
183 (SSPTR(mgs_ix, MGS *))->mgs_flags = 0;
186 mg = mg->mg_moremagic;
189 /* Have we finished with the new entries we saw? Start again
190 where we left off (unless there are more new entries). */
198 /* Were any new entries added? */
199 if (!have_new && (newmg = SvMAGIC(sv)) != head) {
206 restore_magic(aTHX_ INT2PTR(void *, (IV)mgs_ix));
208 if (SvREFCNT(sv) == 1) {
209 /* We hold the last reference to this SV, which implies that the
210 SV was deleted as a side effect of the routines we called. */
219 Do magic after a value is assigned to the SV. See C<sv_magic>.
225 Perl_mg_set(pTHX_ SV *sv)
227 const I32 mgs_ix = SSNEW(sizeof(MGS));
231 save_magic(mgs_ix, sv);
233 for (mg = SvMAGIC(sv); mg; mg = nextmg) {
234 const MGVTBL* vtbl = mg->mg_virtual;
235 nextmg = mg->mg_moremagic; /* it may delete itself */
236 if (mg->mg_flags & MGf_GSKIP) {
237 mg->mg_flags &= ~MGf_GSKIP; /* setting requires another read */
238 (SSPTR(mgs_ix, MGS*))->mgs_flags = 0;
240 if (vtbl && vtbl->svt_set)
241 CALL_FPTR(vtbl->svt_set)(aTHX_ sv, mg);
244 restore_magic(aTHX_ INT2PTR(void*, (IV)mgs_ix));
249 =for apidoc mg_length
251 Report on the SV's length. See C<sv_magic>.
257 Perl_mg_length(pTHX_ SV *sv)
262 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
263 const MGVTBL * const vtbl = mg->mg_virtual;
264 if (vtbl && vtbl->svt_len) {
265 const I32 mgs_ix = SSNEW(sizeof(MGS));
266 save_magic(mgs_ix, sv);
267 /* omit MGf_GSKIP -- not changed here */
268 len = CALL_FPTR(vtbl->svt_len)(aTHX_ sv, mg);
269 restore_magic(aTHX_ INT2PTR(void*, (IV)mgs_ix));
275 U8 *s = (U8*)SvPV(sv, len);
276 len = Perl_utf8_length(aTHX_ s, s + len);
284 Perl_mg_size(pTHX_ SV *sv)
288 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
289 const MGVTBL* const vtbl = mg->mg_virtual;
290 if (vtbl && vtbl->svt_len) {
291 const I32 mgs_ix = SSNEW(sizeof(MGS));
293 save_magic(mgs_ix, sv);
294 /* omit MGf_GSKIP -- not changed here */
295 len = CALL_FPTR(vtbl->svt_len)(aTHX_ sv, mg);
296 restore_magic(aTHX_ INT2PTR(void*, (IV)mgs_ix));
303 return AvFILLp((AV *) sv); /* Fallback to non-tied array */
307 Perl_croak(aTHX_ "Size magic not implemented");
316 Clear something magical that the SV represents. See C<sv_magic>.
322 Perl_mg_clear(pTHX_ SV *sv)
324 const I32 mgs_ix = SSNEW(sizeof(MGS));
327 save_magic(mgs_ix, sv);
329 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
330 const MGVTBL* const vtbl = mg->mg_virtual;
331 /* omit GSKIP -- never set here */
333 if (vtbl && vtbl->svt_clear)
334 CALL_FPTR(vtbl->svt_clear)(aTHX_ sv, mg);
337 restore_magic(aTHX_ INT2PTR(void*, (IV)mgs_ix));
344 Finds the magic pointer for type matching the SV. See C<sv_magic>.
350 Perl_mg_find(pTHX_ const SV *sv, int type)
354 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
355 if (mg->mg_type == type)
365 Copies the magic from one SV to another. See C<sv_magic>.
371 Perl_mg_copy(pTHX_ SV *sv, SV *nsv, const char *key, I32 klen)
375 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
376 const MGVTBL* const vtbl = mg->mg_virtual;
377 if ((mg->mg_flags & MGf_COPY) && vtbl->svt_copy){
378 count += CALL_FPTR(vtbl->svt_copy)(aTHX_ sv, mg, nsv, key, klen);
380 else if (isUPPER(mg->mg_type)) {
382 mg->mg_type == PERL_MAGIC_tied ? SvTIED_obj(sv, mg) :
383 (mg->mg_type == PERL_MAGIC_regdata && mg->mg_obj)
385 toLOWER(mg->mg_type), key, klen);
395 Free any magic storage used by the SV. See C<sv_magic>.
401 Perl_mg_free(pTHX_ SV *sv)
405 for (mg = SvMAGIC(sv); mg; mg = moremagic) {
406 const MGVTBL* const vtbl = mg->mg_virtual;
407 moremagic = mg->mg_moremagic;
408 if (vtbl && vtbl->svt_free)
409 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
410 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
411 if (mg->mg_len > 0 || mg->mg_type == PERL_MAGIC_utf8)
412 Safefree(mg->mg_ptr);
413 else if (mg->mg_len == HEf_SVKEY)
414 SvREFCNT_dec((SV*)mg->mg_ptr);
416 if (mg->mg_flags & MGf_REFCOUNTED)
417 SvREFCNT_dec(mg->mg_obj);
420 SvMAGIC_set(sv, NULL);
427 Perl_magic_regdata_cnt(pTHX_ SV *sv, MAGIC *mg)
429 register const REGEXP *rx;
432 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
433 if (mg->mg_obj) /* @+ */
436 return rx->lastparen;
443 Perl_magic_regdatum_get(pTHX_ SV *sv, MAGIC *mg)
447 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
448 register const I32 paren = mg->mg_len;
453 if (paren <= (I32)rx->nparens &&
454 (s = rx->startp[paren]) != -1 &&
455 (t = rx->endp[paren]) != -1)
458 if (mg->mg_obj) /* @+ */
463 if (i > 0 && RX_MATCH_UTF8(rx)) {
464 char *b = rx->subbeg;
466 i = Perl_utf8_length(aTHX_ (U8*)b, (U8*)(b+i));
476 Perl_magic_regdatum_set(pTHX_ SV *sv, MAGIC *mg)
479 Perl_croak(aTHX_ PL_no_modify);
482 /* No __attribute__, so the compiler doesn't know that croak never returns
489 Perl_magic_len(pTHX_ SV *sv, MAGIC *mg)
493 register const REGEXP *rx;
496 switch (*mg->mg_ptr) {
497 case '1': case '2': case '3': case '4':
498 case '5': case '6': case '7': case '8': case '9': case '&':
499 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
501 paren = atoi(mg->mg_ptr); /* $& is in [0] */
503 if (paren <= (I32)rx->nparens &&
504 (s1 = rx->startp[paren]) != -1 &&
505 (t1 = rx->endp[paren]) != -1)
509 if (i > 0 && RX_MATCH_UTF8(rx)) {
510 char *s = rx->subbeg + s1;
511 char *send = rx->subbeg + t1;
514 if (is_utf8_string((U8*)s, i))
515 i = Perl_utf8_length(aTHX_ (U8*)s, (U8*)send);
518 Perl_croak(aTHX_ "panic: magic_len: %"IVdf, (IV)i);
522 if (ckWARN(WARN_UNINITIALIZED))
527 if (ckWARN(WARN_UNINITIALIZED))
532 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
533 paren = rx->lastparen;
538 case '\016': /* ^N */
539 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
540 paren = rx->lastcloseparen;
546 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
547 if (rx->startp[0] != -1) {
558 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
559 if (rx->endp[0] != -1) {
560 i = rx->sublen - rx->endp[0];
571 if (!SvPOK(sv) && SvNIOK(sv)) {
581 Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
585 register char *s = NULL;
589 switch (*mg->mg_ptr) {
590 case '\001': /* ^A */
591 sv_setsv(sv, PL_bodytarget);
593 case '\003': /* ^C */
594 sv_setiv(sv, (IV)PL_minus_c);
597 case '\004': /* ^D */
598 sv_setiv(sv, (IV)(PL_debug & DEBUG_MASK));
600 case '\005': /* ^E */
601 if (*(mg->mg_ptr+1) == '\0') {
602 #ifdef MACOS_TRADITIONAL
606 sv_setnv(sv,(double)gMacPerl_OSErr);
607 sv_setpv(sv, gMacPerl_OSErr ? GetSysErrText(gMacPerl_OSErr, msg) : "");
612 # include <descrip.h>
613 # include <starlet.h>
615 $DESCRIPTOR(msgdsc,msg);
616 sv_setnv(sv,(NV) vaxc$errno);
617 if (sys$getmsg(vaxc$errno,&msgdsc.dsc$w_length,&msgdsc,0,0) & 1)
618 sv_setpvn(sv,msgdsc.dsc$a_pointer,msgdsc.dsc$w_length);
624 if (!(_emx_env & 0x200)) { /* Under DOS */
625 sv_setnv(sv, (NV)errno);
626 sv_setpv(sv, errno ? Strerror(errno) : "");
628 if (errno != errno_isOS2) {
629 int tmp = _syserrno();
630 if (tmp) /* 2nd call to _syserrno() makes it 0 */
633 sv_setnv(sv, (NV)Perl_rc);
634 sv_setpv(sv, os2error(Perl_rc));
639 DWORD dwErr = GetLastError();
640 sv_setnv(sv, (NV)dwErr);
643 PerlProc_GetOSError(sv, dwErr);
651 int saveerrno = errno;
652 sv_setnv(sv, (NV)errno);
653 sv_setpv(sv, errno ? Strerror(errno) : "");
660 SvNOK_on(sv); /* what a wonderful hack! */
662 else if (strEQ(mg->mg_ptr+1, "NCODING"))
663 sv_setsv(sv, PL_encoding);
665 case '\006': /* ^F */
666 sv_setiv(sv, (IV)PL_maxsysfd);
668 case '\010': /* ^H */
669 sv_setiv(sv, (IV)PL_hints);
671 case '\011': /* ^I */ /* NOT \t in EBCDIC */
673 sv_setpv(sv, PL_inplace);
675 sv_setsv(sv, &PL_sv_undef);
677 case '\017': /* ^O & ^OPEN */
678 if (*(mg->mg_ptr+1) == '\0') {
679 sv_setpv(sv, PL_osname);
682 else if (strEQ(mg->mg_ptr, "\017PEN")) {
683 if (!PL_compiling.cop_io)
684 sv_setsv(sv, &PL_sv_undef);
686 sv_setsv(sv, PL_compiling.cop_io);
690 case '\020': /* ^P */
691 sv_setiv(sv, (IV)PL_perldb);
693 case '\023': /* ^S */
694 if (*(mg->mg_ptr+1) == '\0') {
695 if (PL_lex_state != LEX_NOTPARSING)
698 sv_setiv(sv, PL_in_eval & ~(EVAL_INREQUIRE));
703 case '\024': /* ^T */
704 if (*(mg->mg_ptr+1) == '\0') {
706 sv_setnv(sv, PL_basetime);
708 sv_setiv(sv, (IV)PL_basetime);
711 else if (strEQ(mg->mg_ptr, "\024AINT"))
712 sv_setiv(sv, PL_tainting
713 ? (PL_taint_warn || PL_unsafe ? -1 : 1)
716 case '\025': /* $^UNICODE, $^UTF8LOCALE */
717 if (strEQ(mg->mg_ptr, "\025NICODE"))
718 sv_setuv(sv, (UV) PL_unicode);
719 else if (strEQ(mg->mg_ptr, "\025TF8LOCALE"))
720 sv_setuv(sv, (UV) PL_utf8locale);
722 case '\027': /* ^W & $^WARNING_BITS */
723 if (*(mg->mg_ptr+1) == '\0')
724 sv_setiv(sv, (IV)((PL_dowarn & G_WARN_ON) ? TRUE : FALSE));
725 else if (strEQ(mg->mg_ptr+1, "ARNING_BITS")) {
726 if (PL_compiling.cop_warnings == pWARN_NONE ||
727 PL_compiling.cop_warnings == pWARN_STD)
729 sv_setpvn(sv, WARN_NONEstring, WARNsize) ;
731 else if (PL_compiling.cop_warnings == pWARN_ALL) {
732 /* Get the bit mask for $warnings::Bits{all}, because
733 * it could have been extended by warnings::register */
735 HV *bits=get_hv("warnings::Bits", FALSE);
736 if (bits && (bits_all=hv_fetch(bits, "all", 3, FALSE))) {
737 sv_setsv(sv, *bits_all);
740 sv_setpvn(sv, WARN_ALLstring, WARNsize) ;
744 sv_setsv(sv, PL_compiling.cop_warnings);
749 case '1': case '2': case '3': case '4':
750 case '5': case '6': case '7': case '8': case '9': case '&':
751 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
755 * Pre-threads, this was paren = atoi(GvENAME((GV*)mg->mg_obj));
756 * XXX Does the new way break anything?
758 paren = atoi(mg->mg_ptr); /* $& is in [0] */
760 if (paren <= (I32)rx->nparens &&
761 (s1 = rx->startp[paren]) != -1 &&
762 (t1 = rx->endp[paren]) != -1)
772 if (RX_MATCH_UTF8(rx) && is_utf8_string((U8*)s, i))
777 if (RX_MATCH_TAINTED(rx)) {
778 MAGIC* mg = SvMAGIC(sv);
781 SvMAGIC_set(sv, mg->mg_moremagic);
783 if ((mgt = SvMAGIC(sv))) {
784 mg->mg_moremagic = mgt;
794 sv_setsv(sv,&PL_sv_undef);
797 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
798 paren = rx->lastparen;
802 sv_setsv(sv,&PL_sv_undef);
804 case '\016': /* ^N */
805 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
806 paren = rx->lastcloseparen;
810 sv_setsv(sv,&PL_sv_undef);
813 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
814 if ((s = rx->subbeg) && rx->startp[0] != -1) {
819 sv_setsv(sv,&PL_sv_undef);
822 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
823 if (rx->subbeg && rx->endp[0] != -1) {
824 s = rx->subbeg + rx->endp[0];
825 i = rx->sublen - rx->endp[0];
829 sv_setsv(sv,&PL_sv_undef);
833 if (GvIO(PL_last_in_gv)) {
834 sv_setiv(sv, (IV)IoLINES(GvIOp(PL_last_in_gv)));
840 sv_setiv(sv, (IV)STATUS_CURRENT);
841 #ifdef COMPLEX_STATUS
842 LvTARGOFF(sv) = PL_statusvalue;
843 LvTARGLEN(sv) = PL_statusvalue_vms;
848 if (GvIOp(PL_defoutgv))
849 s = IoTOP_NAME(GvIOp(PL_defoutgv));
853 sv_setpv(sv,GvENAME(PL_defoutgv));
858 if (GvIOp(PL_defoutgv))
859 s = IoFMT_NAME(GvIOp(PL_defoutgv));
861 s = GvENAME(PL_defoutgv);
866 if (GvIOp(PL_defoutgv))
867 sv_setiv(sv, (IV)IoPAGE_LEN(GvIOp(PL_defoutgv)));
870 if (GvIOp(PL_defoutgv))
871 sv_setiv(sv, (IV)IoLINES_LEFT(GvIOp(PL_defoutgv)));
874 if (GvIOp(PL_defoutgv))
875 sv_setiv(sv, (IV)IoPAGE(GvIOp(PL_defoutgv)));
883 WITH_THR(sv_setiv(sv, (IV)PL_curcop->cop_arybase));
886 if (GvIOp(PL_defoutgv))
887 sv_setiv(sv, (IV)(IoFLAGS(GvIOp(PL_defoutgv)) & IOf_FLUSH) != 0 );
893 sv_copypv(sv, PL_ors_sv);
896 sv_setpv(sv,PL_ofmt);
900 sv_setnv(sv, (NV)((errno == EVMSERR) ? vaxc$errno : errno));
901 sv_setpv(sv, errno ? Strerror(errno) : "");
904 int saveerrno = errno;
905 sv_setnv(sv, (NV)errno);
907 if (errno == errno_isOS2 || errno == errno_isOS2_set)
908 sv_setpv(sv, os2error(Perl_rc));
911 sv_setpv(sv, errno ? Strerror(errno) : "");
915 SvNOK_on(sv); /* what a wonderful hack! */
918 sv_setiv(sv, (IV)PL_uid);
921 sv_setiv(sv, (IV)PL_euid);
924 sv_setiv(sv, (IV)PL_gid);
926 Perl_sv_setpvf(aTHX_ sv, "%"Gid_t_f, PL_gid);
930 sv_setiv(sv, (IV)PL_egid);
932 Perl_sv_setpvf(aTHX_ sv, "%"Gid_t_f, PL_egid);
937 Groups_t gary[NGROUPS];
938 i = getgroups(NGROUPS,gary);
940 Perl_sv_catpvf(aTHX_ sv, " %"Gid_t_f, gary[i]);
943 (void)SvIOK_on(sv); /* what a wonderful hack! */
945 #ifndef MACOS_TRADITIONAL
954 Perl_magic_getuvar(pTHX_ SV *sv, MAGIC *mg)
956 struct ufuncs *uf = (struct ufuncs *)mg->mg_ptr;
958 if (uf && uf->uf_val)
959 (*uf->uf_val)(aTHX_ uf->uf_index, sv);
964 Perl_magic_setenv(pTHX_ SV *sv, MAGIC *mg)
975 #ifdef DYNAMIC_ENV_FETCH
976 /* We just undefd an environment var. Is a replacement */
977 /* waiting in the wings? */
980 if ((valp = hv_fetch(GvHVn(PL_envgv), ptr, klen, FALSE)))
981 s = SvPV(*valp, len);
985 #if !defined(OS2) && !defined(AMIGAOS) && !defined(WIN32) && !defined(MSDOS)
986 /* And you'll never guess what the dog had */
987 /* in its mouth... */
989 MgTAINTEDDIR_off(mg);
991 if (s && klen == 8 && strEQ(ptr, "DCL$PATH")) {
992 char pathbuf[256], eltbuf[256], *cp, *elt = s;
996 do { /* DCL$PATH may be a search list */
997 while (1) { /* as may dev portion of any element */
998 if ( ((cp = strchr(elt,'[')) || (cp = strchr(elt,'<'))) ) {
999 if ( *(cp+1) == '.' || *(cp+1) == '-' ||
1000 cando_by_name(S_IWUSR,0,elt) ) {
1001 MgTAINTEDDIR_on(mg);
1005 if ((cp = strchr(elt, ':')) != Nullch)
1007 if (my_trnlnm(elt, eltbuf, j++))
1013 } while (my_trnlnm(s, pathbuf, i++) && (elt = pathbuf));
1016 if (s && klen == 4 && strEQ(ptr,"PATH")) {
1017 char *strend = s + len;
1019 while (s < strend) {
1023 s = delimcpy(tmpbuf, tmpbuf + sizeof tmpbuf,
1024 s, strend, ':', &i);
1026 if (i >= sizeof tmpbuf /* too long -- assume the worst */
1028 || (PerlLIO_stat(tmpbuf, &st) == 0 && (st.st_mode & 2)) ) {
1029 MgTAINTEDDIR_on(mg);
1035 #endif /* neither OS2 nor AMIGAOS nor WIN32 nor MSDOS */
1041 Perl_magic_clearenv(pTHX_ SV *sv, MAGIC *mg)
1045 my_setenv(MgPV(mg,n_a),Nullch);
1050 Perl_magic_set_all_env(pTHX_ SV *sv, MAGIC *mg)
1052 #if defined(VMS) || defined(EPOC) || defined(SYMBIAN)
1053 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1055 if (PL_localizing) {
1058 magic_clear_all_env(sv,mg);
1059 hv_iterinit((HV*)sv);
1060 while ((entry = hv_iternext((HV*)sv))) {
1062 my_setenv(hv_iterkey(entry, &keylen),
1063 SvPV(hv_iterval((HV*)sv, entry), n_a));
1071 Perl_magic_clear_all_env(pTHX_ SV *sv, MAGIC *mg)
1075 #if defined(VMS) || defined(EPOC) || defined(SYMBIAN)
1076 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1078 # if defined(PERL_IMPLICIT_SYS) || defined(WIN32)
1081 # ifdef USE_ENVIRON_ARRAY
1082 # if defined(USE_ITHREADS)
1083 /* only the parent thread can clobber the process environment */
1084 if (PL_curinterp == aTHX)
1087 # ifndef PERL_USE_SAFE_PUTENV
1088 if (!PL_use_safe_putenv) {
1091 if (environ == PL_origenviron)
1092 environ = (char**)safesysmalloc(sizeof(char*));
1094 for (i = 0; environ[i]; i++)
1095 safesysfree(environ[i]);
1097 # endif /* PERL_USE_SAFE_PUTENV */
1099 environ[0] = Nullch;
1101 # endif /* USE_ENVIRON_ARRAY */
1102 # endif /* PERL_IMPLICIT_SYS || WIN32 */
1103 #endif /* VMS || EPOC */
1104 #endif /* !PERL_MICRO */
1111 #ifdef HAS_SIGPROCMASK
1113 restore_sigmask(pTHX_ SV *save_sv)
1115 sigset_t *ossetp = (sigset_t *) SvPV_nolen( save_sv );
1116 (void)sigprocmask(SIG_SETMASK, ossetp, (sigset_t *)0);
1120 Perl_magic_getsig(pTHX_ SV *sv, MAGIC *mg)
1124 /* Are we fetching a signal entry? */
1125 i = whichsig(MgPV(mg,n_a));
1128 sv_setsv(sv,PL_psig_ptr[i]);
1130 Sighandler_t sigstate;
1131 sigstate = rsignal_state(i);
1132 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1133 if (PL_sig_handlers_initted && PL_sig_ignoring[i]) sigstate = SIG_IGN;
1135 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1136 if (PL_sig_handlers_initted && PL_sig_defaulting[i]) sigstate = SIG_DFL;
1138 /* cache state so we don't fetch it again */
1139 if(sigstate == SIG_IGN)
1140 sv_setpv(sv,"IGNORE");
1142 sv_setsv(sv,&PL_sv_undef);
1143 PL_psig_ptr[i] = SvREFCNT_inc(sv);
1150 Perl_magic_clearsig(pTHX_ SV *sv, MAGIC *mg)
1152 /* XXX Some of this code was copied from Perl_magic_setsig. A little
1153 * refactoring might be in order.
1157 register const char *s = MgPV(mg,n_a);
1161 if (strEQ(s,"__DIE__"))
1163 else if (strEQ(s,"__WARN__"))
1166 Perl_croak(aTHX_ "No such hook: %s", s);
1170 SvREFCNT_dec(to_dec);
1175 /* Are we clearing a signal entry? */
1178 #ifdef HAS_SIGPROCMASK
1181 /* Avoid having the signal arrive at a bad time, if possible. */
1184 sigprocmask(SIG_BLOCK, &set, &save);
1186 save_sv = newSVpv((char *)(&save), sizeof(sigset_t));
1187 SAVEFREESV(save_sv);
1188 SAVEDESTRUCTOR_X(restore_sigmask, save_sv);
1191 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1192 if (!PL_sig_handlers_initted) Perl_csighandler_init();
1194 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1195 PL_sig_defaulting[i] = 1;
1196 (void)rsignal(i, PL_csighandlerp);
1198 (void)rsignal(i, SIG_DFL);
1200 if(PL_psig_name[i]) {
1201 SvREFCNT_dec(PL_psig_name[i]);
1204 if(PL_psig_ptr[i]) {
1205 SV *to_dec=PL_psig_ptr[i];
1208 SvREFCNT_dec(to_dec);
1218 S_raise_signal(pTHX_ int sig)
1220 /* Set a flag to say this signal is pending */
1221 PL_psig_pend[sig]++;
1222 /* And one to say _a_ signal is pending */
1227 Perl_csighandler(int sig)
1229 #ifdef PERL_GET_SIG_CONTEXT
1230 dTHXa(PERL_GET_SIG_CONTEXT);
1234 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1235 (void) rsignal(sig, PL_csighandlerp);
1236 if (PL_sig_ignoring[sig]) return;
1238 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1239 if (PL_sig_defaulting[sig])
1240 #ifdef KILL_BY_SIGPRC
1241 exit((Perl_sig_to_vmscondition(sig)&STS$M_COND_ID)|STS$K_SEVERE|STS$M_INHIB_MSG);
1246 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
1247 /* Call the perl level handler now--
1248 * with risk we may be in malloc() etc. */
1249 (*PL_sighandlerp)(sig);
1251 S_raise_signal(aTHX_ sig);
1254 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1256 Perl_csighandler_init(void)
1259 if (PL_sig_handlers_initted) return;
1261 for (sig = 1; sig < SIG_SIZE; sig++) {
1262 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1264 PL_sig_defaulting[sig] = 1;
1265 (void) rsignal(sig, PL_csighandlerp);
1267 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1268 PL_sig_ignoring[sig] = 0;
1271 PL_sig_handlers_initted = 1;
1276 Perl_despatch_signals(pTHX)
1280 for (sig = 1; sig < SIG_SIZE; sig++) {
1281 if (PL_psig_pend[sig]) {
1282 PERL_BLOCKSIG_ADD(set, sig);
1283 PL_psig_pend[sig] = 0;
1284 PERL_BLOCKSIG_BLOCK(set);
1285 (*PL_sighandlerp)(sig);
1286 PERL_BLOCKSIG_UNBLOCK(set);
1292 Perl_magic_setsig(pTHX_ SV *sv, MAGIC *mg)
1297 /* Need to be careful with SvREFCNT_dec(), because that can have side
1298 * effects (due to closures). We must make sure that the new disposition
1299 * is in place before it is called.
1303 #ifdef HAS_SIGPROCMASK
1308 register const char *s = MgPV(mg,len);
1310 if (strEQ(s,"__DIE__"))
1312 else if (strEQ(s,"__WARN__"))
1315 Perl_croak(aTHX_ "No such hook: %s", s);
1323 i = whichsig(s); /* ...no, a brick */
1325 if (ckWARN(WARN_SIGNAL))
1326 Perl_warner(aTHX_ packWARN(WARN_SIGNAL), "No such signal: SIG%s", s);
1329 #ifdef HAS_SIGPROCMASK
1330 /* Avoid having the signal arrive at a bad time, if possible. */
1333 sigprocmask(SIG_BLOCK, &set, &save);
1335 save_sv = newSVpv((char *)(&save), sizeof(sigset_t));
1336 SAVEFREESV(save_sv);
1337 SAVEDESTRUCTOR_X(restore_sigmask, save_sv);
1340 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1341 if (!PL_sig_handlers_initted) Perl_csighandler_init();
1343 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1344 PL_sig_ignoring[i] = 0;
1346 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1347 PL_sig_defaulting[i] = 0;
1349 SvREFCNT_dec(PL_psig_name[i]);
1350 to_dec = PL_psig_ptr[i];
1351 PL_psig_ptr[i] = SvREFCNT_inc(sv);
1352 SvTEMP_off(sv); /* Make sure it doesn't go away on us */
1353 PL_psig_name[i] = newSVpvn(s, len);
1354 SvREADONLY_on(PL_psig_name[i]);
1356 if (SvTYPE(sv) == SVt_PVGV || SvROK(sv)) {
1358 (void)rsignal(i, PL_csighandlerp);
1359 #ifdef HAS_SIGPROCMASK
1364 *svp = SvREFCNT_inc(sv);
1366 SvREFCNT_dec(to_dec);
1369 s = SvPV_force(sv,len);
1370 if (strEQ(s,"IGNORE")) {
1372 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1373 PL_sig_ignoring[i] = 1;
1374 (void)rsignal(i, PL_csighandlerp);
1376 (void)rsignal(i, SIG_IGN);
1380 else if (strEQ(s,"DEFAULT") || !*s) {
1382 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1384 PL_sig_defaulting[i] = 1;
1385 (void)rsignal(i, PL_csighandlerp);
1388 (void)rsignal(i, SIG_DFL);
1393 * We should warn if HINT_STRICT_REFS, but without
1394 * access to a known hint bit in a known OP, we can't
1395 * tell whether HINT_STRICT_REFS is in force or not.
1397 if (!strchr(s,':') && !strchr(s,'\''))
1398 sv_insert(sv, 0, 0, "main::", 6);
1400 (void)rsignal(i, PL_csighandlerp);
1402 *svp = SvREFCNT_inc(sv);
1404 #ifdef HAS_SIGPROCMASK
1409 SvREFCNT_dec(to_dec);
1412 #endif /* !PERL_MICRO */
1415 Perl_magic_setisa(pTHX_ SV *sv, MAGIC *mg)
1419 PL_sub_generation++;
1424 Perl_magic_setamagic(pTHX_ SV *sv, MAGIC *mg)
1428 /* HV_badAMAGIC_on(Sv_STASH(sv)); */
1429 PL_amagic_generation++;
1435 Perl_magic_getnkeys(pTHX_ SV *sv, MAGIC *mg)
1437 HV * const hv = (HV*)LvTARG(sv);
1442 (void) hv_iterinit(hv);
1443 if (! SvTIED_mg((SV*)hv, PERL_MAGIC_tied))
1446 while (hv_iternext(hv))
1451 sv_setiv(sv, (IV)i);
1456 Perl_magic_setnkeys(pTHX_ SV *sv, MAGIC *mg)
1460 hv_ksplit((HV*)LvTARG(sv), SvIV(sv));
1465 /* caller is responsible for stack switching/cleanup */
1467 S_magic_methcall(pTHX_ SV *sv, const MAGIC *mg, const char *meth, I32 flags, int n, SV *val)
1473 PUSHs(SvTIED_obj(sv, mg));
1476 if (mg->mg_len >= 0)
1477 PUSHs(sv_2mortal(newSVpvn(mg->mg_ptr, mg->mg_len)));
1478 else if (mg->mg_len == HEf_SVKEY)
1479 PUSHs((SV*)mg->mg_ptr);
1481 else if (mg->mg_type == PERL_MAGIC_tiedelem) {
1482 PUSHs(sv_2mortal(newSViv(mg->mg_len)));
1490 return call_method(meth, flags);
1494 S_magic_methpack(pTHX_ SV *sv, const MAGIC *mg, const char *meth)
1500 PUSHSTACKi(PERLSI_MAGIC);
1502 if (magic_methcall(sv, mg, meth, G_SCALAR, 2, NULL)) {
1503 sv_setsv(sv, *PL_stack_sp--);
1513 Perl_magic_getpack(pTHX_ SV *sv, MAGIC *mg)
1516 mg->mg_flags |= MGf_GSKIP;
1517 magic_methpack(sv,mg,"FETCH");
1522 Perl_magic_setpack(pTHX_ SV *sv, MAGIC *mg)
1526 PUSHSTACKi(PERLSI_MAGIC);
1527 magic_methcall(sv, mg, "STORE", G_SCALAR|G_DISCARD, 3, sv);
1534 Perl_magic_clearpack(pTHX_ SV *sv, MAGIC *mg)
1536 return magic_methpack(sv,mg,"DELETE");
1541 Perl_magic_sizepack(pTHX_ SV *sv, MAGIC *mg)
1548 PUSHSTACKi(PERLSI_MAGIC);
1549 if (magic_methcall(sv, mg, "FETCHSIZE", G_SCALAR, 2, NULL)) {
1550 sv = *PL_stack_sp--;
1551 retval = (U32) SvIV(sv)-1;
1560 Perl_magic_wipepack(pTHX_ SV *sv, MAGIC *mg)
1565 PUSHSTACKi(PERLSI_MAGIC);
1567 XPUSHs(SvTIED_obj(sv, mg));
1569 call_method("CLEAR", G_SCALAR|G_DISCARD);
1577 Perl_magic_nextpack(pTHX_ SV *sv, MAGIC *mg, SV *key)
1580 const char * const meth = SvOK(key) ? "NEXTKEY" : "FIRSTKEY";
1584 PUSHSTACKi(PERLSI_MAGIC);
1587 PUSHs(SvTIED_obj(sv, mg));
1592 if (call_method(meth, G_SCALAR))
1593 sv_setsv(key, *PL_stack_sp--);
1602 Perl_magic_existspack(pTHX_ SV *sv, MAGIC *mg)
1604 return magic_methpack(sv,mg,"EXISTS");
1608 Perl_magic_scalarpack(pTHX_ HV *hv, MAGIC *mg)
1611 SV *retval = &PL_sv_undef;
1612 SV *tied = SvTIED_obj((SV*)hv, mg);
1613 HV *pkg = SvSTASH((SV*)SvRV(tied));
1615 if (!gv_fetchmethod_autoload(pkg, "SCALAR", FALSE)) {
1618 /* we are in an iteration so the hash cannot be empty */
1620 /* no xhv_eiter so now use FIRSTKEY */
1621 key = sv_newmortal();
1622 magic_nextpack((SV*)hv, mg, key);
1623 HvEITER(hv) = NULL; /* need to reset iterator */
1624 return SvOK(key) ? &PL_sv_yes : &PL_sv_no;
1627 /* there is a SCALAR method that we can call */
1629 PUSHSTACKi(PERLSI_MAGIC);
1635 if (call_method("SCALAR", G_SCALAR))
1636 retval = *PL_stack_sp--;
1643 Perl_magic_setdbline(pTHX_ SV *sv, MAGIC *mg)
1653 svp = av_fetch(GvAV(gv),
1654 atoi(MgPV(mg,n_a)), FALSE);
1655 if (svp && SvIOKp(*svp) && (o = INT2PTR(OP*,SvIVX(*svp)))) {
1656 /* set or clear breakpoint in the relevant control op */
1658 o->op_flags |= OPf_SPECIAL;
1660 o->op_flags &= ~OPf_SPECIAL;
1666 Perl_magic_getarylen(pTHX_ SV *sv, MAGIC *mg)
1668 sv_setiv(sv, AvFILL((AV*)mg->mg_obj) + PL_curcop->cop_arybase);
1673 Perl_magic_setarylen(pTHX_ SV *sv, MAGIC *mg)
1675 av_fill((AV*)mg->mg_obj, SvIV(sv) - PL_curcop->cop_arybase);
1680 Perl_magic_getpos(pTHX_ SV *sv, MAGIC *mg)
1682 SV* lsv = LvTARG(sv);
1684 if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv)) {
1685 mg = mg_find(lsv, PERL_MAGIC_regex_global);
1686 if (mg && mg->mg_len >= 0) {
1689 sv_pos_b2u(lsv, &i);
1690 sv_setiv(sv, i + PL_curcop->cop_arybase);
1699 Perl_magic_setpos(pTHX_ SV *sv, MAGIC *mg)
1701 SV* lsv = LvTARG(sv);
1708 if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv))
1709 mg = mg_find(lsv, PERL_MAGIC_regex_global);
1713 sv_magic(lsv, (SV*)0, PERL_MAGIC_regex_global, Nullch, 0);
1714 mg = mg_find(lsv, PERL_MAGIC_regex_global);
1716 else if (!SvOK(sv)) {
1720 len = SvPOK(lsv) ? SvCUR(lsv) : sv_len(lsv);
1722 pos = SvIV(sv) - PL_curcop->cop_arybase;
1725 ulen = sv_len_utf8(lsv);
1735 else if (pos > (SSize_t)len)
1740 sv_pos_u2b(lsv, &p, 0);
1745 mg->mg_flags &= ~MGf_MINMATCH;
1751 Perl_magic_getglob(pTHX_ SV *sv, MAGIC *mg)
1754 if (SvFAKE(sv)) { /* FAKE globs can get coerced */
1756 gv_efullname3(sv,((GV*)sv), "*");
1760 gv_efullname3(sv,((GV*)sv), "*"); /* a gv value, be nice */
1765 Perl_magic_setglob(pTHX_ SV *sv, MAGIC *mg)
1772 gv = gv_fetchsv(sv,TRUE, SVt_PVGV);
1777 GvGP(sv) = gp_ref(GvGP(gv));
1782 Perl_magic_getsubstr(pTHX_ SV *sv, MAGIC *mg)
1785 SV * const lsv = LvTARG(sv);
1786 const char * const tmps = SvPV(lsv,len);
1787 I32 offs = LvTARGOFF(sv);
1788 I32 rem = LvTARGLEN(sv);
1792 sv_pos_u2b(lsv, &offs, &rem);
1793 if (offs > (I32)len)
1795 if (rem + offs > (I32)len)
1797 sv_setpvn(sv, tmps + offs, (STRLEN)rem);
1804 Perl_magic_setsubstr(pTHX_ SV *sv, MAGIC *mg)
1807 char *tmps = SvPV(sv, len);
1808 SV * const lsv = LvTARG(sv);
1809 I32 lvoff = LvTARGOFF(sv);
1810 I32 lvlen = LvTARGLEN(sv);
1814 sv_utf8_upgrade(lsv);
1815 sv_pos_u2b(lsv, &lvoff, &lvlen);
1816 sv_insert(lsv, lvoff, lvlen, tmps, len);
1817 LvTARGLEN(sv) = sv_len_utf8(sv);
1820 else if (lsv && SvUTF8(lsv)) {
1821 sv_pos_u2b(lsv, &lvoff, &lvlen);
1822 LvTARGLEN(sv) = len;
1823 tmps = (char*)bytes_to_utf8((U8*)tmps, &len);
1824 sv_insert(lsv, lvoff, lvlen, tmps, len);
1828 sv_insert(lsv, lvoff, lvlen, tmps, len);
1829 LvTARGLEN(sv) = len;
1837 Perl_magic_gettaint(pTHX_ SV *sv, MAGIC *mg)
1839 TAINT_IF((mg->mg_len & 1) ||
1840 ((mg->mg_len & 2) && mg->mg_obj == sv)); /* kludge */
1845 Perl_magic_settaint(pTHX_ SV *sv, MAGIC *mg)
1848 if (PL_localizing) {
1849 if (PL_localizing == 1)
1854 else if (PL_tainted)
1862 Perl_magic_getvec(pTHX_ SV *sv, MAGIC *mg)
1864 SV * const lsv = LvTARG(sv);
1872 sv_setuv(sv, do_vecget(lsv, LvTARGOFF(sv), LvTARGLEN(sv)));
1877 Perl_magic_setvec(pTHX_ SV *sv, MAGIC *mg)
1880 do_vecset(sv); /* XXX slurp this routine */
1885 Perl_magic_getdefelem(pTHX_ SV *sv, MAGIC *mg)
1888 if (LvTARGLEN(sv)) {
1890 SV *ahv = LvTARG(sv);
1891 HE *he = hv_fetch_ent((HV*)ahv, mg->mg_obj, FALSE, 0);
1896 AV* av = (AV*)LvTARG(sv);
1897 if ((I32)LvTARGOFF(sv) <= AvFILL(av))
1898 targ = AvARRAY(av)[LvTARGOFF(sv)];
1900 if (targ && targ != &PL_sv_undef) {
1901 /* somebody else defined it for us */
1902 SvREFCNT_dec(LvTARG(sv));
1903 LvTARG(sv) = SvREFCNT_inc(targ);
1905 SvREFCNT_dec(mg->mg_obj);
1906 mg->mg_obj = Nullsv;
1907 mg->mg_flags &= ~MGf_REFCOUNTED;
1912 sv_setsv(sv, targ ? targ : &PL_sv_undef);
1917 Perl_magic_setdefelem(pTHX_ SV *sv, MAGIC *mg)
1923 sv_setsv(LvTARG(sv), sv);
1924 SvSETMAGIC(LvTARG(sv));
1930 Perl_vivify_defelem(pTHX_ SV *sv)
1935 if (!LvTARGLEN(sv) || !(mg = mg_find(sv, PERL_MAGIC_defelem)))
1938 SV *ahv = LvTARG(sv);
1940 HE *he = hv_fetch_ent((HV*)ahv, mg->mg_obj, TRUE, 0);
1943 if (!value || value == &PL_sv_undef)
1944 Perl_croak(aTHX_ PL_no_helem, SvPV(mg->mg_obj, n_a));
1947 AV* av = (AV*)LvTARG(sv);
1948 if ((I32)LvTARGLEN(sv) < 0 && (I32)LvTARGOFF(sv) > AvFILL(av))
1949 LvTARG(sv) = Nullsv; /* array can't be extended */
1951 SV** svp = av_fetch(av, LvTARGOFF(sv), TRUE);
1952 if (!svp || (value = *svp) == &PL_sv_undef)
1953 Perl_croak(aTHX_ PL_no_aelem, (I32)LvTARGOFF(sv));
1956 (void)SvREFCNT_inc(value);
1957 SvREFCNT_dec(LvTARG(sv));
1960 SvREFCNT_dec(mg->mg_obj);
1961 mg->mg_obj = Nullsv;
1962 mg->mg_flags &= ~MGf_REFCOUNTED;
1966 Perl_magic_killbackrefs(pTHX_ SV *sv, MAGIC *mg)
1968 AV *av = (AV*)mg->mg_obj;
1969 SV **svp = AvARRAY(av);
1970 I32 i = AvFILLp(av);
1975 if (!SvWEAKREF(svp[i]))
1976 Perl_croak(aTHX_ "panic: magic_killbackrefs");
1977 /* XXX Should we check that it hasn't changed? */
1978 SvRV_set(svp[i], 0);
1980 SvWEAKREF_off(svp[i]);
1985 SvREFCNT_dec(av); /* remove extra count added by sv_add_backref() */
1990 Perl_magic_setmglob(pTHX_ SV *sv, MAGIC *mg)
1998 Perl_magic_setbm(pTHX_ SV *sv, MAGIC *mg)
2001 sv_unmagic(sv, PERL_MAGIC_bm);
2007 Perl_magic_setfm(pTHX_ SV *sv, MAGIC *mg)
2010 sv_unmagic(sv, PERL_MAGIC_fm);
2016 Perl_magic_setuvar(pTHX_ SV *sv, MAGIC *mg)
2018 const struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
2020 if (uf && uf->uf_set)
2021 (*uf->uf_set)(aTHX_ uf->uf_index, sv);
2026 Perl_magic_setregexp(pTHX_ SV *sv, MAGIC *mg)
2029 sv_unmagic(sv, PERL_MAGIC_qr);
2034 Perl_magic_freeregexp(pTHX_ SV *sv, MAGIC *mg)
2036 regexp *re = (regexp *)mg->mg_obj;
2042 #ifdef USE_LOCALE_COLLATE
2044 Perl_magic_setcollxfrm(pTHX_ SV *sv, MAGIC *mg)
2047 * RenE<eacute> Descartes said "I think not."
2048 * and vanished with a faint plop.
2052 Safefree(mg->mg_ptr);
2058 #endif /* USE_LOCALE_COLLATE */
2060 /* Just clear the UTF-8 cache data. */
2062 Perl_magic_setutf8(pTHX_ SV *sv, MAGIC *mg)
2065 Safefree(mg->mg_ptr); /* The mg_ptr holds the pos cache. */
2067 mg->mg_len = -1; /* The mg_len holds the len cache. */
2072 Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
2074 register const char *s;
2077 switch (*mg->mg_ptr) {
2078 case '\001': /* ^A */
2079 sv_setsv(PL_bodytarget, sv);
2081 case '\003': /* ^C */
2082 PL_minus_c = (bool)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2085 case '\004': /* ^D */
2088 PL_debug = get_debug_opts(&s, 0) | DEBUG_TOP_FLAG;
2089 DEBUG_x(dump_all());
2091 PL_debug = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) | DEBUG_TOP_FLAG;
2094 case '\005': /* ^E */
2095 if (*(mg->mg_ptr+1) == '\0') {
2096 #ifdef MACOS_TRADITIONAL
2097 gMacPerl_OSErr = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2100 set_vaxc_errno(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2103 SetLastError( SvIV(sv) );
2106 os2_setsyserrno(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2108 /* will anyone ever use this? */
2109 SETERRNO(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv), 4);
2115 else if (strEQ(mg->mg_ptr+1, "NCODING")) {
2117 SvREFCNT_dec(PL_encoding);
2118 if (SvOK(sv) || SvGMAGICAL(sv)) {
2119 PL_encoding = newSVsv(sv);
2122 PL_encoding = Nullsv;
2126 case '\006': /* ^F */
2127 PL_maxsysfd = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2129 case '\010': /* ^H */
2130 PL_hints = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2132 case '\011': /* ^I */ /* NOT \t in EBCDIC */
2134 Safefree(PL_inplace);
2136 PL_inplace = savesvpv(sv);
2138 PL_inplace = Nullch;
2140 case '\017': /* ^O */
2141 if (*(mg->mg_ptr+1) == '\0') {
2143 Safefree(PL_osname);
2147 TAINT_PROPER("assigning to $^O");
2148 PL_osname = savesvpv(sv);
2151 else if (strEQ(mg->mg_ptr, "\017PEN")) {
2152 if (!PL_compiling.cop_io)
2153 PL_compiling.cop_io = newSVsv(sv);
2155 sv_setsv(PL_compiling.cop_io,sv);
2158 case '\020': /* ^P */
2159 PL_perldb = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2160 if (PL_perldb && !PL_DBsingle)
2163 case '\024': /* ^T */
2165 PL_basetime = (Time_t)(SvNOK(sv) ? SvNVX(sv) : sv_2nv(sv));
2167 PL_basetime = (Time_t)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2170 case '\027': /* ^W & $^WARNING_BITS */
2171 if (*(mg->mg_ptr+1) == '\0') {
2172 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
2173 i = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2174 PL_dowarn = (PL_dowarn & ~G_WARN_ON)
2175 | (i ? G_WARN_ON : G_WARN_OFF) ;
2178 else if (strEQ(mg->mg_ptr+1, "ARNING_BITS")) {
2179 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
2180 if (!SvPOK(sv) && PL_localizing) {
2181 sv_setpvn(sv, WARN_NONEstring, WARNsize);
2182 PL_compiling.cop_warnings = pWARN_NONE;
2187 int accumulate = 0 ;
2188 int any_fatals = 0 ;
2189 const char * const ptr = (char*)SvPV(sv, len) ;
2190 for (i = 0 ; i < len ; ++i) {
2191 accumulate |= ptr[i] ;
2192 any_fatals |= (ptr[i] & 0xAA) ;
2195 PL_compiling.cop_warnings = pWARN_NONE;
2196 else if (isWARN_on(sv, WARN_ALL) && !any_fatals) {
2197 PL_compiling.cop_warnings = pWARN_ALL;
2198 PL_dowarn |= G_WARN_ONCE ;
2201 if (specialWARN(PL_compiling.cop_warnings))
2202 PL_compiling.cop_warnings = newSVsv(sv) ;
2204 sv_setsv(PL_compiling.cop_warnings, sv);
2205 if (isWARN_on(PL_compiling.cop_warnings, WARN_ONCE))
2206 PL_dowarn |= G_WARN_ONCE ;
2214 if (PL_localizing) {
2215 if (PL_localizing == 1)
2216 SAVESPTR(PL_last_in_gv);
2218 else if (SvOK(sv) && GvIO(PL_last_in_gv))
2219 IoLINES(GvIOp(PL_last_in_gv)) = SvIV(sv);
2222 Safefree(IoTOP_NAME(GvIOp(PL_defoutgv)));
2223 s = IoTOP_NAME(GvIOp(PL_defoutgv)) = savesvpv(sv);
2224 IoTOP_GV(GvIOp(PL_defoutgv)) = gv_fetchsv(sv,TRUE, SVt_PVIO);
2227 Safefree(IoFMT_NAME(GvIOp(PL_defoutgv)));
2228 s = IoFMT_NAME(GvIOp(PL_defoutgv)) = savesvpv(sv);
2229 IoFMT_GV(GvIOp(PL_defoutgv)) = gv_fetchsv(sv,TRUE, SVt_PVIO);
2232 IoPAGE_LEN(GvIOp(PL_defoutgv)) = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2235 IoLINES_LEFT(GvIOp(PL_defoutgv)) = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2236 if (IoLINES_LEFT(GvIOp(PL_defoutgv)) < 0L)
2237 IoLINES_LEFT(GvIOp(PL_defoutgv)) = 0L;
2240 IoPAGE(GvIOp(PL_defoutgv)) = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2244 IO *io = GvIOp(PL_defoutgv);
2247 if ((SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) == 0)
2248 IoFLAGS(io) &= ~IOf_FLUSH;
2250 if (!(IoFLAGS(io) & IOf_FLUSH)) {
2251 PerlIO *ofp = IoOFP(io);
2253 (void)PerlIO_flush(ofp);
2254 IoFLAGS(io) |= IOf_FLUSH;
2260 SvREFCNT_dec(PL_rs);
2261 PL_rs = newSVsv(sv);
2265 SvREFCNT_dec(PL_ors_sv);
2266 if (SvOK(sv) || SvGMAGICAL(sv)) {
2267 PL_ors_sv = newSVsv(sv);
2275 SvREFCNT_dec(PL_ofs_sv);
2276 if (SvOK(sv) || SvGMAGICAL(sv)) {
2277 PL_ofs_sv = newSVsv(sv);
2286 PL_ofmt = savesvpv(sv);
2289 PL_compiling.cop_arybase = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2292 #ifdef COMPLEX_STATUS
2293 if (PL_localizing == 2) {
2294 PL_statusvalue = LvTARGOFF(sv);
2295 PL_statusvalue_vms = LvTARGLEN(sv);
2299 #ifdef VMSISH_STATUS
2301 STATUS_NATIVE_SET((U32)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)));
2304 STATUS_POSIX_SET(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2309 # define PERL_VMS_BANG vaxc$errno
2311 # define PERL_VMS_BANG 0
2313 SETERRNO(SvIOK(sv) ? SvIVX(sv) : SvOK(sv) ? sv_2iv(sv) : 0,
2314 (SvIV(sv) == EVMSERR) ? 4 : PERL_VMS_BANG);
2318 PL_uid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2319 if (PL_delaymagic) {
2320 PL_delaymagic |= DM_RUID;
2321 break; /* don't do magic till later */
2324 (void)setruid((Uid_t)PL_uid);
2327 (void)setreuid((Uid_t)PL_uid, (Uid_t)-1);
2329 #ifdef HAS_SETRESUID
2330 (void)setresuid((Uid_t)PL_uid, (Uid_t)-1, (Uid_t)-1);
2332 if (PL_uid == PL_euid) { /* special case $< = $> */
2334 /* workaround for Darwin's setuid peculiarity, cf [perl #24122] */
2335 if (PL_uid != 0 && PerlProc_getuid() == 0)
2336 (void)PerlProc_setuid(0);
2338 (void)PerlProc_setuid(PL_uid);
2340 PL_uid = PerlProc_getuid();
2341 Perl_croak(aTHX_ "setruid() not implemented");
2346 PL_uid = PerlProc_getuid();
2347 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2350 PL_euid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2351 if (PL_delaymagic) {
2352 PL_delaymagic |= DM_EUID;
2353 break; /* don't do magic till later */
2356 (void)seteuid((Uid_t)PL_euid);
2359 (void)setreuid((Uid_t)-1, (Uid_t)PL_euid);
2361 #ifdef HAS_SETRESUID
2362 (void)setresuid((Uid_t)-1, (Uid_t)PL_euid, (Uid_t)-1);
2364 if (PL_euid == PL_uid) /* special case $> = $< */
2365 PerlProc_setuid(PL_euid);
2367 PL_euid = PerlProc_geteuid();
2368 Perl_croak(aTHX_ "seteuid() not implemented");
2373 PL_euid = PerlProc_geteuid();
2374 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2377 PL_gid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2378 if (PL_delaymagic) {
2379 PL_delaymagic |= DM_RGID;
2380 break; /* don't do magic till later */
2383 (void)setrgid((Gid_t)PL_gid);
2386 (void)setregid((Gid_t)PL_gid, (Gid_t)-1);
2388 #ifdef HAS_SETRESGID
2389 (void)setresgid((Gid_t)PL_gid, (Gid_t)-1, (Gid_t) 1);
2391 if (PL_gid == PL_egid) /* special case $( = $) */
2392 (void)PerlProc_setgid(PL_gid);
2394 PL_gid = PerlProc_getgid();
2395 Perl_croak(aTHX_ "setrgid() not implemented");
2400 PL_gid = PerlProc_getgid();
2401 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2404 #ifdef HAS_SETGROUPS
2406 const char *p = SvPV(sv, len);
2407 Groups_t gary[NGROUPS];
2412 for (i = 0; i < NGROUPS; ++i) {
2413 while (*p && !isSPACE(*p))
2422 (void)setgroups(i, gary);
2424 #else /* HAS_SETGROUPS */
2425 PL_egid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2426 #endif /* HAS_SETGROUPS */
2427 if (PL_delaymagic) {
2428 PL_delaymagic |= DM_EGID;
2429 break; /* don't do magic till later */
2432 (void)setegid((Gid_t)PL_egid);
2435 (void)setregid((Gid_t)-1, (Gid_t)PL_egid);
2437 #ifdef HAS_SETRESGID
2438 (void)setresgid((Gid_t)-1, (Gid_t)PL_egid, (Gid_t)-1);
2440 if (PL_egid == PL_gid) /* special case $) = $( */
2441 (void)PerlProc_setgid(PL_egid);
2443 PL_egid = PerlProc_getegid();
2444 Perl_croak(aTHX_ "setegid() not implemented");
2449 PL_egid = PerlProc_getegid();
2450 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2453 PL_chopset = SvPV_force(sv,len);
2455 #ifndef MACOS_TRADITIONAL
2457 LOCK_DOLLARZERO_MUTEX;
2458 #ifdef HAS_SETPROCTITLE
2459 /* The BSDs don't show the argv[] in ps(1) output, they
2460 * show a string from the process struct and provide
2461 * the setproctitle() routine to manipulate that. */
2464 # if __FreeBSD_version > 410001
2465 /* The leading "-" removes the "perl: " prefix,
2466 * but not the "(perl) suffix from the ps(1)
2467 * output, because that's what ps(1) shows if the
2468 * argv[] is modified. */
2469 setproctitle("-%s", s);
2470 # else /* old FreeBSDs, NetBSD, OpenBSD, anyBSD */
2471 /* This doesn't really work if you assume that
2472 * $0 = 'foobar'; will wipe out 'perl' from the $0
2473 * because in ps(1) output the result will be like
2474 * sprintf("perl: %s (perl)", s)
2475 * I guess this is a security feature:
2476 * one (a user process) cannot get rid of the original name.
2478 setproctitle("%s", s);
2482 #if defined(__hpux) && defined(PSTAT_SETCMD)
2486 un.pst_command = (char *)s;
2487 pstat(PSTAT_SETCMD, un, len, 0, 0);
2490 /* PL_origalen is set in perl_parse(). */
2491 s = SvPV_force(sv,len);
2492 if (len >= (STRLEN)PL_origalen-1) {
2493 /* Longer than original, will be truncated. We assume that
2494 * PL_origalen bytes are available. */
2495 Copy(s, PL_origargv[0], PL_origalen-1, char);
2498 /* Shorter than original, will be padded. */
2499 Copy(s, PL_origargv[0], len, char);
2500 PL_origargv[0][len] = 0;
2501 memset(PL_origargv[0] + len + 1,
2502 /* Is the space counterintuitive? Yes.
2503 * (You were expecting \0?)
2504 * Does it work? Seems to. (In Linux 2.4.20 at least.)
2507 PL_origalen - len - 1);
2509 PL_origargv[0][PL_origalen-1] = 0;
2510 for (i = 1; i < PL_origargc; i++)
2512 UNLOCK_DOLLARZERO_MUTEX;
2520 Perl_whichsig(pTHX_ const char *sig)
2522 register const char * const *sigv;
2524 for (sigv = PL_sig_name; *sigv; sigv++)
2525 if (strEQ(sig,*sigv))
2526 return PL_sig_num[sigv - PL_sig_name];
2528 if (strEQ(sig,"CHLD"))
2532 if (strEQ(sig,"CLD"))
2539 Perl_sighandler(int sig)
2541 #ifdef PERL_GET_SIG_CONTEXT
2542 dTHXa(PERL_GET_SIG_CONTEXT);
2549 SV *sv = Nullsv, *tSv = PL_Sv;
2555 if (PL_savestack_ix + 15 <= PL_savestack_max)
2557 if (PL_markstack_ptr < PL_markstack_max - 2)
2559 if (PL_scopestack_ix < PL_scopestack_max - 3)
2562 if (!PL_psig_ptr[sig]) {
2563 PerlIO_printf(Perl_error_log, "Signal SIG%s received, but no signal handler set.\n",
2568 /* Max number of items pushed there is 3*n or 4. We cannot fix
2569 infinity, so we fix 4 (in fact 5): */
2571 PL_savestack_ix += 5; /* Protect save in progress. */
2572 SAVEDESTRUCTOR_X(unwind_handler_stack, (void*)&flags);
2575 PL_markstack_ptr++; /* Protect mark. */
2577 PL_scopestack_ix += 1;
2578 /* sv_2cv is too complicated, try a simpler variant first: */
2579 if (!SvROK(PL_psig_ptr[sig]) || !(cv = (CV*)SvRV(PL_psig_ptr[sig]))
2580 || SvTYPE(cv) != SVt_PVCV)
2581 cv = sv_2cv(PL_psig_ptr[sig],&st,&gv,TRUE);
2583 if (!cv || !CvROOT(cv)) {
2584 if (ckWARN(WARN_SIGNAL))
2585 Perl_warner(aTHX_ packWARN(WARN_SIGNAL), "SIG%s handler \"%s\" not defined.\n",
2586 PL_sig_name[sig], (gv ? GvENAME(gv)
2593 if(PL_psig_name[sig]) {
2594 sv = SvREFCNT_inc(PL_psig_name[sig]);
2596 #if !defined(PERL_IMPLICIT_CONTEXT)
2600 sv = sv_newmortal();
2601 sv_setpv(sv,PL_sig_name[sig]);
2604 PUSHSTACKi(PERLSI_SIGNAL);
2609 call_sv((SV*)cv, G_DISCARD|G_EVAL);
2612 if (SvTRUE(ERRSV)) {
2614 #ifdef HAS_SIGPROCMASK
2615 /* Handler "died", for example to get out of a restart-able read().
2616 * Before we re-do that on its behalf re-enable the signal which was
2617 * blocked by the system when we entered.
2621 sigaddset(&set,sig);
2622 sigprocmask(SIG_UNBLOCK, &set, NULL);
2624 /* Not clear if this will work */
2625 (void)rsignal(sig, SIG_IGN);
2626 (void)rsignal(sig, PL_csighandlerp);
2628 #endif /* !PERL_MICRO */
2633 PL_savestack_ix -= 8; /* Unprotect save in progress. */
2637 PL_scopestack_ix -= 1;
2640 PL_op = myop; /* Apparently not needed... */
2642 PL_Sv = tSv; /* Restore global temporaries. */
2649 restore_magic(pTHX_ const void *p)
2651 MGS* mgs = SSPTR(PTR2IV(p), MGS*);
2652 SV* sv = mgs->mgs_sv;
2657 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
2659 #ifdef PERL_COPY_ON_WRITE
2660 /* While magic was saved (and off) sv_setsv may well have seen
2661 this SV as a prime candidate for COW. */
2663 sv_force_normal(sv);
2667 SvFLAGS(sv) |= mgs->mgs_flags;
2671 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
2674 mgs->mgs_sv = NULL; /* mark the MGS structure as restored */
2676 /* If we're still on top of the stack, pop us off. (That condition
2677 * will be satisfied if restore_magic was called explicitly, but *not*
2678 * if it's being called via leave_scope.)
2679 * The reason for doing this is that otherwise, things like sv_2cv()
2680 * may leave alloc gunk on the savestack, and some code
2681 * (e.g. sighandler) doesn't expect that...
2683 if (PL_savestack_ix == mgs->mgs_ss_ix)
2685 I32 popval = SSPOPINT;
2686 assert(popval == SAVEt_DESTRUCTOR_X);
2687 PL_savestack_ix -= 2;
2689 assert(popval == SAVEt_ALLOC);
2691 PL_savestack_ix -= popval;
2697 unwind_handler_stack(pTHX_ const void *p)
2700 const U32 flags = *(const U32*)p;
2703 PL_savestack_ix -= 5; /* Unprotect save in progress. */
2704 /* cxstack_ix-- Not needed, die already unwound it. */
2705 #if !defined(PERL_IMPLICIT_CONTEXT)
2707 SvREFCNT_dec(PL_sig_sv);