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