This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Remove full stop in the 'try' feature heading
[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 Magic
20"Magic" is special data attached to SV structures in order to give them
21"magical" properties. When any Perl code tries to read from, or assign to,
22an SV marked as magical, it calls the 'get' or 'set' function associated
23with that SV's magic. A get is called prior to reading an SV, in order to
24give it a chance to update its internal value (get on $. writes the line
25number of the last read filehandle into the SV's IV slot), while
26set is called after an SV has been written to, in order to allow it to make
27use of its changed value (set on $/ copies the SV's new value to the
28PL_rs global variable).
29
30Magic is implemented as a linked list of MAGIC structures attached to the
31SV. Each MAGIC struct holds the type of the magic, a pointer to an array
32of functions that implement the get(), set(), length() etc functions,
33plus space for some flags and pointers. For example, a tied variable has
34a MAGIC structure that contains a pointer to the object associated with the
35tie.
36
37=for apidoc Ayh||MAGIC
38
39=cut
40
41*/
42
43#include "EXTERN.h"
44#define PERL_IN_MG_C
45#include "perl.h"
46#include "feature.h"
47
48#if defined(HAS_GETGROUPS) || defined(HAS_SETGROUPS)
49# ifdef I_GRP
50# include <grp.h>
51# endif
52#endif
53
54#if defined(HAS_SETGROUPS)
55# ifndef NGROUPS
56# define NGROUPS 32
57# endif
58#endif
59
60#ifdef __hpux
61# include <sys/pstat.h>
62#endif
63
64#ifdef HAS_PRCTL_SET_NAME
65# include <sys/prctl.h>
66#endif
67
68#ifdef __Lynx__
69/* Missing protos on LynxOS */
70void setruid(uid_t id);
71void seteuid(uid_t id);
72void setrgid(uid_t id);
73void setegid(uid_t id);
74#endif
75
76/*
77 * Pre-magic setup and post-magic takedown.
78 * Use the "DESTRUCTOR" scope cleanup to reinstate magic.
79 */
80
81struct magic_state {
82 SV* mgs_sv;
83 I32 mgs_ss_ix;
84 U32 mgs_flags;
85 bool mgs_bumped;
86};
87/* MGS is typedef'ed to struct magic_state in perl.h */
88
89STATIC void
90S_save_magic_flags(pTHX_ SSize_t mgs_ix, SV *sv, U32 flags)
91{
92 MGS* mgs;
93 bool bumped = FALSE;
94
95 PERL_ARGS_ASSERT_SAVE_MAGIC_FLAGS;
96
97 assert(SvMAGICAL(sv));
98
99 /* we shouldn't really be called here with RC==0, but it can sometimes
100 * happen via mg_clear() (which also shouldn't be called when RC==0,
101 * but it can happen). Handle this case gracefully(ish) by not RC++
102 * and thus avoiding the resultant double free */
103 if (SvREFCNT(sv) > 0) {
104 /* guard against sv getting freed midway through the mg clearing,
105 * by holding a private reference for the duration. */
106 SvREFCNT_inc_simple_void_NN(sv);
107 bumped = TRUE;
108 }
109
110 SAVEDESTRUCTOR_X(S_restore_magic, INT2PTR(void*, (IV)mgs_ix));
111
112 mgs = SSPTR(mgs_ix, MGS*);
113 mgs->mgs_sv = sv;
114 mgs->mgs_flags = SvMAGICAL(sv) | SvREADONLY(sv);
115 mgs->mgs_ss_ix = PL_savestack_ix; /* points after the saved destructor */
116 mgs->mgs_bumped = bumped;
117
118 SvFLAGS(sv) &= ~flags;
119 SvREADONLY_off(sv);
120}
121
122#define save_magic(a,b) save_magic_flags(a,b,SVs_GMG|SVs_SMG|SVs_RMG)
123
124/*
125=for apidoc mg_magical
126
127Turns on the magical status of an SV. See C<L</sv_magic>>.
128
129=cut
130*/
131
132void
133Perl_mg_magical(SV *sv)
134{
135 const MAGIC* mg;
136 PERL_ARGS_ASSERT_MG_MAGICAL;
137
138 SvMAGICAL_off(sv);
139 if ((mg = SvMAGIC(sv))) {
140 do {
141 const MGVTBL* const vtbl = mg->mg_virtual;
142 if (vtbl) {
143 if (vtbl->svt_get && !(mg->mg_flags & MGf_GSKIP))
144 SvGMAGICAL_on(sv);
145 if (vtbl->svt_set)
146 SvSMAGICAL_on(sv);
147 if (vtbl->svt_clear)
148 SvRMAGICAL_on(sv);
149 }
150 } while ((mg = mg->mg_moremagic));
151 if (!(SvFLAGS(sv) & (SVs_GMG|SVs_SMG)))
152 SvRMAGICAL_on(sv);
153 }
154}
155
156/*
157=for apidoc mg_get
158
159Do magic before a value is retrieved from the SV. The type of SV must
160be >= C<SVt_PVMG>. See C<L</sv_magic>>.
161
162=cut
163*/
164
165int
166Perl_mg_get(pTHX_ SV *sv)
167{
168 const SSize_t mgs_ix = SSNEW(sizeof(MGS));
169 bool saved = FALSE;
170 bool have_new = 0;
171 bool taint_only = TRUE; /* the only get method seen is taint */
172 MAGIC *newmg, *head, *cur, *mg;
173
174 PERL_ARGS_ASSERT_MG_GET;
175
176 if (PL_localizing == 1 && sv == DEFSV) return 0;
177
178 /* We must call svt_get(sv, mg) for each valid entry in the linked
179 list of magic. svt_get() may delete the current entry, add new
180 magic to the head of the list, or upgrade the SV. AMS 20010810 */
181
182 newmg = cur = head = mg = SvMAGIC(sv);
183 while (mg) {
184 const MGVTBL * const vtbl = mg->mg_virtual;
185 MAGIC * const nextmg = mg->mg_moremagic; /* it may delete itself */
186
187 if (!(mg->mg_flags & MGf_GSKIP) && vtbl && vtbl->svt_get) {
188
189 /* taint's mg get is so dumb it doesn't need flag saving */
190 if (mg->mg_type != PERL_MAGIC_taint) {
191 taint_only = FALSE;
192 if (!saved) {
193 save_magic(mgs_ix, sv);
194 saved = TRUE;
195 }
196 }
197
198 vtbl->svt_get(aTHX_ sv, mg);
199
200 /* guard against magic having been deleted - eg FETCH calling
201 * untie */
202 if (!SvMAGIC(sv)) {
203 /* recalculate flags */
204 (SSPTR(mgs_ix, MGS *))->mgs_flags &= ~(SVs_GMG|SVs_SMG|SVs_RMG);
205 break;
206 }
207
208 /* recalculate flags if this entry was deleted. */
209 if (mg->mg_flags & MGf_GSKIP)
210 (SSPTR(mgs_ix, MGS *))->mgs_flags &=
211 ~(SVs_GMG|SVs_SMG|SVs_RMG);
212 }
213 else if (vtbl == &PL_vtbl_utf8) {
214 /* get-magic can reallocate the PV, unless there's only taint
215 * magic */
216 if (taint_only) {
217 MAGIC *mg2;
218 for (mg2 = nextmg; mg2; mg2 = mg2->mg_moremagic) {
219 if ( mg2->mg_type != PERL_MAGIC_taint
220 && !(mg2->mg_flags & MGf_GSKIP)
221 && mg2->mg_virtual
222 && mg2->mg_virtual->svt_get
223 ) {
224 taint_only = FALSE;
225 break;
226 }
227 }
228 }
229 if (!taint_only)
230 magic_setutf8(sv, mg);
231 }
232
233 mg = nextmg;
234
235 if (have_new) {
236 /* Have we finished with the new entries we saw? Start again
237 where we left off (unless there are more new entries). */
238 if (mg == head) {
239 have_new = 0;
240 mg = cur;
241 head = newmg;
242 }
243 }
244
245 /* Were any new entries added? */
246 if (!have_new && (newmg = SvMAGIC(sv)) != head) {
247 have_new = 1;
248 cur = mg;
249 mg = newmg;
250 /* recalculate flags */
251 (SSPTR(mgs_ix, MGS *))->mgs_flags &= ~(SVs_GMG|SVs_SMG|SVs_RMG);
252 }
253 }
254
255 if (saved)
256 restore_magic(INT2PTR(void *, (IV)mgs_ix));
257
258 return 0;
259}
260
261/*
262=for apidoc mg_set
263
264Do magic after a value is assigned to the SV. See C<L</sv_magic>>.
265
266=cut
267*/
268
269int
270Perl_mg_set(pTHX_ SV *sv)
271{
272 const SSize_t mgs_ix = SSNEW(sizeof(MGS));
273 MAGIC* mg;
274 MAGIC* nextmg;
275
276 PERL_ARGS_ASSERT_MG_SET;
277
278 if (PL_localizing == 2 && sv == DEFSV) return 0;
279
280 save_magic_flags(mgs_ix, sv, SVs_GMG|SVs_SMG); /* leave SVs_RMG on */
281
282 for (mg = SvMAGIC(sv); mg; mg = nextmg) {
283 const MGVTBL* vtbl = mg->mg_virtual;
284 nextmg = mg->mg_moremagic; /* it may delete itself */
285 if (mg->mg_flags & MGf_GSKIP) {
286 mg->mg_flags &= ~MGf_GSKIP; /* setting requires another read */
287 (SSPTR(mgs_ix, MGS*))->mgs_flags &= ~(SVs_GMG|SVs_SMG|SVs_RMG);
288 }
289 if (PL_localizing == 2
290 && PERL_MAGIC_TYPE_IS_VALUE_MAGIC(mg->mg_type))
291 continue;
292 if (vtbl && vtbl->svt_set)
293 vtbl->svt_set(aTHX_ sv, mg);
294 }
295
296 restore_magic(INT2PTR(void*, (IV)mgs_ix));
297 return 0;
298}
299
300I32
301Perl_mg_size(pTHX_ SV *sv)
302{
303 MAGIC* mg;
304
305 PERL_ARGS_ASSERT_MG_SIZE;
306
307 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
308 const MGVTBL* const vtbl = mg->mg_virtual;
309 if (vtbl && vtbl->svt_len) {
310 const SSize_t mgs_ix = SSNEW(sizeof(MGS));
311 I32 len;
312 save_magic(mgs_ix, sv);
313 /* omit MGf_GSKIP -- not changed here */
314 len = vtbl->svt_len(aTHX_ sv, mg);
315 restore_magic(INT2PTR(void*, (IV)mgs_ix));
316 return len;
317 }
318 }
319
320 switch(SvTYPE(sv)) {
321 case SVt_PVAV:
322 return AvFILLp((const AV *) sv); /* Fallback to non-tied array */
323 case SVt_PVHV:
324 /* FIXME */
325 default:
326 Perl_croak(aTHX_ "Size magic not implemented");
327
328 }
329 NOT_REACHED; /* NOTREACHED */
330}
331
332/*
333=for apidoc mg_clear
334
335Clear something magical that the SV represents. See C<L</sv_magic>>.
336
337=cut
338*/
339
340int
341Perl_mg_clear(pTHX_ SV *sv)
342{
343 const SSize_t mgs_ix = SSNEW(sizeof(MGS));
344 MAGIC* mg;
345 MAGIC *nextmg;
346
347 PERL_ARGS_ASSERT_MG_CLEAR;
348
349 save_magic(mgs_ix, sv);
350
351 for (mg = SvMAGIC(sv); mg; mg = nextmg) {
352 const MGVTBL* const vtbl = mg->mg_virtual;
353 /* omit GSKIP -- never set here */
354
355 nextmg = mg->mg_moremagic; /* it may delete itself */
356
357 if (vtbl && vtbl->svt_clear)
358 vtbl->svt_clear(aTHX_ sv, mg);
359 }
360
361 restore_magic(INT2PTR(void*, (IV)mgs_ix));
362 return 0;
363}
364
365static MAGIC*
366S_mg_findext_flags(const SV *sv, int type, const MGVTBL *vtbl, U32 flags)
367{
368 assert(flags <= 1);
369
370 if (sv) {
371 MAGIC *mg;
372
373 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
374 if (mg->mg_type == type && (!flags || mg->mg_virtual == vtbl)) {
375 return mg;
376 }
377 }
378 }
379
380 return NULL;
381}
382
383/*
384=for apidoc mg_find
385
386Finds the magic pointer for C<type> matching the SV. See C<L</sv_magic>>.
387
388=cut
389*/
390
391MAGIC*
392Perl_mg_find(const SV *sv, int type)
393{
394 return S_mg_findext_flags(sv, type, NULL, 0);
395}
396
397/*
398=for apidoc mg_findext
399
400Finds the magic pointer of C<type> with the given C<vtbl> for the C<SV>. See
401C<L</sv_magicext>>.
402
403=cut
404*/
405
406MAGIC*
407Perl_mg_findext(const SV *sv, int type, const MGVTBL *vtbl)
408{
409 return S_mg_findext_flags(sv, type, vtbl, 1);
410}
411
412MAGIC *
413Perl_mg_find_mglob(pTHX_ SV *sv)
414{
415 PERL_ARGS_ASSERT_MG_FIND_MGLOB;
416 if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y') {
417 /* This sv is only a delegate. //g magic must be attached to
418 its target. */
419 vivify_defelem(sv);
420 sv = LvTARG(sv);
421 }
422 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
423 return S_mg_findext_flags(sv, PERL_MAGIC_regex_global, 0, 0);
424 return NULL;
425}
426
427/*
428=for apidoc mg_copy
429
430Copies the magic from one SV to another. See C<L</sv_magic>>.
431
432=cut
433*/
434
435int
436Perl_mg_copy(pTHX_ SV *sv, SV *nsv, const char *key, I32 klen)
437{
438 int count = 0;
439 MAGIC* mg;
440
441 PERL_ARGS_ASSERT_MG_COPY;
442
443 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
444 const MGVTBL* const vtbl = mg->mg_virtual;
445 if ((mg->mg_flags & MGf_COPY) && vtbl->svt_copy){
446 count += vtbl->svt_copy(aTHX_ sv, mg, nsv, key, klen);
447 }
448 else {
449 const char type = mg->mg_type;
450 if (isUPPER(type) && type != PERL_MAGIC_uvar) {
451 sv_magic(nsv,
452 (type == PERL_MAGIC_tied)
453 ? SvTIED_obj(sv, mg)
454 : mg->mg_obj,
455 toLOWER(type), key, klen);
456 count++;
457 }
458 }
459 }
460 return count;
461}
462
463/*
464=for apidoc mg_localize
465
466Copy some of the magic from an existing SV to new localized version of that
467SV. Container magic (I<e.g.>, C<%ENV>, C<$1>, C<tie>)
468gets copied, value magic doesn't (I<e.g.>,
469C<taint>, C<pos>).
470
471If C<setmagic> is false then no set magic will be called on the new (empty) SV.
472This typically means that assignment will soon follow (e.g. S<C<'local $x = $y'>>),
473and that will handle the magic.
474
475=cut
476*/
477
478void
479Perl_mg_localize(pTHX_ SV *sv, SV *nsv, bool setmagic)
480{
481 MAGIC *mg;
482
483 PERL_ARGS_ASSERT_MG_LOCALIZE;
484
485 if (nsv == DEFSV)
486 return;
487
488 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
489 const MGVTBL* const vtbl = mg->mg_virtual;
490 if (PERL_MAGIC_TYPE_IS_VALUE_MAGIC(mg->mg_type))
491 continue;
492
493 if ((mg->mg_flags & MGf_LOCAL) && vtbl->svt_local)
494 (void)vtbl->svt_local(aTHX_ nsv, mg);
495 else
496 sv_magicext(nsv, mg->mg_obj, mg->mg_type, vtbl,
497 mg->mg_ptr, mg->mg_len);
498
499 /* container types should remain read-only across localization */
500 SvFLAGS(nsv) |= SvREADONLY(sv);
501 }
502
503 if (SvTYPE(nsv) >= SVt_PVMG && SvMAGIC(nsv)) {
504 SvFLAGS(nsv) |= SvMAGICAL(sv);
505 if (setmagic) {
506 PL_localizing = 1;
507 SvSETMAGIC(nsv);
508 PL_localizing = 0;
509 }
510 }
511}
512
513#define mg_free_struct(sv, mg) S_mg_free_struct(aTHX_ sv, mg)
514static void
515S_mg_free_struct(pTHX_ SV *sv, MAGIC *mg)
516{
517 const MGVTBL* const vtbl = mg->mg_virtual;
518 if (vtbl && vtbl->svt_free)
519 vtbl->svt_free(aTHX_ sv, mg);
520
521 if (mg->mg_len > 0)
522 Safefree(mg->mg_ptr);
523 else if (mg->mg_len == HEf_SVKEY)
524 SvREFCNT_dec(MUTABLE_SV(mg->mg_ptr));
525
526 if (mg->mg_flags & MGf_REFCOUNTED)
527 SvREFCNT_dec(mg->mg_obj);
528 Safefree(mg);
529}
530
531/*
532=for apidoc mg_free
533
534Free any magic storage used by the SV. See C<L</sv_magic>>.
535
536=cut
537*/
538
539int
540Perl_mg_free(pTHX_ SV *sv)
541{
542 MAGIC* mg;
543 MAGIC* moremagic;
544
545 PERL_ARGS_ASSERT_MG_FREE;
546
547 for (mg = SvMAGIC(sv); mg; mg = moremagic) {
548 moremagic = mg->mg_moremagic;
549 mg_free_struct(sv, mg);
550 SvMAGIC_set(sv, moremagic);
551 }
552 SvMAGIC_set(sv, NULL);
553 SvMAGICAL_off(sv);
554 return 0;
555}
556
557/*
558=for apidoc mg_free_type
559
560Remove any magic of type C<how> from the SV C<sv>. See L</sv_magic>.
561
562=cut
563*/
564
565void
566Perl_mg_free_type(pTHX_ SV *sv, int how)
567{
568 MAGIC *mg, *prevmg, *moremg;
569 PERL_ARGS_ASSERT_MG_FREE_TYPE;
570 for (prevmg = NULL, mg = SvMAGIC(sv); mg; prevmg = mg, mg = moremg) {
571 moremg = mg->mg_moremagic;
572 if (mg->mg_type == how) {
573 MAGIC *newhead;
574 /* temporarily move to the head of the magic chain, in case
575 custom free code relies on this historical aspect of mg_free */
576 if (prevmg) {
577 prevmg->mg_moremagic = moremg;
578 mg->mg_moremagic = SvMAGIC(sv);
579 SvMAGIC_set(sv, mg);
580 }
581 newhead = mg->mg_moremagic;
582 mg_free_struct(sv, mg);
583 SvMAGIC_set(sv, newhead);
584 mg = prevmg;
585 }
586 }
587 mg_magical(sv);
588}
589
590/*
591=for apidoc mg_freeext
592
593Remove any magic of type C<how> using virtual table C<vtbl> from the
594SV C<sv>. See L</sv_magic>.
595
596C<mg_freeext(sv, how, NULL)> is equivalent to C<mg_free_type(sv, how)>.
597
598=cut
599*/
600
601void
602Perl_mg_freeext(pTHX_ SV *sv, int how, const MGVTBL *vtbl)
603{
604 MAGIC *mg, *prevmg, *moremg;
605 PERL_ARGS_ASSERT_MG_FREEEXT;
606 for (prevmg = NULL, mg = SvMAGIC(sv); mg; prevmg = mg, mg = moremg) {
607 MAGIC *newhead;
608 moremg = mg->mg_moremagic;
609 if (mg->mg_type == how && (vtbl == NULL || mg->mg_virtual == vtbl)) {
610 /* temporarily move to the head of the magic chain, in case
611 custom free code relies on this historical aspect of mg_free */
612 if (prevmg) {
613 prevmg->mg_moremagic = moremg;
614 mg->mg_moremagic = SvMAGIC(sv);
615 SvMAGIC_set(sv, mg);
616 }
617 newhead = mg->mg_moremagic;
618 mg_free_struct(sv, mg);
619 SvMAGIC_set(sv, newhead);
620 mg = prevmg;
621 }
622 }
623 mg_magical(sv);
624}
625
626#include <signal.h>
627
628U32
629Perl_magic_regdata_cnt(pTHX_ SV *sv, MAGIC *mg)
630{
631 PERL_UNUSED_ARG(sv);
632
633 PERL_ARGS_ASSERT_MAGIC_REGDATA_CNT;
634
635 if (PL_curpm) {
636 REGEXP * const rx = PM_GETRE(PL_curpm);
637 if (rx) {
638 const SSize_t n = (SSize_t)mg->mg_obj;
639 if (n == '+') { /* @+ */
640 /* return the number possible */
641 return RX_LOGICAL_NPARENS(rx);
642 } else { /* @- @^CAPTURE @{^CAPTURE} */
643 I32 paren = RX_LASTPAREN(rx);
644
645 /* return the last filled */
646 while ( paren >= 0 && !RX_OFFS_VALID(rx,paren) )
647 paren--;
648 if (paren && RX_PARNO_TO_LOGICAL(rx))
649 paren = RX_PARNO_TO_LOGICAL(rx)[paren];
650 if (n == '-') {
651 /* @- */
652 return (U32)paren;
653 } else {
654 /* @^CAPTURE @{^CAPTURE} */
655 return paren >= 0 ? (U32)(paren-1) : (U32)-1;
656 }
657 }
658 }
659 }
660
661 return (U32)-1;
662}
663
664/* @-, @+ */
665
666int
667Perl_magic_regdatum_get(pTHX_ SV *sv, MAGIC *mg)
668{
669 PERL_ARGS_ASSERT_MAGIC_REGDATUM_GET;
670 REGEXP * const rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
671
672 if (rx) {
673 const SSize_t n = (SSize_t)mg->mg_obj;
674 /* @{^CAPTURE} does not contain $&, so we need to increment by 1 */
675 const I32 paren = mg->mg_len
676 + (n == '\003' ? 1 : 0);
677 SSize_t s;
678 SSize_t t;
679 if (paren < 0)
680 return 0;
681 if (n != '+' && n != '-') {
682 CALLREG_NUMBUF_FETCH(rx,paren,sv);
683 return 0;
684 }
685 if (paren <= (I32)RX_LOGICAL_NPARENS(rx)) {
686 I32 true_paren = RX_LOGICAL_TO_PARNO(rx)
687 ? RX_LOGICAL_TO_PARNO(rx)[paren]
688 : paren;
689 do {
690 if (((s = RX_OFFS_START(rx,true_paren)) != -1) &&
691 ((t = RX_OFFS_END(rx,true_paren)) != -1))
692 {
693 SSize_t i;
694
695 if (n == '+') /* @+ */
696 i = t;
697 else if (n == '-') /* @- */
698 i = s;
699
700 if (RX_MATCH_UTF8(rx)) {
701 const char * const b = RX_SUBBEG(rx);
702 if (b)
703 i = RX_SUBCOFFSET(rx) +
704 utf8_length((U8*)b,
705 (U8*)(b-RX_SUBOFFSET(rx)+i));
706 }
707
708 sv_setuv(sv, i);
709 return 0;
710 }
711 if (RX_PARNO_TO_LOGICAL_NEXT(rx))
712 true_paren = RX_PARNO_TO_LOGICAL_NEXT(rx)[true_paren];
713 else
714 break;
715 } while (true_paren);
716 }
717 }
718 sv_set_undef(sv);
719 return 0;
720}
721
722/* @-, @+ */
723
724int
725Perl_magic_regdatum_set(pTHX_ SV *sv, MAGIC *mg)
726{
727 PERL_ARGS_ASSERT_MAGIC_REGDATUM_SET;
728 PERL_UNUSED_CONTEXT;
729 PERL_UNUSED_ARG(sv);
730 PERL_UNUSED_ARG(mg);
731 Perl_croak_no_modify();
732 NORETURN_FUNCTION_END;
733}
734
735#define SvRTRIM(sv) STMT_START { \
736 SV * sv_ = sv; \
737 if (SvPOK(sv_)) { \
738 STRLEN len = SvCUR(sv_); \
739 char * const p = SvPVX(sv_); \
740 while (len > 0 && isSPACE(p[len-1])) \
741 --len; \
742 SvCUR_set(sv_, len); \
743 p[len] = '\0'; \
744 } \
745} STMT_END
746
747void
748Perl_emulate_cop_io(pTHX_ const COP *const c, SV *const sv)
749{
750 PERL_ARGS_ASSERT_EMULATE_COP_IO;
751
752 if (!(CopHINTS_get(c) & (HINT_LEXICAL_IO_IN|HINT_LEXICAL_IO_OUT)))
753 sv_set_undef(sv);
754 else {
755 SvPVCLEAR(sv);
756 SvUTF8_off(sv);
757 if ((CopHINTS_get(c) & HINT_LEXICAL_IO_IN)) {
758 SV *const value = cop_hints_fetch_pvs(c, "open<", 0);
759 assert(value);
760 sv_catsv(sv, value);
761 }
762 sv_catpvs(sv, "\0");
763 if ((CopHINTS_get(c) & HINT_LEXICAL_IO_OUT)) {
764 SV *const value = cop_hints_fetch_pvs(c, "open>", 0);
765 assert(value);
766 sv_catsv(sv, value);
767 }
768 }
769}
770
771STATIC void
772S_fixup_errno_string(pTHX_ SV* sv)
773{
774 /* Do what is necessary to fixup the non-empty string in 'sv' for return to
775 * Perl space. */
776
777 PERL_ARGS_ASSERT_FIXUP_ERRNO_STRING;
778
779 assert(SvOK(sv));
780
781 if(strEQ(SvPVX(sv), "")) {
782 sv_catpv(sv, UNKNOWN_ERRNO_MSG);
783 }
784}
785
786/*
787=for apidoc_section $errno
788=for apidoc sv_string_from_errnum
789
790Generates the message string describing an OS error and returns it as
791an SV. C<errnum> must be a value that C<errno> could take, identifying
792the type of error.
793
794If C<tgtsv> is non-null then the string will be written into that SV
795(overwriting existing content) and it will be returned. If C<tgtsv>
796is a null pointer then the string will be written into a new mortal SV
797which will be returned.
798
799The message will be taken from whatever locale would be used by C<$!>,
800and will be encoded in the SV in whatever manner would be used by C<$!>.
801The details of this process are subject to future change. Currently,
802the message is taken from the C locale by default (usually producing an
803English message), and from the currently selected locale when in the scope
804of the C<use locale> pragma. A heuristic attempt is made to decode the
805message from the locale's character encoding, but it will only be decoded
806as either UTF-8 or ISO-8859-1. It is always correctly decoded in a UTF-8
807locale, usually in an ISO-8859-1 locale, and never in any other locale.
808
809The SV is always returned containing an actual string, and with no other
810OK bits set. Unlike C<$!>, a message is even yielded for C<errnum> zero
811(meaning success), and if no useful message is available then a useless
812string (currently empty) is returned.
813
814=cut
815*/
816
817SV *
818Perl_sv_string_from_errnum(pTHX_ int errnum, SV *tgtsv)
819{
820 char const *errstr;
821 utf8ness_t utf8ness;
822
823 if(!tgtsv)
824 tgtsv = newSV_type_mortal(SVt_PV);
825 errstr = my_strerror(errnum, &utf8ness);
826 if(errstr) {
827 sv_setpv(tgtsv, errstr);
828 if (utf8ness == UTF8NESS_YES) {
829 SvUTF8_on(tgtsv);
830 }
831 fixup_errno_string(tgtsv);
832 } else {
833 SvPVCLEAR(tgtsv);
834 }
835 return tgtsv;
836}
837
838#ifdef VMS
839#include <descrip.h>
840#include <starlet.h>
841#endif
842
843int
844Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
845{
846 I32 paren;
847 const char *s = NULL;
848 REGEXP *rx;
849 char nextchar;
850
851 PERL_ARGS_ASSERT_MAGIC_GET;
852
853 const char * const remaining = (mg->mg_ptr)
854 ? mg->mg_ptr + 1
855 : NULL;
856
857 if (!mg->mg_ptr) {
858 paren = mg->mg_len;
859 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
860 do_numbuf_fetch:
861 CALLREG_NUMBUF_FETCH(rx,paren,sv);
862 }
863 else
864 goto set_undef;
865 return 0;
866 }
867
868 nextchar = *remaining;
869 switch (*mg->mg_ptr) {
870 case '\001': /* ^A */
871 if (SvOK(PL_bodytarget)) sv_copypv(sv, PL_bodytarget);
872 else
873 sv_set_undef(sv);
874 if (SvTAINTED(PL_bodytarget))
875 SvTAINTED_on(sv);
876 break;
877 case '\003': /* ^C, ^CHILD_ERROR_NATIVE */
878 if (nextchar == '\0') {
879 sv_setiv(sv, (IV)PL_minus_c);
880 }
881 else if (strEQ(remaining, "HILD_ERROR_NATIVE")) {
882 sv_setiv(sv, (IV)STATUS_NATIVE);
883 }
884 break;
885
886 case '\004': /* ^D */
887 sv_setiv(sv, (IV)(PL_debug & DEBUG_MASK));
888 break;
889 case '\005': /* ^E */
890 if (nextchar != '\0') {
891 if (strEQ(remaining, "NCODING"))
892 sv_set_undef(sv);
893 break;
894 }
895
896#if defined(VMS) || defined(OS2) || defined(WIN32)
897# if defined(VMS)
898 {
899 char msg[255];
900 $DESCRIPTOR(msgdsc,msg);
901 sv_setnv(sv,(NV) vaxc$errno);
902 if (sys$getmsg(vaxc$errno,&msgdsc.dsc$w_length,&msgdsc,0,0) & 1)
903 sv_setpvn(sv,msgdsc.dsc$a_pointer,msgdsc.dsc$w_length);
904 else
905 SvPVCLEAR(sv);
906 }
907#elif defined(OS2)
908 if (!(_emx_env & 0x200)) { /* Under DOS */
909 sv_setnv(sv, (NV)errno);
910 if (errno) {
911 utf8ness_t utf8ness;
912 const char * errstr = my_strerror(errnum, &utf8ness);
913
914 sv_setpv(sv, errstr);
915
916 if (utf8ness == UTF8NESS_YES) {
917 SvUTF8_on(sv);
918 }
919 }
920 else {
921 SvPVCLEAR(sv);
922 }
923 } else {
924 if (errno != errno_isOS2) {
925 const int tmp = _syserrno();
926 if (tmp) /* 2nd call to _syserrno() makes it 0 */
927 Perl_rc = tmp;
928 }
929 sv_setnv(sv, (NV)Perl_rc);
930 sv_setpv(sv, os2error(Perl_rc));
931 }
932 if (SvOK(sv) && strNE(SvPVX(sv), "")) {
933 fixup_errno_string(sv);
934 }
935# elif defined(WIN32)
936 {
937 const DWORD dwErr = GetLastError();
938 sv_setnv(sv, (NV)dwErr);
939 if (dwErr) {
940 PerlProc_GetOSError(sv, dwErr);
941 fixup_errno_string(sv);
942
943# ifdef USE_LOCALE
944 if ( IN_LOCALE
945 && get_win32_message_utf8ness(SvPV_nomg_const_nolen(sv)))
946 {
947 SvUTF8_on(sv);
948 }
949# endif
950 }
951 else
952 SvPVCLEAR(sv);
953 SetLastError(dwErr);
954 }
955# else
956# error Missing code for platform
957# endif
958 SvRTRIM(sv);
959 SvNOK_on(sv); /* what a wonderful hack! */
960 break;
961#endif /* End of platforms with special handling for $^E; others just fall
962 through to $! */
963 /* FALLTHROUGH */
964
965 case '!':
966 {
967 dSAVE_ERRNO;
968#ifdef VMS
969 sv_setnv(sv, (NV)((errno == EVMSERR) ? vaxc$errno : errno));
970#else
971 sv_setnv(sv, (NV)errno);
972#endif
973#ifdef OS2
974 if (errno == errno_isOS2 || errno == errno_isOS2_set)
975 sv_setpv(sv, os2error(Perl_rc));
976 else
977#endif
978 if (! errno) {
979 SvPVCLEAR(sv);
980 }
981 else {
982 sv_string_from_errnum(errno, sv);
983 /* If no useful string is available, don't
984 * claim to have a string part. The SvNOK_on()
985 * below will cause just the number part to be valid */
986 if (!SvCUR(sv))
987 SvPOK_off(sv);
988 }
989 RESTORE_ERRNO;
990 }
991
992 SvRTRIM(sv);
993 SvNOK_on(sv); /* what a wonderful hack! */
994 break;
995
996 case '\006': /* ^F */
997 if (nextchar == '\0') {
998 sv_setiv(sv, (IV)PL_maxsysfd);
999 }
1000 break;
1001 case '\007': /* ^GLOBAL_PHASE */
1002 if (strEQ(remaining, "LOBAL_PHASE")) {
1003 sv_setpvn(sv, PL_phase_names[PL_phase],
1004 strlen(PL_phase_names[PL_phase]));
1005 }
1006 break;
1007 case '\010': /* ^H */
1008 sv_setuv(sv, PL_hints);
1009 break;
1010 case '\011': /* ^I */ /* NOT \t in EBCDIC */
1011 sv_setpv(sv, PL_inplace); /* Will undefine sv if PL_inplace is NULL */
1012 break;
1013 case '\014': /* ^LAST_FH */
1014 if (strEQ(remaining, "AST_FH")) {
1015 if (PL_last_in_gv && (SV*)PL_last_in_gv != &PL_sv_undef) {
1016 assert(isGV_with_GP(PL_last_in_gv));
1017 sv_setrv_inc(sv, MUTABLE_SV(PL_last_in_gv));
1018 sv_rvweaken(sv);
1019 }
1020 else
1021 sv_set_undef(sv);
1022 }
1023 break;
1024 case '\017': /* ^O & ^OPEN */
1025 if (nextchar == '\0') {
1026 sv_setpv(sv, PL_osname);
1027 SvTAINTED_off(sv);
1028 }
1029 else if (strEQ(remaining, "PEN")) {
1030 Perl_emulate_cop_io(aTHX_ &PL_compiling, sv);
1031 }
1032 break;
1033 case '\020':
1034 sv_setiv(sv, (IV)PL_perldb);
1035 break;
1036 case '\023': /* ^S */
1037 if (nextchar == '\0') {
1038 if (PL_parser && PL_parser->lex_state != LEX_NOTPARSING)
1039 SvOK_off(sv);
1040 else if (PL_in_eval)
1041 sv_setiv(sv, PL_in_eval & ~(EVAL_INREQUIRE));
1042 else
1043 sv_setiv(sv, 0);
1044 }
1045 else if (strEQ(remaining, "AFE_LOCALES")) {
1046
1047#if ! defined(USE_ITHREADS) || defined(USE_THREAD_SAFE_LOCALE)
1048
1049 sv_setuv(sv, (UV) 1);
1050
1051#else
1052 sv_setuv(sv, (UV) 0);
1053
1054#endif
1055
1056 }
1057 break;
1058 case '\024': /* ^T */
1059 if (nextchar == '\0') {
1060#ifdef BIG_TIME
1061 sv_setnv(sv, PL_basetime);
1062#else
1063 sv_setiv(sv, (IV)PL_basetime);
1064#endif
1065 }
1066 else if (strEQ(remaining, "AINT"))
1067 sv_setiv(sv, TAINTING_get
1068 ? (TAINT_WARN_get || PL_unsafe ? -1 : 1)
1069 : 0);
1070 break;
1071 case '\025': /* $^UNICODE, $^UTF8LOCALE, $^UTF8CACHE */
1072 if (strEQ(remaining, "NICODE"))
1073 sv_setuv(sv, (UV) PL_unicode);
1074 else if (strEQ(remaining, "TF8LOCALE"))
1075 sv_setuv(sv, (UV) PL_utf8locale);
1076 else if (strEQ(remaining, "TF8CACHE"))
1077 sv_setiv(sv, (IV) PL_utf8cache);
1078 break;
1079 case '\027': /* ^W & $^WARNING_BITS */
1080 if (nextchar == '\0')
1081 sv_setiv(sv, (IV)cBOOL(PL_dowarn & G_WARN_ON));
1082 else if (strEQ(remaining, "ARNING_BITS")) {
1083 if (PL_compiling.cop_warnings == pWARN_NONE) {
1084 sv_setpvn(sv, WARN_NONEstring, WARNsize) ;
1085 }
1086 else if (PL_compiling.cop_warnings == pWARN_STD) {
1087 goto set_undef;
1088 }
1089 else if (PL_compiling.cop_warnings == pWARN_ALL) {
1090 sv_setpvn(sv, WARN_ALLstring, WARNsize);
1091 }
1092 else {
1093 sv_setpvn(sv, PL_compiling.cop_warnings,
1094 RCPV_LEN(PL_compiling.cop_warnings));
1095 }
1096 }
1097 break;
1098 case '+':
1099 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
1100 paren = RX_LASTPAREN(rx);
1101 if (paren)
1102 goto do_numbuf_fetch;
1103 }
1104 goto set_undef;
1105 case '\016': /* ^N */
1106 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
1107 paren = RX_LASTCLOSEPAREN(rx);
1108 if (RX_PARNO_TO_LOGICAL(rx))
1109 paren = RX_PARNO_TO_LOGICAL(rx)[paren];
1110 if (paren)
1111 goto do_numbuf_fetch;
1112 }
1113 goto set_undef;
1114 case '.':
1115 if (GvIO(PL_last_in_gv)) {
1116 sv_setiv(sv, (IV)IoLINES(GvIOp(PL_last_in_gv)));
1117 }
1118 break;
1119 case '?':
1120 {
1121 sv_setiv(sv, (IV)STATUS_CURRENT);
1122#ifdef COMPLEX_STATUS
1123 SvUPGRADE(sv, SVt_PVLV);
1124 LvTARGOFF(sv) = PL_statusvalue;
1125 LvTARGLEN(sv) = PL_statusvalue_vms;
1126#endif
1127 }
1128 break;
1129 case '^':
1130 if (GvIOp(PL_defoutgv))
1131 s = IoTOP_NAME(GvIOp(PL_defoutgv));
1132 if (s)
1133 sv_setpv(sv,s);
1134 else {
1135 sv_setpv(sv,GvENAME(PL_defoutgv));
1136 sv_catpvs(sv,"_TOP");
1137 }
1138 break;
1139 case '~':
1140 if (GvIOp(PL_defoutgv))
1141 s = IoFMT_NAME(GvIOp(PL_defoutgv));
1142 if (!s)
1143 s = GvENAME(PL_defoutgv);
1144 sv_setpv(sv,s);
1145 break;
1146 case '=':
1147 if (GvIO(PL_defoutgv))
1148 sv_setiv(sv, (IV)IoPAGE_LEN(GvIOp(PL_defoutgv)));
1149 break;
1150 case '-':
1151 if (GvIO(PL_defoutgv))
1152 sv_setiv(sv, (IV)IoLINES_LEFT(GvIOp(PL_defoutgv)));
1153 break;
1154 case '%':
1155 if (GvIO(PL_defoutgv))
1156 sv_setiv(sv, (IV)IoPAGE(GvIOp(PL_defoutgv)));
1157 break;
1158 case ':':
1159 case '/':
1160 break;
1161 case '[':
1162 sv_setiv(sv, 0);
1163 break;
1164 case '|':
1165 if (GvIO(PL_defoutgv))
1166 sv_setiv(sv, (IV)(IoFLAGS(GvIOp(PL_defoutgv)) & IOf_FLUSH) != 0 );
1167 break;
1168 case '\\':
1169 if (PL_ors_sv)
1170 sv_copypv(sv, PL_ors_sv);
1171 else
1172 goto set_undef;
1173 break;
1174 case '$': /* $$ */
1175 {
1176 IV const pid = (IV)PerlProc_getpid();
1177 if (isGV(mg->mg_obj) || SvIV(mg->mg_obj) != pid) {
1178 /* never set manually, or at least not since last fork */
1179 sv_setiv(sv, pid);
1180 /* never unsafe, even if reading in a tainted expression */
1181 SvTAINTED_off(sv);
1182 }
1183 /* else a value has been assigned manually, so do nothing */
1184 }
1185 break;
1186 case '<':
1187 sv_setuid(sv, PerlProc_getuid());
1188 break;
1189 case '>':
1190 sv_setuid(sv, PerlProc_geteuid());
1191 break;
1192 case '(':
1193 sv_setgid(sv, PerlProc_getgid());
1194 goto add_groups;
1195 case ')':
1196 sv_setgid(sv, PerlProc_getegid());
1197 add_groups:
1198#ifdef HAS_GETGROUPS
1199 {
1200 Groups_t *gary = NULL;
1201 I32 num_groups = getgroups(0, gary);
1202 if (num_groups > 0) {
1203 I32 i;
1204 Newx(gary, num_groups, Groups_t);
1205 num_groups = getgroups(num_groups, gary);
1206 for (i = 0; i < num_groups; i++)
1207 Perl_sv_catpvf(aTHX_ sv, " %" IVdf, (IV)gary[i]);
1208 Safefree(gary);
1209 }
1210 }
1211
1212 /*
1213 Set this to avoid warnings when the SV is used as a number.
1214 Avoid setting the public IOK flag so that serializers will
1215 use the PV.
1216 */
1217 (void)SvIOKp_on(sv); /* what a wonderful hack! */
1218#endif
1219 break;
1220 case '0':
1221 break;
1222 }
1223 return 0;
1224
1225 set_undef:
1226 sv_set_undef(sv);
1227 return 0;
1228}
1229
1230int
1231Perl_magic_getuvar(pTHX_ SV *sv, MAGIC *mg)
1232{
1233 struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
1234
1235 PERL_ARGS_ASSERT_MAGIC_GETUVAR;
1236
1237 if (uf && uf->uf_val)
1238 (*uf->uf_val)(aTHX_ uf->uf_index, sv);
1239 return 0;
1240}
1241
1242int
1243Perl_magic_setenv(pTHX_ SV *sv, MAGIC *mg)
1244{
1245 STRLEN len = 0, klen;
1246
1247 const char *key;
1248 const char *s = "";
1249
1250 SV *keysv = MgSV(mg);
1251
1252 if (keysv == NULL) {
1253 key = mg->mg_ptr;
1254 klen = mg->mg_len;
1255 }
1256 else {
1257 if (!sv_utf8_downgrade(keysv, /* fail_ok */ TRUE)) {
1258 Perl_ck_warner_d(aTHX_ packWARN(WARN_UTF8), "Wide character in %s", "setenv key (encoding to utf8)");
1259 }
1260
1261 key = SvPV_const(keysv,klen);
1262 }
1263
1264 PERL_ARGS_ASSERT_MAGIC_SETENV;
1265
1266 SvGETMAGIC(sv);
1267 if (SvOK(sv)) {
1268 /* defined environment variables are byte strings; unfortunately
1269 there is no SvPVbyte_force_nomg(), so we must do this piecewise */
1270 (void)SvPV_force_nomg_nolen(sv);
1271 (void)sv_utf8_downgrade(sv, /* fail_ok */ TRUE);
1272 if (SvUTF8(sv)) {
1273 Perl_ck_warner_d(aTHX_ packWARN(WARN_UTF8), "Wide character in %s", "setenv");
1274 SvUTF8_off(sv);
1275 }
1276 s = SvPVX(sv);
1277 len = SvCUR(sv);
1278 }
1279 my_setenv(key, s); /* does the deed */
1280
1281#ifdef DYNAMIC_ENV_FETCH
1282 /* We just undefd an environment var. Is a replacement */
1283 /* waiting in the wings? */
1284 if (!len) {
1285 SV ** const valp = hv_fetch(GvHVn(PL_envgv), key, klen, FALSE);
1286 if (valp)
1287 s = SvOK(*valp) ? SvPV_const(*valp, len) : "";
1288 }
1289#endif
1290
1291#if !defined(OS2) && !defined(WIN32)
1292 /* And you'll never guess what the dog had */
1293 /* in its mouth... */
1294 if (TAINTING_get) {
1295 MgTAINTEDDIR_off(mg);
1296#ifdef VMS
1297 if (s && memEQs(key, klen, "DCL$PATH")) {
1298 char pathbuf[256], eltbuf[256], *cp, *elt;
1299 int i = 0, j = 0;
1300
1301 my_strlcpy(eltbuf, s, sizeof(eltbuf));
1302 elt = eltbuf;
1303 do { /* DCL$PATH may be a search list */
1304 while (1) { /* as may dev portion of any element */
1305 if ( ((cp = strchr(elt,'[')) || (cp = strchr(elt,'<'))) ) {
1306 if ( *(cp+1) == '.' || *(cp+1) == '-' ||
1307 cando_by_name(S_IWUSR,0,elt) ) {
1308 MgTAINTEDDIR_on(mg);
1309 return 0;
1310 }
1311 }
1312 if ((cp = strchr(elt, ':')) != NULL)
1313 *cp = '\0';
1314 if (my_trnlnm(elt, eltbuf, j++))
1315 elt = eltbuf;
1316 else
1317 break;
1318 }
1319 j = 0;
1320 } while (my_trnlnm(s, pathbuf, i++) && (elt = pathbuf));
1321 }
1322#endif /* VMS */
1323 if (s && memEQs(key, klen, "PATH")) {
1324 const char * const strend = s + len;
1325#ifdef __VMS /* Hmm. How do we get $Config{path_sep} from C? */
1326 const char path_sep = PL_perllib_sep;
1327#else
1328 const char path_sep = ':';
1329#endif
1330
1331#ifndef __VMS
1332 /* Does this apply for VMS?
1333 * Empty PATH on linux is treated same as ".", which is forbidden
1334 * under taint. So check if the PATH variable is empty. */
1335 if (!len) {
1336 MgTAINTEDDIR_on(mg);
1337 return 0;
1338 }
1339#endif
1340 /* set MGf_TAINTEDDIR if any component of the new path is
1341 * relative or world-writeable */
1342 while (s < strend) {
1343 char tmpbuf[256];
1344 Stat_t st;
1345 I32 i;
1346 s = delimcpy_no_escape(tmpbuf, tmpbuf + sizeof tmpbuf,
1347 s, strend, path_sep, &i);
1348 s++;
1349 if (i >= (I32)sizeof tmpbuf /* too long -- assume the worst */
1350#ifdef __VMS
1351 /* no colon thus no device name -- assume relative path */
1352 || (PL_perllib_sep != ':' && !strchr(tmpbuf, ':'))
1353 /* Using Unix separator, e.g. under bash, so act line Unix */
1354 || (PL_perllib_sep == ':' && *tmpbuf != '/')
1355#else
1356 || *tmpbuf != '/' /* no starting slash -- assume relative path */
1357 || s == strend /* trailing empty component -- same as "." */
1358#endif
1359 || (PerlLIO_stat(tmpbuf, &st) == 0 && (st.st_mode & 2)) ) {
1360 MgTAINTEDDIR_on(mg);
1361 return 0;
1362 }
1363 }
1364 }
1365 }
1366#endif /* neither OS2 nor WIN32 */
1367
1368 return 0;
1369}
1370
1371int
1372Perl_magic_clearenv(pTHX_ SV *sv, MAGIC *mg)
1373{
1374 PERL_ARGS_ASSERT_MAGIC_CLEARENV;
1375 PERL_UNUSED_ARG(sv);
1376 my_setenv(MgPV_nolen_const(mg),NULL);
1377 return 0;
1378}
1379
1380int
1381Perl_magic_set_all_env(pTHX_ SV *sv, MAGIC *mg)
1382{
1383 PERL_ARGS_ASSERT_MAGIC_SET_ALL_ENV;
1384 PERL_UNUSED_ARG(mg);
1385#if defined(VMS)
1386 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1387#else
1388 if (PL_localizing) {
1389 HE* entry;
1390 my_clearenv();
1391 hv_iterinit(MUTABLE_HV(sv));
1392 while ((entry = hv_iternext(MUTABLE_HV(sv)))) {
1393 I32 keylen;
1394 my_setenv(hv_iterkey(entry, &keylen),
1395 SvPV_nolen_const(hv_iterval(MUTABLE_HV(sv), entry)));
1396 }
1397 }
1398#endif
1399 return 0;
1400}
1401
1402int
1403Perl_magic_clear_all_env(pTHX_ SV *sv, MAGIC *mg)
1404{
1405 PERL_ARGS_ASSERT_MAGIC_CLEAR_ALL_ENV;
1406 PERL_UNUSED_ARG(sv);
1407 PERL_UNUSED_ARG(mg);
1408#if defined(VMS)
1409 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1410#else
1411 my_clearenv();
1412#endif
1413 return 0;
1414}
1415
1416#ifndef PERL_MICRO
1417#ifdef HAS_SIGPROCMASK
1418static void
1419restore_sigmask(pTHX_ SV *save_sv)
1420{
1421 const sigset_t * const ossetp = (const sigset_t *) SvPV_nolen_const( save_sv );
1422 (void)sigprocmask(SIG_SETMASK, ossetp, NULL);
1423}
1424#endif
1425int
1426Perl_magic_getsig(pTHX_ SV *sv, MAGIC *mg)
1427{
1428 /* Are we fetching a signal entry? */
1429 int i = (I16)mg->mg_private;
1430
1431 PERL_ARGS_ASSERT_MAGIC_GETSIG;
1432
1433 if (!i) {
1434 STRLEN siglen;
1435 const char * sig = MgPV_const(mg, siglen);
1436 mg->mg_private = i = whichsig_pvn(sig, siglen);
1437 }
1438
1439 if (i > 0) {
1440 if(PL_psig_ptr[i])
1441 sv_setsv(sv,PL_psig_ptr[i]);
1442 else {
1443 Sighandler_t sigstate = rsignal_state(i);
1444#ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1445 if (PL_sig_handlers_initted && PL_sig_ignoring[i])
1446 sigstate = SIG_IGN;
1447#endif
1448#ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1449 if (PL_sig_handlers_initted && PL_sig_defaulting[i])
1450 sigstate = SIG_DFL;
1451#endif
1452 /* cache state so we don't fetch it again */
1453 if(sigstate == (Sighandler_t) SIG_IGN)
1454 sv_setpvs(sv,"IGNORE");
1455 else
1456 sv_set_undef(sv);
1457 PL_psig_ptr[i] = SvREFCNT_inc_simple_NN(sv);
1458 SvTEMP_off(sv);
1459 }
1460 }
1461 return 0;
1462}
1463int
1464Perl_magic_clearsig(pTHX_ SV *sv, MAGIC *mg)
1465{
1466 PERL_ARGS_ASSERT_MAGIC_CLEARSIG;
1467
1468 magic_setsig(NULL, mg);
1469 return sv_unmagic(sv, mg->mg_type);
1470}
1471
1472
1473#ifdef PERL_USE_3ARG_SIGHANDLER
1474Signal_t
1475Perl_csighandler(int sig, Siginfo_t *sip, void *uap)
1476{
1477 Perl_csighandler3(sig, sip, uap);
1478}
1479#else
1480Signal_t
1481Perl_csighandler(int sig)
1482{
1483 Perl_csighandler3(sig, NULL, NULL);
1484}
1485#endif
1486
1487Signal_t
1488Perl_csighandler1(int sig)
1489{
1490 Perl_csighandler3(sig, NULL, NULL);
1491}
1492
1493/* Handler intended to directly handle signal calls from the kernel.
1494 * (Depending on configuration, the kernel may actually call one of the
1495 * wrappers csighandler() or csighandler1() instead.)
1496 * It either queues up the signal or dispatches it immediately depending
1497 * on whether safe signals are enabled and whether the signal is capable
1498 * of being deferred (e.g. SEGV isn't).
1499 */
1500
1501Signal_t
1502Perl_csighandler3(int sig, Siginfo_t *sip PERL_UNUSED_DECL, void *uap PERL_UNUSED_DECL)
1503{
1504#ifdef PERL_GET_SIG_CONTEXT
1505 dTHXa(PERL_GET_SIG_CONTEXT);
1506#else
1507 dTHX;
1508#endif
1509
1510#ifdef PERL_USE_3ARG_SIGHANDLER
1511#if defined(__cplusplus) && defined(__GNUC__)
1512 /* g++ doesn't support PERL_UNUSED_DECL, so the sip and uap
1513 * parameters would be warned about. */
1514 PERL_UNUSED_ARG(sip);
1515 PERL_UNUSED_ARG(uap);
1516#endif
1517#endif
1518
1519#ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1520 (void) rsignal(sig, PL_csighandlerp);
1521 if (PL_sig_ignoring[sig]) return;
1522#endif
1523#ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1524 if (PL_sig_defaulting[sig])
1525#ifdef KILL_BY_SIGPRC
1526 exit((Perl_sig_to_vmscondition(sig)&STS$M_COND_ID)|STS$K_SEVERE|STS$M_INHIB_MSG);
1527#else
1528 exit(1);
1529#endif
1530#endif
1531 if (
1532#ifdef SIGILL
1533 sig == SIGILL ||
1534#endif
1535#ifdef SIGBUS
1536 sig == SIGBUS ||
1537#endif
1538#ifdef SIGSEGV
1539 sig == SIGSEGV ||
1540#endif
1541#ifdef SIGFPE
1542 sig == SIGFPE ||
1543#endif
1544 (PL_signals & PERL_SIGNALS_UNSAFE_FLAG))
1545 /* Call the perl level handler now--
1546 * with risk we may be in malloc() or being destructed etc. */
1547 {
1548 if (PL_sighandlerp == Perl_sighandler)
1549 /* default handler, so can call perly_sighandler() directly
1550 * rather than via Perl_sighandler, passing the extra
1551 * 'safe = false' arg
1552 */
1553 Perl_perly_sighandler(sig, NULL, NULL, 0 /* unsafe */);
1554 else
1555#ifdef PERL_USE_3ARG_SIGHANDLER
1556 (*PL_sighandlerp)(sig, NULL, NULL);
1557#else
1558 (*PL_sighandlerp)(sig);
1559#endif
1560 }
1561 else {
1562 if (!PL_psig_pend) return;
1563 /* Set a flag to say this signal is pending, that is awaiting delivery after
1564 * the current Perl opcode completes */
1565 PL_psig_pend[sig]++;
1566
1567#ifndef SIG_PENDING_DIE_COUNT
1568# define SIG_PENDING_DIE_COUNT 120
1569#endif
1570 /* Add one to say _a_ signal is pending */
1571 if (++PL_sig_pending >= SIG_PENDING_DIE_COUNT)
1572 Perl_croak(aTHX_ "Maximal count of pending signals (%lu) exceeded",
1573 (unsigned long)SIG_PENDING_DIE_COUNT);
1574 }
1575}
1576
1577#if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1578void
1579Perl_csighandler_init(void)
1580{
1581 int sig;
1582 if (PL_sig_handlers_initted) return;
1583
1584 for (sig = 1; sig < SIG_SIZE; sig++) {
1585#ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1586 dTHX;
1587 PL_sig_defaulting[sig] = 1;
1588 (void) rsignal(sig, PL_csighandlerp);
1589#endif
1590#ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1591 PL_sig_ignoring[sig] = 0;
1592#endif
1593 }
1594 PL_sig_handlers_initted = 1;
1595}
1596#endif
1597
1598#if defined HAS_SIGPROCMASK
1599static void
1600unblock_sigmask(pTHX_ void* newset)
1601{
1602 PERL_UNUSED_CONTEXT;
1603 sigprocmask(SIG_UNBLOCK, (sigset_t*)newset, NULL);
1604}
1605#endif
1606
1607void
1608Perl_despatch_signals(pTHX)
1609{
1610 int sig;
1611 PL_sig_pending = 0;
1612 for (sig = 1; sig < SIG_SIZE; sig++) {
1613 if (PL_psig_pend[sig]) {
1614 dSAVE_ERRNO;
1615#ifdef HAS_SIGPROCMASK
1616 /* From sigaction(2) (FreeBSD man page):
1617 * | Signal routines normally execute with the signal that
1618 * | caused their invocation blocked, but other signals may
1619 * | yet occur.
1620 * Emulation of this behavior (from within Perl) is enabled
1621 * using sigprocmask
1622 */
1623 int was_blocked;
1624 sigset_t newset, oldset;
1625
1626 sigemptyset(&newset);
1627 sigaddset(&newset, sig);
1628 sigprocmask(SIG_BLOCK, &newset, &oldset);
1629 was_blocked = sigismember(&oldset, sig);
1630 if (!was_blocked) {
1631 SV* save_sv = newSVpvn((char *)(&newset), sizeof(sigset_t));
1632 ENTER;
1633 SAVEFREESV(save_sv);
1634 SAVEDESTRUCTOR_X(unblock_sigmask, SvPV_nolen(save_sv));
1635 }
1636#endif
1637 PL_psig_pend[sig] = 0;
1638 if (PL_sighandlerp == Perl_sighandler)
1639 /* default handler, so can call perly_sighandler() directly
1640 * rather than via Perl_sighandler, passing the extra
1641 * 'safe = true' arg
1642 */
1643 Perl_perly_sighandler(sig, NULL, NULL, 1 /* safe */);
1644 else
1645#ifdef PERL_USE_3ARG_SIGHANDLER
1646 (*PL_sighandlerp)(sig, NULL, NULL);
1647#else
1648 (*PL_sighandlerp)(sig);
1649#endif
1650
1651#ifdef HAS_SIGPROCMASK
1652 if (!was_blocked)
1653 LEAVE;
1654#endif
1655 RESTORE_ERRNO;
1656 }
1657 }
1658}
1659
1660/* sv of NULL signifies that we're acting as magic_clearsig. */
1661int
1662Perl_magic_setsig(pTHX_ SV *sv, MAGIC *mg)
1663{
1664 I32 i;
1665 SV** svp = NULL;
1666 /* Need to be careful with SvREFCNT_dec(), because that can have side
1667 * effects (due to closures). We must make sure that the new disposition
1668 * is in place before it is called.
1669 */
1670 SV* to_dec = NULL;
1671 STRLEN len;
1672#ifdef HAS_SIGPROCMASK
1673 sigset_t set, save;
1674 SV* save_sv;
1675#endif
1676 const char *s = MgPV_const(mg,len);
1677
1678 PERL_ARGS_ASSERT_MAGIC_SETSIG;
1679
1680 if (*s == '_') {
1681 if (memEQs(s, len, "__DIE__"))
1682 svp = &PL_diehook;
1683 else if (memEQs(s, len, "__WARN__")
1684 && (sv ? 1 : PL_warnhook != PERL_WARNHOOK_FATAL)) {
1685 /* Merge the existing behaviours, which are as follows:
1686 magic_setsig, we always set svp to &PL_warnhook
1687 (hence we always change the warnings handler)
1688 For magic_clearsig, we don't change the warnings handler if it's
1689 set to the &PL_warnhook. */
1690 svp = &PL_warnhook;
1691 } else if (sv) {
1692 SV *tmp = sv_newmortal();
1693 Perl_croak(aTHX_ "No such hook: %s",
1694 pv_pretty(tmp, s, len, 0, NULL, NULL, 0));
1695 }
1696 i = 0;
1697 if (svp && *svp) {
1698 if (*svp != PERL_WARNHOOK_FATAL)
1699 to_dec = *svp;
1700 *svp = NULL;
1701 }
1702 }
1703 else {
1704 i = (I16)mg->mg_private;
1705 if (!i) {
1706 i = whichsig_pvn(s, len); /* ...no, a brick */
1707 mg->mg_private = (U16)i;
1708 }
1709 if (i <= 0) {
1710 if (sv) {
1711 SV *tmp = sv_newmortal();
1712 Perl_ck_warner(aTHX_ packWARN(WARN_SIGNAL), "No such signal: SIG%s",
1713 pv_pretty(tmp, s, len, 0, NULL, NULL, 0));
1714 }
1715 return 0;
1716 }
1717#ifdef HAS_SIGPROCMASK
1718 /* Avoid having the signal arrive at a bad time, if possible. */
1719 sigemptyset(&set);
1720 sigaddset(&set,i);
1721 sigprocmask(SIG_BLOCK, &set, &save);
1722 ENTER;
1723 save_sv = newSVpvn((char *)(&save), sizeof(sigset_t));
1724 SAVEFREESV(save_sv);
1725 SAVEDESTRUCTOR_X(restore_sigmask, save_sv);
1726#endif
1727 PERL_ASYNC_CHECK();
1728#if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1729 if (!PL_sig_handlers_initted) Perl_csighandler_init();
1730#endif
1731#ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1732 PL_sig_ignoring[i] = 0;
1733#endif
1734#ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1735 PL_sig_defaulting[i] = 0;
1736#endif
1737 to_dec = PL_psig_ptr[i];
1738 if (sv) {
1739 PL_psig_ptr[i] = SvREFCNT_inc_simple_NN(sv);
1740 SvTEMP_off(sv); /* Make sure it doesn't go away on us */
1741
1742 /* Signals don't change name during the program's execution, so once
1743 they're cached in the appropriate slot of PL_psig_name, they can
1744 stay there.
1745
1746 Ideally we'd find some way of making SVs at (C) compile time, or
1747 at least, doing most of the work. */
1748 if (!PL_psig_name[i]) {
1749 const char* name = PL_sig_name[i];
1750 PL_psig_name[i] = newSVpvn(name, strlen(name));
1751 SvREADONLY_on(PL_psig_name[i]);
1752 }
1753 } else {
1754 SvREFCNT_dec(PL_psig_name[i]);
1755 PL_psig_name[i] = NULL;
1756 PL_psig_ptr[i] = NULL;
1757 }
1758 }
1759 if (sv && (isGV_with_GP(sv) || SvROK(sv))) {
1760 if (i) {
1761 (void)rsignal(i, PL_csighandlerp);
1762 }
1763 else
1764 *svp = SvREFCNT_inc_simple_NN(sv);
1765 } else {
1766 if (sv && SvOK(sv)) {
1767 s = SvPV_force(sv, len);
1768 } else {
1769 sv = NULL;
1770 }
1771 if (sv && memEQs(s, len,"IGNORE")) {
1772 if (i) {
1773#ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1774 PL_sig_ignoring[i] = 1;
1775 (void)rsignal(i, PL_csighandlerp);
1776#else
1777 (void)rsignal(i, (Sighandler_t) SIG_IGN);
1778#endif
1779 }
1780 }
1781 else if (!sv || memEQs(s, len,"DEFAULT") || !len) {
1782 if (i) {
1783#ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1784 PL_sig_defaulting[i] = 1;
1785 (void)rsignal(i, PL_csighandlerp);
1786#else
1787 (void)rsignal(i, (Sighandler_t) SIG_DFL);
1788#endif
1789 }
1790 }
1791 else {
1792 /*
1793 * We should warn if HINT_STRICT_REFS, but without
1794 * access to a known hint bit in a known OP, we can't
1795 * tell whether HINT_STRICT_REFS is in force or not.
1796 */
1797 if (!memchr(s, ':', len) && !memchr(s, '\'', len))
1798 Perl_sv_insert_flags(aTHX_ sv, 0, 0, STR_WITH_LEN("main::"),
1799 SV_GMAGIC);
1800 if (i)
1801 (void)rsignal(i, PL_csighandlerp);
1802 else
1803 *svp = SvREFCNT_inc_simple_NN(sv);
1804 }
1805 }
1806
1807#ifdef HAS_SIGPROCMASK
1808 if(i)
1809 LEAVE;
1810#endif
1811 SvREFCNT_dec(to_dec);
1812 return 0;
1813}
1814#endif /* !PERL_MICRO */
1815
1816int
1817Perl_magic_setsigall(pTHX_ SV* sv, MAGIC* mg)
1818{
1819 PERL_ARGS_ASSERT_MAGIC_SETSIGALL;
1820 PERL_UNUSED_ARG(mg);
1821
1822 if (PL_localizing == 2) {
1823 HV* hv = (HV*)sv;
1824 HE* current;
1825 hv_iterinit(hv);
1826 while ((current = hv_iternext(hv))) {
1827 SV* sigelem = hv_iterval(hv, current);
1828 mg_set(sigelem);
1829 }
1830 }
1831 return 0;
1832}
1833
1834int
1835Perl_magic_setisa(pTHX_ SV *sv, MAGIC *mg)
1836{
1837 PERL_ARGS_ASSERT_MAGIC_SETISA;
1838 PERL_UNUSED_ARG(sv);
1839
1840 /* Skip _isaelem because _isa will handle it shortly */
1841 if (PL_delaymagic & DM_ARRAY_ISA && mg->mg_type == PERL_MAGIC_isaelem)
1842 return 0;
1843
1844 return magic_clearisa(NULL, mg);
1845}
1846
1847/* sv of NULL signifies that we're acting as magic_setisa. */
1848int
1849Perl_magic_clearisa(pTHX_ SV *sv, MAGIC *mg)
1850{
1851 HV* stash;
1852 PERL_ARGS_ASSERT_MAGIC_CLEARISA;
1853
1854 /* Bail out if destruction is going on */
1855 if(PL_phase == PERL_PHASE_DESTRUCT) return 0;
1856
1857 if (sv)
1858 av_clear(MUTABLE_AV(sv));
1859
1860 if (SvTYPE(mg->mg_obj) != SVt_PVGV && SvSMAGICAL(mg->mg_obj))
1861 /* This occurs with setisa_elem magic, which calls this
1862 same function. */
1863 mg = mg_find(mg->mg_obj, PERL_MAGIC_isa);
1864
1865 assert(mg);
1866 if (SvTYPE(mg->mg_obj) == SVt_PVAV) { /* multiple stashes */
1867 SV **svp = AvARRAY((AV *)mg->mg_obj);
1868 I32 items = AvFILLp((AV *)mg->mg_obj) + 1;
1869 while (items--) {
1870 stash = GvSTASH((GV *)*svp++);
1871 if (stash && HvHasENAME(stash)) mro_isa_changed_in(stash);
1872 }
1873
1874 return 0;
1875 }
1876
1877 stash = GvSTASH(
1878 (const GV *)mg->mg_obj
1879 );
1880
1881 /* The stash may have been detached from the symbol table, so check its
1882 name before doing anything. */
1883 if (stash && HvHasENAME(stash))
1884 mro_isa_changed_in(stash);
1885
1886 return 0;
1887}
1888
1889int
1890Perl_magic_getnkeys(pTHX_ SV *sv, MAGIC *mg)
1891{
1892 HV * const hv = MUTABLE_HV(LvTARG(sv));
1893 I32 i = 0;
1894
1895 PERL_ARGS_ASSERT_MAGIC_GETNKEYS;
1896 PERL_UNUSED_ARG(mg);
1897
1898 if (hv) {
1899 (void) hv_iterinit(hv);
1900 if (! SvTIED_mg((const SV *)hv, PERL_MAGIC_tied))
1901 i = HvUSEDKEYS(hv);
1902 else {
1903 while (hv_iternext(hv))
1904 i++;
1905 }
1906 }
1907
1908 sv_setiv(sv, (IV)i);
1909 return 0;
1910}
1911
1912int
1913Perl_magic_setnkeys(pTHX_ SV *sv, MAGIC *mg)
1914{
1915 PERL_ARGS_ASSERT_MAGIC_SETNKEYS;
1916 PERL_UNUSED_ARG(mg);
1917 if (LvTARG(sv)) {
1918 hv_ksplit(MUTABLE_HV(LvTARG(sv)), SvIV(sv));
1919 }
1920 return 0;
1921}
1922
1923/*
1924=for apidoc_section $magic
1925=for apidoc magic_methcall
1926
1927Invoke a magic method (like FETCH).
1928
1929C<sv> and C<mg> are the tied thingy and the tie magic.
1930
1931C<meth> is the name of the method to call.
1932
1933C<argc> is the number of args (in addition to $self) to pass to the method.
1934
1935The C<flags> can be:
1936
1937 G_DISCARD invoke method with G_DISCARD flag and don't
1938 return a value
1939 G_UNDEF_FILL fill the stack with argc pointers to
1940 PL_sv_undef
1941
1942The arguments themselves are any values following the C<flags> argument.
1943
1944Returns the SV (if any) returned by the method, or C<NULL> on failure.
1945
1946
1947=cut
1948*/
1949
1950SV*
1951Perl_magic_methcall(pTHX_ SV *sv, const MAGIC *mg, SV *meth, U32 flags,
1952 U32 argc, ...)
1953{
1954 dSP;
1955 SV* ret = NULL;
1956
1957 PERL_ARGS_ASSERT_MAGIC_METHCALL;
1958
1959 ENTER;
1960
1961 if (flags & G_WRITING_TO_STDERR) {
1962 SAVETMPS;
1963
1964 save_re_context();
1965 SAVESPTR(PL_stderrgv);
1966 PL_stderrgv = NULL;
1967 }
1968
1969 PUSHSTACKi(PERLSI_MAGIC);
1970 PUSHMARK(SP);
1971
1972 /* EXTEND() expects a signed argc; don't wrap when casting */
1973 assert(argc <= I32_MAX);
1974 EXTEND(SP, (I32)argc+1);
1975 PUSHs(SvTIED_obj(sv, mg));
1976 if (flags & G_UNDEF_FILL) {
1977 while (argc--) {
1978 PUSHs(&PL_sv_undef);
1979 }
1980 } else if (argc > 0) {
1981 va_list args;
1982 va_start(args, argc);
1983
1984 do {
1985 SV *const this_sv = va_arg(args, SV *);
1986 PUSHs(this_sv);
1987 } while (--argc);
1988
1989 va_end(args);
1990 }
1991 PUTBACK;
1992 if (flags & G_DISCARD) {
1993 call_sv(meth, G_SCALAR|G_DISCARD|G_METHOD_NAMED);
1994 }
1995 else {
1996 if (call_sv(meth, G_SCALAR|G_METHOD_NAMED))
1997 ret = *PL_stack_sp--;
1998 }
1999 POPSTACK;
2000 if (flags & G_WRITING_TO_STDERR)
2001 FREETMPS;
2002 LEAVE;
2003 return ret;
2004}
2005
2006/* wrapper for magic_methcall that creates the first arg */
2007
2008STATIC SV*
2009S_magic_methcall1(pTHX_ SV *sv, const MAGIC *mg, SV *meth, U32 flags,
2010 int n, SV *val)
2011{
2012 SV* arg1 = NULL;
2013
2014 PERL_ARGS_ASSERT_MAGIC_METHCALL1;
2015
2016 if (mg->mg_ptr) {
2017 if (mg->mg_len >= 0) {
2018 arg1 = newSVpvn_flags(mg->mg_ptr, mg->mg_len, SVs_TEMP);
2019 }
2020 else if (mg->mg_len == HEf_SVKEY)
2021 arg1 = MUTABLE_SV(mg->mg_ptr);
2022 }
2023 else if (mg->mg_type == PERL_MAGIC_tiedelem) {
2024 arg1 = newSViv((IV)(mg->mg_len));
2025 sv_2mortal(arg1);
2026 }
2027 if (!arg1) {
2028 return Perl_magic_methcall(aTHX_ sv, mg, meth, flags, n - 1, val);
2029 }
2030 return Perl_magic_methcall(aTHX_ sv, mg, meth, flags, n, arg1, val);
2031}
2032
2033STATIC int
2034S_magic_methpack(pTHX_ SV *sv, const MAGIC *mg, SV *meth)
2035{
2036 SV* ret;
2037
2038 PERL_ARGS_ASSERT_MAGIC_METHPACK;
2039
2040 ret = magic_methcall1(sv, mg, meth, 0, 1, NULL);
2041 if (ret)
2042 sv_setsv(sv, ret);
2043 return 0;
2044}
2045
2046int
2047Perl_magic_getpack(pTHX_ SV *sv, MAGIC *mg)
2048{
2049 PERL_ARGS_ASSERT_MAGIC_GETPACK;
2050
2051 if (mg->mg_type == PERL_MAGIC_tiedelem)
2052 mg->mg_flags |= MGf_GSKIP;
2053 magic_methpack(sv,mg,SV_CONST(FETCH));
2054 return 0;
2055}
2056
2057int
2058Perl_magic_setpack(pTHX_ SV *sv, MAGIC *mg)
2059{
2060 MAGIC *tmg;
2061 SV *val;
2062
2063 PERL_ARGS_ASSERT_MAGIC_SETPACK;
2064
2065 /* in the code C<$tied{foo} = $val>, the "thing" that gets passed to
2066 * STORE() is not $val, but rather a PVLV (the sv in this call), whose
2067 * public flags indicate its value based on copying from $val. Doing
2068 * mg_set() on the PVLV temporarily does SvMAGICAL_off(), then calls us.
2069 * So STORE()'s $_[2] arg is a temporarily disarmed PVLV. This goes
2070 * wrong if $val happened to be tainted, as sv hasn't got magic
2071 * enabled, even though taint magic is in the chain. In which case,
2072 * fake up a temporary tainted value (this is easier than temporarily
2073 * re-enabling magic on sv). */
2074
2075 if (TAINTING_get && (tmg = mg_find(sv, PERL_MAGIC_taint))
2076 && (tmg->mg_len & 1))
2077 {
2078 val = sv_mortalcopy(sv);
2079 SvTAINTED_on(val);
2080 }
2081 else
2082 val = sv;
2083
2084 magic_methcall1(sv, mg, SV_CONST(STORE), G_DISCARD, 2, val);
2085 return 0;
2086}
2087
2088int
2089Perl_magic_clearpack(pTHX_ SV *sv, MAGIC *mg)
2090{
2091 PERL_ARGS_ASSERT_MAGIC_CLEARPACK;
2092
2093 if (mg->mg_type == PERL_MAGIC_tiedscalar) return 0;
2094 return magic_methpack(sv,mg,SV_CONST(DELETE));
2095}
2096
2097
2098U32
2099Perl_magic_sizepack(pTHX_ SV *sv, MAGIC *mg)
2100{
2101 I32 retval = 0;
2102 SV* retsv;
2103
2104 PERL_ARGS_ASSERT_MAGIC_SIZEPACK;
2105
2106 retsv = magic_methcall1(sv, mg, SV_CONST(FETCHSIZE), 0, 1, NULL);
2107 if (retsv) {
2108 retval = SvIV(retsv)-1;
2109 if (retval < -1)
2110 Perl_croak(aTHX_ "FETCHSIZE returned a negative value");
2111 }
2112 return (U32) retval;
2113}
2114
2115int
2116Perl_magic_wipepack(pTHX_ SV *sv, MAGIC *mg)
2117{
2118 PERL_ARGS_ASSERT_MAGIC_WIPEPACK;
2119
2120 Perl_magic_methcall(aTHX_ sv, mg, SV_CONST(CLEAR), G_DISCARD, 0);
2121 return 0;
2122}
2123
2124int
2125Perl_magic_nextpack(pTHX_ SV *sv, MAGIC *mg, SV *key)
2126{
2127 SV* ret;
2128
2129 PERL_ARGS_ASSERT_MAGIC_NEXTPACK;
2130
2131 ret = SvOK(key) ? Perl_magic_methcall(aTHX_ sv, mg, SV_CONST(NEXTKEY), 0, 1, key)
2132 : Perl_magic_methcall(aTHX_ sv, mg, SV_CONST(FIRSTKEY), 0, 0);
2133 if (ret)
2134 sv_setsv(key,ret);
2135 return 0;
2136}
2137
2138int
2139Perl_magic_existspack(pTHX_ SV *sv, const MAGIC *mg)
2140{
2141 PERL_ARGS_ASSERT_MAGIC_EXISTSPACK;
2142
2143 return magic_methpack(sv,mg,SV_CONST(EXISTS));
2144}
2145
2146SV *
2147Perl_magic_scalarpack(pTHX_ HV *hv, MAGIC *mg)
2148{
2149 SV *retval;
2150 SV * const tied = SvTIED_obj(MUTABLE_SV(hv), mg);
2151 HV * const pkg = SvSTASH((const SV *)SvRV(tied));
2152
2153 PERL_ARGS_ASSERT_MAGIC_SCALARPACK;
2154
2155 if (!gv_fetchmethod_autoload(pkg, "SCALAR", FALSE)) {
2156 SV *key;
2157 if (HvEITER_get(hv))
2158 /* we are in an iteration so the hash cannot be empty */
2159 return &PL_sv_yes;
2160 /* no xhv_eiter so now use FIRSTKEY */
2161 key = sv_newmortal();
2162 magic_nextpack(MUTABLE_SV(hv), mg, key);
2163 HvEITER_set(hv, NULL); /* need to reset iterator */
2164 return SvOK(key) ? &PL_sv_yes : &PL_sv_no;
2165 }
2166
2167 /* there is a SCALAR method that we can call */
2168 retval = Perl_magic_methcall(aTHX_ MUTABLE_SV(hv), mg, SV_CONST(SCALAR), 0, 0);
2169 if (!retval)
2170 retval = &PL_sv_undef;
2171 return retval;
2172}
2173
2174int
2175Perl_magic_setdbline(pTHX_ SV *sv, MAGIC *mg)
2176{
2177 SV **svp;
2178
2179 PERL_ARGS_ASSERT_MAGIC_SETDBLINE;
2180
2181 /* The magic ptr/len for the debugger's hash should always be an SV. */
2182 if (UNLIKELY(mg->mg_len != HEf_SVKEY)) {
2183 Perl_croak(aTHX_ "panic: magic_setdbline len=%" IVdf ", ptr='%s'",
2184 (IV)mg->mg_len, mg->mg_ptr);
2185 }
2186
2187 /* Use sv_2iv instead of SvIV() as the former generates smaller code, and
2188 setting/clearing debugger breakpoints is not a hot path. */
2189 svp = av_fetch(MUTABLE_AV(mg->mg_obj),
2190 sv_2iv(MUTABLE_SV((mg)->mg_ptr)), FALSE);
2191
2192 if (svp && SvIOKp(*svp)) {
2193 OP * const o = INT2PTR(OP*,SvIVX(*svp));
2194 if (o) {
2195#ifdef PERL_DEBUG_READONLY_OPS
2196 Slab_to_rw(OpSLAB(o));
2197#endif
2198 /* set or clear breakpoint in the relevant control op */
2199 if (SvTRUE(sv))
2200 o->op_flags |= OPf_SPECIAL;
2201 else
2202 o->op_flags &= ~OPf_SPECIAL;
2203#ifdef PERL_DEBUG_READONLY_OPS
2204 Slab_to_ro(OpSLAB(o));
2205#endif
2206 }
2207 }
2208 return 0;
2209}
2210
2211int
2212Perl_magic_getarylen(pTHX_ SV *sv, const MAGIC *mg)
2213{
2214 AV * const obj = MUTABLE_AV(mg->mg_obj);
2215
2216 PERL_ARGS_ASSERT_MAGIC_GETARYLEN;
2217
2218 if (obj) {
2219 sv_setiv(sv, AvFILL(obj));
2220 } else {
2221 sv_set_undef(sv);
2222 }
2223 return 0;
2224}
2225
2226int
2227Perl_magic_setarylen(pTHX_ SV *sv, MAGIC *mg)
2228{
2229 AV * const obj = MUTABLE_AV(mg->mg_obj);
2230
2231 PERL_ARGS_ASSERT_MAGIC_SETARYLEN;
2232
2233 if (obj) {
2234 av_fill(obj, SvIV(sv));
2235 } else {
2236 Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
2237 "Attempt to set length of freed array");
2238 }
2239 return 0;
2240}
2241
2242int
2243Perl_magic_cleararylen_p(pTHX_ SV *sv, MAGIC *mg)
2244{
2245 PERL_ARGS_ASSERT_MAGIC_CLEARARYLEN_P;
2246 PERL_UNUSED_ARG(sv);
2247 PERL_UNUSED_CONTEXT;
2248
2249 /* Reset the iterator when the array is cleared */
2250 if (sizeof(IV) == sizeof(SSize_t)) {
2251 *((IV *) &(mg->mg_len)) = 0;
2252 } else {
2253 if (mg->mg_ptr)
2254 *((IV *) mg->mg_ptr) = 0;
2255 }
2256
2257 return 0;
2258}
2259
2260int
2261Perl_magic_freearylen_p(pTHX_ SV *sv, MAGIC *mg)
2262{
2263 PERL_ARGS_ASSERT_MAGIC_FREEARYLEN_P;
2264 PERL_UNUSED_ARG(sv);
2265
2266 /* during global destruction, mg_obj may already have been freed */
2267 if (PL_in_clean_all)
2268 return 0;
2269
2270 mg = mg_find (mg->mg_obj, PERL_MAGIC_arylen);
2271
2272 if (mg) {
2273 /* arylen scalar holds a pointer back to the array, but doesn't own a
2274 reference. Hence the we (the array) are about to go away with it
2275 still pointing at us. Clear its pointer, else it would be pointing
2276 at free memory. See the comment in sv_magic about reference loops,
2277 and why it can't own a reference to us. */
2278 mg->mg_obj = 0;
2279 }
2280 return 0;
2281}
2282
2283int
2284Perl_magic_getpos(pTHX_ SV *sv, MAGIC *mg)
2285{
2286 SV* const lsv = LvTARG(sv);
2287 MAGIC * const found = mg_find_mglob(lsv);
2288
2289 PERL_ARGS_ASSERT_MAGIC_GETPOS;
2290 PERL_UNUSED_ARG(mg);
2291
2292 if (found && found->mg_len != -1) {
2293 STRLEN i = found->mg_len;
2294 if (found->mg_flags & MGf_BYTES && DO_UTF8(lsv))
2295 i = sv_pos_b2u_flags(lsv, i, SV_GMAGIC|SV_CONST_RETURN);
2296 sv_setuv(sv, i);
2297 return 0;
2298 }
2299 sv_set_undef(sv);
2300 return 0;
2301}
2302
2303int
2304Perl_magic_setpos(pTHX_ SV *sv, MAGIC *mg)
2305{
2306 SV* const lsv = LvTARG(sv);
2307 SSize_t pos;
2308 STRLEN len;
2309 MAGIC* found;
2310 const char *s;
2311
2312 PERL_ARGS_ASSERT_MAGIC_SETPOS;
2313 PERL_UNUSED_ARG(mg);
2314
2315 found = mg_find_mglob(lsv);
2316 if (!found) {
2317 if (!SvOK(sv))
2318 return 0;
2319 found = sv_magicext_mglob(lsv);
2320 }
2321 else if (!SvOK(sv)) {
2322 found->mg_len = -1;
2323 return 0;
2324 }
2325 s = SvPV_const(lsv, len);
2326
2327 pos = SvIV(sv);
2328
2329 if (DO_UTF8(lsv)) {
2330 const STRLEN ulen = sv_or_pv_len_utf8(lsv, s, len);
2331 if (ulen)
2332 len = ulen;
2333 }
2334
2335 if (pos < 0) {
2336 pos += len;
2337 if (pos < 0)
2338 pos = 0;
2339 }
2340 else if (pos > (SSize_t)len)
2341 pos = len;
2342
2343 found->mg_len = pos;
2344 found->mg_flags &= ~(MGf_MINMATCH|MGf_BYTES);
2345
2346 return 0;
2347}
2348
2349int
2350Perl_magic_getsubstr(pTHX_ SV *sv, MAGIC *mg)
2351{
2352 STRLEN len;
2353 SV * const lsv = LvTARG(sv);
2354 const char * const tmps = SvPV_const(lsv,len);
2355 STRLEN offs = LvTARGOFF(sv);
2356 STRLEN rem = LvTARGLEN(sv);
2357 const bool negoff = LvFLAGS(sv) & LVf_NEG_OFF;
2358 const bool negrem = LvFLAGS(sv) & LVf_NEG_LEN;
2359
2360 PERL_ARGS_ASSERT_MAGIC_GETSUBSTR;
2361 PERL_UNUSED_ARG(mg);
2362
2363 if (!translate_substr_offsets(
2364 SvUTF8(lsv) ? sv_or_pv_len_utf8(lsv, tmps, len) : len,
2365 negoff ? -(IV)offs : (IV)offs, !negoff,
2366 negrem ? -(IV)rem : (IV)rem, !negrem, &offs, &rem
2367 )) {
2368 Perl_ck_warner(aTHX_ packWARN(WARN_SUBSTR), "substr outside of string");
2369 sv_set_undef(sv);
2370 return 0;
2371 }
2372
2373 if (SvUTF8(lsv))
2374 offs = sv_or_pv_pos_u2b(lsv, tmps, offs, &rem);
2375 sv_setpvn(sv, tmps + offs, rem);
2376 if (SvUTF8(lsv))
2377 SvUTF8_on(sv);
2378 return 0;
2379}
2380
2381int
2382Perl_magic_setsubstr(pTHX_ SV *sv, MAGIC *mg)
2383{
2384 STRLEN len, lsv_len, oldtarglen, newtarglen;
2385 const char * const tmps = SvPV_const(sv, len);
2386 SV * const lsv = LvTARG(sv);
2387 STRLEN lvoff = LvTARGOFF(sv);
2388 STRLEN lvlen = LvTARGLEN(sv);
2389 const bool negoff = LvFLAGS(sv) & LVf_NEG_OFF;
2390 const bool neglen = LvFLAGS(sv) & LVf_NEG_LEN;
2391
2392 PERL_ARGS_ASSERT_MAGIC_SETSUBSTR;
2393 PERL_UNUSED_ARG(mg);
2394
2395 SvGETMAGIC(lsv);
2396 if (SvROK(lsv))
2397 Perl_ck_warner(aTHX_ packWARN(WARN_SUBSTR),
2398 "Attempt to use reference as lvalue in substr"
2399 );
2400 SvPV_force_nomg(lsv,lsv_len);
2401 if (SvUTF8(lsv)) lsv_len = sv_len_utf8_nomg(lsv);
2402 if (!translate_substr_offsets(
2403 lsv_len,
2404 negoff ? -(IV)lvoff : (IV)lvoff, !negoff,
2405 neglen ? -(IV)lvlen : (IV)lvlen, !neglen, &lvoff, &lvlen
2406 ))
2407 Perl_croak(aTHX_ "substr outside of string");
2408 oldtarglen = lvlen;
2409 if (DO_UTF8(sv)) {
2410 sv_utf8_upgrade_nomg(lsv);
2411 lvoff = sv_pos_u2b_flags(lsv, lvoff, &lvlen, SV_CONST_RETURN);
2412 sv_insert_flags(lsv, lvoff, lvlen, tmps, len, 0);
2413 newtarglen = sv_or_pv_len_utf8(sv, tmps, len);
2414 SvUTF8_on(lsv);
2415 }
2416 else if (SvUTF8(lsv)) {
2417 const char *utf8;
2418 lvoff = sv_pos_u2b_flags(lsv, lvoff, &lvlen, SV_CONST_RETURN);
2419 newtarglen = len;
2420 utf8 = (char*)bytes_to_utf8((U8*)tmps, &len);
2421 sv_insert_flags(lsv, lvoff, lvlen, utf8, len, 0);
2422 Safefree(utf8);
2423 }
2424 else {
2425 sv_insert_flags(lsv, lvoff, lvlen, tmps, len, 0);
2426 newtarglen = len;
2427 }
2428 if (!neglen) LvTARGLEN(sv) = newtarglen;
2429 if (negoff) LvTARGOFF(sv) += newtarglen - oldtarglen;
2430
2431 return 0;
2432}
2433
2434int
2435Perl_magic_gettaint(pTHX_ SV *sv, MAGIC *mg)
2436{
2437 PERL_ARGS_ASSERT_MAGIC_GETTAINT;
2438 PERL_UNUSED_ARG(sv);
2439#ifdef NO_TAINT_SUPPORT
2440 PERL_UNUSED_ARG(mg);
2441#endif
2442
2443 TAINT_IF((PL_localizing != 1) && (mg->mg_len & 1) && IN_PERL_RUNTIME);
2444 return 0;
2445}
2446
2447int
2448Perl_magic_settaint(pTHX_ SV *sv, MAGIC *mg)
2449{
2450 PERL_ARGS_ASSERT_MAGIC_SETTAINT;
2451 PERL_UNUSED_ARG(sv);
2452
2453 /* update taint status */
2454 if (TAINT_get)
2455 mg->mg_len |= 1;
2456 else
2457 mg->mg_len &= ~1;
2458 return 0;
2459}
2460
2461int
2462Perl_magic_getvec(pTHX_ SV *sv, MAGIC *mg)
2463{
2464 SV * const lsv = LvTARG(sv);
2465 char errflags = LvFLAGS(sv);
2466
2467 PERL_ARGS_ASSERT_MAGIC_GETVEC;
2468 PERL_UNUSED_ARG(mg);
2469
2470 /* non-zero errflags implies deferred out-of-range condition */
2471 assert(!(errflags & ~(LVf_NEG_OFF|LVf_OUT_OF_RANGE)));
2472 sv_setuv(sv, errflags ? 0 : do_vecget(lsv, LvTARGOFF(sv), LvTARGLEN(sv)));
2473
2474 return 0;
2475}
2476
2477int
2478Perl_magic_setvec(pTHX_ SV *sv, MAGIC *mg)
2479{
2480 PERL_ARGS_ASSERT_MAGIC_SETVEC;
2481 PERL_UNUSED_ARG(mg);
2482 do_vecset(sv); /* XXX slurp this routine */
2483 return 0;
2484}
2485
2486SV *
2487Perl_defelem_target(pTHX_ SV *sv, MAGIC *mg)
2488{
2489 SV *targ = NULL;
2490 PERL_ARGS_ASSERT_DEFELEM_TARGET;
2491 if (!mg) mg = mg_find(sv, PERL_MAGIC_defelem);
2492 assert(mg);
2493 if (LvTARGLEN(sv)) {
2494 if (mg->mg_obj) {
2495 SV * const ahv = LvTARG(sv);
2496 HE * const he = hv_fetch_ent(MUTABLE_HV(ahv), mg->mg_obj, FALSE, 0);
2497 if (he)
2498 targ = HeVAL(he);
2499 }
2500 else if (LvSTARGOFF(sv) >= 0) {
2501 AV *const av = MUTABLE_AV(LvTARG(sv));
2502 if (LvSTARGOFF(sv) <= AvFILL(av))
2503 {
2504 if (SvRMAGICAL(av)) {
2505 SV * const * const svp = av_fetch(av, LvSTARGOFF(sv), 0);
2506 targ = svp ? *svp : NULL;
2507 }
2508 else
2509 targ = AvARRAY(av)[LvSTARGOFF(sv)];
2510 }
2511 }
2512 if (targ && (targ != &PL_sv_undef)) {
2513 /* somebody else defined it for us */
2514 SvREFCNT_dec(LvTARG(sv));
2515 LvTARG(sv) = SvREFCNT_inc_simple_NN(targ);
2516 LvTARGLEN(sv) = 0;
2517 SvREFCNT_dec(mg->mg_obj);
2518 mg->mg_obj = NULL;
2519 mg->mg_flags &= ~MGf_REFCOUNTED;
2520 }
2521 return targ;
2522 }
2523 else
2524 return LvTARG(sv);
2525}
2526
2527int
2528Perl_magic_getdefelem(pTHX_ SV *sv, MAGIC *mg)
2529{
2530 PERL_ARGS_ASSERT_MAGIC_GETDEFELEM;
2531
2532 sv_setsv(sv, defelem_target(sv, mg));
2533 return 0;
2534}
2535
2536int
2537Perl_magic_setdefelem(pTHX_ SV *sv, MAGIC *mg)
2538{
2539 PERL_ARGS_ASSERT_MAGIC_SETDEFELEM;
2540 PERL_UNUSED_ARG(mg);
2541 if (LvTARGLEN(sv))
2542 vivify_defelem(sv);
2543 if (LvTARG(sv)) {
2544 sv_setsv(LvTARG(sv), sv);
2545 SvSETMAGIC(LvTARG(sv));
2546 }
2547 return 0;
2548}
2549
2550void
2551Perl_vivify_defelem(pTHX_ SV *sv)
2552{
2553 MAGIC *mg;
2554 SV *value = NULL;
2555
2556 PERL_ARGS_ASSERT_VIVIFY_DEFELEM;
2557
2558 if (!LvTARGLEN(sv) || !(mg = mg_find(sv, PERL_MAGIC_defelem)))
2559 return;
2560 if (mg->mg_obj) {
2561 SV * const ahv = LvTARG(sv);
2562 HE * const he = hv_fetch_ent(MUTABLE_HV(ahv), mg->mg_obj, TRUE, 0);
2563 if (he)
2564 value = HeVAL(he);
2565 if (!value || value == &PL_sv_undef)
2566 Perl_croak(aTHX_ PL_no_helem_sv, SVfARG(mg->mg_obj));
2567 }
2568 else if (LvSTARGOFF(sv) < 0)
2569 Perl_croak(aTHX_ PL_no_aelem, LvSTARGOFF(sv));
2570 else {
2571 AV *const av = MUTABLE_AV(LvTARG(sv));
2572 if ((I32)LvTARGLEN(sv) < 0 && LvSTARGOFF(sv) > AvFILL(av))
2573 LvTARG(sv) = NULL; /* array can't be extended */
2574 else {
2575 SV* const * const svp = av_fetch(av, LvSTARGOFF(sv), TRUE);
2576 if (!svp || !(value = *svp))
2577 Perl_croak(aTHX_ PL_no_aelem, LvSTARGOFF(sv));
2578 }
2579 }
2580 SvREFCNT_inc_simple_void(value);
2581 SvREFCNT_dec(LvTARG(sv));
2582 LvTARG(sv) = value;
2583 LvTARGLEN(sv) = 0;
2584 SvREFCNT_dec(mg->mg_obj);
2585 mg->mg_obj = NULL;
2586 mg->mg_flags &= ~MGf_REFCOUNTED;
2587}
2588
2589int
2590Perl_magic_setnonelem(pTHX_ SV *sv, MAGIC *mg)
2591{
2592 PERL_ARGS_ASSERT_MAGIC_SETNONELEM;
2593 PERL_UNUSED_ARG(mg);
2594 sv_unmagic(sv, PERL_MAGIC_nonelem);
2595 return 0;
2596}
2597
2598int
2599Perl_magic_killbackrefs(pTHX_ SV *sv, MAGIC *mg)
2600{
2601 PERL_ARGS_ASSERT_MAGIC_KILLBACKREFS;
2602 Perl_sv_kill_backrefs(aTHX_ sv, MUTABLE_AV(mg->mg_obj));
2603 return 0;
2604}
2605
2606int
2607Perl_magic_setmglob(pTHX_ SV *sv, MAGIC *mg)
2608{
2609 PERL_ARGS_ASSERT_MAGIC_SETMGLOB;
2610 PERL_UNUSED_CONTEXT;
2611 PERL_UNUSED_ARG(sv);
2612 mg->mg_len = -1;
2613 return 0;
2614}
2615
2616
2617int
2618Perl_magic_freemglob(pTHX_ SV *sv, MAGIC *mg)
2619{
2620 PERL_ARGS_ASSERT_MAGIC_FREEMGLOB;
2621 PERL_UNUSED_ARG(sv);
2622
2623 /* pos() magic uses mg_len as a string position rather than a buffer
2624 * length, and mg_ptr is currently unused, so skip freeing.
2625 */
2626 assert(mg->mg_type == PERL_MAGIC_regex_global && mg->mg_len >= -1);
2627 mg->mg_ptr = NULL;
2628 return 0;
2629}
2630
2631
2632int
2633Perl_magic_setuvar(pTHX_ SV *sv, MAGIC *mg)
2634{
2635 const struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
2636
2637 PERL_ARGS_ASSERT_MAGIC_SETUVAR;
2638
2639 if (uf && uf->uf_set)
2640 (*uf->uf_set)(aTHX_ uf->uf_index, sv);
2641 return 0;
2642}
2643
2644int
2645Perl_magic_setregexp(pTHX_ SV *sv, MAGIC *mg)
2646{
2647 const char type = mg->mg_type;
2648
2649 PERL_ARGS_ASSERT_MAGIC_SETREGEXP;
2650
2651 assert( type == PERL_MAGIC_fm
2652 || type == PERL_MAGIC_qr
2653 || type == PERL_MAGIC_bm);
2654 return sv_unmagic(sv, type);
2655}
2656
2657#ifdef USE_LOCALE_COLLATE
2658int
2659Perl_magic_setcollxfrm(pTHX_ SV *sv, MAGIC *mg)
2660{
2661 PERL_ARGS_ASSERT_MAGIC_SETCOLLXFRM;
2662
2663 /*
2664 * RenE<eacute> Descartes said "I think not."
2665 * and vanished with a faint plop.
2666 */
2667 PERL_UNUSED_CONTEXT;
2668 PERL_UNUSED_ARG(sv);
2669 if (mg->mg_ptr) {
2670 Safefree(mg->mg_ptr);
2671 mg->mg_ptr = NULL;
2672 mg->mg_len = -1;
2673 }
2674 return 0;
2675}
2676
2677int
2678Perl_magic_freecollxfrm(pTHX_ SV *sv, MAGIC *mg)
2679{
2680 PERL_ARGS_ASSERT_MAGIC_FREECOLLXFRM;
2681 PERL_UNUSED_ARG(sv);
2682
2683 /* Collate magic uses mg_len as a string length rather than a buffer
2684 * length, so we need to free even with mg_len == 0: hence we can't
2685 * rely on standard magic free handling */
2686 if (mg->mg_len >= 0) {
2687 assert(mg->mg_type == PERL_MAGIC_collxfrm);
2688 Safefree(mg->mg_ptr);
2689 mg->mg_ptr = NULL;
2690 }
2691
2692 return 0;
2693}
2694#endif /* USE_LOCALE_COLLATE */
2695
2696/* Just clear the UTF-8 cache data. */
2697int
2698Perl_magic_setutf8(pTHX_ SV *sv, MAGIC *mg)
2699{
2700 PERL_ARGS_ASSERT_MAGIC_SETUTF8;
2701 PERL_UNUSED_CONTEXT;
2702 PERL_UNUSED_ARG(sv);
2703 Safefree(mg->mg_ptr); /* The mg_ptr holds the pos cache. */
2704 mg->mg_ptr = NULL;
2705 mg->mg_len = -1; /* The mg_len holds the len cache. */
2706 return 0;
2707}
2708
2709int
2710Perl_magic_freeutf8(pTHX_ SV *sv, MAGIC *mg)
2711{
2712 PERL_ARGS_ASSERT_MAGIC_FREEUTF8;
2713 PERL_UNUSED_ARG(sv);
2714
2715 /* utf8 magic uses mg_len as a string length rather than a buffer
2716 * length, so we need to free even with mg_len == 0: hence we can't
2717 * rely on standard magic free handling */
2718 assert(mg->mg_type == PERL_MAGIC_utf8 && mg->mg_len >= -1);
2719 Safefree(mg->mg_ptr);
2720 mg->mg_ptr = NULL;
2721 return 0;
2722}
2723
2724
2725int
2726Perl_magic_setlvref(pTHX_ SV *sv, MAGIC *mg)
2727{
2728 const char *bad = NULL;
2729 PERL_ARGS_ASSERT_MAGIC_SETLVREF;
2730 if (!SvROK(sv)) Perl_croak(aTHX_ "Assigned value is not a reference");
2731 switch (mg->mg_private & OPpLVREF_TYPE) {
2732 case OPpLVREF_SV:
2733 if (SvTYPE(SvRV(sv)) > SVt_PVLV)
2734 bad = " SCALAR";
2735 break;
2736 case OPpLVREF_AV:
2737 if (SvTYPE(SvRV(sv)) != SVt_PVAV)
2738 bad = "n ARRAY";
2739 break;
2740 case OPpLVREF_HV:
2741 if (SvTYPE(SvRV(sv)) != SVt_PVHV)
2742 bad = " HASH";
2743 break;
2744 case OPpLVREF_CV:
2745 if (SvTYPE(SvRV(sv)) != SVt_PVCV)
2746 bad = " CODE";
2747 }
2748 if (bad)
2749 /* diag_listed_as: Assigned value is not %s reference */
2750 Perl_croak(aTHX_ "Assigned value is not a%s reference", bad);
2751 switch (mg->mg_obj ? SvTYPE(mg->mg_obj) : 0) {
2752 case 0:
2753 {
2754 SV * const old = PAD_SV(mg->mg_len);
2755 PAD_SETSV(mg->mg_len, SvREFCNT_inc_NN(SvRV(sv)));
2756 SvREFCNT_dec(old);
2757 break;
2758 }
2759 case SVt_PVGV:
2760 gv_setref(mg->mg_obj, sv);
2761 SvSETMAGIC(mg->mg_obj);
2762 break;
2763 case SVt_PVAV:
2764 av_store((AV *)mg->mg_obj, SvIV((SV *)mg->mg_ptr),
2765 SvREFCNT_inc_simple_NN(SvRV(sv)));
2766 break;
2767 case SVt_PVHV:
2768 (void)hv_store_ent((HV *)mg->mg_obj, (SV *)mg->mg_ptr,
2769 SvREFCNT_inc_simple_NN(SvRV(sv)), 0);
2770 }
2771 if (mg->mg_flags & MGf_PERSIST)
2772 NOOP; /* This sv is in use as an iterator var and will be reused,
2773 so we must leave the magic. */
2774 else
2775 /* This sv could be returned by the assignment op, so clear the
2776 magic, as lvrefs are an implementation detail that must not be
2777 leaked to the user. */
2778 sv_unmagic(sv, PERL_MAGIC_lvref);
2779 return 0;
2780}
2781
2782static void
2783S_set_dollarzero(pTHX_ SV *sv)
2784 PERL_TSA_REQUIRES(PL_dollarzero_mutex)
2785{
2786 const char *s;
2787 STRLEN len;
2788#ifdef HAS_SETPROCTITLE
2789 /* The BSDs don't show the argv[] in ps(1) output, they
2790 * show a string from the process struct and provide
2791 * the setproctitle() routine to manipulate that. */
2792 if (PL_origalen != 1) {
2793 s = SvPV_const(sv, len);
2794# if __FreeBSD_version > 410001 || defined(__DragonFly__)
2795 /* The leading "-" removes the "perl: " prefix,
2796 * but not the "(perl) suffix from the ps(1)
2797 * output, because that's what ps(1) shows if the
2798 * argv[] is modified. */
2799 setproctitle("-%s", s);
2800# else /* old FreeBSDs, NetBSD, OpenBSD, anyBSD */
2801 /* This doesn't really work if you assume that
2802 * $0 = 'foobar'; will wipe out 'perl' from the $0
2803 * because in ps(1) output the result will be like
2804 * sprintf("perl: %s (perl)", s)
2805 * I guess this is a security feature:
2806 * one (a user process) cannot get rid of the original name.
2807 * --jhi */
2808 setproctitle("%s", s);
2809# endif
2810 }
2811#elif defined(__hpux) && defined(PSTAT_SETCMD)
2812 if (PL_origalen != 1) {
2813 union pstun un;
2814 s = SvPV_const(sv, len);
2815 un.pst_command = (char *)s;
2816 pstat(PSTAT_SETCMD, un, len, 0, 0);
2817 }
2818#else
2819 if (PL_origalen > 1) {
2820 I32 i;
2821 /* PL_origalen is set in perl_parse(). */
2822 s = SvPV_force(sv,len);
2823 if (len >= (STRLEN)PL_origalen-1) {
2824 /* Longer than original, will be truncated. We assume that
2825 * PL_origalen bytes are available. */
2826 Copy(s, PL_origargv[0], PL_origalen-1, char);
2827 }
2828 else {
2829 /* Shorter than original, will be padded. */
2830#ifdef PERL_DARWIN
2831 /* Special case for Mac OS X: see [perl #38868] */
2832 const int pad = 0;
2833#else
2834 /* Is the space counterintuitive? Yes.
2835 * (You were expecting \0?)
2836 * Does it work? Seems to. (In Linux 2.4.20 at least.)
2837 * --jhi */
2838 const int pad = ' ';
2839#endif
2840 Copy(s, PL_origargv[0], len, char);
2841 PL_origargv[0][len] = 0;
2842 memset(PL_origargv[0] + len + 1,
2843 pad, PL_origalen - len - 1);
2844 }
2845 PL_origargv[0][PL_origalen-1] = 0;
2846 for (i = 1; i < PL_origargc; i++)
2847 PL_origargv[i] = 0;
2848#ifdef HAS_PRCTL_SET_NAME
2849 /* Set the legacy process name in addition to the POSIX name on Linux */
2850 if (prctl(PR_SET_NAME, (unsigned long)s, 0, 0, 0) != 0) {
2851 /* diag_listed_as: SKIPME */
2852 Perl_croak(aTHX_ "Can't set $0 with prctl(): %s", Strerror(errno));
2853 }
2854#endif
2855 }
2856#endif
2857}
2858
2859int
2860Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
2861{
2862 I32 paren;
2863 const REGEXP * rx;
2864 I32 i;
2865 STRLEN len;
2866 MAGIC *tmg;
2867
2868 PERL_ARGS_ASSERT_MAGIC_SET;
2869
2870 if (!mg->mg_ptr) {
2871 paren = mg->mg_len;
2872 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
2873 setparen_got_rx:
2874 CALLREG_NUMBUF_STORE((REGEXP *)rx,paren,sv);
2875 } else {
2876 /* Croak with a READONLY error when a numbered match var is
2877 * set without a previous pattern match. Unless it's C<local $1>
2878 */
2879 croakparen:
2880 if (!PL_localizing) {
2881 Perl_croak_no_modify();
2882 }
2883 }
2884 return 0;
2885 }
2886
2887 switch (*mg->mg_ptr) {
2888 case '\001': /* ^A */
2889 if (SvOK(sv)) sv_copypv(PL_bodytarget, sv);
2890 else SvOK_off(PL_bodytarget);
2891 FmLINES(PL_bodytarget) = 0;
2892 if (SvPOK(PL_bodytarget)) {
2893 char *s = SvPVX(PL_bodytarget);
2894 char *e = SvEND(PL_bodytarget);
2895 while ( ((s = (char *) memchr(s, '\n', e - s))) ) {
2896 FmLINES(PL_bodytarget)++;
2897 s++;
2898 }
2899 }
2900 /* mg_set() has temporarily made sv non-magical */
2901 if (TAINTING_get) {
2902 if ((tmg = mg_find(sv,PERL_MAGIC_taint)) && tmg->mg_len & 1)
2903 SvTAINTED_on(PL_bodytarget);
2904 else
2905 SvTAINTED_off(PL_bodytarget);
2906 }
2907 break;
2908 case '\003': /* ^C */
2909 PL_minus_c = cBOOL(SvIV(sv));
2910 break;
2911
2912 case '\004': /* ^D */
2913#ifdef DEBUGGING
2914 {
2915 const char *s = SvPV_nolen_const(sv);
2916 PL_debug = get_debug_opts(&s, 0) | DEBUG_TOP_FLAG;
2917 if (DEBUG_x_TEST || DEBUG_B_TEST)
2918 dump_all_perl(!DEBUG_B_TEST);
2919 }
2920#else
2921 PL_debug = (SvIV(sv)) | DEBUG_TOP_FLAG;
2922#endif
2923 break;
2924 case '\005': /* ^E */
2925 if (*(mg->mg_ptr+1) == '\0') {
2926#ifdef VMS
2927 set_vaxc_errno(SvIV(sv));
2928#elif defined(WIN32)
2929 SetLastError( SvIV(sv) );
2930#elif defined(OS2)
2931 os2_setsyserrno(SvIV(sv));
2932#else
2933 /* will anyone ever use this? */
2934 SETERRNO(SvIV(sv), 4);
2935#endif
2936 }
2937 else if (strEQ(mg->mg_ptr + 1, "NCODING") && SvOK(sv))
2938 Perl_croak(aTHX_ "${^ENCODING} is no longer supported");
2939 break;
2940 case '\006': /* ^F */
2941 if (mg->mg_ptr[1] == '\0') {
2942 PL_maxsysfd = SvIV(sv);
2943 }
2944 break;
2945 case '\010': /* ^H */
2946 {
2947 U32 save_hints = PL_hints;
2948 PL_hints = SvUV(sv);
2949
2950 /* If wasn't UTF-8, and now is, notify the parser */
2951 if ((PL_hints & HINT_UTF8) && ! (save_hints & HINT_UTF8)) {
2952 notify_parser_that_changed_to_utf8();
2953 }
2954 }
2955 break;
2956 case '\011': /* ^I */ /* NOT \t in EBCDIC */
2957 Safefree(PL_inplace);
2958 PL_inplace = SvOK(sv) ? savesvpv(sv) : NULL;
2959 break;
2960 case '\016': /* ^N */
2961 if (PL_curpm && (rx = PM_GETRE(PL_curpm))
2962 && (paren = RX_LASTCLOSEPAREN(rx))) goto setparen_got_rx;
2963 goto croakparen;
2964 case '\017': /* ^O */
2965 if (*(mg->mg_ptr+1) == '\0') {
2966 Safefree(PL_osname);
2967 PL_osname = NULL;
2968 if (SvOK(sv)) {
2969 TAINT_PROPER("assigning to $^O");
2970 PL_osname = savesvpv(sv);
2971 }
2972 }
2973 else if (strEQ(mg->mg_ptr, "\017PEN")) {
2974 STRLEN len;
2975 const char *const start = SvPV(sv, len);
2976 const char *out = (const char*)memchr(start, '\0', len);
2977 SV *tmp;
2978
2979
2980 PL_compiling.cop_hints |= HINT_LEXICAL_IO_IN | HINT_LEXICAL_IO_OUT;
2981 PL_hints |= HINT_LEXICAL_IO_IN | HINT_LEXICAL_IO_OUT;
2982
2983 /* Opening for input is more common than opening for output, so
2984 ensure that hints for input are sooner on linked list. */
2985 tmp = out ? newSVpvn_flags(out + 1, start + len - out - 1,
2986 SvUTF8(sv))
2987 : newSVpvs_flags("", SvUTF8(sv));
2988 (void)hv_stores(GvHV(PL_hintgv), "open>", tmp);
2989 mg_set(tmp);
2990
2991 tmp = newSVpvn_flags(start, out ? (STRLEN)(out - start) : len,
2992 SvUTF8(sv));
2993 (void)hv_stores(GvHV(PL_hintgv), "open<", tmp);
2994 mg_set(tmp);
2995 }
2996 break;
2997 case '\020': /* ^P */
2998 PL_perldb = SvIV(sv);
2999 if (PL_perldb && !PL_DBsingle)
3000 init_debugger();
3001 break;
3002 case '\024': /* ^T */
3003#ifdef BIG_TIME
3004 PL_basetime = (Time_t)(SvNOK(sv) ? SvNVX(sv) : sv_2nv(sv));
3005#else
3006 PL_basetime = (Time_t)SvIV(sv);
3007#endif
3008 break;
3009 case '\025': /* ^UTF8CACHE */
3010 if (strEQ(mg->mg_ptr+1, "TF8CACHE")) {
3011 PL_utf8cache = (signed char) sv_2iv(sv);
3012 }
3013 break;
3014 case '\027': /* ^W & $^WARNING_BITS */
3015 if (*(mg->mg_ptr+1) == '\0') {
3016 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
3017 i = SvIV(sv);
3018 PL_dowarn = (PL_dowarn & ~G_WARN_ON)
3019 | (i ? G_WARN_ON : G_WARN_OFF) ;
3020 }
3021 }
3022 else if (strEQ(mg->mg_ptr+1, "ARNING_BITS")) {
3023 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
3024 if (!SvPOK(sv)) {
3025 free_and_set_cop_warnings(&PL_compiling, pWARN_STD);
3026 break;
3027 }
3028 {
3029 STRLEN len, i;
3030 int not_none = 0, not_all = 0;
3031 const U8 * const ptr = (const U8 *)SvPV_const(sv, len) ;
3032 for (i = 0 ; i < len ; ++i) {
3033 not_none |= ptr[i];
3034 not_all |= ptr[i] ^ 0x55;
3035 }
3036 if (!not_none) {
3037 free_and_set_cop_warnings(&PL_compiling, pWARN_NONE);
3038 } else if (len >= WARNsize && !not_all) {
3039 free_and_set_cop_warnings(&PL_compiling, pWARN_ALL);
3040 PL_dowarn |= G_WARN_ONCE ;
3041 }
3042 else {
3043 STRLEN len;
3044 const char *const p = SvPV_const(sv, len);
3045
3046 free_and_set_cop_warnings(
3047 &PL_compiling,
3048 Perl_new_warnings_bitfield(aTHX_ PL_compiling.cop_warnings,
3049 p, len)
3050 );
3051
3052 if (isWARN_on(PL_compiling.cop_warnings, WARN_ONCE))
3053 PL_dowarn |= G_WARN_ONCE ;
3054 }
3055 }
3056 }
3057 }
3058 break;
3059 case '.':
3060 if (PL_localizing) {
3061 if (PL_localizing == 1)
3062 SAVESPTR(PL_last_in_gv);
3063 }
3064 else if (SvOK(sv) && GvIO(PL_last_in_gv))
3065 IoLINES(GvIOp(PL_last_in_gv)) = SvIV(sv);
3066 break;
3067 case '^':
3068 Safefree(IoTOP_NAME(GvIOp(PL_defoutgv)));
3069 IoTOP_NAME(GvIOp(PL_defoutgv)) = savesvpv(sv);
3070 IoTOP_GV(GvIOp(PL_defoutgv)) = gv_fetchsv(sv, GV_ADD, SVt_PVIO);
3071 break;
3072 case '~':
3073 Safefree(IoFMT_NAME(GvIOp(PL_defoutgv)));
3074 IoFMT_NAME(GvIOp(PL_defoutgv)) = savesvpv(sv);
3075 IoFMT_GV(GvIOp(PL_defoutgv)) = gv_fetchsv(sv, GV_ADD, SVt_PVIO);
3076 break;
3077 case '=':
3078 IoPAGE_LEN(GvIOp(PL_defoutgv)) = (SvIV(sv));
3079 break;
3080 case '-':
3081 IoLINES_LEFT(GvIOp(PL_defoutgv)) = (SvIV(sv));
3082 if (IoLINES_LEFT(GvIOp(PL_defoutgv)) < 0L)
3083 IoLINES_LEFT(GvIOp(PL_defoutgv)) = 0L;
3084 break;
3085 case '%':
3086 IoPAGE(GvIOp(PL_defoutgv)) = (SvIV(sv));
3087 break;
3088 case '|':
3089 {
3090 IO * const io = GvIO(PL_defoutgv);
3091 if(!io)
3092 break;
3093 if ((SvIV(sv)) == 0)
3094 IoFLAGS(io) &= ~IOf_FLUSH;
3095 else {
3096 if (!(IoFLAGS(io) & IOf_FLUSH)) {
3097 PerlIO *ofp = IoOFP(io);
3098 if (ofp)
3099 (void)PerlIO_flush(ofp);
3100 IoFLAGS(io) |= IOf_FLUSH;
3101 }
3102 }
3103 }
3104 break;
3105 case '/':
3106 {
3107 if (SvROK(sv)) {
3108 SV *referent = SvRV(sv);
3109 const char *reftype = sv_reftype(referent, 0);
3110 /* XXX: dodgy type check: This leaves me feeling dirty, but
3111 * the alternative is to copy pretty much the entire
3112 * sv_reftype() into this routine, or to do a full string
3113 * comparison on the return of sv_reftype() both of which
3114 * make me feel worse! NOTE, do not modify this comment
3115 * without reviewing the corresponding comment in
3116 * sv_reftype(). - Yves */
3117 if (reftype[0] == 'S' || reftype[0] == 'L') {
3118 IV val = SvIV(referent);
3119 if (val <= 0) {
3120 sv_setsv(sv, PL_rs);
3121 Perl_croak(aTHX_ "Setting $/ to a reference to %s is forbidden",
3122 val < 0 ? "a negative integer" : "zero");
3123 }
3124 } else {
3125 sv_setsv(sv, PL_rs);
3126 /* diag_listed_as: Setting $/ to %s reference is forbidden */
3127 Perl_croak(aTHX_ "Setting $/ to a%s %s reference is forbidden",
3128 *reftype == 'A' ? "n" : "", reftype);
3129 }
3130 }
3131 SvREFCNT_dec(PL_rs);
3132 PL_rs = newSVsv(sv);
3133 }
3134 break;
3135 case '\\':
3136 SvREFCNT_dec(PL_ors_sv);
3137 if (SvOK(sv)) {
3138 PL_ors_sv = newSVsv(sv);
3139 }
3140 else {
3141 PL_ors_sv = NULL;
3142 }
3143 break;
3144 case '[':
3145 if (SvIV(sv) != 0)
3146 Perl_croak(aTHX_ "Assigning non-zero to $[ is no longer possible");
3147 break;
3148 case '?':
3149#ifdef COMPLEX_STATUS
3150 if (PL_localizing == 2) {
3151 SvUPGRADE(sv, SVt_PVLV);
3152 PL_statusvalue = LvTARGOFF(sv);
3153 PL_statusvalue_vms = LvTARGLEN(sv);
3154 }
3155 else
3156#endif
3157#ifdef VMSISH_STATUS
3158 if (VMSISH_STATUS)
3159 STATUS_NATIVE_CHILD_SET((U32)SvIV(sv));
3160 else
3161#endif
3162 STATUS_UNIX_EXIT_SET(SvIV(sv));
3163 break;
3164 case '!':
3165 {
3166#ifdef VMS
3167# define PERL_VMS_BANG vaxc$errno
3168#else
3169# define PERL_VMS_BANG 0
3170#endif
3171#if defined(WIN32)
3172 SETERRNO(win32_get_errno(SvIOK(sv) ? SvIVX(sv) : SvOK(sv) ? sv_2iv(sv) : 0),
3173 (SvIV(sv) == EVMSERR) ? 4 : PERL_VMS_BANG);
3174#else
3175 SETERRNO(SvIOK(sv) ? SvIVX(sv) : SvOK(sv) ? sv_2iv(sv) : 0,
3176 (SvIV(sv) == EVMSERR) ? 4 : PERL_VMS_BANG);
3177#endif
3178 }
3179 break;
3180 case '<':
3181 {
3182 /* XXX $< currently silently ignores failures */
3183 const Uid_t new_uid = SvUID(sv);
3184 PL_delaymagic_uid = new_uid;
3185 if (PL_delaymagic) {
3186 PL_delaymagic |= DM_RUID;
3187 break; /* don't do magic till later */
3188 }
3189#ifdef HAS_SETRUID
3190 PERL_UNUSED_RESULT(setruid(new_uid));
3191#elif defined(HAS_SETREUID)
3192 PERL_UNUSED_RESULT(setreuid(new_uid, (Uid_t)-1));
3193#elif defined(HAS_SETRESUID)
3194 PERL_UNUSED_RESULT(setresuid(new_uid, (Uid_t)-1, (Uid_t)-1));
3195#else
3196 if (new_uid == PerlProc_geteuid()) { /* special case $< = $> */
3197# ifdef PERL_DARWIN
3198 /* workaround for Darwin's setuid peculiarity, cf [perl #24122] */
3199 if (new_uid != 0 && PerlProc_getuid() == 0)
3200 PERL_UNUSED_RESULT(PerlProc_setuid(0));
3201# endif
3202 PERL_UNUSED_RESULT(PerlProc_setuid(new_uid));
3203 } else {
3204 Perl_croak(aTHX_ "setruid() not implemented");
3205 }
3206#endif
3207 break;
3208 }
3209 case '>':
3210 {
3211 /* XXX $> currently silently ignores failures */
3212 const Uid_t new_euid = SvUID(sv);
3213 PL_delaymagic_euid = new_euid;
3214 if (PL_delaymagic) {
3215 PL_delaymagic |= DM_EUID;
3216 break; /* don't do magic till later */
3217 }
3218#ifdef HAS_SETEUID
3219 PERL_UNUSED_RESULT(seteuid(new_euid));
3220#elif defined(HAS_SETREUID)
3221 PERL_UNUSED_RESULT(setreuid((Uid_t)-1, new_euid));
3222#elif defined(HAS_SETRESUID)
3223 PERL_UNUSED_RESULT(setresuid((Uid_t)-1, new_euid, (Uid_t)-1));
3224#else
3225 if (new_euid == PerlProc_getuid()) /* special case $> = $< */
3226 PERL_UNUSED_RESULT(PerlProc_setuid(new_euid));
3227 else {
3228 Perl_croak(aTHX_ "seteuid() not implemented");
3229 }
3230#endif
3231 break;
3232 }
3233 case '(':
3234 {
3235 /* XXX $( currently silently ignores failures */
3236 const Gid_t new_gid = SvGID(sv);
3237 PL_delaymagic_gid = new_gid;
3238 if (PL_delaymagic) {
3239 PL_delaymagic |= DM_RGID;
3240 break; /* don't do magic till later */
3241 }
3242#ifdef HAS_SETRGID
3243 PERL_UNUSED_RESULT(setrgid(new_gid));
3244#elif defined(HAS_SETREGID)
3245 PERL_UNUSED_RESULT(setregid(new_gid, (Gid_t)-1));
3246#elif defined(HAS_SETRESGID)
3247 PERL_UNUSED_RESULT(setresgid(new_gid, (Gid_t)-1, (Gid_t) -1));
3248#else
3249 if (new_gid == PerlProc_getegid()) /* special case $( = $) */
3250 PERL_UNUSED_RESULT(PerlProc_setgid(new_gid));
3251 else {
3252 Perl_croak(aTHX_ "setrgid() not implemented");
3253 }
3254#endif
3255 break;
3256 }
3257 case ')':
3258 {
3259/* (hv) best guess: maybe we'll need configure probes to do a better job,
3260 * but you can override it if you need to.
3261 */
3262#ifndef INVALID_GID
3263#define INVALID_GID ((Gid_t)-1)
3264#endif
3265 /* XXX $) currently silently ignores failures */
3266 Gid_t new_egid;
3267#ifdef HAS_SETGROUPS
3268 {
3269 const char *p = SvPV_const(sv, len);
3270 Groups_t *gary = NULL;
3271 const char* p_end = p + len;
3272 const char* endptr = p_end;
3273 UV uv;
3274#ifdef _SC_NGROUPS_MAX
3275 int maxgrp = sysconf(_SC_NGROUPS_MAX);
3276
3277 if (maxgrp < 0)
3278 maxgrp = NGROUPS;
3279#else
3280 int maxgrp = NGROUPS;
3281#endif
3282
3283 while (isSPACE(*p))
3284 ++p;
3285 if (grok_atoUV(p, &uv, &endptr))
3286 new_egid = (Gid_t)uv;
3287 else {
3288 new_egid = INVALID_GID;
3289 endptr = NULL;
3290 }
3291 for (i = 0; i < maxgrp; ++i) {
3292 if (endptr == NULL)
3293 break;
3294 p = endptr;
3295 endptr = p_end;
3296 while (isSPACE(*p))
3297 ++p;
3298 if (!*p)
3299 break;
3300 if (!gary)
3301 Newx(gary, i + 1, Groups_t);
3302 else
3303 Renew(gary, i + 1, Groups_t);
3304 if (grok_atoUV(p, &uv, &endptr))
3305 gary[i] = (Groups_t)uv;
3306 else {
3307 gary[i] = INVALID_GID;
3308 endptr = NULL;
3309 }
3310 }
3311 if (i)
3312 PERL_UNUSED_RESULT(setgroups(i, gary));
3313 Safefree(gary);
3314 }
3315#else /* HAS_SETGROUPS */
3316 new_egid = SvGID(sv);
3317#endif /* HAS_SETGROUPS */
3318 PL_delaymagic_egid = new_egid;
3319 if (PL_delaymagic) {
3320 PL_delaymagic |= DM_EGID;
3321 break; /* don't do magic till later */
3322 }
3323#ifdef HAS_SETEGID
3324 PERL_UNUSED_RESULT(setegid(new_egid));
3325#elif defined(HAS_SETREGID)
3326 PERL_UNUSED_RESULT(setregid((Gid_t)-1, new_egid));
3327#elif defined(HAS_SETRESGID)
3328 PERL_UNUSED_RESULT(setresgid((Gid_t)-1, new_egid, (Gid_t)-1));
3329#else
3330 if (new_egid == PerlProc_getgid()) /* special case $) = $( */
3331 PERL_UNUSED_RESULT(PerlProc_setgid(new_egid));
3332 else {
3333 Perl_croak(aTHX_ "setegid() not implemented");
3334 }
3335#endif
3336 break;
3337 }
3338 case ':':
3339 PL_chopset = SvPV_force(sv,len);
3340 break;
3341 case '$': /* $$ */
3342 /* Store the pid in mg->mg_obj so we can tell when a fork has
3343 occurred. mg->mg_obj points to *$ by default, so clear it. */
3344 if (isGV(mg->mg_obj)) {
3345 if (mg->mg_flags & MGf_REFCOUNTED) /* probably never true */
3346 SvREFCNT_dec(mg->mg_obj);
3347 mg->mg_flags |= MGf_REFCOUNTED;
3348 mg->mg_obj = newSViv((IV)PerlProc_getpid());
3349 }
3350 else sv_setiv(mg->mg_obj, (IV)PerlProc_getpid());
3351 break;
3352 case '0':
3353 if (!sv_utf8_downgrade(sv, /* fail_ok */ TRUE)) {
3354
3355 /* Since we are going to set the string's UTF8-encoded form
3356 as the process name we should update $0 itself to contain
3357 that same (UTF8-encoded) value. */
3358 sv_utf8_encode(GvSV(mg->mg_obj));
3359
3360 Perl_ck_warner_d(aTHX_ packWARN(WARN_UTF8), "Wide character in %s", "$0");
3361 }
3362
3363 LOCK_DOLLARZERO_MUTEX;
3364 S_set_dollarzero(aTHX_ sv);
3365 UNLOCK_DOLLARZERO_MUTEX;
3366 break;
3367 }
3368 return 0;
3369}
3370
3371/*
3372=for apidoc_section $signals
3373=for apidoc whichsig
3374=for apidoc_item whichsig_pv
3375=for apidoc_item whichsig_pvn
3376=for apidoc_item whichsig_sv
3377
3378These all convert a signal name into its corresponding signal number;
3379returning -1 if no corresponding number was found.
3380
3381They differ only in the source of the signal name:
3382
3383C<whichsig_pv> takes the name from the C<NUL>-terminated string starting at
3384C<sig>.
3385
3386C<whichsig> is merely a different spelling, a synonym, of C<whichsig_pv>.
3387
3388C<whichsig_pvn> takes the name from the string starting at C<sig>, with length
3389C<len> bytes.
3390
3391C<whichsig_sv> takes the name from the PV stored in the SV C<sigsv>.
3392
3393=cut
3394*/
3395
3396I32
3397Perl_whichsig_sv(pTHX_ SV *sigsv)
3398{
3399 const char *sigpv;
3400 STRLEN siglen;
3401 PERL_ARGS_ASSERT_WHICHSIG_SV;
3402 sigpv = SvPV_const(sigsv, siglen);
3403 return whichsig_pvn(sigpv, siglen);
3404}
3405
3406I32
3407Perl_whichsig_pv(pTHX_ const char *sig)
3408{
3409 PERL_ARGS_ASSERT_WHICHSIG_PV;
3410 return whichsig_pvn(sig, strlen(sig));
3411}
3412
3413I32
3414Perl_whichsig_pvn(pTHX_ const char *sig, STRLEN len)
3415{
3416 char* const* sigv;
3417
3418 PERL_ARGS_ASSERT_WHICHSIG_PVN;
3419 PERL_UNUSED_CONTEXT;
3420
3421 for (sigv = (char* const*)PL_sig_name; *sigv; sigv++)
3422 if (strlen(*sigv) == len && memEQ(sig,*sigv, len))
3423 return PL_sig_num[sigv - (char* const*)PL_sig_name];
3424#ifdef SIGCLD
3425 if (memEQs(sig, len, "CHLD"))
3426 return SIGCLD;
3427#endif
3428#ifdef SIGCHLD
3429 if (memEQs(sig, len, "CLD"))
3430 return SIGCHLD;
3431#endif
3432 return -1;
3433}
3434
3435
3436/* Perl_sighandler(), Perl_sighandler1(), Perl_sighandler3():
3437 * these three function are intended to be called by the OS as 'C' level
3438 * signal handler functions in the case where unsafe signals are being
3439 * used - i.e. they immediately invoke Perl_perly_sighandler() to call the
3440 * perl-level sighandler, rather than deferring.
3441 * In fact, the core itself will normally use Perl_csighandler as the
3442 * OS-level handler; that function will then decide whether to queue the
3443 * signal or call Perl_sighandler / Perl_perly_sighandler itself. So these
3444 * functions are more useful for e.g. POSIX.xs when it wants explicit
3445 * control of what's happening.
3446 */
3447
3448
3449#ifdef PERL_USE_3ARG_SIGHANDLER
3450
3451Signal_t
3452Perl_sighandler(int sig, Siginfo_t *sip, void *uap)
3453{
3454 Perl_perly_sighandler(sig, sip, uap, 0);
3455}
3456
3457#else
3458
3459Signal_t
3460Perl_sighandler(int sig)
3461{
3462 Perl_perly_sighandler(sig, NULL, NULL, 0);
3463}
3464
3465#endif
3466
3467Signal_t
3468Perl_sighandler1(int sig)
3469{
3470 Perl_perly_sighandler(sig, NULL, NULL, 0);
3471}
3472
3473Signal_t
3474Perl_sighandler3(int sig, Siginfo_t *sip PERL_UNUSED_DECL, void *uap PERL_UNUSED_DECL)
3475{
3476 Perl_perly_sighandler(sig, sip, uap, 0);
3477}
3478
3479
3480/* Invoke the perl-level signal handler. This function is called either
3481 * directly from one of the C-level signals handlers (Perl_sighandler or
3482 * Perl_csighandler), or for safe signals, later from
3483 * Perl_despatch_signals() at a suitable safe point during execution.
3484 *
3485 * 'safe' is a boolean indicating the latter call path.
3486 */
3487
3488Signal_t
3489Perl_perly_sighandler(int sig, Siginfo_t *sip PERL_UNUSED_DECL,
3490 void *uap PERL_UNUSED_DECL, bool safe)
3491{
3492#ifdef PERL_GET_SIG_CONTEXT
3493 dTHXa(PERL_GET_SIG_CONTEXT);
3494#else
3495 dTHX;
3496#endif
3497 dSP;
3498 GV *gv = NULL;
3499 SV *sv = NULL;
3500 SV * const tSv = PL_Sv;
3501 CV *cv = NULL;
3502 OP *myop = PL_op;
3503 U32 flags = 0;
3504 XPV * const tXpv = PL_Xpv;
3505 I32 old_ss_ix = PL_savestack_ix;
3506 SV *errsv_save = NULL;
3507
3508
3509 if (!PL_psig_ptr[sig]) {
3510 PerlIO_printf(Perl_error_log, "Signal SIG%s received, but no signal handler set.\n",
3511 PL_sig_name[sig]);
3512 exit(sig);
3513 }
3514
3515 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG) {
3516 /* Max number of items pushed there is 3*n or 4. We cannot fix
3517 infinity, so we fix 4 (in fact 5): */
3518 if (PL_savestack_ix + 15 <= PL_savestack_max) {
3519 flags |= 1;
3520 PL_savestack_ix += 5; /* Protect save in progress. */
3521 SAVEDESTRUCTOR_X(S_unwind_handler_stack, NULL);
3522 }
3523 }
3524 /* sv_2cv is too complicated, try a simpler variant first: */
3525 if (!SvROK(PL_psig_ptr[sig]) || !(cv = MUTABLE_CV(SvRV(PL_psig_ptr[sig])))
3526 || SvTYPE(cv) != SVt_PVCV) {
3527 HV *st;
3528 cv = sv_2cv(PL_psig_ptr[sig], &st, &gv, GV_ADD);
3529 }
3530
3531 if (!cv || !CvROOT(cv)) {
3532 const HEK * const hek = gv
3533 ? GvENAME_HEK(gv)
3534 : cv && CvNAMED(cv)
3535 ? CvNAME_HEK(cv)
3536 : cv && CvGV(cv) ? GvENAME_HEK(CvGV(cv)) : NULL;
3537 if (hek)
3538 Perl_ck_warner(aTHX_ packWARN(WARN_SIGNAL),
3539 "SIG%s handler \"%" HEKf "\" not defined.\n",
3540 PL_sig_name[sig], HEKfARG(hek));
3541 /* diag_listed_as: SIG%s handler "%s" not defined */
3542 else Perl_ck_warner(aTHX_ packWARN(WARN_SIGNAL),
3543 "SIG%s handler \"__ANON__\" not defined.\n",
3544 PL_sig_name[sig]);
3545 goto cleanup;
3546 }
3547
3548 sv = PL_psig_name[sig]
3549 ? SvREFCNT_inc_NN(PL_psig_name[sig])
3550 : newSVpv(PL_sig_name[sig],0);
3551 flags |= 8;
3552 SAVEFREESV(sv);
3553
3554 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG) {
3555 /* make sure our assumption about the size of the SAVEs are correct:
3556 * 3 for SAVEDESTRUCTOR_X, 2 for SAVEFREESV */
3557 assert(old_ss_ix + 2 + ((flags & 1) ? 3+5 : 0) == PL_savestack_ix);
3558 }
3559
3560 PUSHSTACKi(PERLSI_SIGNAL);
3561 PUSHMARK(SP);
3562 PUSHs(sv);
3563
3564#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
3565 {
3566 struct sigaction oact;
3567
3568 if (sip && sigaction(sig, 0, &oact) == 0 && oact.sa_flags & SA_SIGINFO) {
3569 HV *sih = newHV();
3570 SV *rv = newRV_noinc(MUTABLE_SV(sih));
3571 /* The siginfo fields signo, code, errno, pid, uid,
3572 * addr, status, and band are defined by POSIX/SUSv3. */
3573 (void)hv_stores(sih, "signo", newSViv(sip->si_signo));
3574 (void)hv_stores(sih, "code", newSViv(sip->si_code));
3575# ifdef HAS_SIGINFO_SI_ERRNO
3576 (void)hv_stores(sih, "errno", newSViv(sip->si_errno));
3577# endif
3578# ifdef HAS_SIGINFO_SI_STATUS
3579 (void)hv_stores(sih, "status", newSViv(sip->si_status));
3580# endif
3581# ifdef HAS_SIGINFO_SI_UID
3582 {
3583 SV *uid = newSV(0);
3584 sv_setuid(uid, sip->si_uid);
3585 (void)hv_stores(sih, "uid", uid);
3586 }
3587# endif
3588# ifdef HAS_SIGINFO_SI_PID
3589 (void)hv_stores(sih, "pid", newSViv(sip->si_pid));
3590# endif
3591# ifdef HAS_SIGINFO_SI_ADDR
3592 (void)hv_stores(sih, "addr", newSVuv(PTR2UV(sip->si_addr)));
3593# endif
3594# ifdef HAS_SIGINFO_SI_BAND
3595 (void)hv_stores(sih, "band", newSViv(sip->si_band));
3596# endif
3597 EXTEND(SP, 2);
3598 PUSHs(rv);
3599 mPUSHp((char *)sip, sizeof(*sip));
3600
3601 }
3602 }
3603#endif
3604
3605 PUTBACK;
3606
3607 errsv_save = newSVsv(ERRSV);
3608
3609 call_sv(MUTABLE_SV(cv), G_DISCARD|G_EVAL);
3610
3611 POPSTACK;
3612 {
3613 SV * const errsv = ERRSV;
3614 if (SvTRUE_NN(errsv)) {
3615 SvREFCNT_dec(errsv_save);
3616
3617#ifndef PERL_MICRO
3618 /* Handler "died", for example to get out of a restart-able read().
3619 * Before we re-do that on its behalf re-enable the signal which was
3620 * blocked by the system when we entered.
3621 */
3622# ifdef HAS_SIGPROCMASK
3623 if (!safe) {
3624 /* safe signals called via dispatch_signals() set up a
3625 * savestack destructor, unblock_sigmask(), to
3626 * automatically unblock the handler at the end. If
3627 * instead we get here directly, we have to do it
3628 * ourselves
3629 */
3630 sigset_t set;
3631 sigemptyset(&set);
3632 sigaddset(&set,sig);
3633 sigprocmask(SIG_UNBLOCK, &set, NULL);
3634 }
3635# else
3636 /* Not clear if this will work */
3637 /* XXX not clear if this should be protected by 'if (safe)'
3638 * too */
3639
3640 (void)rsignal(sig, SIG_IGN);
3641 (void)rsignal(sig, PL_csighandlerp);
3642# endif
3643#endif /* !PERL_MICRO */
3644
3645 die_sv(errsv);
3646 }
3647 else {
3648 sv_setsv(errsv, errsv_save);
3649 SvREFCNT_dec(errsv_save);
3650 }
3651 }
3652
3653 cleanup:
3654 /* pop any of SAVEFREESV, SAVEDESTRUCTOR_X and "save in progress" */
3655 PL_savestack_ix = old_ss_ix;
3656 if (flags & 8)
3657 SvREFCNT_dec_NN(sv);
3658 PL_op = myop; /* Apparently not needed... */
3659
3660 PL_Sv = tSv; /* Restore global temporaries. */
3661 PL_Xpv = tXpv;
3662 return;
3663}
3664
3665
3666static void
3667S_restore_magic(pTHX_ const void *p)
3668{
3669 MGS* const mgs = SSPTR(PTR2IV(p), MGS*);
3670 SV* const sv = mgs->mgs_sv;
3671 bool bumped;
3672
3673 if (!sv)
3674 return;
3675
3676 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
3677 SvTEMP_off(sv); /* if it's still magical, this value isn't temporary */
3678 if (mgs->mgs_flags)
3679 SvFLAGS(sv) |= mgs->mgs_flags;
3680 else
3681 mg_magical(sv);
3682 }
3683
3684 bumped = mgs->mgs_bumped;
3685 mgs->mgs_sv = NULL; /* mark the MGS structure as restored */
3686
3687 /* If we're still on top of the stack, pop us off. (That condition
3688 * will be satisfied if restore_magic was called explicitly, but *not*
3689 * if it's being called via leave_scope.)
3690 * The reason for doing this is that otherwise, things like sv_2cv()
3691 * may leave alloc gunk on the savestack, and some code
3692 * (e.g. sighandler) doesn't expect that...
3693 */
3694 if (PL_savestack_ix == mgs->mgs_ss_ix)
3695 {
3696 UV popval = SSPOPUV;
3697 assert(popval == SAVEt_DESTRUCTOR_X);
3698 PL_savestack_ix -= 2;
3699 popval = SSPOPUV;
3700 assert((popval & SAVE_MASK) == SAVEt_ALLOC);
3701 PL_savestack_ix -= popval >> SAVE_TIGHT_SHIFT;
3702 }
3703 if (bumped) {
3704 if (SvREFCNT(sv) == 1) {
3705 /* We hold the last reference to this SV, which implies that the
3706 SV was deleted as a side effect of the routines we called.
3707 So artificially keep it alive a bit longer.
3708 We avoid turning on the TEMP flag, which can cause the SV's
3709 buffer to get stolen (and maybe other stuff). */
3710 sv_2mortal(sv);
3711 SvTEMP_off(sv);
3712 }
3713 else
3714 SvREFCNT_dec_NN(sv); /* undo the inc in S_save_magic() */
3715 }
3716}
3717
3718/* clean up the mess created by Perl_sighandler().
3719 * Note that this is only called during an exit in a signal handler;
3720 * a die is trapped by the call_sv() and the SAVEDESTRUCTOR_X manually
3721 * skipped over. */
3722
3723static void
3724S_unwind_handler_stack(pTHX_ const void *p)
3725{
3726 PERL_UNUSED_ARG(p);
3727
3728 PL_savestack_ix -= 5; /* Unprotect save in progress. */
3729}
3730
3731/*
3732=for apidoc_section $magic
3733=for apidoc magic_sethint
3734
3735Triggered by a store to C<%^H>, records the key/value pair to
3736C<PL_compiling.cop_hints_hash>. It is assumed that hints aren't storing
3737anything that would need a deep copy. Maybe we should warn if we find a
3738reference.
3739
3740=cut
3741*/
3742int
3743Perl_magic_sethint(pTHX_ SV *sv, MAGIC *mg)
3744{
3745 SV *key = (mg->mg_len == HEf_SVKEY) ? MUTABLE_SV(mg->mg_ptr)
3746 : newSVpvn_flags(mg->mg_ptr, mg->mg_len, SVs_TEMP);
3747
3748 PERL_ARGS_ASSERT_MAGIC_SETHINT;
3749
3750 /* mg->mg_obj isn't being used. If needed, it would be possible to store
3751 an alternative leaf in there, with PL_compiling.cop_hints being used if
3752 it's NULL. If needed for threads, the alternative could lock a mutex,
3753 or take other more complex action. */
3754
3755 /* Something changed in %^H, so it will need to be restored on scope exit.
3756 Doing this here saves a lot of doing it manually in perl code (and
3757 forgetting to do it, and consequent subtle errors. */
3758 PL_hints |= HINT_LOCALIZE_HH;
3759 CopHINTHASH_set(&PL_compiling,
3760 cophh_store_sv(CopHINTHASH_get(&PL_compiling), key, 0, sv, 0));
3761 magic_sethint_feature(key, NULL, 0, sv, 0);
3762 return 0;
3763}
3764
3765/*
3766=for apidoc magic_clearhint
3767
3768Triggered by a delete from C<%^H>, records the key to
3769C<PL_compiling.cop_hints_hash>.
3770
3771=cut
3772*/
3773int
3774Perl_magic_clearhint(pTHX_ SV *sv, MAGIC *mg)
3775{
3776 PERL_ARGS_ASSERT_MAGIC_CLEARHINT;
3777 PERL_UNUSED_ARG(sv);
3778
3779 PL_hints |= HINT_LOCALIZE_HH;
3780 CopHINTHASH_set(&PL_compiling,
3781 mg->mg_len == HEf_SVKEY
3782 ? cophh_delete_sv(CopHINTHASH_get(&PL_compiling),
3783 MUTABLE_SV(mg->mg_ptr), 0, 0)
3784 : cophh_delete_pvn(CopHINTHASH_get(&PL_compiling),
3785 mg->mg_ptr, mg->mg_len, 0, 0));
3786 if (mg->mg_len == HEf_SVKEY)
3787 magic_sethint_feature(MUTABLE_SV(mg->mg_ptr), NULL, 0, NULL, FALSE);
3788 else
3789 magic_sethint_feature(NULL, mg->mg_ptr, mg->mg_len, NULL, FALSE);
3790 return 0;
3791}
3792
3793/*
3794=for apidoc magic_clearhints
3795
3796Triggered by clearing C<%^H>, resets C<PL_compiling.cop_hints_hash>.
3797
3798=cut
3799*/
3800int
3801Perl_magic_clearhints(pTHX_ SV *sv, MAGIC *mg)
3802{
3803 PERL_ARGS_ASSERT_MAGIC_CLEARHINTS;
3804 PERL_UNUSED_ARG(sv);
3805 PERL_UNUSED_ARG(mg);
3806 cophh_free(CopHINTHASH_get(&PL_compiling));
3807 CopHINTHASH_set(&PL_compiling, cophh_new_empty());
3808 CLEARFEATUREBITS();
3809 return 0;
3810}
3811
3812int
3813Perl_magic_copycallchecker(pTHX_ SV *sv, MAGIC *mg, SV *nsv,
3814 const char *name, I32 namlen)
3815{
3816 MAGIC *nmg;
3817
3818 PERL_ARGS_ASSERT_MAGIC_COPYCALLCHECKER;
3819 PERL_UNUSED_ARG(sv);
3820 PERL_UNUSED_ARG(name);
3821 PERL_UNUSED_ARG(namlen);
3822
3823 sv_magic(nsv, &PL_sv_undef, mg->mg_type, NULL, 0);
3824 nmg = mg_find(nsv, mg->mg_type);
3825 assert(nmg);
3826 if (nmg->mg_flags & MGf_REFCOUNTED) SvREFCNT_dec(nmg->mg_obj);
3827 nmg->mg_ptr = mg->mg_ptr;
3828 nmg->mg_obj = SvREFCNT_inc_simple(mg->mg_obj);
3829 nmg->mg_flags |= MGf_REFCOUNTED;
3830 return 1;
3831}
3832
3833int
3834Perl_magic_setdebugvar(pTHX_ SV *sv, MAGIC *mg) {
3835 PERL_ARGS_ASSERT_MAGIC_SETDEBUGVAR;
3836
3837#if DBVARMG_SINGLE != 0
3838 assert(mg->mg_private >= DBVARMG_SINGLE);
3839#endif
3840 assert(mg->mg_private < DBVARMG_COUNT);
3841
3842 PL_DBcontrol[mg->mg_private] = SvIV_nomg(sv);
3843
3844 return 1;
3845}
3846
3847int
3848Perl_magic_getdebugvar(pTHX_ SV *sv, MAGIC *mg) {
3849 PERL_ARGS_ASSERT_MAGIC_GETDEBUGVAR;
3850
3851#if DBVARMG_SINGLE != 0
3852 assert(mg->mg_private >= DBVARMG_SINGLE);
3853#endif
3854 assert(mg->mg_private < DBVARMG_COUNT);
3855 sv_setiv(sv, PL_DBcontrol[mg->mg_private]);
3856
3857 return 0;
3858}
3859
3860/*
3861 * ex: set ts=8 sts=4 sw=4 et:
3862 */