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