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