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