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