This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Don't recurse forever if both new() and TIESCALAR() are missing.
[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 if (SvPOKp(sv))
1052 SvPOK_on(sv); /* may have got removed during taint processing */
1053 RESTORE_ERRNO;
1054 }
1055
1056 SvRTRIM(sv);
1057 SvNOK_on(sv); /* what a wonderful hack! */
1058 break;
1059 case '<':
1060 sv_setiv(sv, (IV)PL_uid);
1061 break;
1062 case '>':
1063 sv_setiv(sv, (IV)PL_euid);
1064 break;
1065 case '(':
1066 sv_setiv(sv, (IV)PL_gid);
1067 goto add_groups;
1068 case ')':
1069 sv_setiv(sv, (IV)PL_egid);
1070 add_groups:
1071#ifdef HAS_GETGROUPS
1072 {
1073 Groups_t *gary = NULL;
1074 I32 i, num_groups = getgroups(0, gary);
1075 Newx(gary, num_groups, Groups_t);
1076 num_groups = getgroups(num_groups, gary);
1077 for (i = 0; i < num_groups; i++)
1078 Perl_sv_catpvf(aTHX_ sv, " %"IVdf, (IV)gary[i]);
1079 Safefree(gary);
1080 }
1081 (void)SvIOK_on(sv); /* what a wonderful hack! */
1082#endif
1083 break;
1084 case '0':
1085 break;
1086 }
1087 return 0;
1088}
1089
1090int
1091Perl_magic_getuvar(pTHX_ SV *sv, MAGIC *mg)
1092{
1093 struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
1094
1095 PERL_ARGS_ASSERT_MAGIC_GETUVAR;
1096
1097 if (uf && uf->uf_val)
1098 (*uf->uf_val)(aTHX_ uf->uf_index, sv);
1099 return 0;
1100}
1101
1102int
1103Perl_magic_setenv(pTHX_ SV *sv, MAGIC *mg)
1104{
1105 dVAR;
1106 STRLEN len = 0, klen;
1107 const char *s = SvOK(sv) ? SvPV_const(sv,len) : "";
1108 const char * const ptr = MgPV_const(mg,klen);
1109 my_setenv(ptr, s);
1110
1111 PERL_ARGS_ASSERT_MAGIC_SETENV;
1112
1113#ifdef DYNAMIC_ENV_FETCH
1114 /* We just undefd an environment var. Is a replacement */
1115 /* waiting in the wings? */
1116 if (!len) {
1117 SV ** const valp = hv_fetch(GvHVn(PL_envgv), ptr, klen, FALSE);
1118 if (valp)
1119 s = SvOK(*valp) ? SvPV_const(*valp, len) : "";
1120 }
1121#endif
1122
1123#if !defined(OS2) && !defined(AMIGAOS) && !defined(WIN32) && !defined(MSDOS)
1124 /* And you'll never guess what the dog had */
1125 /* in its mouth... */
1126 if (PL_tainting) {
1127 MgTAINTEDDIR_off(mg);
1128#ifdef VMS
1129 if (s && klen == 8 && strEQ(ptr, "DCL$PATH")) {
1130 char pathbuf[256], eltbuf[256], *cp, *elt;
1131 Stat_t sbuf;
1132 int i = 0, j = 0;
1133
1134 my_strlcpy(eltbuf, s, sizeof(eltbuf));
1135 elt = eltbuf;
1136 do { /* DCL$PATH may be a search list */
1137 while (1) { /* as may dev portion of any element */
1138 if ( ((cp = strchr(elt,'[')) || (cp = strchr(elt,'<'))) ) {
1139 if ( *(cp+1) == '.' || *(cp+1) == '-' ||
1140 cando_by_name(S_IWUSR,0,elt) ) {
1141 MgTAINTEDDIR_on(mg);
1142 return 0;
1143 }
1144 }
1145 if ((cp = strchr(elt, ':')) != NULL)
1146 *cp = '\0';
1147 if (my_trnlnm(elt, eltbuf, j++))
1148 elt = eltbuf;
1149 else
1150 break;
1151 }
1152 j = 0;
1153 } while (my_trnlnm(s, pathbuf, i++) && (elt = pathbuf));
1154 }
1155#endif /* VMS */
1156 if (s && klen == 4 && strEQ(ptr,"PATH")) {
1157 const char * const strend = s + len;
1158
1159 while (s < strend) {
1160 char tmpbuf[256];
1161 Stat_t st;
1162 I32 i;
1163#ifdef VMS /* Hmm. How do we get $Config{path_sep} from C? */
1164 const char path_sep = '|';
1165#else
1166 const char path_sep = ':';
1167#endif
1168 s = delimcpy(tmpbuf, tmpbuf + sizeof tmpbuf,
1169 s, strend, path_sep, &i);
1170 s++;
1171 if (i >= (I32)sizeof tmpbuf /* too long -- assume the worst */
1172#ifdef VMS
1173 || !strchr(tmpbuf, ':') /* no colon thus no device name -- assume relative path */
1174#else
1175 || *tmpbuf != '/' /* no starting slash -- assume relative path */
1176#endif
1177 || (PerlLIO_stat(tmpbuf, &st) == 0 && (st.st_mode & 2)) ) {
1178 MgTAINTEDDIR_on(mg);
1179 return 0;
1180 }
1181 }
1182 }
1183 }
1184#endif /* neither OS2 nor AMIGAOS nor WIN32 nor MSDOS */
1185
1186 return 0;
1187}
1188
1189int
1190Perl_magic_clearenv(pTHX_ SV *sv, MAGIC *mg)
1191{
1192 PERL_ARGS_ASSERT_MAGIC_CLEARENV;
1193 PERL_UNUSED_ARG(sv);
1194 my_setenv(MgPV_nolen_const(mg),NULL);
1195 return 0;
1196}
1197
1198int
1199Perl_magic_set_all_env(pTHX_ SV *sv, MAGIC *mg)
1200{
1201 dVAR;
1202 PERL_ARGS_ASSERT_MAGIC_SET_ALL_ENV;
1203 PERL_UNUSED_ARG(mg);
1204#if defined(VMS)
1205 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1206#else
1207 if (PL_localizing) {
1208 HE* entry;
1209 my_clearenv();
1210 hv_iterinit(MUTABLE_HV(sv));
1211 while ((entry = hv_iternext(MUTABLE_HV(sv)))) {
1212 I32 keylen;
1213 my_setenv(hv_iterkey(entry, &keylen),
1214 SvPV_nolen_const(hv_iterval(MUTABLE_HV(sv), entry)));
1215 }
1216 }
1217#endif
1218 return 0;
1219}
1220
1221int
1222Perl_magic_clear_all_env(pTHX_ SV *sv, MAGIC *mg)
1223{
1224 dVAR;
1225 PERL_ARGS_ASSERT_MAGIC_CLEAR_ALL_ENV;
1226 PERL_UNUSED_ARG(sv);
1227 PERL_UNUSED_ARG(mg);
1228#if defined(VMS)
1229 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1230#else
1231 my_clearenv();
1232#endif
1233 return 0;
1234}
1235
1236#ifndef PERL_MICRO
1237#ifdef HAS_SIGPROCMASK
1238static void
1239restore_sigmask(pTHX_ SV *save_sv)
1240{
1241 const sigset_t * const ossetp = (const sigset_t *) SvPV_nolen_const( save_sv );
1242 (void)sigprocmask(SIG_SETMASK, ossetp, NULL);
1243}
1244#endif
1245int
1246Perl_magic_getsig(pTHX_ SV *sv, MAGIC *mg)
1247{
1248 dVAR;
1249 /* Are we fetching a signal entry? */
1250 int i = (I16)mg->mg_private;
1251
1252 PERL_ARGS_ASSERT_MAGIC_GETSIG;
1253
1254 if (!i) {
1255 mg->mg_private = i = whichsig(MgPV_nolen_const(mg));
1256 }
1257
1258 if (i > 0) {
1259 if(PL_psig_ptr[i])
1260 sv_setsv(sv,PL_psig_ptr[i]);
1261 else {
1262 Sighandler_t sigstate = rsignal_state(i);
1263#ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1264 if (PL_sig_handlers_initted && PL_sig_ignoring[i])
1265 sigstate = SIG_IGN;
1266#endif
1267#ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1268 if (PL_sig_handlers_initted && PL_sig_defaulting[i])
1269 sigstate = SIG_DFL;
1270#endif
1271 /* cache state so we don't fetch it again */
1272 if(sigstate == (Sighandler_t) SIG_IGN)
1273 sv_setpvs(sv,"IGNORE");
1274 else
1275 sv_setsv(sv,&PL_sv_undef);
1276 PL_psig_ptr[i] = SvREFCNT_inc_simple_NN(sv);
1277 SvTEMP_off(sv);
1278 }
1279 }
1280 return 0;
1281}
1282int
1283Perl_magic_clearsig(pTHX_ SV *sv, MAGIC *mg)
1284{
1285 PERL_ARGS_ASSERT_MAGIC_CLEARSIG;
1286 PERL_UNUSED_ARG(sv);
1287
1288 magic_setsig(NULL, mg);
1289 return sv_unmagic(sv, mg->mg_type);
1290}
1291
1292Signal_t
1293#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
1294Perl_csighandler(int sig, siginfo_t *sip PERL_UNUSED_DECL, void *uap PERL_UNUSED_DECL)
1295#else
1296Perl_csighandler(int sig)
1297#endif
1298{
1299#ifdef PERL_GET_SIG_CONTEXT
1300 dTHXa(PERL_GET_SIG_CONTEXT);
1301#else
1302 dTHX;
1303#endif
1304#ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1305 (void) rsignal(sig, PL_csighandlerp);
1306 if (PL_sig_ignoring[sig]) return;
1307#endif
1308#ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1309 if (PL_sig_defaulting[sig])
1310#ifdef KILL_BY_SIGPRC
1311 exit((Perl_sig_to_vmscondition(sig)&STS$M_COND_ID)|STS$K_SEVERE|STS$M_INHIB_MSG);
1312#else
1313 exit(1);
1314#endif
1315#endif
1316 if (
1317#ifdef SIGILL
1318 sig == SIGILL ||
1319#endif
1320#ifdef SIGBUS
1321 sig == SIGBUS ||
1322#endif
1323#ifdef SIGSEGV
1324 sig == SIGSEGV ||
1325#endif
1326 (PL_signals & PERL_SIGNALS_UNSAFE_FLAG))
1327 /* Call the perl level handler now--
1328 * with risk we may be in malloc() or being destructed etc. */
1329#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
1330 (*PL_sighandlerp)(sig, NULL, NULL);
1331#else
1332 (*PL_sighandlerp)(sig);
1333#endif
1334 else {
1335 if (!PL_psig_pend) return;
1336 /* Set a flag to say this signal is pending, that is awaiting delivery after
1337 * the current Perl opcode completes */
1338 PL_psig_pend[sig]++;
1339
1340#ifndef SIG_PENDING_DIE_COUNT
1341# define SIG_PENDING_DIE_COUNT 120
1342#endif
1343 /* Add one to say _a_ signal is pending */
1344 if (++PL_sig_pending >= SIG_PENDING_DIE_COUNT)
1345 Perl_croak(aTHX_ "Maximal count of pending signals (%lu) exceeded",
1346 (unsigned long)SIG_PENDING_DIE_COUNT);
1347 }
1348}
1349
1350#if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1351void
1352Perl_csighandler_init(void)
1353{
1354 int sig;
1355 if (PL_sig_handlers_initted) return;
1356
1357 for (sig = 1; sig < SIG_SIZE; sig++) {
1358#ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1359 dTHX;
1360 PL_sig_defaulting[sig] = 1;
1361 (void) rsignal(sig, PL_csighandlerp);
1362#endif
1363#ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1364 PL_sig_ignoring[sig] = 0;
1365#endif
1366 }
1367 PL_sig_handlers_initted = 1;
1368}
1369#endif
1370
1371void
1372Perl_despatch_signals(pTHX)
1373{
1374 dVAR;
1375 int sig;
1376 PL_sig_pending = 0;
1377 for (sig = 1; sig < SIG_SIZE; sig++) {
1378 if (PL_psig_pend[sig]) {
1379 PERL_BLOCKSIG_ADD(set, sig);
1380 PL_psig_pend[sig] = 0;
1381 PERL_BLOCKSIG_BLOCK(set);
1382#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
1383 (*PL_sighandlerp)(sig, NULL, NULL);
1384#else
1385 (*PL_sighandlerp)(sig);
1386#endif
1387 PERL_BLOCKSIG_UNBLOCK(set);
1388 }
1389 }
1390}
1391
1392/* sv of NULL signifies that we're acting as magic_clearsig. */
1393int
1394Perl_magic_setsig(pTHX_ SV *sv, MAGIC *mg)
1395{
1396 dVAR;
1397 I32 i;
1398 SV** svp = NULL;
1399 /* Need to be careful with SvREFCNT_dec(), because that can have side
1400 * effects (due to closures). We must make sure that the new disposition
1401 * is in place before it is called.
1402 */
1403 SV* to_dec = NULL;
1404 STRLEN len;
1405#ifdef HAS_SIGPROCMASK
1406 sigset_t set, save;
1407 SV* save_sv;
1408#endif
1409 register const char *s = MgPV_const(mg,len);
1410
1411 PERL_ARGS_ASSERT_MAGIC_SETSIG;
1412
1413 if (*s == '_') {
1414 if (strEQ(s,"__DIE__"))
1415 svp = &PL_diehook;
1416 else if (strEQ(s,"__WARN__")
1417 && (sv ? 1 : PL_warnhook != PERL_WARNHOOK_FATAL)) {
1418 /* Merge the existing behaviours, which are as follows:
1419 magic_setsig, we always set svp to &PL_warnhook
1420 (hence we always change the warnings handler)
1421 For magic_clearsig, we don't change the warnings handler if it's
1422 set to the &PL_warnhook. */
1423 svp = &PL_warnhook;
1424 } else if (sv)
1425 Perl_croak(aTHX_ "No such hook: %s", s);
1426 i = 0;
1427 if (svp && *svp) {
1428 if (*svp != PERL_WARNHOOK_FATAL)
1429 to_dec = *svp;
1430 *svp = NULL;
1431 }
1432 }
1433 else {
1434 i = (I16)mg->mg_private;
1435 if (!i) {
1436 i = whichsig(s); /* ...no, a brick */
1437 mg->mg_private = (U16)i;
1438 }
1439 if (i <= 0) {
1440 if (sv)
1441 Perl_ck_warner(aTHX_ packWARN(WARN_SIGNAL), "No such signal: SIG%s", s);
1442 return 0;
1443 }
1444#ifdef HAS_SIGPROCMASK
1445 /* Avoid having the signal arrive at a bad time, if possible. */
1446 sigemptyset(&set);
1447 sigaddset(&set,i);
1448 sigprocmask(SIG_BLOCK, &set, &save);
1449 ENTER;
1450 save_sv = newSVpvn((char *)(&save), sizeof(sigset_t));
1451 SAVEFREESV(save_sv);
1452 SAVEDESTRUCTOR_X(restore_sigmask, save_sv);
1453#endif
1454 PERL_ASYNC_CHECK();
1455#if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1456 if (!PL_sig_handlers_initted) Perl_csighandler_init();
1457#endif
1458#ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1459 PL_sig_ignoring[i] = 0;
1460#endif
1461#ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1462 PL_sig_defaulting[i] = 0;
1463#endif
1464 to_dec = PL_psig_ptr[i];
1465 if (sv) {
1466 PL_psig_ptr[i] = SvREFCNT_inc_simple_NN(sv);
1467 SvTEMP_off(sv); /* Make sure it doesn't go away on us */
1468
1469 /* Signals don't change name during the program's execution, so once
1470 they're cached in the appropriate slot of PL_psig_name, they can
1471 stay there.
1472
1473 Ideally we'd find some way of making SVs at (C) compile time, or
1474 at least, doing most of the work. */
1475 if (!PL_psig_name[i]) {
1476 PL_psig_name[i] = newSVpvn(s, len);
1477 SvREADONLY_on(PL_psig_name[i]);
1478 }
1479 } else {
1480 SvREFCNT_dec(PL_psig_name[i]);
1481 PL_psig_name[i] = NULL;
1482 PL_psig_ptr[i] = NULL;
1483 }
1484 }
1485 if (sv && (isGV_with_GP(sv) || SvROK(sv))) {
1486 if (i) {
1487 (void)rsignal(i, PL_csighandlerp);
1488 }
1489 else
1490 *svp = SvREFCNT_inc_simple_NN(sv);
1491 } else {
1492 if (sv && SvOK(sv)) {
1493 s = SvPV_force(sv, len);
1494 } else {
1495 sv = NULL;
1496 }
1497 if (sv && strEQ(s,"IGNORE")) {
1498 if (i) {
1499#ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1500 PL_sig_ignoring[i] = 1;
1501 (void)rsignal(i, PL_csighandlerp);
1502#else
1503 (void)rsignal(i, (Sighandler_t) SIG_IGN);
1504#endif
1505 }
1506 }
1507 else if (!sv || strEQ(s,"DEFAULT") || !len) {
1508 if (i) {
1509#ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1510 PL_sig_defaulting[i] = 1;
1511 (void)rsignal(i, PL_csighandlerp);
1512#else
1513 (void)rsignal(i, (Sighandler_t) SIG_DFL);
1514#endif
1515 }
1516 }
1517 else {
1518 /*
1519 * We should warn if HINT_STRICT_REFS, but without
1520 * access to a known hint bit in a known OP, we can't
1521 * tell whether HINT_STRICT_REFS is in force or not.
1522 */
1523 if (!strchr(s,':') && !strchr(s,'\''))
1524 Perl_sv_insert_flags(aTHX_ sv, 0, 0, STR_WITH_LEN("main::"),
1525 SV_GMAGIC);
1526 if (i)
1527 (void)rsignal(i, PL_csighandlerp);
1528 else
1529 *svp = SvREFCNT_inc_simple_NN(sv);
1530 }
1531 }
1532
1533#ifdef HAS_SIGPROCMASK
1534 if(i)
1535 LEAVE;
1536#endif
1537 SvREFCNT_dec(to_dec);
1538 return 0;
1539}
1540#endif /* !PERL_MICRO */
1541
1542int
1543Perl_magic_setisa(pTHX_ SV *sv, MAGIC *mg)
1544{
1545 dVAR;
1546 PERL_ARGS_ASSERT_MAGIC_SETISA;
1547 PERL_UNUSED_ARG(sv);
1548
1549 /* Skip _isaelem because _isa will handle it shortly */
1550 if (PL_delaymagic & DM_ARRAY && mg->mg_type == PERL_MAGIC_isaelem)
1551 return 0;
1552
1553 return magic_clearisa(NULL, mg);
1554}
1555
1556/* sv of NULL signifies that we're acting as magic_setisa. */
1557int
1558Perl_magic_clearisa(pTHX_ SV *sv, MAGIC *mg)
1559{
1560 dVAR;
1561 HV* stash;
1562
1563 PERL_ARGS_ASSERT_MAGIC_CLEARISA;
1564
1565 /* Bail out if destruction is going on */
1566 if(PL_dirty) return 0;
1567
1568 if (sv)
1569 av_clear(MUTABLE_AV(sv));
1570
1571 /* XXX Once it's possible, we need to
1572 detect that our @ISA is aliased in
1573 other stashes, and act on the stashes
1574 of all of the aliases */
1575
1576 /* The first case occurs via setisa,
1577 the second via setisa_elem, which
1578 calls this same magic */
1579 stash = GvSTASH(
1580 SvTYPE(mg->mg_obj) == SVt_PVGV
1581 ? (const GV *)mg->mg_obj
1582 : (const GV *)mg_find(mg->mg_obj, PERL_MAGIC_isa)->mg_obj
1583 );
1584
1585 if (stash)
1586 mro_isa_changed_in(stash);
1587
1588 return 0;
1589}
1590
1591int
1592Perl_magic_setamagic(pTHX_ SV *sv, MAGIC *mg)
1593{
1594 dVAR;
1595 PERL_ARGS_ASSERT_MAGIC_SETAMAGIC;
1596 PERL_UNUSED_ARG(sv);
1597 PERL_UNUSED_ARG(mg);
1598 PL_amagic_generation++;
1599
1600 return 0;
1601}
1602
1603int
1604Perl_magic_getnkeys(pTHX_ SV *sv, MAGIC *mg)
1605{
1606 HV * const hv = MUTABLE_HV(LvTARG(sv));
1607 I32 i = 0;
1608
1609 PERL_ARGS_ASSERT_MAGIC_GETNKEYS;
1610 PERL_UNUSED_ARG(mg);
1611
1612 if (hv) {
1613 (void) hv_iterinit(hv);
1614 if (! SvTIED_mg((const SV *)hv, PERL_MAGIC_tied))
1615 i = HvKEYS(hv);
1616 else {
1617 while (hv_iternext(hv))
1618 i++;
1619 }
1620 }
1621
1622 sv_setiv(sv, (IV)i);
1623 return 0;
1624}
1625
1626int
1627Perl_magic_setnkeys(pTHX_ SV *sv, MAGIC *mg)
1628{
1629 PERL_ARGS_ASSERT_MAGIC_SETNKEYS;
1630 PERL_UNUSED_ARG(mg);
1631 if (LvTARG(sv)) {
1632 hv_ksplit(MUTABLE_HV(LvTARG(sv)), SvIV(sv));
1633 }
1634 return 0;
1635}
1636
1637/* caller is responsible for stack switching/cleanup */
1638STATIC int
1639S_magic_methcall(pTHX_ SV *sv, const MAGIC *mg, const char *meth, I32 flags, int n, SV *val)
1640{
1641 dVAR;
1642 dSP;
1643
1644 PERL_ARGS_ASSERT_MAGIC_METHCALL;
1645
1646 PUSHMARK(SP);
1647 EXTEND(SP, n);
1648 PUSHs(SvTIED_obj(sv, mg));
1649 if (n > 1) {
1650 if (mg->mg_ptr) {
1651 if (mg->mg_len >= 0)
1652 mPUSHp(mg->mg_ptr, mg->mg_len);
1653 else if (mg->mg_len == HEf_SVKEY)
1654 PUSHs(MUTABLE_SV(mg->mg_ptr));
1655 }
1656 else if (mg->mg_type == PERL_MAGIC_tiedelem) {
1657 mPUSHi(mg->mg_len);
1658 }
1659 }
1660 if (n > 2) {
1661 PUSHs(val);
1662 }
1663 PUTBACK;
1664
1665 return call_method(meth, flags);
1666}
1667
1668STATIC int
1669S_magic_methpack(pTHX_ SV *sv, const MAGIC *mg, const char *meth)
1670{
1671 dVAR; dSP;
1672
1673 PERL_ARGS_ASSERT_MAGIC_METHPACK;
1674
1675 ENTER;
1676 SAVETMPS;
1677 PUSHSTACKi(PERLSI_MAGIC);
1678
1679 if (magic_methcall(sv, mg, meth, G_SCALAR, 2, NULL)) {
1680 sv_setsv(sv, *PL_stack_sp--);
1681 }
1682
1683 POPSTACK;
1684 FREETMPS;
1685 LEAVE;
1686 return 0;
1687}
1688
1689int
1690Perl_magic_getpack(pTHX_ SV *sv, MAGIC *mg)
1691{
1692 PERL_ARGS_ASSERT_MAGIC_GETPACK;
1693
1694 if (mg->mg_ptr)
1695 mg->mg_flags |= MGf_GSKIP;
1696 magic_methpack(sv,mg,"FETCH");
1697 return 0;
1698}
1699
1700int
1701Perl_magic_setpack(pTHX_ SV *sv, MAGIC *mg)
1702{
1703 dVAR; dSP;
1704
1705 PERL_ARGS_ASSERT_MAGIC_SETPACK;
1706
1707 ENTER;
1708 PUSHSTACKi(PERLSI_MAGIC);
1709 magic_methcall(sv, mg, "STORE", G_SCALAR|G_DISCARD, 3, sv);
1710 POPSTACK;
1711 LEAVE;
1712 return 0;
1713}
1714
1715int
1716Perl_magic_clearpack(pTHX_ SV *sv, MAGIC *mg)
1717{
1718 PERL_ARGS_ASSERT_MAGIC_CLEARPACK;
1719
1720 return magic_methpack(sv,mg,"DELETE");
1721}
1722
1723
1724U32
1725Perl_magic_sizepack(pTHX_ SV *sv, MAGIC *mg)
1726{
1727 dVAR; dSP;
1728 I32 retval = 0;
1729
1730 PERL_ARGS_ASSERT_MAGIC_SIZEPACK;
1731
1732 ENTER;
1733 SAVETMPS;
1734 PUSHSTACKi(PERLSI_MAGIC);
1735 if (magic_methcall(sv, mg, "FETCHSIZE", G_SCALAR, 2, NULL)) {
1736 sv = *PL_stack_sp--;
1737 retval = SvIV(sv)-1;
1738 if (retval < -1)
1739 Perl_croak(aTHX_ "FETCHSIZE returned a negative value");
1740 }
1741 POPSTACK;
1742 FREETMPS;
1743 LEAVE;
1744 return (U32) retval;
1745}
1746
1747int
1748Perl_magic_wipepack(pTHX_ SV *sv, MAGIC *mg)
1749{
1750 dVAR; dSP;
1751
1752 PERL_ARGS_ASSERT_MAGIC_WIPEPACK;
1753
1754 ENTER;
1755 PUSHSTACKi(PERLSI_MAGIC);
1756 PUSHMARK(SP);
1757 XPUSHs(SvTIED_obj(sv, mg));
1758 PUTBACK;
1759 call_method("CLEAR", G_SCALAR|G_DISCARD);
1760 POPSTACK;
1761 LEAVE;
1762
1763 return 0;
1764}
1765
1766int
1767Perl_magic_nextpack(pTHX_ SV *sv, MAGIC *mg, SV *key)
1768{
1769 dVAR; dSP;
1770 const char * const meth = SvOK(key) ? "NEXTKEY" : "FIRSTKEY";
1771
1772 PERL_ARGS_ASSERT_MAGIC_NEXTPACK;
1773
1774 ENTER;
1775 SAVETMPS;
1776 PUSHSTACKi(PERLSI_MAGIC);
1777 PUSHMARK(SP);
1778 EXTEND(SP, 2);
1779 PUSHs(SvTIED_obj(sv, mg));
1780 if (SvOK(key))
1781 PUSHs(key);
1782 PUTBACK;
1783
1784 if (call_method(meth, G_SCALAR))
1785 sv_setsv(key, *PL_stack_sp--);
1786
1787 POPSTACK;
1788 FREETMPS;
1789 LEAVE;
1790 return 0;
1791}
1792
1793int
1794Perl_magic_existspack(pTHX_ SV *sv, const MAGIC *mg)
1795{
1796 PERL_ARGS_ASSERT_MAGIC_EXISTSPACK;
1797
1798 return magic_methpack(sv,mg,"EXISTS");
1799}
1800
1801SV *
1802Perl_magic_scalarpack(pTHX_ HV *hv, MAGIC *mg)
1803{
1804 dVAR; dSP;
1805 SV *retval;
1806 SV * const tied = SvTIED_obj(MUTABLE_SV(hv), mg);
1807 HV * const pkg = SvSTASH((const SV *)SvRV(tied));
1808
1809 PERL_ARGS_ASSERT_MAGIC_SCALARPACK;
1810
1811 if (!gv_fetchmethod_autoload(pkg, "SCALAR", FALSE)) {
1812 SV *key;
1813 if (HvEITER_get(hv))
1814 /* we are in an iteration so the hash cannot be empty */
1815 return &PL_sv_yes;
1816 /* no xhv_eiter so now use FIRSTKEY */
1817 key = sv_newmortal();
1818 magic_nextpack(MUTABLE_SV(hv), mg, key);
1819 HvEITER_set(hv, NULL); /* need to reset iterator */
1820 return SvOK(key) ? &PL_sv_yes : &PL_sv_no;
1821 }
1822
1823 /* there is a SCALAR method that we can call */
1824 ENTER;
1825 PUSHSTACKi(PERLSI_MAGIC);
1826 PUSHMARK(SP);
1827 EXTEND(SP, 1);
1828 PUSHs(tied);
1829 PUTBACK;
1830
1831 if (call_method("SCALAR", G_SCALAR))
1832 retval = *PL_stack_sp--;
1833 else
1834 retval = &PL_sv_undef;
1835 POPSTACK;
1836 LEAVE;
1837 return retval;
1838}
1839
1840int
1841Perl_magic_setdbline(pTHX_ SV *sv, MAGIC *mg)
1842{
1843 dVAR;
1844 GV * const gv = PL_DBline;
1845 const I32 i = SvTRUE(sv);
1846 SV ** const svp = av_fetch(GvAV(gv),
1847 atoi(MgPV_nolen_const(mg)), FALSE);
1848
1849 PERL_ARGS_ASSERT_MAGIC_SETDBLINE;
1850
1851 if (svp && SvIOKp(*svp)) {
1852 OP * const o = INT2PTR(OP*,SvIVX(*svp));
1853 if (o) {
1854 /* set or clear breakpoint in the relevant control op */
1855 if (i)
1856 o->op_flags |= OPf_SPECIAL;
1857 else
1858 o->op_flags &= ~OPf_SPECIAL;
1859 }
1860 }
1861 return 0;
1862}
1863
1864int
1865Perl_magic_getarylen(pTHX_ SV *sv, const MAGIC *mg)
1866{
1867 dVAR;
1868 AV * const obj = MUTABLE_AV(mg->mg_obj);
1869
1870 PERL_ARGS_ASSERT_MAGIC_GETARYLEN;
1871
1872 if (obj) {
1873 sv_setiv(sv, AvFILL(obj) + CopARYBASE_get(PL_curcop));
1874 } else {
1875 SvOK_off(sv);
1876 }
1877 return 0;
1878}
1879
1880int
1881Perl_magic_setarylen(pTHX_ SV *sv, MAGIC *mg)
1882{
1883 dVAR;
1884 AV * const obj = MUTABLE_AV(mg->mg_obj);
1885
1886 PERL_ARGS_ASSERT_MAGIC_SETARYLEN;
1887
1888 if (obj) {
1889 av_fill(obj, SvIV(sv) - CopARYBASE_get(PL_curcop));
1890 } else {
1891 Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
1892 "Attempt to set length of freed array");
1893 }
1894 return 0;
1895}
1896
1897int
1898Perl_magic_freearylen_p(pTHX_ SV *sv, MAGIC *mg)
1899{
1900 dVAR;
1901
1902 PERL_ARGS_ASSERT_MAGIC_FREEARYLEN_P;
1903 PERL_UNUSED_ARG(sv);
1904
1905 /* during global destruction, mg_obj may already have been freed */
1906 if (PL_in_clean_all)
1907 return 0;
1908
1909 mg = mg_find (mg->mg_obj, PERL_MAGIC_arylen);
1910
1911 if (mg) {
1912 /* arylen scalar holds a pointer back to the array, but doesn't own a
1913 reference. Hence the we (the array) are about to go away with it
1914 still pointing at us. Clear its pointer, else it would be pointing
1915 at free memory. See the comment in sv_magic about reference loops,
1916 and why it can't own a reference to us. */
1917 mg->mg_obj = 0;
1918 }
1919 return 0;
1920}
1921
1922int
1923Perl_magic_getpos(pTHX_ SV *sv, MAGIC *mg)
1924{
1925 dVAR;
1926 SV* const lsv = LvTARG(sv);
1927
1928 PERL_ARGS_ASSERT_MAGIC_GETPOS;
1929 PERL_UNUSED_ARG(mg);
1930
1931 if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv)) {
1932 MAGIC * const found = mg_find(lsv, PERL_MAGIC_regex_global);
1933 if (found && found->mg_len >= 0) {
1934 I32 i = found->mg_len;
1935 if (DO_UTF8(lsv))
1936 sv_pos_b2u(lsv, &i);
1937 sv_setiv(sv, i + CopARYBASE_get(PL_curcop));
1938 return 0;
1939 }
1940 }
1941 SvOK_off(sv);
1942 return 0;
1943}
1944
1945int
1946Perl_magic_setpos(pTHX_ SV *sv, MAGIC *mg)
1947{
1948 dVAR;
1949 SV* const lsv = LvTARG(sv);
1950 SSize_t pos;
1951 STRLEN len;
1952 STRLEN ulen = 0;
1953 MAGIC* found;
1954
1955 PERL_ARGS_ASSERT_MAGIC_SETPOS;
1956 PERL_UNUSED_ARG(mg);
1957
1958 if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv))
1959 found = mg_find(lsv, PERL_MAGIC_regex_global);
1960 else
1961 found = NULL;
1962 if (!found) {
1963 if (!SvOK(sv))
1964 return 0;
1965#ifdef PERL_OLD_COPY_ON_WRITE
1966 if (SvIsCOW(lsv))
1967 sv_force_normal_flags(lsv, 0);
1968#endif
1969 found = sv_magicext(lsv, NULL, PERL_MAGIC_regex_global, &PL_vtbl_mglob,
1970 NULL, 0);
1971 }
1972 else if (!SvOK(sv)) {
1973 found->mg_len = -1;
1974 return 0;
1975 }
1976 len = SvPOK(lsv) ? SvCUR(lsv) : sv_len(lsv);
1977
1978 pos = SvIV(sv) - CopARYBASE_get(PL_curcop);
1979
1980 if (DO_UTF8(lsv)) {
1981 ulen = sv_len_utf8(lsv);
1982 if (ulen)
1983 len = ulen;
1984 }
1985
1986 if (pos < 0) {
1987 pos += len;
1988 if (pos < 0)
1989 pos = 0;
1990 }
1991 else if (pos > (SSize_t)len)
1992 pos = len;
1993
1994 if (ulen) {
1995 I32 p = pos;
1996 sv_pos_u2b(lsv, &p, 0);
1997 pos = p;
1998 }
1999
2000 found->mg_len = pos;
2001 found->mg_flags &= ~MGf_MINMATCH;
2002
2003 return 0;
2004}
2005
2006int
2007Perl_magic_getsubstr(pTHX_ SV *sv, MAGIC *mg)
2008{
2009 STRLEN len;
2010 SV * const lsv = LvTARG(sv);
2011 const char * const tmps = SvPV_const(lsv,len);
2012 STRLEN offs = LvTARGOFF(sv);
2013 STRLEN rem = LvTARGLEN(sv);
2014
2015 PERL_ARGS_ASSERT_MAGIC_GETSUBSTR;
2016 PERL_UNUSED_ARG(mg);
2017
2018 if (SvUTF8(lsv))
2019 offs = sv_pos_u2b_flags(lsv, offs, &rem, SV_CONST_RETURN);
2020 if (offs > len)
2021 offs = len;
2022 if (rem > len - offs)
2023 rem = len - offs;
2024 sv_setpvn(sv, tmps + offs, rem);
2025 if (SvUTF8(lsv))
2026 SvUTF8_on(sv);
2027 return 0;
2028}
2029
2030int
2031Perl_magic_setsubstr(pTHX_ SV *sv, MAGIC *mg)
2032{
2033 dVAR;
2034 STRLEN len;
2035 const char * const tmps = SvPV_const(sv, len);
2036 SV * const lsv = LvTARG(sv);
2037 STRLEN lvoff = LvTARGOFF(sv);
2038 STRLEN lvlen = LvTARGLEN(sv);
2039
2040 PERL_ARGS_ASSERT_MAGIC_SETSUBSTR;
2041 PERL_UNUSED_ARG(mg);
2042
2043 if (DO_UTF8(sv)) {
2044 sv_utf8_upgrade(lsv);
2045 lvoff = sv_pos_u2b_flags(lsv, lvoff, &lvlen, SV_CONST_RETURN);
2046 sv_insert(lsv, lvoff, lvlen, tmps, len);
2047 LvTARGLEN(sv) = sv_len_utf8(sv);
2048 SvUTF8_on(lsv);
2049 }
2050 else if (lsv && SvUTF8(lsv)) {
2051 const char *utf8;
2052 lvoff = sv_pos_u2b_flags(lsv, lvoff, &lvlen, SV_CONST_RETURN);
2053 LvTARGLEN(sv) = len;
2054 utf8 = (char*)bytes_to_utf8((U8*)tmps, &len);
2055 sv_insert(lsv, lvoff, lvlen, utf8, len);
2056 Safefree(utf8);
2057 }
2058 else {
2059 sv_insert(lsv, lvoff, lvlen, tmps, len);
2060 LvTARGLEN(sv) = len;
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 */