3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4 * 2000, 2001, 2002, 2003, 2004, 2005, 2006, 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)
48 #if defined(HAS_SETGROUPS)
55 # include <sys/pstat.h>
58 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
59 Signal_t Perl_csighandler_va(int sig, ...);
61 Signal_t Perl_csighandler(int sig);
63 /* if you only have signal() and it resets on each signal, FAKE_PERSISTENT_SIGNAL_HANDLERS fixes */
64 #if !defined(HAS_SIGACTION) && defined(VMS)
65 # define FAKE_PERSISTENT_SIGNAL_HANDLERS
67 /* if we're doing kill() with sys$sigprc on VMS, FAKE_DEFAULT_SIGNAL_HANDLERS */
68 #if defined(KILL_BY_SIGPRC)
69 # define FAKE_DEFAULT_SIGNAL_HANDLERS
73 /* Missing protos on LynxOS */
74 void setruid(uid_t id);
75 void seteuid(uid_t id);
76 void setrgid(uid_t id);
77 void setegid(uid_t id);
81 * Use the "DESTRUCTOR" scope cleanup to reinstate magic.
89 /* MGS is typedef'ed to struct magic_state in perl.h */
92 S_save_magic(pTHX_ I32 mgs_ix, SV *sv)
95 assert(SvMAGICAL(sv));
96 /* Turning READONLY off for a copy-on-write scalar (including shared
97 hash keys) is a bad idea. */
99 sv_force_normal_flags(sv, 0);
101 SAVEDESTRUCTOR_X(S_restore_magic, INT2PTR(void*, (IV)mgs_ix));
103 mgs = SSPTR(mgs_ix, MGS*);
105 mgs->mgs_flags = SvMAGICAL(sv) | SvREADONLY(sv);
106 mgs->mgs_ss_ix = PL_savestack_ix; /* points after the saved destructor */
110 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_NOK|SVp_POK)) >> PRIVSHIFT;
114 =for apidoc mg_magical
116 Turns on the magical status of an SV. See C<sv_magic>.
122 Perl_mg_magical(pTHX_ SV *sv)
125 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
126 const MGVTBL* const vtbl = mg->mg_virtual;
128 if (vtbl->svt_get && !(mg->mg_flags & MGf_GSKIP))
132 if (!(SvFLAGS(sv) & (SVs_GMG|SVs_SMG)) || vtbl->svt_clear)
141 Do magic after a value is retrieved from the SV. See C<sv_magic>.
147 Perl_mg_get(pTHX_ SV *sv)
149 const I32 mgs_ix = SSNEW(sizeof(MGS));
150 const bool was_temp = (bool)SvTEMP(sv);
152 MAGIC *newmg, *head, *cur, *mg;
153 /* guard against sv having being freed midway by holding a private
156 /* sv_2mortal has this side effect of turning on the TEMP flag, which can
157 cause the SV's buffer to get stolen (and maybe other stuff).
160 sv_2mortal(SvREFCNT_inc_simple(sv));
165 save_magic(mgs_ix, sv);
167 /* We must call svt_get(sv, mg) for each valid entry in the linked
168 list of magic. svt_get() may delete the current entry, add new
169 magic to the head of the list, or upgrade the SV. AMS 20010810 */
171 newmg = cur = head = mg = SvMAGIC(sv);
173 const MGVTBL * const vtbl = mg->mg_virtual;
175 if (!(mg->mg_flags & MGf_GSKIP) && vtbl && vtbl->svt_get) {
176 CALL_FPTR(vtbl->svt_get)(aTHX_ sv, mg);
178 /* guard against magic having been deleted - eg FETCH calling
183 /* Don't restore the flags for this entry if it was deleted. */
184 if (mg->mg_flags & MGf_GSKIP)
185 (SSPTR(mgs_ix, MGS *))->mgs_flags = 0;
188 mg = mg->mg_moremagic;
191 /* Have we finished with the new entries we saw? Start again
192 where we left off (unless there are more new entries). */
200 /* Were any new entries added? */
201 if (!have_new && (newmg = SvMAGIC(sv)) != head) {
208 restore_magic(INT2PTR(void *, (IV)mgs_ix));
210 if (SvREFCNT(sv) == 1) {
211 /* We hold the last reference to this SV, which implies that the
212 SV was deleted as a side effect of the routines we called. */
221 Do magic after a value is assigned to the SV. See C<sv_magic>.
227 Perl_mg_set(pTHX_ SV *sv)
229 const I32 mgs_ix = SSNEW(sizeof(MGS));
233 save_magic(mgs_ix, sv);
235 for (mg = SvMAGIC(sv); mg; mg = nextmg) {
236 const MGVTBL* vtbl = mg->mg_virtual;
237 nextmg = mg->mg_moremagic; /* it may delete itself */
238 if (mg->mg_flags & MGf_GSKIP) {
239 mg->mg_flags &= ~MGf_GSKIP; /* setting requires another read */
240 (SSPTR(mgs_ix, MGS*))->mgs_flags = 0;
242 if (vtbl && vtbl->svt_set)
243 CALL_FPTR(vtbl->svt_set)(aTHX_ sv, mg);
246 restore_magic(INT2PTR(void*, (IV)mgs_ix));
251 =for apidoc mg_length
253 Report on the SV's length. See C<sv_magic>.
259 Perl_mg_length(pTHX_ SV *sv)
264 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
265 const MGVTBL * const vtbl = mg->mg_virtual;
266 if (vtbl && vtbl->svt_len) {
267 const I32 mgs_ix = SSNEW(sizeof(MGS));
268 save_magic(mgs_ix, sv);
269 /* omit MGf_GSKIP -- not changed here */
270 len = CALL_FPTR(vtbl->svt_len)(aTHX_ sv, mg);
271 restore_magic(INT2PTR(void*, (IV)mgs_ix));
277 const U8 *s = (U8*)SvPV_const(sv, len);
278 len = Perl_utf8_length(aTHX_ (U8*)s, (U8*)s + len);
281 (void)SvPV_const(sv, len);
286 Perl_mg_size(pTHX_ SV *sv)
290 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
291 const MGVTBL* const vtbl = mg->mg_virtual;
292 if (vtbl && vtbl->svt_len) {
293 const I32 mgs_ix = SSNEW(sizeof(MGS));
295 save_magic(mgs_ix, sv);
296 /* omit MGf_GSKIP -- not changed here */
297 len = CALL_FPTR(vtbl->svt_len)(aTHX_ sv, mg);
298 restore_magic(INT2PTR(void*, (IV)mgs_ix));
305 return AvFILLp((AV *) sv); /* Fallback to non-tied array */
309 Perl_croak(aTHX_ "Size magic not implemented");
318 Clear something magical that the SV represents. See C<sv_magic>.
324 Perl_mg_clear(pTHX_ SV *sv)
326 const I32 mgs_ix = SSNEW(sizeof(MGS));
329 save_magic(mgs_ix, sv);
331 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
332 const MGVTBL* const vtbl = mg->mg_virtual;
333 /* omit GSKIP -- never set here */
335 if (vtbl && vtbl->svt_clear)
336 CALL_FPTR(vtbl->svt_clear)(aTHX_ sv, mg);
339 restore_magic(INT2PTR(void*, (IV)mgs_ix));
346 Finds the magic pointer for type matching the SV. See C<sv_magic>.
352 Perl_mg_find(pTHX_ SV *sv, int type)
356 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
357 if (mg->mg_type == type)
367 Copies the magic from one SV to another. See C<sv_magic>.
373 Perl_mg_copy(pTHX_ SV *sv, SV *nsv, const char *key, I32 klen)
377 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
378 const MGVTBL* const vtbl = mg->mg_virtual;
379 if ((mg->mg_flags & MGf_COPY) && vtbl->svt_copy){
380 count += CALL_FPTR(vtbl->svt_copy)(aTHX_ sv, mg, nsv, key, klen);
383 const char type = mg->mg_type;
386 (type == PERL_MAGIC_tied)
388 : (type == PERL_MAGIC_regdata && mg->mg_obj)
391 toLOWER(type), key, klen);
400 =for apidoc mg_localize
402 Copy some of the magic from an existing SV to new localized version of
403 that SV. Container magic (eg %ENV, $1, tie) gets copied, value magic
404 doesn't (eg taint, pos).
410 Perl_mg_localize(pTHX_ SV *sv, SV *nsv)
413 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
414 MGVTBL* const vtbl = mg->mg_virtual;
415 switch (mg->mg_type) {
416 /* value magic types: don't copy */
419 case PERL_MAGIC_regex_global:
420 case PERL_MAGIC_nkeys:
421 #ifdef USE_LOCALE_COLLATE
422 case PERL_MAGIC_collxfrm:
425 case PERL_MAGIC_taint:
427 case PERL_MAGIC_vstring:
428 case PERL_MAGIC_utf8:
429 case PERL_MAGIC_substr:
430 case PERL_MAGIC_defelem:
431 case PERL_MAGIC_arylen:
433 case PERL_MAGIC_backref:
437 if ((mg->mg_flags & MGf_LOCAL) && vtbl->svt_local)
438 (void)CALL_FPTR(vtbl->svt_local)(aTHX_ nsv, mg);
440 sv_magicext(nsv, mg->mg_obj, mg->mg_type, vtbl,
441 mg->mg_ptr, mg->mg_len);
443 /* container types should remain read-only across localization */
444 SvFLAGS(nsv) |= SvREADONLY(sv);
447 if (SvTYPE(nsv) >= SVt_PVMG && SvMAGIC(nsv)) {
448 SvFLAGS(nsv) |= SvMAGICAL(sv);
458 Free any magic storage used by the SV. See C<sv_magic>.
464 Perl_mg_free(pTHX_ SV *sv)
468 for (mg = SvMAGIC(sv); mg; mg = moremagic) {
469 const MGVTBL* const vtbl = mg->mg_virtual;
470 moremagic = mg->mg_moremagic;
471 if (vtbl && vtbl->svt_free)
472 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
473 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
474 if (mg->mg_len > 0 || mg->mg_type == PERL_MAGIC_utf8)
475 Safefree(mg->mg_ptr);
476 else if (mg->mg_len == HEf_SVKEY)
477 SvREFCNT_dec((SV*)mg->mg_ptr);
479 if (mg->mg_flags & MGf_REFCOUNTED)
480 SvREFCNT_dec(mg->mg_obj);
483 SvMAGIC_set(sv, NULL);
490 Perl_magic_regdata_cnt(pTHX_ SV *sv, MAGIC *mg)
495 register const REGEXP * const rx = PM_GETRE(PL_curpm);
498 ? rx->nparens /* @+ */
499 : rx->lastparen; /* @- */
507 Perl_magic_regdatum_get(pTHX_ SV *sv, MAGIC *mg)
510 register const REGEXP * const rx = PM_GETRE(PL_curpm);
512 register const I32 paren = mg->mg_len;
517 if (paren <= (I32)rx->nparens &&
518 (s = rx->startp[paren]) != -1 &&
519 (t = rx->endp[paren]) != -1)
522 if (mg->mg_obj) /* @+ */
527 if (i > 0 && RX_MATCH_UTF8(rx)) {
528 const char * const b = rx->subbeg;
530 i = Perl_utf8_length(aTHX_ (U8*)b, (U8*)(b+i));
541 Perl_magic_regdatum_set(pTHX_ SV *sv, MAGIC *mg)
543 PERL_UNUSED_ARG(sv); PERL_UNUSED_ARG(mg);
544 Perl_croak(aTHX_ PL_no_modify);
545 NORETURN_FUNCTION_END;
549 Perl_magic_len(pTHX_ SV *sv, MAGIC *mg)
553 register const REGEXP *rx;
556 switch (*mg->mg_ptr) {
557 case '1': case '2': case '3': case '4':
558 case '5': case '6': case '7': case '8': case '9': case '&':
559 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
561 paren = atoi(mg->mg_ptr); /* $& is in [0] */
563 if (paren <= (I32)rx->nparens &&
564 (s1 = rx->startp[paren]) != -1 &&
565 (t1 = rx->endp[paren]) != -1)
569 if (i > 0 && RX_MATCH_UTF8(rx)) {
570 const char * const s = rx->subbeg + s1;
575 if (is_utf8_string_loclen((U8*)s, i, &ep, &el))
579 Perl_croak(aTHX_ "panic: magic_len: %"IVdf, (IV)i);
583 if (ckWARN(WARN_UNINITIALIZED))
588 if (ckWARN(WARN_UNINITIALIZED))
593 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
594 paren = rx->lastparen;
599 case '\016': /* ^N */
600 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
601 paren = rx->lastcloseparen;
607 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
608 if (rx->startp[0] != -1) {
619 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
620 if (rx->endp[0] != -1) {
621 i = rx->sublen - rx->endp[0];
632 if (!SvPOK(sv) && SvNIOK(sv)) {
640 #define SvRTRIM(sv) STMT_START { \
642 STRLEN len = SvCUR(sv); \
643 char * const p = SvPVX(sv); \
644 while (len > 0 && isSPACE(p[len-1])) \
646 SvCUR_set(sv, len); \
652 Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
655 register char *s = NULL;
658 const char * const remaining = mg->mg_ptr + 1;
659 const char nextchar = *remaining;
661 switch (*mg->mg_ptr) {
662 case '\001': /* ^A */
663 sv_setsv(sv, PL_bodytarget);
665 case '\003': /* ^C, ^CHILD_ERROR_NATIVE */
666 if (*(mg->mg_ptr+1) == '\0') {
667 sv_setiv(sv, (IV)PL_minus_c);
669 else if (strEQ(mg->mg_ptr, "\003HILD_ERROR_NATIVE")) {
670 sv_setiv(sv, (IV)STATUS_NATIVE);
674 case '\004': /* ^D */
675 sv_setiv(sv, (IV)(PL_debug & DEBUG_MASK));
676 #if defined(YYDEBUG) && defined(DEBUGGING)
677 PL_yydebug = DEBUG_p_TEST;
680 case '\005': /* ^E */
681 if (nextchar == '\0') {
682 #if defined(MACOS_TRADITIONAL)
686 sv_setnv(sv,(double)gMacPerl_OSErr);
687 sv_setpv(sv, gMacPerl_OSErr ? GetSysErrText(gMacPerl_OSErr, msg) : "");
691 # include <descrip.h>
692 # include <starlet.h>
694 $DESCRIPTOR(msgdsc,msg);
695 sv_setnv(sv,(NV) vaxc$errno);
696 if (sys$getmsg(vaxc$errno,&msgdsc.dsc$w_length,&msgdsc,0,0) & 1)
697 sv_setpvn(sv,msgdsc.dsc$a_pointer,msgdsc.dsc$w_length);
702 if (!(_emx_env & 0x200)) { /* Under DOS */
703 sv_setnv(sv, (NV)errno);
704 sv_setpv(sv, errno ? Strerror(errno) : "");
706 if (errno != errno_isOS2) {
707 const int tmp = _syserrno();
708 if (tmp) /* 2nd call to _syserrno() makes it 0 */
711 sv_setnv(sv, (NV)Perl_rc);
712 sv_setpv(sv, os2error(Perl_rc));
716 DWORD dwErr = GetLastError();
717 sv_setnv(sv, (NV)dwErr);
719 PerlProc_GetOSError(sv, dwErr);
722 sv_setpvn(sv, "", 0);
727 const int saveerrno = errno;
728 sv_setnv(sv, (NV)errno);
729 sv_setpv(sv, errno ? Strerror(errno) : "");
734 SvNOK_on(sv); /* what a wonderful hack! */
736 else if (strEQ(remaining, "NCODING"))
737 sv_setsv(sv, PL_encoding);
739 case '\006': /* ^F */
740 sv_setiv(sv, (IV)PL_maxsysfd);
742 case '\010': /* ^H */
743 sv_setiv(sv, (IV)PL_hints);
745 case '\011': /* ^I */ /* NOT \t in EBCDIC */
747 sv_setpv(sv, PL_inplace);
749 sv_setsv(sv, &PL_sv_undef);
751 case '\017': /* ^O & ^OPEN */
752 if (nextchar == '\0') {
753 sv_setpv(sv, PL_osname);
756 else if (strEQ(remaining, "PEN")) {
757 if (!PL_compiling.cop_io)
758 sv_setsv(sv, &PL_sv_undef);
760 sv_setsv(sv, PL_compiling.cop_io);
764 case '\020': /* ^P */
765 sv_setiv(sv, (IV)PL_perldb);
767 case '\023': /* ^S */
768 if (nextchar == '\0') {
769 if (PL_lex_state != LEX_NOTPARSING)
772 sv_setiv(sv, PL_in_eval & ~(EVAL_INREQUIRE));
777 case '\024': /* ^T */
778 if (nextchar == '\0') {
780 sv_setnv(sv, PL_basetime);
782 sv_setiv(sv, (IV)PL_basetime);
785 else if (strEQ(remaining, "AINT"))
786 sv_setiv(sv, PL_tainting
787 ? (PL_taint_warn || PL_unsafe ? -1 : 1)
790 case '\025': /* $^UNICODE, $^UTF8LOCALE, $^UTF8CACHE */
791 if (strEQ(remaining, "NICODE"))
792 sv_setuv(sv, (UV) PL_unicode);
793 else if (strEQ(remaining, "TF8LOCALE"))
794 sv_setuv(sv, (UV) PL_utf8locale);
795 else if (strEQ(remaining, "TF8CACHE"))
796 sv_setiv(sv, (IV) PL_utf8cache);
798 case '\027': /* ^W & $^WARNING_BITS */
799 if (nextchar == '\0')
800 sv_setiv(sv, (IV)((PL_dowarn & G_WARN_ON) ? TRUE : FALSE));
801 else if (strEQ(remaining, "ARNING_BITS")) {
802 if (PL_compiling.cop_warnings == pWARN_NONE) {
803 sv_setpvn(sv, WARN_NONEstring, WARNsize) ;
805 else if (PL_compiling.cop_warnings == pWARN_STD) {
808 (PL_dowarn & G_WARN_ON) ? WARN_ALLstring : WARN_NONEstring,
812 else if (PL_compiling.cop_warnings == pWARN_ALL) {
813 /* Get the bit mask for $warnings::Bits{all}, because
814 * it could have been extended by warnings::register */
816 HV * const bits=get_hv("warnings::Bits", FALSE);
817 if (bits && (bits_all=hv_fetchs(bits, "all", FALSE))) {
818 sv_setsv(sv, *bits_all);
821 sv_setpvn(sv, WARN_ALLstring, WARNsize) ;
825 sv_setsv(sv, PL_compiling.cop_warnings);
830 case '1': case '2': case '3': case '4':
831 case '5': case '6': case '7': case '8': case '9': case '&':
832 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
836 * Pre-threads, this was paren = atoi(GvENAME((GV*)mg->mg_obj));
837 * XXX Does the new way break anything?
839 paren = atoi(mg->mg_ptr); /* $& is in [0] */
841 if (paren <= (I32)rx->nparens &&
842 (s1 = rx->startp[paren]) != -1 &&
843 (t1 = rx->endp[paren]) != -1)
852 const int oldtainted = PL_tainted;
855 PL_tainted = oldtainted;
856 if (RX_MATCH_UTF8(rx) && is_utf8_string((U8*)s, i))
861 if (RX_MATCH_TAINTED(rx)) {
862 MAGIC* const mg = SvMAGIC(sv);
865 SvMAGIC_set(sv, mg->mg_moremagic);
867 if ((mgt = SvMAGIC(sv))) {
868 mg->mg_moremagic = mgt;
878 sv_setsv(sv,&PL_sv_undef);
881 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
882 paren = rx->lastparen;
886 sv_setsv(sv,&PL_sv_undef);
888 case '\016': /* ^N */
889 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
890 paren = rx->lastcloseparen;
894 sv_setsv(sv,&PL_sv_undef);
897 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
898 if ((s = rx->subbeg) && rx->startp[0] != -1) {
903 sv_setsv(sv,&PL_sv_undef);
906 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
907 if (rx->subbeg && rx->endp[0] != -1) {
908 s = rx->subbeg + rx->endp[0];
909 i = rx->sublen - rx->endp[0];
913 sv_setsv(sv,&PL_sv_undef);
916 if (GvIO(PL_last_in_gv)) {
917 sv_setiv(sv, (IV)IoLINES(GvIOp(PL_last_in_gv)));
922 sv_setiv(sv, (IV)STATUS_CURRENT);
923 #ifdef COMPLEX_STATUS
924 LvTARGOFF(sv) = PL_statusvalue;
925 LvTARGLEN(sv) = PL_statusvalue_vms;
930 if (GvIOp(PL_defoutgv))
931 s = IoTOP_NAME(GvIOp(PL_defoutgv));
935 sv_setpv(sv,GvENAME(PL_defoutgv));
940 if (GvIOp(PL_defoutgv))
941 s = IoFMT_NAME(GvIOp(PL_defoutgv));
943 s = GvENAME(PL_defoutgv);
947 if (GvIOp(PL_defoutgv))
948 sv_setiv(sv, (IV)IoPAGE_LEN(GvIOp(PL_defoutgv)));
951 if (GvIOp(PL_defoutgv))
952 sv_setiv(sv, (IV)IoLINES_LEFT(GvIOp(PL_defoutgv)));
955 if (GvIOp(PL_defoutgv))
956 sv_setiv(sv, (IV)IoPAGE(GvIOp(PL_defoutgv)));
963 WITH_THR(sv_setiv(sv, (IV)PL_curcop->cop_arybase));
966 if (GvIOp(PL_defoutgv))
967 sv_setiv(sv, (IV)(IoFLAGS(GvIOp(PL_defoutgv)) & IOf_FLUSH) != 0 );
973 sv_copypv(sv, PL_ors_sv);
976 sv_setpv(sv,PL_ofmt);
980 sv_setnv(sv, (NV)((errno == EVMSERR) ? vaxc$errno : errno));
981 sv_setpv(sv, errno ? Strerror(errno) : "");
984 const int saveerrno = errno;
985 sv_setnv(sv, (NV)errno);
987 if (errno == errno_isOS2 || errno == errno_isOS2_set)
988 sv_setpv(sv, os2error(Perl_rc));
991 sv_setpv(sv, errno ? Strerror(errno) : "");
996 SvNOK_on(sv); /* what a wonderful hack! */
999 sv_setiv(sv, (IV)PL_uid);
1002 sv_setiv(sv, (IV)PL_euid);
1005 sv_setiv(sv, (IV)PL_gid);
1008 sv_setiv(sv, (IV)PL_egid);
1010 #ifdef HAS_GETGROUPS
1012 Groups_t *gary = NULL;
1013 I32 i, num_groups = getgroups(0, gary);
1014 Newx(gary, num_groups, Groups_t);
1015 num_groups = getgroups(num_groups, gary);
1016 for (i = 0; i < num_groups; i++)
1017 Perl_sv_catpvf(aTHX_ sv, " %"IVdf, (IV)gary[i]);
1020 (void)SvIOK_on(sv); /* what a wonderful hack! */
1025 #ifndef MACOS_TRADITIONAL
1029 #ifdef USE_5005THREADS
1031 sv_setsv(sv, thr->errsv);
1033 #endif /* USE_5005THREADS */
1039 Perl_magic_getuvar(pTHX_ SV *sv, MAGIC *mg)
1041 struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
1043 if (uf && uf->uf_val)
1044 (*uf->uf_val)(aTHX_ uf->uf_index, sv);
1049 Perl_magic_setenv(pTHX_ SV *sv, MAGIC *mg)
1052 const char *s = SvPV_const(sv,len);
1053 const char * const ptr = MgPV_const(mg,klen);
1054 my_setenv((char *)ptr, (char *)s);
1056 #ifdef DYNAMIC_ENV_FETCH
1057 /* We just undefd an environment var. Is a replacement */
1058 /* waiting in the wings? */
1060 SV ** const valp = hv_fetch(GvHVn(PL_envgv), ptr, klen, FALSE);
1062 s = SvPV_const(*valp, len);
1066 #if !defined(OS2) && !defined(AMIGAOS) && !defined(WIN32) && !defined(MSDOS)
1067 /* And you'll never guess what the dog had */
1068 /* in its mouth... */
1070 MgTAINTEDDIR_off(mg);
1072 if (s && klen == 8 && strEQ(ptr, "DCL$PATH")) {
1073 char pathbuf[256], eltbuf[256], *cp, *elt;
1077 strncpy(eltbuf, s, 255);
1080 do { /* DCL$PATH may be a search list */
1081 while (1) { /* as may dev portion of any element */
1082 if ( ((cp = strchr(elt,'[')) || (cp = strchr(elt,'<'))) ) {
1083 if ( *(cp+1) == '.' || *(cp+1) == '-' ||
1084 cando_by_name(S_IWUSR,0,elt) ) {
1085 MgTAINTEDDIR_on(mg);
1089 if ((cp = strchr(elt, ':')) != NULL)
1091 if (my_trnlnm(elt, eltbuf, j++))
1097 } while (my_trnlnm(s, pathbuf, i++) && (elt = pathbuf));
1100 if (s && klen == 4 && strEQ(ptr,"PATH")) {
1101 const char * const strend = s + len;
1103 while (s < strend) {
1107 s = delimcpy(tmpbuf, tmpbuf + sizeof tmpbuf,
1108 (char *) s, (char *) strend, ':', &i);
1110 if (i >= sizeof tmpbuf /* too long -- assume the worst */
1112 || (PerlLIO_stat(tmpbuf, &st) == 0 && (st.st_mode & 2)) ) {
1113 MgTAINTEDDIR_on(mg);
1119 #endif /* neither OS2 nor AMIGAOS nor WIN32 nor MSDOS */
1125 Perl_magic_clearenv(pTHX_ SV *sv, MAGIC *mg)
1127 PERL_UNUSED_ARG(sv);
1128 my_setenv((char *)MgPV_nolen_const(mg),NULL);
1133 Perl_magic_set_all_env(pTHX_ SV *sv, MAGIC *mg)
1135 PERL_UNUSED_ARG(mg);
1137 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1139 if (PL_localizing) {
1142 hv_iterinit((HV*)sv);
1143 while ((entry = hv_iternext((HV*)sv))) {
1145 my_setenv(hv_iterkey(entry, &keylen),
1146 (char *)SvPV_nolen_const(hv_iterval((HV*)sv, entry)));
1154 Perl_magic_clear_all_env(pTHX_ SV *sv, MAGIC *mg)
1156 PERL_UNUSED_ARG(sv);
1157 PERL_UNUSED_ARG(mg);
1160 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1164 #endif /* !PERL_MICRO */
1168 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS)||defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1169 static int PL_sig_handlers_initted = 0;
1171 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1172 static int PL_sig_ignoring[SIG_SIZE]; /* which signals we are ignoring */
1174 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1175 static int PL_sig_defaulting[SIG_SIZE];
1179 #ifdef HAS_SIGPROCMASK
1181 restore_sigmask(pTHX_ SV *save_sv)
1183 const sigset_t * const ossetp = (const sigset_t *) SvPV_nolen_const( save_sv );
1184 (void)sigprocmask(SIG_SETMASK, ossetp, (sigset_t *)0);
1188 Perl_magic_getsig(pTHX_ SV *sv, MAGIC *mg)
1190 /* Are we fetching a signal entry? */
1191 const I32 i = whichsig((char *)MgPV_nolen_const(mg));
1194 sv_setsv(sv,PL_psig_ptr[i]);
1196 Sighandler_t sigstate;
1197 sigstate = rsignal_state(i);
1198 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1199 if (PL_sig_handlers_initted && PL_sig_ignoring[i]) sigstate = SIG_IGN;
1201 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1202 if (PL_sig_handlers_initted && PL_sig_defaulting[i]) sigstate = SIG_DFL;
1204 /* cache state so we don't fetch it again */
1205 if(sigstate == (Sighandler_t) SIG_IGN)
1206 sv_setpv(sv,"IGNORE");
1208 sv_setsv(sv,&PL_sv_undef);
1209 PL_psig_ptr[i] = SvREFCNT_inc_simple(sv);
1216 Perl_magic_clearsig(pTHX_ SV *sv, MAGIC *mg)
1218 /* XXX Some of this code was copied from Perl_magic_setsig. A little
1219 * refactoring might be in order.
1221 register const char * const s = MgPV_nolen_const(mg);
1222 PERL_UNUSED_ARG(sv);
1225 if (strEQ(s,"__DIE__"))
1227 else if (strEQ(s,"__WARN__"))
1230 Perl_croak(aTHX_ "No such hook: %s", s);
1232 SV * const to_dec = *svp;
1234 SvREFCNT_dec(to_dec);
1238 /* Are we clearing a signal entry? */
1239 const I32 i = whichsig((char *)s);
1241 #ifdef HAS_SIGPROCMASK
1244 /* Avoid having the signal arrive at a bad time, if possible. */
1247 sigprocmask(SIG_BLOCK, &set, &save);
1249 save_sv = newSVpv((char *)(&save), sizeof(sigset_t));
1250 SAVEFREESV(save_sv);
1251 SAVEDESTRUCTOR_X(restore_sigmask, save_sv);
1254 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1255 if (!PL_sig_handlers_initted) Perl_csighandler_init();
1257 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1258 PL_sig_defaulting[i] = 1;
1259 (void)rsignal(i, PL_csighandlerp);
1261 (void)rsignal(i, (Sighandler_t) SIG_DFL);
1263 if(PL_psig_name[i]) {
1264 SvREFCNT_dec(PL_psig_name[i]);
1267 if(PL_psig_ptr[i]) {
1268 SV * const to_dec=PL_psig_ptr[i];
1271 SvREFCNT_dec(to_dec);
1281 S_raise_signal(pTHX_ int sig)
1283 /* Set a flag to say this signal is pending */
1284 PL_psig_pend[sig]++;
1285 /* And one to say _a_ signal is pending */
1290 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
1291 Perl_csighandler(int sig)
1293 Perl_csighandler_va(sig);
1297 Perl_csighandler_va(int sig, ...)
1299 Perl_csighandler(int sig)
1302 #ifdef PERL_GET_SIG_CONTEXT
1303 dTHXa(PERL_GET_SIG_CONTEXT);
1307 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1308 (void) rsignal(sig, PL_csighandlerp);
1309 if (PL_sig_ignoring[sig]) return;
1311 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1312 if (PL_sig_defaulting[sig])
1313 #ifdef KILL_BY_SIGPRC
1314 exit((Perl_sig_to_vmscondition(sig)&STS$M_COND_ID)|STS$K_SEVERE|STS$M_INHIB_MSG);
1319 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
1320 /* Call the perl level handler now--
1321 * with risk we may be in malloc() etc. */
1322 (*PL_sighandlerp)(sig);
1324 S_raise_signal(aTHX_ sig);
1327 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1329 Perl_csighandler_init(void)
1332 if (PL_sig_handlers_initted) return;
1334 for (sig = 1; sig < SIG_SIZE; sig++) {
1335 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1337 PL_sig_defaulting[sig] = 1;
1338 (void) rsignal(sig, PL_csighandlerp);
1340 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1341 PL_sig_ignoring[sig] = 0;
1344 PL_sig_handlers_initted = 1;
1349 Perl_despatch_signals(pTHX)
1353 for (sig = 1; sig < SIG_SIZE; sig++) {
1354 if (PL_psig_pend[sig]) {
1355 PERL_BLOCKSIG_ADD(set, sig);
1356 PL_psig_pend[sig] = 0;
1357 PERL_BLOCKSIG_BLOCK(set);
1358 (*PL_sighandlerp)(sig);
1359 PERL_BLOCKSIG_UNBLOCK(set);
1365 Perl_magic_setsig(pTHX_ SV *sv, MAGIC *mg)
1369 /* Need to be careful with SvREFCNT_dec(), because that can have side
1370 * effects (due to closures). We must make sure that the new disposition
1371 * is in place before it is called.
1375 #ifdef HAS_SIGPROCMASK
1380 register const char *s = MgPV_const(mg,len);
1382 if (strEQ(s,"__DIE__"))
1384 else if (strEQ(s,"__WARN__"))
1387 Perl_croak(aTHX_ "No such hook: %s", s);
1395 i = whichsig((char *)s); /* ...no, a brick */
1397 if (ckWARN(WARN_SIGNAL))
1398 Perl_warner(aTHX_ packWARN(WARN_SIGNAL), "No such signal: SIG%s", s);
1401 #ifdef HAS_SIGPROCMASK
1402 /* Avoid having the signal arrive at a bad time, if possible. */
1405 sigprocmask(SIG_BLOCK, &set, &save);
1407 save_sv = newSVpv((char *)(&save), sizeof(sigset_t));
1408 SAVEFREESV(save_sv);
1409 SAVEDESTRUCTOR_X(restore_sigmask, save_sv);
1412 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1413 if (!PL_sig_handlers_initted) Perl_csighandler_init();
1415 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1416 PL_sig_ignoring[i] = 0;
1418 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1419 PL_sig_defaulting[i] = 0;
1421 SvREFCNT_dec(PL_psig_name[i]);
1422 to_dec = PL_psig_ptr[i];
1423 PL_psig_ptr[i] = SvREFCNT_inc_simple(sv);
1424 SvTEMP_off(sv); /* Make sure it doesn't go away on us */
1425 PL_psig_name[i] = newSVpvn(s, len);
1426 SvREADONLY_on(PL_psig_name[i]);
1428 if (SvTYPE(sv) == SVt_PVGV || SvROK(sv)) {
1430 (void)rsignal(i, PL_csighandlerp);
1431 #ifdef HAS_SIGPROCMASK
1436 *svp = SvREFCNT_inc_simple_NN(sv);
1438 SvREFCNT_dec(to_dec);
1441 s = SvPV_force(sv,len);
1442 if (strEQ(s,"IGNORE")) {
1444 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1445 PL_sig_ignoring[i] = 1;
1446 (void)rsignal(i, PL_csighandlerp);
1448 (void)rsignal(i, (Sighandler_t) SIG_IGN);
1452 else if (strEQ(s,"DEFAULT") || !*s) {
1454 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1456 PL_sig_defaulting[i] = 1;
1457 (void)rsignal(i, PL_csighandlerp);
1460 (void)rsignal(i, (Sighandler_t) SIG_DFL);
1465 * We should warn if HINT_STRICT_REFS, but without
1466 * access to a known hint bit in a known OP, we can't
1467 * tell whether HINT_STRICT_REFS is in force or not.
1469 if (!strchr(s,':') && !strchr(s,'\''))
1470 Perl_sv_insert(aTHX_ sv, 0, 0, STR_WITH_LEN("main::"));
1472 (void)rsignal(i, PL_csighandlerp);
1474 *svp = SvREFCNT_inc_simple(sv);
1476 #ifdef HAS_SIGPROCMASK
1481 SvREFCNT_dec(to_dec);
1484 #endif /* !PERL_MICRO */
1487 Perl_magic_setisa(pTHX_ SV *sv, MAGIC *mg)
1489 PERL_UNUSED_ARG(sv);
1490 PERL_UNUSED_ARG(mg);
1491 PL_sub_generation++;
1496 Perl_magic_setamagic(pTHX_ SV *sv, MAGIC *mg)
1498 PERL_UNUSED_ARG(sv);
1499 PERL_UNUSED_ARG(mg);
1500 /* HV_badAMAGIC_on(Sv_STASH(sv)); */
1501 PL_amagic_generation++;
1507 Perl_magic_getnkeys(pTHX_ SV *sv, MAGIC *mg)
1509 HV * const hv = (HV*)LvTARG(sv);
1511 PERL_UNUSED_ARG(mg);
1514 (void) hv_iterinit(hv);
1515 if (! SvTIED_mg((SV*)hv, PERL_MAGIC_tied))
1518 while (hv_iternext(hv))
1523 sv_setiv(sv, (IV)i);
1528 Perl_magic_setnkeys(pTHX_ SV *sv, MAGIC *mg)
1530 PERL_UNUSED_ARG(mg);
1532 hv_ksplit((HV*)LvTARG(sv), SvIV(sv));
1537 /* caller is responsible for stack switching/cleanup */
1539 S_magic_methcall(pTHX_ SV *sv, const MAGIC *mg, const char *meth, I32 flags, int n, SV *val)
1545 PUSHs(SvTIED_obj(sv, mg));
1548 if (mg->mg_len >= 0)
1549 PUSHs(sv_2mortal(newSVpvn(mg->mg_ptr, mg->mg_len)));
1550 else if (mg->mg_len == HEf_SVKEY)
1551 PUSHs((SV*)mg->mg_ptr);
1553 else if (mg->mg_type == PERL_MAGIC_tiedelem) {
1554 PUSHs(sv_2mortal(newSViv(mg->mg_len)));
1562 return call_method(meth, flags);
1566 S_magic_methpack(pTHX_ SV *sv, const MAGIC *mg, const char *meth)
1572 PUSHSTACKi(PERLSI_MAGIC);
1574 if (magic_methcall(sv, mg, meth, G_SCALAR, 2, NULL)) {
1575 sv_setsv(sv, *PL_stack_sp--);
1585 Perl_magic_getpack(pTHX_ SV *sv, MAGIC *mg)
1588 mg->mg_flags |= MGf_GSKIP;
1589 magic_methpack(sv,mg,"FETCH");
1594 Perl_magic_setpack(pTHX_ SV *sv, MAGIC *mg)
1598 PUSHSTACKi(PERLSI_MAGIC);
1599 magic_methcall(sv, mg, "STORE", G_SCALAR|G_DISCARD, 3, sv);
1606 Perl_magic_clearpack(pTHX_ SV *sv, MAGIC *mg)
1608 return magic_methpack(sv,mg,"DELETE");
1613 Perl_magic_sizepack(pTHX_ SV *sv, MAGIC *mg)
1620 PUSHSTACKi(PERLSI_MAGIC);
1621 if (magic_methcall(sv, mg, "FETCHSIZE", G_SCALAR, 2, NULL)) {
1622 sv = *PL_stack_sp--;
1623 retval = (U32) SvIV(sv)-1;
1632 Perl_magic_wipepack(pTHX_ SV *sv, MAGIC *mg)
1637 PUSHSTACKi(PERLSI_MAGIC);
1639 XPUSHs(SvTIED_obj(sv, mg));
1641 call_method("CLEAR", G_SCALAR|G_DISCARD);
1649 Perl_magic_nextpack(pTHX_ SV *sv, MAGIC *mg, SV *key)
1652 const char * const meth = SvOK(key) ? "NEXTKEY" : "FIRSTKEY";
1656 PUSHSTACKi(PERLSI_MAGIC);
1659 PUSHs(SvTIED_obj(sv, mg));
1664 if (call_method(meth, G_SCALAR))
1665 sv_setsv(key, *PL_stack_sp--);
1674 Perl_magic_existspack(pTHX_ SV *sv, MAGIC *mg)
1676 return magic_methpack(sv,mg,"EXISTS");
1680 Perl_magic_scalarpack(pTHX_ HV *hv, MAGIC *mg)
1683 SV *retval = &PL_sv_undef;
1684 SV * const tied = SvTIED_obj((SV*)hv, mg);
1685 HV * const pkg = SvSTASH((SV*)SvRV(tied));
1687 if (!gv_fetchmethod_autoload(pkg, "SCALAR", FALSE)) {
1689 if (HvEITER_get(hv))
1690 /* we are in an iteration so the hash cannot be empty */
1692 /* no xhv_eiter so now use FIRSTKEY */
1693 key = sv_newmortal();
1694 magic_nextpack((SV*)hv, mg, key);
1695 HvEITER_set(hv, NULL); /* need to reset iterator */
1696 return SvOK(key) ? &PL_sv_yes : &PL_sv_no;
1699 /* there is a SCALAR method that we can call */
1701 PUSHSTACKi(PERLSI_MAGIC);
1707 if (call_method("SCALAR", G_SCALAR))
1708 retval = *PL_stack_sp--;
1715 Perl_magic_setdbline(pTHX_ SV *sv, MAGIC *mg)
1717 GV * const gv = PL_DBline;
1718 const I32 i = SvTRUE(sv);
1719 SV ** const svp = av_fetch(GvAV(gv),
1720 atoi(MgPV_nolen_const(mg)), FALSE);
1721 if (svp && SvIOKp(*svp)) {
1722 OP * const o = INT2PTR(OP*,SvIVX(*svp));
1724 /* set or clear breakpoint in the relevant control op */
1726 o->op_flags |= OPf_SPECIAL;
1728 o->op_flags &= ~OPf_SPECIAL;
1735 Perl_magic_getarylen(pTHX_ SV *sv, MAGIC *mg)
1737 AV *obj = (AV*)mg->mg_obj;
1739 sv_setiv(sv, AvFILL(obj) + PL_curcop->cop_arybase);
1747 Perl_magic_setarylen(pTHX_ SV *sv, MAGIC *mg)
1749 AV *obj = (AV*)mg->mg_obj;
1751 av_fill(obj, SvIV(sv) - PL_curcop->cop_arybase);
1753 if (ckWARN(WARN_MISC))
1754 Perl_warner(aTHX_ packWARN(WARN_MISC),
1755 "Attempt to set length of freed array");
1761 Perl_magic_getpos(pTHX_ SV *sv, MAGIC *mg)
1763 SV* const lsv = LvTARG(sv);
1765 if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv)) {
1766 mg = mg_find(lsv, PERL_MAGIC_regex_global);
1767 if (mg && mg->mg_len >= 0) {
1770 sv_pos_b2u(lsv, &i);
1771 sv_setiv(sv, i + PL_curcop->cop_arybase);
1780 Perl_magic_setpos(pTHX_ SV *sv, MAGIC *mg)
1782 SV* const lsv = LvTARG(sv);
1789 if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv))
1790 mg = mg_find(lsv, PERL_MAGIC_regex_global);
1794 sv_magic(lsv, NULL, PERL_MAGIC_regex_global, NULL, 0);
1795 mg = mg_find(lsv, PERL_MAGIC_regex_global);
1797 else if (!SvOK(sv)) {
1801 len = SvPOK(lsv) ? SvCUR(lsv) : sv_len(lsv);
1803 pos = SvIV(sv) - PL_curcop->cop_arybase;
1806 ulen = sv_len_utf8(lsv);
1816 else if (pos > (SSize_t)len)
1821 sv_pos_u2b(lsv, &p, 0);
1826 mg->mg_flags &= ~MGf_MINMATCH;
1832 Perl_magic_getglob(pTHX_ SV *sv, MAGIC *mg)
1834 PERL_UNUSED_ARG(mg);
1835 if (SvFAKE(sv)) { /* FAKE globs can get coerced */
1837 gv_efullname3(sv,((GV*)sv), "*");
1841 gv_efullname3(sv,((GV*)sv), "*"); /* a gv value, be nice */
1846 Perl_magic_setglob(pTHX_ SV *sv, MAGIC *mg)
1849 PERL_UNUSED_ARG(mg);
1853 gv = gv_fetchsv(sv, GV_ADD, SVt_PVGV);
1858 GvGP(sv) = gp_ref(GvGP(gv));
1863 Perl_magic_getsubstr(pTHX_ SV *sv, MAGIC *mg)
1866 SV * const lsv = LvTARG(sv);
1867 const char * const tmps = SvPV_const(lsv,len);
1868 I32 offs = LvTARGOFF(sv);
1869 I32 rem = LvTARGLEN(sv);
1870 PERL_UNUSED_ARG(mg);
1873 sv_pos_u2b(lsv, &offs, &rem);
1874 if (offs > (I32)len)
1876 if (rem + offs > (I32)len)
1878 sv_setpvn(sv, tmps + offs, (STRLEN)rem);
1885 Perl_magic_setsubstr(pTHX_ SV *sv, MAGIC *mg)
1888 const char *tmps = SvPV_const(sv, len);
1889 SV * const lsv = LvTARG(sv);
1890 I32 lvoff = LvTARGOFF(sv);
1891 I32 lvlen = LvTARGLEN(sv);
1892 PERL_UNUSED_ARG(mg);
1895 sv_utf8_upgrade(lsv);
1896 sv_pos_u2b(lsv, &lvoff, &lvlen);
1897 sv_insert(lsv, lvoff, lvlen, (char *)tmps, len);
1900 else if (lsv && SvUTF8(lsv)) {
1901 sv_pos_u2b(lsv, &lvoff, &lvlen);
1902 tmps = (char*)bytes_to_utf8((U8*)tmps, &len);
1903 sv_insert(lsv, lvoff, lvlen, (char *)tmps, len);
1907 sv_insert(lsv, lvoff, lvlen, (char *)tmps, len);
1913 Perl_magic_gettaint(pTHX_ SV *sv, MAGIC *mg)
1915 PERL_UNUSED_ARG(sv);
1916 TAINT_IF((PL_localizing != 1) && (mg->mg_len & 1));
1921 Perl_magic_settaint(pTHX_ SV *sv, MAGIC *mg)
1923 PERL_UNUSED_ARG(sv);
1924 /* update taint status unless we're restoring at scope exit */
1925 if (PL_localizing != 2) {
1935 Perl_magic_getvec(pTHX_ SV *sv, MAGIC *mg)
1937 SV * const lsv = LvTARG(sv);
1938 PERL_UNUSED_ARG(mg);
1941 sv_setuv(sv, do_vecget(lsv, LvTARGOFF(sv), LvTARGLEN(sv)));
1949 Perl_magic_setvec(pTHX_ SV *sv, MAGIC *mg)
1951 PERL_UNUSED_ARG(mg);
1952 do_vecset(sv); /* XXX slurp this routine */
1957 Perl_magic_getdefelem(pTHX_ SV *sv, MAGIC *mg)
1960 if (LvTARGLEN(sv)) {
1962 SV * const ahv = LvTARG(sv);
1963 if (SvTYPE(ahv) == SVt_PVHV) {
1964 HE * const he = hv_fetch_ent((HV*)ahv, mg->mg_obj, FALSE, 0);
1969 SV **svp = avhv_fetch_ent((AV*)ahv, mg->mg_obj, FALSE, 0);
1975 AV* const av = (AV*)LvTARG(sv);
1976 if ((I32)LvTARGOFF(sv) <= AvFILL(av))
1977 targ = AvARRAY(av)[LvTARGOFF(sv)];
1979 if (targ && targ != &PL_sv_undef) {
1980 /* somebody else defined it for us */
1981 SvREFCNT_dec(LvTARG(sv));
1982 LvTARG(sv) = SvREFCNT_inc_simple_NN(targ);
1984 SvREFCNT_dec(mg->mg_obj);
1986 mg->mg_flags &= ~MGf_REFCOUNTED;
1991 sv_setsv(sv, targ ? targ : &PL_sv_undef);
1996 Perl_magic_setdefelem(pTHX_ SV *sv, MAGIC *mg)
1998 PERL_UNUSED_ARG(mg);
2002 sv_setsv(LvTARG(sv), sv);
2003 SvSETMAGIC(LvTARG(sv));
2009 Perl_vivify_defelem(pTHX_ SV *sv)
2014 if (!LvTARGLEN(sv) || !(mg = mg_find(sv, PERL_MAGIC_defelem)))
2017 SV * const ahv = LvTARG(sv);
2018 if (SvTYPE(ahv) == SVt_PVHV) {
2019 HE * const he = hv_fetch_ent((HV*)ahv, mg->mg_obj, TRUE, 0);
2024 SV **svp = avhv_fetch_ent((AV*)ahv, mg->mg_obj, TRUE, 0);
2028 if (!value || value == &PL_sv_undef)
2029 Perl_croak(aTHX_ PL_no_helem_sv, mg->mg_obj);
2032 AV* const av = (AV*)LvTARG(sv);
2033 if ((I32)LvTARGLEN(sv) < 0 && (I32)LvTARGOFF(sv) > AvFILL(av))
2034 LvTARG(sv) = NULL; /* array can't be extended */
2036 SV** const svp = av_fetch(av, LvTARGOFF(sv), TRUE);
2037 if (!svp || (value = *svp) == &PL_sv_undef)
2038 Perl_croak(aTHX_ PL_no_aelem, (I32)LvTARGOFF(sv));
2041 SvREFCNT_inc_simple_void(value);
2042 SvREFCNT_dec(LvTARG(sv));
2045 SvREFCNT_dec(mg->mg_obj);
2047 mg->mg_flags &= ~MGf_REFCOUNTED;
2051 Perl_magic_killbackrefs(pTHX_ SV *sv, MAGIC *mg)
2053 AV *const av = (AV*)mg->mg_obj;
2054 SV **svp = AvARRAY(av);
2055 PERL_UNUSED_ARG(sv);
2057 /* Not sure why the av can get freed ahead of its sv, but somehow it does
2058 in ext/B/t/bytecode.t test 15 (involving print <DATA>) */
2059 if (svp && !SvIS_FREED(av)) {
2060 SV *const *const last = svp + AvFILLp(av);
2062 while (svp <= last) {
2064 SV *const referrer = *svp;
2065 if (SvWEAKREF(referrer)) {
2066 /* XXX Should we check that it hasn't changed? */
2067 SvRV_set(referrer, 0);
2069 SvWEAKREF_off(referrer);
2072 "panic: magic_killbackrefs (flags=%"UVxf")",
2081 SvREFCNT_dec(av); /* remove extra count added by sv_add_backref() */
2086 Perl_magic_setmglob(pTHX_ SV *sv, MAGIC *mg)
2094 Perl_magic_setbm(pTHX_ SV *sv, MAGIC *mg)
2096 PERL_UNUSED_ARG(mg);
2097 sv_unmagic(sv, PERL_MAGIC_bm);
2103 Perl_magic_setfm(pTHX_ SV *sv, MAGIC *mg)
2105 PERL_UNUSED_ARG(mg);
2106 sv_unmagic(sv, PERL_MAGIC_fm);
2112 Perl_magic_setuvar(pTHX_ SV *sv, MAGIC *mg)
2114 const struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
2116 if (uf && uf->uf_set)
2117 (*uf->uf_set)(aTHX_ uf->uf_index, sv);
2122 Perl_magic_setregexp(pTHX_ SV *sv, MAGIC *mg)
2124 PERL_UNUSED_ARG(mg);
2125 sv_unmagic(sv, PERL_MAGIC_qr);
2130 Perl_magic_freeregexp(pTHX_ SV *sv, MAGIC *mg)
2132 regexp * const re = (regexp *)mg->mg_obj;
2133 PERL_UNUSED_ARG(sv);
2139 #ifdef USE_LOCALE_COLLATE
2141 Perl_magic_setcollxfrm(pTHX_ SV *sv, MAGIC *mg)
2144 * RenE<eacute> Descartes said "I think not."
2145 * and vanished with a faint plop.
2147 PERL_UNUSED_ARG(sv);
2149 Safefree(mg->mg_ptr);
2155 #endif /* USE_LOCALE_COLLATE */
2157 /* Just clear the UTF-8 cache data. */
2159 Perl_magic_setutf8(pTHX_ SV *sv, MAGIC *mg)
2161 PERL_UNUSED_ARG(sv);
2162 Safefree(mg->mg_ptr); /* The mg_ptr holds the pos cache. */
2164 mg->mg_len = -1; /* The mg_len holds the len cache. */
2169 Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
2171 register const char *s;
2174 switch (*mg->mg_ptr) {
2175 case '\001': /* ^A */
2176 sv_setsv(PL_bodytarget, sv);
2178 case '\003': /* ^C */
2179 PL_minus_c = (bool)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2182 case '\004': /* ^D */
2184 s = SvPV_nolen_const(sv);
2185 PL_debug = get_debug_opts_flags((char **)&s, 0) | DEBUG_TOP_FLAG;
2186 DEBUG_x(dump_all());
2188 PL_debug = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) | DEBUG_TOP_FLAG;
2191 case '\005': /* ^E */
2192 if (*(mg->mg_ptr+1) == '\0') {
2193 #ifdef MACOS_TRADITIONAL
2194 gMacPerl_OSErr = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2197 set_vaxc_errno(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2200 SetLastError( SvIV(sv) );
2203 os2_setsyserrno(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2205 /* will anyone ever use this? */
2206 SETERRNO(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv), 4);
2212 else if (strEQ(mg->mg_ptr+1, "NCODING")) {
2214 SvREFCNT_dec(PL_encoding);
2215 if (SvOK(sv) || SvGMAGICAL(sv)) {
2216 PL_encoding = newSVsv(sv);
2223 case '\006': /* ^F */
2224 PL_maxsysfd = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2226 case '\010': /* ^H */
2227 PL_hints = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2229 case '\011': /* ^I */ /* NOT \t in EBCDIC */
2230 Safefree(PL_inplace);
2231 PL_inplace = SvOK(sv) ? savesvpv(sv) : NULL;
2233 case '\017': /* ^O */
2234 if (*(mg->mg_ptr+1) == '\0') {
2235 Safefree(PL_osname);
2238 TAINT_PROPER("assigning to $^O");
2239 PL_osname = savesvpv(sv);
2242 else if (strEQ(mg->mg_ptr, "\017PEN")) {
2243 if (!PL_compiling.cop_io)
2244 PL_compiling.cop_io = newSVsv(sv);
2246 sv_setsv(PL_compiling.cop_io,sv);
2249 case '\020': /* ^P */
2250 PL_perldb = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2251 if (PL_perldb && !PL_DBsingle)
2254 case '\024': /* ^T */
2256 PL_basetime = (Time_t)(SvNOK(sv) ? SvNVX(sv) : sv_2nv(sv));
2258 PL_basetime = (Time_t)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2261 case '\025': /* ^UTF8CACHE */
2262 if (strEQ(mg->mg_ptr+1, "TF8CACHE")) {
2263 PL_utf8cache = (signed char) sv_2iv(sv);
2266 case '\027': /* ^W & $^WARNING_BITS */
2267 if (*(mg->mg_ptr+1) == '\0') {
2268 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
2269 i = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2270 PL_dowarn = (PL_dowarn & ~G_WARN_ON)
2271 | (i ? G_WARN_ON : G_WARN_OFF) ;
2274 else if (strEQ(mg->mg_ptr+1, "ARNING_BITS")) {
2275 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
2276 if (!SvPOK(sv) && PL_localizing) {
2277 sv_setpvn(sv, WARN_NONEstring, WARNsize);
2278 PL_compiling.cop_warnings = pWARN_NONE;
2283 int accumulate = 0 ;
2284 int any_fatals = 0 ;
2285 const char * const ptr = SvPV_const(sv, len) ;
2286 for (i = 0 ; i < len ; ++i) {
2287 accumulate |= ptr[i] ;
2288 any_fatals |= (ptr[i] & 0xAA) ;
2291 PL_compiling.cop_warnings = pWARN_NONE;
2292 else if (isWARN_on(sv, WARN_ALL) && !any_fatals) {
2293 PL_compiling.cop_warnings = pWARN_ALL;
2294 PL_dowarn |= G_WARN_ONCE ;
2297 if (specialWARN(PL_compiling.cop_warnings))
2298 PL_compiling.cop_warnings = newSVsv(sv) ;
2300 sv_setsv(PL_compiling.cop_warnings, sv);
2301 if (isWARN_on(PL_compiling.cop_warnings, WARN_ONCE))
2302 PL_dowarn |= G_WARN_ONCE ;
2310 if (PL_localizing) {
2311 if (PL_localizing == 1)
2312 SAVESPTR(PL_last_in_gv);
2314 else if (SvOK(sv) && GvIO(PL_last_in_gv))
2315 IoLINES(GvIOp(PL_last_in_gv)) = SvIV(sv);
2318 Safefree(IoTOP_NAME(GvIOp(PL_defoutgv)));
2319 s = IoTOP_NAME(GvIOp(PL_defoutgv)) = savesvpv(sv);
2320 IoTOP_GV(GvIOp(PL_defoutgv)) = gv_fetchsv(sv, GV_ADD, SVt_PVIO);
2323 Safefree(IoFMT_NAME(GvIOp(PL_defoutgv)));
2324 s = IoFMT_NAME(GvIOp(PL_defoutgv)) = savesvpv(sv);
2325 IoFMT_GV(GvIOp(PL_defoutgv)) = gv_fetchsv(sv, GV_ADD, SVt_PVIO);
2328 IoPAGE_LEN(GvIOp(PL_defoutgv)) = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2331 IoLINES_LEFT(GvIOp(PL_defoutgv)) = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2332 if (IoLINES_LEFT(GvIOp(PL_defoutgv)) < 0L)
2333 IoLINES_LEFT(GvIOp(PL_defoutgv)) = 0L;
2336 IoPAGE(GvIOp(PL_defoutgv)) = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2340 IO * const io = GvIOp(PL_defoutgv);
2343 if ((SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) == 0)
2344 IoFLAGS(io) &= ~IOf_FLUSH;
2346 if (!(IoFLAGS(io) & IOf_FLUSH)) {
2347 PerlIO *ofp = IoOFP(io);
2349 (void)PerlIO_flush(ofp);
2350 IoFLAGS(io) |= IOf_FLUSH;
2356 i = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2357 PL_multiline = (i != 0);
2360 SvREFCNT_dec(PL_rs);
2361 PL_rs = newSVsv(sv);
2365 SvREFCNT_dec(PL_ors_sv);
2366 if (SvOK(sv) || SvGMAGICAL(sv)) {
2367 PL_ors_sv = newSVsv(sv);
2375 SvREFCNT_dec(PL_ofs_sv);
2376 if (SvOK(sv) || SvGMAGICAL(sv)) {
2377 PL_ofs_sv = newSVsv(sv);
2386 PL_ofmt = savesvpv(sv);
2389 PL_compiling.cop_arybase = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2392 #ifdef COMPLEX_STATUS
2393 if (PL_localizing == 2) {
2394 PL_statusvalue = LvTARGOFF(sv);
2395 PL_statusvalue_vms = LvTARGLEN(sv);
2399 #ifdef VMSISH_STATUS
2401 STATUS_NATIVE_CHILD_SET((U32)SvIV(sv));
2404 STATUS_UNIX_EXIT_SET(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2409 # define PERL_VMS_BANG vaxc$errno
2411 # define PERL_VMS_BANG 0
2413 SETERRNO(SvIOK(sv) ? SvIVX(sv) : SvOK(sv) ? sv_2iv(sv) : 0,
2414 (SvIV(sv) == EVMSERR) ? 4 : PERL_VMS_BANG);
2418 PL_uid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2419 if (PL_delaymagic) {
2420 PL_delaymagic |= DM_RUID;
2421 break; /* don't do magic till later */
2424 (void)setruid((Uid_t)PL_uid);
2427 (void)setreuid((Uid_t)PL_uid, (Uid_t)-1);
2429 #ifdef HAS_SETRESUID
2430 (void)setresuid((Uid_t)PL_uid, (Uid_t)-1, (Uid_t)-1);
2432 if (PL_uid == PL_euid) { /* special case $< = $> */
2434 /* workaround for Darwin's setuid peculiarity, cf [perl #24122] */
2435 if (PL_uid != 0 && PerlProc_getuid() == 0)
2436 (void)PerlProc_setuid(0);
2438 (void)PerlProc_setuid(PL_uid);
2440 PL_uid = PerlProc_getuid();
2441 Perl_croak(aTHX_ "setruid() not implemented");
2446 PL_uid = PerlProc_getuid();
2447 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2450 PL_euid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2451 if (PL_delaymagic) {
2452 PL_delaymagic |= DM_EUID;
2453 break; /* don't do magic till later */
2456 (void)seteuid((Uid_t)PL_euid);
2459 (void)setreuid((Uid_t)-1, (Uid_t)PL_euid);
2461 #ifdef HAS_SETRESUID
2462 (void)setresuid((Uid_t)-1, (Uid_t)PL_euid, (Uid_t)-1);
2464 if (PL_euid == PL_uid) /* special case $> = $< */
2465 PerlProc_setuid(PL_euid);
2467 PL_euid = PerlProc_geteuid();
2468 Perl_croak(aTHX_ "seteuid() not implemented");
2473 PL_euid = PerlProc_geteuid();
2474 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2477 PL_gid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2478 if (PL_delaymagic) {
2479 PL_delaymagic |= DM_RGID;
2480 break; /* don't do magic till later */
2483 (void)setrgid((Gid_t)PL_gid);
2486 (void)setregid((Gid_t)PL_gid, (Gid_t)-1);
2488 #ifdef HAS_SETRESGID
2489 (void)setresgid((Gid_t)PL_gid, (Gid_t)-1, (Gid_t) 1);
2491 if (PL_gid == PL_egid) /* special case $( = $) */
2492 (void)PerlProc_setgid(PL_gid);
2494 PL_gid = PerlProc_getgid();
2495 Perl_croak(aTHX_ "setrgid() not implemented");
2500 PL_gid = PerlProc_getgid();
2501 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2504 #ifdef HAS_SETGROUPS
2506 const char *p = SvPV_const(sv, len);
2507 Groups_t *gary = NULL;
2512 for (i = 0; i < NGROUPS; ++i) {
2513 while (*p && !isSPACE(*p))
2520 Newx(gary, i + 1, Groups_t);
2522 Renew(gary, i + 1, Groups_t);
2526 (void)setgroups(i, gary);
2530 #else /* HAS_SETGROUPS */
2531 PL_egid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2532 #endif /* HAS_SETGROUPS */
2533 if (PL_delaymagic) {
2534 PL_delaymagic |= DM_EGID;
2535 break; /* don't do magic till later */
2538 (void)setegid((Gid_t)PL_egid);
2541 (void)setregid((Gid_t)-1, (Gid_t)PL_egid);
2543 #ifdef HAS_SETRESGID
2544 (void)setresgid((Gid_t)-1, (Gid_t)PL_egid, (Gid_t)-1);
2546 if (PL_egid == PL_gid) /* special case $) = $( */
2547 (void)PerlProc_setgid(PL_egid);
2549 PL_egid = PerlProc_getegid();
2550 Perl_croak(aTHX_ "setegid() not implemented");
2555 PL_egid = PerlProc_getegid();
2556 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2559 PL_chopset = SvPV_force(sv,len);
2561 #ifndef MACOS_TRADITIONAL
2563 LOCK_DOLLARZERO_MUTEX;
2564 #ifdef HAS_SETPROCTITLE
2565 /* The BSDs don't show the argv[] in ps(1) output, they
2566 * show a string from the process struct and provide
2567 * the setproctitle() routine to manipulate that. */
2568 if (PL_origalen != 1) {
2569 s = SvPV_const(sv, len);
2570 # if __FreeBSD_version > 410001
2571 /* The leading "-" removes the "perl: " prefix,
2572 * but not the "(perl) suffix from the ps(1)
2573 * output, because that's what ps(1) shows if the
2574 * argv[] is modified. */
2575 setproctitle("-%s", s);
2576 # else /* old FreeBSDs, NetBSD, OpenBSD, anyBSD */
2577 /* This doesn't really work if you assume that
2578 * $0 = 'foobar'; will wipe out 'perl' from the $0
2579 * because in ps(1) output the result will be like
2580 * sprintf("perl: %s (perl)", s)
2581 * I guess this is a security feature:
2582 * one (a user process) cannot get rid of the original name.
2584 setproctitle("%s", s);
2588 #if defined(__hpux) && defined(PSTAT_SETCMD)
2589 if (PL_origalen != 1) {
2591 s = SvPV_const(sv, len);
2592 un.pst_command = (char *)s;
2593 pstat(PSTAT_SETCMD, un, len, 0, 0);
2596 if (PL_origalen > 1) {
2597 /* PL_origalen is set in perl_parse(). */
2598 s = SvPV_force(sv,len);
2599 if (len >= (STRLEN)PL_origalen-1) {
2600 /* Longer than original, will be truncated. We assume that
2601 * PL_origalen bytes are available. */
2602 Copy(s, PL_origargv[0], PL_origalen-1, char);
2605 /* Shorter than original, will be padded. */
2606 Copy(s, PL_origargv[0], len, char);
2607 PL_origargv[0][len] = 0;
2608 memset(PL_origargv[0] + len + 1,
2609 /* Is the space counterintuitive? Yes.
2610 * (You were expecting \0?)
2611 * Does it work? Seems to. (In Linux 2.4.20 at least.)
2614 PL_origalen - len - 1);
2616 PL_origargv[0][PL_origalen-1] = 0;
2617 for (i = 1; i < PL_origargc; i++)
2620 UNLOCK_DOLLARZERO_MUTEX;
2623 #ifdef USE_5005THREADS
2625 sv_setsv(thr->errsv, sv);
2627 #endif /* USE_5005THREADS */
2632 #ifdef USE_5005THREADS
2634 Perl_magic_mutexfree(pTHX_ SV *sv, MAGIC *mg)
2636 DEBUG_S(PerlIO_printf(Perl_debug_log,
2637 "0x%"UVxf": magic_mutexfree 0x%"UVxf"\n",
2638 PTR2UV(thr), PTR2UV(sv)));
2640 Perl_croak(aTHX_ "panic: magic_mutexfree");
2641 MUTEX_DESTROY(MgMUTEXP(mg));
2642 COND_DESTROY(MgCONDP(mg));
2645 #endif /* USE_5005THREADS */
2648 Perl_whichsig(pTHX_ char *sig)
2650 register const char * const *sigv;
2652 for (sigv = PL_sig_name; *sigv; sigv++)
2653 if (strEQ(sig,*sigv))
2654 return PL_sig_num[sigv - PL_sig_name];
2656 if (strEQ(sig,"CHLD"))
2660 if (strEQ(sig,"CLD"))
2666 #if !defined(PERL_IMPLICIT_CONTEXT)
2667 static SV* PL_sig_sv;
2671 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
2672 Perl_sighandler(int sig)
2674 Perl_sighandler_va(sig);
2678 Perl_sighandler_va(int sig, ...)
2680 Perl_sighandler(int sig)
2683 #ifdef PERL_GET_SIG_CONTEXT
2684 dTHXa(PERL_GET_SIG_CONTEXT);
2691 SV * const tSv = PL_Sv;
2695 XPV * const tXpv = PL_Xpv;
2697 if (PL_savestack_ix + 15 <= PL_savestack_max)
2699 if (PL_markstack_ptr < PL_markstack_max - 2)
2701 if (PL_retstack_ix < PL_retstack_max - 2)
2703 if (PL_scopestack_ix < PL_scopestack_max - 3)
2706 if (!PL_psig_ptr[sig]) {
2707 PerlIO_printf(Perl_error_log, "Signal SIG%s received, but no signal handler set.\n",
2712 /* Max number of items pushed there is 3*n or 4. We cannot fix
2713 infinity, so we fix 4 (in fact 5): */
2715 PL_savestack_ix += 5; /* Protect save in progress. */
2716 SAVEDESTRUCTOR_X(S_unwind_handler_stack, (void*)&flags);
2719 PL_markstack_ptr++; /* Protect mark. */
2722 PL_retstack[PL_retstack_ix] = NULL;
2725 PL_scopestack_ix += 1;
2726 /* sv_2cv is too complicated, try a simpler variant first: */
2727 if (!SvROK(PL_psig_ptr[sig]) || !(cv = (CV*)SvRV(PL_psig_ptr[sig]))
2728 || SvTYPE(cv) != SVt_PVCV) {
2730 cv = sv_2cv(PL_psig_ptr[sig], &st, &gv, GV_ADD);
2733 if (!cv || !CvROOT(cv)) {
2734 if (ckWARN(WARN_SIGNAL))
2735 Perl_warner(aTHX_ packWARN(WARN_SIGNAL), "SIG%s handler \"%s\" not defined.\n",
2736 PL_sig_name[sig], (gv ? GvENAME(gv)
2743 if(PL_psig_name[sig]) {
2744 sv = SvREFCNT_inc_NN(PL_psig_name[sig]);
2746 #if !defined(PERL_IMPLICIT_CONTEXT)
2750 sv = sv_newmortal();
2751 sv_setpv(sv,PL_sig_name[sig]);
2754 PUSHSTACKi(PERLSI_SIGNAL);
2757 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
2759 struct sigaction oact;
2761 if (sigaction(sig, 0, &oact) == 0 && oact.sa_flags & SA_SIGINFO) {
2765 va_start(args, sig);
2766 sip = (siginfo_t*)va_arg(args, siginfo_t*);
2769 SV *rv = newRV_noinc((SV*)sih);
2770 /* The siginfo fields signo, code, errno, pid, uid,
2771 * addr, status, and band are defined by POSIX/SUSv3. */
2772 hv_store(sih, "signo", 5, newSViv(sip->si_signo), 0);
2773 hv_store(sih, "code", 4, newSViv(sip->si_code), 0);
2774 #if 0 /* XXX TODO: Configure scan for the existence of these, but even that does not help if the SA_SIGINFO is not implemented according to the spec. */
2775 hv_store(sih, "errno", 5, newSViv(sip->si_errno), 0);
2776 hv_store(sih, "status", 6, newSViv(sip->si_status), 0);
2777 hv_store(sih, "uid", 3, newSViv(sip->si_uid), 0);
2778 hv_store(sih, "pid", 3, newSViv(sip->si_pid), 0);
2779 hv_store(sih, "addr", 4, newSVuv(PTR2UV(sip->si_addr)), 0);
2780 hv_store(sih, "band", 4, newSViv(sip->si_band), 0);
2784 PUSHs(newSVpv((void*)sip, sizeof(*sip)));
2793 call_sv((SV*)cv, G_DISCARD|G_EVAL);
2796 if (SvTRUE(ERRSV)) {
2798 #ifdef HAS_SIGPROCMASK
2799 /* Handler "died", for example to get out of a restart-able read().
2800 * Before we re-do that on its behalf re-enable the signal which was
2801 * blocked by the system when we entered.
2805 sigaddset(&set,sig);
2806 sigprocmask(SIG_UNBLOCK, &set, NULL);
2808 /* Not clear if this will work */
2809 (void)rsignal(sig, SIG_IGN);
2810 (void)rsignal(sig, PL_csighandlerp);
2812 #endif /* !PERL_MICRO */
2813 Perl_die(aTHX_ NULL);
2817 PL_savestack_ix -= 8; /* Unprotect save in progress. */
2823 PL_scopestack_ix -= 1;
2826 PL_op = myop; /* Apparently not needed... */
2828 PL_Sv = tSv; /* Restore global temporaries. */
2835 S_restore_magic(pTHX_ const void *p)
2837 MGS* const mgs = SSPTR(PTR2IV(p), MGS*);
2838 SV* const sv = mgs->mgs_sv;
2843 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
2846 SvFLAGS(sv) |= mgs->mgs_flags;
2849 if (SvGMAGICAL(sv)) {
2850 /* downgrade public flags to private,
2851 and discard any other private flags */
2853 U32 public = SvFLAGS(sv) & (SVf_IOK|SVf_NOK|SVf_POK);
2855 SvFLAGS(sv) &= ~( public | SVp_IOK|SVp_NOK|SVp_POK );
2856 SvFLAGS(sv) |= ( public << PRIVSHIFT );
2861 mgs->mgs_sv = NULL; /* mark the MGS structure as restored */
2863 /* If we're still on top of the stack, pop us off. (That condition
2864 * will be satisfied if restore_magic was called explicitly, but *not*
2865 * if it's being called via leave_scope.)
2866 * The reason for doing this is that otherwise, things like sv_2cv()
2867 * may leave alloc gunk on the savestack, and some code
2868 * (e.g. sighandler) doesn't expect that...
2870 if (PL_savestack_ix == mgs->mgs_ss_ix)
2872 I32 popval = SSPOPINT;
2873 assert(popval == SAVEt_DESTRUCTOR_X);
2874 PL_savestack_ix -= 2;
2876 assert(popval == SAVEt_ALLOC);
2878 PL_savestack_ix -= popval;
2884 S_unwind_handler_stack(pTHX_ const void *p)
2886 const U32 flags = *(const U32*)p;
2889 PL_savestack_ix -= 5; /* Unprotect save in progress. */
2890 #if !defined(PERL_IMPLICIT_CONTEXT)
2892 SvREFCNT_dec(PL_sig_sv);
2898 * c-indentation-style: bsd
2900 * indent-tabs-mode: t
2903 * ex: set ts=8 sts=4 sw=4 noet: