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