perl 5.003_03: hints/sco.sh
[p5sagit/p5-mst-13.2.git] / mg.c
CommitLineData
a0d0e21e 1/* mg.c
79072805 2 *
a0d0e21e 3 * Copyright (c) 1991-1994, Larry Wall
79072805 4 *
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
7 *
a0d0e21e 8 */
9
10/*
11 * "Sam sat on the ground and put his head in his hands. 'I wish I had never
12 * come here, and I don't want to see no more magic,' he said, and fell silent."
79072805 13 */
14
15#include "EXTERN.h"
16#include "perl.h"
17
a0d0e21e 18/* Omit -- it causes too much grief on mixed systems.
19#ifdef I_UNISTD
20# include <unistd.h>
21#endif
22*/
23
c07a80fd 24/*
25 * Use the "DESTRUCTOR" scope cleanup to reinstate magic.
26 */
27
28struct magic_state {
29 SV* mgs_sv;
30 U32 mgs_flags;
31};
32typedef struct magic_state MGS;
33
34static void restore_magic _((void *p));
35
36static MGS *
37save_magic(sv)
38SV* sv;
39{
40 MGS* mgs;
41
42 assert(SvMAGICAL(sv));
43
44 mgs = (MGS*)safemalloc(sizeof(MGS));
45 mgs->mgs_sv = sv;
46 mgs->mgs_flags = SvMAGICAL(sv) | SvREADONLY(sv);
47 SAVEDESTRUCTOR(restore_magic, mgs);
48
49 SvMAGICAL_off(sv);
50 SvREADONLY_off(sv);
51 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
52
53 return mgs;
54}
55
56static void
57restore_magic(p)
58void* p;
59{
60 MGS *mgs = (MGS*)p;
61 SV* sv = mgs->mgs_sv;
62
63 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
64 {
65 if (mgs->mgs_flags)
66 SvFLAGS(sv) |= mgs->mgs_flags;
67 else
68 mg_magical(sv);
69 if (SvGMAGICAL(sv))
70 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
71 }
72
88e89b8a 73 safefree((void *)mgs);
c07a80fd 74}
75
8e07c86e 76
8990e307 77void
78mg_magical(sv)
79SV* sv;
80{
81 MAGIC* mg;
82 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
83 MGVTBL* vtbl = mg->mg_virtual;
84 if (vtbl) {
a0d0e21e 85 if (vtbl->svt_get && !(mg->mg_flags & MGf_GSKIP))
8990e307 86 SvGMAGICAL_on(sv);
87 if (vtbl->svt_set)
88 SvSMAGICAL_on(sv);
89 if (!(SvFLAGS(sv) & (SVs_GMG|SVs_SMG)) || vtbl->svt_clear)
90 SvRMAGICAL_on(sv);
91 }
92 }
93}
94
79072805 95int
96mg_get(sv)
97SV* sv;
98{
c07a80fd 99 MGS* mgs;
79072805 100 MAGIC* mg;
c6496cc7 101 MAGIC** mgp;
760ac839 102 int mgp_valid = 0;
463ee0b2 103
c07a80fd 104 ENTER;
105 mgs = save_magic(sv);
463ee0b2 106
c6496cc7 107 mgp = &SvMAGIC(sv);
108 while ((mg = *mgp) != 0) {
79072805 109 MGVTBL* vtbl = mg->mg_virtual;
a0d0e21e 110 if (!(mg->mg_flags & MGf_GSKIP) && vtbl && vtbl->svt_get) {
79072805 111 (*vtbl->svt_get)(sv, mg);
c6496cc7 112 /* Ignore this magic if it's been deleted */
760ac839 113 if ((mg == (mgp_valid ? *mgp : SvMAGIC(sv))) && (mg->mg_flags & MGf_GSKIP))
c07a80fd 114 mgs->mgs_flags = 0;
a0d0e21e 115 }
c6496cc7 116 /* Advance to next magic (complicated by possible deletion) */
760ac839 117 if (mg == (mgp_valid ? *mgp : SvMAGIC(sv))) {
c6496cc7 118 mgp = &mg->mg_moremagic;
760ac839 119 mgp_valid = 1;
120 }
121 else
122 mgp = &SvMAGIC(sv); /* Re-establish pointer after sv_upgrade */
79072805 123 }
463ee0b2 124
c07a80fd 125 LEAVE;
79072805 126 return 0;
127}
128
129int
130mg_set(sv)
131SV* sv;
132{
c07a80fd 133 MGS* mgs;
79072805 134 MAGIC* mg;
463ee0b2 135 MAGIC* nextmg;
136
c07a80fd 137 ENTER;
138 mgs = save_magic(sv);
463ee0b2 139
140 for (mg = SvMAGIC(sv); mg; mg = nextmg) {
79072805 141 MGVTBL* vtbl = mg->mg_virtual;
463ee0b2 142 nextmg = mg->mg_moremagic; /* it may delete itself */
a0d0e21e 143 if (mg->mg_flags & MGf_GSKIP) {
144 mg->mg_flags &= ~MGf_GSKIP; /* setting requires another read */
c07a80fd 145 mgs->mgs_flags = 0;
a0d0e21e 146 }
79072805 147 if (vtbl && vtbl->svt_set)
148 (*vtbl->svt_set)(sv, mg);
149 }
463ee0b2 150
c07a80fd 151 LEAVE;
79072805 152 return 0;
153}
154
155U32
156mg_len(sv)
157SV* sv;
158{
159 MAGIC* mg;
748a9306 160 char *junk;
463ee0b2 161 STRLEN len;
463ee0b2 162
79072805 163 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
164 MGVTBL* vtbl = mg->mg_virtual;
85e6fe83 165 if (vtbl && vtbl->svt_len) {
c07a80fd 166 ENTER;
167 save_magic(sv);
a0d0e21e 168 /* omit MGf_GSKIP -- not changed here */
85e6fe83 169 len = (*vtbl->svt_len)(sv, mg);
c07a80fd 170 LEAVE;
85e6fe83 171 return len;
172 }
173 }
174
748a9306 175 junk = SvPV(sv, len);
463ee0b2 176 return len;
79072805 177}
178
179int
180mg_clear(sv)
181SV* sv;
182{
183 MAGIC* mg;
463ee0b2 184
c07a80fd 185 ENTER;
186 save_magic(sv);
463ee0b2 187
79072805 188 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
189 MGVTBL* vtbl = mg->mg_virtual;
a0d0e21e 190 /* omit GSKIP -- never set here */
191
79072805 192 if (vtbl && vtbl->svt_clear)
193 (*vtbl->svt_clear)(sv, mg);
194 }
463ee0b2 195
c07a80fd 196 LEAVE;
79072805 197 return 0;
198}
199
93a17b20 200MAGIC*
201mg_find(sv, type)
202SV* sv;
a0d0e21e 203int type;
93a17b20 204{
205 MAGIC* mg;
93a17b20 206 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
207 if (mg->mg_type == type)
208 return mg;
209 }
210 return 0;
211}
212
79072805 213int
463ee0b2 214mg_copy(sv, nsv, key, klen)
79072805 215SV* sv;
463ee0b2 216SV* nsv;
217char *key;
88e89b8a 218I32 klen;
79072805 219{
463ee0b2 220 int count = 0;
79072805 221 MAGIC* mg;
463ee0b2 222 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
223 if (isUPPER(mg->mg_type)) {
a0d0e21e 224 sv_magic(nsv, mg->mg_obj, toLOWER(mg->mg_type), key, klen);
463ee0b2 225 count++;
79072805 226 }
79072805 227 }
463ee0b2 228 return count;
79072805 229}
230
231int
463ee0b2 232mg_free(sv)
79072805 233SV* sv;
234{
235 MAGIC* mg;
236 MAGIC* moremagic;
237 for (mg = SvMAGIC(sv); mg; mg = moremagic) {
238 MGVTBL* vtbl = mg->mg_virtual;
239 moremagic = mg->mg_moremagic;
240 if (vtbl && vtbl->svt_free)
241 (*vtbl->svt_free)(sv, mg);
93a17b20 242 if (mg->mg_ptr && mg->mg_type != 'g')
88e89b8a 243 if (mg->mg_len >= 0)
244 Safefree(mg->mg_ptr);
245 else if (mg->mg_len == HEf_SVKEY)
246 SvREFCNT_dec((SV*)mg->mg_ptr);
85e6fe83 247 if (mg->mg_flags & MGf_REFCOUNTED)
8990e307 248 SvREFCNT_dec(mg->mg_obj);
79072805 249 Safefree(mg);
250 }
251 SvMAGIC(sv) = 0;
252 return 0;
253}
254
255#if !defined(NSIG) || defined(M_UNIX) || defined(M_XENIX)
256#include <signal.h>
257#endif
258
93a17b20 259U32
260magic_len(sv, mg)
261SV *sv;
262MAGIC *mg;
263{
264 register I32 paren;
265 register char *s;
266 register I32 i;
748a9306 267 char *t;
93a17b20 268
269 switch (*mg->mg_ptr) {
270 case '1': case '2': case '3': case '4':
271 case '5': case '6': case '7': case '8': case '9': case '&':
272 if (curpm) {
273 paren = atoi(mg->mg_ptr);
274 getparen:
275 if (curpm->op_pmregexp &&
276 paren <= curpm->op_pmregexp->nparens &&
748a9306 277 (s = curpm->op_pmregexp->startp[paren]) &&
278 (t = curpm->op_pmregexp->endp[paren]) ) {
279 i = t - s;
93a17b20 280 if (i >= 0)
281 return i;
93a17b20 282 }
93a17b20 283 }
748a9306 284 return 0;
93a17b20 285 break;
286 case '+':
287 if (curpm) {
288 paren = curpm->op_pmregexp->lastparen;
a0d0e21e 289 if (!paren)
290 return 0;
93a17b20 291 goto getparen;
292 }
748a9306 293 return 0;
93a17b20 294 break;
295 case '`':
296 if (curpm) {
297 if (curpm->op_pmregexp &&
298 (s = curpm->op_pmregexp->subbeg) ) {
299 i = curpm->op_pmregexp->startp[0] - s;
300 if (i >= 0)
301 return i;
93a17b20 302 }
93a17b20 303 }
748a9306 304 return 0;
93a17b20 305 case '\'':
306 if (curpm) {
307 if (curpm->op_pmregexp &&
308 (s = curpm->op_pmregexp->endp[0]) ) {
309 return (STRLEN) (curpm->op_pmregexp->subend - s);
310 }
93a17b20 311 }
748a9306 312 return 0;
93a17b20 313 case ',':
314 return (STRLEN)ofslen;
315 case '\\':
316 return (STRLEN)orslen;
317 }
318 magic_get(sv,mg);
319 if (!SvPOK(sv) && SvNIOK(sv))
463ee0b2 320 sv_2pv(sv, &na);
93a17b20 321 if (SvPOK(sv))
322 return SvCUR(sv);
323 return 0;
324}
325
79072805 326int
327magic_get(sv, mg)
328SV *sv;
329MAGIC *mg;
330{
331 register I32 paren;
332 register char *s;
333 register I32 i;
748a9306 334 char *t;
79072805 335
336 switch (*mg->mg_ptr) {
748a9306 337 case '\001': /* ^A */
338 sv_setsv(sv, bodytarget);
339 break;
79072805 340 case '\004': /* ^D */
341 sv_setiv(sv,(I32)(debug & 32767));
342 break;
28f23441 343 case '\005': /* ^E */
344#ifdef VMS
345 {
346# include <descrip.h>
347# include <starlet.h>
348 char msg[255];
349 $DESCRIPTOR(msgdsc,msg);
350 sv_setnv(sv,(double)vaxc$errno);
351 if (sys$getmsg(vaxc$errno,&msgdsc.dsc$w_length,&msgdsc,0,0) & 1)
352 sv_setpvn(sv,msgdsc.dsc$a_pointer,msgdsc.dsc$w_length);
353 else
354 sv_setpv(sv,"");
355 }
356#else
88e89b8a 357#ifdef OS2
358 sv_setnv(sv,(double)Perl_rc);
359 sv_setpv(sv, os2error(Perl_rc));
360#else
28f23441 361 sv_setnv(sv,(double)errno);
362 sv_setpv(sv, errno ? Strerror(errno) : "");
363#endif
88e89b8a 364#endif
28f23441 365 SvNOK_on(sv); /* what a wonderful hack! */
366 break;
79072805 367 case '\006': /* ^F */
368 sv_setiv(sv,(I32)maxsysfd);
369 break;
a0d0e21e 370 case '\010': /* ^H */
371 sv_setiv(sv,(I32)hints);
372 break;
79072805 373 case '\t': /* ^I */
374 if (inplace)
375 sv_setpv(sv, inplace);
376 else
377 sv_setsv(sv,&sv_undef);
378 break;
28f23441 379 case '\017': /* ^O */
380 sv_setpv(sv,osname);
381 break;
79072805 382 case '\020': /* ^P */
383 sv_setiv(sv,(I32)perldb);
384 break;
385 case '\024': /* ^T */
88e89b8a 386#ifdef BIG_TIME
387 sv_setnv(sv,basetime);
388#else
79072805 389 sv_setiv(sv,(I32)basetime);
88e89b8a 390#endif
79072805 391 break;
392 case '\027': /* ^W */
393 sv_setiv(sv,(I32)dowarn);
394 break;
395 case '1': case '2': case '3': case '4':
396 case '5': case '6': case '7': case '8': case '9': case '&':
397 if (curpm) {
88e89b8a 398 paren = atoi(GvENAME((GV*)mg->mg_obj));
79072805 399 getparen:
400 if (curpm->op_pmregexp &&
401 paren <= curpm->op_pmregexp->nparens &&
a0d0e21e 402 (s = curpm->op_pmregexp->startp[paren]) &&
748a9306 403 (t = curpm->op_pmregexp->endp[paren]) ) {
404 i = t - s;
405 if (i >= 0) {
406 MAGIC *tmg;
79072805 407 sv_setpvn(sv,s,i);
748a9306 408 if (tainting && (tmg = mg_find(sv,'t')))
409 tmg->mg_len = 0; /* guarantee $1 untainted */
410 break;
411 }
79072805 412 }
79072805 413 }
748a9306 414 sv_setsv(sv,&sv_undef);
79072805 415 break;
416 case '+':
417 if (curpm) {
418 paren = curpm->op_pmregexp->lastparen;
a0d0e21e 419 if (paren)
420 goto getparen;
79072805 421 }
748a9306 422 sv_setsv(sv,&sv_undef);
79072805 423 break;
424 case '`':
425 if (curpm) {
426 if (curpm->op_pmregexp &&
427 (s = curpm->op_pmregexp->subbeg) ) {
428 i = curpm->op_pmregexp->startp[0] - s;
748a9306 429 if (i >= 0) {
79072805 430 sv_setpvn(sv,s,i);
748a9306 431 break;
432 }
79072805 433 }
79072805 434 }
748a9306 435 sv_setsv(sv,&sv_undef);
79072805 436 break;
437 case '\'':
438 if (curpm) {
439 if (curpm->op_pmregexp &&
440 (s = curpm->op_pmregexp->endp[0]) ) {
441 sv_setpvn(sv,s, curpm->op_pmregexp->subend - s);
748a9306 442 break;
79072805 443 }
79072805 444 }
748a9306 445 sv_setsv(sv,&sv_undef);
79072805 446 break;
447 case '.':
448#ifndef lint
a0d0e21e 449 if (GvIO(last_in_gv)) {
8990e307 450 sv_setiv(sv,(I32)IoLINES(GvIO(last_in_gv)));
79072805 451 }
452#endif
453 break;
454 case '?':
455 sv_setiv(sv,(I32)statusvalue);
456 break;
457 case '^':
a0d0e21e 458 s = IoTOP_NAME(GvIOp(defoutgv));
79072805 459 if (s)
460 sv_setpv(sv,s);
461 else {
462 sv_setpv(sv,GvENAME(defoutgv));
463 sv_catpv(sv,"_TOP");
464 }
465 break;
466 case '~':
a0d0e21e 467 s = IoFMT_NAME(GvIOp(defoutgv));
79072805 468 if (!s)
469 s = GvENAME(defoutgv);
470 sv_setpv(sv,s);
471 break;
472#ifndef lint
473 case '=':
a0d0e21e 474 sv_setiv(sv,(I32)IoPAGE_LEN(GvIOp(defoutgv)));
79072805 475 break;
476 case '-':
a0d0e21e 477 sv_setiv(sv,(I32)IoLINES_LEFT(GvIOp(defoutgv)));
79072805 478 break;
479 case '%':
a0d0e21e 480 sv_setiv(sv,(I32)IoPAGE(GvIOp(defoutgv)));
79072805 481 break;
482#endif
483 case ':':
484 break;
485 case '/':
486 break;
487 case '[':
a0d0e21e 488 sv_setiv(sv,(I32)curcop->cop_arybase);
79072805 489 break;
490 case '|':
a0d0e21e 491 sv_setiv(sv, (IoFLAGS(GvIOp(defoutgv)) & IOf_FLUSH) != 0 );
79072805 492 break;
493 case ',':
494 sv_setpvn(sv,ofs,ofslen);
495 break;
496 case '\\':
497 sv_setpvn(sv,ors,orslen);
498 break;
499 case '#':
500 sv_setpv(sv,ofmt);
501 break;
502 case '!':
a5f75d66 503#ifdef VMS
504 sv_setnv(sv,(double)((errno == EVMSERR) ? vaxc$errno : errno));
88e89b8a 505 sv_setpv(sv, errno ? Strerror(errno) : "");
a5f75d66 506#else
88e89b8a 507 {
508 int saveerrno = errno;
79072805 509 sv_setnv(sv,(double)errno);
88e89b8a 510#ifdef OS2
511 if (errno == errno_isOS2) sv_setpv(sv, os2error(Perl_rc));
512 else
a5f75d66 513#endif
2304df62 514 sv_setpv(sv, errno ? Strerror(errno) : "");
88e89b8a 515 errno = saveerrno;
516 }
517#endif
79072805 518 SvNOK_on(sv); /* what a wonderful hack! */
519 break;
520 case '<':
521 sv_setiv(sv,(I32)uid);
522 break;
523 case '>':
524 sv_setiv(sv,(I32)euid);
525 break;
526 case '(':
527 s = buf;
528 (void)sprintf(s,"%d",(int)gid);
529 goto add_groups;
530 case ')':
531 s = buf;
532 (void)sprintf(s,"%d",(int)egid);
533 add_groups:
534 while (*s) s++;
535#ifdef HAS_GETGROUPS
536#ifndef NGROUPS
537#define NGROUPS 32
538#endif
539 {
a0d0e21e 540 Groups_t gary[NGROUPS];
79072805 541
542 i = getgroups(NGROUPS,gary);
543 while (--i >= 0) {
544 (void)sprintf(s," %ld", (long)gary[i]);
545 while (*s) s++;
546 }
547 }
548#endif
549 sv_setpv(sv,buf);
550 break;
551 case '*':
552 break;
553 case '0':
554 break;
555 }
a0d0e21e 556 return 0;
79072805 557}
558
559int
560magic_getuvar(sv, mg)
561SV *sv;
562MAGIC *mg;
563{
564 struct ufuncs *uf = (struct ufuncs *)mg->mg_ptr;
565
566 if (uf && uf->uf_val)
567 (*uf->uf_val)(uf->uf_index, sv);
568 return 0;
569}
570
571int
572magic_setenv(sv,mg)
573SV* sv;
574MAGIC* mg;
575{
576 register char *s;
88e89b8a 577 char *ptr;
a0d0e21e 578 STRLEN len;
579 I32 i;
580 s = SvPV(sv,len);
88e89b8a 581 ptr = (mg->mg_len == HEf_SVKEY) ? SvPV((SV*)mg->mg_ptr, na) : mg->mg_ptr;
582 my_setenv(ptr, s);
a0d0e21e 583#ifdef DYNAMIC_ENV_FETCH
584 /* We just undefd an environment var. Is a replacement */
585 /* waiting in the wings? */
586 if (!len) {
88e89b8a 587 HE *envhe;
588 if (envhe = hv_fetch_ent(GvHVn(envgv),HeSVKEY((HE*)(mg->mg_ptr)),FALSE,0))
589 s = SvPV(HeVAL(envhe),len);
a0d0e21e 590 }
591#endif
79072805 592 /* And you'll never guess what the dog had */
593 /* in its mouth... */
463ee0b2 594 if (tainting) {
88e89b8a 595 if (s && strEQ(ptr,"PATH")) {
a0d0e21e 596 char *strend = s + len;
463ee0b2 597
598 while (s < strend) {
599 s = cpytill(tokenbuf,s,strend,':',&i);
600 s++;
601 if (*tokenbuf != '/'
a0d0e21e 602 || (Stat(tokenbuf,&statbuf) && (statbuf.st_mode & 2)) )
8990e307 603 MgTAINTEDDIR_on(mg);
463ee0b2 604 }
79072805 605 }
606 }
79072805 607 return 0;
608}
609
610int
85e6fe83 611magic_clearenv(sv,mg)
612SV* sv;
613MAGIC* mg;
614{
88e89b8a 615 my_setenv(((mg->mg_len == HEf_SVKEY) ?
616 SvPV((SV*)mg->mg_ptr, na) : mg->mg_ptr),Nullch);
85e6fe83 617 return 0;
618}
619
3d37d572 620#ifdef HAS_SIGACTION
621/* set up reliable signal() clone */
622
623typedef void (*Sigfunc) _((int));
624
625static
626Sigfunc rsignal(signo,handler)
627int signo;
628Sigfunc handler;
629{
630 struct sigaction act,oact;
631
632 act.sa_handler = handler;
633 sigemptyset(&act.sa_mask);
634 act.sa_flags = 0;
3d37d572 635#ifdef SA_RESTART
88e89b8a 636 act.sa_flags |= SA_RESTART; /* SVR4, 4.3+BSD */
3d37d572 637#endif
3d37d572 638 if (sigaction(signo, &act, &oact) < 0)
639 return(SIG_ERR);
640 else
641 return(oact.sa_handler);
642}
643
644#else
645
646/* ah well, so much for reliability */
647
648#define rsignal(x,y) signal(x,y)
649
650#endif
651
88e89b8a 652static sig_trapped;
653static
654Signal_t
655sig_trap(signo)
656int signo;
657{
658 sig_trapped++;
659}
660int
661magic_getsig(sv,mg)
662SV* sv;
663MAGIC* mg;
664{
665 I32 i;
666 /* Are we fetching a signal entry? */
667 i = whichsig(mg->mg_ptr);
668 if (i) {
669 if(psig_ptr[i])
670 sv_setsv(sv,psig_ptr[i]);
671 else {
760ac839 672 void (*origsig) _((int));
88e89b8a 673 /* get signal state without losing signals */
674 sig_trapped=0;
675 origsig = rsignal(i,sig_trap);
676 rsignal(i,origsig);
677 if(sig_trapped)
678 kill(getpid(),i);
679 /* cache state so we don't fetch it again */
680 if(origsig == SIG_IGN)
681 sv_setpv(sv,"IGNORE");
682 else
683 sv_setsv(sv,&sv_undef);
684 psig_ptr[i] = SvREFCNT_inc(sv);
685 SvTEMP_off(sv);
686 }
687 }
688 return 0;
689}
690int
691magic_clearsig(sv,mg)
692SV* sv;
693MAGIC* mg;
694{
695 I32 i;
696 /* Are we clearing a signal entry? */
697 i = whichsig(mg->mg_ptr);
698 if (i) {
699 if(psig_ptr[i]) {
700 SvREFCNT_dec(psig_ptr[i]);
701 psig_ptr[i]=0;
702 }
703 if(psig_name[i]) {
704 SvREFCNT_dec(psig_name[i]);
705 psig_name[i]=0;
706 }
707 }
708 return 0;
709}
3d37d572 710
85e6fe83 711int
79072805 712magic_setsig(sv,mg)
713SV* sv;
714MAGIC* mg;
715{
716 register char *s;
717 I32 i;
748a9306 718 SV** svp;
a0d0e21e 719
88e89b8a 720 s = (mg->mg_len == HEf_SVKEY) ? SvPV((SV*)mg->mg_ptr, na) : mg->mg_ptr;
748a9306 721 if (*s == '_') {
722 if (strEQ(s,"__DIE__"))
723 svp = &diehook;
724 else if (strEQ(s,"__WARN__"))
725 svp = &warnhook;
726 else if (strEQ(s,"__PARSE__"))
727 svp = &parsehook;
728 else
729 croak("No such hook: %s", s);
730 i = 0;
4633a7c4 731 if (*svp) {
732 SvREFCNT_dec(*svp);
733 *svp = 0;
734 }
748a9306 735 }
736 else {
737 i = whichsig(s); /* ...no, a brick */
738 if (!i) {
739 if (dowarn || strEQ(s,"ALARM"))
740 warn("No such signal: SIG%s", s);
741 return 0;
742 }
88e89b8a 743 if(psig_ptr[i])
744 SvREFCNT_dec(psig_ptr[i]);
745 psig_ptr[i] = SvREFCNT_inc(sv);
746 if(psig_name[i])
747 SvREFCNT_dec(psig_name[i]);
748 psig_name[i] = newSVpv(mg->mg_ptr,strlen(mg->mg_ptr));
749 SvTEMP_off(sv); /* Make sure it doesn't go away on us */
750 SvREADONLY_on(psig_name[i]);
748a9306 751 }
a0d0e21e 752 if (SvTYPE(sv) == SVt_PVGV || SvROK(sv)) {
748a9306 753 if (i)
3d37d572 754 (void)rsignal(i,sighandler);
748a9306 755 else
756 *svp = SvREFCNT_inc(sv);
a0d0e21e 757 return 0;
758 }
759 s = SvPV_force(sv,na);
748a9306 760 if (strEQ(s,"IGNORE")) {
761 if (i)
3d37d572 762 (void)rsignal(i,SIG_IGN);
748a9306 763 else
764 *svp = 0;
765 }
766 else if (strEQ(s,"DEFAULT") || !*s) {
767 if (i)
3d37d572 768 (void)rsignal(i,SIG_DFL);
748a9306 769 else
770 *svp = 0;
771 }
79072805 772 else {
760ac839 773 if(hints & HINT_STRICT_REFS)
774 die(no_symref,s,"a subroutine");
2304df62 775 if (!strchr(s,':') && !strchr(s,'\'')) {
776 sprintf(tokenbuf, "main::%s",s);
79072805 777 sv_setpv(sv,tokenbuf);
778 }
748a9306 779 if (i)
3d37d572 780 (void)rsignal(i,sighandler);
748a9306 781 else
782 *svp = SvREFCNT_inc(sv);
79072805 783 }
784 return 0;
785}
786
787int
463ee0b2 788magic_setisa(sv,mg)
79072805 789SV* sv;
790MAGIC* mg;
791{
463ee0b2 792 sub_generation++;
793 return 0;
794}
795
a0d0e21e 796#ifdef OVERLOAD
797
463ee0b2 798int
a0d0e21e 799magic_setamagic(sv,mg)
463ee0b2 800SV* sv;
801MAGIC* mg;
802{
a0d0e21e 803 /* HV_badAMAGIC_on(Sv_STASH(sv)); */
804 amagic_generation++;
463ee0b2 805
a0d0e21e 806 return 0;
807}
808#endif /* OVERLOAD */
463ee0b2 809
a0d0e21e 810static int
811magic_methpack(sv,mg,meth)
812SV* sv;
813MAGIC* mg;
814char *meth;
815{
816 dSP;
463ee0b2 817
a0d0e21e 818 ENTER;
819 SAVETMPS;
820 PUSHMARK(sp);
821 EXTEND(sp, 2);
822 PUSHs(mg->mg_obj);
88e89b8a 823 if (mg->mg_ptr) {
824 if (mg->mg_len >= 0)
825 PUSHs(sv_2mortal(newSVpv(mg->mg_ptr, mg->mg_len)));
826 else if (mg->mg_len == HEf_SVKEY)
827 PUSHs((SV*)mg->mg_ptr);
828 }
a0d0e21e 829 else if (mg->mg_type == 'p')
830 PUSHs(sv_2mortal(newSViv(mg->mg_len)));
463ee0b2 831 PUTBACK;
832
a0d0e21e 833 if (perl_call_method(meth, G_SCALAR))
834 sv_setsv(sv, *stack_sp--);
463ee0b2 835
a0d0e21e 836 FREETMPS;
837 LEAVE;
838 return 0;
839}
463ee0b2 840
a0d0e21e 841int
842magic_getpack(sv,mg)
843SV* sv;
844MAGIC* mg;
845{
846 magic_methpack(sv,mg,"FETCH");
847 if (mg->mg_ptr)
848 mg->mg_flags |= MGf_GSKIP;
463ee0b2 849 return 0;
850}
851
852int
853magic_setpack(sv,mg)
854SV* sv;
855MAGIC* mg;
856{
463ee0b2 857 dSP;
463ee0b2 858
a0d0e21e 859 PUSHMARK(sp);
860 EXTEND(sp, 3);
861 PUSHs(mg->mg_obj);
88e89b8a 862 if (mg->mg_ptr) {
863 if (mg->mg_len >= 0)
864 PUSHs(sv_2mortal(newSVpv(mg->mg_ptr, mg->mg_len)));
865 else if (mg->mg_len == HEf_SVKEY)
866 PUSHs((SV*)mg->mg_ptr);
867 }
a0d0e21e 868 else if (mg->mg_type == 'p')
869 PUSHs(sv_2mortal(newSViv(mg->mg_len)));
463ee0b2 870 PUSHs(sv);
871 PUTBACK;
872
a0d0e21e 873 perl_call_method("STORE", G_SCALAR|G_DISCARD);
463ee0b2 874
875 return 0;
876}
877
878int
879magic_clearpack(sv,mg)
880SV* sv;
881MAGIC* mg;
882{
a0d0e21e 883 return magic_methpack(sv,mg,"DELETE");
884}
463ee0b2 885
a0d0e21e 886int magic_wipepack(sv,mg)
887SV* sv;
888MAGIC* mg;
889{
890 dSP;
463ee0b2 891
a0d0e21e 892 PUSHMARK(sp);
893 XPUSHs(mg->mg_obj);
463ee0b2 894 PUTBACK;
463ee0b2 895
a0d0e21e 896 perl_call_method("CLEAR", G_SCALAR|G_DISCARD);
463ee0b2 897
898 return 0;
899}
900
901int
902magic_nextpack(sv,mg,key)
903SV* sv;
904MAGIC* mg;
905SV* key;
906{
463ee0b2 907 dSP;
a0d0e21e 908 char *meth = SvOK(key) ? "NEXTKEY" : "FIRSTKEY";
463ee0b2 909
910 ENTER;
a0d0e21e 911 SAVETMPS;
912 PUSHMARK(sp);
913 EXTEND(sp, 2);
914 PUSHs(mg->mg_obj);
463ee0b2 915 if (SvOK(key))
916 PUSHs(key);
917 PUTBACK;
918
a0d0e21e 919 if (perl_call_method(meth, G_SCALAR))
920 sv_setsv(key, *stack_sp--);
463ee0b2 921
a0d0e21e 922 FREETMPS;
923 LEAVE;
79072805 924 return 0;
925}
926
927int
a0d0e21e 928magic_existspack(sv,mg)
929SV* sv;
930MAGIC* mg;
931{
932 return magic_methpack(sv,mg,"EXISTS");
933}
934
935int
79072805 936magic_setdbline(sv,mg)
937SV* sv;
938MAGIC* mg;
939{
940 OP *o;
941 I32 i;
942 GV* gv;
943 SV** svp;
944
945 gv = DBline;
946 i = SvTRUE(sv);
947 svp = av_fetch(GvAV(gv),atoi(mg->mg_ptr), FALSE);
8990e307 948 if (svp && SvIOKp(*svp) && (o = (OP*)SvSTASH(*svp)))
93a17b20 949 o->op_private = i;
79072805 950 else
951 warn("Can't break at that line\n");
952 return 0;
953}
954
955int
956magic_getarylen(sv,mg)
957SV* sv;
958MAGIC* mg;
959{
a0d0e21e 960 sv_setiv(sv, AvFILL((AV*)mg->mg_obj) + curcop->cop_arybase);
79072805 961 return 0;
962}
963
964int
965magic_setarylen(sv,mg)
966SV* sv;
967MAGIC* mg;
968{
a0d0e21e 969 av_fill((AV*)mg->mg_obj, SvIV(sv) - curcop->cop_arybase);
970 return 0;
971}
972
973int
974magic_getpos(sv,mg)
975SV* sv;
976MAGIC* mg;
977{
978 SV* lsv = LvTARG(sv);
979
980 if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv)) {
981 mg = mg_find(lsv, 'g');
982 if (mg && mg->mg_len >= 0) {
983 sv_setiv(sv, mg->mg_len + curcop->cop_arybase);
984 return 0;
985 }
986 }
987 (void)SvOK_off(sv);
988 return 0;
989}
990
991int
992magic_setpos(sv,mg)
993SV* sv;
994MAGIC* mg;
995{
996 SV* lsv = LvTARG(sv);
997 SSize_t pos;
998 STRLEN len;
999
1000 mg = 0;
1001
1002 if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv))
1003 mg = mg_find(lsv, 'g');
1004 if (!mg) {
1005 if (!SvOK(sv))
1006 return 0;
1007 sv_magic(lsv, (SV*)0, 'g', Nullch, 0);
1008 mg = mg_find(lsv, 'g');
1009 }
1010 else if (!SvOK(sv)) {
1011 mg->mg_len = -1;
1012 return 0;
1013 }
1014 len = SvPOK(lsv) ? SvCUR(lsv) : sv_len(lsv);
1015
1016 pos = SvIV(sv) - curcop->cop_arybase;
1017 if (pos < 0) {
1018 pos += len;
1019 if (pos < 0)
1020 pos = 0;
1021 }
1022 else if (pos > len)
1023 pos = len;
1024 mg->mg_len = pos;
1025
79072805 1026 return 0;
1027}
1028
1029int
1030magic_getglob(sv,mg)
1031SV* sv;
1032MAGIC* mg;
1033{
1034 gv_efullname(sv,((GV*)sv));/* a gv value, be nice */
1035 return 0;
1036}
1037
1038int
1039magic_setglob(sv,mg)
1040SV* sv;
1041MAGIC* mg;
1042{
1043 register char *s;
1044 GV* gv;
1045
1046 if (!SvOK(sv))
1047 return 0;
463ee0b2 1048 s = SvPV(sv, na);
79072805 1049 if (*s == '*' && s[1])
1050 s++;
85e6fe83 1051 gv = gv_fetchpv(s,TRUE, SVt_PVGV);
79072805 1052 if (sv == (SV*)gv)
1053 return 0;
1054 if (GvGP(sv))
88e89b8a 1055 gp_free((GV*)sv);
79072805 1056 GvGP(sv) = gp_ref(GvGP(gv));
1057 if (!GvAV(gv))
1058 gv_AVadd(gv);
1059 if (!GvHV(gv))
1060 gv_HVadd(gv);
a0d0e21e 1061 if (!GvIOp(gv))
1062 GvIOp(gv) = newIO();
79072805 1063 return 0;
1064}
1065
1066int
1067magic_setsubstr(sv,mg)
1068SV* sv;
1069MAGIC* mg;
1070{
8990e307 1071 STRLEN len;
1072 char *tmps = SvPV(sv,len);
1073 sv_insert(LvTARG(sv),LvTARGOFF(sv),LvTARGLEN(sv), tmps, len);
79072805 1074 return 0;
1075}
1076
1077int
463ee0b2 1078magic_gettaint(sv,mg)
1079SV* sv;
1080MAGIC* mg;
1081{
748a9306 1082 if (mg->mg_len & 1)
1083 tainted = TRUE;
1084 else if (mg->mg_len & 2 && mg->mg_obj == sv) /* kludge */
1085 tainted = TRUE;
463ee0b2 1086 return 0;
1087}
1088
1089int
1090magic_settaint(sv,mg)
1091SV* sv;
1092MAGIC* mg;
1093{
748a9306 1094 if (localizing) {
1095 if (localizing == 1)
1096 mg->mg_len <<= 1;
1097 else
1098 mg->mg_len >>= 1;
a0d0e21e 1099 }
748a9306 1100 else if (tainted)
1101 mg->mg_len |= 1;
1102 else
1103 mg->mg_len &= ~1;
463ee0b2 1104 return 0;
1105}
1106
1107int
79072805 1108magic_setvec(sv,mg)
1109SV* sv;
1110MAGIC* mg;
1111{
1112 do_vecset(sv); /* XXX slurp this routine */
1113 return 0;
1114}
1115
1116int
93a17b20 1117magic_setmglob(sv,mg)
1118SV* sv;
1119MAGIC* mg;
1120{
a0d0e21e 1121 mg->mg_len = -1;
c6496cc7 1122 SvSCREAM_off(sv);
93a17b20 1123 return 0;
1124}
1125
1126int
79072805 1127magic_setbm(sv,mg)
1128SV* sv;
1129MAGIC* mg;
1130{
463ee0b2 1131 sv_unmagic(sv, 'B');
79072805 1132 SvVALID_off(sv);
1133 return 0;
1134}
1135
1136int
1137magic_setuvar(sv,mg)
1138SV* sv;
1139MAGIC* mg;
1140{
1141 struct ufuncs *uf = (struct ufuncs *)mg->mg_ptr;
1142
1143 if (uf && uf->uf_set)
1144 (*uf->uf_set)(uf->uf_index, sv);
1145 return 0;
1146}
1147
1148int
1149magic_set(sv,mg)
1150SV* sv;
1151MAGIC* mg;
1152{
1153 register char *s;
1154 I32 i;
8990e307 1155 STRLEN len;
79072805 1156 switch (*mg->mg_ptr) {
748a9306 1157 case '\001': /* ^A */
1158 sv_setsv(bodytarget, sv);
1159 break;
79072805 1160 case '\004': /* ^D */
8990e307 1161 debug = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) | 0x80000000;
79072805 1162 DEBUG_x(dump_all());
1163 break;
28f23441 1164 case '\005': /* ^E */
1165#ifdef VMS
1166 set_vaxc_errno(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
1167#else
1168 SETERRNO(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv),4); /* will anyone ever use this? */
1169#endif
1170 break;
79072805 1171 case '\006': /* ^F */
463ee0b2 1172 maxsysfd = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
79072805 1173 break;
a0d0e21e 1174 case '\010': /* ^H */
1175 hints = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1176 break;
79072805 1177 case '\t': /* ^I */
1178 if (inplace)
1179 Safefree(inplace);
1180 if (SvOK(sv))
a0d0e21e 1181 inplace = savepv(SvPV(sv,na));
79072805 1182 else
1183 inplace = Nullch;
1184 break;
28f23441 1185 case '\017': /* ^O */
1186 if (osname)
1187 Safefree(osname);
1188 if (SvOK(sv))
1189 osname = savepv(SvPV(sv,na));
1190 else
1191 osname = Nullch;
1192 break;
79072805 1193 case '\020': /* ^P */
463ee0b2 1194 i = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
79072805 1195 if (i != perldb) {
1196 if (perldb)
1197 oldlastpm = curpm;
1198 else
1199 curpm = oldlastpm;
1200 }
1201 perldb = i;
1202 break;
1203 case '\024': /* ^T */
88e89b8a 1204#ifdef BIG_TIME
1205 basetime = (Time_t)(SvNOK(sv) ? SvNVX(sv) : sv_2nv(sv));
1206#else
85e6fe83 1207 basetime = (Time_t)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
88e89b8a 1208#endif
79072805 1209 break;
1210 case '\027': /* ^W */
463ee0b2 1211 dowarn = (bool)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
79072805 1212 break;
1213 case '.':
748a9306 1214 if (localizing) {
1215 if (localizing == 1)
1216 save_sptr((SV**)&last_in_gv);
1217 }
88e89b8a 1218 else if (SvOK(sv) && GvIO(last_in_gv))
a0d0e21e 1219 IoLINES(GvIOp(last_in_gv)) = (long)SvIV(sv);
79072805 1220 break;
1221 case '^':
a0d0e21e 1222 Safefree(IoTOP_NAME(GvIOp(defoutgv)));
1223 IoTOP_NAME(GvIOp(defoutgv)) = s = savepv(SvPV(sv,na));
1224 IoTOP_GV(GvIOp(defoutgv)) = gv_fetchpv(s,TRUE, SVt_PVIO);
79072805 1225 break;
1226 case '~':
a0d0e21e 1227 Safefree(IoFMT_NAME(GvIOp(defoutgv)));
1228 IoFMT_NAME(GvIOp(defoutgv)) = s = savepv(SvPV(sv,na));
1229 IoFMT_GV(GvIOp(defoutgv)) = gv_fetchpv(s,TRUE, SVt_PVIO);
79072805 1230 break;
1231 case '=':
a0d0e21e 1232 IoPAGE_LEN(GvIOp(defoutgv)) = (long)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
79072805 1233 break;
1234 case '-':
a0d0e21e 1235 IoLINES_LEFT(GvIOp(defoutgv)) = (long)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
1236 if (IoLINES_LEFT(GvIOp(defoutgv)) < 0L)
1237 IoLINES_LEFT(GvIOp(defoutgv)) = 0L;
79072805 1238 break;
1239 case '%':
a0d0e21e 1240 IoPAGE(GvIOp(defoutgv)) = (long)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
79072805 1241 break;
1242 case '|':
a0d0e21e 1243 IoFLAGS(GvIOp(defoutgv)) &= ~IOf_FLUSH;
463ee0b2 1244 if ((SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) != 0) {
a0d0e21e 1245 IoFLAGS(GvIOp(defoutgv)) |= IOf_FLUSH;
79072805 1246 }
1247 break;
1248 case '*':
463ee0b2 1249 i = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
79072805 1250 multiline = (i != 0);
1251 break;
1252 case '/':
c07a80fd 1253 SvREFCNT_dec(nrs);
1254 nrs = newSVsv(sv);
1255 SvREFCNT_dec(rs);
1256 rs = SvREFCNT_inc(nrs);
79072805 1257 break;
1258 case '\\':
1259 if (ors)
1260 Safefree(ors);
a0d0e21e 1261 ors = savepv(SvPV(sv,orslen));
79072805 1262 break;
1263 case ',':
1264 if (ofs)
1265 Safefree(ofs);
a0d0e21e 1266 ofs = savepv(SvPV(sv, ofslen));
79072805 1267 break;
1268 case '#':
1269 if (ofmt)
1270 Safefree(ofmt);
a0d0e21e 1271 ofmt = savepv(SvPV(sv,na));
79072805 1272 break;
1273 case '[':
a0d0e21e 1274 compiling.cop_arybase = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
79072805 1275 break;
1276 case '?':
748a9306 1277 statusvalue = FIXSTATUS(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
79072805 1278 break;
1279 case '!':
28f23441 1280 SETERRNO(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv),SvIV(sv) == EVMSERR ? 4 : vaxc$errno); /* will anyone ever use this? */
79072805 1281 break;
1282 case '<':
463ee0b2 1283 uid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
79072805 1284 if (delaymagic) {
1285 delaymagic |= DM_RUID;
1286 break; /* don't do magic till later */
1287 }
1288#ifdef HAS_SETRUID
85e6fe83 1289 (void)setruid((Uid_t)uid);
79072805 1290#else
1291#ifdef HAS_SETREUID
85e6fe83 1292 (void)setreuid((Uid_t)uid, (Uid_t)-1);
748a9306 1293#else
85e6fe83 1294#ifdef HAS_SETRESUID
1295 (void)setresuid((Uid_t)uid, (Uid_t)-1, (Uid_t)-1);
79072805 1296#else
1297 if (uid == euid) /* special case $< = $> */
1298 (void)setuid(uid);
a0d0e21e 1299 else {
1300 uid = (I32)getuid();
463ee0b2 1301 croak("setruid() not implemented");
a0d0e21e 1302 }
79072805 1303#endif
1304#endif
85e6fe83 1305#endif
748a9306 1306 uid = (I32)getuid();
4633a7c4 1307 tainting |= (uid && (euid != uid || egid != gid));
79072805 1308 break;
1309 case '>':
463ee0b2 1310 euid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
79072805 1311 if (delaymagic) {
1312 delaymagic |= DM_EUID;
1313 break; /* don't do magic till later */
1314 }
1315#ifdef HAS_SETEUID
85e6fe83 1316 (void)seteuid((Uid_t)euid);
79072805 1317#else
1318#ifdef HAS_SETREUID
85e6fe83 1319 (void)setreuid((Uid_t)-1, (Uid_t)euid);
1320#else
1321#ifdef HAS_SETRESUID
1322 (void)setresuid((Uid_t)-1, (Uid_t)euid, (Uid_t)-1);
79072805 1323#else
1324 if (euid == uid) /* special case $> = $< */
1325 setuid(euid);
a0d0e21e 1326 else {
1327 euid = (I32)geteuid();
463ee0b2 1328 croak("seteuid() not implemented");
a0d0e21e 1329 }
79072805 1330#endif
1331#endif
85e6fe83 1332#endif
79072805 1333 euid = (I32)geteuid();
4633a7c4 1334 tainting |= (uid && (euid != uid || egid != gid));
79072805 1335 break;
1336 case '(':
463ee0b2 1337 gid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
79072805 1338 if (delaymagic) {
1339 delaymagic |= DM_RGID;
1340 break; /* don't do magic till later */
1341 }
1342#ifdef HAS_SETRGID
85e6fe83 1343 (void)setrgid((Gid_t)gid);
79072805 1344#else
1345#ifdef HAS_SETREGID
85e6fe83 1346 (void)setregid((Gid_t)gid, (Gid_t)-1);
1347#else
1348#ifdef HAS_SETRESGID
1349 (void)setresgid((Gid_t)gid, (Gid_t)-1, (Gid_t) 1);
79072805 1350#else
1351 if (gid == egid) /* special case $( = $) */
1352 (void)setgid(gid);
748a9306 1353 else {
1354 gid = (I32)getgid();
463ee0b2 1355 croak("setrgid() not implemented");
748a9306 1356 }
79072805 1357#endif
1358#endif
85e6fe83 1359#endif
79072805 1360 gid = (I32)getgid();
4633a7c4 1361 tainting |= (uid && (euid != uid || egid != gid));
79072805 1362 break;
1363 case ')':
463ee0b2 1364 egid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
79072805 1365 if (delaymagic) {
1366 delaymagic |= DM_EGID;
1367 break; /* don't do magic till later */
1368 }
1369#ifdef HAS_SETEGID
85e6fe83 1370 (void)setegid((Gid_t)egid);
79072805 1371#else
1372#ifdef HAS_SETREGID
85e6fe83 1373 (void)setregid((Gid_t)-1, (Gid_t)egid);
1374#else
1375#ifdef HAS_SETRESGID
1376 (void)setresgid((Gid_t)-1, (Gid_t)egid, (Gid_t)-1);
79072805 1377#else
1378 if (egid == gid) /* special case $) = $( */
1379 (void)setgid(egid);
748a9306 1380 else {
1381 egid = (I32)getegid();
463ee0b2 1382 croak("setegid() not implemented");
748a9306 1383 }
79072805 1384#endif
1385#endif
85e6fe83 1386#endif
79072805 1387 egid = (I32)getegid();
4633a7c4 1388 tainting |= (uid && (euid != uid || egid != gid));
79072805 1389 break;
1390 case ':':
a0d0e21e 1391 chopset = SvPV_force(sv,na);
79072805 1392 break;
1393 case '0':
1394 if (!origalen) {
1395 s = origargv[0];
1396 s += strlen(s);
1397 /* See if all the arguments are contiguous in memory */
1398 for (i = 1; i < origargc; i++) {
1399 if (origargv[i] == s + 1)
1400 s += strlen(++s); /* this one is ok too */
1401 }
1402 if (origenviron[0] == s + 1) { /* can grab env area too? */
1403 my_setenv("NoNeSuCh", Nullch);
1404 /* force copy of environment */
1405 for (i = 0; origenviron[i]; i++)
1406 if (origenviron[i] == s + 1)
1407 s += strlen(++s);
1408 }
1409 origalen = s - origargv[0];
1410 }
a0d0e21e 1411 s = SvPV_force(sv,len);
8990e307 1412 i = len;
79072805 1413 if (i >= origalen) {
1414 i = origalen;
1415 SvCUR_set(sv, i);
1416 *SvEND(sv) = '\0';
1417 Copy(s, origargv[0], i, char);
1418 }
1419 else {
1420 Copy(s, origargv[0], i, char);
1421 s = origargv[0]+i;
1422 *s++ = '\0';
1423 while (++i < origalen)
8990e307 1424 *s++ = ' ';
1425 s = origargv[0]+i;
ed6116ce 1426 for (i = 1; i < origargc; i++)
8990e307 1427 origargv[i] = Nullch;
79072805 1428 }
1429 break;
1430 }
1431 return 0;
1432}
1433
1434I32
1435whichsig(sig)
1436char *sig;
1437{
1438 register char **sigv;
1439
1440 for (sigv = sig_name+1; *sigv; sigv++)
1441 if (strEQ(sig,*sigv))
8e07c86e 1442 return sig_num[sigv - sig_name];
79072805 1443#ifdef SIGCLD
1444 if (strEQ(sig,"CHLD"))
1445 return SIGCLD;
1446#endif
1447#ifdef SIGCHLD
1448 if (strEQ(sig,"CLD"))
1449 return SIGCHLD;
1450#endif
1451 return 0;
1452}
1453
ecfc5424 1454Signal_t
79072805 1455sighandler(sig)
a0d0e21e 1456int sig;
79072805 1457{
1458 dSP;
1459 GV *gv;
a0d0e21e 1460 HV *st;
79072805 1461 SV *sv;
1462 CV *cv;
79072805 1463 AV *oldstack;
760ac839 1464
1465 if(!psig_ptr[sig])
1466 die("Signal SIG%s received, but no signal handler set.\n",
1467 sig_name[sig]);
79072805 1468
88e89b8a 1469 cv = sv_2cv(psig_ptr[sig],&st,&gv,TRUE);
a0d0e21e 1470 if (!cv || !CvROOT(cv)) {
79072805 1471 if (dowarn)
1472 warn("SIG%s handler \"%s\" not defined.\n",
88e89b8a 1473 sig_name[sig], GvENAME(gv) );
79072805 1474 return;
1475 }
1476
88e89b8a 1477 oldstack = curstack;
1478 if (curstack != signalstack)
a0d0e21e 1479 AvFILL(signalstack) = 0;
88e89b8a 1480 SWITCHSTACK(curstack, signalstack);
79072805 1481
88e89b8a 1482 if(psig_name[sig])
1483 sv = SvREFCNT_inc(psig_name[sig]);
1484 else {
1485 sv = sv_newmortal();
1486 sv_setpv(sv,sig_name[sig]);
1487 }
a0d0e21e 1488 PUSHMARK(sp);
79072805 1489 PUSHs(sv);
79072805 1490 PUTBACK;
a0d0e21e 1491
1492 perl_call_sv((SV*)cv, G_DISCARD);
79072805 1493
1494 SWITCHSTACK(signalstack, oldstack);
79072805 1495
1496 return;
1497}