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