3 * Copyright (c) 1987-2000 Larry Wall
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.
11 * "A ship then new they built for him/of mithril and of elven glass" --Bilbo
15 #define PERL_IN_PERL_C
17 #include "patchlevel.h" /* for local_patches */
19 /* XXX If this causes problems, set i_unistd=undef in the hint file. */
24 #if !defined(STANDARD_C) && !defined(HAS_GETENV_PROTOTYPE)
25 char *getenv (char *); /* Usually in <stdlib.h> */
28 static I32 read_e_script(pTHXo_ int idx, SV *buf_sv, int maxlen);
36 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
43 #define perl_construct Perl_construct
44 #define perl_parse Perl_parse
45 #define perl_run Perl_run
46 #define perl_destruct Perl_destruct
47 #define perl_free Perl_free
50 #ifdef PERL_IMPLICIT_SYS
52 perl_alloc_using(struct IPerlMem* ipM, struct IPerlMem* ipMS,
53 struct IPerlMem* ipMP, struct IPerlEnv* ipE,
54 struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
55 struct IPerlDir* ipD, struct IPerlSock* ipS,
56 struct IPerlProc* ipP)
58 PerlInterpreter *my_perl;
60 my_perl = (PerlInterpreter*)new(ipM) CPerlObj(ipM, ipMS, ipMP, ipE, ipStd,
61 ipLIO, ipD, ipS, ipP);
62 PERL_SET_INTERP(my_perl);
64 /* New() needs interpreter, so call malloc() instead */
65 my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
66 PERL_SET_INTERP(my_perl);
67 Zero(my_perl, 1, PerlInterpreter);
84 =for apidoc perl_alloc
86 Allocates a new Perl interpreter. See L<perlembed>.
94 PerlInterpreter *my_perl;
96 /* New() needs interpreter, so call malloc() instead */
97 my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
98 PERL_SET_INTERP(my_perl);
99 Zero(my_perl, 1, PerlInterpreter);
102 #endif /* PERL_IMPLICIT_SYS */
105 =for apidoc perl_construct
107 Initializes a new Perl interpreter. See L<perlembed>.
113 perl_construct(pTHXx)
118 struct perl_thread *thr = NULL;
119 #endif /* FAKE_THREADS */
120 #endif /* USE_THREADS */
124 PL_perl_destruct_level = 1;
126 if (PL_perl_destruct_level > 0)
130 /* Init the real globals (and main thread)? */
134 #ifdef ALLOC_THREAD_KEY
137 if (pthread_key_create(&PL_thr_key, 0))
138 Perl_croak(aTHX_ "panic: pthread_key_create");
140 MUTEX_INIT(&PL_sv_mutex);
142 * Safe to use basic SV functions from now on (though
143 * not things like mortals or tainting yet).
145 MUTEX_INIT(&PL_eval_mutex);
146 COND_INIT(&PL_eval_cond);
147 MUTEX_INIT(&PL_threads_mutex);
148 COND_INIT(&PL_nthreads_cond);
149 #ifdef EMULATE_ATOMIC_REFCOUNTS
150 MUTEX_INIT(&PL_svref_mutex);
151 #endif /* EMULATE_ATOMIC_REFCOUNTS */
153 MUTEX_INIT(&PL_cred_mutex);
155 thr = init_main_thread();
156 #endif /* USE_THREADS */
158 #ifdef PERL_FLEXIBLE_EXCEPTIONS
159 PL_protect = MEMBER_TO_FPTR(Perl_default_protect); /* for exceptions */
162 PL_curcop = &PL_compiling; /* needed by ckWARN, right away */
164 PL_linestr = NEWSV(65,79);
165 sv_upgrade(PL_linestr,SVt_PVIV);
167 if (!SvREADONLY(&PL_sv_undef)) {
168 /* set read-only and try to insure than we wont see REFCNT==0
171 SvREADONLY_on(&PL_sv_undef);
172 SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
174 sv_setpv(&PL_sv_no,PL_No);
176 SvREADONLY_on(&PL_sv_no);
177 SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
179 sv_setpv(&PL_sv_yes,PL_Yes);
181 SvREADONLY_on(&PL_sv_yes);
182 SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
187 /* PL_sighandlerp = sighandler; */
189 PL_sighandlerp = Perl_sighandler;
191 PL_pidstatus = newHV();
195 * There is no way we can refer to them from Perl so close them to save
196 * space. The other alternative would be to provide STDAUX and STDPRN
199 (void)fclose(stdaux);
200 (void)fclose(stdprn);
204 PL_nrs = newSVpvn("\n", 1);
205 PL_rs = SvREFCNT_inc(PL_nrs);
210 PL_lex_state = LEX_NOTPARSING;
216 SET_NUMERIC_STANDARD();
220 PL_patchlevel = NEWSV(0,4);
221 SvUPGRADE(PL_patchlevel, SVt_PVNV);
222 if (PERL_REVISION > 127 || PERL_VERSION > 127 || PERL_SUBVERSION > 127)
223 SvGROW(PL_patchlevel, UTF8_MAXLEN*3+1);
224 s = (U8*)SvPVX(PL_patchlevel);
225 s = uv_to_utf8(s, (UV)PERL_REVISION);
226 s = uv_to_utf8(s, (UV)PERL_VERSION);
227 s = uv_to_utf8(s, (UV)PERL_SUBVERSION);
229 SvCUR_set(PL_patchlevel, s - (U8*)SvPVX(PL_patchlevel));
230 SvPOK_on(PL_patchlevel);
231 SvNVX(PL_patchlevel) = (NV)PERL_REVISION
232 + ((NV)PERL_VERSION / (NV)1000)
233 #if defined(PERL_SUBVERSION) && PERL_SUBVERSION > 0
234 + ((NV)PERL_SUBVERSION / (NV)1000000)
237 SvNOK_on(PL_patchlevel); /* dual valued */
238 SvUTF8_on(PL_patchlevel);
239 SvREADONLY_on(PL_patchlevel);
242 #if defined(LOCAL_PATCH_COUNT)
243 PL_localpatches = local_patches; /* For possible -v */
246 PerlIO_init(); /* Hook to IO system */
248 PL_fdpid = newAV(); /* for remembering popen pids by fd */
249 PL_modglobal = newHV(); /* pointers to per-interpreter module globals */
255 =for apidoc perl_destruct
257 Shuts down a Perl interpreter. See L<perlembed>.
266 int destruct_level; /* 0=none, 1=full, 2=full with checks */
272 #endif /* USE_THREADS */
274 /* wait for all pseudo-forked children to finish */
275 PERL_WAIT_FOR_CHILDREN;
279 /* Pass 1 on any remaining threads: detach joinables, join zombies */
281 MUTEX_LOCK(&PL_threads_mutex);
282 DEBUG_S(PerlIO_printf(Perl_debug_log,
283 "perl_destruct: waiting for %d threads...\n",
285 for (t = thr->next; t != thr; t = t->next) {
286 MUTEX_LOCK(&t->mutex);
287 switch (ThrSTATE(t)) {
290 DEBUG_S(PerlIO_printf(Perl_debug_log,
291 "perl_destruct: joining zombie %p\n", t));
292 ThrSETSTATE(t, THRf_DEAD);
293 MUTEX_UNLOCK(&t->mutex);
296 * The SvREFCNT_dec below may take a long time (e.g. av
297 * may contain an object scalar whose destructor gets
298 * called) so we have to unlock threads_mutex and start
301 MUTEX_UNLOCK(&PL_threads_mutex);
303 SvREFCNT_dec((SV*)av);
304 DEBUG_S(PerlIO_printf(Perl_debug_log,
305 "perl_destruct: joined zombie %p OK\n", t));
307 case THRf_R_JOINABLE:
308 DEBUG_S(PerlIO_printf(Perl_debug_log,
309 "perl_destruct: detaching thread %p\n", t));
310 ThrSETSTATE(t, THRf_R_DETACHED);
312 * We unlock threads_mutex and t->mutex in the opposite order
313 * from which we locked them just so that DETACH won't
314 * deadlock if it panics. It's only a breach of good style
315 * not a bug since they are unlocks not locks.
317 MUTEX_UNLOCK(&PL_threads_mutex);
319 MUTEX_UNLOCK(&t->mutex);
322 DEBUG_S(PerlIO_printf(Perl_debug_log,
323 "perl_destruct: ignoring %p (state %u)\n",
325 MUTEX_UNLOCK(&t->mutex);
326 /* fall through and out */
329 /* We leave the above "Pass 1" loop with threads_mutex still locked */
331 /* Pass 2 on remaining threads: wait for the thread count to drop to one */
332 while (PL_nthreads > 1)
334 DEBUG_S(PerlIO_printf(Perl_debug_log,
335 "perl_destruct: final wait for %d threads\n",
337 COND_WAIT(&PL_nthreads_cond, &PL_threads_mutex);
339 /* At this point, we're the last thread */
340 MUTEX_UNLOCK(&PL_threads_mutex);
341 DEBUG_S(PerlIO_printf(Perl_debug_log, "perl_destruct: armageddon has arrived\n"));
342 MUTEX_DESTROY(&PL_threads_mutex);
343 COND_DESTROY(&PL_nthreads_cond);
344 #endif /* !defined(FAKE_THREADS) */
345 #endif /* USE_THREADS */
347 destruct_level = PL_perl_destruct_level;
351 if (s = PerlEnv_getenv("PERL_DESTRUCT_LEVEL")) {
353 if (destruct_level < i)
362 /* We must account for everything. */
364 /* Destroy the main CV and syntax tree */
366 PL_curpad = AvARRAY(PL_comppad);
367 op_free(PL_main_root);
368 PL_main_root = Nullop;
370 PL_curcop = &PL_compiling;
371 PL_main_start = Nullop;
372 SvREFCNT_dec(PL_main_cv);
376 if (PL_sv_objcount) {
378 * Try to destruct global references. We do this first so that the
379 * destructors and destructees still exist. Some sv's might remain.
380 * Non-referenced objects are on their own.
385 /* unhook hooks which will soon be, or use, destroyed data */
386 SvREFCNT_dec(PL_warnhook);
387 PL_warnhook = Nullsv;
388 SvREFCNT_dec(PL_diehook);
391 /* call exit list functions */
392 while (PL_exitlistlen-- > 0)
393 PL_exitlist[PL_exitlistlen].fn(aTHXo_ PL_exitlist[PL_exitlistlen].ptr);
395 Safefree(PL_exitlist);
397 if (destruct_level == 0){
399 DEBUG_P(debprofdump());
401 /* The exit() function will do everything that needs doing. */
405 /* loosen bonds of global variables */
408 (void)PerlIO_close(PL_rsfp);
412 /* Filters for program text */
413 SvREFCNT_dec(PL_rsfp_filters);
414 PL_rsfp_filters = Nullav;
417 PL_preprocess = FALSE;
423 PL_doswitches = FALSE;
424 PL_dowarn = G_WARN_OFF;
425 PL_doextract = FALSE;
426 PL_sawampersand = FALSE; /* must save all match strings */
429 Safefree(PL_inplace);
431 SvREFCNT_dec(PL_patchlevel);
434 SvREFCNT_dec(PL_e_script);
435 PL_e_script = Nullsv;
438 /* magical thingies */
440 Safefree(PL_ofs); /* $, */
443 Safefree(PL_ors); /* $\ */
446 SvREFCNT_dec(PL_rs); /* $/ */
449 SvREFCNT_dec(PL_nrs); /* $/ helper */
452 PL_multiline = 0; /* $* */
453 Safefree(PL_osname); /* $^O */
456 SvREFCNT_dec(PL_statname);
457 PL_statname = Nullsv;
460 /* defgv, aka *_ should be taken care of elsewhere */
462 /* clean up after study() */
463 SvREFCNT_dec(PL_lastscream);
464 PL_lastscream = Nullsv;
465 Safefree(PL_screamfirst);
467 Safefree(PL_screamnext);
471 Safefree(PL_efloatbuf);
472 PL_efloatbuf = Nullch;
475 /* startup and shutdown function lists */
476 SvREFCNT_dec(PL_beginav);
477 SvREFCNT_dec(PL_endav);
478 SvREFCNT_dec(PL_checkav);
479 SvREFCNT_dec(PL_initav);
485 /* shortcuts just get cleared */
491 PL_argvoutgv = Nullgv;
493 PL_stderrgv = Nullgv;
494 PL_last_in_gv = Nullgv;
496 PL_debstash = Nullhv;
498 /* reset so print() ends up where we expect */
501 SvREFCNT_dec(PL_argvout_stack);
502 PL_argvout_stack = Nullav;
504 SvREFCNT_dec(PL_modglobal);
505 PL_modglobal = Nullhv;
506 SvREFCNT_dec(PL_preambleav);
507 PL_preambleav = Nullav;
508 SvREFCNT_dec(PL_subname);
510 SvREFCNT_dec(PL_linestr);
512 SvREFCNT_dec(PL_pidstatus);
513 PL_pidstatus = Nullhv;
514 SvREFCNT_dec(PL_toptarget);
515 PL_toptarget = Nullsv;
516 SvREFCNT_dec(PL_bodytarget);
517 PL_bodytarget = Nullsv;
518 PL_formtarget = Nullsv;
520 /* free locale stuff */
521 #ifdef USE_LOCALE_COLLATE
522 Safefree(PL_collation_name);
523 PL_collation_name = Nullch;
526 #ifdef USE_LOCALE_NUMERIC
527 Safefree(PL_numeric_name);
528 PL_numeric_name = Nullch;
531 /* clear utf8 character classes */
532 SvREFCNT_dec(PL_utf8_alnum);
533 SvREFCNT_dec(PL_utf8_alnumc);
534 SvREFCNT_dec(PL_utf8_ascii);
535 SvREFCNT_dec(PL_utf8_alpha);
536 SvREFCNT_dec(PL_utf8_space);
537 SvREFCNT_dec(PL_utf8_cntrl);
538 SvREFCNT_dec(PL_utf8_graph);
539 SvREFCNT_dec(PL_utf8_digit);
540 SvREFCNT_dec(PL_utf8_upper);
541 SvREFCNT_dec(PL_utf8_lower);
542 SvREFCNT_dec(PL_utf8_print);
543 SvREFCNT_dec(PL_utf8_punct);
544 SvREFCNT_dec(PL_utf8_xdigit);
545 SvREFCNT_dec(PL_utf8_mark);
546 SvREFCNT_dec(PL_utf8_toupper);
547 SvREFCNT_dec(PL_utf8_tolower);
548 PL_utf8_alnum = Nullsv;
549 PL_utf8_alnumc = Nullsv;
550 PL_utf8_ascii = Nullsv;
551 PL_utf8_alpha = Nullsv;
552 PL_utf8_space = Nullsv;
553 PL_utf8_cntrl = Nullsv;
554 PL_utf8_graph = Nullsv;
555 PL_utf8_digit = Nullsv;
556 PL_utf8_upper = Nullsv;
557 PL_utf8_lower = Nullsv;
558 PL_utf8_print = Nullsv;
559 PL_utf8_punct = Nullsv;
560 PL_utf8_xdigit = Nullsv;
561 PL_utf8_mark = Nullsv;
562 PL_utf8_toupper = Nullsv;
563 PL_utf8_totitle = Nullsv;
564 PL_utf8_tolower = Nullsv;
566 if (!specialWARN(PL_compiling.cop_warnings))
567 SvREFCNT_dec(PL_compiling.cop_warnings);
568 PL_compiling.cop_warnings = Nullsv;
570 /* Prepare to destruct main symbol table. */
575 SvREFCNT_dec(PL_curstname);
576 PL_curstname = Nullsv;
578 /* clear queued errors */
579 SvREFCNT_dec(PL_errors);
583 if (destruct_level >= 2 && ckWARN_d(WARN_INTERNAL)) {
584 if (PL_scopestack_ix != 0)
585 Perl_warner(aTHX_ WARN_INTERNAL,
586 "Unbalanced scopes: %ld more ENTERs than LEAVEs\n",
587 (long)PL_scopestack_ix);
588 if (PL_savestack_ix != 0)
589 Perl_warner(aTHX_ WARN_INTERNAL,
590 "Unbalanced saves: %ld more saves than restores\n",
591 (long)PL_savestack_ix);
592 if (PL_tmps_floor != -1)
593 Perl_warner(aTHX_ WARN_INTERNAL,"Unbalanced tmps: %ld more allocs than frees\n",
594 (long)PL_tmps_floor + 1);
595 if (cxstack_ix != -1)
596 Perl_warner(aTHX_ WARN_INTERNAL,"Unbalanced context: %ld more PUSHes than POPs\n",
597 (long)cxstack_ix + 1);
600 /* Now absolutely destruct everything, somehow or other, loops or no. */
602 SvFLAGS(PL_fdpid) |= SVTYPEMASK; /* don't clean out pid table now */
603 SvFLAGS(PL_strtab) |= SVTYPEMASK; /* don't clean out strtab now */
604 while (PL_sv_count != 0 && PL_sv_count != last_sv_count) {
605 last_sv_count = PL_sv_count;
608 SvFLAGS(PL_fdpid) &= ~SVTYPEMASK;
609 SvFLAGS(PL_fdpid) |= SVt_PVAV;
610 SvFLAGS(PL_strtab) &= ~SVTYPEMASK;
611 SvFLAGS(PL_strtab) |= SVt_PVHV;
613 AvREAL_off(PL_fdpid); /* no surviving entries */
614 SvREFCNT_dec(PL_fdpid); /* needed in io_close() */
617 /* Destruct the global string table. */
619 /* Yell and reset the HeVAL() slots that are still holding refcounts,
620 * so that sv_free() won't fail on them.
628 max = HvMAX(PL_strtab);
629 array = HvARRAY(PL_strtab);
632 if (hent && ckWARN_d(WARN_INTERNAL)) {
633 Perl_warner(aTHX_ WARN_INTERNAL,
634 "Unbalanced string table refcount: (%d) for \"%s\"",
635 HeVAL(hent) - Nullsv, HeKEY(hent));
636 HeVAL(hent) = Nullsv;
646 SvREFCNT_dec(PL_strtab);
648 /* free special SVs */
650 SvREFCNT(&PL_sv_yes) = 0;
651 sv_clear(&PL_sv_yes);
652 SvANY(&PL_sv_yes) = NULL;
654 SvREFCNT(&PL_sv_no) = 0;
656 SvANY(&PL_sv_no) = NULL;
658 if (PL_sv_count != 0 && ckWARN_d(WARN_INTERNAL))
659 Perl_warner(aTHX_ WARN_INTERNAL,"Scalars leaked: %ld\n", (long)PL_sv_count);
663 /* No SVs have survived, need to clean out */
664 Safefree(PL_origfilename);
665 Safefree(PL_reg_start_tmp);
667 Safefree(PL_reg_curpm);
668 Safefree(PL_reg_poscache);
669 Safefree(HeKEY_hek(&PL_hv_fetch_ent_mh));
670 Safefree(PL_op_mask);
672 PL_hints = 0; /* Reset hints. Should hints be per-interpreter ? */
674 DEBUG_P(debprofdump());
676 MUTEX_DESTROY(&PL_strtab_mutex);
677 MUTEX_DESTROY(&PL_sv_mutex);
678 MUTEX_DESTROY(&PL_eval_mutex);
679 MUTEX_DESTROY(&PL_cred_mutex);
680 COND_DESTROY(&PL_eval_cond);
681 #ifdef EMULATE_ATOMIC_REFCOUNTS
682 MUTEX_DESTROY(&PL_svref_mutex);
683 #endif /* EMULATE_ATOMIC_REFCOUNTS */
685 /* As the penultimate thing, free the non-arena SV for thrsv */
686 Safefree(SvPVX(PL_thrsv));
687 Safefree(SvANY(PL_thrsv));
690 #endif /* USE_THREADS */
692 /* As the absolutely last thing, free the non-arena SV for mess() */
695 /* it could have accumulated taint magic */
696 if (SvTYPE(PL_mess_sv) >= SVt_PVMG) {
699 for (mg = SvMAGIC(PL_mess_sv); mg; mg = moremagic) {
700 moremagic = mg->mg_moremagic;
701 if (mg->mg_ptr && mg->mg_type != 'g' && mg->mg_len >= 0)
702 Safefree(mg->mg_ptr);
706 /* we know that type >= SVt_PV */
707 SvOOK_off(PL_mess_sv);
708 Safefree(SvPVX(PL_mess_sv));
709 Safefree(SvANY(PL_mess_sv));
710 Safefree(PL_mess_sv);
716 =for apidoc perl_free
718 Releases a Perl interpreter. See L<perlembed>.
726 #if defined(PERL_OBJECT)
734 Perl_call_atexit(pTHX_ ATEXIT_t fn, void *ptr)
736 Renew(PL_exitlist, PL_exitlistlen+1, PerlExitListEntry);
737 PL_exitlist[PL_exitlistlen].fn = fn;
738 PL_exitlist[PL_exitlistlen].ptr = ptr;
743 =for apidoc perl_parse
745 Tells a Perl interpreter to parse a Perl script. See L<perlembed>.
751 perl_parse(pTHXx_ XSINIT_t xsinit, int argc, char **argv, char **env)
761 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
764 Perl_croak(aTHX_ "suidperl is no longer needed since the kernel can now execute\n\
765 setuid perl scripts securely.\n");
769 #if defined(__DYNAMIC__) && (defined(NeXT) || defined(__NeXT__))
770 _dyld_lookup_and_bind
771 ("__environ", (unsigned long *) &environ_pointer, NULL);
776 #ifndef VMS /* VMS doesn't have environ array */
777 PL_origenviron = environ;
782 /* Come here if running an undumped a.out. */
784 PL_origfilename = savepv(argv[0]);
785 PL_do_undump = FALSE;
786 cxstack_ix = -1; /* start label stack again */
788 init_postdump_symbols(argc,argv,env);
793 PL_curpad = AvARRAY(PL_comppad);
794 op_free(PL_main_root);
795 PL_main_root = Nullop;
797 PL_main_start = Nullop;
798 SvREFCNT_dec(PL_main_cv);
802 oldscope = PL_scopestack_ix;
803 PL_dowarn = G_WARN_OFF;
805 #ifdef PERL_FLEXIBLE_EXCEPTIONS
806 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vparse_body), env, xsinit);
812 #ifndef PERL_FLEXIBLE_EXCEPTIONS
813 parse_body(env,xsinit);
816 call_list(oldscope, PL_checkav);
823 /* my_exit() was called */
824 while (PL_scopestack_ix > oldscope)
827 PL_curstash = PL_defstash;
829 call_list(oldscope, PL_checkav);
830 ret = STATUS_NATIVE_EXPORT;
833 PerlIO_printf(Perl_error_log, "panic: top_env\n");
841 #ifdef PERL_FLEXIBLE_EXCEPTIONS
843 S_vparse_body(pTHX_ va_list args)
845 char **env = va_arg(args, char**);
846 XSINIT_t xsinit = va_arg(args, XSINIT_t);
848 return parse_body(env, xsinit);
853 S_parse_body(pTHX_ char **env, XSINIT_t xsinit)
856 int argc = PL_origargc;
857 char **argv = PL_origargv;
858 char *scriptname = NULL;
860 VOL bool dosearch = FALSE;
865 char *cddir = Nullch;
867 sv_setpvn(PL_linestr,"",0);
868 sv = newSVpvn("",0); /* first used for -I flags */
872 for (argc--,argv++; argc > 0; argc--,argv++) {
873 if (argv[0][0] != '-' || !argv[0][1])
877 validarg = " PHOOEY ";
884 #ifndef PERL_STRICT_CR
909 if (s = moreswitches(s))
919 if (PL_euid != PL_uid || PL_egid != PL_gid)
920 Perl_croak(aTHX_ "No -e allowed in setuid scripts");
922 PL_e_script = newSVpvn("",0);
923 filter_add(read_e_script, NULL);
926 sv_catpv(PL_e_script, s);
928 sv_catpv(PL_e_script, argv[1]);
932 Perl_croak(aTHX_ "No code specified for -e");
933 sv_catpv(PL_e_script, "\n");
936 case 'I': /* -I handled both here and in moreswitches() */
938 if (!*++s && (s=argv[1]) != Nullch) {
943 STRLEN len = strlen(s);
946 sv_catpvn(sv, "-I", 2);
947 sv_catpvn(sv, p, len);
948 sv_catpvn(sv, " ", 1);
952 Perl_croak(aTHX_ "No directory specified for -I");
956 PL_preprocess = TRUE;
966 PL_preambleav = newAV();
967 av_push(PL_preambleav, newSVpv("use Config qw(myconfig config_vars)",0));
969 PL_Sv = newSVpv("print myconfig();",0);
971 sv_catpv(PL_Sv,"print \"\\nCharacteristics of this PERLSHR image: \\n\",");
973 sv_catpv(PL_Sv,"print \"\\nCharacteristics of this binary (from libperl): \\n\",");
975 sv_catpv(PL_Sv,"\" Compile-time options:");
977 sv_catpv(PL_Sv," DEBUGGING");
980 sv_catpv(PL_Sv," MULTIPLICITY");
983 sv_catpv(PL_Sv," USE_THREADS");
986 sv_catpv(PL_Sv," USE_ITHREADS");
988 # ifdef USE_64_BIT_INT
989 sv_catpv(PL_Sv," USE_64_BIT_INT");
991 # ifdef USE_64_BIT_ALL
992 sv_catpv(PL_Sv," USE_64_BIT_ALL");
994 # ifdef USE_LONG_DOUBLE
995 sv_catpv(PL_Sv," USE_LONG_DOUBLE");
997 # ifdef USE_LARGE_FILES
998 sv_catpv(PL_Sv," USE_LARGE_FILES");
1001 sv_catpv(PL_Sv," USE_SOCKS");
1004 sv_catpv(PL_Sv," PERL_OBJECT");
1006 # ifdef PERL_IMPLICIT_CONTEXT
1007 sv_catpv(PL_Sv," PERL_IMPLICIT_CONTEXT");
1009 # ifdef PERL_IMPLICIT_SYS
1010 sv_catpv(PL_Sv," PERL_IMPLICIT_SYS");
1012 sv_catpv(PL_Sv,"\\n\",");
1014 #if defined(LOCAL_PATCH_COUNT)
1015 if (LOCAL_PATCH_COUNT > 0) {
1017 sv_catpv(PL_Sv,"\" Locally applied patches:\\n\",");
1018 for (i = 1; i <= LOCAL_PATCH_COUNT; i++) {
1019 if (PL_localpatches[i])
1020 Perl_sv_catpvf(aTHX_ PL_Sv,"q\" \t%s\n\",",PL_localpatches[i]);
1024 Perl_sv_catpvf(aTHX_ PL_Sv,"\" Built under %s\\n\"",OSNAME);
1027 Perl_sv_catpvf(aTHX_ PL_Sv,",\" Compiled at %s %s\\n\"",__DATE__,__TIME__);
1029 Perl_sv_catpvf(aTHX_ PL_Sv,",\" Compiled on %s\\n\"",__DATE__);
1032 sv_catpv(PL_Sv, "; \
1034 @env = map { \"$_=\\\"$ENV{$_}\\\"\" } sort grep {/^PERL/} keys %ENV; \
1035 print \" \\%ENV:\\n @env\\n\" if @env; \
1036 print \" \\@INC:\\n @INC\\n\";");
1039 PL_Sv = newSVpv("config_vars(qw(",0);
1040 sv_catpv(PL_Sv, ++s);
1041 sv_catpv(PL_Sv, "))");
1044 av_push(PL_preambleav, PL_Sv);
1045 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
1048 PL_doextract = TRUE;
1056 if (!*++s || isSPACE(*s)) {
1060 /* catch use of gnu style long options */
1061 if (strEQ(s, "version")) {
1065 if (strEQ(s, "help")) {
1072 Perl_croak(aTHX_ "Unrecognized switch: -%s (-h will show valid options)",s);
1078 #ifndef SECURE_INTERNAL_GETENV
1081 (s = PerlEnv_getenv("PERL5OPT")))
1085 if (*s == '-' && *(s+1) == 'T')
1098 if (!strchr("DIMUdmw", *s))
1099 Perl_croak(aTHX_ "Illegal switch in PERL5OPT: -%c", *s);
1100 s = moreswitches(s);
1106 scriptname = argv[0];
1109 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
1111 else if (scriptname == Nullch) {
1113 if ( PerlLIO_isatty(PerlIO_fileno(PerlIO_stdin())) )
1121 open_script(scriptname,dosearch,sv,&fdscript);
1123 validate_suid(validarg, scriptname,fdscript);
1125 #if defined(SIGCHLD) || defined(SIGCLD)
1128 # define SIGCHLD SIGCLD
1130 Sighandler_t sigstate = rsignal_state(SIGCHLD);
1131 if (sigstate == SIG_IGN) {
1132 if (ckWARN(WARN_SIGNAL))
1133 Perl_warner(aTHX_ WARN_SIGNAL,
1134 "Can't ignore signal CHLD, forcing to default");
1135 (void)rsignal(SIGCHLD, (Sighandler_t)SIG_DFL);
1142 if (cddir && PerlDir_chdir(cddir) < 0)
1143 Perl_croak(aTHX_ "Can't chdir to %s",cddir);
1147 PL_main_cv = PL_compcv = (CV*)NEWSV(1104,0);
1148 sv_upgrade((SV *)PL_compcv, SVt_PVCV);
1149 CvUNIQUE_on(PL_compcv);
1151 PL_comppad = newAV();
1152 av_push(PL_comppad, Nullsv);
1153 PL_curpad = AvARRAY(PL_comppad);
1154 PL_comppad_name = newAV();
1155 PL_comppad_name_fill = 0;
1156 PL_min_intro_pending = 0;
1159 av_store(PL_comppad_name, 0, newSVpvn("@_", 2));
1160 PL_curpad[0] = (SV*)newAV();
1161 SvPADMY_on(PL_curpad[0]); /* XXX Needed? */
1162 CvOWNER(PL_compcv) = 0;
1163 New(666, CvMUTEXP(PL_compcv), 1, perl_mutex);
1164 MUTEX_INIT(CvMUTEXP(PL_compcv));
1165 #endif /* USE_THREADS */
1167 comppadlist = newAV();
1168 AvREAL_off(comppadlist);
1169 av_store(comppadlist, 0, (SV*)PL_comppad_name);
1170 av_store(comppadlist, 1, (SV*)PL_comppad);
1171 CvPADLIST(PL_compcv) = comppadlist;
1173 boot_core_UNIVERSAL();
1175 boot_core_xsutils();
1179 (*xsinit)(aTHXo); /* in case linked C routines want magical variables */
1180 #if defined(VMS) || defined(WIN32) || defined(DJGPP) || defined(__CYGWIN__)
1188 init_predump_symbols();
1189 /* init_postdump_symbols not currently designed to be called */
1190 /* more than once (ENV isn't cleared first, for example) */
1191 /* But running with -u leaves %ENV & @ARGV undefined! XXX */
1193 init_postdump_symbols(argc,argv,env);
1197 /* now parse the script */
1199 SETERRNO(0,SS$_NORMAL);
1201 if (yyparse() || PL_error_count) {
1203 Perl_croak(aTHX_ "%s had compilation errors.\n", PL_origfilename);
1205 Perl_croak(aTHX_ "Execution of %s aborted due to compilation errors.\n",
1209 CopLINE_set(PL_curcop, 0);
1210 PL_curstash = PL_defstash;
1211 PL_preprocess = FALSE;
1213 SvREFCNT_dec(PL_e_script);
1214 PL_e_script = Nullsv;
1217 /* now that script is parsed, we can modify record separator */
1218 SvREFCNT_dec(PL_rs);
1219 PL_rs = SvREFCNT_inc(PL_nrs);
1220 sv_setsv(get_sv("/", TRUE), PL_rs);
1225 SAVECOPFILE(PL_curcop);
1226 SAVECOPLINE(PL_curcop);
1227 gv_check(PL_defstash);
1234 if ((s=PerlEnv_getenv("PERL_DEBUG_MSTATS")) && atoi(s) >= 2)
1235 dump_mstats("after compilation:");
1244 =for apidoc perl_run
1246 Tells a Perl interpreter to run. See L<perlembed>.
1262 oldscope = PL_scopestack_ix;
1264 #ifdef PERL_FLEXIBLE_EXCEPTIONS
1266 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vrun_body), oldscope);
1272 cxstack_ix = -1; /* start context stack again */
1274 case 0: /* normal completion */
1275 #ifndef PERL_FLEXIBLE_EXCEPTIONS
1280 case 2: /* my_exit() */
1281 while (PL_scopestack_ix > oldscope)
1284 PL_curstash = PL_defstash;
1285 if (PL_endav && !PL_minus_c)
1286 call_list(oldscope, PL_endav);
1288 if (PerlEnv_getenv("PERL_DEBUG_MSTATS"))
1289 dump_mstats("after execution: ");
1291 ret = STATUS_NATIVE_EXPORT;
1295 POPSTACK_TO(PL_mainstack);
1298 PerlIO_printf(Perl_error_log, "panic: restartop\n");
1308 #ifdef PERL_FLEXIBLE_EXCEPTIONS
1310 S_vrun_body(pTHX_ va_list args)
1312 I32 oldscope = va_arg(args, I32);
1314 return run_body(oldscope);
1320 S_run_body(pTHX_ I32 oldscope)
1324 DEBUG_r(PerlIO_printf(Perl_debug_log, "%s $` $& $' support.\n",
1325 PL_sawampersand ? "Enabling" : "Omitting"));
1327 if (!PL_restartop) {
1328 DEBUG_x(dump_all());
1329 DEBUG(PerlIO_printf(Perl_debug_log, "\nEXECUTING...\n\n"));
1330 DEBUG_S(PerlIO_printf(Perl_debug_log, "main thread is 0x%"UVxf"\n",
1334 PerlIO_printf(Perl_error_log, "%s syntax OK\n", PL_origfilename);
1337 if (PERLDB_SINGLE && PL_DBsingle)
1338 sv_setiv(PL_DBsingle, 1);
1340 call_list(oldscope, PL_initav);
1346 PL_op = PL_restartop;
1350 else if (PL_main_start) {
1351 CvDEPTH(PL_main_cv) = 1;
1352 PL_op = PL_main_start;
1362 =for apidoc p||get_sv
1364 Returns the SV of the specified Perl scalar. If C<create> is set and the
1365 Perl variable does not exist then it will be created. If C<create> is not
1366 set and the variable does not exist then NULL is returned.
1372 Perl_get_sv(pTHX_ const char *name, I32 create)
1376 if (name[1] == '\0' && !isALPHA(name[0])) {
1377 PADOFFSET tmp = find_threadsv(name);
1378 if (tmp != NOT_IN_PAD) {
1380 return THREADSV(tmp);
1383 #endif /* USE_THREADS */
1384 gv = gv_fetchpv(name, create, SVt_PV);
1391 =for apidoc p||get_av
1393 Returns the AV of the specified Perl array. If C<create> is set and the
1394 Perl variable does not exist then it will be created. If C<create> is not
1395 set and the variable does not exist then NULL is returned.
1401 Perl_get_av(pTHX_ const char *name, I32 create)
1403 GV* gv = gv_fetchpv(name, create, SVt_PVAV);
1412 =for apidoc p||get_hv
1414 Returns the HV of the specified Perl hash. If C<create> is set and the
1415 Perl variable does not exist then it will be created. If C<create> is not
1416 set and the variable does not exist then NULL is returned.
1422 Perl_get_hv(pTHX_ const char *name, I32 create)
1424 GV* gv = gv_fetchpv(name, create, SVt_PVHV);
1433 =for apidoc p||get_cv
1435 Returns the CV of the specified Perl subroutine. If C<create> is set and
1436 the Perl subroutine does not exist then it will be declared (which has the
1437 same effect as saying C<sub name;>). If C<create> is not set and the
1438 subroutine does not exist then NULL is returned.
1444 Perl_get_cv(pTHX_ const char *name, I32 create)
1446 GV* gv = gv_fetchpv(name, create, SVt_PVCV);
1447 /* XXX unsafe for threads if eval_owner isn't held */
1448 /* XXX this is probably not what they think they're getting.
1449 * It has the same effect as "sub name;", i.e. just a forward
1451 if (create && !GvCVu(gv))
1452 return newSUB(start_subparse(FALSE, 0),
1453 newSVOP(OP_CONST, 0, newSVpv(name,0)),
1461 /* Be sure to refetch the stack pointer after calling these routines. */
1464 =for apidoc p||call_argv
1466 Performs a callback to the specified Perl sub. See L<perlcall>.
1472 Perl_call_argv(pTHX_ const char *sub_name, I32 flags, register char **argv)
1474 /* See G_* flags in cop.h */
1475 /* null terminated arg list */
1482 XPUSHs(sv_2mortal(newSVpv(*argv,0)));
1487 return call_pv(sub_name, flags);
1491 =for apidoc p||call_pv
1493 Performs a callback to the specified Perl sub. See L<perlcall>.
1499 Perl_call_pv(pTHX_ const char *sub_name, I32 flags)
1500 /* name of the subroutine */
1501 /* See G_* flags in cop.h */
1503 return call_sv((SV*)get_cv(sub_name, TRUE), flags);
1507 =for apidoc p||call_method
1509 Performs a callback to the specified Perl method. The blessed object must
1510 be on the stack. See L<perlcall>.
1516 Perl_call_method(pTHX_ const char *methname, I32 flags)
1517 /* name of the subroutine */
1518 /* See G_* flags in cop.h */
1526 XPUSHs(sv_2mortal(newSVpv(methname,0)));
1531 return call_sv(*PL_stack_sp--, flags);
1534 /* May be called with any of a CV, a GV, or an SV containing the name. */
1536 =for apidoc p||call_sv
1538 Performs a callback to the Perl sub whose name is in the SV. See
1545 Perl_call_sv(pTHX_ SV *sv, I32 flags)
1547 /* See G_* flags in cop.h */
1550 LOGOP myop; /* fake syntax tree node */
1554 bool oldcatch = CATCH_GET;
1559 if (flags & G_DISCARD) {
1564 Zero(&myop, 1, LOGOP);
1565 myop.op_next = Nullop;
1566 if (!(flags & G_NOARGS))
1567 myop.op_flags |= OPf_STACKED;
1568 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1569 (flags & G_ARRAY) ? OPf_WANT_LIST :
1574 EXTEND(PL_stack_sp, 1);
1575 *++PL_stack_sp = sv;
1577 oldscope = PL_scopestack_ix;
1579 if (PERLDB_SUB && PL_curstash != PL_debstash
1580 /* Handle first BEGIN of -d. */
1581 && (PL_DBcv || (PL_DBcv = GvCV(PL_DBsub)))
1582 /* Try harder, since this may have been a sighandler, thus
1583 * curstash may be meaningless. */
1584 && (SvTYPE(sv) != SVt_PVCV || CvSTASH((CV*)sv) != PL_debstash)
1585 && !(flags & G_NODEBUG))
1586 PL_op->op_private |= OPpENTERSUB_DB;
1588 if (!(flags & G_EVAL)) {
1590 call_body((OP*)&myop, FALSE);
1591 retval = PL_stack_sp - (PL_stack_base + oldmark);
1592 CATCH_SET(oldcatch);
1595 cLOGOP->op_other = PL_op;
1597 /* we're trying to emulate pp_entertry() here */
1599 register PERL_CONTEXT *cx;
1600 I32 gimme = GIMME_V;
1605 push_return(PL_op->op_next);
1606 PUSHBLOCK(cx, CXt_EVAL, PL_stack_sp);
1608 PL_eval_root = PL_op; /* Only needed so that goto works right. */
1610 PL_in_eval = EVAL_INEVAL;
1611 if (flags & G_KEEPERR)
1612 PL_in_eval |= EVAL_KEEPERR;
1618 #ifdef PERL_FLEXIBLE_EXCEPTIONS
1620 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vcall_body),
1627 #ifndef PERL_FLEXIBLE_EXCEPTIONS
1629 call_body((OP*)&myop, FALSE);
1631 retval = PL_stack_sp - (PL_stack_base + oldmark);
1632 if (!(flags & G_KEEPERR))
1639 /* my_exit() was called */
1640 PL_curstash = PL_defstash;
1643 if (PL_statusvalue && !(PL_exit_flags & PERL_EXIT_EXPECTED))
1644 Perl_croak(aTHX_ "Callback called exit");
1649 PL_op = PL_restartop;
1653 PL_stack_sp = PL_stack_base + oldmark;
1654 if (flags & G_ARRAY)
1658 *++PL_stack_sp = &PL_sv_undef;
1663 if (PL_scopestack_ix > oldscope) {
1667 register PERL_CONTEXT *cx;
1679 if (flags & G_DISCARD) {
1680 PL_stack_sp = PL_stack_base + oldmark;
1689 #ifdef PERL_FLEXIBLE_EXCEPTIONS
1691 S_vcall_body(pTHX_ va_list args)
1693 OP *myop = va_arg(args, OP*);
1694 int is_eval = va_arg(args, int);
1696 call_body(myop, is_eval);
1702 S_call_body(pTHX_ OP *myop, int is_eval)
1706 if (PL_op == myop) {
1708 PL_op = Perl_pp_entereval(aTHX);
1710 PL_op = Perl_pp_entersub(aTHX);
1716 /* Eval a string. The G_EVAL flag is always assumed. */
1719 =for apidoc p||eval_sv
1721 Tells Perl to C<eval> the string in the SV.
1727 Perl_eval_sv(pTHX_ SV *sv, I32 flags)
1729 /* See G_* flags in cop.h */
1732 UNOP myop; /* fake syntax tree node */
1733 I32 oldmark = SP - PL_stack_base;
1740 if (flags & G_DISCARD) {
1747 Zero(PL_op, 1, UNOP);
1748 EXTEND(PL_stack_sp, 1);
1749 *++PL_stack_sp = sv;
1750 oldscope = PL_scopestack_ix;
1752 if (!(flags & G_NOARGS))
1753 myop.op_flags = OPf_STACKED;
1754 myop.op_next = Nullop;
1755 myop.op_type = OP_ENTEREVAL;
1756 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1757 (flags & G_ARRAY) ? OPf_WANT_LIST :
1759 if (flags & G_KEEPERR)
1760 myop.op_flags |= OPf_SPECIAL;
1762 #ifdef PERL_FLEXIBLE_EXCEPTIONS
1764 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vcall_body),
1771 #ifndef PERL_FLEXIBLE_EXCEPTIONS
1773 call_body((OP*)&myop,TRUE);
1775 retval = PL_stack_sp - (PL_stack_base + oldmark);
1776 if (!(flags & G_KEEPERR))
1783 /* my_exit() was called */
1784 PL_curstash = PL_defstash;
1787 if (PL_statusvalue && !(PL_exit_flags & PERL_EXIT_EXPECTED))
1788 Perl_croak(aTHX_ "Callback called exit");
1793 PL_op = PL_restartop;
1797 PL_stack_sp = PL_stack_base + oldmark;
1798 if (flags & G_ARRAY)
1802 *++PL_stack_sp = &PL_sv_undef;
1808 if (flags & G_DISCARD) {
1809 PL_stack_sp = PL_stack_base + oldmark;
1819 =for apidoc p||eval_pv
1821 Tells Perl to C<eval> the given string and return an SV* result.
1827 Perl_eval_pv(pTHX_ const char *p, I32 croak_on_error)
1830 SV* sv = newSVpv(p, 0);
1833 eval_sv(sv, G_SCALAR);
1840 if (croak_on_error && SvTRUE(ERRSV)) {
1842 Perl_croak(aTHX_ SvPVx(ERRSV, n_a));
1848 /* Require a module. */
1851 =for apidoc p||require_pv
1853 Tells Perl to C<require> a module.
1859 Perl_require_pv(pTHX_ const char *pv)
1863 PUSHSTACKi(PERLSI_REQUIRE);
1865 sv = sv_newmortal();
1866 sv_setpv(sv, "require '");
1869 eval_sv(sv, G_DISCARD);
1875 Perl_magicname(pTHX_ char *sym, char *name, I32 namlen)
1879 if (gv = gv_fetchpv(sym,TRUE, SVt_PV))
1880 sv_magic(GvSV(gv), (SV*)gv, 0, name, namlen);
1884 S_usage(pTHX_ char *name) /* XXX move this out into a module ? */
1886 /* This message really ought to be max 23 lines.
1887 * Removed -h because the user already knows that opton. Others? */
1889 static char *usage_msg[] = {
1890 "-0[octal] specify record separator (\\0, if no argument)",
1891 "-a autosplit mode with -n or -p (splits $_ into @F)",
1892 "-C enable native wide character system interfaces",
1893 "-c check syntax only (runs BEGIN and END blocks)",
1894 "-d[:debugger] run program under debugger",
1895 "-D[number/list] set debugging flags (argument is a bit mask or alphabets)",
1896 "-e 'command' one line of program (several -e's allowed, omit programfile)",
1897 "-F/pattern/ split() pattern for -a switch (//'s are optional)",
1898 "-i[extension] edit <> files in place (makes backup if extension supplied)",
1899 "-Idirectory specify @INC/#include directory (several -I's allowed)",
1900 "-l[octal] enable line ending processing, specifies line terminator",
1901 "-[mM][-]module execute `use/no module...' before executing program",
1902 "-n assume 'while (<>) { ... }' loop around program",
1903 "-p assume loop like -n but print line also, like sed",
1904 "-P run program through C preprocessor before compilation",
1905 "-s enable rudimentary parsing for switches after programfile",
1906 "-S look for programfile using PATH environment variable",
1907 "-T enable tainting checks",
1908 "-u dump core after parsing program",
1909 "-U allow unsafe operations",
1910 "-v print version, subversion (includes VERY IMPORTANT perl info)",
1911 "-V[:variable] print configuration summary (or a single Config.pm variable)",
1912 "-w enable many useful warnings (RECOMMENDED)",
1913 "-W enable all warnings",
1914 "-X disable all warnings",
1915 "-x[directory] strip off text before #!perl line and perhaps cd to directory",
1919 char **p = usage_msg;
1921 printf("\nUsage: %s [switches] [--] [programfile] [arguments]", name);
1923 printf("\n %s", *p++);
1926 /* This routine handles any switches that can be given during run */
1929 Perl_moreswitches(pTHX_ char *s)
1938 rschar = (U32)scan_oct(s, 4, &numlen);
1939 SvREFCNT_dec(PL_nrs);
1940 if (rschar & ~((U8)~0))
1941 PL_nrs = &PL_sv_undef;
1942 else if (!rschar && numlen >= 2)
1943 PL_nrs = newSVpvn("", 0);
1946 PL_nrs = newSVpvn(&ch, 1);
1951 PL_widesyscalls = TRUE;
1956 PL_splitstr = savepv(s + 1);
1970 if (*s == ':' || *s == '=') {
1971 my_setenv("PERL5DB", Perl_form(aTHX_ "use Devel::%s;", ++s));
1975 PL_perldb = PERLDB_ALL;
1983 if (isALPHA(s[1])) {
1984 static char debopts[] = "psltocPmfrxuLHXDS";
1987 for (s++; *s && (d = strchr(debopts,*s)); s++)
1988 PL_debug |= 1 << (d - debopts);
1991 PL_debug = atoi(s+1);
1992 for (s++; isDIGIT(*s); s++) ;
1994 PL_debug |= 0x80000000;
1997 if (ckWARN_d(WARN_DEBUGGING))
1998 Perl_warner(aTHX_ WARN_DEBUGGING,
1999 "Recompile perl with -DDEBUGGING to use -D switch\n");
2000 for (s++; isALNUM(*s); s++) ;
2006 usage(PL_origargv[0]);
2010 Safefree(PL_inplace);
2011 PL_inplace = savepv(s+1);
2013 for (s = PL_inplace; *s && !isSPACE(*s); s++) ;
2016 if (*s == '-') /* Additional switches on #! line. */
2020 case 'I': /* -I handled both here and in parse_perl() */
2023 while (*s && isSPACE(*s))
2028 /* ignore trailing spaces (possibly followed by other switches) */
2030 for (e = p; *e && !isSPACE(*e); e++) ;
2034 } while (*p && *p != '-');
2035 e = savepvn(s, e-s);
2043 Perl_croak(aTHX_ "No directory specified for -I");
2051 PL_ors = savepv("\n");
2053 *PL_ors = (char)scan_oct(s, 3 + (*s == '0'), &numlen);
2058 if (RsPARA(PL_nrs)) {
2063 PL_ors = SvPV(PL_nrs, PL_orslen);
2064 PL_ors = savepvn(PL_ors, PL_orslen);
2068 forbid_setid("-M"); /* XXX ? */
2071 forbid_setid("-m"); /* XXX ? */
2076 /* -M-foo == 'no foo' */
2077 if (*s == '-') { use = "no "; ++s; }
2078 sv = newSVpv(use,0);
2080 /* We allow -M'Module qw(Foo Bar)' */
2081 while(isALNUM(*s) || *s==':') ++s;
2083 sv_catpv(sv, start);
2084 if (*(start-1) == 'm') {
2086 Perl_croak(aTHX_ "Can't use '%c' after -mname", *s);
2087 sv_catpv( sv, " ()");
2090 sv_catpvn(sv, start, s-start);
2091 sv_catpv(sv, " split(/,/,q{");
2097 PL_preambleav = newAV();
2098 av_push(PL_preambleav, sv);
2101 Perl_croak(aTHX_ "No space allowed after -%c", *(s-1));
2113 PL_doswitches = TRUE;
2118 Perl_croak(aTHX_ "Too late for \"-T\" option");
2122 PL_do_undump = TRUE;
2130 printf(Perl_form(aTHX_ "\nThis is perl, v%vd built for %s",
2131 PL_patchlevel, ARCHNAME));
2132 #if defined(LOCAL_PATCH_COUNT)
2133 if (LOCAL_PATCH_COUNT > 0)
2134 printf("\n(with %d registered patch%s, see perl -V for more detail)",
2135 (int)LOCAL_PATCH_COUNT, (LOCAL_PATCH_COUNT!=1) ? "es" : "");
2138 printf("\n\nCopyright 1987-2000, Larry Wall\n");
2140 printf("\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
2143 printf("djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n");
2144 printf("djgpp v2 port (perl5004+) by Laszlo Molnar, 1997-1999\n");
2147 printf("\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
2148 "Version 5 port Copyright (c) 1994-1999, Andreas Kaiser, Ilya Zakharevich\n");
2151 printf("atariST series port, ++jrb bammi@cadence.com\n");
2154 printf("BeOS port Copyright Tom Spindler, 1997-1999\n");
2157 printf("MPE/iX port Copyright by Mark Klein and Mark Bixby, 1996-1999\n");
2160 printf("MVS (OS390) port by Mortice Kern Systems, 1997-1999\n");
2163 printf("Stratus VOS port by Paul_Green@stratus.com, 1997-1999\n");
2166 printf("VM/ESA port by Neale Ferguson, 1998-1999\n");
2169 printf("BS2000 (POSIX) port by Start Amadeus GmbH, 1998-1999\n");
2172 printf("MiNT port by Guido Flohr, 1997-1999\n");
2175 printf("EPOC port by Olaf Flebbe, 1999-2000\n");
2177 #ifdef BINARY_BUILD_NOTICE
2178 BINARY_BUILD_NOTICE;
2181 Perl may be copied only under the terms of either the Artistic License or the\n\
2182 GNU General Public License, which may be found in the Perl 5.0 source kit.\n\n\
2183 Complete documentation for Perl, including FAQ lists, should be found on\n\
2184 this system using `man perl' or `perldoc perl'. If you have access to the\n\
2185 Internet, point your browser at http://www.perl.com/, the Perl Home Page.\n\n");
2188 if (! (PL_dowarn & G_WARN_ALL_MASK))
2189 PL_dowarn |= G_WARN_ON;
2193 PL_dowarn = G_WARN_ALL_ON|G_WARN_ON;
2194 PL_compiling.cop_warnings = WARN_ALL ;
2198 PL_dowarn = G_WARN_ALL_OFF;
2199 PL_compiling.cop_warnings = WARN_NONE ;
2204 if (s[1] == '-') /* Additional switches on #! line. */
2209 #if defined(WIN32) || !defined(PERL_STRICT_CR)
2215 #ifdef ALTERNATE_SHEBANG
2216 case 'S': /* OS/2 needs -S on "extproc" line. */
2224 Perl_croak(aTHX_ "Can't emulate -%.1s on #! line",s);
2229 /* compliments of Tom Christiansen */
2231 /* unexec() can be found in the Gnu emacs distribution */
2232 /* Known to work with -DUNEXEC and using unexelf.c from GNU emacs-20.2 */
2235 Perl_my_unexec(pTHX)
2243 prog = newSVpv(BIN_EXP, 0);
2244 sv_catpv(prog, "/perl");
2245 file = newSVpv(PL_origfilename, 0);
2246 sv_catpv(file, ".perldump");
2248 unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
2249 /* unexec prints msg to stderr in case of failure */
2250 PerlProc_exit(status);
2253 # include <lib$routines.h>
2254 lib$signal(SS$_DEBUG); /* ssdef.h #included from vmsish.h */
2256 ABORT(); /* for use with undump */
2261 /* initialize curinterp */
2266 #ifdef PERL_OBJECT /* XXX kludge */
2269 PL_chopset = " \n-"; \
2270 PL_copline = NOLINE; \
2271 PL_curcop = &PL_compiling;\
2272 PL_curcopdb = NULL; \
2274 PL_dumpindent = 4; \
2275 PL_laststatval = -1; \
2276 PL_laststype = OP_STAT; \
2277 PL_maxscream = -1; \
2278 PL_maxsysfd = MAXSYSFD; \
2279 PL_statname = Nullsv; \
2280 PL_tmps_floor = -1; \
2282 PL_op_mask = NULL; \
2283 PL_laststatval = -1; \
2284 PL_laststype = OP_STAT; \
2285 PL_mess_sv = Nullsv; \
2286 PL_splitstr = " "; \
2287 PL_generation = 100; \
2288 PL_exitlist = NULL; \
2289 PL_exitlistlen = 0; \
2291 PL_in_clean_objs = FALSE; \
2292 PL_in_clean_all = FALSE; \
2293 PL_profiledata = NULL; \
2295 PL_rsfp_filters = Nullav; \
2300 # ifdef MULTIPLICITY
2301 # define PERLVAR(var,type)
2302 # define PERLVARA(var,n,type)
2303 # if defined(PERL_IMPLICIT_CONTEXT)
2304 # if defined(USE_THREADS)
2305 # define PERLVARI(var,type,init) PERL_GET_INTERP->var = init;
2306 # define PERLVARIC(var,type,init) PERL_GET_INTERP->var = init;
2307 # else /* !USE_THREADS */
2308 # define PERLVARI(var,type,init) aTHX->var = init;
2309 # define PERLVARIC(var,type,init) aTHX->var = init;
2310 # endif /* USE_THREADS */
2312 # define PERLVARI(var,type,init) PERL_GET_INTERP->var = init;
2313 # define PERLVARIC(var,type,init) PERL_GET_INTERP->var = init;
2315 # include "intrpvar.h"
2316 # ifndef USE_THREADS
2317 # include "thrdvar.h"
2324 # define PERLVAR(var,type)
2325 # define PERLVARA(var,n,type)
2326 # define PERLVARI(var,type,init) PL_##var = init;
2327 # define PERLVARIC(var,type,init) PL_##var = init;
2328 # include "intrpvar.h"
2329 # ifndef USE_THREADS
2330 # include "thrdvar.h"
2342 S_init_main_stash(pTHX)
2347 /* Note that strtab is a rather special HV. Assumptions are made
2348 about not iterating on it, and not adding tie magic to it.
2349 It is properly deallocated in perl_destruct() */
2350 PL_strtab = newHV();
2352 MUTEX_INIT(&PL_strtab_mutex);
2354 HvSHAREKEYS_off(PL_strtab); /* mandatory */
2355 hv_ksplit(PL_strtab, 512);
2357 PL_curstash = PL_defstash = newHV();
2358 PL_curstname = newSVpvn("main",4);
2359 gv = gv_fetchpv("main::",TRUE, SVt_PVHV);
2360 SvREFCNT_dec(GvHV(gv));
2361 GvHV(gv) = (HV*)SvREFCNT_inc(PL_defstash);
2363 HvNAME(PL_defstash) = savepv("main");
2364 PL_incgv = gv_HVadd(gv_AVadd(gv_fetchpv("INC",TRUE, SVt_PVAV)));
2365 GvMULTI_on(PL_incgv);
2366 PL_hintgv = gv_fetchpv("\010",TRUE, SVt_PV); /* ^H */
2367 GvMULTI_on(PL_hintgv);
2368 PL_defgv = gv_fetchpv("_",TRUE, SVt_PVAV);
2369 PL_errgv = gv_HVadd(gv_fetchpv("@", TRUE, SVt_PV));
2370 GvMULTI_on(PL_errgv);
2371 PL_replgv = gv_fetchpv("\022", TRUE, SVt_PV); /* ^R */
2372 GvMULTI_on(PL_replgv);
2373 (void)Perl_form(aTHX_ "%240s",""); /* Preallocate temp - for immediate signals. */
2374 sv_grow(ERRSV, 240); /* Preallocate - for immediate signals. */
2375 sv_setpvn(ERRSV, "", 0);
2376 PL_curstash = PL_defstash;
2377 CopSTASH_set(&PL_compiling, PL_defstash);
2378 PL_debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
2379 PL_globalstash = GvHV(gv_fetchpv("CORE::GLOBAL::", GV_ADDMULTI, SVt_PVHV));
2380 /* We must init $/ before switches are processed. */
2381 sv_setpvn(get_sv("/", TRUE), "\n", 1);
2385 S_open_script(pTHX_ char *scriptname, bool dosearch, SV *sv, int *fdscript)
2393 PL_origfilename = savepv("-e");
2396 /* if find_script() returns, it returns a malloc()-ed value */
2397 PL_origfilename = scriptname = find_script(scriptname, dosearch, NULL, 1);
2399 if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
2400 char *s = scriptname + 8;
2401 *fdscript = atoi(s);
2405 scriptname = savepv(s + 1);
2406 Safefree(PL_origfilename);
2407 PL_origfilename = scriptname;
2412 CopFILE_set(PL_curcop, PL_origfilename);
2413 if (strEQ(PL_origfilename,"-"))
2415 if (*fdscript >= 0) {
2416 PL_rsfp = PerlIO_fdopen(*fdscript,PERL_SCRIPT_MODE);
2417 #if defined(HAS_FCNTL) && defined(F_SETFD)
2419 fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,1); /* ensure close-on-exec */
2422 else if (PL_preprocess) {
2423 char *cpp_cfg = CPPSTDIN;
2424 SV *cpp = newSVpvn("",0);
2425 SV *cmd = NEWSV(0,0);
2427 if (strEQ(cpp_cfg, "cppstdin"))
2428 Perl_sv_catpvf(aTHX_ cpp, "%s/", BIN_EXP);
2429 sv_catpv(cpp, cpp_cfg);
2431 sv_catpvn(sv, "-I", 2);
2432 sv_catpv(sv,PRIVLIB_EXP);
2435 Perl_sv_setpvf(aTHX_ cmd, "\
2436 sed %s -e \"/^[^#]/b\" \
2437 -e \"/^#[ ]*include[ ]/b\" \
2438 -e \"/^#[ ]*define[ ]/b\" \
2439 -e \"/^#[ ]*if[ ]/b\" \
2440 -e \"/^#[ ]*ifdef[ ]/b\" \
2441 -e \"/^#[ ]*ifndef[ ]/b\" \
2442 -e \"/^#[ ]*else/b\" \
2443 -e \"/^#[ ]*elif[ ]/b\" \
2444 -e \"/^#[ ]*undef[ ]/b\" \
2445 -e \"/^#[ ]*endif/b\" \
2447 %s | %"SVf" -C %"SVf" %s",
2448 (PL_doextract ? "-e \"1,/^#/d\n\"" : ""),
2451 Perl_sv_setpvf(aTHX_ cmd, "\
2452 %s %s -e '/^[^#]/b' \
2453 -e '/^#[ ]*include[ ]/b' \
2454 -e '/^#[ ]*define[ ]/b' \
2455 -e '/^#[ ]*if[ ]/b' \
2456 -e '/^#[ ]*ifdef[ ]/b' \
2457 -e '/^#[ ]*ifndef[ ]/b' \
2458 -e '/^#[ ]*else/b' \
2459 -e '/^#[ ]*elif[ ]/b' \
2460 -e '/^#[ ]*undef[ ]/b' \
2461 -e '/^#[ ]*endif/b' \
2463 %s | %"SVf" %"SVf" %s",
2465 Perl_sv_setpvf(aTHX_ cmd, "\
2466 %s %s -e '/^[^#]/b' \
2467 -e '/^#[ ]*include[ ]/b' \
2468 -e '/^#[ ]*define[ ]/b' \
2469 -e '/^#[ ]*if[ ]/b' \
2470 -e '/^#[ ]*ifdef[ ]/b' \
2471 -e '/^#[ ]*ifndef[ ]/b' \
2472 -e '/^#[ ]*else/b' \
2473 -e '/^#[ ]*elif[ ]/b' \
2474 -e '/^#[ ]*undef[ ]/b' \
2475 -e '/^#[ ]*endif/b' \
2477 %s | %"SVf" -C %"SVf" %s",
2484 (PL_doextract ? "-e '1,/^#/d\n'" : ""),
2486 scriptname, cpp, sv, CPPMINUS);
2487 PL_doextract = FALSE;
2488 #ifdef IAMSUID /* actually, this is caught earlier */
2489 if (PL_euid != PL_uid && !PL_euid) { /* if running suidperl */
2491 (void)seteuid(PL_uid); /* musn't stay setuid root */
2494 (void)setreuid((Uid_t)-1, PL_uid);
2496 #ifdef HAS_SETRESUID
2497 (void)setresuid((Uid_t)-1, PL_uid, (Uid_t)-1);
2499 PerlProc_setuid(PL_uid);
2503 if (PerlProc_geteuid() != PL_uid)
2504 Perl_croak(aTHX_ "Can't do seteuid!\n");
2506 #endif /* IAMSUID */
2507 PL_rsfp = PerlProc_popen(SvPVX(cmd), "r");
2511 else if (!*scriptname) {
2512 forbid_setid("program input from stdin");
2513 PL_rsfp = PerlIO_stdin();
2516 PL_rsfp = PerlIO_open(scriptname,PERL_SCRIPT_MODE);
2517 #if defined(HAS_FCNTL) && defined(F_SETFD)
2519 fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,1); /* ensure close-on-exec */
2524 #ifndef IAMSUID /* in case script is not readable before setuid */
2526 PerlLIO_stat(CopFILE(PL_curcop),&PL_statbuf) >= 0 &&
2527 PL_statbuf.st_mode & (S_ISUID|S_ISGID))
2530 PerlProc_execv(Perl_form(aTHX_ "%s/sperl"PERL_FS_VER_FMT, BIN_EXP,
2531 (int)PERL_REVISION, (int)PERL_VERSION,
2532 (int)PERL_SUBVERSION), PL_origargv);
2533 Perl_croak(aTHX_ "Can't do setuid\n");
2537 Perl_croak(aTHX_ "Can't open perl script \"%s\": %s\n",
2538 CopFILE(PL_curcop), Strerror(errno));
2543 * I_SYSSTATVFS HAS_FSTATVFS
2545 * I_STATFS HAS_FSTATFS HAS_GETFSSTAT
2546 * I_MNTENT HAS_GETMNTENT HAS_HASMNTOPT
2547 * here so that metaconfig picks them up. */
2551 S_fd_on_nosuid_fs(pTHX_ int fd)
2553 int check_okay = 0; /* able to do all the required sys/libcalls */
2554 int on_nosuid = 0; /* the fd is on a nosuid fs */
2556 * Preferred order: fstatvfs(), fstatfs(), ustat()+getmnt(), getmntent().
2557 * fstatvfs() is UNIX98.
2558 * fstatfs() is 4.3 BSD.
2559 * ustat()+getmnt() is pre-4.3 BSD.
2560 * getmntent() is O(number-of-mounted-filesystems) and can hang on
2561 * an irrelevant filesystem while trying to reach the right one.
2564 # ifdef HAS_FSTATVFS
2565 struct statvfs stfs;
2566 check_okay = fstatvfs(fd, &stfs) == 0;
2567 on_nosuid = check_okay && (stfs.f_flag & ST_NOSUID);
2569 # ifdef PERL_MOUNT_NOSUID
2570 # if defined(HAS_FSTATFS) && \
2571 defined(HAS_STRUCT_STATFS) && \
2572 defined(HAS_STRUCT_STATFS_F_FLAGS)
2574 check_okay = fstatfs(fd, &stfs) == 0;
2575 on_nosuid = check_okay && (stfs.f_flags & PERL_MOUNT_NOSUID);
2577 # if defined(HAS_FSTAT) && \
2578 defined(HAS_USTAT) && \
2579 defined(HAS_GETMNT) && \
2580 defined(HAS_STRUCT_FS_DATA) && \
2583 if (fstat(fd, &fdst) == 0) {
2585 if (ustat(fdst.st_dev, &us) == 0) {
2587 /* NOSTAT_ONE here because we're not examining fields which
2588 * vary between that case and STAT_ONE. */
2589 if (getmnt((int*)0, &fsd, (int)0, NOSTAT_ONE, us.f_fname) == 0) {
2590 size_t cmplen = sizeof(us.f_fname);
2591 if (sizeof(fsd.fd_req.path) < cmplen)
2592 cmplen = sizeof(fsd.fd_req.path);
2593 if (strnEQ(fsd.fd_req.path, us.f_fname, cmplen) &&
2594 fdst.st_dev == fsd.fd_req.dev) {
2596 on_nosuid = fsd.fd_req.flags & PERL_MOUNT_NOSUID;
2602 # endif /* fstat+ustat+getmnt */
2603 # endif /* fstatfs */
2605 # if defined(HAS_GETMNTENT) && \
2606 defined(HAS_HASMNTOPT) && \
2607 defined(MNTOPT_NOSUID)
2608 FILE *mtab = fopen("/etc/mtab", "r");
2609 struct mntent *entry;
2610 struct stat stb, fsb;
2612 if (mtab && (fstat(fd, &stb) == 0)) {
2613 while (entry = getmntent(mtab)) {
2614 if (stat(entry->mnt_dir, &fsb) == 0
2615 && fsb.st_dev == stb.st_dev)
2617 /* found the filesystem */
2619 if (hasmntopt(entry, MNTOPT_NOSUID))
2622 } /* A single fs may well fail its stat(). */
2627 # endif /* getmntent+hasmntopt */
2628 # endif /* PERL_MOUNT_NOSUID: fstatfs or fstat+ustat+statfs */
2629 # endif /* statvfs */
2632 Perl_croak(aTHX_ "Can't check filesystem of script \"%s\" for nosuid", PL_origfilename);
2635 #endif /* IAMSUID */
2638 S_validate_suid(pTHX_ char *validarg, char *scriptname, int fdscript)
2642 /* do we need to emulate setuid on scripts? */
2644 /* This code is for those BSD systems that have setuid #! scripts disabled
2645 * in the kernel because of a security problem. Merely defining DOSUID
2646 * in perl will not fix that problem, but if you have disabled setuid
2647 * scripts in the kernel, this will attempt to emulate setuid and setgid
2648 * on scripts that have those now-otherwise-useless bits set. The setuid
2649 * root version must be called suidperl or sperlN.NNN. If regular perl
2650 * discovers that it has opened a setuid script, it calls suidperl with
2651 * the same argv that it had. If suidperl finds that the script it has
2652 * just opened is NOT setuid root, it sets the effective uid back to the
2653 * uid. We don't just make perl setuid root because that loses the
2654 * effective uid we had before invoking perl, if it was different from the
2657 * DOSUID must be defined in both perl and suidperl, and IAMSUID must
2658 * be defined in suidperl only. suidperl must be setuid root. The
2659 * Configure script will set this up for you if you want it.
2666 if (PerlLIO_fstat(PerlIO_fileno(PL_rsfp),&PL_statbuf) < 0) /* normal stat is insecure */
2667 Perl_croak(aTHX_ "Can't stat script \"%s\"",PL_origfilename);
2668 if (fdscript < 0 && PL_statbuf.st_mode & (S_ISUID|S_ISGID)) {
2673 #ifndef HAS_SETREUID
2674 /* On this access check to make sure the directories are readable,
2675 * there is actually a small window that the user could use to make
2676 * filename point to an accessible directory. So there is a faint
2677 * chance that someone could execute a setuid script down in a
2678 * non-accessible directory. I don't know what to do about that.
2679 * But I don't think it's too important. The manual lies when
2680 * it says access() is useful in setuid programs.
2682 if (PerlLIO_access(CopFILE(PL_curcop),1)) /*double check*/
2683 Perl_croak(aTHX_ "Permission denied");
2685 /* If we can swap euid and uid, then we can determine access rights
2686 * with a simple stat of the file, and then compare device and
2687 * inode to make sure we did stat() on the same file we opened.
2688 * Then we just have to make sure he or she can execute it.
2691 struct stat tmpstatbuf;
2695 setreuid(PL_euid,PL_uid) < 0
2698 setresuid(PL_euid,PL_uid,(Uid_t)-1) < 0
2701 || PerlProc_getuid() != PL_euid || PerlProc_geteuid() != PL_uid)
2702 Perl_croak(aTHX_ "Can't swap uid and euid"); /* really paranoid */
2703 if (PerlLIO_stat(CopFILE(PL_curcop),&tmpstatbuf) < 0)
2704 Perl_croak(aTHX_ "Permission denied"); /* testing full pathname here */
2705 #if defined(IAMSUID) && !defined(NO_NOSUID_CHECK)
2706 if (fd_on_nosuid_fs(PerlIO_fileno(PL_rsfp)))
2707 Perl_croak(aTHX_ "Permission denied");
2709 if (tmpstatbuf.st_dev != PL_statbuf.st_dev ||
2710 tmpstatbuf.st_ino != PL_statbuf.st_ino) {
2711 (void)PerlIO_close(PL_rsfp);
2712 if (PL_rsfp = PerlProc_popen("/bin/mail root","w")) { /* heh, heh */
2713 PerlIO_printf(PL_rsfp,
2714 "User %"Uid_t_f" tried to run dev %ld ino %ld in place of dev %ld ino %ld!\n\
2715 (Filename of set-id script was %s, uid %"Uid_t_f" gid %"Gid_t_f".)\n\nSincerely,\nperl\n",
2716 PL_uid,(long)tmpstatbuf.st_dev, (long)tmpstatbuf.st_ino,
2717 (long)PL_statbuf.st_dev, (long)PL_statbuf.st_ino,
2719 PL_statbuf.st_uid, PL_statbuf.st_gid);
2720 (void)PerlProc_pclose(PL_rsfp);
2722 Perl_croak(aTHX_ "Permission denied\n");
2726 setreuid(PL_uid,PL_euid) < 0
2728 # if defined(HAS_SETRESUID)
2729 setresuid(PL_uid,PL_euid,(Uid_t)-1) < 0
2732 || PerlProc_getuid() != PL_uid || PerlProc_geteuid() != PL_euid)
2733 Perl_croak(aTHX_ "Can't reswap uid and euid");
2734 if (!cando(S_IXUSR,FALSE,&PL_statbuf)) /* can real uid exec? */
2735 Perl_croak(aTHX_ "Permission denied\n");
2737 #endif /* HAS_SETREUID */
2738 #endif /* IAMSUID */
2740 if (!S_ISREG(PL_statbuf.st_mode))
2741 Perl_croak(aTHX_ "Permission denied");
2742 if (PL_statbuf.st_mode & S_IWOTH)
2743 Perl_croak(aTHX_ "Setuid/gid script is writable by world");
2744 PL_doswitches = FALSE; /* -s is insecure in suid */
2745 CopLINE_inc(PL_curcop);
2746 if (sv_gets(PL_linestr, PL_rsfp, 0) == Nullch ||
2747 strnNE(SvPV(PL_linestr,n_a),"#!",2) ) /* required even on Sys V */
2748 Perl_croak(aTHX_ "No #! line");
2749 s = SvPV(PL_linestr,n_a)+2;
2751 while (!isSPACE(*s)) s++;
2752 for (s2 = s; (s2 > SvPV(PL_linestr,n_a)+2 &&
2753 (isDIGIT(s2[-1]) || strchr("._-", s2[-1]))); s2--) ;
2754 if (strnNE(s2-4,"perl",4) && strnNE(s-9,"perl",4)) /* sanity check */
2755 Perl_croak(aTHX_ "Not a perl script");
2756 while (*s == ' ' || *s == '\t') s++;
2758 * #! arg must be what we saw above. They can invoke it by
2759 * mentioning suidperl explicitly, but they may not add any strange
2760 * arguments beyond what #! says if they do invoke suidperl that way.
2762 len = strlen(validarg);
2763 if (strEQ(validarg," PHOOEY ") ||
2764 strnNE(s,validarg,len) || !isSPACE(s[len]))
2765 Perl_croak(aTHX_ "Args must match #! line");
2768 if (PL_euid != PL_uid && (PL_statbuf.st_mode & S_ISUID) &&
2769 PL_euid == PL_statbuf.st_uid)
2771 Perl_croak(aTHX_ "YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2772 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2773 #endif /* IAMSUID */
2775 if (PL_euid) { /* oops, we're not the setuid root perl */
2776 (void)PerlIO_close(PL_rsfp);
2779 PerlProc_execv(Perl_form(aTHX_ "%s/sperl"PERL_FS_VER_FMT, BIN_EXP,
2780 (int)PERL_REVISION, (int)PERL_VERSION,
2781 (int)PERL_SUBVERSION), PL_origargv);
2783 Perl_croak(aTHX_ "Can't do setuid\n");
2786 if (PL_statbuf.st_mode & S_ISGID && PL_statbuf.st_gid != PL_egid) {
2788 (void)setegid(PL_statbuf.st_gid);
2791 (void)setregid((Gid_t)-1,PL_statbuf.st_gid);
2793 #ifdef HAS_SETRESGID
2794 (void)setresgid((Gid_t)-1,PL_statbuf.st_gid,(Gid_t)-1);
2796 PerlProc_setgid(PL_statbuf.st_gid);
2800 if (PerlProc_getegid() != PL_statbuf.st_gid)
2801 Perl_croak(aTHX_ "Can't do setegid!\n");
2803 if (PL_statbuf.st_mode & S_ISUID) {
2804 if (PL_statbuf.st_uid != PL_euid)
2806 (void)seteuid(PL_statbuf.st_uid); /* all that for this */
2809 (void)setreuid((Uid_t)-1,PL_statbuf.st_uid);
2811 #ifdef HAS_SETRESUID
2812 (void)setresuid((Uid_t)-1,PL_statbuf.st_uid,(Uid_t)-1);
2814 PerlProc_setuid(PL_statbuf.st_uid);
2818 if (PerlProc_geteuid() != PL_statbuf.st_uid)
2819 Perl_croak(aTHX_ "Can't do seteuid!\n");
2821 else if (PL_uid) { /* oops, mustn't run as root */
2823 (void)seteuid((Uid_t)PL_uid);
2826 (void)setreuid((Uid_t)-1,(Uid_t)PL_uid);
2828 #ifdef HAS_SETRESUID
2829 (void)setresuid((Uid_t)-1,(Uid_t)PL_uid,(Uid_t)-1);
2831 PerlProc_setuid((Uid_t)PL_uid);
2835 if (PerlProc_geteuid() != PL_uid)
2836 Perl_croak(aTHX_ "Can't do seteuid!\n");
2839 if (!cando(S_IXUSR,TRUE,&PL_statbuf))
2840 Perl_croak(aTHX_ "Permission denied\n"); /* they can't do this */
2843 else if (PL_preprocess)
2844 Perl_croak(aTHX_ "-P not allowed for setuid/setgid script\n");
2845 else if (fdscript >= 0)
2846 Perl_croak(aTHX_ "fd script not allowed in suidperl\n");
2848 Perl_croak(aTHX_ "Script is not setuid/setgid in suidperl\n");
2850 /* We absolutely must clear out any saved ids here, so we */
2851 /* exec the real perl, substituting fd script for scriptname. */
2852 /* (We pass script name as "subdir" of fd, which perl will grok.) */
2853 PerlIO_rewind(PL_rsfp);
2854 PerlLIO_lseek(PerlIO_fileno(PL_rsfp),(Off_t)0,0); /* just in case rewind didn't */
2855 for (which = 1; PL_origargv[which] && PL_origargv[which] != scriptname; which++) ;
2856 if (!PL_origargv[which])
2857 Perl_croak(aTHX_ "Permission denied");
2858 PL_origargv[which] = savepv(Perl_form(aTHX_ "/dev/fd/%d/%s",
2859 PerlIO_fileno(PL_rsfp), PL_origargv[which]));
2860 #if defined(HAS_FCNTL) && defined(F_SETFD)
2861 fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,0); /* ensure no close-on-exec */
2863 PerlProc_execv(Perl_form(aTHX_ "%s/perl"PERL_FS_VER_FMT, BIN_EXP,
2864 (int)PERL_REVISION, (int)PERL_VERSION,
2865 (int)PERL_SUBVERSION), PL_origargv);/* try again */
2866 Perl_croak(aTHX_ "Can't do setuid\n");
2867 #endif /* IAMSUID */
2869 if (PL_euid != PL_uid || PL_egid != PL_gid) { /* (suidperl doesn't exist, in fact) */
2870 #ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
2872 PerlLIO_fstat(PerlIO_fileno(PL_rsfp),&PL_statbuf); /* may be either wrapped or real suid */
2873 if ((PL_euid != PL_uid && PL_euid == PL_statbuf.st_uid && PL_statbuf.st_mode & S_ISUID)
2875 (PL_egid != PL_gid && PL_egid == PL_statbuf.st_gid && PL_statbuf.st_mode & S_ISGID)
2878 Perl_croak(aTHX_ "YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2879 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2880 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
2881 /* not set-id, must be wrapped */
2887 S_find_beginning(pTHX)
2889 register char *s, *s2;
2891 /* skip forward in input to the real script? */
2894 while (PL_doextract) {
2895 if ((s = sv_gets(PL_linestr, PL_rsfp, 0)) == Nullch)
2896 Perl_croak(aTHX_ "No Perl script found in input\n");
2897 if (*s == '#' && s[1] == '!' && (s = instr(s,"perl"))) {
2898 PerlIO_ungetc(PL_rsfp, '\n'); /* to keep line count right */
2899 PL_doextract = FALSE;
2900 while (*s && !(isSPACE (*s) || *s == '#')) s++;
2902 while (*s == ' ' || *s == '\t') s++;
2904 while (isDIGIT(s2[-1]) || strchr("-._", s2[-1])) s2--;
2905 if (strnEQ(s2-4,"perl",4))
2907 while (s = moreswitches(s)) ;
2917 PL_uid = PerlProc_getuid();
2918 PL_euid = PerlProc_geteuid();
2919 PL_gid = PerlProc_getgid();
2920 PL_egid = PerlProc_getegid();
2922 PL_uid |= PL_gid << 16;
2923 PL_euid |= PL_egid << 16;
2925 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2929 S_forbid_setid(pTHX_ char *s)
2931 if (PL_euid != PL_uid)
2932 Perl_croak(aTHX_ "No %s allowed while running setuid", s);
2933 if (PL_egid != PL_gid)
2934 Perl_croak(aTHX_ "No %s allowed while running setgid", s);
2938 Perl_init_debugger(pTHX)
2941 HV *ostash = PL_curstash;
2943 PL_curstash = PL_debstash;
2944 PL_dbargs = GvAV(gv_AVadd((gv_fetchpv("args", GV_ADDMULTI, SVt_PVAV))));
2945 AvREAL_off(PL_dbargs);
2946 PL_DBgv = gv_fetchpv("DB", GV_ADDMULTI, SVt_PVGV);
2947 PL_DBline = gv_fetchpv("dbline", GV_ADDMULTI, SVt_PVAV);
2948 PL_DBsub = gv_HVadd(gv_fetchpv("sub", GV_ADDMULTI, SVt_PVHV));
2949 sv_upgrade(GvSV(PL_DBsub), SVt_IV); /* IVX accessed if PERLDB_SUB_NN */
2950 PL_DBsingle = GvSV((gv_fetchpv("single", GV_ADDMULTI, SVt_PV)));
2951 sv_setiv(PL_DBsingle, 0);
2952 PL_DBtrace = GvSV((gv_fetchpv("trace", GV_ADDMULTI, SVt_PV)));
2953 sv_setiv(PL_DBtrace, 0);
2954 PL_DBsignal = GvSV((gv_fetchpv("signal", GV_ADDMULTI, SVt_PV)));
2955 sv_setiv(PL_DBsignal, 0);
2956 PL_curstash = ostash;
2959 #ifndef STRESS_REALLOC
2960 #define REASONABLE(size) (size)
2962 #define REASONABLE(size) (1) /* unreasonable */
2966 Perl_init_stacks(pTHX)
2968 /* start with 128-item stack and 8K cxstack */
2969 PL_curstackinfo = new_stackinfo(REASONABLE(128),
2970 REASONABLE(8192/sizeof(PERL_CONTEXT) - 1));
2971 PL_curstackinfo->si_type = PERLSI_MAIN;
2972 PL_curstack = PL_curstackinfo->si_stack;
2973 PL_mainstack = PL_curstack; /* remember in case we switch stacks */
2975 PL_stack_base = AvARRAY(PL_curstack);
2976 PL_stack_sp = PL_stack_base;
2977 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
2979 New(50,PL_tmps_stack,REASONABLE(128),SV*);
2982 PL_tmps_max = REASONABLE(128);
2984 New(54,PL_markstack,REASONABLE(32),I32);
2985 PL_markstack_ptr = PL_markstack;
2986 PL_markstack_max = PL_markstack + REASONABLE(32);
2990 New(54,PL_scopestack,REASONABLE(32),I32);
2991 PL_scopestack_ix = 0;
2992 PL_scopestack_max = REASONABLE(32);
2994 New(54,PL_savestack,REASONABLE(128),ANY);
2995 PL_savestack_ix = 0;
2996 PL_savestack_max = REASONABLE(128);
2998 New(54,PL_retstack,REASONABLE(16),OP*);
3000 PL_retstack_max = REASONABLE(16);
3009 while (PL_curstackinfo->si_next)
3010 PL_curstackinfo = PL_curstackinfo->si_next;
3011 while (PL_curstackinfo) {
3012 PERL_SI *p = PL_curstackinfo->si_prev;
3013 /* curstackinfo->si_stack got nuked by sv_free_arenas() */
3014 Safefree(PL_curstackinfo->si_cxstack);
3015 Safefree(PL_curstackinfo);
3016 PL_curstackinfo = p;
3018 Safefree(PL_tmps_stack);
3019 Safefree(PL_markstack);
3020 Safefree(PL_scopestack);
3021 Safefree(PL_savestack);
3022 Safefree(PL_retstack);
3026 static PerlIO *tmpfp; /* moved outside init_lexer() because of UNICOS bug */
3037 lex_start(PL_linestr);
3039 PL_subname = newSVpvn("main",4);
3043 S_init_predump_symbols(pTHX)
3050 sv_setpvn(get_sv("\"", TRUE), " ", 1);
3051 PL_stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
3052 GvMULTI_on(PL_stdingv);
3053 io = GvIOp(PL_stdingv);
3054 IoIFP(io) = PerlIO_stdin();
3055 tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
3057 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
3059 tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
3062 IoOFP(io) = IoIFP(io) = PerlIO_stdout();
3064 tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
3066 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
3068 PL_stderrgv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
3069 GvMULTI_on(PL_stderrgv);
3070 io = GvIOp(PL_stderrgv);
3071 IoOFP(io) = IoIFP(io) = PerlIO_stderr();
3072 tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
3074 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
3076 PL_statname = NEWSV(66,0); /* last filename we did stat on */
3079 PL_osname = savepv(OSNAME);
3083 S_init_postdump_symbols(pTHX_ register int argc, register char **argv, register char **env)
3090 argc--,argv++; /* skip name of script */
3091 if (PL_doswitches) {
3092 for (; argc > 0 && **argv == '-'; argc--,argv++) {
3095 if (argv[0][1] == '-' && !argv[0][2]) {
3099 if (s = strchr(argv[0], '=')) {
3101 sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),s);
3104 sv_setiv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),1);
3107 PL_toptarget = NEWSV(0,0);
3108 sv_upgrade(PL_toptarget, SVt_PVFM);
3109 sv_setpvn(PL_toptarget, "", 0);
3110 PL_bodytarget = NEWSV(0,0);
3111 sv_upgrade(PL_bodytarget, SVt_PVFM);
3112 sv_setpvn(PL_bodytarget, "", 0);
3113 PL_formtarget = PL_bodytarget;
3116 if (tmpgv = gv_fetchpv("0",TRUE, SVt_PV)) {
3117 sv_setpv(GvSV(tmpgv),PL_origfilename);
3118 magicname("0", "0", 1);
3120 if (tmpgv = gv_fetchpv("\030",TRUE, SVt_PV))
3122 sv_setpv(GvSV(tmpgv), os2_execname());
3124 sv_setpv(GvSV(tmpgv),PL_origargv[0]);
3126 if (PL_argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV)) {
3127 GvMULTI_on(PL_argvgv);
3128 (void)gv_AVadd(PL_argvgv);
3129 av_clear(GvAVn(PL_argvgv));
3130 for (; argc > 0; argc--,argv++) {
3131 av_push(GvAVn(PL_argvgv),newSVpv(argv[0],0));
3134 if (PL_envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV)) {
3136 GvMULTI_on(PL_envgv);
3137 hv = GvHVn(PL_envgv);
3138 hv_magic(hv, PL_envgv, 'E');
3139 #if !defined( VMS) && !defined(EPOC) /* VMS doesn't have environ array */
3140 /* Note that if the supplied env parameter is actually a copy
3141 of the global environ then it may now point to free'd memory
3142 if the environment has been modified since. To avoid this
3143 problem we treat env==NULL as meaning 'use the default'
3148 environ[0] = Nullch;
3149 for (; *env; env++) {
3150 if (!(s = strchr(*env,'=')))
3156 sv = newSVpv(s--,0);
3157 (void)hv_store(hv, *env, s - *env, sv, 0);
3159 #if defined(__BORLANDC__) && defined(USE_WIN32_RTL_ENV)
3160 /* Sins of the RTL. See note in my_setenv(). */
3161 (void)PerlEnv_putenv(savepv(*env));
3165 #ifdef DYNAMIC_ENV_FETCH
3166 HvNAME(hv) = savepv(ENV_HV_NAME);
3170 if (tmpgv = gv_fetchpv("$",TRUE, SVt_PV))
3171 sv_setiv(GvSV(tmpgv), (IV)PerlProc_getpid());
3175 S_init_perllib(pTHX)
3180 s = PerlEnv_getenv("PERL5LIB");
3184 incpush(PerlEnv_getenv("PERLLIB"), FALSE);
3186 /* Treat PERL5?LIB as a possible search list logical name -- the
3187 * "natural" VMS idiom for a Unix path string. We allow each
3188 * element to be a set of |-separated directories for compatibility.
3192 if (my_trnlnm("PERL5LIB",buf,0))
3193 do { incpush(buf,TRUE); } while (my_trnlnm("PERL5LIB",buf,++idx));
3195 while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE);
3199 /* Use the ~-expanded versions of APPLLIB (undocumented),
3200 ARCHLIB PRIVLIB SITEARCH and SITELIB
3203 incpush(APPLLIB_EXP, TRUE);
3207 incpush(ARCHLIB_EXP, FALSE);
3210 #define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
3213 incpush(PRIVLIB_EXP, TRUE);
3215 incpush(PRIVLIB_EXP, FALSE);
3219 incpush(SITELIB_EXP, TRUE); /* XXX Win32 needs inc_version_list support */
3223 char *path = SITELIB_EXP;
3228 if (strrchr(buf,'/')) /* XXX Hack, Configure var needed */
3229 *strrchr(buf,'/') = '\0';
3235 #if defined(PERL_VENDORLIB_EXP)
3237 incpush(PERL_VENDORLIB_EXP, TRUE);
3239 incpush(PERL_VENDORLIB_EXP, FALSE);
3243 incpush(".", FALSE);
3247 # define PERLLIB_SEP ';'
3250 # define PERLLIB_SEP '|'
3252 # define PERLLIB_SEP ':'
3255 #ifndef PERLLIB_MANGLE
3256 # define PERLLIB_MANGLE(s,n) (s)
3260 S_incpush(pTHX_ char *p, int addsubdirs)
3262 SV *subdir = Nullsv;
3268 subdir = sv_newmortal();
3271 /* Break at all separators */
3273 SV *libdir = NEWSV(55,0);
3276 /* skip any consecutive separators */
3277 while ( *p == PERLLIB_SEP ) {
3278 /* Uncomment the next line for PATH semantics */
3279 /* av_push(GvAVn(PL_incgv), newSVpvn(".", 1)); */
3283 if ( (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
3284 sv_setpvn(libdir, PERLLIB_MANGLE(p, (STRLEN)(s - p)),
3289 sv_setpv(libdir, PERLLIB_MANGLE(p, 0));
3290 p = Nullch; /* break out */
3294 * BEFORE pushing libdir onto @INC we may first push version- and
3295 * archname-specific sub-directories.
3298 #ifdef PERL_INC_VERSION_LIST
3299 /* Configure terminates PERL_INC_VERSION_LIST with a NULL */
3300 const char *incverlist[] = { PERL_INC_VERSION_LIST };
3301 const char **incver;
3303 struct stat tmpstatbuf;
3308 if ((unix = tounixspec_ts(SvPV(libdir,len),Nullch)) != Nullch) {
3310 while (unix[len-1] == '/') len--; /* Cosmetic */
3311 sv_usepvn(libdir,unix,len);
3314 PerlIO_printf(Perl_error_log,
3315 "Failed to unixify @INC element \"%s\"\n",
3318 /* .../version/archname if -d .../version/archname */
3319 Perl_sv_setpvf(aTHX_ subdir, "%"SVf"/"PERL_FS_VER_FMT"/%s", libdir,
3320 (int)PERL_REVISION, (int)PERL_VERSION,
3321 (int)PERL_SUBVERSION, ARCHNAME);
3322 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
3323 S_ISDIR(tmpstatbuf.st_mode))
3324 av_push(GvAVn(PL_incgv), newSVsv(subdir));
3326 /* .../version if -d .../version */
3327 Perl_sv_setpvf(aTHX_ subdir, "%"SVf"/"PERL_FS_VER_FMT, libdir,
3328 (int)PERL_REVISION, (int)PERL_VERSION,
3329 (int)PERL_SUBVERSION);
3330 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
3331 S_ISDIR(tmpstatbuf.st_mode))
3332 av_push(GvAVn(PL_incgv), newSVsv(subdir));
3334 /* .../archname if -d .../archname */
3335 Perl_sv_setpvf(aTHX_ subdir, "%"SVf"/%s", libdir, ARCHNAME);
3336 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
3337 S_ISDIR(tmpstatbuf.st_mode))
3338 av_push(GvAVn(PL_incgv), newSVsv(subdir));
3340 #ifdef PERL_INC_VERSION_LIST
3341 for (incver = incverlist; *incver; incver++) {
3342 /* .../xxx if -d .../xxx */
3343 Perl_sv_setpvf(aTHX_ subdir, "%"SVf"/%s", libdir, *incver);
3344 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
3345 S_ISDIR(tmpstatbuf.st_mode))
3346 av_push(GvAVn(PL_incgv), newSVsv(subdir));
3351 /* finally push this lib directory on the end of @INC */
3352 av_push(GvAVn(PL_incgv), libdir);
3357 STATIC struct perl_thread *
3358 S_init_main_thread(pTHX)
3360 #if !defined(PERL_IMPLICIT_CONTEXT)
3361 struct perl_thread *thr;
3365 Newz(53, thr, 1, struct perl_thread);
3366 PL_curcop = &PL_compiling;
3367 thr->interp = PERL_GET_INTERP;
3368 thr->cvcache = newHV();
3369 thr->threadsv = newAV();
3370 /* thr->threadsvp is set when find_threadsv is called */
3371 thr->specific = newAV();
3372 thr->flags = THRf_R_JOINABLE;
3373 MUTEX_INIT(&thr->mutex);
3374 /* Handcraft thrsv similarly to mess_sv */
3375 New(53, PL_thrsv, 1, SV);
3376 Newz(53, xpv, 1, XPV);
3377 SvFLAGS(PL_thrsv) = SVt_PV;
3378 SvANY(PL_thrsv) = (void*)xpv;
3379 SvREFCNT(PL_thrsv) = 1 << 30; /* practically infinite */
3380 SvPVX(PL_thrsv) = (char*)thr;
3381 SvCUR_set(PL_thrsv, sizeof(thr));
3382 SvLEN_set(PL_thrsv, sizeof(thr));
3383 *SvEND(PL_thrsv) = '\0'; /* in the trailing_nul field */
3384 thr->oursv = PL_thrsv;
3385 PL_chopset = " \n-";
3388 MUTEX_LOCK(&PL_threads_mutex);
3393 MUTEX_UNLOCK(&PL_threads_mutex);
3395 #ifdef HAVE_THREAD_INTERN
3396 Perl_init_thread_intern(thr);
3399 #ifdef SET_THREAD_SELF
3400 SET_THREAD_SELF(thr);
3402 thr->self = pthread_self();
3403 #endif /* SET_THREAD_SELF */
3407 * These must come after the SET_THR because sv_setpvn does
3408 * SvTAINT and the taint fields require dTHR.
3410 PL_toptarget = NEWSV(0,0);
3411 sv_upgrade(PL_toptarget, SVt_PVFM);
3412 sv_setpvn(PL_toptarget, "", 0);
3413 PL_bodytarget = NEWSV(0,0);
3414 sv_upgrade(PL_bodytarget, SVt_PVFM);
3415 sv_setpvn(PL_bodytarget, "", 0);
3416 PL_formtarget = PL_bodytarget;
3417 thr->errsv = newSVpvn("", 0);
3418 (void) find_threadsv("@"); /* Ensure $@ is initialised early */
3421 PL_regcompp = MEMBER_TO_FPTR(Perl_pregcomp);
3422 PL_regexecp = MEMBER_TO_FPTR(Perl_regexec_flags);
3423 PL_regint_start = MEMBER_TO_FPTR(Perl_re_intuit_start);
3424 PL_regint_string = MEMBER_TO_FPTR(Perl_re_intuit_string);
3425 PL_regfree = MEMBER_TO_FPTR(Perl_pregfree);
3427 PL_reginterp_cnt = 0;
3431 #endif /* USE_THREADS */
3434 Perl_call_list(pTHX_ I32 oldscope, AV *paramList)
3438 line_t oldline = CopLINE(PL_curcop);
3444 while (AvFILL(paramList) >= 0) {
3445 cv = (CV*)av_shift(paramList);
3447 #ifdef PERL_FLEXIBLE_EXCEPTIONS
3448 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vcall_list_body), cv);
3454 #ifndef PERL_FLEXIBLE_EXCEPTIONS
3458 (void)SvPV(atsv, len);
3461 PL_curcop = &PL_compiling;
3462 CopLINE_set(PL_curcop, oldline);
3463 if (paramList == PL_beginav)
3464 sv_catpv(atsv, "BEGIN failed--compilation aborted");
3466 Perl_sv_catpvf(aTHX_ atsv,
3467 "%s failed--call queue aborted",
3468 paramList == PL_checkav ? "CHECK"
3469 : paramList == PL_initav ? "INIT"
3471 while (PL_scopestack_ix > oldscope)
3474 Perl_croak(aTHX_ "%s", SvPVx(atsv, n_a));
3481 /* my_exit() was called */
3482 while (PL_scopestack_ix > oldscope)
3485 PL_curstash = PL_defstash;
3486 PL_curcop = &PL_compiling;
3487 CopLINE_set(PL_curcop, oldline);
3489 if (PL_statusvalue && !(PL_exit_flags & PERL_EXIT_EXPECTED)) {
3490 if (paramList == PL_beginav)
3491 Perl_croak(aTHX_ "BEGIN failed--compilation aborted");
3493 Perl_croak(aTHX_ "%s failed--call queue aborted",
3494 paramList == PL_checkav ? "CHECK"
3495 : paramList == PL_initav ? "INIT"
3502 PL_curcop = &PL_compiling;
3503 CopLINE_set(PL_curcop, oldline);
3506 PerlIO_printf(Perl_error_log, "panic: restartop\n");
3514 #ifdef PERL_FLEXIBLE_EXCEPTIONS
3516 S_vcall_list_body(pTHX_ va_list args)
3518 CV *cv = va_arg(args, CV*);
3519 return call_list_body(cv);
3524 S_call_list_body(pTHX_ CV *cv)
3526 PUSHMARK(PL_stack_sp);
3527 call_sv((SV*)cv, G_EVAL|G_DISCARD);
3532 Perl_my_exit(pTHX_ U32 status)
3536 DEBUG_S(PerlIO_printf(Perl_debug_log, "my_exit: thread %p, status %lu\n",
3537 thr, (unsigned long) status));
3546 STATUS_NATIVE_SET(status);
3553 Perl_my_failure_exit(pTHX)
3556 if (vaxc$errno & 1) {
3557 if (STATUS_NATIVE & 1) /* fortuitiously includes "-1" */
3558 STATUS_NATIVE_SET(44);
3561 if (!vaxc$errno && errno) /* unlikely */
3562 STATUS_NATIVE_SET(44);
3564 STATUS_NATIVE_SET(vaxc$errno);
3569 STATUS_POSIX_SET(errno);
3571 exitstatus = STATUS_POSIX >> 8;
3572 if (exitstatus & 255)
3573 STATUS_POSIX_SET(exitstatus);
3575 STATUS_POSIX_SET(255);
3582 S_my_exit_jump(pTHX)
3585 register PERL_CONTEXT *cx;
3590 SvREFCNT_dec(PL_e_script);
3591 PL_e_script = Nullsv;
3594 POPSTACK_TO(PL_mainstack);
3595 if (cxstack_ix >= 0) {
3598 POPBLOCK(cx,PL_curpm);
3610 read_e_script(pTHXo_ int idx, SV *buf_sv, int maxlen)
3613 p = SvPVX(PL_e_script);
3614 nl = strchr(p, '\n');
3615 nl = (nl) ? nl+1 : SvEND(PL_e_script);
3617 filter_del(read_e_script);
3620 sv_catpvn(buf_sv, p, nl-p);
3621 sv_chop(PL_e_script, nl);