This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Bump ext/POSIX version to 1.48
[perl5.git] / mg.c
CommitLineData
a0d0e21e 1/* mg.c
79072805 2 *
1129b882
NC
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
79072805
LW
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 *
a0d0e21e
LW
9 */
10
11/*
4ac71550
TC
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"]
79072805
LW
16 */
17
ccfc67b7
JH
18/*
19=head1 Magical Functions
166f8a29
DM
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
154e47c8 23with that SV's magic. A get is called prior to reading an SV, in order to
ddfa107c 24give it a chance to update its internal value (get on $. writes the line
b53c43bf 25number of the last read filehandle into the SV's IV slot), while
166f8a29 26set is called after an SV has been written to, in order to allow it to make
ddfa107c 27use of its changed value (set on $/ copies the SV's new value to the
166f8a29
DM
28PL_rs global variable).
29
30Magic is implemented as a linked list of MAGIC structures attached to the
154e47c8 31SV. Each MAGIC struct holds the type of the magic, a pointer to an array
166f8a29 32of functions that implement the get(), set(), length() etc functions,
154e47c8 33plus space for some flags and pointers. For example, a tied variable has
166f8a29
DM
34a MAGIC structure that contains a pointer to the object associated with the
35tie.
36
7fefc6c1
KW
37=cut
38
ccfc67b7
JH
39*/
40
79072805 41#include "EXTERN.h"
864dbfa3 42#define PERL_IN_MG_C
79072805
LW
43#include "perl.h"
44
5cd24f17 45#if defined(HAS_GETGROUPS) || defined(HAS_SETGROUPS)
b7953727
JH
46# ifdef I_GRP
47# include <grp.h>
48# endif
188ea221
CS
49#endif
50
757f63d8
SP
51#if defined(HAS_SETGROUPS)
52# ifndef NGROUPS
53# define NGROUPS 32
54# endif
55#endif
56
17aa7f3d
JH
57#ifdef __hpux
58# include <sys/pstat.h>
59#endif
60
7636ea95
AB
61#ifdef HAS_PRCTL_SET_NAME
62# include <sys/prctl.h>
63#endif
64
8aad04aa 65#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
b6455c53 66Signal_t Perl_csighandler(int sig, siginfo_t *, void *);
8aad04aa 67#else
e69880a5 68Signal_t Perl_csighandler(int sig);
8aad04aa 69#endif
e69880a5 70
9cffb111
OS
71#ifdef __Lynx__
72/* Missing protos on LynxOS */
73void setruid(uid_t id);
74void seteuid(uid_t id);
75void setrgid(uid_t id);
76void setegid(uid_t id);
77#endif
78
c07a80fd 79/*
4bac9ae4 80 * Pre-magic setup and post-magic takedown.
c07a80fd
PP
81 * Use the "DESTRUCTOR" scope cleanup to reinstate magic.
82 */
83
84struct magic_state {
85 SV* mgs_sv;
455ece5e 86 I32 mgs_ss_ix;
a623f893 87 U32 mgs_flags;
150b625d 88 bool mgs_bumped;
c07a80fd 89};
455ece5e 90/* MGS is typedef'ed to struct magic_state in perl.h */
76e3520e
GS
91
92STATIC void
ff44333e 93S_save_magic_flags(pTHX_ I32 mgs_ix, SV *sv, U32 flags)
c07a80fd 94{
455ece5e 95 MGS* mgs;
150b625d 96 bool bumped = FALSE;
7918f24d 97
ff44333e 98 PERL_ARGS_ASSERT_SAVE_MAGIC_FLAGS;
7918f24d 99
4bac9ae4
CS
100 assert(SvMAGICAL(sv));
101
150b625d
DM
102 /* we shouldn't really be called here with RC==0, but it can sometimes
103 * happen via mg_clear() (which also shouldn't be called when RC==0,
104 * but it can happen). Handle this case gracefully(ish) by not RC++
105 * and thus avoiding the resultant double free */
106 if (SvREFCNT(sv) > 0) {
107 /* guard against sv getting freed midway through the mg clearing,
108 * by holding a private reference for the duration. */
109 SvREFCNT_inc_simple_void_NN(sv);
110 bumped = TRUE;
111 }
8985fe98 112
8772537c 113 SAVEDESTRUCTOR_X(S_restore_magic, INT2PTR(void*, (IV)mgs_ix));
455ece5e
AD
114
115 mgs = SSPTR(mgs_ix, MGS*);
c07a80fd 116 mgs->mgs_sv = sv;
a623f893 117 mgs->mgs_flags = SvMAGICAL(sv) | SvREADONLY(sv);
455ece5e 118 mgs->mgs_ss_ix = PL_savestack_ix; /* points after the saved destructor */
150b625d 119 mgs->mgs_bumped = bumped;
c07a80fd 120
ff44333e 121 SvFLAGS(sv) &= ~flags;
3805b5fb 122 SvREADONLY_off(sv);
c07a80fd
PP
123}
124
ff44333e
FC
125#define save_magic(a,b) save_magic_flags(a,b,SVs_GMG|SVs_SMG|SVs_RMG)
126
954c1994
GS
127/*
128=for apidoc mg_magical
129
130Turns on the magical status of an SV. See C<sv_magic>.
131
132=cut
133*/
134
8990e307 135void
ddeaf645 136Perl_mg_magical(SV *sv)
8990e307 137{
e1ec3a88 138 const MAGIC* mg;
7918f24d 139 PERL_ARGS_ASSERT_MG_MAGICAL;
f9c6fee5
CS
140
141 SvMAGICAL_off(sv);
218787bd 142 if ((mg = SvMAGIC(sv))) {
218787bd
VP
143 do {
144 const MGVTBL* const vtbl = mg->mg_virtual;
145 if (vtbl) {
146 if (vtbl->svt_get && !(mg->mg_flags & MGf_GSKIP))
147 SvGMAGICAL_on(sv);
148 if (vtbl->svt_set)
149 SvSMAGICAL_on(sv);
150 if (vtbl->svt_clear)
151 SvRMAGICAL_on(sv);
152 }
153 } while ((mg = mg->mg_moremagic));
154 if (!(SvFLAGS(sv) & (SVs_GMG|SVs_SMG)))
155 SvRMAGICAL_on(sv);
8990e307
LW
156 }
157}
158
954c1994
GS
159/*
160=for apidoc mg_get
161
4b1e7f06 162Do magic before a value is retrieved from the SV. The type of SV must
72d33970 163be >= SVt_PVMG. See C<sv_magic>.
954c1994
GS
164
165=cut
166*/
167
79072805 168int
864dbfa3 169Perl_mg_get(pTHX_ SV *sv)
79072805 170{
35a4481c 171 const I32 mgs_ix = SSNEW(sizeof(MGS));
a9844598 172 bool saved = FALSE;
f9c6fee5 173 bool have_new = 0;
ff76feab 174 MAGIC *newmg, *head, *cur, *mg;
6683b158 175
7918f24d
NC
176 PERL_ARGS_ASSERT_MG_GET;
177
407287f9
FC
178 if (PL_localizing == 1 && sv == DEFSV) return 0;
179
ff76feab
AMS
180 /* We must call svt_get(sv, mg) for each valid entry in the linked
181 list of magic. svt_get() may delete the current entry, add new
182 magic to the head of the list, or upgrade the SV. AMS 20010810 */
183
184 newmg = cur = head = mg = SvMAGIC(sv);
185 while (mg) {
35a4481c 186 const MGVTBL * const vtbl = mg->mg_virtual;
f9c6fee5 187 MAGIC * const nextmg = mg->mg_moremagic; /* it may delete itself */
ff76feab 188
2b260de0 189 if (!(mg->mg_flags & MGf_GSKIP) && vtbl && vtbl->svt_get) {
a9844598
CS
190
191 /* taint's mg get is so dumb it doesn't need flag saving */
192 if (!saved && mg->mg_type != PERL_MAGIC_taint) {
193 save_magic(mgs_ix, sv);
194 saved = TRUE;
195 }
196
16c91539 197 vtbl->svt_get(aTHX_ sv, mg);
b77f7d40 198
58f82c5c
DM
199 /* guard against magic having been deleted - eg FETCH calling
200 * untie */
f9c6fee5 201 if (!SvMAGIC(sv)) {
a623f893
FC
202 /* recalculate flags */
203 (SSPTR(mgs_ix, MGS *))->mgs_flags &= ~(SVs_GMG|SVs_SMG|SVs_RMG);
58f82c5c 204 break;
f9c6fee5 205 }
b77f7d40 206
f9c6fee5 207 /* recalculate flags if this entry was deleted. */
ff76feab 208 if (mg->mg_flags & MGf_GSKIP)
a623f893
FC
209 (SSPTR(mgs_ix, MGS *))->mgs_flags &=
210 ~(SVs_GMG|SVs_SMG|SVs_RMG);
a0d0e21e 211 }
7d1328bb
FC
212 else if (vtbl == &PL_vtbl_utf8) {
213 /* get-magic can reallocate the PV */
214 magic_setutf8(sv, mg);
215 }
ff76feab 216
f9c6fee5 217 mg = nextmg;
ff76feab 218
0723351e 219 if (have_new) {
ff76feab
AMS
220 /* Have we finished with the new entries we saw? Start again
221 where we left off (unless there are more new entries). */
222 if (mg == head) {
0723351e 223 have_new = 0;
ff76feab
AMS
224 mg = cur;
225 head = newmg;
226 }
227 }
228
229 /* Were any new entries added? */
0723351e
NC
230 if (!have_new && (newmg = SvMAGIC(sv)) != head) {
231 have_new = 1;
ff76feab
AMS
232 cur = mg;
233 mg = newmg;
a623f893
FC
234 /* recalculate flags */
235 (SSPTR(mgs_ix, MGS *))->mgs_flags &= ~(SVs_GMG|SVs_SMG|SVs_RMG);
760ac839 236 }
79072805 237 }
463ee0b2 238
a9844598
CS
239 if (saved)
240 restore_magic(INT2PTR(void *, (IV)mgs_ix));
241
79072805
LW
242 return 0;
243}
244
954c1994
GS
245/*
246=for apidoc mg_set
247
248Do magic after a value is assigned to the SV. See C<sv_magic>.
249
250=cut
251*/
252
79072805 253int
864dbfa3 254Perl_mg_set(pTHX_ SV *sv)
79072805 255{
35a4481c 256 const I32 mgs_ix = SSNEW(sizeof(MGS));
79072805 257 MAGIC* mg;
463ee0b2
LW
258 MAGIC* nextmg;
259
7918f24d
NC
260 PERL_ARGS_ASSERT_MG_SET;
261
b5ed8c44
FC
262 if (PL_localizing == 2 && sv == DEFSV) return 0;
263
ff44333e 264 save_magic_flags(mgs_ix, sv, SVs_GMG|SVs_SMG); /* leave SVs_RMG on */
463ee0b2
LW
265
266 for (mg = SvMAGIC(sv); mg; mg = nextmg) {
e1ec3a88 267 const MGVTBL* vtbl = mg->mg_virtual;
463ee0b2 268 nextmg = mg->mg_moremagic; /* it may delete itself */
a0d0e21e
LW
269 if (mg->mg_flags & MGf_GSKIP) {
270 mg->mg_flags &= ~MGf_GSKIP; /* setting requires another read */
a623f893 271 (SSPTR(mgs_ix, MGS*))->mgs_flags &= ~(SVs_GMG|SVs_SMG|SVs_RMG);
a0d0e21e 272 }
e0a73de4 273 if (PL_localizing == 2
b5ed8c44 274 && PERL_MAGIC_TYPE_IS_VALUE_MAGIC(mg->mg_type))
e7cbf6c6 275 continue;
2b260de0 276 if (vtbl && vtbl->svt_set)
16c91539 277 vtbl->svt_set(aTHX_ sv, mg);
79072805 278 }
463ee0b2 279
8772537c 280 restore_magic(INT2PTR(void*, (IV)mgs_ix));
79072805
LW
281 return 0;
282}
283
954c1994
GS
284/*
285=for apidoc mg_length
286
d4e99c76 287Reports on the SV's length in bytes, calling length magic if available,
bd8446cf
FC
288but does not set the UTF8 flag on the sv. It will fall back to 'get'
289magic if there is no 'length' magic, but with no indication as to
290whether it called 'get' magic. It assumes the sv is a PVMG or
291higher. Use sv_len() instead.
954c1994
GS
292
293=cut
294*/
295
79072805 296U32
864dbfa3 297Perl_mg_length(pTHX_ SV *sv)
79072805
LW
298{
299 MAGIC* mg;
463ee0b2 300 STRLEN len;
463ee0b2 301
7918f24d
NC
302 PERL_ARGS_ASSERT_MG_LENGTH;
303
79072805 304 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
35a4481c 305 const MGVTBL * const vtbl = mg->mg_virtual;
2b260de0 306 if (vtbl && vtbl->svt_len) {
35a4481c 307 const I32 mgs_ix = SSNEW(sizeof(MGS));
455ece5e 308 save_magic(mgs_ix, sv);
a0d0e21e 309 /* omit MGf_GSKIP -- not changed here */
16c91539 310 len = vtbl->svt_len(aTHX_ sv, mg);
8772537c 311 restore_magic(INT2PTR(void*, (IV)mgs_ix));
85e6fe83
LW
312 return len;
313 }
314 }
315
bd8446cf 316 (void)SvPV_const(sv, len);
463ee0b2 317 return len;
79072805
LW
318}
319
8fb26106 320I32
864dbfa3 321Perl_mg_size(pTHX_ SV *sv)
93965878
NIS
322{
323 MAGIC* mg;
ac27b0f5 324
7918f24d
NC
325 PERL_ARGS_ASSERT_MG_SIZE;
326
93965878 327 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
35a4481c 328 const MGVTBL* const vtbl = mg->mg_virtual;
2b260de0 329 if (vtbl && vtbl->svt_len) {
35a4481c
AL
330 const I32 mgs_ix = SSNEW(sizeof(MGS));
331 I32 len;
455ece5e 332 save_magic(mgs_ix, sv);
93965878 333 /* omit MGf_GSKIP -- not changed here */
16c91539 334 len = vtbl->svt_len(aTHX_ sv, mg);
8772537c 335 restore_magic(INT2PTR(void*, (IV)mgs_ix));
93965878
NIS
336 return len;
337 }
338 }
339
340 switch(SvTYPE(sv)) {
341 case SVt_PVAV:
502c6561 342 return AvFILLp((const AV *) sv); /* Fallback to non-tied array */
93965878
NIS
343 case SVt_PVHV:
344 /* FIXME */
345 default:
cea2e8a9 346 Perl_croak(aTHX_ "Size magic not implemented");
81d52ecd 347
93965878 348 }
a25b5927 349 NOT_REACHED; /* NOTREACHED */
93965878
NIS
350}
351
954c1994
GS
352/*
353=for apidoc mg_clear
354
355Clear something magical that the SV represents. See C<sv_magic>.
356
357=cut
358*/
359
79072805 360int
864dbfa3 361Perl_mg_clear(pTHX_ SV *sv)
79072805 362{
35a4481c 363 const I32 mgs_ix = SSNEW(sizeof(MGS));
79072805 364 MAGIC* mg;
8ac77ac9 365 MAGIC *nextmg;
463ee0b2 366
7918f24d
NC
367 PERL_ARGS_ASSERT_MG_CLEAR;
368
455ece5e 369 save_magic(mgs_ix, sv);
463ee0b2 370
8ac77ac9 371 for (mg = SvMAGIC(sv); mg; mg = nextmg) {
35a4481c 372 const MGVTBL* const vtbl = mg->mg_virtual;
a0d0e21e 373 /* omit GSKIP -- never set here */
727405f8 374
8ac77ac9
NC
375 nextmg = mg->mg_moremagic; /* it may delete itself */
376
2b260de0 377 if (vtbl && vtbl->svt_clear)
16c91539 378 vtbl->svt_clear(aTHX_ sv, mg);
79072805 379 }
463ee0b2 380
8772537c 381 restore_magic(INT2PTR(void*, (IV)mgs_ix));
79072805
LW
382 return 0;
383}
384
ed624ca8 385static MAGIC*
ddeaf645 386S_mg_findext_flags(const SV *sv, int type, const MGVTBL *vtbl, U32 flags)
39de7f53 387{
39de7f53
FR
388 assert(flags <= 1);
389
390 if (sv) {
391 MAGIC *mg;
392
7db6405c
FC
393 assert(!(SvTYPE(sv) == SVt_PVAV && AvPAD_NAMELIST(sv)));
394
39de7f53
FR
395 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
396 if (mg->mg_type == type && (!flags || mg->mg_virtual == vtbl)) {
397 return mg;
398 }
399 }
400 }
401
402 return NULL;
403}
404
954c1994
GS
405/*
406=for apidoc mg_find
407
408Finds the magic pointer for type matching the SV. See C<sv_magic>.
409
410=cut
411*/
412
93a17b20 413MAGIC*
ddeaf645 414Perl_mg_find(const SV *sv, int type)
93a17b20 415{
ddeaf645 416 return S_mg_findext_flags(sv, type, NULL, 0);
39de7f53
FR
417}
418
419/*
420=for apidoc mg_findext
421
422Finds the magic pointer of C<type> with the given C<vtbl> for the C<SV>. See
423C<sv_magicext>.
424
425=cut
426*/
427
428MAGIC*
ddeaf645 429Perl_mg_findext(const SV *sv, int type, const MGVTBL *vtbl)
39de7f53 430{
ddeaf645 431 return S_mg_findext_flags(sv, type, vtbl, 1);
93a17b20
LW
432}
433
96c2a8ff
FC
434MAGIC *
435Perl_mg_find_mglob(pTHX_ SV *sv)
436{
437 PERL_ARGS_ASSERT_MG_FIND_MGLOB;
438 if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y') {
439 /* This sv is only a delegate. //g magic must be attached to
440 its target. */
441 vivify_defelem(sv);
442 sv = LvTARG(sv);
443 }
444 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
ddeaf645 445 return S_mg_findext_flags(sv, PERL_MAGIC_regex_global, 0, 0);
96c2a8ff
FC
446 return NULL;
447}
448
954c1994
GS
449/*
450=for apidoc mg_copy
451
452Copies the magic from one SV to another. See C<sv_magic>.
453
454=cut
455*/
456
79072805 457int
864dbfa3 458Perl_mg_copy(pTHX_ SV *sv, SV *nsv, const char *key, I32 klen)
79072805 459{
463ee0b2 460 int count = 0;
79072805 461 MAGIC* mg;
7918f24d
NC
462
463 PERL_ARGS_ASSERT_MG_COPY;
464
463ee0b2 465 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
35a4481c 466 const MGVTBL* const vtbl = mg->mg_virtual;
68795e93 467 if ((mg->mg_flags & MGf_COPY) && vtbl->svt_copy){
16c91539 468 count += vtbl->svt_copy(aTHX_ sv, mg, nsv, key, klen);
68795e93 469 }
823a54a3
AL
470 else {
471 const char type = mg->mg_type;
1e73acc8 472 if (isUPPER(type) && type != PERL_MAGIC_uvar) {
823a54a3
AL
473 sv_magic(nsv,
474 (type == PERL_MAGIC_tied)
475 ? SvTIED_obj(sv, mg)
476 : (type == PERL_MAGIC_regdata && mg->mg_obj)
477 ? sv
478 : mg->mg_obj,
479 toLOWER(type), key, klen);
480 count++;
481 }
79072805 482 }
79072805 483 }
463ee0b2 484 return count;
79072805
LW
485}
486
954c1994 487/*
0cbee0a4
DM
488=for apidoc mg_localize
489
9711599e 490Copy some of the magic from an existing SV to new localized version of that
154e47c8
FC
491SV. Container magic (eg %ENV, $1, tie)
492gets copied, value magic doesn't (eg
9711599e
CS
493taint, pos).
494
af7df257 495If setmagic is false then no set magic will be called on the new (empty) SV.
9711599e
CS
496This typically means that assignment will soon follow (e.g. 'local $x = $y'),
497and that will handle the magic.
0cbee0a4
DM
498
499=cut
500*/
501
502void
af7df257 503Perl_mg_localize(pTHX_ SV *sv, SV *nsv, bool setmagic)
0cbee0a4
DM
504{
505 MAGIC *mg;
7918f24d
NC
506
507 PERL_ARGS_ASSERT_MG_LOCALIZE;
508
658a9f31
JD
509 if (nsv == DEFSV)
510 return;
511
0cbee0a4 512 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
2b1b43ea 513 const MGVTBL* const vtbl = mg->mg_virtual;
e0a73de4 514 if (PERL_MAGIC_TYPE_IS_VALUE_MAGIC(mg->mg_type))
0cbee0a4 515 continue;
0cbee0a4 516
a5063e7c 517 if ((mg->mg_flags & MGf_LOCAL) && vtbl->svt_local)
16c91539 518 (void)vtbl->svt_local(aTHX_ nsv, mg);
a5063e7c 519 else
0cbee0a4
DM
520 sv_magicext(nsv, mg->mg_obj, mg->mg_type, vtbl,
521 mg->mg_ptr, mg->mg_len);
a5063e7c 522
0cbee0a4 523 /* container types should remain read-only across localization */
9ff3e6d8 524 SvFLAGS(nsv) |= SvREADONLY(sv);
0cbee0a4
DM
525 }
526
527 if (SvTYPE(nsv) >= SVt_PVMG && SvMAGIC(nsv)) {
528 SvFLAGS(nsv) |= SvMAGICAL(sv);
af7df257 529 if (setmagic) {
9711599e
CS
530 PL_localizing = 1;
531 SvSETMAGIC(nsv);
532 PL_localizing = 0;
533 }
0cbee0a4
DM
534 }
535}
536
d9088386
Z
537#define mg_free_struct(sv, mg) S_mg_free_struct(aTHX_ sv, mg)
538static void
539S_mg_free_struct(pTHX_ SV *sv, MAGIC *mg)
540{
541 const MGVTBL* const vtbl = mg->mg_virtual;
542 if (vtbl && vtbl->svt_free)
543 vtbl->svt_free(aTHX_ sv, mg);
544 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
545 if (mg->mg_len > 0 || mg->mg_type == PERL_MAGIC_utf8)
546 Safefree(mg->mg_ptr);
547 else if (mg->mg_len == HEf_SVKEY)
548 SvREFCNT_dec(MUTABLE_SV(mg->mg_ptr));
549 }
550 if (mg->mg_flags & MGf_REFCOUNTED)
551 SvREFCNT_dec(mg->mg_obj);
552 Safefree(mg);
553}
554
0cbee0a4 555/*
954c1994
GS
556=for apidoc mg_free
557
558Free any magic storage used by the SV. See C<sv_magic>.
559
560=cut
561*/
562
79072805 563int
864dbfa3 564Perl_mg_free(pTHX_ SV *sv)
79072805
LW
565{
566 MAGIC* mg;
567 MAGIC* moremagic;
7918f24d
NC
568
569 PERL_ARGS_ASSERT_MG_FREE;
570
79072805 571 for (mg = SvMAGIC(sv); mg; mg = moremagic) {
79072805 572 moremagic = mg->mg_moremagic;
d9088386 573 mg_free_struct(sv, mg);
c826f41b 574 SvMAGIC_set(sv, moremagic);
79072805 575 }
b162af07 576 SvMAGIC_set(sv, NULL);
68f8932e 577 SvMAGICAL_off(sv);
79072805
LW
578 return 0;
579}
580
d9088386
Z
581/*
582=for apidoc Am|void|mg_free_type|SV *sv|int how
583
584Remove any magic of type I<how> from the SV I<sv>. See L</sv_magic>.
585
586=cut
587*/
588
589void
590Perl_mg_free_type(pTHX_ SV *sv, int how)
591{
592 MAGIC *mg, *prevmg, *moremg;
593 PERL_ARGS_ASSERT_MG_FREE_TYPE;
594 for (prevmg = NULL, mg = SvMAGIC(sv); mg; prevmg = mg, mg = moremg) {
595 MAGIC *newhead;
596 moremg = mg->mg_moremagic;
597 if (mg->mg_type == how) {
598 /* temporarily move to the head of the magic chain, in case
599 custom free code relies on this historical aspect of mg_free */
600 if (prevmg) {
601 prevmg->mg_moremagic = moremg;
602 mg->mg_moremagic = SvMAGIC(sv);
603 SvMAGIC_set(sv, mg);
604 }
605 newhead = mg->mg_moremagic;
606 mg_free_struct(sv, mg);
607 SvMAGIC_set(sv, newhead);
608 mg = prevmg;
609 }
610 }
611 mg_magical(sv);
612}
613
79072805 614#include <signal.h>
79072805 615
942e002e 616U32
864dbfa3 617Perl_magic_regdata_cnt(pTHX_ SV *sv, MAGIC *mg)
6cef1e77 618{
8772537c 619 PERL_UNUSED_ARG(sv);
6cef1e77 620
7918f24d
NC
621 PERL_ARGS_ASSERT_MAGIC_REGDATA_CNT;
622
0bd48802 623 if (PL_curpm) {
eb578fdb 624 const REGEXP * const rx = PM_GETRE(PL_curpm);
0bd48802 625 if (rx) {
a678b0e4
YO
626 if (mg->mg_obj) { /* @+ */
627 /* return the number possible */
07bc277f 628 return RX_NPARENS(rx);
a678b0e4 629 } else { /* @- */
07bc277f 630 I32 paren = RX_LASTPAREN(rx);
a678b0e4
YO
631
632 /* return the last filled */
f46c4081 633 while ( paren >= 0
07bc277f
NC
634 && (RX_OFFS(rx)[paren].start == -1
635 || RX_OFFS(rx)[paren].end == -1) )
f46c4081 636 paren--;
a678b0e4
YO
637 return (U32)paren;
638 }
0bd48802 639 }
8f580fb8 640 }
ac27b0f5 641
942e002e 642 return (U32)-1;
6cef1e77
IZ
643}
644
6502e081
DM
645/* @-, @+ */
646
6cef1e77 647int
864dbfa3 648Perl_magic_regdatum_get(pTHX_ SV *sv, MAGIC *mg)
6cef1e77 649{
7918f24d
NC
650 PERL_ARGS_ASSERT_MAGIC_REGDATUM_GET;
651
0bd48802 652 if (PL_curpm) {
eb578fdb 653 const REGEXP * const rx = PM_GETRE(PL_curpm);
0bd48802 654 if (rx) {
eb578fdb 655 const I32 paren = mg->mg_len;
a10eae29
FC
656 SSize_t s;
657 SSize_t t;
0bd48802
AL
658 if (paren < 0)
659 return 0;
07bc277f
NC
660 if (paren <= (I32)RX_NPARENS(rx) &&
661 (s = RX_OFFS(rx)[paren].start) != -1 &&
662 (t = RX_OFFS(rx)[paren].end) != -1)
0bd48802 663 {
a10eae29 664 SSize_t i;
0bd48802
AL
665 if (mg->mg_obj) /* @+ */
666 i = t;
667 else /* @- */
668 i = s;
669
a10eae29 670 if (RX_MATCH_UTF8(rx)) {
07bc277f 671 const char * const b = RX_SUBBEG(rx);
0bd48802 672 if (b)
6502e081
DM
673 i = RX_SUBCOFFSET(rx) +
674 utf8_length((U8*)b,
675 (U8*)(b-RX_SUBOFFSET(rx)+i));
0bd48802 676 }
727405f8 677
a10eae29 678 sv_setuv(sv, i);
232af1f8 679 return 0;
1aa99e6b 680 }
0bd48802 681 }
6cef1e77 682 }
232af1f8 683 sv_setsv(sv, NULL);
6cef1e77
IZ
684 return 0;
685}
686
6502e081
DM
687/* @-, @+ */
688
e4b89193 689int
a29d06ed
MG
690Perl_magic_regdatum_set(pTHX_ SV *sv, MAGIC *mg)
691{
7918f24d 692 PERL_ARGS_ASSERT_MAGIC_REGDATUM_SET;
dc3bf405 693 PERL_UNUSED_CONTEXT;
d4c19fe8
AL
694 PERL_UNUSED_ARG(sv);
695 PERL_UNUSED_ARG(mg);
cb077ed2 696 Perl_croak_no_modify();
0dbb1585 697 NORETURN_FUNCTION_END;
a29d06ed
MG
698}
699
ad3296c6 700#define SvRTRIM(sv) STMT_START { \
eae92ea0
GA
701 if (SvPOK(sv)) { \
702 STRLEN len = SvCUR(sv); \
703 char * const p = SvPVX(sv); \
8e6b4db6
PC
704 while (len > 0 && isSPACE(p[len-1])) \
705 --len; \
706 SvCUR_set(sv, len); \
707 p[len] = '\0'; \
708 } \
ad3296c6
SH
709} STMT_END
710
8b850bd5
NC
711void
712Perl_emulate_cop_io(pTHX_ const COP *const c, SV *const sv)
713{
7918f24d
NC
714 PERL_ARGS_ASSERT_EMULATE_COP_IO;
715
8b850bd5
NC
716 if (!(CopHINTS_get(c) & (HINT_LEXICAL_IO_IN|HINT_LEXICAL_IO_OUT)))
717 sv_setsv(sv, &PL_sv_undef);
718 else {
719 sv_setpvs(sv, "");
720 SvUTF8_off(sv);
721 if ((CopHINTS_get(c) & HINT_LEXICAL_IO_IN)) {
20439bc7 722 SV *const value = cop_hints_fetch_pvs(c, "open<", 0);
8b850bd5
NC
723 assert(value);
724 sv_catsv(sv, value);
725 }
726 sv_catpvs(sv, "\0");
727 if ((CopHINTS_get(c) & HINT_LEXICAL_IO_OUT)) {
20439bc7 728 SV *const value = cop_hints_fetch_pvs(c, "open>", 0);
8b850bd5
NC
729 assert(value);
730 sv_catsv(sv, value);
731 }
732 }
733}
734
d9fe7d23
KW
735STATIC void
736S_fixup_errno_string(pTHX_ SV* sv)
737{
738 /* Do what is necessary to fixup the non-empty string in 'sv' for return to
739 * Perl space. */
740
741 PERL_ARGS_ASSERT_FIXUP_ERRNO_STRING;
742
743 assert(SvOK(sv));
b35e4f8b
KW
744
745 if(strEQ(SvPVX(sv), "")) {
746 sv_catpv(sv, UNKNOWN_ERRNO_MSG);
747 }
748 else {
d9fe7d23 749
d3c0b317
KW
750 /* In some locales the error string may come back as UTF-8, in which
751 * case we should turn on that flag. This didn't use to happen, and to
5320b60d
KW
752 * avoid as many possible backward compatibility issues as possible, we
753 * don't turn on the flag unless we have to. So the flag stays off for
754 * an entirely ASCII string. We assume that if the string looks like
755 * UTF-8, it really is UTF-8: "text in any other encoding that uses
756 * bytes with the high bit set is extremely unlikely to pass a UTF-8
757 * validity test" (http://en.wikipedia.org/wiki/Charset_detection).
758 * There is a potential that we will get it wrong however, especially
759 * on short error message text. (If it turns out to be necessary, we
760 * could also keep track if the current LC_MESSAGES locale is UTF-8) */
d3c0b317
KW
761 if (! IN_BYTES /* respect 'use bytes' */
762 && ! is_ascii_string((U8*) SvPVX_const(sv), SvCUR(sv))
763 && is_utf8_string((U8*) SvPVX_const(sv), SvCUR(sv)))
764 {
765 SvUTF8_on(sv);
766 }
b35e4f8b 767 }
d9fe7d23
KW
768}
769
ad2de1b2
KW
770SV*
771Perl__get_encoding(pTHX)
772{
3e669301
KW
773 /* For core Perl use only: Returns the $^ENCODING or 'use encoding' in
774 * effect; NULL if none.
775 *
776 * $^ENCODING maps to PL_encoding, and is the old way to do things, and is
777 * retained for backwards compatibility. Now, there is a shadow variable
778 * ${^E_NCODING} set only by the encoding pragma, used to give this pragma
779 * lexical scope, unlike the global scope it (shudder) used to have. This
780 * variable maps to PL_lex_encoding. Again for backwards compatibility,
781 * PL_encoding has precedence over PL_lex_encoding. The hints hash is used
782 * to determine if PL_lex_encoding is in scope, and hence valid. The hints
783 * hash only accepts simple values, so we can't put an Encode object into
784 * it, so we put the object into the global, and put a simple boolean into
785 * the hints hash giving whether the global is valid or not */
786
c79dccf4 787 dVAR;
3e669301
KW
788 SV *is_encoding;
789
790 if (PL_encoding) {
791 return PL_encoding;
792 }
793
794 if (! PL_lex_encoding) {
795 return NULL;
796 }
797
798 is_encoding = cop_hints_fetch_pvs(PL_curcop, "encoding", 0);
799 if ( is_encoding
800 && is_encoding != &PL_sv_placeholder
801 && SvIOK(is_encoding)
802 && SvIV(is_encoding)) /* non-zero mean valid */
803 {
804 return PL_lex_encoding;
805 }
ad2de1b2 806
3e669301 807 return NULL;
ad2de1b2
KW
808}
809
25bbd826
CB
810#ifdef VMS
811#include <descrip.h>
812#include <starlet.h>
813#endif
814
79072805 815int
864dbfa3 816Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
79072805 817{
eb578fdb
KW
818 I32 paren;
819 const char *s = NULL;
820 REGEXP *rx;
823a54a3 821 const char * const remaining = mg->mg_ptr + 1;
e91d8259 822 char nextchar;
79072805 823
7918f24d
NC
824 PERL_ARGS_ASSERT_MAGIC_GET;
825
e91d8259 826 if (!mg->mg_ptr) {
e91d8259 827 paren = mg->mg_len;
e91d8259 828 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
a6d0b1b5 829 do_numbuf_fetch:
e91d8259
NC
830 CALLREG_NUMBUF_FETCH(rx,paren,sv);
831 } else {
832 sv_setsv(sv,&PL_sv_undef);
833 }
834 return 0;
835 }
836
837 nextchar = *remaining;
79072805 838 switch (*mg->mg_ptr) {
748a9306 839 case '\001': /* ^A */
f2da823f
FC
840 if (SvOK(PL_bodytarget)) sv_copypv(sv, PL_bodytarget);
841 else sv_setsv(sv, &PL_sv_undef);
125b9982
NT
842 if (SvTAINTED(PL_bodytarget))
843 SvTAINTED_on(sv);
748a9306 844 break;
e5218da5 845 case '\003': /* ^C, ^CHILD_ERROR_NATIVE */
823a54a3 846 if (nextchar == '\0') {
e5218da5
GA
847 sv_setiv(sv, (IV)PL_minus_c);
848 }
823a54a3 849 else if (strEQ(remaining, "HILD_ERROR_NATIVE")) {
e5218da5
GA
850 sv_setiv(sv, (IV)STATUS_NATIVE);
851 }
49460fe6
NIS
852 break;
853
79072805 854 case '\004': /* ^D */
aea4f609 855 sv_setiv(sv, (IV)(PL_debug & DEBUG_MASK));
79072805 856 break;
28f23441 857 case '\005': /* ^E */
6c6eab55
KW
858 if (nextchar != '\0') {
859 if (strEQ(remaining, "NCODING"))
ad2de1b2 860 sv_setsv(sv, _get_encoding());
199670db
FC
861 else if (strEQ(remaining, "_NCODING"))
862 sv_setsv(sv, NULL);
4f4ff3a7 863 break;
6c6eab55 864 }
4f4ff3a7
KW
865
866#if defined(VMS) || defined(OS2) || defined(WIN32)
867# if defined(VMS)
2a99ff86
KW
868 {
869 char msg[255];
870 $DESCRIPTOR(msgdsc,msg);
871 sv_setnv(sv,(NV) vaxc$errno);
872 if (sys$getmsg(vaxc$errno,&msgdsc.dsc$w_length,&msgdsc,0,0) & 1)
873 sv_setpvn(sv,msgdsc.dsc$a_pointer,msgdsc.dsc$w_length);
874 else
875 sv_setpvs(sv,"");
876 }
4b645107 877#elif defined(OS2)
2a99ff86
KW
878 if (!(_emx_env & 0x200)) { /* Under DOS */
879 sv_setnv(sv, (NV)errno);
2c6ee1a7 880 sv_setpv(sv, errno ? my_strerror(errno) : "");
2a99ff86
KW
881 } else {
882 if (errno != errno_isOS2) {
883 const int tmp = _syserrno();
884 if (tmp) /* 2nd call to _syserrno() makes it 0 */
885 Perl_rc = tmp;
886 }
887 sv_setnv(sv, (NV)Perl_rc);
888 sv_setpv(sv, os2error(Perl_rc));
889 }
1534c6f5 890 if (SvOK(sv) && strNE(SvPVX(sv), "")) {
99461a73
KW
891 fixup_errno_string(sv);
892 }
4f4ff3a7 893# elif defined(WIN32)
2a99ff86
KW
894 {
895 const DWORD dwErr = GetLastError();
896 sv_setnv(sv, (NV)dwErr);
897 if (dwErr) {
898 PerlProc_GetOSError(sv, dwErr);
2efab60d 899 fixup_errno_string(sv);
2a99ff86
KW
900 }
901 else
902 sv_setpvs(sv, "");
903 SetLastError(dwErr);
904 }
4f4ff3a7
KW
905# else
906# error Missing code for platform
907# endif
2a99ff86
KW
908 SvRTRIM(sv);
909 SvNOK_on(sv); /* what a wonderful hack! */
910 break;
4f4ff3a7
KW
911#endif /* End of platforms with special handling for $^E; others just fall
912 through to $! */
46f3e16c
KW
913
914 case '!':
915 {
5f1b979d 916 dSAVE_ERRNO;
46f3e16c 917#ifdef VMS
5f1b979d 918 sv_setnv(sv, (NV)((errno == EVMSERR) ? vaxc$errno : errno));
46f3e16c 919#else
5f1b979d 920 sv_setnv(sv, (NV)errno);
46f3e16c
KW
921#endif
922#ifdef OS2
5f1b979d
KW
923 if (errno == errno_isOS2 || errno == errno_isOS2_set)
924 sv_setpv(sv, os2error(Perl_rc));
925 else
46f3e16c 926#endif
5f1b979d
KW
927 if (! errno) {
928 sv_setpvs(sv, "");
46f3e16c 929 }
5f1b979d
KW
930 else {
931
932 /* Strerror can return NULL on some platforms, which will
933 * result in 'sv' not being considered SvOK. The SvNOK_on()
934 * below will cause just the number part to be valid */
2c6ee1a7 935 sv_setpv(sv, my_strerror(errno));
5f1b979d
KW
936 if (SvOK(sv)) {
937 fixup_errno_string(sv);
938 }
939 }
940 RESTORE_ERRNO;
46f3e16c
KW
941 }
942
943 SvRTRIM(sv);
944 SvNOK_on(sv); /* what a wonderful hack! */
945 break;
946
79072805 947 case '\006': /* ^F */
3280af22 948 sv_setiv(sv, (IV)PL_maxsysfd);
79072805 949 break;
9ebf26ad
FR
950 case '\007': /* ^GLOBAL_PHASE */
951 if (strEQ(remaining, "LOBAL_PHASE")) {
952 sv_setpvn(sv, PL_phase_names[PL_phase],
953 strlen(PL_phase_names[PL_phase]));
954 }
955 break;
a0d0e21e 956 case '\010': /* ^H */
3280af22 957 sv_setiv(sv, (IV)PL_hints);
a0d0e21e 958 break;
9d116dd7 959 case '\011': /* ^I */ /* NOT \t in EBCDIC */
120f7abe 960 sv_setpv(sv, PL_inplace); /* Will undefine sv if PL_inplace is NULL */
79072805 961 break;
8561ea1d
FC
962 case '\014': /* ^LAST_FH */
963 if (strEQ(remaining, "AST_FH")) {
964 if (PL_last_in_gv) {
965 assert(isGV_with_GP(PL_last_in_gv));
966 SV_CHECK_THINKFIRST_COW_DROP(sv);
967 prepare_SV_for_RV(sv);
968 SvOK_off(sv);
969 SvRV_set(sv, SvREFCNT_inc_simple_NN(PL_last_in_gv));
970 SvROK_on(sv);
971 sv_rvweaken(sv);
972 }
973 else sv_setsv_nomg(sv, NULL);
974 }
975 break;
ac27b0f5 976 case '\017': /* ^O & ^OPEN */
823a54a3 977 if (nextchar == '\0') {
ac27b0f5 978 sv_setpv(sv, PL_osname);
3511154c
DM
979 SvTAINTED_off(sv);
980 }
823a54a3 981 else if (strEQ(remaining, "PEN")) {
8b850bd5 982 Perl_emulate_cop_io(aTHX_ &PL_compiling, sv);
ac27b0f5 983 }
28f23441 984 break;
9ebf26ad 985 case '\020':
a6d0b1b5 986 sv_setiv(sv, (IV)PL_perldb);
79072805 987 break;
fb73857a 988 case '\023': /* ^S */
a6d0b1b5 989 {
bc177e6b 990 if (PL_parser && PL_parser->lex_state != LEX_NOTPARSING)
0c34ef67 991 SvOK_off(sv);
3280af22 992 else if (PL_in_eval)
6dc8a9e4 993 sv_setiv(sv, PL_in_eval & ~(EVAL_INREQUIRE));
a4268c0a
AMS
994 else
995 sv_setiv(sv, 0);
d58bf5aa 996 }
fb73857a 997 break;
79072805 998 case '\024': /* ^T */
823a54a3 999 if (nextchar == '\0') {
88e89b8a 1000#ifdef BIG_TIME
7c36658b 1001 sv_setnv(sv, PL_basetime);
88e89b8a 1002#else
7c36658b 1003 sv_setiv(sv, (IV)PL_basetime);
88e89b8a 1004#endif
7c36658b 1005 }
823a54a3 1006 else if (strEQ(remaining, "AINT"))
284167a5
SM
1007 sv_setiv(sv, TAINTING_get
1008 ? (TAINT_WARN_get || PL_unsafe ? -1 : 1)
9aa05f58 1009 : 0);
7c36658b 1010 break;
e07ea26a 1011 case '\025': /* $^UNICODE, $^UTF8LOCALE, $^UTF8CACHE */
823a54a3 1012 if (strEQ(remaining, "NICODE"))
a05d7ebb 1013 sv_setuv(sv, (UV) PL_unicode);
823a54a3 1014 else if (strEQ(remaining, "TF8LOCALE"))
7cebcbc0 1015 sv_setuv(sv, (UV) PL_utf8locale);
e07ea26a
NC
1016 else if (strEQ(remaining, "TF8CACHE"))
1017 sv_setiv(sv, (IV) PL_utf8cache);
fde18df1
JH
1018 break;
1019 case '\027': /* ^W & $^WARNING_BITS */
823a54a3 1020 if (nextchar == '\0')
4438c4b7 1021 sv_setiv(sv, (IV)((PL_dowarn & G_WARN_ON) ? TRUE : FALSE));
823a54a3 1022 else if (strEQ(remaining, "ARNING_BITS")) {
013b78e8 1023 if (PL_compiling.cop_warnings == pWARN_NONE) {
4438c4b7 1024 sv_setpvn(sv, WARN_NONEstring, WARNsize) ;
013b78e8
RGS
1025 }
1026 else if (PL_compiling.cop_warnings == pWARN_STD) {
7e4f0450
FC
1027 sv_setsv(sv, &PL_sv_undef);
1028 break;
013b78e8 1029 }
d3a7d8c7 1030 else if (PL_compiling.cop_warnings == pWARN_ALL) {
75b6c4ca
RGS
1031 /* Get the bit mask for $warnings::Bits{all}, because
1032 * it could have been extended by warnings::register */
4bac9ae4
CS
1033 HV * const bits = get_hv("warnings::Bits", 0);
1034 SV ** const bits_all = bits ? hv_fetchs(bits, "all", FALSE) : NULL;
1035 if (bits_all)
1036 sv_copypv(sv, *bits_all);
1037 else
1038 sv_setpvn(sv, WARN_ALLstring, WARNsize);
ac27b0f5 1039 }
4438c4b7 1040 else {
72dc9ed5
NC
1041 sv_setpvn(sv, (char *) (PL_compiling.cop_warnings + 1),
1042 *PL_compiling.cop_warnings);
ac27b0f5 1043 }
4438c4b7 1044 }
79072805 1045 break;
79072805 1046 case '+':
aaa362c4 1047 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
2c7b5d76
DM
1048 paren = RX_LASTPAREN(rx);
1049 if (paren)
1050 goto do_numbuf_fetch;
79072805 1051 }
3280af22 1052 sv_setsv(sv,&PL_sv_undef);
79072805 1053 break;
a01268b5
JH
1054 case '\016': /* ^N */
1055 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
2c7b5d76
DM
1056 paren = RX_LASTCLOSEPAREN(rx);
1057 if (paren)
1058 goto do_numbuf_fetch;
a01268b5
JH
1059 }
1060 sv_setsv(sv,&PL_sv_undef);
1061 break;
79072805 1062 case '.':
3280af22 1063 if (GvIO(PL_last_in_gv)) {
357c8808 1064 sv_setiv(sv, (IV)IoLINES(GvIOp(PL_last_in_gv)));
79072805 1065 }
79072805
LW
1066 break;
1067 case '?':
809a5acc 1068 {
809a5acc 1069 sv_setiv(sv, (IV)STATUS_CURRENT);
ff0cee69 1070#ifdef COMPLEX_STATUS
41cb7b2b 1071 SvUPGRADE(sv, SVt_PVLV);
6b88bc9c
GS
1072 LvTARGOFF(sv) = PL_statusvalue;
1073 LvTARGLEN(sv) = PL_statusvalue_vms;
ff0cee69 1074#endif
809a5acc 1075 }
79072805
LW
1076 break;
1077 case '^':
acbe1b9d 1078 if (GvIOp(PL_defoutgv))
099be4f1 1079 s = IoTOP_NAME(GvIOp(PL_defoutgv));
79072805
LW
1080 if (s)
1081 sv_setpv(sv,s);
1082 else {
3280af22 1083 sv_setpv(sv,GvENAME(PL_defoutgv));
cb421d5e 1084 sv_catpvs(sv,"_TOP");
79072805
LW
1085 }
1086 break;
1087 case '~':
acbe1b9d 1088 if (GvIOp(PL_defoutgv))
0daa599b 1089 s = IoFMT_NAME(GvIOp(PL_defoutgv));
79072805 1090 if (!s)
3280af22 1091 s = GvENAME(PL_defoutgv);
79072805
LW
1092 sv_setpv(sv,s);
1093 break;
79072805 1094 case '=':
099be4f1 1095 if (GvIO(PL_defoutgv))
0daa599b 1096 sv_setiv(sv, (IV)IoPAGE_LEN(GvIOp(PL_defoutgv)));
79072805
LW
1097 break;
1098 case '-':
099be4f1 1099 if (GvIO(PL_defoutgv))
0daa599b 1100 sv_setiv(sv, (IV)IoLINES_LEFT(GvIOp(PL_defoutgv)));
79072805
LW
1101 break;
1102 case '%':
099be4f1 1103 if (GvIO(PL_defoutgv))
0daa599b 1104 sv_setiv(sv, (IV)IoPAGE(GvIOp(PL_defoutgv)));
79072805 1105 break;
79072805
LW
1106 case ':':
1107 break;
1108 case '/':
1109 break;
1110 case '[':
e1dccc0d 1111 sv_setiv(sv, 0);
79072805
LW
1112 break;
1113 case '|':
099be4f1 1114 if (GvIO(PL_defoutgv))
0daa599b 1115 sv_setiv(sv, (IV)(IoFLAGS(GvIOp(PL_defoutgv)) & IOf_FLUSH) != 0 );
79072805 1116 break;
79072805 1117 case '\\':
b2ce0fda 1118 if (PL_ors_sv)
f28098ff 1119 sv_copypv(sv, PL_ors_sv);
4bac9ae4
CS
1120 else
1121 sv_setsv(sv, &PL_sv_undef);
79072805 1122 break;
0e219455 1123 case '$': /* $$ */
9cdac2a2
FC
1124 {
1125 IV const pid = (IV)PerlProc_getpid();
19db9fb7 1126 if (isGV(mg->mg_obj) || SvIV(mg->mg_obj) != pid) {
9cdac2a2
FC
1127 /* never set manually, or at least not since last fork */
1128 sv_setiv(sv, pid);
19db9fb7
Z
1129 /* never unsafe, even if reading in a tainted expression */
1130 SvTAINTED_off(sv);
1131 }
9cdac2a2
FC
1132 /* else a value has been assigned manually, so do nothing */
1133 }
0e219455 1134 break;
79072805 1135 case '<':
dfff4baf 1136 sv_setuid(sv, PerlProc_getuid());
79072805
LW
1137 break;
1138 case '>':
dfff4baf 1139 sv_setuid(sv, PerlProc_geteuid());
79072805
LW
1140 break;
1141 case '(':
dfff4baf 1142 sv_setgid(sv, PerlProc_getgid());
79072805
LW
1143 goto add_groups;
1144 case ')':
dfff4baf 1145 sv_setgid(sv, PerlProc_getegid());
79072805 1146 add_groups:
79072805 1147#ifdef HAS_GETGROUPS
79072805 1148 {
57d7c65e 1149 Groups_t *gary = NULL;
375ed12a
JH
1150 I32 i;
1151 I32 num_groups = getgroups(0, gary);
1152 if (num_groups > 0) {
1153 Newx(gary, num_groups, Groups_t);
1154 num_groups = getgroups(num_groups, gary);
1155 for (i = 0; i < num_groups; i++)
1156 Perl_sv_catpvf(aTHX_ sv, " %"IVdf, (IV)gary[i]);
1157 Safefree(gary);
1158 }
79072805 1159 }
155aba94 1160 (void)SvIOK_on(sv); /* what a wonderful hack! */
cd70abae 1161#endif
79072805 1162 break;
79072805
LW
1163 case '0':
1164 break;
1165 }
a0d0e21e 1166 return 0;
79072805
LW
1167}
1168
1169int
864dbfa3 1170Perl_magic_getuvar(pTHX_ SV *sv, MAGIC *mg)
79072805 1171{
8772537c 1172 struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
79072805 1173
7918f24d
NC
1174 PERL_ARGS_ASSERT_MAGIC_GETUVAR;
1175
79072805 1176 if (uf && uf->uf_val)
24f81a43 1177 (*uf->uf_val)(aTHX_ uf->uf_index, sv);
79072805
LW
1178 return 0;
1179}
1180
1181int
864dbfa3 1182Perl_magic_setenv(pTHX_ SV *sv, MAGIC *mg)
79072805 1183{
9ae3433d 1184 STRLEN len = 0, klen;
12033064 1185 const char * const key = MgPV_const(mg,klen);
888a67f6 1186 const char *s = "";
1e422769 1187
7918f24d
NC
1188 PERL_ARGS_ASSERT_MAGIC_SETENV;
1189
613c63b4 1190 SvGETMAGIC(sv);
12033064 1191 if (SvOK(sv)) {
613c63b4
CS
1192 /* defined environment variables are byte strings; unfortunately
1193 there is no SvPVbyte_force_nomg(), so we must do this piecewise */
1194 (void)SvPV_force_nomg_nolen(sv);
1195 sv_utf8_downgrade(sv, /* fail_ok */ TRUE);
1196 if (SvUTF8(sv)) {
1197 Perl_ck_warner_d(aTHX_ packWARN(WARN_UTF8), "Wide character in %s", "setenv");
1198 SvUTF8_off(sv);
1199 }
1200 s = SvPVX(sv);
1201 len = SvCUR(sv);
12033064
CS
1202 }
1203 my_setenv(key, s); /* does the deed */
1204
a0d0e21e
LW
1205#ifdef DYNAMIC_ENV_FETCH
1206 /* We just undefd an environment var. Is a replacement */
1207 /* waiting in the wings? */
1208 if (!len) {
6bd66ee9 1209 SV ** const valp = hv_fetch(GvHVn(PL_envgv), key, klen, FALSE);
fabdb6c0 1210 if (valp)
4ab59fcc 1211 s = SvOK(*valp) ? SvPV_const(*valp, len) : "";
a0d0e21e
LW
1212 }
1213#endif
1e422769 1214
39e571d4 1215#if !defined(OS2) && !defined(AMIGAOS) && !defined(WIN32) && !defined(MSDOS)
79072805
LW
1216 /* And you'll never guess what the dog had */
1217 /* in its mouth... */
284167a5 1218 if (TAINTING_get) {
1e422769
PP
1219 MgTAINTEDDIR_off(mg);
1220#ifdef VMS
6bd66ee9 1221 if (s && klen == 8 && strEQ(key, "DCL$PATH")) {
b8ffc8df 1222 char pathbuf[256], eltbuf[256], *cp, *elt;
1e422769
PP
1223 int i = 0, j = 0;
1224
6fca0082 1225 my_strlcpy(eltbuf, s, sizeof(eltbuf));
b8ffc8df 1226 elt = eltbuf;
1e422769
PP
1227 do { /* DCL$PATH may be a search list */
1228 while (1) { /* as may dev portion of any element */
1229 if ( ((cp = strchr(elt,'[')) || (cp = strchr(elt,'<'))) ) {
1230 if ( *(cp+1) == '.' || *(cp+1) == '-' ||
1231 cando_by_name(S_IWUSR,0,elt) ) {
1232 MgTAINTEDDIR_on(mg);
1233 return 0;
1234 }
1235 }
bd61b366 1236 if ((cp = strchr(elt, ':')) != NULL)
1e422769
PP
1237 *cp = '\0';
1238 if (my_trnlnm(elt, eltbuf, j++))
1239 elt = eltbuf;
1240 else
1241 break;
1242 }
1243 j = 0;
1244 } while (my_trnlnm(s, pathbuf, i++) && (elt = pathbuf));
1245 }
1246#endif /* VMS */
12033064 1247 if (s && klen == 4 && strEQ(key,"PATH")) {
8772537c 1248 const char * const strend = s + len;
463ee0b2
LW
1249
1250 while (s < strend) {
96827780 1251 char tmpbuf[256];
c623ac67 1252 Stat_t st;
5f74f29c 1253 I32 i;
f5a63d97
AL
1254#ifdef VMS /* Hmm. How do we get $Config{path_sep} from C? */
1255 const char path_sep = '|';
1256#else
1257 const char path_sep = ':';
1258#endif
96827780 1259 s = delimcpy(tmpbuf, tmpbuf + sizeof tmpbuf,
427eaa01 1260 s, strend, path_sep, &i);
463ee0b2 1261 s++;
bb7a0f54 1262 if (i >= (I32)sizeof tmpbuf /* too long -- assume the worst */
326b5008
CB
1263#ifdef VMS
1264 || !strchr(tmpbuf, ':') /* no colon thus no device name -- assume relative path */
1265#else
1266 || *tmpbuf != '/' /* no starting slash -- assume relative path */
1267#endif
c6ed36e1 1268 || (PerlLIO_stat(tmpbuf, &st) == 0 && (st.st_mode & 2)) ) {
8990e307 1269 MgTAINTEDDIR_on(mg);
1e422769
PP
1270 return 0;
1271 }
463ee0b2 1272 }
79072805
LW
1273 }
1274 }
39e571d4 1275#endif /* neither OS2 nor AMIGAOS nor WIN32 nor MSDOS */
1e422769 1276
79072805
LW
1277 return 0;
1278}
1279
1280int
864dbfa3 1281Perl_magic_clearenv(pTHX_ SV *sv, MAGIC *mg)
85e6fe83 1282{
7918f24d 1283 PERL_ARGS_ASSERT_MAGIC_CLEARENV;
8772537c 1284 PERL_UNUSED_ARG(sv);
bd61b366 1285 my_setenv(MgPV_nolen_const(mg),NULL);
85e6fe83
LW
1286 return 0;
1287}
1288
88e89b8a 1289int
864dbfa3 1290Perl_magic_set_all_env(pTHX_ SV *sv, MAGIC *mg)
fb73857a 1291{
7918f24d 1292 PERL_ARGS_ASSERT_MAGIC_SET_ALL_ENV;
65e66c80 1293 PERL_UNUSED_ARG(mg);
b0269e46 1294#if defined(VMS)
cea2e8a9 1295 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
fb73857a 1296#else
3280af22 1297 if (PL_localizing) {
fb73857a 1298 HE* entry;
b0269e46 1299 my_clearenv();
85fbaab2
NC
1300 hv_iterinit(MUTABLE_HV(sv));
1301 while ((entry = hv_iternext(MUTABLE_HV(sv)))) {
fb73857a
PP
1302 I32 keylen;
1303 my_setenv(hv_iterkey(entry, &keylen),
85fbaab2 1304 SvPV_nolen_const(hv_iterval(MUTABLE_HV(sv), entry)));
fb73857a
PP
1305 }
1306 }
1307#endif
1308 return 0;
1309}
1310
1311int
864dbfa3 1312Perl_magic_clear_all_env(pTHX_ SV *sv, MAGIC *mg)
66b1d557 1313{
7918f24d 1314 PERL_ARGS_ASSERT_MAGIC_CLEAR_ALL_ENV;
8772537c
AL
1315 PERL_UNUSED_ARG(sv);
1316 PERL_UNUSED_ARG(mg);
b0269e46
AB
1317#if defined(VMS)
1318 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1319#else
1320 my_clearenv();
1321#endif
3e3baf6d 1322 return 0;
66b1d557
HM
1323}
1324
64ca3a65 1325#ifndef PERL_MICRO
2d4fcd5e
AJ
1326#ifdef HAS_SIGPROCMASK
1327static void
1328restore_sigmask(pTHX_ SV *save_sv)
1329{
0bd48802 1330 const sigset_t * const ossetp = (const sigset_t *) SvPV_nolen_const( save_sv );
f5a63d97 1331 (void)sigprocmask(SIG_SETMASK, ossetp, NULL);
2d4fcd5e
AJ
1332}
1333#endif
66b1d557 1334int
864dbfa3 1335Perl_magic_getsig(pTHX_ SV *sv, MAGIC *mg)
88e89b8a 1336{
88e89b8a 1337 /* Are we fetching a signal entry? */
708854f2 1338 int i = (I16)mg->mg_private;
7918f24d
NC
1339
1340 PERL_ARGS_ASSERT_MAGIC_GETSIG;
1341
708854f2 1342 if (!i) {
84c7b88c
BF
1343 STRLEN siglen;
1344 const char * sig = MgPV_const(mg, siglen);
1345 mg->mg_private = i = whichsig_pvn(sig, siglen);
708854f2
NC
1346 }
1347
e02bfb16 1348 if (i > 0) {
22c35a8c
GS
1349 if(PL_psig_ptr[i])
1350 sv_setsv(sv,PL_psig_ptr[i]);
88e89b8a 1351 else {
46da273f 1352 Sighandler_t sigstate = rsignal_state(i);
23ada85b 1353#ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
46da273f
AL
1354 if (PL_sig_handlers_initted && PL_sig_ignoring[i])
1355 sigstate = SIG_IGN;
2e34cc90
CL
1356#endif
1357#ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
46da273f
AL
1358 if (PL_sig_handlers_initted && PL_sig_defaulting[i])
1359 sigstate = SIG_DFL;
85b332e2 1360#endif
88e89b8a 1361 /* cache state so we don't fetch it again */
8aad04aa 1362 if(sigstate == (Sighandler_t) SIG_IGN)
6502358f 1363 sv_setpvs(sv,"IGNORE");
88e89b8a 1364 else
3280af22 1365 sv_setsv(sv,&PL_sv_undef);
46da273f 1366 PL_psig_ptr[i] = SvREFCNT_inc_simple_NN(sv);
88e89b8a
PP
1367 SvTEMP_off(sv);
1368 }
1369 }
1370 return 0;
1371}
1372int
864dbfa3 1373Perl_magic_clearsig(pTHX_ SV *sv, MAGIC *mg)
88e89b8a 1374{
7918f24d 1375 PERL_ARGS_ASSERT_MAGIC_CLEARSIG;
179c85a2 1376
38a124f0 1377 magic_setsig(NULL, mg);
179c85a2 1378 return sv_unmagic(sv, mg->mg_type);
88e89b8a 1379}
3d37d572 1380
0a8e0eff 1381Signal_t
8aad04aa 1382#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
b6455c53 1383Perl_csighandler(int sig, siginfo_t *sip PERL_UNUSED_DECL, void *uap PERL_UNUSED_DECL)
8aad04aa 1384#else
0a8e0eff 1385Perl_csighandler(int sig)
8aad04aa 1386#endif
0a8e0eff 1387{
1018e26f
NIS
1388#ifdef PERL_GET_SIG_CONTEXT
1389 dTHXa(PERL_GET_SIG_CONTEXT);
1390#else
85b332e2
CL
1391 dTHX;
1392#endif
ffb6256b
JH
1393#if defined(__cplusplus) && defined(__GNUC__)
1394 /* g++ doesn't support PERL_UNUSED_DECL, so the sip and uap
1395 * parameters would be warned about. */
1396 PERL_UNUSED_ARG(sip);
1397 PERL_UNUSED_ARG(uap);
1398#endif
23ada85b 1399#ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
5c1546dc 1400 (void) rsignal(sig, PL_csighandlerp);
27da23d5 1401 if (PL_sig_ignoring[sig]) return;
85b332e2 1402#endif
2e34cc90 1403#ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
27da23d5 1404 if (PL_sig_defaulting[sig])
2e34cc90
CL
1405#ifdef KILL_BY_SIGPRC
1406 exit((Perl_sig_to_vmscondition(sig)&STS$M_COND_ID)|STS$K_SEVERE|STS$M_INHIB_MSG);
1407#else
1408 exit(1);
1409#endif
1410#endif
406878dd 1411 if (
853d2c32
RGS
1412#ifdef SIGILL
1413 sig == SIGILL ||
1414#endif
1415#ifdef SIGBUS
1416 sig == SIGBUS ||
1417#endif
1418#ifdef SIGSEGV
1419 sig == SIGSEGV ||
1420#endif
1421 (PL_signals & PERL_SIGNALS_UNSAFE_FLAG))
4ffa73a3 1422 /* Call the perl level handler now--
31c91b43 1423 * with risk we may be in malloc() or being destructed etc. */
6e324d09 1424#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
80626cf1 1425 (*PL_sighandlerp)(sig, NULL, NULL);
6e324d09
CB
1426#else
1427 (*PL_sighandlerp)(sig);
92807b6d 1428#endif
406878dd 1429 else {
31c91b43 1430 if (!PL_psig_pend) return;
406878dd
GA
1431 /* Set a flag to say this signal is pending, that is awaiting delivery after
1432 * the current Perl opcode completes */
1433 PL_psig_pend[sig]++;
1434
1435#ifndef SIG_PENDING_DIE_COUNT
1436# define SIG_PENDING_DIE_COUNT 120
1437#endif
fe13d51d 1438 /* Add one to say _a_ signal is pending */
406878dd
GA
1439 if (++PL_sig_pending >= SIG_PENDING_DIE_COUNT)
1440 Perl_croak(aTHX_ "Maximal count of pending signals (%lu) exceeded",
1441 (unsigned long)SIG_PENDING_DIE_COUNT);
1442 }
0a8e0eff
NIS
1443}
1444
2e34cc90
CL
1445#if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1446void
1447Perl_csighandler_init(void)
1448{
1449 int sig;
27da23d5 1450 if (PL_sig_handlers_initted) return;
2e34cc90
CL
1451
1452 for (sig = 1; sig < SIG_SIZE; sig++) {
1453#ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
218fdd94 1454 dTHX;
27da23d5 1455 PL_sig_defaulting[sig] = 1;
5c1546dc 1456 (void) rsignal(sig, PL_csighandlerp);
2e34cc90
CL
1457#endif
1458#ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
27da23d5 1459 PL_sig_ignoring[sig] = 0;
2e34cc90
CL
1460#endif
1461 }
27da23d5 1462 PL_sig_handlers_initted = 1;
2e34cc90
CL
1463}
1464#endif
1465
7fe50b8b
LT
1466#if defined HAS_SIGPROCMASK
1467static void
1468unblock_sigmask(pTHX_ void* newset)
1469{
dc3bf405 1470 PERL_UNUSED_CONTEXT;
7fe50b8b
LT
1471 sigprocmask(SIG_UNBLOCK, (sigset_t*)newset, NULL);
1472}
1473#endif
1474
0a8e0eff
NIS
1475void
1476Perl_despatch_signals(pTHX)
1477{
1478 int sig;
1479 PL_sig_pending = 0;
1480 for (sig = 1; sig < SIG_SIZE; sig++) {
1481 if (PL_psig_pend[sig]) {
d0166017 1482 dSAVE_ERRNO;
7fe50b8b 1483#ifdef HAS_SIGPROCMASK
55534442
LT
1484 /* From sigaction(2) (FreeBSD man page):
1485 * | Signal routines normally execute with the signal that
1486 * | caused their invocation blocked, but other signals may
1487 * | yet occur.
1488 * Emulation of this behavior (from within Perl) is enabled
1489 * using sigprocmask
1490 */
1491 int was_blocked;
1492 sigset_t newset, oldset;
1493
1494 sigemptyset(&newset);
1495 sigaddset(&newset, sig);
1496 sigprocmask(SIG_BLOCK, &newset, &oldset);
1497 was_blocked = sigismember(&oldset, sig);
7fe50b8b
LT
1498 if (!was_blocked) {
1499 SV* save_sv = newSVpvn((char *)(&newset), sizeof(sigset_t));
1500 ENTER;
1501 SAVEFREESV(save_sv);
1502 SAVEDESTRUCTOR_X(unblock_sigmask, SvPV_nolen(save_sv));
1503 }
55534442 1504#endif
25da4428 1505 PL_psig_pend[sig] = 0;
6e324d09 1506#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
80626cf1 1507 (*PL_sighandlerp)(sig, NULL, NULL);
6e324d09
CB
1508#else
1509 (*PL_sighandlerp)(sig);
92807b6d 1510#endif
7fe50b8b 1511#ifdef HAS_SIGPROCMASK
55534442 1512 if (!was_blocked)
7fe50b8b 1513 LEAVE;
55534442 1514#endif
d0166017 1515 RESTORE_ERRNO;
0a8e0eff
NIS
1516 }
1517 }
1518}
1519
38a124f0 1520/* sv of NULL signifies that we're acting as magic_clearsig. */
85e6fe83 1521int
864dbfa3 1522Perl_magic_setsig(pTHX_ SV *sv, MAGIC *mg)
79072805 1523{
27da23d5 1524 dVAR;
79072805 1525 I32 i;
cbbf8932 1526 SV** svp = NULL;
2d4fcd5e
AJ
1527 /* Need to be careful with SvREFCNT_dec(), because that can have side
1528 * effects (due to closures). We must make sure that the new disposition
1529 * is in place before it is called.
1530 */
cbbf8932 1531 SV* to_dec = NULL;
e72dc28c 1532 STRLEN len;
2d4fcd5e
AJ
1533#ifdef HAS_SIGPROCMASK
1534 sigset_t set, save;
1535 SV* save_sv;
1536#endif
eb578fdb 1537 const char *s = MgPV_const(mg,len);
7918f24d
NC
1538
1539 PERL_ARGS_ASSERT_MAGIC_SETSIG;
1540
748a9306 1541 if (*s == '_') {
84c7b88c 1542 if (memEQs(s, len, "__DIE__"))
3280af22 1543 svp = &PL_diehook;
84c7b88c 1544 else if (memEQs(s, len, "__WARN__")
38a124f0
NC
1545 && (sv ? 1 : PL_warnhook != PERL_WARNHOOK_FATAL)) {
1546 /* Merge the existing behaviours, which are as follows:
1547 magic_setsig, we always set svp to &PL_warnhook
1548 (hence we always change the warnings handler)
1549 For magic_clearsig, we don't change the warnings handler if it's
1550 set to the &PL_warnhook. */
3280af22 1551 svp = &PL_warnhook;
84c7b88c
BF
1552 } else if (sv) {
1553 SV *tmp = sv_newmortal();
1554 Perl_croak(aTHX_ "No such hook: %s",
1555 pv_pretty(tmp, s, len, 0, NULL, NULL, 0));
1556 }
748a9306 1557 i = 0;
38a124f0 1558 if (svp && *svp) {
9289f461
RGS
1559 if (*svp != PERL_WARNHOOK_FATAL)
1560 to_dec = *svp;
cbbf8932 1561 *svp = NULL;
4633a7c4 1562 }
748a9306
LW
1563 }
1564 else {
708854f2
NC
1565 i = (I16)mg->mg_private;
1566 if (!i) {
84c7b88c 1567 i = whichsig_pvn(s, len); /* ...no, a brick */
58a26b12 1568 mg->mg_private = (U16)i;
708854f2 1569 }
86d86cad 1570 if (i <= 0) {
84c7b88c
BF
1571 if (sv) {
1572 SV *tmp = sv_newmortal();
1573 Perl_ck_warner(aTHX_ packWARN(WARN_SIGNAL), "No such signal: SIG%s",
1574 pv_pretty(tmp, s, len, 0, NULL, NULL, 0));
1575 }
748a9306
LW
1576 return 0;
1577 }
2d4fcd5e
AJ
1578#ifdef HAS_SIGPROCMASK
1579 /* Avoid having the signal arrive at a bad time, if possible. */
1580 sigemptyset(&set);
1581 sigaddset(&set,i);
1582 sigprocmask(SIG_BLOCK, &set, &save);
1583 ENTER;
9ff8e806 1584 save_sv = newSVpvn((char *)(&save), sizeof(sigset_t));
2d4fcd5e
AJ
1585 SAVEFREESV(save_sv);
1586 SAVEDESTRUCTOR_X(restore_sigmask, save_sv);
1587#endif
1588 PERL_ASYNC_CHECK();
2e34cc90 1589#if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
27da23d5 1590 if (!PL_sig_handlers_initted) Perl_csighandler_init();
2e34cc90 1591#endif
23ada85b 1592#ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
27da23d5 1593 PL_sig_ignoring[i] = 0;
85b332e2 1594#endif
2e34cc90 1595#ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
27da23d5 1596 PL_sig_defaulting[i] = 0;
2e34cc90 1597#endif
2d4fcd5e 1598 to_dec = PL_psig_ptr[i];
38a124f0
NC
1599 if (sv) {
1600 PL_psig_ptr[i] = SvREFCNT_inc_simple_NN(sv);
1601 SvTEMP_off(sv); /* Make sure it doesn't go away on us */
79fd3822
NC
1602
1603 /* Signals don't change name during the program's execution, so once
1604 they're cached in the appropriate slot of PL_psig_name, they can
1605 stay there.
1606
1607 Ideally we'd find some way of making SVs at (C) compile time, or
1608 at least, doing most of the work. */
1609 if (!PL_psig_name[i]) {
1610 PL_psig_name[i] = newSVpvn(s, len);
1611 SvREADONLY_on(PL_psig_name[i]);
1612 }
38a124f0 1613 } else {
79fd3822 1614 SvREFCNT_dec(PL_psig_name[i]);
38a124f0
NC
1615 PL_psig_name[i] = NULL;
1616 PL_psig_ptr[i] = NULL;
1617 }
748a9306 1618 }
38a124f0 1619 if (sv && (isGV_with_GP(sv) || SvROK(sv))) {
2d4fcd5e 1620 if (i) {
5c1546dc 1621 (void)rsignal(i, PL_csighandlerp);
2d4fcd5e 1622 }
748a9306 1623 else
b37c2d43 1624 *svp = SvREFCNT_inc_simple_NN(sv);
38a124f0 1625 } else {
9dfa190b
NC
1626 if (sv && SvOK(sv)) {
1627 s = SvPV_force(sv, len);
1628 } else {
1629 sv = NULL;
1630 }
84c7b88c 1631 if (sv && memEQs(s, len,"IGNORE")) {
9dfa190b 1632 if (i) {
23ada85b 1633#ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
9dfa190b
NC
1634 PL_sig_ignoring[i] = 1;
1635 (void)rsignal(i, PL_csighandlerp);
85b332e2 1636#else
9dfa190b 1637 (void)rsignal(i, (Sighandler_t) SIG_IGN);
85b332e2 1638#endif
9dfa190b 1639 }
2d4fcd5e 1640 }
84c7b88c 1641 else if (!sv || memEQs(s, len,"DEFAULT") || !len) {
9dfa190b 1642 if (i) {
2e34cc90 1643#ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
9dfa190b
NC
1644 PL_sig_defaulting[i] = 1;
1645 (void)rsignal(i, PL_csighandlerp);
2e34cc90 1646#else
9dfa190b 1647 (void)rsignal(i, (Sighandler_t) SIG_DFL);
2e34cc90 1648#endif
9dfa190b
NC
1649 }
1650 }
1651 else {
1652 /*
1653 * We should warn if HINT_STRICT_REFS, but without
1654 * access to a known hint bit in a known OP, we can't
1655 * tell whether HINT_STRICT_REFS is in force or not.
1656 */
1657 if (!strchr(s,':') && !strchr(s,'\''))
1658 Perl_sv_insert_flags(aTHX_ sv, 0, 0, STR_WITH_LEN("main::"),
1659 SV_GMAGIC);
1660 if (i)
1661 (void)rsignal(i, PL_csighandlerp);
1662 else
1663 *svp = SvREFCNT_inc_simple_NN(sv);
136e0459 1664 }
748a9306 1665 }
9dfa190b 1666
2d4fcd5e
AJ
1667#ifdef HAS_SIGPROCMASK
1668 if(i)
1669 LEAVE;
1670#endif
ef8d46e8 1671 SvREFCNT_dec(to_dec);
79072805
LW
1672 return 0;
1673}
64ca3a65 1674#endif /* !PERL_MICRO */
79072805
LW
1675
1676int
864dbfa3 1677Perl_magic_setisa(pTHX_ SV *sv, MAGIC *mg)
79072805 1678{
7918f24d 1679 PERL_ARGS_ASSERT_MAGIC_SETISA;
8772537c 1680 PERL_UNUSED_ARG(sv);
e1a479c5 1681
89c14e2e 1682 /* Skip _isaelem because _isa will handle it shortly */
354b0578 1683 if (PL_delaymagic & DM_ARRAY_ISA && mg->mg_type == PERL_MAGIC_isaelem)
89c14e2e
BB
1684 return 0;
1685
0e446081 1686 return magic_clearisa(NULL, mg);
463ee0b2
LW
1687}
1688
0e446081 1689/* sv of NULL signifies that we're acting as magic_setisa. */
463ee0b2 1690int
52b45067
RD
1691Perl_magic_clearisa(pTHX_ SV *sv, MAGIC *mg)
1692{
52b45067 1693 HV* stash;
7918f24d
NC
1694 PERL_ARGS_ASSERT_MAGIC_CLEARISA;
1695
52b45067 1696 /* Bail out if destruction is going on */
627364f1 1697 if(PL_phase == PERL_PHASE_DESTRUCT) return 0;
52b45067 1698
0e446081
NC
1699 if (sv)
1700 av_clear(MUTABLE_AV(sv));
52b45067 1701
6624142a
FC
1702 if (SvTYPE(mg->mg_obj) != SVt_PVGV && SvSMAGICAL(mg->mg_obj))
1703 /* This occurs with setisa_elem magic, which calls this
1704 same function. */
1705 mg = mg_find(mg->mg_obj, PERL_MAGIC_isa);
1706
316ebaf2 1707 assert(mg);
6624142a
FC
1708 if (SvTYPE(mg->mg_obj) == SVt_PVAV) { /* multiple stashes */
1709 SV **svp = AvARRAY((AV *)mg->mg_obj);
1710 I32 items = AvFILLp((AV *)mg->mg_obj) + 1;
1711 while (items--) {
1712 stash = GvSTASH((GV *)*svp++);
1713 if (stash && HvENAME(stash)) mro_isa_changed_in(stash);
1714 }
1715
1716 return 0;
1717 }
1718
52b45067 1719 stash = GvSTASH(
6624142a 1720 (const GV *)mg->mg_obj
52b45067
RD
1721 );
1722
00169e2c
FC
1723 /* The stash may have been detached from the symbol table, so check its
1724 name before doing anything. */
1725 if (stash && HvENAME_get(stash))
5562fa71 1726 mro_isa_changed_in(stash);
52b45067
RD
1727
1728 return 0;
1729}
1730
1731int
864dbfa3 1732Perl_magic_getnkeys(pTHX_ SV *sv, MAGIC *mg)
6ff81951 1733{
85fbaab2 1734 HV * const hv = MUTABLE_HV(LvTARG(sv));
6ff81951 1735 I32 i = 0;
7918f24d
NC
1736
1737 PERL_ARGS_ASSERT_MAGIC_GETNKEYS;
8772537c 1738 PERL_UNUSED_ARG(mg);
7719e241 1739
6ff81951 1740 if (hv) {
497b47a8 1741 (void) hv_iterinit(hv);
ad64d0ec 1742 if (! SvTIED_mg((const SV *)hv, PERL_MAGIC_tied))
1b95d04f 1743 i = HvUSEDKEYS(hv);
497b47a8
JH
1744 else {
1745 while (hv_iternext(hv))
1746 i++;
1747 }
6ff81951
GS
1748 }
1749
1750 sv_setiv(sv, (IV)i);
1751 return 0;
1752}
1753
1754int
864dbfa3 1755Perl_magic_setnkeys(pTHX_ SV *sv, MAGIC *mg)
946ec16e 1756{
7918f24d 1757 PERL_ARGS_ASSERT_MAGIC_SETNKEYS;
8772537c 1758 PERL_UNUSED_ARG(mg);
946ec16e 1759 if (LvTARG(sv)) {
85fbaab2 1760 hv_ksplit(MUTABLE_HV(LvTARG(sv)), SvIV(sv));
946ec16e
PP
1761 }
1762 return 0;
ac27b0f5 1763}
946ec16e 1764
efaf3674
DM
1765/*
1766=for apidoc magic_methcall
1767
1768Invoke a magic method (like FETCH).
1769
2baee27b
FC
1770C<sv> and C<mg> are the tied thingy and the tie magic.
1771
1772C<meth> is the name of the method to call.
1773
1774C<argc> is the number of args (in addition to $self) to pass to the method.
1775
1776The C<flags> can be:
1777
1778 G_DISCARD invoke method with G_DISCARD flag and don't
1779 return a value
1780 G_UNDEF_FILL fill the stack with argc pointers to
1781 PL_sv_undef
1782
1783The arguments themselves are any values following the C<flags> argument.
efaf3674
DM
1784
1785Returns the SV (if any) returned by the method, or NULL on failure.
1786
1787
1788=cut
1789*/
1790
1791SV*
36925d9e 1792Perl_magic_methcall(pTHX_ SV *sv, const MAGIC *mg, SV *meth, U32 flags,
046b0c7d 1793 U32 argc, ...)
a0d0e21e
LW
1794{
1795 dSP;
efaf3674 1796 SV* ret = NULL;
463ee0b2 1797
7918f24d
NC
1798 PERL_ARGS_ASSERT_MAGIC_METHCALL;
1799
efaf3674 1800 ENTER;
d1d7a15d
NC
1801
1802 if (flags & G_WRITING_TO_STDERR) {
1803 SAVETMPS;
1804
d1d7a15d
NC
1805 SAVESPTR(PL_stderrgv);
1806 PL_stderrgv = NULL;
1807 }
1808
efaf3674 1809 PUSHSTACKi(PERLSI_MAGIC);
924508f0 1810 PUSHMARK(SP);
efaf3674 1811
67549bd2
NC
1812 EXTEND(SP, argc+1);
1813 PUSHs(SvTIED_obj(sv, mg));
1814 if (flags & G_UNDEF_FILL) {
1815 while (argc--) {
efaf3674 1816 PUSHs(&PL_sv_undef);
93965878 1817 }
67549bd2 1818 } else if (argc > 0) {
046b0c7d
NC
1819 va_list args;
1820 va_start(args, argc);
1821
1822 do {
1823 SV *const sv = va_arg(args, SV *);
1824 PUSHs(sv);
1825 } while (--argc);
1826
1827 va_end(args);
88e89b8a 1828 }
463ee0b2 1829 PUTBACK;
efaf3674 1830 if (flags & G_DISCARD) {
36925d9e 1831 call_sv(meth, G_SCALAR|G_DISCARD|G_METHOD_NAMED);
efaf3674
DM
1832 }
1833 else {
36925d9e 1834 if (call_sv(meth, G_SCALAR|G_METHOD_NAMED))
efaf3674
DM
1835 ret = *PL_stack_sp--;
1836 }
1837 POPSTACK;
d1d7a15d
NC
1838 if (flags & G_WRITING_TO_STDERR)
1839 FREETMPS;
efaf3674
DM
1840 LEAVE;
1841 return ret;
1842}
1843
efaf3674 1844/* wrapper for magic_methcall that creates the first arg */
463ee0b2 1845
efaf3674 1846STATIC SV*
36925d9e 1847S_magic_methcall1(pTHX_ SV *sv, const MAGIC *mg, SV *meth, U32 flags,
efaf3674
DM
1848 int n, SV *val)
1849{
efaf3674
DM
1850 SV* arg1 = NULL;
1851
1852 PERL_ARGS_ASSERT_MAGIC_METHCALL1;
1853
1854 if (mg->mg_ptr) {
1855 if (mg->mg_len >= 0) {
db4b3a1d 1856 arg1 = newSVpvn_flags(mg->mg_ptr, mg->mg_len, SVs_TEMP);
efaf3674
DM
1857 }
1858 else if (mg->mg_len == HEf_SVKEY)
1859 arg1 = MUTABLE_SV(mg->mg_ptr);
1860 }
1861 else if (mg->mg_type == PERL_MAGIC_tiedelem) {
db4b3a1d 1862 arg1 = newSViv((IV)(mg->mg_len));
efaf3674
DM
1863 sv_2mortal(arg1);
1864 }
1865 if (!arg1) {
046b0c7d 1866 return Perl_magic_methcall(aTHX_ sv, mg, meth, flags, n - 1, val);
efaf3674 1867 }
046b0c7d 1868 return Perl_magic_methcall(aTHX_ sv, mg, meth, flags, n, arg1, val);
946ec16e
PP
1869}
1870
76e3520e 1871STATIC int
36925d9e 1872S_magic_methpack(pTHX_ SV *sv, const MAGIC *mg, SV *meth)
a0d0e21e 1873{
efaf3674 1874 SV* ret;
463ee0b2 1875
7918f24d
NC
1876 PERL_ARGS_ASSERT_MAGIC_METHPACK;
1877
efaf3674
DM
1878 ret = magic_methcall1(sv, mg, meth, 0, 1, NULL);
1879 if (ret)
1880 sv_setsv(sv, ret);
a0d0e21e
LW
1881 return 0;
1882}
463ee0b2 1883
a0d0e21e 1884int
864dbfa3 1885Perl_magic_getpack(pTHX_ SV *sv, MAGIC *mg)
a0d0e21e 1886{
7918f24d
NC
1887 PERL_ARGS_ASSERT_MAGIC_GETPACK;
1888
fd69380d 1889 if (mg->mg_type == PERL_MAGIC_tiedelem)
a0d0e21e 1890 mg->mg_flags |= MGf_GSKIP;
36925d9e 1891 magic_methpack(sv,mg,SV_CONST(FETCH));
463ee0b2
LW
1892 return 0;
1893}
1894
1895int
864dbfa3 1896Perl_magic_setpack(pTHX_ SV *sv, MAGIC *mg)
e336de0d 1897{
b112cff9
DM
1898 MAGIC *tmg;
1899 SV *val;
7918f24d
NC
1900
1901 PERL_ARGS_ASSERT_MAGIC_SETPACK;
1902
b112cff9
DM
1903 /* in the code C<$tied{foo} = $val>, the "thing" that gets passed to
1904 * STORE() is not $val, but rather a PVLV (the sv in this call), whose
1905 * public flags indicate its value based on copying from $val. Doing
1906 * mg_set() on the PVLV temporarily does SvMAGICAL_off(), then calls us.
1907 * So STORE()'s $_[2] arg is a temporarily disarmed PVLV. This goes
1908 * wrong if $val happened to be tainted, as sv hasn't got magic
1909 * enabled, even though taint magic is in the chain. In which case,
1910 * fake up a temporary tainted value (this is easier than temporarily
1911 * re-enabling magic on sv). */
1912
284167a5 1913 if (TAINTING_get && (tmg = mg_find(sv, PERL_MAGIC_taint))
b112cff9
DM
1914 && (tmg->mg_len & 1))
1915 {
1916 val = sv_mortalcopy(sv);
1917 SvTAINTED_on(val);
1918 }
1919 else
1920 val = sv;
1921
36925d9e 1922 magic_methcall1(sv, mg, SV_CONST(STORE), G_DISCARD, 2, val);
463ee0b2
LW
1923 return 0;
1924}
1925
1926int
864dbfa3 1927Perl_magic_clearpack(pTHX_ SV *sv, MAGIC *mg)
463ee0b2 1928{
7918f24d
NC
1929 PERL_ARGS_ASSERT_MAGIC_CLEARPACK;
1930
4c13be3f 1931 if (mg->mg_type == PERL_MAGIC_tiedscalar) return 0;
36925d9e 1932 return magic_methpack(sv,mg,SV_CONST(DELETE));
a0d0e21e 1933}
463ee0b2 1934
93965878
NIS
1935
1936U32
864dbfa3 1937Perl_magic_sizepack(pTHX_ SV *sv, MAGIC *mg)
ac27b0f5 1938{
22846ab4 1939 I32 retval = 0;
efaf3674 1940 SV* retsv;
93965878 1941
7918f24d
NC
1942 PERL_ARGS_ASSERT_MAGIC_SIZEPACK;
1943
36925d9e 1944 retsv = magic_methcall1(sv, mg, SV_CONST(FETCHSIZE), 0, 1, NULL);
efaf3674
DM
1945 if (retsv) {
1946 retval = SvIV(retsv)-1;
22846ab4
AB
1947 if (retval < -1)
1948 Perl_croak(aTHX_ "FETCHSIZE returned a negative value");
93965878 1949 }
22846ab4 1950 return (U32) retval;
93965878
NIS
1951}
1952
cea2e8a9
GS
1953int
1954Perl_magic_wipepack(pTHX_ SV *sv, MAGIC *mg)
a0d0e21e 1955{
7918f24d
NC
1956 PERL_ARGS_ASSERT_MAGIC_WIPEPACK;
1957
36925d9e 1958 Perl_magic_methcall(aTHX_ sv, mg, SV_CONST(CLEAR), G_DISCARD, 0);
463ee0b2
LW
1959 return 0;
1960}
1961
1962int
864dbfa3 1963Perl_magic_nextpack(pTHX_ SV *sv, MAGIC *mg, SV *key)
463ee0b2 1964{
efaf3674 1965 SV* ret;
463ee0b2 1966
7918f24d
NC
1967 PERL_ARGS_ASSERT_MAGIC_NEXTPACK;
1968
36925d9e
RZ
1969 ret = SvOK(key) ? Perl_magic_methcall(aTHX_ sv, mg, SV_CONST(NEXTKEY), 0, 1, key)
1970 : Perl_magic_methcall(aTHX_ sv, mg, SV_CONST(FIRSTKEY), 0, 0);
efaf3674
DM
1971 if (ret)
1972 sv_setsv(key,ret);
79072805
LW
1973 return 0;
1974}
1975
1976int
1146e912 1977Perl_magic_existspack(pTHX_ SV *sv, const MAGIC *mg)
a0d0e21e 1978{
7918f24d
NC
1979 PERL_ARGS_ASSERT_MAGIC_EXISTSPACK;
1980
36925d9e 1981 return magic_methpack(sv,mg,SV_CONST(EXISTS));
ac27b0f5 1982}
a0d0e21e 1983
a3bcc51e
TP
1984SV *
1985Perl_magic_scalarpack(pTHX_ HV *hv, MAGIC *mg)
1986{
5fcbf73d 1987 SV *retval;
ad64d0ec
NC
1988 SV * const tied = SvTIED_obj(MUTABLE_SV(hv), mg);
1989 HV * const pkg = SvSTASH((const SV *)SvRV(tied));
a3bcc51e 1990
7918f24d
NC
1991 PERL_ARGS_ASSERT_MAGIC_SCALARPACK;
1992
a3bcc51e
TP
1993 if (!gv_fetchmethod_autoload(pkg, "SCALAR", FALSE)) {
1994 SV *key;
bfcb3514 1995 if (HvEITER_get(hv))
a3bcc51e
TP
1996 /* we are in an iteration so the hash cannot be empty */
1997 return &PL_sv_yes;
1998 /* no xhv_eiter so now use FIRSTKEY */
1999 key = sv_newmortal();
ad64d0ec 2000 magic_nextpack(MUTABLE_SV(hv), mg, key);
bfcb3514 2001 HvEITER_set(hv, NULL); /* need to reset iterator */
a3bcc51e
TP
2002 return SvOK(key) ? &PL_sv_yes : &PL_sv_no;
2003 }
2004
2005 /* there is a SCALAR method that we can call */
36925d9e 2006 retval = Perl_magic_methcall(aTHX_ MUTABLE_SV(hv), mg, SV_CONST(SCALAR), 0, 0);
efaf3674 2007 if (!retval)
5fcbf73d 2008 retval = &PL_sv_undef;
a3bcc51e
TP
2009 return retval;
2010}
2011
a0d0e21e 2012int
864dbfa3 2013Perl_magic_setdbline(pTHX_ SV *sv, MAGIC *mg)
79072805 2014{
089b5c60 2015 SV **svp;
7918f24d
NC
2016
2017 PERL_ARGS_ASSERT_MAGIC_SETDBLINE;
2018
089b5c60
NC
2019 /* The magic ptr/len for the debugger's hash should always be an SV. */
2020 if (UNLIKELY(mg->mg_len != HEf_SVKEY)) {
2021 Perl_croak(aTHX_ "panic: magic_setdbline len=%"IVdf", ptr='%s'",
7b0eb0b8 2022 (IV)mg->mg_len, mg->mg_ptr);
089b5c60
NC
2023 }
2024
2025 /* Use sv_2iv instead of SvIV() as the former generates smaller code, and
2026 setting/clearing debugger breakpoints is not a hot path. */
43e4250a
FC
2027 svp = av_fetch(MUTABLE_AV(mg->mg_obj),
2028 sv_2iv(MUTABLE_SV((mg)->mg_ptr)), FALSE);
089b5c60 2029
8772537c 2030 if (svp && SvIOKp(*svp)) {
88df5f01
FC
2031 OP * const o = INT2PTR(OP*,SvIVX(*svp));
2032 if (o) {
2033#ifdef PERL_DEBUG_READONLY_OPS
2034 Slab_to_rw(OpSLAB(o));
2035#endif
2036 /* set or clear breakpoint in the relevant control op */
089b5c60 2037 if (SvTRUE(sv))
88df5f01 2038 o->op_flags |= OPf_SPECIAL;
8772537c 2039 else
88df5f01
FC
2040 o->op_flags &= ~OPf_SPECIAL;
2041#ifdef PERL_DEBUG_READONLY_OPS
2042 Slab_to_ro(OpSLAB(o));
2043#endif
8772537c 2044 }
5df8de69 2045 }
79072805
LW
2046 return 0;
2047}
2048
2049int
8772537c 2050Perl_magic_getarylen(pTHX_ SV *sv, const MAGIC *mg)
79072805 2051{
502c6561 2052 AV * const obj = MUTABLE_AV(mg->mg_obj);
7918f24d
NC
2053
2054 PERL_ARGS_ASSERT_MAGIC_GETARYLEN;
2055
83bf042f 2056 if (obj) {
e1dccc0d 2057 sv_setiv(sv, AvFILL(obj));
83bf042f 2058 } else {
d4a823b3 2059 sv_setsv(sv, NULL);
83bf042f 2060 }
79072805
LW
2061 return 0;
2062}
2063
2064int
864dbfa3 2065Perl_magic_setarylen(pTHX_ SV *sv, MAGIC *mg)
79072805 2066{
502c6561 2067 AV * const obj = MUTABLE_AV(mg->mg_obj);
7918f24d
NC
2068
2069 PERL_ARGS_ASSERT_MAGIC_SETARYLEN;
2070
83bf042f 2071 if (obj) {
e1dccc0d 2072 av_fill(obj, SvIV(sv));
83bf042f 2073 } else {
a2a5de95
NC
2074 Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
2075 "Attempt to set length of freed array");
83bf042f
NC
2076 }
2077 return 0;
2078}
2079
2080int
83f29afa
VP
2081Perl_magic_cleararylen_p(pTHX_ SV *sv, MAGIC *mg)
2082{
83f29afa
VP
2083 PERL_ARGS_ASSERT_MAGIC_CLEARARYLEN_P;
2084 PERL_UNUSED_ARG(sv);
dc3bf405 2085 PERL_UNUSED_CONTEXT;
83f29afa
VP
2086
2087 /* Reset the iterator when the array is cleared */
3565fbf3
VP
2088#if IVSIZE == I32SIZE
2089 *((IV *) &(mg->mg_len)) = 0;
2090#else
83f29afa
VP
2091 if (mg->mg_ptr)
2092 *((IV *) mg->mg_ptr) = 0;
3565fbf3 2093#endif
83f29afa
VP
2094
2095 return 0;
2096}
2097
2098int
83bf042f
NC
2099Perl_magic_freearylen_p(pTHX_ SV *sv, MAGIC *mg)
2100{
7918f24d 2101 PERL_ARGS_ASSERT_MAGIC_FREEARYLEN_P;
53c1dcc0 2102 PERL_UNUSED_ARG(sv);
7918f24d 2103
94f3782b
DM
2104 /* during global destruction, mg_obj may already have been freed */
2105 if (PL_in_clean_all)
1ea47f64 2106 return 0;
94f3782b 2107
83bf042f
NC
2108 mg = mg_find (mg->mg_obj, PERL_MAGIC_arylen);
2109
2110 if (mg) {
2111 /* arylen scalar holds a pointer back to the array, but doesn't own a
2112 reference. Hence the we (the array) are about to go away with it
2113 still pointing at us. Clear its pointer, else it would be pointing
2114 at free memory. See the comment in sv_magic about reference loops,
2115 and why it can't own a reference to us. */
2116 mg->mg_obj = 0;
2117 }
a0d0e21e
LW
2118 return 0;
2119}
2120
2121int
864dbfa3 2122Perl_magic_getpos(pTHX_ SV *sv, MAGIC *mg)
a0d0e21e 2123{
16eb5365 2124 SV* const lsv = LvTARG(sv);
96c2a8ff 2125 MAGIC * const found = mg_find_mglob(lsv);
7918f24d
NC
2126
2127 PERL_ARGS_ASSERT_MAGIC_GETPOS;
16eb5365 2128 PERL_UNUSED_ARG(mg);
ac27b0f5 2129
6174b39a
FC
2130 if (found && found->mg_len != -1) {
2131 STRLEN i = found->mg_len;
25fdce4a 2132 if (found->mg_flags & MGf_BYTES && DO_UTF8(lsv))
6174b39a
FC
2133 i = sv_pos_b2u_flags(lsv, i, SV_GMAGIC|SV_CONST_RETURN);
2134 sv_setuv(sv, i);
a0d0e21e 2135 return 0;
a0d0e21e 2136 }
35995e5c 2137 sv_setsv(sv,NULL);
a0d0e21e
LW
2138 return 0;
2139}
2140
2141int
864dbfa3 2142Perl_magic_setpos(pTHX_ SV *sv, MAGIC *mg)
a0d0e21e 2143{
16eb5365 2144 SV* const lsv = LvTARG(sv);
a0d0e21e
LW
2145 SSize_t pos;
2146 STRLEN len;
c00206c8 2147 STRLEN ulen = 0;
53d44271 2148 MAGIC* found;
aec43834 2149 const char *s;
a0d0e21e 2150
7918f24d 2151 PERL_ARGS_ASSERT_MAGIC_SETPOS;
16eb5365 2152 PERL_UNUSED_ARG(mg);
ac27b0f5 2153
96c2a8ff 2154 found = mg_find_mglob(lsv);
3881461a 2155 if (!found) {
a0d0e21e
LW
2156 if (!SvOK(sv))
2157 return 0;
96c2a8ff 2158 found = sv_magicext_mglob(lsv);
a0d0e21e
LW
2159 }
2160 else if (!SvOK(sv)) {
3881461a 2161 found->mg_len = -1;
a0d0e21e
LW
2162 return 0;
2163 }
aec43834 2164 s = SvPV_const(lsv, len);
a0d0e21e 2165
e1dccc0d 2166 pos = SvIV(sv);
a0ed51b3 2167
7e2040f0 2168 if (DO_UTF8(lsv)) {
aec43834 2169 ulen = sv_or_pv_len_utf8(lsv, s, len);
a0ed51b3
LW
2170 if (ulen)
2171 len = ulen;
a0ed51b3
LW
2172 }
2173
a0d0e21e
LW
2174 if (pos < 0) {
2175 pos += len;
2176 if (pos < 0)
2177 pos = 0;
2178 }
eb160463 2179 else if (pos > (SSize_t)len)
a0d0e21e 2180 pos = len;
a0ed51b3 2181
3881461a 2182 found->mg_len = pos;
25fdce4a 2183 found->mg_flags &= ~(MGf_MINMATCH|MGf_BYTES);
a0d0e21e 2184
79072805
LW
2185 return 0;
2186}
2187
2188int
864dbfa3 2189Perl_magic_getsubstr(pTHX_ SV *sv, MAGIC *mg)
6ff81951
GS
2190{
2191 STRLEN len;
35a4481c 2192 SV * const lsv = LvTARG(sv);
b83604b4 2193 const char * const tmps = SvPV_const(lsv,len);
777f7c56
EB
2194 STRLEN offs = LvTARGOFF(sv);
2195 STRLEN rem = LvTARGLEN(sv);
83f78d1a
FC
2196 const bool negoff = LvFLAGS(sv) & 1;
2197 const bool negrem = LvFLAGS(sv) & 2;
7918f24d
NC
2198
2199 PERL_ARGS_ASSERT_MAGIC_GETSUBSTR;
8772537c 2200 PERL_UNUSED_ARG(mg);
6ff81951 2201
83f78d1a 2202 if (!translate_substr_offsets(
4ddea69a 2203 SvUTF8(lsv) ? sv_or_pv_len_utf8(lsv, tmps, len) : len,
83f78d1a
FC
2204 negoff ? -(IV)offs : (IV)offs, !negoff,
2205 negrem ? -(IV)rem : (IV)rem, !negrem, &offs, &rem
2206 )) {
2207 Perl_ck_warner(aTHX_ packWARN(WARN_SUBSTR), "substr outside of string");
2208 sv_setsv_nomg(sv, &PL_sv_undef);
2209 return 0;
2210 }
2211
9aa983d2 2212 if (SvUTF8(lsv))
4ddea69a 2213 offs = sv_or_pv_pos_u2b(lsv, tmps, offs, &rem);
1c900557 2214 sv_setpvn(sv, tmps + offs, rem);
9aa983d2 2215 if (SvUTF8(lsv))
2ef4b674 2216 SvUTF8_on(sv);
6ff81951
GS
2217 return 0;
2218}
2219
2220int
864dbfa3 2221Perl_magic_setsubstr(pTHX_ SV *sv, MAGIC *mg)
79072805 2222{
83f78d1a 2223 STRLEN len, lsv_len, oldtarglen, newtarglen;
5fcbf73d 2224 const char * const tmps = SvPV_const(sv, len);
dd374669 2225 SV * const lsv = LvTARG(sv);
777f7c56
EB
2226 STRLEN lvoff = LvTARGOFF(sv);
2227 STRLEN lvlen = LvTARGLEN(sv);
83f78d1a
FC
2228 const bool negoff = LvFLAGS(sv) & 1;
2229 const bool neglen = LvFLAGS(sv) & 2;
7918f24d
NC
2230
2231 PERL_ARGS_ASSERT_MAGIC_SETSUBSTR;
8772537c 2232 PERL_UNUSED_ARG(mg);
075a4a2b 2233
a74fb2cd
FC
2234 SvGETMAGIC(lsv);
2235 if (SvROK(lsv))
2236 Perl_ck_warner(aTHX_ packWARN(WARN_SUBSTR),
2237 "Attempt to use reference as lvalue in substr"
2238 );
fc061ed8
FC
2239 SvPV_force_nomg(lsv,lsv_len);
2240 if (SvUTF8(lsv)) lsv_len = sv_len_utf8_nomg(lsv);
83f78d1a
FC
2241 if (!translate_substr_offsets(
2242 lsv_len,
2243 negoff ? -(IV)lvoff : (IV)lvoff, !negoff,
2244 neglen ? -(IV)lvlen : (IV)lvlen, !neglen, &lvoff, &lvlen
2245 ))
2246 Perl_croak(aTHX_ "substr outside of string");
2247 oldtarglen = lvlen;
1aa99e6b 2248 if (DO_UTF8(sv)) {
73a087f0 2249 sv_utf8_upgrade_nomg(lsv);
d931b1be 2250 lvoff = sv_pos_u2b_flags(lsv, lvoff, &lvlen, SV_CONST_RETURN);
a74fb2cd 2251 sv_insert_flags(lsv, lvoff, lvlen, tmps, len, 0);
7a385470 2252 newtarglen = sv_or_pv_len_utf8(sv, tmps, len);
9aa983d2
JH
2253 SvUTF8_on(lsv);
2254 }
0d336106 2255 else if (SvUTF8(lsv)) {
5fcbf73d 2256 const char *utf8;
d931b1be 2257 lvoff = sv_pos_u2b_flags(lsv, lvoff, &lvlen, SV_CONST_RETURN);
83f78d1a 2258 newtarglen = len;
5fcbf73d 2259 utf8 = (char*)bytes_to_utf8((U8*)tmps, &len);
a74fb2cd 2260 sv_insert_flags(lsv, lvoff, lvlen, utf8, len, 0);
5fcbf73d 2261 Safefree(utf8);
1aa99e6b 2262 }
b76f3ce2 2263 else {
a74fb2cd 2264 sv_insert_flags(lsv, lvoff, lvlen, tmps, len, 0);
83f78d1a 2265 newtarglen = len;
b76f3ce2 2266 }
83f78d1a
FC
2267 if (!neglen) LvTARGLEN(sv) = newtarglen;
2268 if (negoff) LvTARGOFF(sv) += newtarglen - oldtarglen;
b76f3ce2 2269
79072805
LW
2270 return 0;
2271}
2272
2273int
864dbfa3 2274Perl_magic_gettaint(pTHX_ SV *sv, MAGIC *mg)
463ee0b2 2275{
7918f24d 2276 PERL_ARGS_ASSERT_MAGIC_GETTAINT;
8772537c 2277 PERL_UNUSED_ARG(sv);
9a9b5ec9
DM
2278#ifdef NO_TAINT_SUPPORT
2279 PERL_UNUSED_ARG(mg);
2280#endif
7918f24d 2281
64ff300b 2282 TAINT_IF((PL_localizing != 1) && (mg->mg_len & 1) && IN_PERL_RUNTIME);
463ee0b2
LW
2283 return 0;
2284}
2285
2286int
864dbfa3 2287Perl_magic_settaint(pTHX_ SV *sv, MAGIC *mg)
463ee0b2 2288{
7918f24d 2289 PERL_ARGS_ASSERT_MAGIC_SETTAINT;
8772537c 2290 PERL_UNUSED_ARG(sv);
7918f24d 2291
b01e650a 2292 /* update taint status */
284167a5 2293 if (TAINT_get)
b01e650a
DM
2294 mg->mg_len |= 1;
2295 else
2296 mg->mg_len &= ~1;
463ee0b2
LW
2297 return 0;
2298}
2299
2300int
864dbfa3 2301Perl_magic_getvec(pTHX_ SV *sv, MAGIC *mg)
6ff81951 2302{
35a4481c 2303 SV * const lsv = LvTARG(sv);
7918f24d
NC
2304
2305 PERL_ARGS_ASSERT_MAGIC_GETVEC;
8772537c 2306 PERL_UNUSED_ARG(mg);
6ff81951 2307
2e9e14dd 2308 sv_setuv(sv, do_vecget(lsv, LvTARGOFF(sv), LvTARGLEN(sv)));
6ff81951 2309
6ff81951
GS
2310 return 0;
2311}
2312
2313int
864dbfa3 2314Perl_magic_setvec(pTHX_ SV *sv, MAGIC *mg)
79072805 2315{
7918f24d 2316 PERL_ARGS_ASSERT_MAGIC_SETVEC;
8772537c 2317 PERL_UNUSED_ARG(mg);
79072805
LW
2318 do_vecset(sv); /* XXX slurp this routine */
2319 return 0;
2320}
2321
13733cde
FC
2322SV *
2323Perl_defelem_target(pTHX_ SV *sv, MAGIC *mg)
5f05dabc 2324{
a0714e2c 2325 SV *targ = NULL;
13733cde
FC
2326 PERL_ARGS_ASSERT_DEFELEM_TARGET;
2327 if (!mg) mg = mg_find(sv, PERL_MAGIC_defelem);
2328 assert(mg);
5f05dabc 2329 if (LvTARGLEN(sv)) {
68dc0745 2330 if (mg->mg_obj) {
8772537c 2331 SV * const ahv = LvTARG(sv);
85fbaab2 2332 HE * const he = hv_fetch_ent(MUTABLE_HV(ahv), mg->mg_obj, FALSE, 0);
6d822dc4
MS
2333 if (he)
2334 targ = HeVAL(he);
68dc0745 2335 }
bbfdc870 2336 else if (LvSTARGOFF(sv) >= 0) {
502c6561 2337 AV *const av = MUTABLE_AV(LvTARG(sv));
bbfdc870 2338 if (LvSTARGOFF(sv) <= AvFILL(av))
ca58dfd9
FC
2339 {
2340 if (SvRMAGICAL(av)) {
2341 SV * const * const svp = av_fetch(av, LvSTARGOFF(sv), 0);
2342 targ = svp ? *svp : NULL;
2343 }
2344 else
bbfdc870 2345 targ = AvARRAY(av)[LvSTARGOFF(sv)];
ca58dfd9 2346 }
68dc0745 2347 }
46da273f 2348 if (targ && (targ != &PL_sv_undef)) {
68dc0745
PP
2349 /* somebody else defined it for us */
2350 SvREFCNT_dec(LvTARG(sv));
b37c2d43 2351 LvTARG(sv) = SvREFCNT_inc_simple_NN(targ);
68dc0745
PP
2352 LvTARGLEN(sv) = 0;
2353 SvREFCNT_dec(mg->mg_obj);
a0714e2c 2354 mg->mg_obj = NULL;
68dc0745
PP
2355 mg->mg_flags &= ~MGf_REFCOUNTED;
2356 }
13733cde 2357 return targ;
5f05dabc 2358 }
71be2cbc 2359 else
13733cde
FC
2360 return LvTARG(sv);
2361}
2362
2363int
2364Perl_magic_getdefelem(pTHX_ SV *sv, MAGIC *mg)
2365{
2366 PERL_ARGS_ASSERT_MAGIC_GETDEFELEM;
2367
2368 sv_setsv(sv, defelem_target(sv, mg));
71be2cbc
PP
2369 return 0;
2370}
2371
2372int
864dbfa3 2373Perl_magic_setdefelem(pTHX_ SV *sv, MAGIC *mg)
71be2cbc 2374{
7918f24d 2375 PERL_ARGS_ASSERT_MAGIC_SETDEFELEM;
8772537c 2376 PERL_UNUSED_ARG(mg);
71be2cbc 2377 if (LvTARGLEN(sv))
68dc0745
PP
2378 vivify_defelem(sv);
2379 if (LvTARG(sv)) {
5f05dabc 2380 sv_setsv(LvTARG(sv), sv);
68dc0745
PP
2381 SvSETMAGIC(LvTARG(sv));
2382 }
5f05dabc
PP
2383 return 0;
2384}
2385
71be2cbc 2386void
864dbfa3 2387Perl_vivify_defelem(pTHX_ SV *sv)
71be2cbc 2388{
74e13ce4 2389 MAGIC *mg;
a0714e2c 2390 SV *value = NULL;
71be2cbc 2391
7918f24d
NC
2392 PERL_ARGS_ASSERT_VIVIFY_DEFELEM;
2393
14befaf4 2394 if (!LvTARGLEN(sv) || !(mg = mg_find(sv, PERL_MAGIC_defelem)))
71be2cbc 2395 return;
68dc0745 2396 if (mg->mg_obj) {
8772537c 2397 SV * const ahv = LvTARG(sv);
85fbaab2 2398 HE * const he = hv_fetch_ent(MUTABLE_HV(ahv), mg->mg_obj, TRUE, 0);
6d822dc4
MS
2399 if (he)
2400 value = HeVAL(he);
3280af22 2401 if (!value || value == &PL_sv_undef)
be2597df 2402 Perl_croak(aTHX_ PL_no_helem_sv, SVfARG(mg->mg_obj));
71be2cbc 2403 }
bbfdc870
FC
2404 else if (LvSTARGOFF(sv) < 0)
2405 Perl_croak(aTHX_ PL_no_aelem, LvSTARGOFF(sv));
68dc0745 2406 else {
502c6561 2407 AV *const av = MUTABLE_AV(LvTARG(sv));
bbfdc870 2408 if ((I32)LvTARGLEN(sv) < 0 && LvSTARGOFF(sv) > AvFILL(av))
a0714e2c 2409 LvTARG(sv) = NULL; /* array can't be extended */
68dc0745 2410 else {
bbfdc870 2411 SV* const * const svp = av_fetch(av, LvSTARGOFF(sv), TRUE);
031c6d82 2412 if (!svp || !(value = *svp))
bbfdc870 2413 Perl_croak(aTHX_ PL_no_aelem, LvSTARGOFF(sv));
68dc0745
PP
2414 }
2415 }
b37c2d43 2416 SvREFCNT_inc_simple_void(value);
68dc0745
PP
2417 SvREFCNT_dec(LvTARG(sv));
2418 LvTARG(sv) = value;
71be2cbc 2419 LvTARGLEN(sv) = 0;
68dc0745 2420 SvREFCNT_dec(mg->mg_obj);
a0714e2c 2421 mg->mg_obj = NULL;
68dc0745 2422 mg->mg_flags &= ~MGf_REFCOUNTED;
5f05dabc
PP
2423}
2424
2425int
864dbfa3 2426Perl_magic_killbackrefs(pTHX_ SV *sv, MAGIC *mg)
810b8aa5 2427{
7918f24d 2428 PERL_ARGS_ASSERT_MAGIC_KILLBACKREFS;
5648c0ae
DM
2429 Perl_sv_kill_backrefs(aTHX_ sv, MUTABLE_AV(mg->mg_obj));
2430 return 0;
810b8aa5
GS
2431}
2432
2433int
864dbfa3 2434Perl_magic_setmglob(pTHX_ SV *sv, MAGIC *mg)
93a17b20 2435{
7918f24d 2436 PERL_ARGS_ASSERT_MAGIC_SETMGLOB;
96a5add6 2437 PERL_UNUSED_CONTEXT;
0177730e 2438 PERL_UNUSED_ARG(sv);
565764a8 2439 mg->mg_len = -1;
93a17b20
LW
2440 return 0;
2441}
2442
2443int
864dbfa3 2444Perl_magic_setuvar(pTHX_ SV *sv, MAGIC *mg)
79072805 2445{
35a4481c 2446 const struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
79072805 2447
7918f24d
NC
2448 PERL_ARGS_ASSERT_MAGIC_SETUVAR;
2449
79072805 2450 if (uf && uf->uf_set)
24f81a43 2451 (*uf->uf_set)(aTHX_ uf->uf_index, sv);
79072805
LW
2452 return 0;
2453}
2454
c277df42 2455int
faf82a0b
AE
2456Perl_magic_setregexp(pTHX_ SV *sv, MAGIC *mg)
2457{
488344d2 2458 const char type = mg->mg_type;
7918f24d
NC
2459
2460 PERL_ARGS_ASSERT_MAGIC_SETREGEXP;
2461
488344d2
NC
2462 if (type == PERL_MAGIC_qr) {
2463 } else if (type == PERL_MAGIC_bm) {
2464 SvTAIL_off(sv);
2465 SvVALID_off(sv);
2466 } else {
2467 assert(type == PERL_MAGIC_fm);
488344d2
NC
2468 }
2469 return sv_unmagic(sv, type);
faf82a0b
AE
2470}
2471
7a4c00b4 2472#ifdef USE_LOCALE_COLLATE
79072805 2473int
864dbfa3 2474Perl_magic_setcollxfrm(pTHX_ SV *sv, MAGIC *mg)
bbce6d69 2475{
7918f24d
NC
2476 PERL_ARGS_ASSERT_MAGIC_SETCOLLXFRM;
2477
bbce6d69 2478 /*
838b5b74 2479 * RenE<eacute> Descartes said "I think not."
bbce6d69
PP
2480 * and vanished with a faint plop.
2481 */
96a5add6 2482 PERL_UNUSED_CONTEXT;
8772537c 2483 PERL_UNUSED_ARG(sv);
7a4c00b4
PP
2484 if (mg->mg_ptr) {
2485 Safefree(mg->mg_ptr);
2486 mg->mg_ptr = NULL;
565764a8 2487 mg->mg_len = -1;
7a4c00b4 2488 }
bbce6d69
PP
2489 return 0;
2490}
7a4c00b4 2491#endif /* USE_LOCALE_COLLATE */
bbce6d69 2492
7e8c5dac
HS
2493/* Just clear the UTF-8 cache data. */
2494int
2495Perl_magic_setutf8(pTHX_ SV *sv, MAGIC *mg)
2496{
7918f24d 2497 PERL_ARGS_ASSERT_MAGIC_SETUTF8;
96a5add6 2498 PERL_UNUSED_CONTEXT;
8772537c 2499 PERL_UNUSED_ARG(sv);
7e8c5dac 2500 Safefree(mg->mg_ptr); /* The mg_ptr holds the pos cache. */
3881461a 2501 mg->mg_ptr = NULL;
7e8c5dac
HS
2502 mg->mg_len = -1; /* The mg_len holds the len cache. */
2503 return 0;
2504}
2505
bbce6d69 2506int
9cce4f9a
FC
2507Perl_magic_setlvref(pTHX_ SV *sv, MAGIC *mg)
2508{
9782ce69 2509 const char *bad = NULL;
9cce4f9a 2510 PERL_ARGS_ASSERT_MAGIC_SETLVREF;
26a50d99 2511 if (!SvROK(sv)) Perl_croak(aTHX_ "Assigned value is not a reference");
9782ce69
FC
2512 switch (mg->mg_private & OPpLVREF_TYPE) {
2513 case OPpLVREF_SV:
2514 if (SvTYPE(SvRV(sv)) > SVt_PVLV)
2515 bad = " SCALAR";
2516 break;
2517 case OPpLVREF_AV:
2518 if (SvTYPE(SvRV(sv)) != SVt_PVAV)
2519 bad = "n ARRAY";
2520 break;
2521 case OPpLVREF_HV:
2522 if (SvTYPE(SvRV(sv)) != SVt_PVHV)
2523 bad = " HASH";
2524 break;
2525 case OPpLVREF_CV:
2526 if (SvTYPE(SvRV(sv)) != SVt_PVCV)
2527 bad = " CODE";
2528 }
2529 if (bad)
26a50d99 2530 /* diag_listed_as: Assigned value is not %s reference */
9782ce69 2531 Perl_croak(aTHX_ "Assigned value is not a%s reference", bad);
c146a62a
FC
2532 switch (mg->mg_obj ? SvTYPE(mg->mg_obj) : 0) {
2533 case 0:
2534 {
2535 SV * const old = PAD_SV(mg->mg_len);
2536 PAD_SETSV(mg->mg_len, SvREFCNT_inc_NN(SvRV(sv)));
2537 SvREFCNT_dec(old);
2538 break;
2539 }
2540 case SVt_PVGV:
2541 gv_setref(mg->mg_obj, sv);
2542 SvSETMAGIC(mg->mg_obj);
6102323a
FC
2543 break;
2544 case SVt_PVAV:
2545 av_store((AV *)mg->mg_obj, SvIV((SV *)mg->mg_ptr),
2546 SvREFCNT_inc_simple_NN(SvRV(sv)));
5f94141d
FC
2547 break;
2548 case SVt_PVHV:
2549 hv_store_ent((HV *)mg->mg_obj, (SV *)mg->mg_ptr,
2550 SvREFCNT_inc_simple_NN(SvRV(sv)), 0);
c146a62a 2551 }
d39c26a6
FC
2552 if (mg->mg_flags & MGf_PERSIST)
2553 NOOP; /* This sv is in use as an iterator var and will be reused,
2554 so we must leave the magic. */
2555 else
2556 /* This sv could be returned by the assignment op, so clear the
2557 magic, as lvrefs are an implementation detail that must not be
2558 leaked to the user. */
2559 sv_unmagic(sv, PERL_MAGIC_lvref);
9cce4f9a
FC
2560 return 0;
2561}
2562
2563int
864dbfa3 2564Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
79072805 2565{
20b7effb 2566#ifdef USE_ITHREADS
97aff369 2567 dVAR;
20b7effb 2568#endif
eb578fdb
KW
2569 const char *s;
2570 I32 paren;
2571 const REGEXP * rx;
79072805 2572 I32 i;
8990e307 2573 STRLEN len;
125b9982 2574 MAGIC *tmg;
2fdbfb4d 2575
7918f24d
NC
2576 PERL_ARGS_ASSERT_MAGIC_SET;
2577
e91d8259 2578 if (!mg->mg_ptr) {
960b831f 2579 paren = mg->mg_len;
1e05feb3 2580 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
e91d8259 2581 setparen_got_rx:
2fdbfb4d 2582 CALLREG_NUMBUF_STORE((REGEXP * const)rx,paren,sv);
1e05feb3 2583 } else {
2fdbfb4d
AB
2584 /* Croak with a READONLY error when a numbered match var is
2585 * set without a previous pattern match. Unless it's C<local $1>
2586 */
e91d8259 2587 croakparen:
2fdbfb4d 2588 if (!PL_localizing) {
cb077ed2 2589 Perl_croak_no_modify();
2fdbfb4d
AB
2590 }
2591 }
e91d8259
NC
2592 return 0;
2593 }
2594
2595 switch (*mg->mg_ptr) {
748a9306 2596 case '\001': /* ^A */
f2da823f
FC
2597 if (SvOK(sv)) sv_copypv(PL_bodytarget, sv);
2598 else SvOK_off(PL_bodytarget);
64eff8b7
DM
2599 FmLINES(PL_bodytarget) = 0;
2600 if (SvPOK(PL_bodytarget)) {
2601 char *s = SvPVX(PL_bodytarget);
2602 while ( ((s = strchr(s, '\n'))) ) {
2603 FmLINES(PL_bodytarget)++;
2604 s++;
2605 }
2606 }
125b9982 2607 /* mg_set() has temporarily made sv non-magical */
284167a5 2608 if (TAINTING_get) {
125b9982
NT
2609 if ((tmg = mg_find(sv,PERL_MAGIC_taint)) && tmg->mg_len & 1)
2610 SvTAINTED_on(PL_bodytarget);
2611 else
2612 SvTAINTED_off(PL_bodytarget);
2613 }
748a9306 2614 break;
49460fe6 2615 case '\003': /* ^C */
f2338a2e 2616 PL_minus_c = cBOOL(SvIV(sv));
49460fe6
NIS
2617 break;
2618
79072805 2619 case '\004': /* ^D */
b4ab917c 2620#ifdef DEBUGGING
b83604b4 2621 s = SvPV_nolen_const(sv);
ddcf8bc1 2622 PL_debug = get_debug_opts(&s, 0) | DEBUG_TOP_FLAG;
a58fb6f9
CS
2623 if (DEBUG_x_TEST || DEBUG_B_TEST)
2624 dump_all_perl(!DEBUG_B_TEST);
b4ab917c 2625#else
38ab35f8 2626 PL_debug = (SvIV(sv)) | DEBUG_TOP_FLAG;
b4ab917c 2627#endif
79072805 2628 break;
28f23441 2629 case '\005': /* ^E */
d0063567 2630 if (*(mg->mg_ptr+1) == '\0') {
e37778c2 2631#ifdef VMS
38ab35f8 2632 set_vaxc_errno(SvIV(sv));
e37778c2
NC
2633#else
2634# ifdef WIN32
d0063567 2635 SetLastError( SvIV(sv) );
e37778c2
NC
2636# else
2637# ifdef OS2
38ab35f8 2638 os2_setsyserrno(SvIV(sv));
e37778c2 2639# else
d0063567 2640 /* will anyone ever use this? */
38ab35f8 2641 SETERRNO(SvIV(sv), 4);
048c1ddf
IZ
2642# endif
2643# endif
22fae026 2644#endif
d0063567 2645 }
3e669301
KW
2646 else {
2647 unsigned int offset = 1;
2648 bool lex = FALSE;
2649
2650 /* It may be the shadow variable ${E_NCODING} which has lexical
2651 * scope. See comments at Perl__get_encoding in this file */
2652 if (*(mg->mg_ptr + 1) == '_') {
199670db
FC
2653 if (CopSTASH(PL_curcop) != get_hv("encoding::",0))
2654 Perl_croak_no_modify();
3e669301
KW
2655 lex = TRUE;
2656 offset++;
2657 }
2658 if (strEQ(mg->mg_ptr + offset, "NCODING")) {
2659 if (lex) { /* Use the shadow global */
2660 SvREFCNT_dec(PL_lex_encoding);
2661 if (SvOK(sv) || SvGMAGICAL(sv)) {
2662 PL_lex_encoding = newSVsv(sv);
2663 }
2664 else {
2665 PL_lex_encoding = NULL;
2666 }
2667 }
2668 else { /* Use the regular global */
050e2cbf
KW
2669 SvREFCNT_dec(PL_encoding);
2670 if (SvOK(sv) || SvGMAGICAL(sv)) {
d5b4785c
DIM
2671 if (PL_localizing != 2) {
2672 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
2673 "Setting ${^ENCODING} is deprecated");
2674 }
050e2cbf
KW
2675 PL_encoding = newSVsv(sv);
2676 }
2677 else {
2678 PL_encoding = NULL;
2679 }
2680 }
3e669301
KW
2681 }
2682 }
d0063567 2683 break;
79072805 2684 case '\006': /* ^F */
38ab35f8 2685 PL_maxsysfd = SvIV(sv);
79072805 2686 break;
a0d0e21e 2687 case '\010': /* ^H */
38ab35f8 2688 PL_hints = SvIV(sv);
a0d0e21e 2689 break;
9d116dd7 2690 case '\011': /* ^I */ /* NOT \t in EBCDIC */
43c5f42d 2691 Safefree(PL_inplace);
bd61b366 2692 PL_inplace = SvOK(sv) ? savesvpv(sv) : NULL;
da78da6e 2693 break;
d9bad346
FC
2694 case '\016': /* ^N */
2695 if (PL_curpm && (rx = PM_GETRE(PL_curpm))
2696 && (paren = RX_LASTCLOSEPAREN(rx))) goto setparen_got_rx;
2697 goto croakparen;
28f23441 2698 case '\017': /* ^O */
ac27b0f5 2699 if (*(mg->mg_ptr+1) == '\0') {
43c5f42d 2700 Safefree(PL_osname);
bd61b366 2701 PL_osname = NULL;
3511154c
DM
2702 if (SvOK(sv)) {
2703 TAINT_PROPER("assigning to $^O");
2e0de35c 2704 PL_osname = savesvpv(sv);
3511154c 2705 }
ac27b0f5
NIS
2706 }
2707 else if (strEQ(mg->mg_ptr, "\017PEN")) {
8b850bd5
NC
2708 STRLEN len;
2709 const char *const start = SvPV(sv, len);
b54fc2b6 2710 const char *out = (const char*)memchr(start, '\0', len);
8b850bd5 2711 SV *tmp;
8b850bd5
NC
2712
2713
2714 PL_compiling.cop_hints |= HINT_LEXICAL_IO_IN | HINT_LEXICAL_IO_OUT;
f747ebd6 2715 PL_hints |= HINT_LEXICAL_IO_IN | HINT_LEXICAL_IO_OUT;
8b850bd5
NC
2716
2717 /* Opening for input is more common than opening for output, so
2718 ensure that hints for input are sooner on linked list. */
59cd0e26 2719 tmp = out ? newSVpvn_flags(out + 1, start + len - out - 1,
f747ebd6
Z
2720 SvUTF8(sv))
2721 : newSVpvs_flags("", SvUTF8(sv));
2722 (void)hv_stores(GvHV(PL_hintgv), "open>", tmp);
2723 mg_set(tmp);
8b850bd5 2724
f747ebd6
Z
2725 tmp = newSVpvn_flags(start, out ? (STRLEN)(out - start) : len,
2726 SvUTF8(sv));
2727 (void)hv_stores(GvHV(PL_hintgv), "open<", tmp);
2728 mg_set(tmp);
ac27b0f5 2729 }
28f23441 2730 break;
79072805 2731 case '\020': /* ^P */
2fdbfb4d
AB
2732 PL_perldb = SvIV(sv);
2733 if (PL_perldb && !PL_DBsingle)
2734 init_debugger();
9b9e0be4 2735 break;
79072805 2736 case '\024': /* ^T */
88e89b8a 2737#ifdef BIG_TIME
6b88bc9c 2738 PL_basetime = (Time_t)(SvNOK(sv) ? SvNVX(sv) : sv_2nv(sv));
88e89b8a 2739#else
38ab35f8 2740 PL_basetime = (Time_t)SvIV(sv);
88e89b8a 2741#endif
79072805 2742 break;
e07ea26a
NC
2743 case '\025': /* ^UTF8CACHE */
2744 if (strEQ(mg->mg_ptr+1, "TF8CACHE")) {
2745 PL_utf8cache = (signed char) sv_2iv(sv);
2746 }
2747 break;
fde18df1 2748 case '\027': /* ^W & $^WARNING_BITS */
4438c4b7
JH
2749 if (*(mg->mg_ptr+1) == '\0') {
2750 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
38ab35f8 2751 i = SvIV(sv);
ac27b0f5 2752 PL_dowarn = (PL_dowarn & ~G_WARN_ON)
0453d815 2753 | (i ? G_WARN_ON : G_WARN_OFF) ;
4438c4b7 2754 }
599cee73 2755 }
0a378802 2756 else if (strEQ(mg->mg_ptr+1, "ARNING_BITS")) {
4438c4b7 2757 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
7e4f0450
FC
2758 if (!SvPOK(sv)) {
2759 PL_compiling.cop_warnings = pWARN_STD;
d775746e
GS
2760 break;
2761 }
f4fc7782 2762 {
b5477537 2763 STRLEN len, i;
d3a7d8c7 2764 int accumulate = 0 ;
f4fc7782 2765 int any_fatals = 0 ;
b83604b4 2766 const char * const ptr = SvPV_const(sv, len) ;
f4fc7782
JH
2767 for (i = 0 ; i < len ; ++i) {
2768 accumulate |= ptr[i] ;
2769 any_fatals |= (ptr[i] & 0xAA) ;
2770 }
4243c432
NC
2771 if (!accumulate) {
2772 if (!specialWARN(PL_compiling.cop_warnings))
2773 PerlMemShared_free(PL_compiling.cop_warnings);
2774 PL_compiling.cop_warnings = pWARN_NONE;
2775 }
72dc9ed5 2776 /* Yuck. I can't see how to abstract this: */
2f3f0b56
KW
2777 else if (isWARN_on(
2778 ((STRLEN *)SvPV_nolen_const(sv)) - 1,
2779 WARN_ALL)
2780 && !any_fatals)
2781 {
4243c432
NC
2782 if (!specialWARN(PL_compiling.cop_warnings))
2783 PerlMemShared_free(PL_compiling.cop_warnings);
f4fc7782
JH
2784 PL_compiling.cop_warnings = pWARN_ALL;
2785 PL_dowarn |= G_WARN_ONCE ;
727405f8 2786 }
d3a7d8c7 2787 else {
72dc9ed5
NC
2788 STRLEN len;
2789 const char *const p = SvPV_const(sv, len);
2790
2791 PL_compiling.cop_warnings
8ee4cf24 2792 = Perl_new_warnings_bitfield(aTHX_ PL_compiling.cop_warnings,
72dc9ed5
NC
2793 p, len);
2794
d3a7d8c7
GS
2795 if (isWARN_on(PL_compiling.cop_warnings, WARN_ONCE))
2796 PL_dowarn |= G_WARN_ONCE ;
2797 }
f4fc7782 2798
d3a7d8c7 2799 }
4438c4b7 2800 }
971a9dd3 2801 }
79072805
LW
2802 break;
2803 case '.':
3280af22
NIS
2804 if (PL_localizing) {
2805 if (PL_localizing == 1)
7766f137 2806 SAVESPTR(PL_last_in_gv);
748a9306 2807 }
3280af22 2808 else if (SvOK(sv) && GvIO(PL_last_in_gv))
632db599 2809 IoLINES(GvIOp(PL_last_in_gv)) = SvIV(sv);
79072805
LW
2810 break;
2811 case '^':
acbe1b9d
FC
2812 Safefree(IoTOP_NAME(GvIOp(PL_defoutgv)));
2813 s = IoTOP_NAME(GvIOp(PL_defoutgv)) = savesvpv(sv);
2814 IoTOP_GV(GvIOp(PL_defoutgv)) = gv_fetchsv(sv, GV_ADD, SVt_PVIO);
79072805
LW
2815 break;
2816 case '~':
acbe1b9d
FC
2817 Safefree(IoFMT_NAME(GvIOp(PL_defoutgv)));
2818 s = IoFMT_NAME(GvIOp(PL_defoutgv)) = savesvpv(sv);
2819 IoFMT_GV(GvIOp(PL_defoutgv)) = gv_fetchsv(sv, GV_ADD, SVt_PVIO);
79072805
LW
2820 break;
2821 case '=':
acbe1b9d 2822 IoPAGE_LEN(GvIOp(PL_defoutgv)) = (SvIV(sv));
79072805
LW
2823 break;
2824 case '-':
acbe1b9d
FC
2825 IoLINES_LEFT(GvIOp(PL_defoutgv)) = (SvIV(sv));
2826 if (IoLINES_LEFT(GvIOp(PL_defoutgv)) < 0L)
099be4f1 2827 IoLINES_LEFT(GvIOp(PL_defoutgv)) = 0L;
79072805
LW
2828 break;
2829 case '%':
acbe1b9d 2830 IoPAGE(GvIOp(PL_defoutgv)) = (SvIV(sv));
79072805
LW
2831 break;
2832 case '|':
4b65379b 2833 {
099be4f1 2834 IO * const io = GvIO(PL_defoutgv);
720f287d
AB
2835 if(!io)
2836 break;
38ab35f8 2837 if ((SvIV(sv)) == 0)
4b65379b
CS
2838 IoFLAGS(io) &= ~IOf_FLUSH;
2839 else {
2840 if (!(IoFLAGS(io) & IOf_FLUSH)) {
2841 PerlIO *ofp = IoOFP(io);
2842 if (ofp)
2843 (void)PerlIO_flush(ofp);
2844 IoFLAGS(io) |= IOf_FLUSH;
2845 }
2846 }
79072805
LW
2847 }
2848 break;
79072805 2849 case '/':
1ab48e3a
YO
2850 {
2851 SV *tmpsv= sv;
2852 if (SvROK(sv)) {
2853 SV *referent= SvRV(sv);
2854 const char *reftype= sv_reftype(referent, 0);
2855 /* XXX: dodgy type check: This leaves me feeling dirty, but the alternative
2856 * is to copy pretty much the entire sv_reftype() into this routine, or to do
2857 * a full string comparison on the return of sv_reftype() both of which
2858 * make me feel worse! NOTE, do not modify this comment without reviewing the
2859 * corresponding comment in sv_reftype(). - Yves */
2860 if (reftype[0] == 'S' || reftype[0] == 'L') {
2861 IV val= SvIV(referent);
2862 if (val <= 0) {
2863 tmpsv= &PL_sv_undef;
ddc3d23f 2864 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
1ab48e3a
YO
2865 "Setting $/ to a reference to %s as a form of slurp is deprecated, treating as undef",
2866 SvIV(SvRV(sv)) < 0 ? "a negative integer" : "zero"
2867 );
2868 }
2869 } else {
ee0ba734 2870 /* diag_listed_as: Setting $/ to %s reference is forbidden */
a48e4205
FC
2871 Perl_croak(aTHX_ "Setting $/ to a%s %s reference is forbidden",
2872 *reftype == 'A' ? "n" : "", reftype);
1ab48e3a
YO
2873 }
2874 }
b3a2acfa 2875 SvREFCNT_dec(PL_rs);
1ab48e3a 2876 PL_rs = newSVsv(tmpsv);
b3a2acfa 2877 }
79072805
LW
2878 break;
2879 case '\\':
ef8d46e8 2880 SvREFCNT_dec(PL_ors_sv);
6bc2995b 2881 if (SvOK(sv)) {
7889fe52 2882 PL_ors_sv = newSVsv(sv);
009c130f 2883 }
e3c19b7b 2884 else {
a0714e2c 2885 PL_ors_sv = NULL;
e3c19b7b 2886 }
79072805 2887 break;
7d69d4a6
FC
2888 case '[':
2889 if (SvIV(sv) != 0)
2890 Perl_croak(aTHX_ "Assigning non-zero to $[ is no longer possible");
2891 break;
79072805 2892 case '?':
ff0cee69 2893#ifdef COMPLEX_STATUS
6b88bc9c 2894 if (PL_localizing == 2) {
41cb7b2b 2895 SvUPGRADE(sv, SVt_PVLV);
6b88bc9c
GS
2896 PL_statusvalue = LvTARGOFF(sv);
2897 PL_statusvalue_vms = LvTARGLEN(sv);
ff0cee69
PP
2898 }
2899 else
2900#endif
2901#ifdef VMSISH_STATUS
2902 if (VMSISH_STATUS)
fb38d079 2903 STATUS_NATIVE_CHILD_SET((U32)SvIV(sv));
ff0cee69
PP
2904 else
2905#endif
38ab35f8 2906 STATUS_UNIX_EXIT_SET(SvIV(sv));
79072805
LW
2907 break;
2908 case '!':
93189314
JH
2909 {
2910#ifdef VMS
2911# define PERL_VMS_BANG vaxc$errno
2912#else
2913# define PERL_VMS_BANG 0
2914#endif
27329181 2915#if defined(WIN32) && ! defined(UNDER_CE)
c9beaf97
SH
2916 SETERRNO(win32_get_errno(SvIOK(sv) ? SvIVX(sv) : SvOK(sv) ? sv_2iv(sv) : 0),
2917 (SvIV(sv) == EVMSERR) ? 4 : PERL_VMS_BANG);
2918#else
91487cfc 2919 SETERRNO(SvIOK(sv) ? SvIVX(sv) : SvOK(sv) ? sv_2iv(sv) : 0,
93189314 2920 (SvIV(sv) == EVMSERR) ? 4 : PERL_VMS_BANG);
c9beaf97 2921#endif
93189314 2922 }
79072805
LW
2923 break;
2924 case '<':
985213f2 2925 {
b469f1e0 2926 /* XXX $< currently silently ignores failures */
dfff4baf 2927 const Uid_t new_uid = SvUID(sv);
985213f2 2928 PL_delaymagic_uid = new_uid;
3280af22
NIS
2929 if (PL_delaymagic) {
2930 PL_delaymagic |= DM_RUID;
79072805
LW
2931 break; /* don't do magic till later */
2932 }
2933#ifdef HAS_SETRUID
b469f1e0 2934 PERL_UNUSED_RESULT(setruid(new_uid));
79072805
LW
2935#else
2936#ifdef HAS_SETREUID
b469f1e0 2937 PERL_UNUSED_RESULT(setreuid(new_uid, (Uid_t)-1));
748a9306 2938#else
85e6fe83 2939#ifdef HAS_SETRESUID
b469f1e0 2940 PERL_UNUSED_RESULT(setresuid(new_uid, (Uid_t)-1, (Uid_t)-1));
79072805 2941#else
985213f2 2942 if (new_uid == PerlProc_geteuid()) { /* special case $< = $> */
75870ed3 2943#ifdef PERL_DARWIN
2944 /* workaround for Darwin's setuid peculiarity, cf [perl #24122] */
985213f2 2945 if (new_uid != 0 && PerlProc_getuid() == 0)
b469f1e0 2946 PERL_UNUSED_RESULT(PerlProc_setuid(0));
75870ed3 2947#endif
b469f1e0 2948 PERL_UNUSED_RESULT(PerlProc_setuid(new_uid));
75870ed3 2949 } else {
cea2e8a9 2950 Perl_croak(aTHX_ "setruid() not implemented");
a0d0e21e 2951 }
79072805
LW
2952#endif
2953#endif
85e6fe83 2954#endif
79072805 2955 break;
985213f2 2956 }
79072805 2957 case '>':
985213f2 2958 {
b469f1e0 2959 /* XXX $> currently silently ignores failures */
dfff4baf 2960 const Uid_t new_euid = SvUID(sv);
985213f2 2961 PL_delaymagic_euid = new_euid;
3280af22
NIS
2962 if (PL_delaymagic) {
2963 PL_delaymagic |= DM_EUID;
79072805
LW
2964 break; /* don't do magic till later */
2965 }
2966#ifdef HAS_SETEUID
b469f1e0 2967 PERL_UNUSED_RESULT(seteuid(new_euid));
79072805
LW
2968#else
2969#ifdef HAS_SETREUID
b469f1e0 2970 PERL_UNUSED_RESULT(setreuid((Uid_t)-1, new_euid));
85e6fe83
LW
2971#else
2972#ifdef HAS_SETRESUID
b469f1e0 2973 PERL_UNUSED_RESULT(setresuid((Uid_t)-1, new_euid, (Uid_t)-1));
79072805 2974#else
985213f2 2975 if (new_euid == PerlProc_getuid()) /* special case $> = $< */
b469f1e0 2976 PERL_UNUSED_RESULT(PerlProc_setuid(new_euid));
a0d0e21e 2977 else {
cea2e8a9 2978 Perl_croak(aTHX_ "seteuid() not implemented");
a0d0e21e 2979 }
79072805
LW
2980#endif
2981#endif
85e6fe83 2982#endif
79072805 2983 break;
985213f2 2984 }
79072805 2985 case '(':
985213f2 2986 {
b469f1e0 2987 /* XXX $( currently silently ignores failures */
dfff4baf 2988 const Gid_t new_gid = SvGID(sv);
985213f2 2989 PL_delaymagic_gid = new_gid;
3280af22
NIS
2990 if (PL_delaymagic) {
2991 PL_delaymagic |= DM_RGID;
79072805
LW
2992 break; /* don't do magic till later */
2993 }
2994#ifdef HAS_SETRGID
b469f1e0 2995 PERL_UNUSED_RESULT(setrgid(new_gid));
79072805
LW
2996#else
2997#ifdef HAS_SETREGID
b469f1e0 2998 PERL_UNUSED_RESULT(setregid(new_gid, (Gid_t)-1));
85e6fe83
LW
2999#else
3000#ifdef HAS_SETRESGID
b469f1e0 3001 PERL_UNUSED_RESULT(setresgid(new_gid, (Gid_t)-1, (Gid_t) -1));
79072805 3002#else
985213f2 3003 if (new_gid == PerlProc_getegid()) /* special case $( = $) */
b469f1e0 3004 PERL_UNUSED_RESULT(PerlProc_setgid(new_gid));
748a9306 3005 else {
cea2e8a9 3006 Perl_croak(aTHX_ "setrgid() not implemented");
748a9306 3007 }
79072805
LW
3008#endif
3009#endif
85e6fe83 3010#endif
79072805 3011 break;
985213f2 3012 }
79072805 3013 case ')':
985213f2 3014 {
b469f1e0 3015 /* XXX $) currently silently ignores failures */
dfff4baf 3016 Gid_t new_egid;
5cd24f17
PP
3017#ifdef HAS_SETGROUPS
3018 {
b83604b4 3019 const char *p = SvPV_const(sv, len);
757f63d8 3020 Groups_t *gary = NULL;
fdadaf77 3021 const char* endptr;
fb4089e0 3022#ifdef _SC_NGROUPS_MAX
3023 int maxgrp = sysconf(_SC_NGROUPS_MAX);
3024
3025 if (maxgrp < 0)
3026 maxgrp = NGROUPS;
3027#else
3028 int maxgrp = NGROUPS;
3029#endif
757f63d8
SP
3030
3031 while (isSPACE(*p))
3032 ++p;
fdadaf77 3033 new_egid = (Gid_t)grok_atou(p, &endptr);
fb4089e0 3034 for (i = 0; i < maxgrp; ++i) {
fdadaf77
JH
3035 if (endptr == NULL)
3036 break;
3037 p = endptr;
757f63d8
SP
3038 while (isSPACE(*p))
3039 ++p;
3040 if (!*p)
3041 break;
fdadaf77 3042 if (!gary)
757f63d8
SP
3043 Newx(gary, i + 1, Groups_t);
3044 else
3045 Renew(gary, i + 1, Groups_t);
fdadaf77 3046 gary[i] = (Groups_t)grok_atou(p, &endptr);
757f63d8
SP
3047 }
3048 if (i)
b469f1e0 3049 PERL_UNUSED_RESULT(setgroups(i, gary));
f5a63d97 3050 Safefree(gary);
5cd24f17
PP
3051 }
3052#else /* HAS_SETGROUPS */
dfff4baf 3053 new_egid = SvGID(sv);
5cd24f17 3054#endif /* HAS_SETGROUPS */
985213f2 3055 PL_delaymagic_egid = new_egid;
3280af22
NIS
3056 if (PL_delaymagic) {
3057 PL_delaymagic |= DM_EGID;
79072805
LW
3058 break; /* don't do magic till later */
3059 }
3060#ifdef HAS_SETEGID
b469f1e0 3061 PERL_UNUSED_RESULT(setegid(new_egid));
79072805
LW
3062#else
3063#ifdef HAS_SETREGID
b469f1e0 3064 PERL_UNUSED_RESULT(setregid((Gid_t)-1, new_egid));
85e6fe83
LW
3065#else
3066#ifdef HAS_SETRESGID
b469f1e0 3067 PERL_UNUSED_RESULT(setresgid((Gid_t)-1, new_egid, (Gid_t)-1));
79072805 3068#else
985213f2 3069 if (new_egid == PerlProc_getgid()) /* special case $) = $( */
b469f1e0 3070 PERL_UNUSED_RESULT(PerlProc_setgid(new_egid));
748a9306 3071 else {
cea2e8a9 3072 Perl_croak(aTHX_ "setegid() not implemented");
748a9306 3073 }
79072805
LW
3074#endif
3075#endif
85e6fe83 3076#endif
79072805 3077 break;
985213f2 3078 }
79072805 3079 case ':':
2d8e6c8d 3080 PL_chopset = SvPV_force(sv,len);
79072805 3081 break;
9cdac2a2
FC
3082 case '$': /* $$ */
3083 /* Store the pid in mg->mg_obj so we can tell when a fork has
3084 occurred. mg->mg_obj points to *$ by default, so clear it. */
3085 if (isGV(mg->mg_obj)) {
3086 if (mg->mg_flags & MGf_REFCOUNTED) /* probably never true */
3087 SvREFCNT_dec(mg->mg_obj);
3088 mg->mg_flags |= MGf_REFCOUNTED;
3089 mg->mg_obj = newSViv((IV)PerlProc_getpid());
3090 }
3091 else sv_setiv(mg->mg_obj, (IV)PerlProc_getpid());
3092 break;
79072805 3093 case '0':
e2975953 3094 LOCK_DOLLARZERO_MUTEX;
4bc88a62
PS
3095#ifdef HAS_SETPROCTITLE
3096 /* The BSDs don't show the argv[] in ps(1) output, they
3097 * show a string from the process struct and provide
3098 * the setproctitle() routine to manipulate that. */
a2722ac9 3099 if (PL_origalen != 1) {
b83604b4 3100 s = SvPV_const(sv, len);
98b76f99 3101# if __FreeBSD_version > 410001
9aad2c0e 3102 /* The leading "-" removes the "perl: " prefix,
4bc88a62
PS
3103 * but not the "(perl) suffix from the ps(1)
3104 * output, because that's what ps(1) shows if the
3105 * argv[] is modified. */
6f2ad931 3106 setproctitle("-%s", s);
9aad2c0e 3107# else /* old FreeBSDs, NetBSD, OpenBSD, anyBSD */
4bc88a62
PS
3108 /* This doesn't really work if you assume that
3109 * $0 = 'foobar'; will wipe out 'perl' from the $0
3110 * because in ps(1) output the result will be like
3111 * sprintf("perl: %s (perl)", s)
3112 * I guess this is a security feature:
3113 * one (a user process) cannot get rid of the original name.
3114 * --jhi */
3115 setproctitle("%s", s);
3116# endif
3117 }
9d3968b2 3118#elif defined(__hpux) && defined(PSTAT_SETCMD)
a2722ac9 3119 if (PL_origalen != 1) {
17aa7f3d 3120 union pstun un;
b83604b4 3121 s = SvPV_const(sv, len);
6867be6d 3122 un.pst_command = (char *)s;
17aa7f3d
JH
3123 pstat(PSTAT_SETCMD, un, len, 0, 0);
3124 }
9d3968b2 3125#else
2d2af554
GA
3126 if (PL_origalen > 1) {
3127 /* PL_origalen is set in perl_parse(). */
3128 s = SvPV_force(sv,len);
3129 if (len >= (STRLEN)PL_origalen-1) {
3130 /* Longer than original, will be truncated. We assume that
3131 * PL_origalen bytes are available. */
3132 Copy(s, PL_origargv[0], PL_origalen-1, char);
3133 }
3134 else {
3135 /* Shorter than original, will be padded. */
235ac35d 3136#ifdef PERL_DARWIN
60777a0d
JH
3137 /* Special case for Mac OS X: see [perl #38868] */
3138 const int pad = 0;
235ac35d 3139#else
8a89a4f1
MB
3140 /* Is the space counterintuitive? Yes.
3141 * (You were expecting \0?)
3142 * Does it work? Seems to. (In Linux 2.4.20 at least.)
3143 * --jhi */
60777a0d 3144 const int pad = ' ';
235ac35d 3145#endif
60777a0d
JH
3146 Copy(s, PL_origargv[0], len, char);
3147 PL_origargv[0][len] = 0;
3148 memset(PL_origargv[0] + len + 1,
3149 pad, PL_origalen - len - 1);
2d2af554
GA
3150 }
3151 PL_origargv[0][PL_origalen-1] = 0;
3152 for (i = 1; i < PL_origargc; i++)
3153 PL_origargv[i] = 0;
7636ea95
AB
3154#ifdef HAS_PRCTL_SET_NAME
3155 /* Set the legacy process name in addition to the POSIX name on Linux */
3156 if (prctl(PR_SET_NAME, (unsigned long)s, 0, 0, 0) != 0) {
3157 /* diag_listed_as: SKIPME */
3158 Perl_croak(aTHX_ "Can't set $0 with prctl(): %s", Strerror(errno));
3159 }
3160#endif
79072805 3161 }
9d3968b2 3162#endif
e2975953 3163 UNLOCK_DOLLARZERO_MUTEX;
79072805
LW
3164 break;
3165 }
3166 return 0;
3167}
3168
3169I32
84c7b88c
BF
3170Perl_whichsig_sv(pTHX_ SV *sigsv)
3171{
3172 const char *sigpv;
3173 STRLEN siglen;
3174 PERL_ARGS_ASSERT_WHICHSIG_SV;
84c7b88c
BF
3175 sigpv = SvPV_const(sigsv, siglen);
3176 return whichsig_pvn(sigpv, siglen);
3177}
3178
3179I32
3180Perl_whichsig_pv(pTHX_ const char *sig)
3181{
3182 PERL_ARGS_ASSERT_WHICHSIG_PV;
84c7b88c
BF
3183 return whichsig_pvn(sig, strlen(sig));
3184}
3185
3186I32
3187Perl_whichsig_pvn(pTHX_ const char *sig, STRLEN len)
79072805 3188{
eb578fdb 3189 char* const* sigv;
7918f24d 3190
84c7b88c 3191 PERL_ARGS_ASSERT_WHICHSIG_PVN;
96a5add6 3192 PERL_UNUSED_CONTEXT;
79072805 3193
aadb217d 3194 for (sigv = (char* const*)PL_sig_name; *sigv; sigv++)
84c7b88c 3195 if (strlen(*sigv) == len && memEQ(sig,*sigv, len))
aadb217d 3196 return PL_sig_num[sigv - (char* const*)PL_sig_name];
79072805 3197#ifdef SIGCLD
84c7b88c 3198 if (memEQs(sig, len, "CHLD"))
79072805
LW
3199 return SIGCLD;
3200#endif
3201#ifdef SIGCHLD
84c7b88c 3202 if (memEQs(sig, len, "CLD"))
79072805
LW
3203 return SIGCHLD;
3204#endif
7f1236c0 3205 return -1;
79072805
LW
3206}
3207
ecfc5424 3208Signal_t
1e82f5a6 3209#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
b3dbdd48 3210Perl_sighandler(int sig, siginfo_t *sip, void *uap)
1e82f5a6
SH
3211#else
3212Perl_sighandler(int sig)
3213#endif
79072805 3214{
1018e26f
NIS
3215#ifdef PERL_GET_SIG_CONTEXT
3216 dTHXa(PERL_GET_SIG_CONTEXT);
71d280e3 3217#else
cea2e8a9 3218 dTHX;
71d280e3 3219#endif
79072805 3220 dSP;
a0714e2c
SS
3221 GV *gv = NULL;
3222 SV *sv = NULL;
8772537c 3223 SV * const tSv = PL_Sv;
601f1833 3224 CV *cv = NULL;
533c011a 3225 OP *myop = PL_op;
84902520 3226 U32 flags = 0;
8772537c 3227 XPV * const tXpv = PL_Xpv;
0c4d3b5e 3228 I32 old_ss_ix = PL_savestack_ix;
100c03aa 3229 SV *errsv_save = NULL;
71d280e3 3230
84902520 3231
727405f8 3232 if (!PL_psig_ptr[sig]) {
99ef548b 3233 PerlIO_printf(Perl_error_log, "Signal SIG%s received, but no signal handler set.\n",
727405f8
NIS
3234 PL_sig_name[sig]);
3235 exit(sig);
3236 }
ff0cee69 3237
a0d63a7b
DM
3238 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG) {
3239 /* Max number of items pushed there is 3*n or 4. We cannot fix
3240 infinity, so we fix 4 (in fact 5): */
3241 if (PL_savestack_ix + 15 <= PL_savestack_max) {
3242 flags |= 1;
3243 PL_savestack_ix += 5; /* Protect save in progress. */
3244 SAVEDESTRUCTOR_X(S_unwind_handler_stack, NULL);
3245 }
84902520 3246 }
84902520 3247 /* sv_2cv is too complicated, try a simpler variant first: */
ea726b52 3248 if (!SvROK(PL_psig_ptr[sig]) || !(cv = MUTABLE_CV(SvRV(PL_psig_ptr[sig])))
8772537c
AL
3249 || SvTYPE(cv) != SVt_PVCV) {
3250 HV *st;
f2c0649b 3251 cv = sv_2cv(PL_psig_ptr[sig], &st, &gv, GV_ADD);
8772537c 3252 }
84902520 3253
a0d0e21e 3254 if (!cv || !CvROOT(cv)) {
07c325bb 3255 const HEK * const hek = gv
1d6bb9ae
FC
3256 ? GvENAME_HEK(gv)
3257 : cv && CvNAMED(cv)
3258 ? CvNAME_HEK(cv)
07c325bb
FC
3259 : cv && CvGV(cv) ? GvENAME_HEK(CvGV(cv)) : NULL;
3260 if (hek)
3261 Perl_ck_warner(aTHX_ packWARN(WARN_SIGNAL),
3262 "SIG%s handler \"%"HEKf"\" not defined.\n",
3263 PL_sig_name[sig], hek);
3264 /* diag_listed_as: SIG%s handler "%s" not defined */
3265 else Perl_ck_warner(aTHX_ packWARN(WARN_SIGNAL),
3266 "SIG%s handler \"__ANON__\" not defined.\n",
3267 PL_sig_name[sig]);
00d579c5 3268 goto cleanup;
79072805
LW
3269 }
3270
0c4d3b5e
DM
3271 sv = PL_psig_name[sig]
3272 ? SvREFCNT_inc_NN(PL_psig_name[sig])
3273 : newSVpv(PL_sig_name[sig],0);
72048cfe 3274 flags |= 8;
0c4d3b5e
DM
3275 SAVEFREESV(sv);
3276
a0d63a7b
DM
3277 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG) {
3278 /* make sure our assumption about the size of the SAVEs are correct:
3279 * 3 for SAVEDESTRUCTOR_X, 2 for SAVEFREESV */
3280 assert(old_ss_ix + 2 + ((flags & 1) ? 3+5 : 0) == PL_savestack_ix);
3281 }
e336de0d 3282
e788e7d3 3283 PUSHSTACKi(PERLSI_SIGNAL);
924508f0 3284 PUSHMARK(SP);
79072805 3285 PUSHs(sv);
8aad04aa
JH
3286#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
3287 {
3288 struct sigaction oact;
3289
3290 if (sigaction(sig, 0, &oact) == 0 && oact.sa_flags & SA_SIGINFO) {
8aad04aa
JH
3291 if (sip) {
3292 HV *sih = newHV();
ad64d0ec 3293 SV *rv = newRV_noinc(MUTABLE_SV(sih));
8aad04aa
JH
3294 /* The siginfo fields signo, code, errno, pid, uid,
3295 * addr, status, and band are defined by POSIX/SUSv3. */
85771703
NC
3296 (void)hv_stores(sih, "signo", newSViv(sip->si_signo));
3297 (void)hv_stores(sih, "code", newSViv(sip->si_code));
79dec0f4 3298#if 0 /* XXX TODO: Configure scan for the existence of these, but even that does not help if the SA_SIGINFO is not implemented according to the spec. */
85771703
NC
3299 hv_stores(sih, "errno", newSViv(sip->si_errno));
3300 hv_stores(sih, "status", newSViv(sip->si_status));
3301 hv_stores(sih, "uid", newSViv(sip->si_uid));
3302 hv_stores(sih, "pid", newSViv(sip->si_pid));
3303 hv_stores(sih, "addr", newSVuv(PTR2UV(sip->si_addr)));
3304 hv_stores(sih, "band", newSViv(sip->si_band));
79dec0f4 3305#endif
8aad04aa 3306 EXTEND(SP, 2);
ad64d0ec 3307 PUSHs(rv);
22f1178f 3308 mPUSHp((char *)sip, sizeof(*sip));
8aad04aa 3309 }
b4552a27 3310
8aad04aa
JH
3311 }
3312 }
3313#endif
79072805 3314 PUTBACK;
a0d0e21e 3315
100c03aa
JL
3316 errsv_save = newSVsv(ERRSV);
3317
ad64d0ec 3318 call_sv(MUTABLE_SV(cv), G_DISCARD|G_EVAL);
79072805 3319
d3acc0f7 3320 POPSTACK;
eed484f9
DD
3321 {
3322 SV * const errsv = ERRSV;
3323 if (SvTRUE_NN(errsv)) {
3324 SvREFCNT_dec(errsv_save);
c22d665b 3325#ifndef PERL_MICRO
1b266415
NIS
3326 /* Handler "died", for example to get out of a restart-able read().
3327 * Before we re-do that on its behalf re-enable the signal which was
3328 * blocked by the system when we entered.
3329 */
c22d665b 3330#ifdef HAS_SIGPROCMASK
d488af49 3331#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
eed484f9 3332 if (sip || uap)
c22d665b 3333#endif
eed484f9
DD
3334 {
3335 sigset_t set;
3336 sigemptyset(&set);
3337 sigaddset(&set,sig);
3338 sigprocmask(SIG_UNBLOCK, &set, NULL);
3339 }
c22d665b 3340#else
eed484f9
DD
3341 /* Not clear if this will work */
3342 (void)rsignal(sig, SIG_IGN);
3343 (void)rsignal(sig, PL_csighandlerp);
c22d665b
LT
3344#endif
3345#endif /* !PERL_MICRO */
eed484f9
DD
3346 die_sv(errsv);
3347 }
3348 else {
3349 sv_setsv(errsv, errsv_save);
3350 SvREFCNT_dec(errsv_save);
3351 }
100c03aa
JL
3352 }
3353
00d579c5 3354cleanup:
0c4d3b5e
DM
3355 /* pop any of SAVEFREESV, SAVEDESTRUCTOR_X and "save in progress" */
3356 PL_savestack_ix = old_ss_ix;
72048cfe 3357 if (flags & 8)
2357bae7 3358 SvREFCNT_dec_NN(sv);
533c011a 3359 PL_op = myop; /* Apparently not needed... */
ac27b0f5 3360
3280af22
NIS
3361 PL_Sv = tSv; /* Restore global temporaries. */
3362 PL_Xpv = tXpv;
53bb94e2 3363 return;
79072805 3364}
4e35701f
NIS
3365
3366
51371543 3367static void
8772537c 3368S_restore_magic(pTHX_ const void *p)
51371543 3369{
8772537c
AL
3370 MGS* const mgs = SSPTR(PTR2IV(p), MGS*);
3371 SV* const sv = mgs->mgs_sv;
150b625d 3372 bool bumped;
51371543
GS
3373
3374 if (!sv)
3375 return;
3376
4bac9ae4
CS
3377 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
3378 SvTEMP_off(sv); /* if it's still magical, this value isn't temporary */
f8c7b90f 3379#ifdef PERL_OLD_COPY_ON_WRITE
f9701176
NC
3380 /* While magic was saved (and off) sv_setsv may well have seen
3381 this SV as a prime candidate for COW. */
3382 if (SvIsCOW(sv))
e424a81e 3383 sv_force_normal_flags(sv, 0);
f9701176 3384#endif
a623f893
FC
3385 if (mgs->mgs_flags)
3386 SvFLAGS(sv) |= mgs->mgs_flags;
51371543
GS
3387 else
3388 mg_magical(sv);
51371543
GS
3389 }
3390
150b625d 3391 bumped = mgs->mgs_bumped;
51371543
GS
3392 mgs->mgs_sv = NULL; /* mark the MGS structure as restored */
3393
3394 /* If we're still on top of the stack, pop us off. (That condition
3395 * will be satisfied if restore_magic was called explicitly, but *not*
3396 * if it's being called via leave_scope.)
3397 * The reason for doing this is that otherwise, things like sv_2cv()
3398 * may leave alloc gunk on the savestack, and some code
3399 * (e.g. sighandler) doesn't expect that...
3400 */
3401 if (PL_savestack_ix == mgs->mgs_ss_ix)
3402 {
1be36ce0
NC
3403 UV popval = SSPOPUV;
3404 assert(popval == SAVEt_DESTRUCTOR_X);
51371543 3405 PL_savestack_ix -= 2;
1be36ce0
NC
3406 popval = SSPOPUV;
3407 assert((popval & SAVE_MASK) == SAVEt_ALLOC);
3408 PL_savestack_ix -= popval >> SAVE_TIGHT_SHIFT;
51371543 3409 }
150b625d
DM
3410 if (bumped) {
3411 if (SvREFCNT(sv) == 1) {
3412 /* We hold the last reference to this SV, which implies that the
3413 SV was deleted as a side effect of the routines we called.
3414 So artificially keep it alive a bit longer.
3415 We avoid turning on the TEMP flag, which can cause the SV's
3416 buffer to get stolen (and maybe other stuff). */
150b625d 3417 sv_2mortal(sv);
4bac9ae4 3418 SvTEMP_off(sv);
8985fe98 3419 }
150b625d 3420 else
2357bae7 3421 SvREFCNT_dec_NN(sv); /* undo the inc in S_save_magic() */
8985fe98 3422 }
51371543
GS
3423}
3424
0c4d3b5e
DM
3425/* clean up the mess created by Perl_sighandler().
3426 * Note that this is only called during an exit in a signal handler;
3427 * a die is trapped by the call_sv() and the SAVEDESTRUCTOR_X manually
9a7f166c 3428 * skipped over. */
0c4d3b5e 3429
51371543 3430static void
8772537c 3431S_unwind_handler_stack(pTHX_ const void *p)
51371543 3432{
0c4d3b5e 3433 PERL_UNUSED_ARG(p);
7918f24d 3434
0c4d3b5e 3435 PL_savestack_ix -= 5; /* Unprotect save in progress. */
51371543 3436}
1018e26f 3437
66610fdd 3438/*
b3ca2e83
NC
3439=for apidoc magic_sethint
3440
3441Triggered by a store to %^H, records the key/value pair to
c28fe1ec
NC
3442C<PL_compiling.cop_hints_hash>. It is assumed that hints aren't storing
3443anything that would need a deep copy. Maybe we should warn if we find a
3444reference.
b3ca2e83
NC
3445
3446=cut
3447*/
3448int
3449Perl_magic_sethint(pTHX_ SV *sv, MAGIC *mg)
3450{
ad64d0ec 3451 SV *key = (mg->mg_len == HEf_SVKEY) ? MUTABLE_SV(mg->mg_ptr)
59cd0e26 3452 : newSVpvn_flags(mg->mg_ptr, mg->mg_len, SVs_TEMP);
b3ca2e83 3453
7918f24d
NC
3454 PERL_ARGS_ASSERT_MAGIC_SETHINT;
3455
e6e3e454
NC
3456 /* mg->mg_obj isn't being used. If needed, it would be possible to store
3457 an alternative leaf in there, with PL_compiling.cop_hints being used if
3458 it's NULL. If needed for threads, the alternative could lock a mutex,
3459 or take other more complex action. */
3460
5b9c0671
NC
3461 /* Something changed in %^H, so it will need to be restored on scope exit.
3462 Doing this here saves a lot of doing it manually in perl code (and
3463 forgetting to do it, and consequent subtle errors. */
3464 PL_hints |= HINT_LOCALIZE_HH;
20439bc7
Z
3465 CopHINTHASH_set(&PL_compiling,
3466 cophh_store_sv(CopHINTHASH_get(&PL_compiling), key, 0, sv, 0));
b3ca2e83
NC
3467 return 0;
3468}
3469
3470/*
f175cff5 3471=for apidoc magic_clearhint
b3ca2e83 3472
c28fe1ec
NC
3473Triggered by a delete from %^H, records the key to
3474C<PL_compiling.cop_hints_hash>.
b3ca2e83
NC
3475
3476=cut
3477*/
3478int
3479Perl_magic_clearhint(pTHX_ SV *sv, MAGIC *mg)
3480{
7918f24d 3481 PERL_ARGS_ASSERT_MAGIC_CLEARHINT;
f5a63d97
AL
3482 PERL_UNUSED_ARG(sv);