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