Replace do_aexec() with a macro to call do_aexec5() with the two extra
[p5sagit/p5-mst-13.2.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 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 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 14 */
15
ccfc67b7 16/*
17=head1 Magical Functions
166f8a29 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 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 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 36*/
37
79072805 38#include "EXTERN.h"
864dbfa3 39#define PERL_IN_MG_C
79072805 40#include "perl.h"
41
5cd24f17 42#if defined(HAS_GETGROUPS) || defined(HAS_SETGROUPS)
188ea221 43# ifndef NGROUPS
44# define NGROUPS 32
45# endif
b7953727 46# ifdef I_GRP
47# include <grp.h>
48# endif
188ea221 49#endif
50
17aa7f3d 51#ifdef __hpux
52# include <sys/pstat.h>
53#endif
54
8aad04aa 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 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 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 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 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 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 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 123 SvRMAGICAL_on(sv);
124 }
125 }
126}
127
954c1994 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 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 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 168 /* guard against magic having been deleted - eg FETCH calling
169 * untie */
170 if (!SvMAGIC(sv))
171 break;
b77f7d40 172
ff76feab 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 177
178 mg = mg->mg_moremagic;
179
0723351e 180 if (have_new) {
ff76feab 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 185 mg = cur;
186 head = newmg;
187 }
188 }
189
190 /* Were any new entries added? */
0723351e 191 if (!have_new && (newmg = SvMAGIC(sv)) != head) {
192 have_new = 1;
ff76feab 193 cur = mg;
194 mg = newmg;
760ac839 195 }
79072805 196 }
463ee0b2 197
8772537c 198 restore_magic(INT2PTR(void *, (IV)mgs_ix));
6683b158 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 205 return 0;
206}
207
954c1994 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 221 MAGIC* nextmg;
222
455ece5e 223 save_magic(mgs_ix, sv);
463ee0b2 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 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 237 return 0;
238}
239
954c1994 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 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 262 return len;
263 }
264 }
265
35a4481c 266 if (DO_UTF8(sv)) {
10516c54 267 const U8 *s = (U8*)SvPV_const(sv, len);
5636d518 268 len = Perl_utf8_length(aTHX_ s, s + len);
269 }
270 else
10516c54 271 (void)SvPV_const(sv, len);
463ee0b2 272 return len;
79072805 273}
274
8fb26106 275I32
864dbfa3 276Perl_mg_size(pTHX_ SV *sv)
93965878 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 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 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 296 case SVt_PVHV:
297 /* FIXME */
298 default:
cea2e8a9 299 Perl_croak(aTHX_ "Size magic not implemented");
93965878 300 break;
301 }
302 return 0;
303}
304
954c1994 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 330 return 0;
331}
332
954c1994 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 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 350 }
351 return 0;
352}
353
954c1994 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 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 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 387}
388
954c1994 389/*
0cbee0a4 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 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 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 475 if (mg->mg_flags & MGf_REFCOUNTED)
476 SvREFCNT_dec(mg->mg_obj);
79072805 477 Safefree(mg);
478 }
b162af07 479 SvMAGIC_set(sv, NULL);
79072805 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 492 if (mg->mg_obj) /* @+ */
493 return rx->nparens;
494 else /* @- */
495 return rx->lastparen;
496 }
ac27b0f5 497
942e002e 498 return (U32)-1;
6cef1e77 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 507 register const I32 paren = mg->mg_len;
508 register I32 s;
509 register I32 t;
6cef1e77 510 if (paren < 0)
511 return 0;
eb160463 512 if (paren <= (I32)rx->nparens &&
cf93c79d 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 524 if (b)
525 i = Perl_utf8_length(aTHX_ (U8*)b, (U8*)(b+i));
1aa99e6b 526 }
0064a8a9 527
528 sv_setiv(sv, i);
6cef1e77 529 }
530 }
531 return 0;
532}
533
e4b89193 534int
a29d06ed 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 540}
541
93a17b20 542U32
864dbfa3 543Perl_magic_len(pTHX_ SV *sv, MAGIC *mg)
93a17b20 544{
545 register I32 paren;
93a17b20 546 register I32 i;
dd374669 547 register const REGEXP *rx;
a197cbdd 548 I32 s1, t1;
93a17b20 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 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 565 const U8 *ep;
566 STRLEN el;
ffc61ed2 567
6d5fa195 568 i = t1 - s1;
768c67ee 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 576 else {
577 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 578 report_uninit(sv);
235bddc8 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 589 if (paren)
590 goto getparen;
93a17b20 591 }
748a9306 592 return 0;
a01268b5 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 602 if (rx->startp[0] != -1) {
603 i = rx->startp[0];
a197cbdd 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 614 if (rx->endp[0] != -1) {
615 i = rx->sublen - rx->endp[0];
a197cbdd 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 624 }
625 magic_get(sv,mg);
2d8e6c8d 626 if (!SvPOK(sv) && SvNIOK(sv)) {
8b6b16e7 627 sv_2pv(sv, 0);
2d8e6c8d 628 }
93a17b20 629 if (SvPOK(sv))
630 return SvCUR(sv);
631 return 0;
632}
633
ad3296c6 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 649 const char * const remaining = mg->mg_ptr + 1;
650 const char nextchar = *remaining;
79072805 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 658 sv_setiv(sv, (IV)PL_minus_c);
659 }
823a54a3 660 else if (strEQ(remaining, "HILD_ERROR_NATIVE")) {
e5218da5 661 sv_setiv(sv, (IV)STATUS_NATIVE);
662 }
49460fe6 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 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 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 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 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 706 {
707 DWORD dwErr = GetLastError();
708 sv_setnv(sv, (NV)dwErr);
823a54a3 709 if (dwErr) {
0a378802 710 PerlProc_GetOSError(sv, dwErr);
711 }
712 else
c69006e4 713 sv_setpvn(sv, "", 0);
0a378802 714 SetLastError(dwErr);
715 }
22fae026 716#else
f6c8f21d 717 {
8772537c 718 const int saveerrno = errno;
f6c8f21d 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 728 SvNOK_on(sv); /* what a wonderful hack! */
729 }
823a54a3 730 else if (strEQ(remaining, "NCODING"))
0a378802 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 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 748 SvTAINTED_off(sv);
749 }
823a54a3 750 else if (strEQ(remaining, "PEN")) {
ac27b0f5 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 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 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 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 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 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 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 816 else {
817 sv_setsv(sv, PL_compiling.cop_warnings);
ac27b0f5 818 }
d3a7d8c7 819 SvPOK_only(sv);
4438c4b7 820 }
79072805 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 825 I32 s1, t1;
826
a863c7d1 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 834 (s1 = rx->startp[paren]) != -1 &&
835 (t1 = rx->endp[paren]) != -1)
bbce6d69 836 {
cf93c79d 837 i = t1 - s1;
838 s = rx->subbeg + s1;
01ec43d0 839 if (!rx->subbeg)
c2e66d9e 840 break;
841
13f57bf8 842 getrx:
748a9306 843 if (i >= 0) {
cf93c79d 844 sv_setpvn(sv, s, i);
a30b2f1f 845 if (RX_MATCH_UTF8(rx) && is_utf8_string((U8*)s, i))
7e2040f0 846 SvUTF8_on(sv);
847 else
848 SvUTF8_off(sv);
e9814ee1 849 if (PL_tainting) {
850 if (RX_MATCH_TAINTED(rx)) {
823a54a3 851 MAGIC* const mg = SvMAGIC(sv);
e9814ee1 852 MAGIC* mgt;
853 PL_tainted = 1;
b162af07 854 SvMAGIC_set(sv, mg->mg_moremagic);
e9814ee1 855 SvTAINT(sv);
856 if ((mgt = SvMAGIC(sv))) {
857 mg->mg_moremagic = mgt;
b162af07 858 SvMAGIC_set(sv, mg);
e9814ee1 859 }
860 } else
861 SvTAINTED_off(sv);
862 }
748a9306 863 break;
864 }
79072805 865 }
79072805 866 }
3280af22 867 sv_setsv(sv,&PL_sv_undef);
79072805 868 break;
869 case '+':
aaa362c4 870 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
d9f97599 871 paren = rx->lastparen;
a0d0e21e 872 if (paren)
873 goto getparen;
79072805 874 }
3280af22 875 sv_setsv(sv,&PL_sv_undef);
79072805 876 break;
a01268b5 877 case '\016': /* ^N */
878 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
879 paren = rx->lastcloseparen;
880 if (paren)
881 goto getparen;
882 }
883 sv_setsv(sv,&PL_sv_undef);
884 break;
79072805 885 case '`':
aaa362c4 886 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
cf93c79d 887 if ((s = rx->subbeg) && rx->startp[0] != -1) {
888 i = rx->startp[0];
13f57bf8 889 goto getrx;
79072805 890 }
79072805 891 }
3280af22 892 sv_setsv(sv,&PL_sv_undef);
79072805 893 break;
894 case '\'':
aaa362c4 895 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
cf93c79d 896 if (rx->subbeg && rx->endp[0] != -1) {
897 s = rx->subbeg + rx->endp[0];
898 i = rx->sublen - rx->endp[0];
13f57bf8 899 goto getrx;
79072805 900 }
79072805 901 }
3280af22 902 sv_setsv(sv,&PL_sv_undef);
79072805 903 break;
904 case '.':
3280af22 905 if (GvIO(PL_last_in_gv)) {
357c8808 906 sv_setiv(sv, (IV)IoLINES(GvIOp(PL_last_in_gv)));
79072805 907 }
79072805 908 break;
909 case '?':
809a5acc 910 {
809a5acc 911 sv_setiv(sv, (IV)STATUS_CURRENT);
ff0cee69 912#ifdef COMPLEX_STATUS
6b88bc9c 913 LvTARGOFF(sv) = PL_statusvalue;
914 LvTARGLEN(sv) = PL_statusvalue_vms;
ff0cee69 915#endif
809a5acc 916 }
79072805 917 break;
918 case '^':
0daa599b 919 if (GvIOp(PL_defoutgv))
920 s = IoTOP_NAME(GvIOp(PL_defoutgv));
79072805 921 if (s)
922 sv_setpv(sv,s);
923 else {
3280af22 924 sv_setpv(sv,GvENAME(PL_defoutgv));
79072805 925 sv_catpv(sv,"_TOP");
926 }
927 break;
928 case '~':
0daa599b 929 if (GvIOp(PL_defoutgv))
930 s = IoFMT_NAME(GvIOp(PL_defoutgv));
79072805 931 if (!s)
3280af22 932 s = GvENAME(PL_defoutgv);
79072805 933 sv_setpv(sv,s);
934 break;
79072805 935 case '=':
0daa599b 936 if (GvIOp(PL_defoutgv))
937 sv_setiv(sv, (IV)IoPAGE_LEN(GvIOp(PL_defoutgv)));
79072805 938 break;
939 case '-':
0daa599b 940 if (GvIOp(PL_defoutgv))
941 sv_setiv(sv, (IV)IoLINES_LEFT(GvIOp(PL_defoutgv)));
79072805 942 break;
943 case '%':
0daa599b 944 if (GvIOp(PL_defoutgv))
945 sv_setiv(sv, (IV)IoPAGE(GvIOp(PL_defoutgv)));
79072805 946 break;
79072805 947 case ':':
948 break;
949 case '/':
950 break;
951 case '[':
3280af22 952 WITH_THR(sv_setiv(sv, (IV)PL_curcop->cop_arybase));
79072805 953 break;
954 case '|':
0daa599b 955 if (GvIOp(PL_defoutgv))
956 sv_setiv(sv, (IV)(IoFLAGS(GvIOp(PL_defoutgv)) & IOf_FLUSH) != 0 );
79072805 957 break;
958 case ',':
79072805 959 break;
960 case '\\':
b2ce0fda 961 if (PL_ors_sv)
f28098ff 962 sv_copypv(sv, PL_ors_sv);
79072805 963 break;
79072805 964 case '!':
a5f75d66 965#ifdef VMS
65202027 966 sv_setnv(sv, (NV)((errno == EVMSERR) ? vaxc$errno : errno));
88e89b8a 967 sv_setpv(sv, errno ? Strerror(errno) : "");
a5f75d66 968#else
88e89b8a 969 {
8772537c 970 const int saveerrno = errno;
65202027 971 sv_setnv(sv, (NV)errno);
88e89b8a 972#ifdef OS2
ed344e4f 973 if (errno == errno_isOS2 || errno == errno_isOS2_set)
974 sv_setpv(sv, os2error(Perl_rc));
88e89b8a 975 else
a5f75d66 976#endif
2304df62 977 sv_setpv(sv, errno ? Strerror(errno) : "");
88e89b8a 978 errno = saveerrno;
979 }
980#endif
ad3296c6 981 SvRTRIM(sv);
946ec16e 982 SvNOK_on(sv); /* what a wonderful hack! */
79072805 983 break;
984 case '<':
3280af22 985 sv_setiv(sv, (IV)PL_uid);
79072805 986 break;
987 case '>':
3280af22 988 sv_setiv(sv, (IV)PL_euid);
79072805 989 break;
990 case '(':
3280af22 991 sv_setiv(sv, (IV)PL_gid);
a52cb5f7 992#ifdef HAS_GETGROUPS
a3b680e6 993 Perl_sv_setpvf(aTHX_ sv, "%"Gid_t_f, (long unsigned int)PL_gid);
a52cb5f7 994#endif
79072805 995 goto add_groups;
996 case ')':
3280af22 997 sv_setiv(sv, (IV)PL_egid);
a52cb5f7 998#ifdef HAS_GETGROUPS
a3b680e6 999 Perl_sv_setpvf(aTHX_ sv, "%"Gid_t_f, (long unsigned int)PL_egid);
a52cb5f7 1000#endif
79072805 1001 add_groups:
79072805 1002#ifdef HAS_GETGROUPS
79072805 1003 {
a0d0e21e 1004 Groups_t gary[NGROUPS];
a3b680e6 1005 I32 j = getgroups(NGROUPS,gary);
1006 while (--j >= 0)
1007 Perl_sv_catpvf(aTHX_ sv, " %"Gid_t_f, (long unsigned int)gary[j]);
79072805 1008 }
1009#endif
155aba94 1010 (void)SvIOK_on(sv); /* what a wonderful hack! */
79072805 1011 break;
cd39f2b6 1012#ifndef MACOS_TRADITIONAL
79072805 1013 case '0':
1014 break;
cd39f2b6 1015#endif
79072805 1016 }
a0d0e21e 1017 return 0;
79072805 1018}
1019
1020int
864dbfa3 1021Perl_magic_getuvar(pTHX_ SV *sv, MAGIC *mg)
79072805 1022{
8772537c 1023 struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
79072805 1024
1025 if (uf && uf->uf_val)
24f81a43 1026 (*uf->uf_val)(aTHX_ uf->uf_index, sv);
79072805 1027 return 0;
1028}
1029
1030int
864dbfa3 1031Perl_magic_setenv(pTHX_ SV *sv, MAGIC *mg)
79072805 1032{
27da23d5 1033 dVAR;
b83604b4 1034 const char *s;
e62f0680 1035 const char *ptr;
5aabfad6 1036 STRLEN len, klen;
1e422769 1037
b83604b4 1038 s = SvPV_const(sv,len);
e62f0680 1039 ptr = MgPV_const(mg,klen);
88e89b8a 1040 my_setenv(ptr, s);
1e422769 1041
a0d0e21e 1042#ifdef DYNAMIC_ENV_FETCH
1043 /* We just undefd an environment var. Is a replacement */
1044 /* waiting in the wings? */
1045 if (!len) {
5aabfad6 1046 SV **valp;
6b88bc9c 1047 if ((valp = hv_fetch(GvHVn(PL_envgv), ptr, klen, FALSE)))
b83604b4 1048 s = SvPV_const(*valp, len);
a0d0e21e 1049 }
1050#endif
1e422769 1051
39e571d4 1052#if !defined(OS2) && !defined(AMIGAOS) && !defined(WIN32) && !defined(MSDOS)
79072805 1053 /* And you'll never guess what the dog had */
1054 /* in its mouth... */
3280af22 1055 if (PL_tainting) {
1e422769 1056 MgTAINTEDDIR_off(mg);
1057#ifdef VMS
5aabfad6 1058 if (s && klen == 8 && strEQ(ptr, "DCL$PATH")) {
b8ffc8df 1059 char pathbuf[256], eltbuf[256], *cp, *elt;
c623ac67 1060 Stat_t sbuf;
1e422769 1061 int i = 0, j = 0;
1062
b8ffc8df 1063 strncpy(eltbuf, s, 255);
1064 eltbuf[255] = 0;
1065 elt = eltbuf;
1e422769 1066 do { /* DCL$PATH may be a search list */
1067 while (1) { /* as may dev portion of any element */
1068 if ( ((cp = strchr(elt,'[')) || (cp = strchr(elt,'<'))) ) {
1069 if ( *(cp+1) == '.' || *(cp+1) == '-' ||
1070 cando_by_name(S_IWUSR,0,elt) ) {
1071 MgTAINTEDDIR_on(mg);
1072 return 0;
1073 }
1074 }
1075 if ((cp = strchr(elt, ':')) != Nullch)
1076 *cp = '\0';
1077 if (my_trnlnm(elt, eltbuf, j++))
1078 elt = eltbuf;
1079 else
1080 break;
1081 }
1082 j = 0;
1083 } while (my_trnlnm(s, pathbuf, i++) && (elt = pathbuf));
1084 }
1085#endif /* VMS */
5aabfad6 1086 if (s && klen == 4 && strEQ(ptr,"PATH")) {
8772537c 1087 const char * const strend = s + len;
463ee0b2 1088
1089 while (s < strend) {
96827780 1090 char tmpbuf[256];
c623ac67 1091 Stat_t st;
5f74f29c 1092 I32 i;
96827780 1093 s = delimcpy(tmpbuf, tmpbuf + sizeof tmpbuf,
fc36a67e 1094 s, strend, ':', &i);
463ee0b2 1095 s++;
96827780 1096 if (i >= sizeof tmpbuf /* too long -- assume the worst */
1097 || *tmpbuf != '/'
c6ed36e1 1098 || (PerlLIO_stat(tmpbuf, &st) == 0 && (st.st_mode & 2)) ) {
8990e307 1099 MgTAINTEDDIR_on(mg);
1e422769 1100 return 0;
1101 }
463ee0b2 1102 }
79072805 1103 }
1104 }
39e571d4 1105#endif /* neither OS2 nor AMIGAOS nor WIN32 nor MSDOS */
1e422769 1106
79072805 1107 return 0;
1108}
1109
1110int
864dbfa3 1111Perl_magic_clearenv(pTHX_ SV *sv, MAGIC *mg)
85e6fe83 1112{
8772537c 1113 PERL_UNUSED_ARG(sv);
01b8bcb7 1114 my_setenv(MgPV_nolen_const(mg),Nullch);
85e6fe83 1115 return 0;
1116}
1117
88e89b8a 1118int
864dbfa3 1119Perl_magic_set_all_env(pTHX_ SV *sv, MAGIC *mg)
fb73857a 1120{
a0fd4948 1121#if defined(VMS) || defined(EPOC)
cea2e8a9 1122 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
fb73857a 1123#else
3280af22 1124 if (PL_localizing) {
fb73857a 1125 HE* entry;
1126 magic_clear_all_env(sv,mg);
1127 hv_iterinit((HV*)sv);
155aba94 1128 while ((entry = hv_iternext((HV*)sv))) {
fb73857a 1129 I32 keylen;
1130 my_setenv(hv_iterkey(entry, &keylen),
b83604b4 1131 SvPV_nolen_const(hv_iterval((HV*)sv, entry)));
fb73857a 1132 }
1133 }
1134#endif
1135 return 0;
1136}
1137
1138int
864dbfa3 1139Perl_magic_clear_all_env(pTHX_ SV *sv, MAGIC *mg)
66b1d557 1140{
27da23d5 1141 dVAR;
2f42fcb0 1142#ifndef PERL_MICRO
a0fd4948 1143#if defined(VMS) || defined(EPOC)
cea2e8a9 1144 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
3e3baf6d 1145#else
4efc5df6 1146# if defined(PERL_IMPLICIT_SYS) || defined(WIN32)
7766f137 1147 PerlEnv_clearenv();
4efc5df6 1148# else
1149# ifdef USE_ENVIRON_ARRAY
1150# if defined(USE_ITHREADS)
1151 /* only the parent thread can clobber the process environment */
1152 if (PL_curinterp == aTHX)
1153# endif
1154 {
1155# ifndef PERL_USE_SAFE_PUTENV
50acdf95 1156 if (!PL_use_safe_putenv) {
66b1d557 1157 I32 i;
1158
3280af22 1159 if (environ == PL_origenviron)
f2517201 1160 environ = (char**)safesysmalloc(sizeof(char*));
66b1d557 1161 else
1162 for (i = 0; environ[i]; i++)
f2517201 1163 safesysfree(environ[i]);
50acdf95 1164 }
4efc5df6 1165# endif /* PERL_USE_SAFE_PUTENV */
f2517201 1166
66b1d557 1167 environ[0] = Nullch;
4efc5df6 1168 }
1169# endif /* USE_ENVIRON_ARRAY */
052c2dc6 1170# endif /* PERL_IMPLICIT_SYS || WIN32 */
2f42fcb0 1171#endif /* VMS || EPOC */
1172#endif /* !PERL_MICRO */
8772537c 1173 PERL_UNUSED_ARG(sv);
1174 PERL_UNUSED_ARG(mg);
3e3baf6d 1175 return 0;
66b1d557 1176}
1177
64ca3a65 1178#ifndef PERL_MICRO
2d4fcd5e 1179#ifdef HAS_SIGPROCMASK
1180static void
1181restore_sigmask(pTHX_ SV *save_sv)
1182{
b83604b4 1183 const sigset_t *ossetp = (const sigset_t *) SvPV_nolen_const( save_sv );
2d4fcd5e 1184 (void)sigprocmask(SIG_SETMASK, ossetp, (sigset_t *)0);
1185}
1186#endif
66b1d557 1187int
864dbfa3 1188Perl_magic_getsig(pTHX_ SV *sv, MAGIC *mg)
88e89b8a 1189{
88e89b8a 1190 /* Are we fetching a signal entry? */
8772537c 1191 const I32 i = whichsig(MgPV_nolen_const(mg));
e02bfb16 1192 if (i > 0) {
22c35a8c 1193 if(PL_psig_ptr[i])
1194 sv_setsv(sv,PL_psig_ptr[i]);
88e89b8a 1195 else {
85b332e2 1196 Sighandler_t sigstate;
2e34cc90 1197 sigstate = rsignal_state(i);
23ada85b 1198#ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
27da23d5 1199 if (PL_sig_handlers_initted && PL_sig_ignoring[i]) sigstate = SIG_IGN;
2e34cc90 1200#endif
1201#ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
27da23d5 1202 if (PL_sig_handlers_initted && PL_sig_defaulting[i]) 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)
88e89b8a 1206 sv_setpv(sv,"IGNORE");
1207 else
3280af22 1208 sv_setsv(sv,&PL_sv_undef);
22c35a8c 1209 PL_psig_ptr[i] = SvREFCNT_inc(sv);
88e89b8a 1210 SvTEMP_off(sv);
1211 }
1212 }
1213 return 0;
1214}
1215int
864dbfa3 1216Perl_magic_clearsig(pTHX_ SV *sv, MAGIC *mg)
88e89b8a 1217{
2d4fcd5e 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 1222 register const char * const s = MgPV_nolen_const(mg);
1223 PERL_UNUSED_ARG(sv);
2d4fcd5e 1224 if (*s == '_') {
27da23d5 1225 SV** svp = 0;
2d4fcd5e 1226 if (strEQ(s,"__DIE__"))
1227 svp = &PL_diehook;
1228 else if (strEQ(s,"__WARN__"))
1229 svp = &PL_warnhook;
1230 else
1231 Perl_croak(aTHX_ "No such hook: %s", s);
27da23d5 1232 if (svp && *svp) {
8772537c 1233 SV * const to_dec = *svp;
2d4fcd5e 1234 *svp = 0;
1235 SvREFCNT_dec(to_dec);
1236 }
1237 }
1238 else {
2d4fcd5e 1239 /* Are we clearing a signal entry? */
8772537c 1240 const I32 i = whichsig(s);
e02bfb16 1241 if (i > 0) {
2d4fcd5e 1242#ifdef HAS_SIGPROCMASK
1243 sigset_t set, save;
1244 SV* save_sv;
1245 /* Avoid having the signal arrive at a bad time, if possible. */
1246 sigemptyset(&set);
1247 sigaddset(&set,i);
1248 sigprocmask(SIG_BLOCK, &set, &save);
1249 ENTER;
1250 save_sv = newSVpv((char *)(&save), sizeof(sigset_t));
1251 SAVEFREESV(save_sv);
1252 SAVEDESTRUCTOR_X(restore_sigmask, save_sv);
1253#endif
1254 PERL_ASYNC_CHECK();
1255#if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
27da23d5 1256 if (!PL_sig_handlers_initted) Perl_csighandler_init();
2d4fcd5e 1257#endif
1258#ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
27da23d5 1259 PL_sig_defaulting[i] = 1;
5c1546dc 1260 (void)rsignal(i, PL_csighandlerp);
2d4fcd5e 1261#else
8aad04aa 1262 (void)rsignal(i, (Sighandler_t) SIG_DFL);
2d4fcd5e 1263#endif
1264 if(PL_psig_name[i]) {
1265 SvREFCNT_dec(PL_psig_name[i]);
1266 PL_psig_name[i]=0;
1267 }
1268 if(PL_psig_ptr[i]) {
dd374669 1269 SV *to_dec=PL_psig_ptr[i];
2d4fcd5e 1270 PL_psig_ptr[i]=0;
1271 LEAVE;
1272 SvREFCNT_dec(to_dec);
1273 }
1274 else
1275 LEAVE;
1276 }
88e89b8a 1277 }
1278 return 0;
1279}
3d37d572 1280
dd374669 1281static void
1282S_raise_signal(pTHX_ int sig)
0a8e0eff 1283{
1284 /* Set a flag to say this signal is pending */
1285 PL_psig_pend[sig]++;
1286 /* And one to say _a_ signal is pending */
1287 PL_sig_pending = 1;
1288}
1289
1290Signal_t
8aad04aa 1291#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
1292Perl_csighandler(int sig, ...)
1293#else
0a8e0eff 1294Perl_csighandler(int sig)
8aad04aa 1295#endif
0a8e0eff 1296{
1018e26f 1297#ifdef PERL_GET_SIG_CONTEXT
1298 dTHXa(PERL_GET_SIG_CONTEXT);
1299#else
85b332e2 1300 dTHX;
1301#endif
23ada85b 1302#ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
5c1546dc 1303 (void) rsignal(sig, PL_csighandlerp);
27da23d5 1304 if (PL_sig_ignoring[sig]) return;
85b332e2 1305#endif
2e34cc90 1306#ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
27da23d5 1307 if (PL_sig_defaulting[sig])
2e34cc90 1308#ifdef KILL_BY_SIGPRC
1309 exit((Perl_sig_to_vmscondition(sig)&STS$M_COND_ID)|STS$K_SEVERE|STS$M_INHIB_MSG);
1310#else
1311 exit(1);
1312#endif
1313#endif
4ffa73a3 1314 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
1315 /* Call the perl level handler now--
1316 * with risk we may be in malloc() etc. */
1317 (*PL_sighandlerp)(sig);
1318 else
dd374669 1319 S_raise_signal(aTHX_ sig);
0a8e0eff 1320}
1321
2e34cc90 1322#if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1323void
1324Perl_csighandler_init(void)
1325{
1326 int sig;
27da23d5 1327 if (PL_sig_handlers_initted) return;
2e34cc90 1328
1329 for (sig = 1; sig < SIG_SIZE; sig++) {
1330#ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
218fdd94 1331 dTHX;
27da23d5 1332 PL_sig_defaulting[sig] = 1;
5c1546dc 1333 (void) rsignal(sig, PL_csighandlerp);
2e34cc90 1334#endif
1335#ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
27da23d5 1336 PL_sig_ignoring[sig] = 0;
2e34cc90 1337#endif
1338 }
27da23d5 1339 PL_sig_handlers_initted = 1;
2e34cc90 1340}
1341#endif
1342
0a8e0eff 1343void
1344Perl_despatch_signals(pTHX)
1345{
1346 int sig;
1347 PL_sig_pending = 0;
1348 for (sig = 1; sig < SIG_SIZE; sig++) {
1349 if (PL_psig_pend[sig]) {
25da4428 1350 PERL_BLOCKSIG_ADD(set, sig);
1351 PL_psig_pend[sig] = 0;
1352 PERL_BLOCKSIG_BLOCK(set);
f5203343 1353 (*PL_sighandlerp)(sig);
25da4428 1354 PERL_BLOCKSIG_UNBLOCK(set);
0a8e0eff 1355 }
1356 }
1357}
1358
85e6fe83 1359int
864dbfa3 1360Perl_magic_setsig(pTHX_ SV *sv, MAGIC *mg)
79072805 1361{
27da23d5 1362 dVAR;
79072805 1363 I32 i;
b7953727 1364 SV** svp = 0;
2d4fcd5e 1365 /* Need to be careful with SvREFCNT_dec(), because that can have side
1366 * effects (due to closures). We must make sure that the new disposition
1367 * is in place before it is called.
1368 */
1369 SV* to_dec = 0;
e72dc28c 1370 STRLEN len;
2d4fcd5e 1371#ifdef HAS_SIGPROCMASK
1372 sigset_t set, save;
1373 SV* save_sv;
1374#endif
a0d0e21e 1375
d5263905 1376 register const char *s = MgPV_const(mg,len);
748a9306 1377 if (*s == '_') {
1378 if (strEQ(s,"__DIE__"))
3280af22 1379 svp = &PL_diehook;
748a9306 1380 else if (strEQ(s,"__WARN__"))
3280af22 1381 svp = &PL_warnhook;
748a9306 1382 else
cea2e8a9 1383 Perl_croak(aTHX_ "No such hook: %s", s);
748a9306 1384 i = 0;
4633a7c4 1385 if (*svp) {
2d4fcd5e 1386 to_dec = *svp;
4633a7c4 1387 *svp = 0;
1388 }
748a9306 1389 }
1390 else {
1391 i = whichsig(s); /* ...no, a brick */
86d86cad 1392 if (i <= 0) {
e476b1b5 1393 if (ckWARN(WARN_SIGNAL))
9014280d 1394 Perl_warner(aTHX_ packWARN(WARN_SIGNAL), "No such signal: SIG%s", s);
748a9306 1395 return 0;
1396 }
2d4fcd5e 1397#ifdef HAS_SIGPROCMASK
1398 /* Avoid having the signal arrive at a bad time, if possible. */
1399 sigemptyset(&set);
1400 sigaddset(&set,i);
1401 sigprocmask(SIG_BLOCK, &set, &save);
1402 ENTER;
1403 save_sv = newSVpv((char *)(&save), sizeof(sigset_t));
1404 SAVEFREESV(save_sv);
1405 SAVEDESTRUCTOR_X(restore_sigmask, save_sv);
1406#endif
1407 PERL_ASYNC_CHECK();
2e34cc90 1408#if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
27da23d5 1409 if (!PL_sig_handlers_initted) Perl_csighandler_init();
2e34cc90 1410#endif
23ada85b 1411#ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
27da23d5 1412 PL_sig_ignoring[i] = 0;
85b332e2 1413#endif
2e34cc90 1414#ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
27da23d5 1415 PL_sig_defaulting[i] = 0;
2e34cc90 1416#endif
22c35a8c 1417 SvREFCNT_dec(PL_psig_name[i]);
2d4fcd5e 1418 to_dec = PL_psig_ptr[i];
22c35a8c 1419 PL_psig_ptr[i] = SvREFCNT_inc(sv);
88e89b8a 1420 SvTEMP_off(sv); /* Make sure it doesn't go away on us */
e72dc28c 1421 PL_psig_name[i] = newSVpvn(s, len);
22c35a8c 1422 SvREADONLY_on(PL_psig_name[i]);
748a9306 1423 }
a0d0e21e 1424 if (SvTYPE(sv) == SVt_PVGV || SvROK(sv)) {
2d4fcd5e 1425 if (i) {
5c1546dc 1426 (void)rsignal(i, PL_csighandlerp);
2d4fcd5e 1427#ifdef HAS_SIGPROCMASK
1428 LEAVE;
1429#endif
1430 }
748a9306 1431 else
1432 *svp = SvREFCNT_inc(sv);
2d4fcd5e 1433 if(to_dec)
1434 SvREFCNT_dec(to_dec);
a0d0e21e 1435 return 0;
1436 }
e72dc28c 1437 s = SvPV_force(sv,len);
748a9306 1438 if (strEQ(s,"IGNORE")) {
85b332e2 1439 if (i) {
23ada85b 1440#ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
27da23d5 1441 PL_sig_ignoring[i] = 1;
5c1546dc 1442 (void)rsignal(i, PL_csighandlerp);
85b332e2 1443#else
8aad04aa 1444 (void)rsignal(i, (Sighandler_t) SIG_IGN);
85b332e2 1445#endif
2d4fcd5e 1446 }
748a9306 1447 }
1448 else if (strEQ(s,"DEFAULT") || !*s) {
1449 if (i)
2e34cc90 1450#ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1451 {
27da23d5 1452 PL_sig_defaulting[i] = 1;
5c1546dc 1453 (void)rsignal(i, PL_csighandlerp);
2e34cc90 1454 }
1455#else
8aad04aa 1456 (void)rsignal(i, (Sighandler_t) SIG_DFL);
2e34cc90 1457#endif
748a9306 1458 }
79072805 1459 else {
5aabfad6 1460 /*
1461 * We should warn if HINT_STRICT_REFS, but without
1462 * access to a known hint bit in a known OP, we can't
1463 * tell whether HINT_STRICT_REFS is in force or not.
1464 */
46fc3d4c 1465 if (!strchr(s,':') && !strchr(s,'\''))
e72dc28c 1466 sv_insert(sv, 0, 0, "main::", 6);
748a9306 1467 if (i)
5c1546dc 1468 (void)rsignal(i, PL_csighandlerp);
748a9306 1469 else
1470 *svp = SvREFCNT_inc(sv);
79072805 1471 }
2d4fcd5e 1472#ifdef HAS_SIGPROCMASK
1473 if(i)
1474 LEAVE;
1475#endif
1476 if(to_dec)
1477 SvREFCNT_dec(to_dec);
79072805 1478 return 0;
1479}
64ca3a65 1480#endif /* !PERL_MICRO */
79072805 1481
1482int
864dbfa3 1483Perl_magic_setisa(pTHX_ SV *sv, MAGIC *mg)
79072805 1484{
8772537c 1485 PERL_UNUSED_ARG(sv);
1486 PERL_UNUSED_ARG(mg);
3280af22 1487 PL_sub_generation++;
463ee0b2 1488 return 0;
1489}
1490
1491int
864dbfa3 1492Perl_magic_setamagic(pTHX_ SV *sv, MAGIC *mg)
463ee0b2 1493{
8772537c 1494 PERL_UNUSED_ARG(sv);
1495 PERL_UNUSED_ARG(mg);
a0d0e21e 1496 /* HV_badAMAGIC_on(Sv_STASH(sv)); */
3280af22 1497 PL_amagic_generation++;
463ee0b2 1498
a0d0e21e 1499 return 0;
1500}
463ee0b2 1501
946ec16e 1502int
864dbfa3 1503Perl_magic_getnkeys(pTHX_ SV *sv, MAGIC *mg)
6ff81951 1504{
dd374669 1505 HV * const hv = (HV*)LvTARG(sv);
6ff81951 1506 I32 i = 0;
8772537c 1507 PERL_UNUSED_ARG(mg);
7719e241 1508
6ff81951 1509 if (hv) {
497b47a8 1510 (void) hv_iterinit(hv);
1511 if (! SvTIED_mg((SV*)hv, PERL_MAGIC_tied))
1512 i = HvKEYS(hv);
1513 else {
1514 while (hv_iternext(hv))
1515 i++;
1516 }
6ff81951 1517 }
1518
1519 sv_setiv(sv, (IV)i);
1520 return 0;
1521}
1522
1523int
864dbfa3 1524Perl_magic_setnkeys(pTHX_ SV *sv, MAGIC *mg)
946ec16e 1525{
8772537c 1526 PERL_UNUSED_ARG(mg);
946ec16e 1527 if (LvTARG(sv)) {
1528 hv_ksplit((HV*)LvTARG(sv), SvIV(sv));
946ec16e 1529 }
1530 return 0;
ac27b0f5 1531}
946ec16e 1532
e336de0d 1533/* caller is responsible for stack switching/cleanup */
565764a8 1534STATIC int
e1ec3a88 1535S_magic_methcall(pTHX_ SV *sv, const MAGIC *mg, const char *meth, I32 flags, int n, SV *val)
a0d0e21e 1536{
1537 dSP;
463ee0b2 1538
924508f0 1539 PUSHMARK(SP);
1540 EXTEND(SP, n);
33c27489 1541 PUSHs(SvTIED_obj(sv, mg));
ac27b0f5 1542 if (n > 1) {
93965878 1543 if (mg->mg_ptr) {
565764a8 1544 if (mg->mg_len >= 0)
79cb57f6 1545 PUSHs(sv_2mortal(newSVpvn(mg->mg_ptr, mg->mg_len)));
565764a8 1546 else if (mg->mg_len == HEf_SVKEY)
93965878 1547 PUSHs((SV*)mg->mg_ptr);
1548 }
14befaf4 1549 else if (mg->mg_type == PERL_MAGIC_tiedelem) {
565764a8 1550 PUSHs(sv_2mortal(newSViv(mg->mg_len)));
93965878 1551 }
1552 }
1553 if (n > 2) {
1554 PUSHs(val);
88e89b8a 1555 }
463ee0b2 1556 PUTBACK;
1557
864dbfa3 1558 return call_method(meth, flags);
946ec16e 1559}
1560
76e3520e 1561STATIC int
e1ec3a88 1562S_magic_methpack(pTHX_ SV *sv, const MAGIC *mg, const char *meth)
a0d0e21e 1563{
27da23d5 1564 dVAR; dSP;
463ee0b2 1565
a0d0e21e 1566 ENTER;
1567 SAVETMPS;
e788e7d3 1568 PUSHSTACKi(PERLSI_MAGIC);
463ee0b2 1569
33c27489 1570 if (magic_methcall(sv, mg, meth, G_SCALAR, 2, NULL)) {
3280af22 1571 sv_setsv(sv, *PL_stack_sp--);
93965878 1572 }
463ee0b2 1573
d3acc0f7 1574 POPSTACK;
a0d0e21e 1575 FREETMPS;
1576 LEAVE;
1577 return 0;
1578}
463ee0b2 1579
a0d0e21e 1580int
864dbfa3 1581Perl_magic_getpack(pTHX_ SV *sv, MAGIC *mg)
a0d0e21e 1582{
a0d0e21e 1583 if (mg->mg_ptr)
1584 mg->mg_flags |= MGf_GSKIP;
58f82c5c 1585 magic_methpack(sv,mg,"FETCH");
463ee0b2 1586 return 0;
1587}
1588
1589int
864dbfa3 1590Perl_magic_setpack(pTHX_ SV *sv, MAGIC *mg)
e336de0d 1591{
27da23d5 1592 dVAR; dSP;
a60c0954 1593 ENTER;
e788e7d3 1594 PUSHSTACKi(PERLSI_MAGIC);
33c27489 1595 magic_methcall(sv, mg, "STORE", G_SCALAR|G_DISCARD, 3, sv);
d3acc0f7 1596 POPSTACK;
a60c0954 1597 LEAVE;
463ee0b2 1598 return 0;
1599}
1600
1601int
864dbfa3 1602Perl_magic_clearpack(pTHX_ SV *sv, MAGIC *mg)
463ee0b2 1603{
a0d0e21e 1604 return magic_methpack(sv,mg,"DELETE");
1605}
463ee0b2 1606
93965878 1607
1608U32
864dbfa3 1609Perl_magic_sizepack(pTHX_ SV *sv, MAGIC *mg)
ac27b0f5 1610{
27da23d5 1611 dVAR; dSP;
93965878 1612 U32 retval = 0;
1613
1614 ENTER;
1615 SAVETMPS;
e788e7d3 1616 PUSHSTACKi(PERLSI_MAGIC);
33c27489 1617 if (magic_methcall(sv, mg, "FETCHSIZE", G_SCALAR, 2, NULL)) {
3280af22 1618 sv = *PL_stack_sp--;
a60c0954 1619 retval = (U32) SvIV(sv)-1;
93965878 1620 }
d3acc0f7 1621 POPSTACK;
93965878 1622 FREETMPS;
1623 LEAVE;
1624 return retval;
1625}
1626
cea2e8a9 1627int
1628Perl_magic_wipepack(pTHX_ SV *sv, MAGIC *mg)
a0d0e21e 1629{
27da23d5 1630 dVAR; dSP;
463ee0b2 1631
e336de0d 1632 ENTER;
e788e7d3 1633 PUSHSTACKi(PERLSI_MAGIC);
924508f0 1634 PUSHMARK(SP);
33c27489 1635 XPUSHs(SvTIED_obj(sv, mg));
463ee0b2 1636 PUTBACK;
864dbfa3 1637 call_method("CLEAR", G_SCALAR|G_DISCARD);
d3acc0f7 1638 POPSTACK;
a60c0954 1639 LEAVE;
a3bcc51e 1640
463ee0b2 1641 return 0;
1642}
1643
1644int
864dbfa3 1645Perl_magic_nextpack(pTHX_ SV *sv, MAGIC *mg, SV *key)
463ee0b2 1646{
27da23d5 1647 dVAR; dSP;
35a4481c 1648 const char * const meth = SvOK(key) ? "NEXTKEY" : "FIRSTKEY";
463ee0b2 1649
1650 ENTER;
a0d0e21e 1651 SAVETMPS;
e788e7d3 1652 PUSHSTACKi(PERLSI_MAGIC);
924508f0 1653 PUSHMARK(SP);
1654 EXTEND(SP, 2);
33c27489 1655 PUSHs(SvTIED_obj(sv, mg));
463ee0b2 1656 if (SvOK(key))
1657 PUSHs(key);
1658 PUTBACK;
1659
864dbfa3 1660 if (call_method(meth, G_SCALAR))
3280af22 1661 sv_setsv(key, *PL_stack_sp--);
463ee0b2 1662
d3acc0f7 1663 POPSTACK;
a0d0e21e 1664 FREETMPS;
1665 LEAVE;
79072805 1666 return 0;
1667}
1668
1669int
864dbfa3 1670Perl_magic_existspack(pTHX_ SV *sv, MAGIC *mg)
a0d0e21e 1671{
1672 return magic_methpack(sv,mg,"EXISTS");
ac27b0f5 1673}
a0d0e21e 1674
a3bcc51e 1675SV *
1676Perl_magic_scalarpack(pTHX_ HV *hv, MAGIC *mg)
1677{
27da23d5 1678 dVAR; dSP;
a3bcc51e 1679 SV *retval = &PL_sv_undef;
8772537c 1680 SV * const tied = SvTIED_obj((SV*)hv, mg);
1681 HV * const pkg = SvSTASH((SV*)SvRV(tied));
a3bcc51e 1682
1683 if (!gv_fetchmethod_autoload(pkg, "SCALAR", FALSE)) {
1684 SV *key;
bfcb3514 1685 if (HvEITER_get(hv))
a3bcc51e 1686 /* we are in an iteration so the hash cannot be empty */
1687 return &PL_sv_yes;
1688 /* no xhv_eiter so now use FIRSTKEY */
1689 key = sv_newmortal();
1690 magic_nextpack((SV*)hv, mg, key);
bfcb3514 1691 HvEITER_set(hv, NULL); /* need to reset iterator */
a3bcc51e 1692 return SvOK(key) ? &PL_sv_yes : &PL_sv_no;
1693 }
1694
1695 /* there is a SCALAR method that we can call */
1696 ENTER;
1697 PUSHSTACKi(PERLSI_MAGIC);
1698 PUSHMARK(SP);
1699 EXTEND(SP, 1);
1700 PUSHs(tied);
1701 PUTBACK;
1702
1703 if (call_method("SCALAR", G_SCALAR))
1704 retval = *PL_stack_sp--;
1705 POPSTACK;
1706 LEAVE;
1707 return retval;
1708}
1709
a0d0e21e 1710int
864dbfa3 1711Perl_magic_setdbline(pTHX_ SV *sv, MAGIC *mg)
79072805 1712{
8772537c 1713 GV * const gv = PL_DBline;
1714 const I32 i = SvTRUE(sv);
1715 SV ** const svp = av_fetch(GvAV(gv),
01b8bcb7 1716 atoi(MgPV_nolen_const(mg)), FALSE);
8772537c 1717 if (svp && SvIOKp(*svp)) {
1718 OP * const o = INT2PTR(OP*,SvIVX(*svp));
1719 if (o) {
1720 /* set or clear breakpoint in the relevant control op */
1721 if (i)
1722 o->op_flags |= OPf_SPECIAL;
1723 else
1724 o->op_flags &= ~OPf_SPECIAL;
1725 }
5df8de69 1726 }
79072805 1727 return 0;
1728}
1729
1730int
8772537c 1731Perl_magic_getarylen(pTHX_ SV *sv, const MAGIC *mg)
79072805 1732{
8772537c 1733 const AV * const obj = (AV*)mg->mg_obj;
83bf042f 1734 if (obj) {
1735 sv_setiv(sv, AvFILL(obj) + PL_curcop->cop_arybase);
1736 } else {
1737 SvOK_off(sv);
1738 }
79072805 1739 return 0;
1740}
1741
1742int
864dbfa3 1743Perl_magic_setarylen(pTHX_ SV *sv, MAGIC *mg)
79072805 1744{
8772537c 1745 AV * const obj = (AV*)mg->mg_obj;
83bf042f 1746 if (obj) {
1747 av_fill(obj, SvIV(sv) - PL_curcop->cop_arybase);
1748 } else {
1749 if (ckWARN(WARN_MISC))
1750 Perl_warner(aTHX_ packWARN(WARN_MISC),
1751 "Attempt to set length of freed array");
1752 }
1753 return 0;
1754}
1755
1756int
1757Perl_magic_freearylen_p(pTHX_ SV *sv, MAGIC *mg)
1758{
53c1dcc0 1759 PERL_UNUSED_ARG(sv);
94f3782b 1760 /* during global destruction, mg_obj may already have been freed */
1761 if (PL_in_clean_all)
1ea47f64 1762 return 0;
94f3782b 1763
83bf042f 1764 mg = mg_find (mg->mg_obj, PERL_MAGIC_arylen);
1765
1766 if (mg) {
1767 /* arylen scalar holds a pointer back to the array, but doesn't own a
1768 reference. Hence the we (the array) are about to go away with it
1769 still pointing at us. Clear its pointer, else it would be pointing
1770 at free memory. See the comment in sv_magic about reference loops,
1771 and why it can't own a reference to us. */
1772 mg->mg_obj = 0;
1773 }
a0d0e21e 1774 return 0;
1775}
1776
1777int
864dbfa3 1778Perl_magic_getpos(pTHX_ SV *sv, MAGIC *mg)
a0d0e21e 1779{
8772537c 1780 SV* const lsv = LvTARG(sv);
ac27b0f5 1781
a0d0e21e 1782 if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv)) {
14befaf4 1783 mg = mg_find(lsv, PERL_MAGIC_regex_global);
565764a8 1784 if (mg && mg->mg_len >= 0) {
a0ed51b3 1785 I32 i = mg->mg_len;
7e2040f0 1786 if (DO_UTF8(lsv))
a0ed51b3 1787 sv_pos_b2u(lsv, &i);
1788 sv_setiv(sv, i + PL_curcop->cop_arybase);
a0d0e21e 1789 return 0;
1790 }
1791 }
0c34ef67 1792 SvOK_off(sv);
a0d0e21e 1793 return 0;
1794}
1795
1796int
864dbfa3 1797Perl_magic_setpos(pTHX_ SV *sv, MAGIC *mg)
a0d0e21e 1798{
8772537c 1799 SV* const lsv = LvTARG(sv);
a0d0e21e 1800 SSize_t pos;
1801 STRLEN len;
c00206c8 1802 STRLEN ulen = 0;
a0d0e21e 1803
1804 mg = 0;
ac27b0f5 1805
a0d0e21e 1806 if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv))
14befaf4 1807 mg = mg_find(lsv, PERL_MAGIC_regex_global);
a0d0e21e 1808 if (!mg) {
1809 if (!SvOK(sv))
1810 return 0;
14befaf4 1811 sv_magic(lsv, (SV*)0, PERL_MAGIC_regex_global, Nullch, 0);
1812 mg = mg_find(lsv, PERL_MAGIC_regex_global);
a0d0e21e 1813 }
1814 else if (!SvOK(sv)) {
565764a8 1815 mg->mg_len = -1;
a0d0e21e 1816 return 0;
1817 }
1818 len = SvPOK(lsv) ? SvCUR(lsv) : sv_len(lsv);
1819
c485e607 1820 pos = SvIV(sv) - PL_curcop->cop_arybase;
a0ed51b3 1821
7e2040f0 1822 if (DO_UTF8(lsv)) {
a0ed51b3 1823 ulen = sv_len_utf8(lsv);
1824 if (ulen)
1825 len = ulen;
a0ed51b3 1826 }
1827
a0d0e21e 1828 if (pos < 0) {
1829 pos += len;
1830 if (pos < 0)
1831 pos = 0;
1832 }
eb160463 1833 else if (pos > (SSize_t)len)
a0d0e21e 1834 pos = len;
a0ed51b3 1835
1836 if (ulen) {
1837 I32 p = pos;
1838 sv_pos_u2b(lsv, &p, 0);
1839 pos = p;
1840 }
727405f8 1841
565764a8 1842 mg->mg_len = pos;
71be2cbc 1843 mg->mg_flags &= ~MGf_MINMATCH;
a0d0e21e 1844
79072805 1845 return 0;
1846}
1847
1848int
864dbfa3 1849Perl_magic_getglob(pTHX_ SV *sv, MAGIC *mg)
79072805 1850{
8772537c 1851 PERL_UNUSED_ARG(mg);
8646b087 1852 if (SvFAKE(sv)) { /* FAKE globs can get coerced */
1853 SvFAKE_off(sv);
946ec16e 1854 gv_efullname3(sv,((GV*)sv), "*");
8646b087 1855 SvFAKE_on(sv);
1856 }
1857 else
946ec16e 1858 gv_efullname3(sv,((GV*)sv), "*"); /* a gv value, be nice */
79072805 1859 return 0;
1860}
1861
1862int
864dbfa3 1863Perl_magic_setglob(pTHX_ SV *sv, MAGIC *mg)
79072805 1864{
79072805 1865 GV* gv;
8772537c 1866 PERL_UNUSED_ARG(mg);
1867
79072805 1868 if (!SvOK(sv))
1869 return 0;
7a5fd60d 1870 gv = gv_fetchsv(sv,TRUE, SVt_PVGV);
79072805 1871 if (sv == (SV*)gv)
1872 return 0;
1873 if (GvGP(sv))
88e89b8a 1874 gp_free((GV*)sv);
79072805 1875 GvGP(sv) = gp_ref(GvGP(gv));
79072805 1876 return 0;
1877}
1878
1879int
864dbfa3 1880Perl_magic_getsubstr(pTHX_ SV *sv, MAGIC *mg)
6ff81951 1881{
1882 STRLEN len;
35a4481c 1883 SV * const lsv = LvTARG(sv);
b83604b4 1884 const char * const tmps = SvPV_const(lsv,len);
6ff81951 1885 I32 offs = LvTARGOFF(sv);
1886 I32 rem = LvTARGLEN(sv);
8772537c 1887 PERL_UNUSED_ARG(mg);
6ff81951 1888
9aa983d2 1889 if (SvUTF8(lsv))
1890 sv_pos_u2b(lsv, &offs, &rem);
eb160463 1891 if (offs > (I32)len)
6ff81951 1892 offs = len;
eb160463 1893 if (rem + offs > (I32)len)
6ff81951 1894 rem = len - offs;
1895 sv_setpvn(sv, tmps + offs, (STRLEN)rem);
9aa983d2 1896 if (SvUTF8(lsv))
2ef4b674 1897 SvUTF8_on(sv);
6ff81951 1898 return 0;
1899}
1900
1901int
864dbfa3 1902Perl_magic_setsubstr(pTHX_ SV *sv, MAGIC *mg)
79072805 1903{
9aa983d2 1904 STRLEN len;
b83604b4 1905 const char *tmps = SvPV_const(sv, len);
dd374669 1906 SV * const lsv = LvTARG(sv);
9aa983d2 1907 I32 lvoff = LvTARGOFF(sv);
1908 I32 lvlen = LvTARGLEN(sv);
8772537c 1909 PERL_UNUSED_ARG(mg);
075a4a2b 1910
1aa99e6b 1911 if (DO_UTF8(sv)) {
9aa983d2 1912 sv_utf8_upgrade(lsv);
1913 sv_pos_u2b(lsv, &lvoff, &lvlen);
1914 sv_insert(lsv, lvoff, lvlen, tmps, len);
b76f3ce2 1915 LvTARGLEN(sv) = sv_len_utf8(sv);
9aa983d2 1916 SvUTF8_on(lsv);
1917 }
9bf12eaf 1918 else if (lsv && SvUTF8(lsv)) {
9aa983d2 1919 sv_pos_u2b(lsv, &lvoff, &lvlen);
b76f3ce2 1920 LvTARGLEN(sv) = len;
e95af362 1921 tmps = (char*)bytes_to_utf8((U8*)tmps, &len);
9aa983d2 1922 sv_insert(lsv, lvoff, lvlen, tmps, len);
1923 Safefree(tmps);
1aa99e6b 1924 }
b76f3ce2 1925 else {
1926 sv_insert(lsv, lvoff, lvlen, tmps, len);
1927 LvTARGLEN(sv) = len;
1928 }
1929
1aa99e6b 1930
79072805 1931 return 0;
1932}
1933
1934int
864dbfa3 1935Perl_magic_gettaint(pTHX_ SV *sv, MAGIC *mg)
463ee0b2 1936{
8772537c 1937 PERL_UNUSED_ARG(sv);
27cc343c 1938 TAINT_IF((PL_localizing != 1) && (mg->mg_len & 1));
463ee0b2 1939 return 0;
1940}
1941
1942int
864dbfa3 1943Perl_magic_settaint(pTHX_ SV *sv, MAGIC *mg)
463ee0b2 1944{
8772537c 1945 PERL_UNUSED_ARG(sv);
0a9c116b 1946 /* update taint status unless we're restoring at scope exit */
1947 if (PL_localizing != 2) {
1948 if (PL_tainted)
1949 mg->mg_len |= 1;
1950 else
1951 mg->mg_len &= ~1;
1952 }
463ee0b2 1953 return 0;
1954}
1955
1956int
864dbfa3 1957Perl_magic_getvec(pTHX_ SV *sv, MAGIC *mg)
6ff81951 1958{
35a4481c 1959 SV * const lsv = LvTARG(sv);
8772537c 1960 PERL_UNUSED_ARG(mg);
6ff81951 1961
1962 if (!lsv) {
0c34ef67 1963 SvOK_off(sv);
6ff81951 1964 return 0;
1965 }
6ff81951 1966
81e118e0 1967 sv_setuv(sv, do_vecget(lsv, LvTARGOFF(sv), LvTARGLEN(sv)));
6ff81951 1968 return 0;
1969}
1970
1971int
864dbfa3 1972Perl_magic_setvec(pTHX_ SV *sv, MAGIC *mg)
79072805 1973{
8772537c 1974 PERL_UNUSED_ARG(mg);
79072805 1975 do_vecset(sv); /* XXX slurp this routine */
1976 return 0;
1977}
1978
1979int
864dbfa3 1980Perl_magic_getdefelem(pTHX_ SV *sv, MAGIC *mg)
5f05dabc 1981{
71be2cbc 1982 SV *targ = Nullsv;
5f05dabc 1983 if (LvTARGLEN(sv)) {
68dc0745 1984 if (mg->mg_obj) {
8772537c 1985 SV * const ahv = LvTARG(sv);
1986 HE * const he = hv_fetch_ent((HV*)ahv, mg->mg_obj, FALSE, 0);
6d822dc4 1987 if (he)
1988 targ = HeVAL(he);
68dc0745 1989 }
1990 else {
8772537c 1991 AV* const av = (AV*)LvTARG(sv);
68dc0745 1992 if ((I32)LvTARGOFF(sv) <= AvFILL(av))
1993 targ = AvARRAY(av)[LvTARGOFF(sv)];
1994 }
3280af22 1995 if (targ && targ != &PL_sv_undef) {
68dc0745 1996 /* somebody else defined it for us */
1997 SvREFCNT_dec(LvTARG(sv));
1998 LvTARG(sv) = SvREFCNT_inc(targ);
1999 LvTARGLEN(sv) = 0;
2000 SvREFCNT_dec(mg->mg_obj);
2001 mg->mg_obj = Nullsv;
2002 mg->mg_flags &= ~MGf_REFCOUNTED;
2003 }
5f05dabc 2004 }
71be2cbc 2005 else
2006 targ = LvTARG(sv);
3280af22 2007 sv_setsv(sv, targ ? targ : &PL_sv_undef);
71be2cbc 2008 return 0;
2009}
2010
2011int
864dbfa3 2012Perl_magic_setdefelem(pTHX_ SV *sv, MAGIC *mg)
71be2cbc 2013{
8772537c 2014 PERL_UNUSED_ARG(mg);
71be2cbc 2015 if (LvTARGLEN(sv))
68dc0745 2016 vivify_defelem(sv);
2017 if (LvTARG(sv)) {
5f05dabc 2018 sv_setsv(LvTARG(sv), sv);
68dc0745 2019 SvSETMAGIC(LvTARG(sv));
2020 }
5f05dabc 2021 return 0;
2022}
2023
71be2cbc 2024void
864dbfa3 2025Perl_vivify_defelem(pTHX_ SV *sv)
71be2cbc 2026{
74e13ce4 2027 MAGIC *mg;
2028 SV *value = Nullsv;
71be2cbc 2029
14befaf4 2030 if (!LvTARGLEN(sv) || !(mg = mg_find(sv, PERL_MAGIC_defelem)))
71be2cbc 2031 return;
68dc0745 2032 if (mg->mg_obj) {
8772537c 2033 SV * const ahv = LvTARG(sv);
2034 HE * const he = hv_fetch_ent((HV*)ahv, mg->mg_obj, TRUE, 0);
6d822dc4 2035 if (he)
2036 value = HeVAL(he);
3280af22 2037 if (!value || value == &PL_sv_undef)
ce5030a2 2038 Perl_croak(aTHX_ PL_no_helem_sv, mg->mg_obj);
71be2cbc 2039 }
68dc0745 2040 else {
8772537c 2041 AV* const av = (AV*)LvTARG(sv);
5aabfad6 2042 if ((I32)LvTARGLEN(sv) < 0 && (I32)LvTARGOFF(sv) > AvFILL(av))
68dc0745 2043 LvTARG(sv) = Nullsv; /* array can't be extended */
2044 else {
aec46f14 2045 SV** const svp = av_fetch(av, LvTARGOFF(sv), TRUE);
3280af22 2046 if (!svp || (value = *svp) == &PL_sv_undef)
cea2e8a9 2047 Perl_croak(aTHX_ PL_no_aelem, (I32)LvTARGOFF(sv));
68dc0745 2048 }
2049 }
3e3baf6d 2050 (void)SvREFCNT_inc(value);
68dc0745 2051 SvREFCNT_dec(LvTARG(sv));
2052 LvTARG(sv) = value;
71be2cbc 2053 LvTARGLEN(sv) = 0;
68dc0745 2054 SvREFCNT_dec(mg->mg_obj);
2055 mg->mg_obj = Nullsv;
2056 mg->mg_flags &= ~MGf_REFCOUNTED;
5f05dabc 2057}
2058
2059int
864dbfa3 2060Perl_magic_killbackrefs(pTHX_ SV *sv, MAGIC *mg)
810b8aa5 2061{
e15faf7d 2062 AV *const av = (AV*)mg->mg_obj;
2063 SV **svp = AvARRAY(av);
8772537c 2064 PERL_UNUSED_ARG(sv);
dd374669 2065
e15faf7d 2066 if (svp) {
2067 SV *const *const last = svp + AvFILLp(av);
2068
2069 while (svp <= last) {
2070 if (*svp) {
2071 SV *const referrer = *svp;
2072 if (SvWEAKREF(referrer)) {
2073 /* XXX Should we check that it hasn't changed? */
2074 SvRV_set(referrer, 0);
2075 SvOK_off(referrer);
2076 SvWEAKREF_off(referrer);
2077 } else if (SvTYPE(referrer) == SVt_PVGV ||
2078 SvTYPE(referrer) == SVt_PVLV) {
2079 /* You lookin' at me? */
2080 assert(GvSTASH(referrer));
2081 assert(GvSTASH(referrer) == (HV*)sv);
2082 GvSTASH(referrer) = 0;
2083 } else {
2084 Perl_croak(aTHX_
2085 "panic: magic_killbackrefs (flags=%"UVxf")",
e91e3b10 2086 (UV)SvFLAGS(referrer));
e15faf7d 2087 }
2088
2089 *svp = Nullsv;
2090 }
2091 svp++;
810b8aa5 2092 }
810b8aa5 2093 }
d99b02a1 2094 SvREFCNT_dec(av); /* remove extra count added by sv_add_backref() */
810b8aa5 2095 return 0;
2096}
2097
2098int
864dbfa3 2099Perl_magic_setmglob(pTHX_ SV *sv, MAGIC *mg)
93a17b20 2100{
565764a8 2101 mg->mg_len = -1;
c6496cc7 2102 SvSCREAM_off(sv);
93a17b20 2103 return 0;
2104}
2105
2106int
864dbfa3 2107Perl_magic_setbm(pTHX_ SV *sv, MAGIC *mg)
79072805 2108{
8772537c 2109 PERL_UNUSED_ARG(mg);
14befaf4 2110 sv_unmagic(sv, PERL_MAGIC_bm);
79072805 2111 SvVALID_off(sv);
2112 return 0;
2113}
2114
2115int
864dbfa3 2116Perl_magic_setfm(pTHX_ SV *sv, MAGIC *mg)
55497cff 2117{
8772537c 2118 PERL_UNUSED_ARG(mg);
14befaf4 2119 sv_unmagic(sv, PERL_MAGIC_fm);
55497cff 2120 SvCOMPILED_off(sv);
2121 return 0;
2122}
2123
2124int
864dbfa3 2125Perl_magic_setuvar(pTHX_ SV *sv, MAGIC *mg)
79072805 2126{
35a4481c 2127 const struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
79072805 2128
2129 if (uf && uf->uf_set)
24f81a43 2130 (*uf->uf_set)(aTHX_ uf->uf_index, sv);
79072805 2131 return 0;
2132}
2133
c277df42 2134int
faf82a0b 2135Perl_magic_setregexp(pTHX_ SV *sv, MAGIC *mg)
2136{
8772537c 2137 PERL_UNUSED_ARG(mg);
faf82a0b 2138 sv_unmagic(sv, PERL_MAGIC_qr);
2139 return 0;
2140}
2141
2142int
864dbfa3 2143Perl_magic_freeregexp(pTHX_ SV *sv, MAGIC *mg)
c277df42 2144{
8772537c 2145 regexp * const re = (regexp *)mg->mg_obj;
2146 PERL_UNUSED_ARG(sv);
2147
c277df42 2148 ReREFCNT_dec(re);
2149 return 0;
2150}
2151
7a4c00b4 2152#ifdef USE_LOCALE_COLLATE
79072805 2153int
864dbfa3 2154Perl_magic_setcollxfrm(pTHX_ SV *sv, MAGIC *mg)
bbce6d69 2155{
2156 /*
838b5b74 2157 * RenE<eacute> Descartes said "I think not."
bbce6d69 2158 * and vanished with a faint plop.
2159 */
8772537c 2160 PERL_UNUSED_ARG(sv);
7a4c00b4 2161 if (mg->mg_ptr) {
2162 Safefree(mg->mg_ptr);
2163 mg->mg_ptr = NULL;
565764a8 2164 mg->mg_len = -1;
7a4c00b4 2165 }
bbce6d69 2166 return 0;
2167}
7a4c00b4 2168#endif /* USE_LOCALE_COLLATE */
bbce6d69 2169
7e8c5dac 2170/* Just clear the UTF-8 cache data. */
2171int
2172Perl_magic_setutf8(pTHX_ SV *sv, MAGIC *mg)
2173{
8772537c 2174 PERL_UNUSED_ARG(sv);
7e8c5dac 2175 Safefree(mg->mg_ptr); /* The mg_ptr holds the pos cache. */
2176 mg->mg_ptr = 0;
2177 mg->mg_len = -1; /* The mg_len holds the len cache. */
2178 return 0;
2179}
2180
bbce6d69 2181int
864dbfa3 2182Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
79072805 2183{
e1ec3a88 2184 register const char *s;
79072805 2185 I32 i;
8990e307 2186 STRLEN len;
79072805 2187 switch (*mg->mg_ptr) {
748a9306 2188 case '\001': /* ^A */
3280af22 2189 sv_setsv(PL_bodytarget, sv);
748a9306 2190 break;
49460fe6 2191 case '\003': /* ^C */
eb160463 2192 PL_minus_c = (bool)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
49460fe6 2193 break;
2194
79072805 2195 case '\004': /* ^D */
b4ab917c 2196#ifdef DEBUGGING
b83604b4 2197 s = SvPV_nolen_const(sv);
ddcf8bc1 2198 PL_debug = get_debug_opts(&s, 0) | DEBUG_TOP_FLAG;
79072805 2199 DEBUG_x(dump_all());
b4ab917c 2200#else
2201 PL_debug = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) | DEBUG_TOP_FLAG;
2202#endif
79072805 2203 break;
28f23441 2204 case '\005': /* ^E */
d0063567 2205 if (*(mg->mg_ptr+1) == '\0') {
cd39f2b6 2206#ifdef MACOS_TRADITIONAL
d0063567 2207 gMacPerl_OSErr = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
28f23441 2208#else
cd39f2b6 2209# ifdef VMS
d0063567 2210 set_vaxc_errno(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
048c1ddf 2211# else
cd39f2b6 2212# ifdef WIN32
d0063567 2213 SetLastError( SvIV(sv) );
cd39f2b6 2214# else
9fed8b87 2215# ifdef OS2
d0063567 2216 os2_setsyserrno(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
9fed8b87 2217# else
d0063567 2218 /* will anyone ever use this? */
2219 SETERRNO(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv), 4);
cd39f2b6 2220# endif
048c1ddf 2221# endif
2222# endif
22fae026 2223#endif
d0063567 2224 }
2225 else if (strEQ(mg->mg_ptr+1, "NCODING")) {
2226 if (PL_encoding)
2227 SvREFCNT_dec(PL_encoding);
2228 if (SvOK(sv) || SvGMAGICAL(sv)) {
2229 PL_encoding = newSVsv(sv);
2230 }
2231 else {
2232 PL_encoding = Nullsv;
2233 }
2234 }
2235 break;
79072805 2236 case '\006': /* ^F */
3280af22 2237 PL_maxsysfd = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
79072805 2238 break;
a0d0e21e 2239 case '\010': /* ^H */
3280af22 2240 PL_hints = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
a0d0e21e 2241 break;
9d116dd7 2242 case '\011': /* ^I */ /* NOT \t in EBCDIC */
43c5f42d 2243 Safefree(PL_inplace);
2244 PL_inplace = SvOK(sv) ? savesvpv(sv) : Nullch;
da78da6e 2245 break;
28f23441 2246 case '\017': /* ^O */
ac27b0f5 2247 if (*(mg->mg_ptr+1) == '\0') {
43c5f42d 2248 Safefree(PL_osname);
2249 PL_osname = Nullch;
3511154c 2250 if (SvOK(sv)) {
2251 TAINT_PROPER("assigning to $^O");
2e0de35c 2252 PL_osname = savesvpv(sv);
3511154c 2253 }
ac27b0f5 2254 }
2255 else if (strEQ(mg->mg_ptr, "\017PEN")) {
2256 if (!PL_compiling.cop_io)
2257 PL_compiling.cop_io = newSVsv(sv);
2258 else
2259 sv_setsv(PL_compiling.cop_io,sv);
2260 }
28f23441 2261 break;
79072805 2262 case '\020': /* ^P */
3280af22 2263 PL_perldb = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
f2a7f298 2264 if (PL_perldb && !PL_DBsingle)
1ee4443e 2265 init_debugger();
79072805 2266 break;
2267 case '\024': /* ^T */
88e89b8a 2268#ifdef BIG_TIME
6b88bc9c 2269 PL_basetime = (Time_t)(SvNOK(sv) ? SvNVX(sv) : sv_2nv(sv));
88e89b8a 2270#else
3280af22 2271 PL_basetime = (Time_t)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
88e89b8a 2272#endif
79072805 2273 break;
fde18df1 2274 case '\027': /* ^W & $^WARNING_BITS */
4438c4b7 2275 if (*(mg->mg_ptr+1) == '\0') {
2276 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
2277 i = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
ac27b0f5 2278 PL_dowarn = (PL_dowarn & ~G_WARN_ON)
0453d815 2279 | (i ? G_WARN_ON : G_WARN_OFF) ;
4438c4b7 2280 }
599cee73 2281 }
0a378802 2282 else if (strEQ(mg->mg_ptr+1, "ARNING_BITS")) {
4438c4b7 2283 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
d775746e 2284 if (!SvPOK(sv) && PL_localizing) {
2285 sv_setpvn(sv, WARN_NONEstring, WARNsize);
d3a7d8c7 2286 PL_compiling.cop_warnings = pWARN_NONE;
d775746e 2287 break;
2288 }
f4fc7782 2289 {
b5477537 2290 STRLEN len, i;
d3a7d8c7 2291 int accumulate = 0 ;
f4fc7782 2292 int any_fatals = 0 ;
b83604b4 2293 const char * const ptr = SvPV_const(sv, len) ;
f4fc7782 2294 for (i = 0 ; i < len ; ++i) {
2295 accumulate |= ptr[i] ;
2296 any_fatals |= (ptr[i] & 0xAA) ;
2297 }
d3a7d8c7 2298 if (!accumulate)
2299 PL_compiling.cop_warnings = pWARN_NONE;
f4fc7782 2300 else if (isWARN_on(sv, WARN_ALL) && !any_fatals) {
2301 PL_compiling.cop_warnings = pWARN_ALL;
2302 PL_dowarn |= G_WARN_ONCE ;
727405f8 2303 }
d3a7d8c7 2304 else {
2305 if (specialWARN(PL_compiling.cop_warnings))
2306 PL_compiling.cop_warnings = newSVsv(sv) ;
2307 else
2308 sv_setsv(PL_compiling.cop_warnings, sv);
2309 if (isWARN_on(PL_compiling.cop_warnings, WARN_ONCE))
2310 PL_dowarn |= G_WARN_ONCE ;
2311 }
f4fc7782 2312
d3a7d8c7 2313 }
4438c4b7 2314 }
971a9dd3 2315 }
79072805 2316 break;
2317 case '.':
3280af22 2318 if (PL_localizing) {
2319 if (PL_localizing == 1)
7766f137 2320 SAVESPTR(PL_last_in_gv);
748a9306 2321 }
3280af22 2322 else if (SvOK(sv) && GvIO(PL_last_in_gv))
632db599 2323 IoLINES(GvIOp(PL_last_in_gv)) = SvIV(sv);
79072805 2324 break;
2325 case '^':
3280af22 2326 Safefree(IoTOP_NAME(GvIOp(PL_defoutgv)));
e1ec3a88 2327 s = IoTOP_NAME(GvIOp(PL_defoutgv)) = savesvpv(sv);
7a5fd60d 2328 IoTOP_GV(GvIOp(PL_defoutgv)) = gv_fetchsv(sv,TRUE, SVt_PVIO);
79072805 2329 break;
2330 case '~':
3280af22 2331 Safefree(IoFMT_NAME(GvIOp(PL_defoutgv)));
e1ec3a88 2332 s = IoFMT_NAME(GvIOp(PL_defoutgv)) = savesvpv(sv);
7a5fd60d 2333 IoFMT_GV(GvIOp(PL_defoutgv)) = gv_fetchsv(sv,TRUE, SVt_PVIO);
79072805 2334 break;
2335 case '=':
632db599 2336 IoPAGE_LEN(GvIOp(PL_defoutgv)) = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
79072805 2337 break;
2338 case '-':
632db599 2339 IoLINES_LEFT(GvIOp(PL_defoutgv)) = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
3280af22 2340 if (IoLINES_LEFT(GvIOp(PL_defoutgv)) < 0L)
2341 IoLINES_LEFT(GvIOp(PL_defoutgv)) = 0L;
79072805 2342 break;
2343 case '%':
632db599 2344 IoPAGE(GvIOp(PL_defoutgv)) = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
79072805 2345 break;
2346 case '|':
4b65379b 2347 {
8772537c 2348 IO * const io = GvIOp(PL_defoutgv);
720f287d 2349 if(!io)
2350 break;
4b65379b 2351 if ((SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) == 0)
2352 IoFLAGS(io) &= ~IOf_FLUSH;
2353 else {
2354 if (!(IoFLAGS(io) & IOf_FLUSH)) {
2355 PerlIO *ofp = IoOFP(io);
2356 if (ofp)
2357 (void)PerlIO_flush(ofp);
2358 IoFLAGS(io) |= IOf_FLUSH;
2359 }
2360 }
79072805 2361 }
2362 break;
79072805 2363 case '/':
3280af22 2364 SvREFCNT_dec(PL_rs);
8bfdd7d9 2365 PL_rs = newSVsv(sv);
79072805 2366 break;
2367 case '\\':
7889fe52 2368 if (PL_ors_sv)
2369 SvREFCNT_dec(PL_ors_sv);
009c130f 2370 if (SvOK(sv) || SvGMAGICAL(sv)) {
7889fe52 2371 PL_ors_sv = newSVsv(sv);
009c130f 2372 }
e3c19b7b 2373 else {
7889fe52 2374 PL_ors_sv = Nullsv;
e3c19b7b 2375 }
79072805 2376 break;
2377 case ',':
7889fe52 2378 if (PL_ofs_sv)
2379 SvREFCNT_dec(PL_ofs_sv);
2380 if (SvOK(sv) || SvGMAGICAL(sv)) {
2381 PL_ofs_sv = newSVsv(sv);
2382 }
2383 else {
2384 PL_ofs_sv = Nullsv;
2385 }
79072805 2386 break;
79072805 2387 case '[':
3280af22 2388 PL_compiling.cop_arybase = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
79072805 2389 break;
2390 case '?':
ff0cee69 2391#ifdef COMPLEX_STATUS
6b88bc9c 2392 if (PL_localizing == 2) {
2393 PL_statusvalue = LvTARGOFF(sv);
2394 PL_statusvalue_vms = LvTARGLEN(sv);
ff0cee69 2395 }
2396 else
2397#endif
2398#ifdef VMSISH_STATUS
2399 if (VMSISH_STATUS)
fb38d079 2400 STATUS_NATIVE_CHILD_SET((U32)SvIV(sv));
ff0cee69 2401 else
2402#endif
fb38d079 2403 STATUS_UNIX_EXIT_SET(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
79072805 2404 break;
2405 case '!':
93189314 2406 {
2407#ifdef VMS
2408# define PERL_VMS_BANG vaxc$errno
2409#else
2410# define PERL_VMS_BANG 0
2411#endif
91487cfc 2412 SETERRNO(SvIOK(sv) ? SvIVX(sv) : SvOK(sv) ? sv_2iv(sv) : 0,
93189314 2413 (SvIV(sv) == EVMSERR) ? 4 : PERL_VMS_BANG);
2414 }
79072805 2415 break;
2416 case '<':
3280af22 2417 PL_uid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2418 if (PL_delaymagic) {
2419 PL_delaymagic |= DM_RUID;
79072805 2420 break; /* don't do magic till later */
2421 }
2422#ifdef HAS_SETRUID
b28d0864 2423 (void)setruid((Uid_t)PL_uid);
79072805 2424#else
2425#ifdef HAS_SETREUID
3280af22 2426 (void)setreuid((Uid_t)PL_uid, (Uid_t)-1);
748a9306 2427#else
85e6fe83 2428#ifdef HAS_SETRESUID
b28d0864 2429 (void)setresuid((Uid_t)PL_uid, (Uid_t)-1, (Uid_t)-1);
79072805 2430#else
75870ed3 2431 if (PL_uid == PL_euid) { /* special case $< = $> */
2432#ifdef PERL_DARWIN
2433 /* workaround for Darwin's setuid peculiarity, cf [perl #24122] */
2434 if (PL_uid != 0 && PerlProc_getuid() == 0)
2435 (void)PerlProc_setuid(0);
2436#endif
b28d0864 2437 (void)PerlProc_setuid(PL_uid);
75870ed3 2438 } else {
d8eceb89 2439 PL_uid = PerlProc_getuid();
cea2e8a9 2440 Perl_croak(aTHX_ "setruid() not implemented");
a0d0e21e 2441 }
79072805 2442#endif
2443#endif
85e6fe83 2444#endif
d8eceb89 2445 PL_uid = PerlProc_getuid();
3280af22 2446 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
79072805 2447 break;
2448 case '>':
3280af22 2449 PL_euid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2450 if (PL_delaymagic) {
2451 PL_delaymagic |= DM_EUID;
79072805 2452 break; /* don't do magic till later */
2453 }
2454#ifdef HAS_SETEUID
3280af22 2455 (void)seteuid((Uid_t)PL_euid);
79072805 2456#else
2457#ifdef HAS_SETREUID
b28d0864 2458 (void)setreuid((Uid_t)-1, (Uid_t)PL_euid);
85e6fe83 2459#else
2460#ifdef HAS_SETRESUID
6b88bc9c 2461 (void)setresuid((Uid_t)-1, (Uid_t)PL_euid, (Uid_t)-1);
79072805 2462#else
b28d0864 2463 if (PL_euid == PL_uid) /* special case $> = $< */
2464 PerlProc_setuid(PL_euid);
a0d0e21e 2465 else {
e8ee3774 2466 PL_euid = PerlProc_geteuid();
cea2e8a9 2467 Perl_croak(aTHX_ "seteuid() not implemented");
a0d0e21e 2468 }
79072805 2469#endif
2470#endif
85e6fe83 2471#endif
d8eceb89 2472 PL_euid = PerlProc_geteuid();
3280af22 2473 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
79072805 2474 break;
2475 case '(':
3280af22 2476 PL_gid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2477 if (PL_delaymagic) {
2478 PL_delaymagic |= DM_RGID;
79072805 2479 break; /* don't do magic till later */
2480 }
2481#ifdef HAS_SETRGID
b28d0864 2482 (void)setrgid((Gid_t)PL_gid);
79072805 2483#else
2484#ifdef HAS_SETREGID
3280af22 2485 (void)setregid((Gid_t)PL_gid, (Gid_t)-1);
85e6fe83 2486#else
2487#ifdef HAS_SETRESGID
b28d0864 2488 (void)setresgid((Gid_t)PL_gid, (Gid_t)-1, (Gid_t) 1);
79072805 2489#else
b28d0864 2490 if (PL_gid == PL_egid) /* special case $( = $) */
2491 (void)PerlProc_setgid(PL_gid);
748a9306 2492 else {
d8eceb89 2493 PL_gid = PerlProc_getgid();
cea2e8a9 2494 Perl_croak(aTHX_ "setrgid() not implemented");
748a9306 2495 }
79072805 2496#endif
2497#endif
85e6fe83 2498#endif
d8eceb89 2499 PL_gid = PerlProc_getgid();
3280af22 2500 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
79072805 2501 break;
2502 case ')':
5cd24f17 2503#ifdef HAS_SETGROUPS
2504 {
b83604b4 2505 const char *p = SvPV_const(sv, len);
5cd24f17 2506 Groups_t gary[NGROUPS];
2507
5cd24f17 2508 while (isSPACE(*p))
2509 ++p;
2d4389e4 2510 PL_egid = Atol(p);
5cd24f17 2511 for (i = 0; i < NGROUPS; ++i) {
2512 while (*p && !isSPACE(*p))
2513 ++p;
2514 while (isSPACE(*p))
2515 ++p;
2516 if (!*p)
2517 break;
2d4389e4 2518 gary[i] = Atol(p);
5cd24f17 2519 }
8cc95fdb 2520 if (i)
2521 (void)setgroups(i, gary);
5cd24f17 2522 }
2523#else /* HAS_SETGROUPS */
b28d0864 2524 PL_egid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
5cd24f17 2525#endif /* HAS_SETGROUPS */
3280af22 2526 if (PL_delaymagic) {
2527 PL_delaymagic |= DM_EGID;
79072805 2528 break; /* don't do magic till later */
2529 }
2530#ifdef HAS_SETEGID
3280af22 2531 (void)setegid((Gid_t)PL_egid);
79072805 2532#else
2533#ifdef HAS_SETREGID
b28d0864 2534 (void)setregid((Gid_t)-1, (Gid_t)PL_egid);
85e6fe83 2535#else
2536#ifdef HAS_SETRESGID
b28d0864 2537 (void)setresgid((Gid_t)-1, (Gid_t)PL_egid, (Gid_t)-1);
79072805 2538#else
b28d0864 2539 if (PL_egid == PL_gid) /* special case $) = $( */
2540 (void)PerlProc_setgid(PL_egid);
748a9306 2541 else {
d8eceb89 2542 PL_egid = PerlProc_getegid();
cea2e8a9 2543 Perl_croak(aTHX_ "setegid() not implemented");
748a9306 2544 }
79072805 2545#endif
2546#endif
85e6fe83 2547#endif
d8eceb89 2548 PL_egid = PerlProc_getegid();
3280af22 2549 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
79072805 2550 break;
2551 case ':':
2d8e6c8d 2552 PL_chopset = SvPV_force(sv,len);
79072805 2553 break;
cd39f2b6 2554#ifndef MACOS_TRADITIONAL
79072805 2555 case '0':
e2975953 2556 LOCK_DOLLARZERO_MUTEX;
4bc88a62 2557#ifdef HAS_SETPROCTITLE
2558 /* The BSDs don't show the argv[] in ps(1) output, they
2559 * show a string from the process struct and provide
2560 * the setproctitle() routine to manipulate that. */
2561 {
b83604b4 2562 s = SvPV_const(sv, len);
98b76f99 2563# if __FreeBSD_version > 410001
9aad2c0e 2564 /* The leading "-" removes the "perl: " prefix,
4bc88a62 2565 * but not the "(perl) suffix from the ps(1)
2566 * output, because that's what ps(1) shows if the
2567 * argv[] is modified. */
6f2ad931 2568 setproctitle("-%s", s);
9aad2c0e 2569# else /* old FreeBSDs, NetBSD, OpenBSD, anyBSD */
4bc88a62 2570 /* This doesn't really work if you assume that
2571 * $0 = 'foobar'; will wipe out 'perl' from the $0
2572 * because in ps(1) output the result will be like
2573 * sprintf("perl: %s (perl)", s)
2574 * I guess this is a security feature:
2575 * one (a user process) cannot get rid of the original name.
2576 * --jhi */
2577 setproctitle("%s", s);
2578# endif
2579 }
2580#endif
17aa7f3d 2581#if defined(__hpux) && defined(PSTAT_SETCMD)
2582 {
2583 union pstun un;
b83604b4 2584 s = SvPV_const(sv, len);
6867be6d 2585 un.pst_command = (char *)s;
17aa7f3d 2586 pstat(PSTAT_SETCMD, un, len, 0, 0);
2587 }
2588#endif
3cb9023d 2589 /* PL_origalen is set in perl_parse(). */
a0d0e21e 2590 s = SvPV_force(sv,len);
6f698202 2591 if (len >= (STRLEN)PL_origalen-1) {
2592 /* Longer than original, will be truncated. We assume that
2593 * PL_origalen bytes are available. */
2594 Copy(s, PL_origargv[0], PL_origalen-1, char);
79072805 2595 }
2596 else {
54bfe034 2597 /* Shorter than original, will be padded. */
2598 Copy(s, PL_origargv[0], len, char);
2599 PL_origargv[0][len] = 0;
2600 memset(PL_origargv[0] + len + 1,
2601 /* Is the space counterintuitive? Yes.
2602 * (You were expecting \0?)
3cb9023d 2603 * Does it work? Seems to. (In Linux 2.4.20 at least.)
54bfe034 2604 * --jhi */
2605 (int)' ',
2606 PL_origalen - len - 1);
79072805 2607 }
ad7eccf4 2608 PL_origargv[0][PL_origalen-1] = 0;
2609 for (i = 1; i < PL_origargc; i++)
2610 PL_origargv[i] = 0;
e2975953 2611 UNLOCK_DOLLARZERO_MUTEX;
79072805 2612 break;
cd39f2b6 2613#endif
79072805 2614 }
2615 return 0;
2616}
2617
2618I32
35a4481c 2619Perl_whichsig(pTHX_ const char *sig)
79072805 2620{
aadb217d 2621 register char* const* sigv;
79072805 2622
aadb217d 2623 for (sigv = (char* const*)PL_sig_name; *sigv; sigv++)
79072805 2624 if (strEQ(sig,*sigv))
aadb217d 2625 return PL_sig_num[sigv - (char* const*)PL_sig_name];
79072805 2626#ifdef SIGCLD
2627 if (strEQ(sig,"CHLD"))
2628 return SIGCLD;
2629#endif
2630#ifdef SIGCHLD
2631 if (strEQ(sig,"CLD"))
2632 return SIGCHLD;
2633#endif
7f1236c0 2634 return -1;
79072805 2635}
2636
ecfc5424 2637Signal_t
1e82f5a6 2638#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
8aad04aa 2639Perl_sighandler(int sig, ...)
1e82f5a6 2640#else
2641Perl_sighandler(int sig)
2642#endif
79072805 2643{
1018e26f 2644#ifdef PERL_GET_SIG_CONTEXT
2645 dTHXa(PERL_GET_SIG_CONTEXT);
71d280e3 2646#else
cea2e8a9 2647 dTHX;
71d280e3 2648#endif
79072805 2649 dSP;
00d579c5 2650 GV *gv = Nullgv;
8772537c 2651 SV *sv = Nullsv;
2652 SV * const tSv = PL_Sv;
00d579c5 2653 CV *cv = Nullcv;
533c011a 2654 OP *myop = PL_op;
84902520 2655 U32 flags = 0;
8772537c 2656 XPV * const tXpv = PL_Xpv;
71d280e3 2657
3280af22 2658 if (PL_savestack_ix + 15 <= PL_savestack_max)
84902520 2659 flags |= 1;
3280af22 2660 if (PL_markstack_ptr < PL_markstack_max - 2)
84902520 2661 flags |= 4;
3280af22 2662 if (PL_scopestack_ix < PL_scopestack_max - 3)
84902520 2663 flags |= 16;
2664
727405f8 2665 if (!PL_psig_ptr[sig]) {
99ef548b 2666 PerlIO_printf(Perl_error_log, "Signal SIG%s received, but no signal handler set.\n",
727405f8 2667 PL_sig_name[sig]);
2668 exit(sig);
2669 }
ff0cee69 2670
84902520 2671 /* Max number of items pushed there is 3*n or 4. We cannot fix
2672 infinity, so we fix 4 (in fact 5): */
2673 if (flags & 1) {
3280af22 2674 PL_savestack_ix += 5; /* Protect save in progress. */
8772537c 2675 SAVEDESTRUCTOR_X(S_unwind_handler_stack, (void*)&flags);
84902520 2676 }
ac27b0f5 2677 if (flags & 4)
3280af22 2678 PL_markstack_ptr++; /* Protect mark. */
84902520 2679 if (flags & 16)
3280af22 2680 PL_scopestack_ix += 1;
84902520 2681 /* sv_2cv is too complicated, try a simpler variant first: */
ac27b0f5 2682 if (!SvROK(PL_psig_ptr[sig]) || !(cv = (CV*)SvRV(PL_psig_ptr[sig]))
8772537c 2683 || SvTYPE(cv) != SVt_PVCV) {
2684 HV *st;
22c35a8c 2685 cv = sv_2cv(PL_psig_ptr[sig],&st,&gv,TRUE);
8772537c 2686 }
84902520 2687
a0d0e21e 2688 if (!cv || !CvROOT(cv)) {
599cee73 2689 if (ckWARN(WARN_SIGNAL))
9014280d 2690 Perl_warner(aTHX_ packWARN(WARN_SIGNAL), "SIG%s handler \"%s\" not defined.\n",
22c35a8c 2691 PL_sig_name[sig], (gv ? GvENAME(gv)
00d579c5 2692 : ((cv && CvGV(cv))
2693 ? GvENAME(CvGV(cv))
2694 : "__ANON__")));
2695 goto cleanup;
79072805 2696 }
2697
22c35a8c 2698 if(PL_psig_name[sig]) {
2699 sv = SvREFCNT_inc(PL_psig_name[sig]);
84902520 2700 flags |= 64;
df3728a2 2701#if !defined(PERL_IMPLICIT_CONTEXT)
27da23d5 2702 PL_sig_sv = sv;
df3728a2 2703#endif
84902520 2704 } else {
ff0cee69 2705 sv = sv_newmortal();
22c35a8c 2706 sv_setpv(sv,PL_sig_name[sig]);
88e89b8a 2707 }
e336de0d 2708
e788e7d3 2709 PUSHSTACKi(PERLSI_SIGNAL);
924508f0 2710 PUSHMARK(SP);
79072805 2711 PUSHs(sv);
8aad04aa 2712#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
2713 {
2714 struct sigaction oact;
2715
2716 if (sigaction(sig, 0, &oact) == 0 && oact.sa_flags & SA_SIGINFO) {
2717 siginfo_t *sip;
2718 va_list args;
2719
2720 va_start(args, sig);
2721 sip = (siginfo_t*)va_arg(args, siginfo_t*);
2722 if (sip) {
2723 HV *sih = newHV();
2724 SV *rv = newRV_noinc((SV*)sih);
2725 /* The siginfo fields signo, code, errno, pid, uid,
2726 * addr, status, and band are defined by POSIX/SUSv3. */
2727 hv_store(sih, "signo", 5, newSViv(sip->si_signo), 0);
2728 hv_store(sih, "code", 4, newSViv(sip->si_code), 0);
79dec0f4 2729#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 2730 hv_store(sih, "errno", 5, newSViv(sip->si_errno), 0);
79dec0f4 2731 hv_store(sih, "status", 6, newSViv(sip->si_status), 0);
8aad04aa 2732 hv_store(sih, "uid", 3, newSViv(sip->si_uid), 0);
2733 hv_store(sih, "pid", 3, newSViv(sip->si_pid), 0);
2734 hv_store(sih, "addr", 4, newSVuv(PTR2UV(sip->si_addr)), 0);
8aad04aa 2735 hv_store(sih, "band", 4, newSViv(sip->si_band), 0);
79dec0f4 2736#endif
8aad04aa 2737 EXTEND(SP, 2);
2738 PUSHs((SV*)rv);
2739 PUSHs(newSVpv((void*)sip, sizeof(*sip)));
2740 }
2741 }
2742 }
2743#endif
79072805 2744 PUTBACK;
a0d0e21e 2745
1b266415 2746 call_sv((SV*)cv, G_DISCARD|G_EVAL);
79072805 2747
d3acc0f7 2748 POPSTACK;
1b266415 2749 if (SvTRUE(ERRSV)) {
1d615522 2750#ifndef PERL_MICRO
983dbef6 2751#ifdef HAS_SIGPROCMASK
1b266415 2752 /* Handler "died", for example to get out of a restart-able read().
2753 * Before we re-do that on its behalf re-enable the signal which was
2754 * blocked by the system when we entered.
2755 */
2756 sigset_t set;
2757 sigemptyset(&set);
2758 sigaddset(&set,sig);
2759 sigprocmask(SIG_UNBLOCK, &set, NULL);
2760#else
2761 /* Not clear if this will work */
2762 (void)rsignal(sig, SIG_IGN);
5c1546dc 2763 (void)rsignal(sig, PL_csighandlerp);
1b266415 2764#endif
1d615522 2765#endif /* !PERL_MICRO */
c3bdd826 2766 Perl_die(aTHX_ Nullch);
1b266415 2767 }
00d579c5 2768cleanup:
84902520 2769 if (flags & 1)
3280af22 2770 PL_savestack_ix -= 8; /* Unprotect save in progress. */
ac27b0f5 2771 if (flags & 4)
3280af22 2772 PL_markstack_ptr--;
84902520 2773 if (flags & 16)
3280af22 2774 PL_scopestack_ix -= 1;
84902520 2775 if (flags & 64)
2776 SvREFCNT_dec(sv);
533c011a 2777 PL_op = myop; /* Apparently not needed... */
ac27b0f5 2778
3280af22 2779 PL_Sv = tSv; /* Restore global temporaries. */
2780 PL_Xpv = tXpv;
53bb94e2 2781 return;
79072805 2782}
4e35701f 2783
2784
51371543 2785static void
8772537c 2786S_restore_magic(pTHX_ const void *p)
51371543 2787{
8772537c 2788 MGS* const mgs = SSPTR(PTR2IV(p), MGS*);
2789 SV* const sv = mgs->mgs_sv;
51371543 2790
2791 if (!sv)
2792 return;
2793
2794 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
2795 {
f8c7b90f 2796#ifdef PERL_OLD_COPY_ON_WRITE
f9701176 2797 /* While magic was saved (and off) sv_setsv may well have seen
2798 this SV as a prime candidate for COW. */
2799 if (SvIsCOW(sv))
e424a81e 2800 sv_force_normal_flags(sv, 0);
f9701176 2801#endif
2802
51371543 2803 if (mgs->mgs_flags)
2804 SvFLAGS(sv) |= mgs->mgs_flags;
2805 else
2806 mg_magical(sv);
2b77b520 2807 if (SvGMAGICAL(sv)) {
2808 /* downgrade public flags to private,
2809 and discard any other private flags */
2810
2811 U32 public = SvFLAGS(sv) & (SVf_IOK|SVf_NOK|SVf_POK);
2812 if (public) {
2813 SvFLAGS(sv) &= ~( public | SVp_IOK|SVp_NOK|SVp_POK );
2814 SvFLAGS(sv) |= ( public << PRIVSHIFT );
2815 }
2816 }
51371543 2817 }
2818
2819 mgs->mgs_sv = NULL; /* mark the MGS structure as restored */
2820
2821 /* If we're still on top of the stack, pop us off. (That condition
2822 * will be satisfied if restore_magic was called explicitly, but *not*
2823 * if it's being called via leave_scope.)
2824 * The reason for doing this is that otherwise, things like sv_2cv()
2825 * may leave alloc gunk on the savestack, and some code
2826 * (e.g. sighandler) doesn't expect that...
2827 */
2828 if (PL_savestack_ix == mgs->mgs_ss_ix)
2829 {
2830 I32 popval = SSPOPINT;
c76ac1ee 2831 assert(popval == SAVEt_DESTRUCTOR_X);
51371543 2832 PL_savestack_ix -= 2;
2833 popval = SSPOPINT;
2834 assert(popval == SAVEt_ALLOC);
2835 popval = SSPOPINT;
2836 PL_savestack_ix -= popval;
2837 }
2838
2839}
2840
2841static void
8772537c 2842S_unwind_handler_stack(pTHX_ const void *p)
51371543 2843{
27da23d5 2844 dVAR;
e1ec3a88 2845 const U32 flags = *(const U32*)p;
51371543 2846
2847 if (flags & 1)
2848 PL_savestack_ix -= 5; /* Unprotect save in progress. */
2849 /* cxstack_ix-- Not needed, die already unwound it. */
df3728a2 2850#if !defined(PERL_IMPLICIT_CONTEXT)
51371543 2851 if (flags & 64)
27da23d5 2852 SvREFCNT_dec(PL_sig_sv);
df3728a2 2853#endif
51371543 2854}
1018e26f 2855
66610fdd 2856/*
2857 * Local variables:
2858 * c-indentation-style: bsd
2859 * c-basic-offset: 4
2860 * indent-tabs-mode: t
2861 * End:
2862 *
37442d52 2863 * ex: set ts=8 sts=4 sw=4 noet:
2864 */