3 * Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4 * 2000, 2001, 2002, 2003, by Larry Wall and others
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
12 * "A ship then new they built for him/of mithril and of elven glass" --Bilbo
16 #define PERL_IN_PERL_C
18 #include "patchlevel.h" /* for local_patches */
22 char *nw_get_sitelib(const char *pl);
25 /* XXX If this causes problems, set i_unistd=undef in the hint file. */
42 #if !defined(STANDARD_C) && !defined(HAS_GETENV_PROTOTYPE) && !defined(PERL_MICRO)
43 char *getenv (char *); /* Usually in <stdlib.h> */
46 static I32 read_e_script(pTHX_ int idx, SV *buf_sv, int maxlen);
54 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
60 #if defined(USE_ITHREADS)
61 # define INIT_TLS_AND_INTERP \
63 if (!PL_curinterp) { \
64 PERL_SET_INTERP(my_perl); \
67 PERL_SET_THX(my_perl); \
69 MUTEX_INIT(&PL_dollarzero_mutex); \
72 PERL_SET_THX(my_perl); \
76 # define INIT_TLS_AND_INTERP \
78 if (!PL_curinterp) { \
79 PERL_SET_INTERP(my_perl); \
81 PERL_SET_THX(my_perl); \
85 #ifdef PERL_IMPLICIT_SYS
87 perl_alloc_using(struct IPerlMem* ipM, struct IPerlMem* ipMS,
88 struct IPerlMem* ipMP, struct IPerlEnv* ipE,
89 struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
90 struct IPerlDir* ipD, struct IPerlSock* ipS,
91 struct IPerlProc* ipP)
93 PerlInterpreter *my_perl;
94 /* New() needs interpreter, so call malloc() instead */
95 my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
97 Zero(my_perl, 1, PerlInterpreter);
113 =head1 Embedding Functions
115 =for apidoc perl_alloc
117 Allocates a new Perl interpreter. See L<perlembed>.
125 PerlInterpreter *my_perl;
126 #ifdef USE_5005THREADS
130 /* New() needs interpreter, so call malloc() instead */
131 my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
134 Zero(my_perl, 1, PerlInterpreter);
137 #endif /* PERL_IMPLICIT_SYS */
140 =for apidoc perl_construct
142 Initializes a new Perl interpreter. See L<perlembed>.
148 perl_construct(pTHXx)
152 PL_perl_destruct_level = 1;
154 if (PL_perl_destruct_level > 0)
158 /* Init the real globals (and main thread)? */
160 #ifdef PERL_FLEXIBLE_EXCEPTIONS
161 PL_protect = MEMBER_TO_FPTR(Perl_default_protect); /* for exceptions */
164 PL_curcop = &PL_compiling; /* needed by ckWARN, right away */
166 PL_linestr = NEWSV(65,79);
167 sv_upgrade(PL_linestr,SVt_PVIV);
169 if (!SvREADONLY(&PL_sv_undef)) {
170 /* set read-only and try to insure than we wont see REFCNT==0
173 SvREADONLY_on(&PL_sv_undef);
174 SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
176 sv_setpv(&PL_sv_no,PL_No);
178 SvREADONLY_on(&PL_sv_no);
179 SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
181 sv_setpv(&PL_sv_yes,PL_Yes);
183 SvREADONLY_on(&PL_sv_yes);
184 SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
187 PL_sighandlerp = Perl_sighandler;
188 PL_pidstatus = newHV();
191 PL_rs = newSVpvn("\n", 1);
196 PL_lex_state = LEX_NOTPARSING;
202 SET_NUMERIC_STANDARD();
206 PL_patchlevel = NEWSV(0,4);
207 (void)SvUPGRADE(PL_patchlevel, SVt_PVNV);
208 if (PERL_REVISION > 127 || PERL_VERSION > 127 || PERL_SUBVERSION > 127)
209 SvGROW(PL_patchlevel, UTF8_MAXLEN*3+1);
210 s = (U8*)SvPVX(PL_patchlevel);
211 /* Build version strings using "native" characters */
212 s = uvchr_to_utf8(s, (UV)PERL_REVISION);
213 s = uvchr_to_utf8(s, (UV)PERL_VERSION);
214 s = uvchr_to_utf8(s, (UV)PERL_SUBVERSION);
216 SvCUR_set(PL_patchlevel, s - (U8*)SvPVX(PL_patchlevel));
217 SvPOK_on(PL_patchlevel);
218 SvNVX(PL_patchlevel) = (NV)PERL_REVISION +
219 ((NV)PERL_VERSION / (NV)1000) +
220 ((NV)PERL_SUBVERSION / (NV)1000000);
221 SvNOK_on(PL_patchlevel); /* dual valued */
222 SvUTF8_on(PL_patchlevel);
223 SvREADONLY_on(PL_patchlevel);
226 #if defined(LOCAL_PATCH_COUNT)
227 PL_localpatches = local_patches; /* For possible -v */
230 #ifdef HAVE_INTERP_INTERN
234 PerlIO_init(aTHX); /* Hook to IO system */
236 PL_fdpid = newAV(); /* for remembering popen pids by fd */
237 PL_modglobal = newHV(); /* pointers to per-interpreter module globals */
238 PL_errors = newSVpvn("",0);
239 sv_setpvn(PERL_DEBUG_PAD(0), "", 0); /* For regex debugging. */
240 sv_setpvn(PERL_DEBUG_PAD(1), "", 0); /* ext/re needs these */
241 sv_setpvn(PERL_DEBUG_PAD(2), "", 0); /* even without DEBUGGING. */
243 PL_regex_padav = newAV();
244 av_push(PL_regex_padav,(SV*)newAV()); /* First entry is an array of empty elements */
245 PL_regex_pad = AvARRAY(PL_regex_padav);
247 #ifdef USE_REENTRANT_API
248 Perl_reentrant_init(aTHX);
251 /* Note that strtab is a rather special HV. Assumptions are made
252 about not iterating on it, and not adding tie magic to it.
253 It is properly deallocated in perl_destruct() */
256 HvSHAREKEYS_off(PL_strtab); /* mandatory */
257 hv_ksplit(PL_strtab, 512);
259 #if defined(__DYNAMIC__) && (defined(NeXT) || defined(__NeXT__))
260 _dyld_lookup_and_bind
261 ("__environ", (unsigned long *) &environ_pointer, NULL);
264 #ifdef USE_ENVIRON_ARRAY
265 PL_origenviron = environ;
268 /* Use sysconf(_SC_CLK_TCK) if available, if not
269 * available or if the sysconf() fails, use the HZ. */
270 #if defined(HAS_SYSCONF) && defined(_SC_CLK_TCK)
271 PL_clocktick = sysconf(_SC_CLK_TCK);
272 if (PL_clocktick <= 0)
276 PL_stashcache = newHV();
282 =for apidoc nothreadhook
284 Stub that provides thread hook for perl_destruct when there are
291 Perl_nothreadhook(pTHX)
297 =for apidoc perl_destruct
299 Shuts down a Perl interpreter. See L<perlembed>.
307 volatile int destruct_level; /* 0=none, 1=full, 2=full with checks */
309 #ifdef USE_5005THREADS
311 #endif /* USE_5005THREADS */
313 /* wait for all pseudo-forked children to finish */
314 PERL_WAIT_FOR_CHILDREN;
316 destruct_level = PL_perl_destruct_level;
320 if ((s = PerlEnv_getenv("PERL_DESTRUCT_LEVEL"))) {
322 if (destruct_level < i)
329 if(PL_exit_flags & PERL_EXIT_DESTRUCT_END) {
334 if (PL_endav && !PL_minus_c)
335 call_list(PL_scopestack_ix, PL_endav);
341 /* Need to flush since END blocks can produce output */
344 if (CALL_FPTR(PL_threadhook)(aTHX)) {
345 /* Threads hook has vetoed further cleanup */
346 return STATUS_NATIVE_EXPORT;
349 /* We must account for everything. */
351 /* Destroy the main CV and syntax tree */
353 op_free(PL_main_root);
354 PL_main_root = Nullop;
356 PL_curcop = &PL_compiling;
357 PL_main_start = Nullop;
358 SvREFCNT_dec(PL_main_cv);
362 /* Tell PerlIO we are about to tear things apart in case
363 we have layers which are using resources that should
367 PerlIO_destruct(aTHX);
369 if (PL_sv_objcount) {
371 * Try to destruct global references. We do this first so that the
372 * destructors and destructees still exist. Some sv's might remain.
373 * Non-referenced objects are on their own.
378 /* unhook hooks which will soon be, or use, destroyed data */
379 SvREFCNT_dec(PL_warnhook);
380 PL_warnhook = Nullsv;
381 SvREFCNT_dec(PL_diehook);
384 /* call exit list functions */
385 while (PL_exitlistlen-- > 0)
386 PL_exitlist[PL_exitlistlen].fn(aTHX_ PL_exitlist[PL_exitlistlen].ptr);
388 Safefree(PL_exitlist);
393 if (destruct_level == 0){
395 DEBUG_P(debprofdump());
397 #if defined(PERLIO_LAYERS)
398 /* No more IO - including error messages ! */
399 PerlIO_cleanup(aTHX);
402 /* The exit() function will do everything that needs doing. */
403 return STATUS_NATIVE_EXPORT;
406 /* jettison our possibly duplicated environment */
407 /* if PERL_USE_SAFE_PUTENV is defined environ will not have been copied
408 * so we certainly shouldn't free it here
410 #if defined(USE_ENVIRON_ARRAY) && !defined(PERL_USE_SAFE_PUTENV)
411 if (environ != PL_origenviron
413 /* only main thread can free environ[0] contents */
414 && PL_curinterp == aTHX
420 for (i = 0; environ[i]; i++)
421 safesysfree(environ[i]);
423 /* Must use safesysfree() when working with environ. */
424 safesysfree(environ);
426 environ = PL_origenviron;
431 /* the syntax tree is shared between clones
432 * so op_free(PL_main_root) only ReREFCNT_dec's
433 * REGEXPs in the parent interpreter
434 * we need to manually ReREFCNT_dec for the clones
437 I32 i = AvFILLp(PL_regex_padav) + 1;
438 SV **ary = AvARRAY(PL_regex_padav);
442 REGEXP *re = INT2PTR(REGEXP *,SvIVX(resv));
444 if (SvFLAGS(resv) & SVf_BREAK) {
445 /* this is PL_reg_curpm, already freed
446 * flag is set in regexec.c:S_regtry
448 SvFLAGS(resv) &= ~SVf_BREAK;
450 else if(SvREPADTMP(resv)) {
451 SvREPADTMP_off(resv);
458 SvREFCNT_dec(PL_regex_padav);
459 PL_regex_padav = Nullav;
463 SvREFCNT_dec((SV*) PL_stashcache);
464 PL_stashcache = NULL;
466 /* loosen bonds of global variables */
469 (void)PerlIO_close(PL_rsfp);
473 /* Filters for program text */
474 SvREFCNT_dec(PL_rsfp_filters);
475 PL_rsfp_filters = Nullav;
478 PL_preprocess = FALSE;
484 PL_doswitches = FALSE;
485 PL_dowarn = G_WARN_OFF;
486 PL_doextract = FALSE;
487 PL_sawampersand = FALSE; /* must save all match strings */
490 Safefree(PL_inplace);
492 SvREFCNT_dec(PL_patchlevel);
495 SvREFCNT_dec(PL_e_script);
496 PL_e_script = Nullsv;
499 /* magical thingies */
501 SvREFCNT_dec(PL_ofs_sv); /* $, */
504 SvREFCNT_dec(PL_ors_sv); /* $\ */
507 SvREFCNT_dec(PL_rs); /* $/ */
510 PL_multiline = 0; /* $* */
511 Safefree(PL_osname); /* $^O */
514 SvREFCNT_dec(PL_statname);
515 PL_statname = Nullsv;
518 /* defgv, aka *_ should be taken care of elsewhere */
520 /* clean up after study() */
521 SvREFCNT_dec(PL_lastscream);
522 PL_lastscream = Nullsv;
523 Safefree(PL_screamfirst);
525 Safefree(PL_screamnext);
529 Safefree(PL_efloatbuf);
530 PL_efloatbuf = Nullch;
533 /* startup and shutdown function lists */
534 SvREFCNT_dec(PL_beginav);
535 SvREFCNT_dec(PL_beginav_save);
536 SvREFCNT_dec(PL_endav);
537 SvREFCNT_dec(PL_checkav);
538 SvREFCNT_dec(PL_checkav_save);
539 SvREFCNT_dec(PL_initav);
541 PL_beginav_save = Nullav;
544 PL_checkav_save = Nullav;
547 /* shortcuts just get cleared */
553 PL_argvoutgv = Nullgv;
555 PL_stderrgv = Nullgv;
556 PL_last_in_gv = Nullgv;
558 PL_debstash = Nullhv;
560 /* reset so print() ends up where we expect */
563 SvREFCNT_dec(PL_argvout_stack);
564 PL_argvout_stack = Nullav;
566 SvREFCNT_dec(PL_modglobal);
567 PL_modglobal = Nullhv;
568 SvREFCNT_dec(PL_preambleav);
569 PL_preambleav = Nullav;
570 SvREFCNT_dec(PL_subname);
572 SvREFCNT_dec(PL_linestr);
574 SvREFCNT_dec(PL_pidstatus);
575 PL_pidstatus = Nullhv;
576 SvREFCNT_dec(PL_toptarget);
577 PL_toptarget = Nullsv;
578 SvREFCNT_dec(PL_bodytarget);
579 PL_bodytarget = Nullsv;
580 PL_formtarget = Nullsv;
582 /* free locale stuff */
583 #ifdef USE_LOCALE_COLLATE
584 Safefree(PL_collation_name);
585 PL_collation_name = Nullch;
588 #ifdef USE_LOCALE_NUMERIC
589 Safefree(PL_numeric_name);
590 PL_numeric_name = Nullch;
591 SvREFCNT_dec(PL_numeric_radix_sv);
594 /* clear utf8 character classes */
595 SvREFCNT_dec(PL_utf8_alnum);
596 SvREFCNT_dec(PL_utf8_alnumc);
597 SvREFCNT_dec(PL_utf8_ascii);
598 SvREFCNT_dec(PL_utf8_alpha);
599 SvREFCNT_dec(PL_utf8_space);
600 SvREFCNT_dec(PL_utf8_cntrl);
601 SvREFCNT_dec(PL_utf8_graph);
602 SvREFCNT_dec(PL_utf8_digit);
603 SvREFCNT_dec(PL_utf8_upper);
604 SvREFCNT_dec(PL_utf8_lower);
605 SvREFCNT_dec(PL_utf8_print);
606 SvREFCNT_dec(PL_utf8_punct);
607 SvREFCNT_dec(PL_utf8_xdigit);
608 SvREFCNT_dec(PL_utf8_mark);
609 SvREFCNT_dec(PL_utf8_toupper);
610 SvREFCNT_dec(PL_utf8_totitle);
611 SvREFCNT_dec(PL_utf8_tolower);
612 SvREFCNT_dec(PL_utf8_tofold);
613 SvREFCNT_dec(PL_utf8_idstart);
614 SvREFCNT_dec(PL_utf8_idcont);
615 PL_utf8_alnum = Nullsv;
616 PL_utf8_alnumc = Nullsv;
617 PL_utf8_ascii = Nullsv;
618 PL_utf8_alpha = Nullsv;
619 PL_utf8_space = Nullsv;
620 PL_utf8_cntrl = Nullsv;
621 PL_utf8_graph = Nullsv;
622 PL_utf8_digit = Nullsv;
623 PL_utf8_upper = Nullsv;
624 PL_utf8_lower = Nullsv;
625 PL_utf8_print = Nullsv;
626 PL_utf8_punct = Nullsv;
627 PL_utf8_xdigit = Nullsv;
628 PL_utf8_mark = Nullsv;
629 PL_utf8_toupper = Nullsv;
630 PL_utf8_totitle = Nullsv;
631 PL_utf8_tolower = Nullsv;
632 PL_utf8_tofold = Nullsv;
633 PL_utf8_idstart = Nullsv;
634 PL_utf8_idcont = Nullsv;
636 if (!specialWARN(PL_compiling.cop_warnings))
637 SvREFCNT_dec(PL_compiling.cop_warnings);
638 PL_compiling.cop_warnings = Nullsv;
639 if (!specialCopIO(PL_compiling.cop_io))
640 SvREFCNT_dec(PL_compiling.cop_io);
641 PL_compiling.cop_io = Nullsv;
642 CopFILE_free(&PL_compiling);
643 CopSTASH_free(&PL_compiling);
645 /* Prepare to destruct main symbol table. */
650 SvREFCNT_dec(PL_curstname);
651 PL_curstname = Nullsv;
653 /* clear queued errors */
654 SvREFCNT_dec(PL_errors);
658 if (destruct_level >= 2 && ckWARN_d(WARN_INTERNAL)) {
659 if (PL_scopestack_ix != 0)
660 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
661 "Unbalanced scopes: %ld more ENTERs than LEAVEs\n",
662 (long)PL_scopestack_ix);
663 if (PL_savestack_ix != 0)
664 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
665 "Unbalanced saves: %ld more saves than restores\n",
666 (long)PL_savestack_ix);
667 if (PL_tmps_floor != -1)
668 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),"Unbalanced tmps: %ld more allocs than frees\n",
669 (long)PL_tmps_floor + 1);
670 if (cxstack_ix != -1)
671 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),"Unbalanced context: %ld more PUSHes than POPs\n",
672 (long)cxstack_ix + 1);
675 /* Now absolutely destruct everything, somehow or other, loops or no. */
676 SvFLAGS(PL_fdpid) |= SVTYPEMASK; /* don't clean out pid table now */
677 SvFLAGS(PL_strtab) |= SVTYPEMASK; /* don't clean out strtab now */
679 /* the 2 is for PL_fdpid and PL_strtab */
680 while (PL_sv_count > 2 && sv_clean_all())
683 SvFLAGS(PL_fdpid) &= ~SVTYPEMASK;
684 SvFLAGS(PL_fdpid) |= SVt_PVAV;
685 SvFLAGS(PL_strtab) &= ~SVTYPEMASK;
686 SvFLAGS(PL_strtab) |= SVt_PVHV;
688 AvREAL_off(PL_fdpid); /* no surviving entries */
689 SvREFCNT_dec(PL_fdpid); /* needed in io_close() */
692 #ifdef HAVE_INTERP_INTERN
696 /* Destruct the global string table. */
698 /* Yell and reset the HeVAL() slots that are still holding refcounts,
699 * so that sv_free() won't fail on them.
707 max = HvMAX(PL_strtab);
708 array = HvARRAY(PL_strtab);
711 if (hent && ckWARN_d(WARN_INTERNAL)) {
712 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
713 "Unbalanced string table refcount: (%d) for \"%s\"",
714 HeVAL(hent) - Nullsv, HeKEY(hent));
715 HeVAL(hent) = Nullsv;
725 SvREFCNT_dec(PL_strtab);
728 /* free the pointer table used for cloning */
729 ptr_table_free(PL_ptr_table);
732 /* free special SVs */
734 SvREFCNT(&PL_sv_yes) = 0;
735 sv_clear(&PL_sv_yes);
736 SvANY(&PL_sv_yes) = NULL;
737 SvFLAGS(&PL_sv_yes) = 0;
739 SvREFCNT(&PL_sv_no) = 0;
741 SvANY(&PL_sv_no) = NULL;
742 SvFLAGS(&PL_sv_no) = 0;
746 for (i=0; i<=2; i++) {
747 SvREFCNT(PERL_DEBUG_PAD(i)) = 0;
748 sv_clear(PERL_DEBUG_PAD(i));
749 SvANY(PERL_DEBUG_PAD(i)) = NULL;
750 SvFLAGS(PERL_DEBUG_PAD(i)) = 0;
754 if (PL_sv_count != 0 && ckWARN_d(WARN_INTERNAL))
755 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),"Scalars leaked: %ld\n", (long)PL_sv_count);
757 #ifdef DEBUG_LEAKING_SCALARS
758 if (PL_sv_count != 0) {
763 for (sva = PL_sv_arenaroot; sva; sva = (SV*)SvANY(sva)) {
764 svend = &sva[SvREFCNT(sva)];
765 for (sv = sva + 1; sv < svend; ++sv) {
766 if (SvTYPE(sv) != SVTYPEMASK) {
767 PerlIO_printf(Perl_debug_log, "leaked: 0x%p\n", sv);
775 #if defined(PERLIO_LAYERS)
776 /* No more IO - including error messages ! */
777 PerlIO_cleanup(aTHX);
780 /* sv_undef needs to stay immortal until after PerlIO_cleanup
781 as currently layers use it rather than Nullsv as a marker
782 for no arg - and will try and SvREFCNT_dec it.
784 SvREFCNT(&PL_sv_undef) = 0;
785 SvREADONLY_off(&PL_sv_undef);
787 Safefree(PL_origfilename);
788 Safefree(PL_reg_start_tmp);
790 Safefree(PL_reg_curpm);
791 Safefree(PL_reg_poscache);
793 Safefree(PL_op_mask);
794 Safefree(PL_psig_ptr);
795 Safefree(PL_psig_name);
796 Safefree(PL_bitcount);
797 Safefree(PL_psig_pend);
799 PL_hints = 0; /* Reset hints. Should hints be per-interpreter ? */
801 DEBUG_P(debprofdump());
803 #ifdef USE_REENTRANT_API
804 Perl_reentrant_free(aTHX);
809 /* As the absolutely last thing, free the non-arena SV for mess() */
812 /* it could have accumulated taint magic */
813 if (SvTYPE(PL_mess_sv) >= SVt_PVMG) {
816 for (mg = SvMAGIC(PL_mess_sv); mg; mg = moremagic) {
817 moremagic = mg->mg_moremagic;
818 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global
820 Safefree(mg->mg_ptr);
824 /* we know that type >= SVt_PV */
825 (void)SvOOK_off(PL_mess_sv);
826 Safefree(SvPVX(PL_mess_sv));
827 Safefree(SvANY(PL_mess_sv));
828 Safefree(PL_mess_sv);
831 return STATUS_NATIVE_EXPORT;
835 =for apidoc perl_free
837 Releases a Perl interpreter. See L<perlembed>.
845 #if defined(WIN32) || defined(NETWARE)
846 # if defined(PERL_IMPLICIT_SYS)
848 void *host = nw_internal_host;
850 void *host = w32_internal_host;
854 nw_delete_internal_host(host);
856 win32_delete_internal_host(host);
867 Perl_call_atexit(pTHX_ ATEXIT_t fn, void *ptr)
869 Renew(PL_exitlist, PL_exitlistlen+1, PerlExitListEntry);
870 PL_exitlist[PL_exitlistlen].fn = fn;
871 PL_exitlist[PL_exitlistlen].ptr = ptr;
876 =for apidoc perl_parse
878 Tells a Perl interpreter to parse a Perl script. See L<perlembed>.
884 perl_parse(pTHXx_ XSINIT_t xsinit, int argc, char **argv, char **env)
889 #ifdef USE_5005THREADS
893 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
896 Perl_croak(aTHX_ "suidperl is no longer needed since the kernel can now execute\n\
897 setuid perl scripts securely.\n");
906 /* Come here if running an undumped a.out. */
908 PL_origfilename = savepv(argv[0]);
909 PL_do_undump = FALSE;
910 cxstack_ix = -1; /* start label stack again */
912 init_postdump_symbols(argc,argv,env);
917 op_free(PL_main_root);
918 PL_main_root = Nullop;
920 PL_main_start = Nullop;
921 SvREFCNT_dec(PL_main_cv);
925 oldscope = PL_scopestack_ix;
926 PL_dowarn = G_WARN_OFF;
928 #ifdef PERL_FLEXIBLE_EXCEPTIONS
929 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vparse_body), env, xsinit);
935 #ifndef PERL_FLEXIBLE_EXCEPTIONS
936 parse_body(env,xsinit);
939 call_list(oldscope, PL_checkav);
946 /* my_exit() was called */
947 while (PL_scopestack_ix > oldscope)
950 PL_curstash = PL_defstash;
952 call_list(oldscope, PL_checkav);
953 ret = STATUS_NATIVE_EXPORT;
956 PerlIO_printf(Perl_error_log, "panic: top_env\n");
964 #ifdef PERL_FLEXIBLE_EXCEPTIONS
966 S_vparse_body(pTHX_ va_list args)
968 char **env = va_arg(args, char**);
969 XSINIT_t xsinit = va_arg(args, XSINIT_t);
971 return parse_body(env, xsinit);
976 S_parse_body(pTHX_ char **env, XSINIT_t xsinit)
978 int argc = PL_origargc;
979 char **argv = PL_origargv;
980 char *scriptname = NULL;
982 VOL bool dosearch = FALSE;
986 char *cddir = Nullch;
988 sv_setpvn(PL_linestr,"",0);
989 sv = newSVpvn("",0); /* first used for -I flags */
993 for (argc--,argv++; argc > 0; argc--,argv++) {
994 if (argv[0][0] != '-' || !argv[0][1])
998 validarg = " PHOOEY ";
1006 #ifndef PERL_STRICT_CR
1031 if ((s = moreswitches(s)))
1036 if( !PL_tainting ) {
1037 PL_taint_warn = TRUE;
1044 PL_taint_warn = FALSE;
1049 #ifdef MACOS_TRADITIONAL
1050 /* ignore -e for Dev:Pseudo argument */
1051 if (argv[1] && !strcmp(argv[1], "Dev:Pseudo"))
1054 if (PL_euid != PL_uid || PL_egid != PL_gid)
1055 Perl_croak(aTHX_ "No -e allowed in setuid scripts");
1057 PL_e_script = newSVpvn("",0);
1058 filter_add(read_e_script, NULL);
1061 sv_catpv(PL_e_script, s);
1063 sv_catpv(PL_e_script, argv[1]);
1067 Perl_croak(aTHX_ "No code specified for -e");
1068 sv_catpv(PL_e_script, "\n");
1071 case 'I': /* -I handled both here and in moreswitches() */
1073 if (!*++s && (s=argv[1]) != Nullch) {
1078 STRLEN len = strlen(s);
1079 p = savepvn(s, len);
1080 incpush(p, TRUE, TRUE, FALSE);
1081 sv_catpvn(sv, "-I", 2);
1082 sv_catpvn(sv, p, len);
1083 sv_catpvn(sv, " ", 1);
1087 Perl_croak(aTHX_ "No directory specified for -I");
1091 PL_preprocess = TRUE;
1101 PL_preambleav = newAV();
1102 av_push(PL_preambleav, newSVpv("use Config qw(myconfig config_vars)",0));
1104 PL_Sv = newSVpv("print myconfig();",0);
1106 sv_catpv(PL_Sv,"print \"\\nCharacteristics of this PERLSHR image: \\n\",");
1108 sv_catpv(PL_Sv,"print \"\\nCharacteristics of this binary (from libperl): \\n\",");
1110 sv_catpv(PL_Sv,"\" Compile-time options:");
1112 sv_catpv(PL_Sv," DEBUGGING");
1114 # ifdef MULTIPLICITY
1115 sv_catpv(PL_Sv," MULTIPLICITY");
1117 # ifdef USE_5005THREADS
1118 sv_catpv(PL_Sv," USE_5005THREADS");
1120 # ifdef USE_ITHREADS
1121 sv_catpv(PL_Sv," USE_ITHREADS");
1123 # ifdef USE_64_BIT_INT
1124 sv_catpv(PL_Sv," USE_64_BIT_INT");
1126 # ifdef USE_64_BIT_ALL
1127 sv_catpv(PL_Sv," USE_64_BIT_ALL");
1129 # ifdef USE_LONG_DOUBLE
1130 sv_catpv(PL_Sv," USE_LONG_DOUBLE");
1132 # ifdef USE_LARGE_FILES
1133 sv_catpv(PL_Sv," USE_LARGE_FILES");
1136 sv_catpv(PL_Sv," USE_SOCKS");
1138 # ifdef PERL_IMPLICIT_CONTEXT
1139 sv_catpv(PL_Sv," PERL_IMPLICIT_CONTEXT");
1141 # ifdef PERL_IMPLICIT_SYS
1142 sv_catpv(PL_Sv," PERL_IMPLICIT_SYS");
1144 sv_catpv(PL_Sv,"\\n\",");
1146 #if defined(LOCAL_PATCH_COUNT)
1147 if (LOCAL_PATCH_COUNT > 0) {
1149 sv_catpv(PL_Sv,"\" Locally applied patches:\\n\",");
1150 for (i = 1; i <= LOCAL_PATCH_COUNT; i++) {
1151 if (PL_localpatches[i])
1152 Perl_sv_catpvf(aTHX_ PL_Sv,"q\" \t%s\n\",",PL_localpatches[i]);
1156 Perl_sv_catpvf(aTHX_ PL_Sv,"\" Built under %s\\n\"",OSNAME);
1159 Perl_sv_catpvf(aTHX_ PL_Sv,",\" Compiled at %s %s\\n\"",__DATE__,__TIME__);
1161 Perl_sv_catpvf(aTHX_ PL_Sv,",\" Compiled on %s\\n\"",__DATE__);
1164 sv_catpv(PL_Sv, "; \
1166 @env = map { \"$_=\\\"$ENV{$_}\\\"\" } sort grep {/^PERL/} keys %ENV; ");
1169 push @env, \"CYGWIN=\\\"$ENV{CYGWIN}\\\"\";");
1172 print \" \\%ENV:\\n @env\\n\" if @env; \
1173 print \" \\@INC:\\n @INC\\n\";");
1176 PL_Sv = newSVpv("config_vars(qw(",0);
1177 sv_catpv(PL_Sv, ++s);
1178 sv_catpv(PL_Sv, "))");
1181 av_push(PL_preambleav, PL_Sv);
1182 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
1185 PL_doextract = TRUE;
1193 if (!*++s || isSPACE(*s)) {
1197 /* catch use of gnu style long options */
1198 if (strEQ(s, "version")) {
1202 if (strEQ(s, "help")) {
1209 Perl_croak(aTHX_ "Unrecognized switch: -%s (-h will show valid options)",s);
1213 sv_setsv(get_sv("/", TRUE), PL_rs);
1216 #ifndef SECURE_INTERNAL_GETENV
1219 (s = PerlEnv_getenv("PERL5OPT")))
1224 if (*s == '-' && *(s+1) == 'T') {
1226 PL_taint_warn = FALSE;
1229 char *popt_copy = Nullch;
1242 if (!strchr("DIMUdmtwA", *s))
1243 Perl_croak(aTHX_ "Illegal switch in PERL5OPT: -%c", *s);
1247 popt_copy = SvPVX(sv_2mortal(newSVpv(popt,0)));
1248 s = popt_copy + (s - popt);
1249 d = popt_copy + (d - popt);
1256 if( !PL_tainting ) {
1257 PL_taint_warn = TRUE;
1267 if (PL_taint_warn && PL_dowarn != G_WARN_ALL_OFF) {
1268 PL_compiling.cop_warnings = newSVpvn(WARN_TAINTstring, WARNsize);
1272 scriptname = argv[0];
1275 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
1277 else if (scriptname == Nullch) {
1279 if ( PerlLIO_isatty(PerlIO_fileno(PerlIO_stdin())) )
1287 open_script(scriptname,dosearch,sv,&fdscript);
1289 validate_suid(validarg, scriptname,fdscript);
1292 #if defined(SIGCHLD) || defined(SIGCLD)
1295 # define SIGCHLD SIGCLD
1297 Sighandler_t sigstate = rsignal_state(SIGCHLD);
1298 if (sigstate == SIG_IGN) {
1299 if (ckWARN(WARN_SIGNAL))
1300 Perl_warner(aTHX_ packWARN(WARN_SIGNAL),
1301 "Can't ignore signal CHLD, forcing to default");
1302 (void)rsignal(SIGCHLD, (Sighandler_t)SIG_DFL);
1308 #ifdef MACOS_TRADITIONAL
1309 if (PL_doextract || gMacPerl_AlwaysExtract) {
1314 if (cddir && PerlDir_chdir(cddir) < 0)
1315 Perl_croak(aTHX_ "Can't chdir to %s",cddir);
1319 PL_main_cv = PL_compcv = (CV*)NEWSV(1104,0);
1320 sv_upgrade((SV *)PL_compcv, SVt_PVCV);
1321 CvUNIQUE_on(PL_compcv);
1323 CvPADLIST(PL_compcv) = pad_new(0);
1324 #ifdef USE_5005THREADS
1325 CvOWNER(PL_compcv) = 0;
1326 New(666, CvMUTEXP(PL_compcv), 1, perl_mutex);
1327 MUTEX_INIT(CvMUTEXP(PL_compcv));
1328 #endif /* USE_5005THREADS */
1331 boot_core_UNIVERSAL();
1333 boot_core_xsutils();
1337 (*xsinit)(aTHX); /* in case linked C routines want magical variables */
1339 #if defined(VMS) || defined(WIN32) || defined(DJGPP) || defined(__CYGWIN__) || defined(EPOC)
1345 # ifdef HAS_SOCKS5_INIT
1346 socks5_init(argv[0]);
1352 init_predump_symbols();
1353 /* init_postdump_symbols not currently designed to be called */
1354 /* more than once (ENV isn't cleared first, for example) */
1355 /* But running with -u leaves %ENV & @ARGV undefined! XXX */
1357 init_postdump_symbols(argc,argv,env);
1359 /* PL_unicode is turned on by -C or by $ENV{PERL_UNICODE}.
1360 * PL_utf8locale is conditionally turned on by
1361 * locale.c:Perl_init_i18nl10n() if the environment
1362 * look like the user wants to use UTF-8. */
1364 /* Requires init_predump_symbols(). */
1365 if (!(PL_unicode & PERL_UNICODE_LOCALE_FLAG) || PL_utf8locale) {
1370 /* Turn on UTF-8-ness on STDIN, STDOUT, STDERR
1371 * and the default open disciplines. */
1372 if ((PL_unicode & PERL_UNICODE_STDIN_FLAG) &&
1373 PL_stdingv && (io = GvIO(PL_stdingv)) &&
1375 PerlIO_binmode(aTHX_ fp, IoTYPE(io), 0, ":utf8");
1376 if ((PL_unicode & PERL_UNICODE_STDOUT_FLAG) &&
1377 PL_defoutgv && (io = GvIO(PL_defoutgv)) &&
1379 PerlIO_binmode(aTHX_ fp, IoTYPE(io), 0, ":utf8");
1380 if ((PL_unicode & PERL_UNICODE_STDERR_FLAG) &&
1381 PL_stderrgv && (io = GvIO(PL_stderrgv)) &&
1383 PerlIO_binmode(aTHX_ fp, IoTYPE(io), 0, ":utf8");
1384 if ((PL_unicode & PERL_UNICODE_INOUT_FLAG) &&
1385 (sv = GvSV(gv_fetchpv("\017PEN", TRUE, SVt_PV)))) {
1386 U32 in = PL_unicode & PERL_UNICODE_IN_FLAG;
1387 U32 out = PL_unicode & PERL_UNICODE_OUT_FLAG;
1390 sv_setpvn(sv, ":utf8\0:utf8", 11);
1392 sv_setpvn(sv, ":utf8\0", 6);
1395 sv_setpvn(sv, "\0:utf8", 6);
1401 if ((s = PerlEnv_getenv("PERL_SIGNALS"))) {
1402 if (strEQ(s, "unsafe"))
1403 PL_signals |= PERL_SIGNALS_UNSAFE_FLAG;
1404 else if (strEQ(s, "safe"))
1405 PL_signals &= ~PERL_SIGNALS_UNSAFE_FLAG;
1407 Perl_croak(aTHX_ "PERL_SIGNALS illegal: \"%s\"", s);
1412 /* now parse the script */
1414 SETERRNO(0,SS_NORMAL);
1416 #ifdef MACOS_TRADITIONAL
1417 if (gMacPerl_SyntaxError = (yyparse() || PL_error_count)) {
1419 Perl_croak(aTHX_ "%s had compilation errors.\n", MacPerl_MPWFileName(PL_origfilename));
1421 Perl_croak(aTHX_ "Execution of %s aborted due to compilation errors.\n",
1422 MacPerl_MPWFileName(PL_origfilename));
1426 if (yyparse() || PL_error_count) {
1428 Perl_croak(aTHX_ "%s had compilation errors.\n", PL_origfilename);
1430 Perl_croak(aTHX_ "Execution of %s aborted due to compilation errors.\n",
1435 CopLINE_set(PL_curcop, 0);
1436 PL_curstash = PL_defstash;
1437 PL_preprocess = FALSE;
1439 SvREFCNT_dec(PL_e_script);
1440 PL_e_script = Nullsv;
1447 SAVECOPFILE(PL_curcop);
1448 SAVECOPLINE(PL_curcop);
1449 gv_check(PL_defstash);
1456 if ((s=PerlEnv_getenv("PERL_DEBUG_MSTATS")) && atoi(s) >= 2)
1457 dump_mstats("after compilation:");
1466 =for apidoc perl_run
1468 Tells a Perl interpreter to run. See L<perlembed>.
1479 #ifdef USE_5005THREADS
1483 oldscope = PL_scopestack_ix;
1488 #ifdef PERL_FLEXIBLE_EXCEPTIONS
1490 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vrun_body), oldscope);
1496 cxstack_ix = -1; /* start context stack again */
1498 case 0: /* normal completion */
1499 #ifndef PERL_FLEXIBLE_EXCEPTIONS
1504 case 2: /* my_exit() */
1505 while (PL_scopestack_ix > oldscope)
1508 PL_curstash = PL_defstash;
1509 if (!(PL_exit_flags & PERL_EXIT_DESTRUCT_END) &&
1510 PL_endav && !PL_minus_c)
1511 call_list(oldscope, PL_endav);
1513 if (PerlEnv_getenv("PERL_DEBUG_MSTATS"))
1514 dump_mstats("after execution: ");
1516 ret = STATUS_NATIVE_EXPORT;
1520 POPSTACK_TO(PL_mainstack);
1523 PerlIO_printf(Perl_error_log, "panic: restartop\n");
1533 #ifdef PERL_FLEXIBLE_EXCEPTIONS
1535 S_vrun_body(pTHX_ va_list args)
1537 I32 oldscope = va_arg(args, I32);
1539 return run_body(oldscope);
1545 S_run_body(pTHX_ I32 oldscope)
1547 DEBUG_r(PerlIO_printf(Perl_debug_log, "%s $` $& $' support.\n",
1548 PL_sawampersand ? "Enabling" : "Omitting"));
1550 if (!PL_restartop) {
1551 DEBUG_x(dump_all());
1552 DEBUG(PerlIO_printf(Perl_debug_log, "\nEXECUTING...\n\n"));
1553 DEBUG_S(PerlIO_printf(Perl_debug_log, "main thread is 0x%"UVxf"\n",
1557 #ifdef MACOS_TRADITIONAL
1558 PerlIO_printf(Perl_error_log, "%s%s syntax OK\n",
1559 (gMacPerl_ErrorFormat ? "# " : ""),
1560 MacPerl_MPWFileName(PL_origfilename));
1562 PerlIO_printf(Perl_error_log, "%s syntax OK\n", PL_origfilename);
1566 if (PERLDB_SINGLE && PL_DBsingle)
1567 sv_setiv(PL_DBsingle, 1);
1569 call_list(oldscope, PL_initav);
1575 PL_op = PL_restartop;
1579 else if (PL_main_start) {
1580 CvDEPTH(PL_main_cv) = 1;
1581 PL_op = PL_main_start;
1591 =head1 SV Manipulation Functions
1593 =for apidoc p||get_sv
1595 Returns the SV of the specified Perl scalar. If C<create> is set and the
1596 Perl variable does not exist then it will be created. If C<create> is not
1597 set and the variable does not exist then NULL is returned.
1603 Perl_get_sv(pTHX_ const char *name, I32 create)
1606 #ifdef USE_5005THREADS
1607 if (name[1] == '\0' && !isALPHA(name[0])) {
1608 PADOFFSET tmp = find_threadsv(name);
1609 if (tmp != NOT_IN_PAD)
1610 return THREADSV(tmp);
1612 #endif /* USE_5005THREADS */
1613 gv = gv_fetchpv(name, create, SVt_PV);
1620 =head1 Array Manipulation Functions
1622 =for apidoc p||get_av
1624 Returns the AV of the specified Perl array. If C<create> is set and the
1625 Perl variable does not exist then it will be created. If C<create> is not
1626 set and the variable does not exist then NULL is returned.
1632 Perl_get_av(pTHX_ const char *name, I32 create)
1634 GV* gv = gv_fetchpv(name, create, SVt_PVAV);
1643 =head1 Hash Manipulation Functions
1645 =for apidoc p||get_hv
1647 Returns the HV of the specified Perl hash. If C<create> is set and the
1648 Perl variable does not exist then it will be created. If C<create> is not
1649 set and the variable does not exist then NULL is returned.
1655 Perl_get_hv(pTHX_ const char *name, I32 create)
1657 GV* gv = gv_fetchpv(name, create, SVt_PVHV);
1666 =head1 CV Manipulation Functions
1668 =for apidoc p||get_cv
1670 Returns the CV of the specified Perl subroutine. If C<create> is set and
1671 the Perl subroutine does not exist then it will be declared (which has the
1672 same effect as saying C<sub name;>). If C<create> is not set and the
1673 subroutine does not exist then NULL is returned.
1679 Perl_get_cv(pTHX_ const char *name, I32 create)
1681 GV* gv = gv_fetchpv(name, create, SVt_PVCV);
1682 /* XXX unsafe for threads if eval_owner isn't held */
1683 /* XXX this is probably not what they think they're getting.
1684 * It has the same effect as "sub name;", i.e. just a forward
1686 if (create && !GvCVu(gv))
1687 return newSUB(start_subparse(FALSE, 0),
1688 newSVOP(OP_CONST, 0, newSVpv(name,0)),
1696 /* Be sure to refetch the stack pointer after calling these routines. */
1700 =head1 Callback Functions
1702 =for apidoc p||call_argv
1704 Performs a callback to the specified Perl sub. See L<perlcall>.
1710 Perl_call_argv(pTHX_ const char *sub_name, I32 flags, register char **argv)
1712 /* See G_* flags in cop.h */
1713 /* null terminated arg list */
1720 XPUSHs(sv_2mortal(newSVpv(*argv,0)));
1725 return call_pv(sub_name, flags);
1729 =for apidoc p||call_pv
1731 Performs a callback to the specified Perl sub. See L<perlcall>.
1737 Perl_call_pv(pTHX_ const char *sub_name, I32 flags)
1738 /* name of the subroutine */
1739 /* See G_* flags in cop.h */
1741 return call_sv((SV*)get_cv(sub_name, TRUE), flags);
1745 =for apidoc p||call_method
1747 Performs a callback to the specified Perl method. The blessed object must
1748 be on the stack. See L<perlcall>.
1754 Perl_call_method(pTHX_ const char *methname, I32 flags)
1755 /* name of the subroutine */
1756 /* See G_* flags in cop.h */
1758 return call_sv(sv_2mortal(newSVpv(methname,0)), flags | G_METHOD);
1761 /* May be called with any of a CV, a GV, or an SV containing the name. */
1763 =for apidoc p||call_sv
1765 Performs a callback to the Perl sub whose name is in the SV. See
1772 Perl_call_sv(pTHX_ SV *sv, I32 flags)
1773 /* See G_* flags in cop.h */
1776 LOGOP myop; /* fake syntax tree node */
1779 volatile I32 retval = 0;
1781 bool oldcatch = CATCH_GET;
1786 if (flags & G_DISCARD) {
1791 Zero(&myop, 1, LOGOP);
1792 myop.op_next = Nullop;
1793 if (!(flags & G_NOARGS))
1794 myop.op_flags |= OPf_STACKED;
1795 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1796 (flags & G_ARRAY) ? OPf_WANT_LIST :
1801 EXTEND(PL_stack_sp, 1);
1802 *++PL_stack_sp = sv;
1804 oldscope = PL_scopestack_ix;
1806 if (PERLDB_SUB && PL_curstash != PL_debstash
1807 /* Handle first BEGIN of -d. */
1808 && (PL_DBcv || (PL_DBcv = GvCV(PL_DBsub)))
1809 /* Try harder, since this may have been a sighandler, thus
1810 * curstash may be meaningless. */
1811 && (SvTYPE(sv) != SVt_PVCV || CvSTASH((CV*)sv) != PL_debstash)
1812 && !(flags & G_NODEBUG))
1813 PL_op->op_private |= OPpENTERSUB_DB;
1815 if (flags & G_METHOD) {
1816 Zero(&method_op, 1, UNOP);
1817 method_op.op_next = PL_op;
1818 method_op.op_ppaddr = PL_ppaddr[OP_METHOD];
1819 myop.op_ppaddr = PL_ppaddr[OP_ENTERSUB];
1820 PL_op = (OP*)&method_op;
1823 if (!(flags & G_EVAL)) {
1825 call_body((OP*)&myop, FALSE);
1826 retval = PL_stack_sp - (PL_stack_base + oldmark);
1827 CATCH_SET(oldcatch);
1830 myop.op_other = (OP*)&myop;
1832 /* we're trying to emulate pp_entertry() here */
1834 register PERL_CONTEXT *cx;
1835 I32 gimme = GIMME_V;
1840 push_return(Nullop);
1841 PUSHBLOCK(cx, (CXt_EVAL|CXp_TRYBLOCK), PL_stack_sp);
1843 PL_eval_root = PL_op; /* Only needed so that goto works right. */
1845 PL_in_eval = EVAL_INEVAL;
1846 if (flags & G_KEEPERR)
1847 PL_in_eval |= EVAL_KEEPERR;
1853 #ifdef PERL_FLEXIBLE_EXCEPTIONS
1855 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vcall_body),
1862 #ifndef PERL_FLEXIBLE_EXCEPTIONS
1864 call_body((OP*)&myop, FALSE);
1866 retval = PL_stack_sp - (PL_stack_base + oldmark);
1867 if (!(flags & G_KEEPERR))
1874 /* my_exit() was called */
1875 PL_curstash = PL_defstash;
1878 if (PL_statusvalue && !(PL_exit_flags & PERL_EXIT_EXPECTED))
1879 Perl_croak(aTHX_ "Callback called exit");
1884 PL_op = PL_restartop;
1888 PL_stack_sp = PL_stack_base + oldmark;
1889 if (flags & G_ARRAY)
1893 *++PL_stack_sp = &PL_sv_undef;
1898 if (PL_scopestack_ix > oldscope) {
1902 register PERL_CONTEXT *cx;
1914 if (flags & G_DISCARD) {
1915 PL_stack_sp = PL_stack_base + oldmark;
1924 #ifdef PERL_FLEXIBLE_EXCEPTIONS
1926 S_vcall_body(pTHX_ va_list args)
1928 OP *myop = va_arg(args, OP*);
1929 int is_eval = va_arg(args, int);
1931 call_body(myop, is_eval);
1937 S_call_body(pTHX_ OP *myop, int is_eval)
1939 if (PL_op == myop) {
1941 PL_op = Perl_pp_entereval(aTHX); /* this doesn't do a POPMARK */
1943 PL_op = Perl_pp_entersub(aTHX); /* this does */
1949 /* Eval a string. The G_EVAL flag is always assumed. */
1952 =for apidoc p||eval_sv
1954 Tells Perl to C<eval> the string in the SV.
1960 Perl_eval_sv(pTHX_ SV *sv, I32 flags)
1962 /* See G_* flags in cop.h */
1965 UNOP myop; /* fake syntax tree node */
1966 volatile I32 oldmark = SP - PL_stack_base;
1967 volatile I32 retval = 0;
1973 if (flags & G_DISCARD) {
1980 Zero(PL_op, 1, UNOP);
1981 EXTEND(PL_stack_sp, 1);
1982 *++PL_stack_sp = sv;
1983 oldscope = PL_scopestack_ix;
1985 if (!(flags & G_NOARGS))
1986 myop.op_flags = OPf_STACKED;
1987 myop.op_next = Nullop;
1988 myop.op_type = OP_ENTEREVAL;
1989 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1990 (flags & G_ARRAY) ? OPf_WANT_LIST :
1992 if (flags & G_KEEPERR)
1993 myop.op_flags |= OPf_SPECIAL;
1995 #ifdef PERL_FLEXIBLE_EXCEPTIONS
1997 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vcall_body),
2004 #ifndef PERL_FLEXIBLE_EXCEPTIONS
2006 call_body((OP*)&myop,TRUE);
2008 retval = PL_stack_sp - (PL_stack_base + oldmark);
2009 if (!(flags & G_KEEPERR))
2016 /* my_exit() was called */
2017 PL_curstash = PL_defstash;
2020 if (PL_statusvalue && !(PL_exit_flags & PERL_EXIT_EXPECTED))
2021 Perl_croak(aTHX_ "Callback called exit");
2026 PL_op = PL_restartop;
2030 PL_stack_sp = PL_stack_base + oldmark;
2031 if (flags & G_ARRAY)
2035 *++PL_stack_sp = &PL_sv_undef;
2041 if (flags & G_DISCARD) {
2042 PL_stack_sp = PL_stack_base + oldmark;
2052 =for apidoc p||eval_pv
2054 Tells Perl to C<eval> the given string and return an SV* result.
2060 Perl_eval_pv(pTHX_ const char *p, I32 croak_on_error)
2063 SV* sv = newSVpv(p, 0);
2065 eval_sv(sv, G_SCALAR);
2072 if (croak_on_error && SvTRUE(ERRSV)) {
2074 Perl_croak(aTHX_ SvPVx(ERRSV, n_a));
2080 /* Require a module. */
2083 =head1 Embedding Functions
2085 =for apidoc p||require_pv
2087 Tells Perl to C<require> the file named by the string argument. It is
2088 analogous to the Perl code C<eval "require '$file'">. It's even
2089 implemented that way; consider using load_module instead.
2094 Perl_require_pv(pTHX_ const char *pv)
2098 PUSHSTACKi(PERLSI_REQUIRE);
2100 sv = sv_newmortal();
2101 sv_setpv(sv, "require '");
2104 eval_sv(sv, G_DISCARD);
2110 Perl_magicname(pTHX_ char *sym, char *name, I32 namlen)
2114 if ((gv = gv_fetchpv(sym,TRUE, SVt_PV)))
2115 sv_magic(GvSV(gv), (SV*)gv, PERL_MAGIC_sv, name, namlen);
2119 S_usage(pTHX_ char *name) /* XXX move this out into a module ? */
2121 /* This message really ought to be max 23 lines.
2122 * Removed -h because the user already knows that option. Others? */
2124 static char *usage_msg[] = {
2125 "-0[octal] specify record separator (\\0, if no argument)",
2126 "-a autosplit mode with -n or -p (splits $_ into @F)",
2127 "-C enable native wide character system interfaces",
2128 "-c check syntax only (runs BEGIN and CHECK blocks)",
2129 "-d[:debugger] run program under debugger",
2130 "-D[number/list] set debugging flags (argument is a bit mask or alphabets)",
2131 "-e 'command' one line of program (several -e's allowed, omit programfile)",
2132 "-F/pattern/ split() pattern for -a switch (//'s are optional)",
2133 "-i[extension] edit <> files in place (makes backup if extension supplied)",
2134 "-Idirectory specify @INC/#include directory (several -I's allowed)",
2135 "-l[octal] enable line ending processing, specifies line terminator",
2136 "-[mM][-]module execute `use/no module...' before executing program",
2137 "-n assume 'while (<>) { ... }' loop around program",
2138 "-p assume loop like -n but print line also, like sed",
2139 "-P run program through C preprocessor before compilation",
2140 "-s enable rudimentary parsing for switches after programfile",
2141 "-S look for programfile using PATH environment variable",
2142 "-T enable tainting checks",
2143 "-t enable tainting warnings",
2144 "-u dump core after parsing program",
2145 "-U allow unsafe operations",
2146 "-v print version, subversion (includes VERY IMPORTANT perl info)",
2147 "-V[:variable] print configuration summary (or a single Config.pm variable)",
2148 "-w enable many useful warnings (RECOMMENDED)",
2149 "-W enable all warnings",
2150 "-X disable all warnings",
2151 "-x[directory] strip off text before #!perl line and perhaps cd to directory",
2155 char **p = usage_msg;
2157 PerlIO_printf(PerlIO_stdout(),
2158 "\nUsage: %s [switches] [--] [programfile] [arguments]",
2161 PerlIO_printf(PerlIO_stdout(), "\n %s", *p++);
2164 /* This routine handles any switches that can be given during run */
2167 Perl_moreswitches(pTHX_ char *s)
2177 SvREFCNT_dec(PL_rs);
2178 if (s[1] == 'x' && s[2]) {
2182 for (s += 2, e = s; *e; e++);
2184 flags = PERL_SCAN_SILENT_ILLDIGIT;
2185 rschar = (U32)grok_hex(s, &numlen, &flags, NULL);
2186 if (s + numlen < e) {
2187 rschar = 0; /* Grandfather -0xFOO as -0 -xFOO. */
2191 PL_rs = newSVpvn("", 0);
2192 SvGROW(PL_rs, UNISKIP(rschar) + 1);
2193 tmps = (U8*)SvPVX(PL_rs);
2194 uvchr_to_utf8(tmps, rschar);
2195 SvCUR_set(PL_rs, UNISKIP(rschar));
2200 rschar = (U32)grok_oct(s, &numlen, &flags, NULL);
2201 if (rschar & ~((U8)~0))
2202 PL_rs = &PL_sv_undef;
2203 else if (!rschar && numlen >= 2)
2204 PL_rs = newSVpvn("", 0);
2206 char ch = (char)rschar;
2207 PL_rs = newSVpvn(&ch, 1);
2214 PL_unicode = parse_unicode_opts(&s);
2219 while (*s && !isSPACE(*s)) ++s;
2221 PL_splitstr = savepv(PL_splitstr);
2234 /* The following permits -d:Mod to accepts arguments following an =
2235 in the fashion that -MSome::Mod does. */
2236 if (*s == ':' || *s == '=') {
2239 sv = newSVpv("use Devel::", 0);
2241 /* We now allow -d:Module=Foo,Bar */
2242 while(isALNUM(*s) || *s==':') ++s;
2244 sv_catpv(sv, start);
2246 sv_catpvn(sv, start, s-start);
2247 sv_catpv(sv, " split(/,/,q{");
2252 my_setenv("PERL5DB", SvPV(sv, PL_na));
2255 PL_perldb = PERLDB_ALL;
2263 if (isALPHA(s[1])) {
2264 /* if adding extra options, remember to update DEBUG_MASK */
2265 static char debopts[] = "psltocPmfrxu HXDSTRJvC";
2268 for (s++; *s && (d = strchr(debopts,*s)); s++)
2269 PL_debug |= 1 << (d - debopts);
2272 PL_debug = atoi(s+1);
2273 for (s++; isDIGIT(*s); s++) ;
2276 if (DEBUG_p_TEST_ && ckWARN_d(WARN_DEBUGGING))
2277 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
2278 "-Dp not implemented on this platform\n");
2280 PL_debug |= DEBUG_TOP_FLAG;
2281 #else /* !DEBUGGING */
2282 if (ckWARN_d(WARN_DEBUGGING))
2283 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
2284 "Recompile perl with -DDEBUGGING to use -D switch\n");
2285 for (s++; isALNUM(*s); s++) ;
2291 usage(PL_origargv[0]);
2295 Safefree(PL_inplace);
2296 #if defined(__CYGWIN__) /* do backup extension automagically */
2297 if (*(s+1) == '\0') {
2298 PL_inplace = savepv(".bak");
2301 #endif /* __CYGWIN__ */
2302 PL_inplace = savepv(s+1);
2304 for (s = PL_inplace; *s && !isSPACE(*s); s++) ;
2307 if (*s == '-') /* Additional switches on #! line. */
2311 case 'I': /* -I handled both here and in parse_body() */
2314 while (*s && isSPACE(*s))
2319 /* ignore trailing spaces (possibly followed by other switches) */
2321 for (e = p; *e && !isSPACE(*e); e++) ;
2325 } while (*p && *p != '-');
2326 e = savepvn(s, e-s);
2327 incpush(e, TRUE, TRUE, FALSE);
2334 Perl_croak(aTHX_ "No directory specified for -I");
2340 SvREFCNT_dec(PL_ors_sv);
2345 PL_ors_sv = newSVpvn("\n",1);
2346 numlen = 3 + (*s == '0');
2347 *SvPVX(PL_ors_sv) = (char)grok_oct(s, &numlen, &flags, NULL);
2351 if (RsPARA(PL_rs)) {
2352 PL_ors_sv = newSVpvn("\n\n",2);
2355 PL_ors_sv = newSVsv(PL_rs);
2362 PL_preambleav = newAV();
2364 SV *sv = newSVpvn("use assertions::activate split(/,/,q{",37);
2368 av_push(PL_preambleav, sv);
2371 av_push(PL_preambleav, newSVpvn("use assertions::activate",24));
2374 forbid_setid("-M"); /* XXX ? */
2377 forbid_setid("-m"); /* XXX ? */
2382 /* -M-foo == 'no foo' */
2383 if (*s == '-') { use = "no "; ++s; }
2384 sv = newSVpv(use,0);
2386 /* We allow -M'Module qw(Foo Bar)' */
2387 while(isALNUM(*s) || *s==':') ++s;
2389 sv_catpv(sv, start);
2390 if (*(start-1) == 'm') {
2392 Perl_croak(aTHX_ "Can't use '%c' after -mname", *s);
2393 sv_catpv( sv, " ()");
2397 Perl_croak(aTHX_ "Module name required with -%c option",
2399 sv_catpvn(sv, start, s-start);
2400 sv_catpv(sv, " split(/,/,q{");
2406 PL_preambleav = newAV();
2407 av_push(PL_preambleav, sv);
2410 Perl_croak(aTHX_ "No space allowed after -%c", *(s-1));
2422 PL_doswitches = TRUE;
2427 Perl_croak(aTHX_ "Too late for \"-t\" option");
2432 Perl_croak(aTHX_ "Too late for \"-T\" option");
2436 #ifdef MACOS_TRADITIONAL
2437 Perl_croak(aTHX_ "Believe me, you don't want to use \"-u\" on a Macintosh");
2439 PL_do_undump = TRUE;
2448 PerlIO_printf(PerlIO_stdout(),
2449 Perl_form(aTHX_ "\nThis is perl, v%"VDf" built for %s",
2450 PL_patchlevel, ARCHNAME));
2452 /* Adjust verbose output as in the perl that ships with the DG/UX OS from EMC */
2453 PerlIO_printf(PerlIO_stdout(),
2454 Perl_form(aTHX_ "\nThis is perl, version %vd\n", PL_patchlevel));
2455 PerlIO_printf(PerlIO_stdout(),
2456 Perl_form(aTHX_ " built under %s at %s %s\n",
2457 OSNAME, __DATE__, __TIME__));
2458 PerlIO_printf(PerlIO_stdout(),
2459 Perl_form(aTHX_ " OS Specific Release: %s\n",
2463 #if defined(LOCAL_PATCH_COUNT)
2464 if (LOCAL_PATCH_COUNT > 0)
2465 PerlIO_printf(PerlIO_stdout(),
2466 "\n(with %d registered patch%s, "
2467 "see perl -V for more detail)",
2468 (int)LOCAL_PATCH_COUNT,
2469 (LOCAL_PATCH_COUNT!=1) ? "es" : "");
2472 PerlIO_printf(PerlIO_stdout(),
2473 "\n\nCopyright 1987-2003, Larry Wall\n");
2474 #ifdef MACOS_TRADITIONAL
2475 PerlIO_printf(PerlIO_stdout(),
2476 "\nMac OS port Copyright 1991-2002, Matthias Neeracher;\n"
2477 "maintained by Chris Nandor\n");
2480 PerlIO_printf(PerlIO_stdout(),
2481 "\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
2484 PerlIO_printf(PerlIO_stdout(),
2485 "djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n"
2486 "djgpp v2 port (perl5004+) by Laszlo Molnar, 1997-1999\n");
2489 PerlIO_printf(PerlIO_stdout(),
2490 "\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
2491 "Version 5 port Copyright (c) 1994-2002, Andreas Kaiser, Ilya Zakharevich\n");
2494 PerlIO_printf(PerlIO_stdout(),
2495 "atariST series port, ++jrb bammi@cadence.com\n");
2498 PerlIO_printf(PerlIO_stdout(),
2499 "BeOS port Copyright Tom Spindler, 1997-1999\n");
2502 PerlIO_printf(PerlIO_stdout(),
2503 "MPE/iX port Copyright by Mark Klein and Mark Bixby, 1996-2002\n");
2506 PerlIO_printf(PerlIO_stdout(),
2507 "MVS (OS390) port by Mortice Kern Systems, 1997-1999\n");
2510 PerlIO_printf(PerlIO_stdout(),
2511 "Stratus VOS port by Paul.Green@stratus.com, 1997-2002\n");
2514 PerlIO_printf(PerlIO_stdout(),
2515 "VM/ESA port by Neale Ferguson, 1998-1999\n");
2518 PerlIO_printf(PerlIO_stdout(),
2519 "BS2000 (POSIX) port by Start Amadeus GmbH, 1998-1999\n");
2522 PerlIO_printf(PerlIO_stdout(),
2523 "MiNT port by Guido Flohr, 1997-1999\n");
2526 PerlIO_printf(PerlIO_stdout(),
2527 "EPOC port by Olaf Flebbe, 1999-2002\n");
2530 PerlIO_printf(PerlIO_stdout(),"WINCE port by Rainer Keuchel, 2001-2002\n");
2531 PerlIO_printf(PerlIO_stdout(),"Built on " __DATE__ " " __TIME__ "\n\n");
2534 #ifdef BINARY_BUILD_NOTICE
2535 BINARY_BUILD_NOTICE;
2537 PerlIO_printf(PerlIO_stdout(),
2539 Perl may be copied only under the terms of either the Artistic License or the\n\
2540 GNU General Public License, which may be found in the Perl 5 source kit.\n\n\
2541 Complete documentation for Perl, including FAQ lists, should be found on\n\
2542 this system using `man perl' or `perldoc perl'. If you have access to the\n\
2543 Internet, point your browser at http://www.perl.com/, the Perl Home Page.\n\n");
2546 if (! (PL_dowarn & G_WARN_ALL_MASK))
2547 PL_dowarn |= G_WARN_ON;
2551 PL_dowarn = G_WARN_ALL_ON|G_WARN_ON;
2552 if (!specialWARN(PL_compiling.cop_warnings))
2553 SvREFCNT_dec(PL_compiling.cop_warnings);
2554 PL_compiling.cop_warnings = pWARN_ALL ;
2558 PL_dowarn = G_WARN_ALL_OFF;
2559 if (!specialWARN(PL_compiling.cop_warnings))
2560 SvREFCNT_dec(PL_compiling.cop_warnings);
2561 PL_compiling.cop_warnings = pWARN_NONE ;
2566 if (s[1] == '-') /* Additional switches on #! line. */
2571 #if defined(WIN32) || !defined(PERL_STRICT_CR)
2577 #ifdef ALTERNATE_SHEBANG
2578 case 'S': /* OS/2 needs -S on "extproc" line. */
2586 Perl_croak(aTHX_ "Can't emulate -%.1s on #! line",s);
2591 /* compliments of Tom Christiansen */
2593 /* unexec() can be found in the Gnu emacs distribution */
2594 /* Known to work with -DUNEXEC and using unexelf.c from GNU emacs-20.2 */
2597 Perl_my_unexec(pTHX)
2605 prog = newSVpv(BIN_EXP, 0);
2606 sv_catpv(prog, "/perl");
2607 file = newSVpv(PL_origfilename, 0);
2608 sv_catpv(file, ".perldump");
2610 unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
2611 /* unexec prints msg to stderr in case of failure */
2612 PerlProc_exit(status);
2615 # include <lib$routines.h>
2616 lib$signal(SS$_DEBUG); /* ssdef.h #included from vmsish.h */
2618 ABORT(); /* for use with undump */
2623 /* initialize curinterp */
2629 # define PERLVAR(var,type)
2630 # define PERLVARA(var,n,type)
2631 # if defined(PERL_IMPLICIT_CONTEXT)
2632 # if defined(USE_5005THREADS)
2633 # define PERLVARI(var,type,init) PERL_GET_INTERP->var = init;
2634 # define PERLVARIC(var,type,init) PERL_GET_INTERP->var = init;
2635 # else /* !USE_5005THREADS */
2636 # define PERLVARI(var,type,init) aTHX->var = init;
2637 # define PERLVARIC(var,type,init) aTHX->var = init;
2638 # endif /* USE_5005THREADS */
2640 # define PERLVARI(var,type,init) PERL_GET_INTERP->var = init;
2641 # define PERLVARIC(var,type,init) PERL_GET_INTERP->var = init;
2643 # include "intrpvar.h"
2644 # ifndef USE_5005THREADS
2645 # include "thrdvar.h"
2652 # define PERLVAR(var,type)
2653 # define PERLVARA(var,n,type)
2654 # define PERLVARI(var,type,init) PL_##var = init;
2655 # define PERLVARIC(var,type,init) PL_##var = init;
2656 # include "intrpvar.h"
2657 # ifndef USE_5005THREADS
2658 # include "thrdvar.h"
2669 S_init_main_stash(pTHX)
2673 PL_curstash = PL_defstash = newHV();
2674 PL_curstname = newSVpvn("main",4);
2675 gv = gv_fetchpv("main::",TRUE, SVt_PVHV);
2676 SvREFCNT_dec(GvHV(gv));
2677 GvHV(gv) = (HV*)SvREFCNT_inc(PL_defstash);
2679 HvNAME(PL_defstash) = savepv("main");
2680 PL_incgv = gv_HVadd(gv_AVadd(gv_fetchpv("INC",TRUE, SVt_PVAV)));
2681 GvMULTI_on(PL_incgv);
2682 PL_hintgv = gv_fetchpv("\010",TRUE, SVt_PV); /* ^H */
2683 GvMULTI_on(PL_hintgv);
2684 PL_defgv = gv_fetchpv("_",TRUE, SVt_PVAV);
2685 PL_errgv = gv_HVadd(gv_fetchpv("@", TRUE, SVt_PV));
2686 GvMULTI_on(PL_errgv);
2687 PL_replgv = gv_fetchpv("\022", TRUE, SVt_PV); /* ^R */
2688 GvMULTI_on(PL_replgv);
2689 (void)Perl_form(aTHX_ "%240s",""); /* Preallocate temp - for immediate signals. */
2690 sv_grow(ERRSV, 240); /* Preallocate - for immediate signals. */
2691 sv_setpvn(ERRSV, "", 0);
2692 PL_curstash = PL_defstash;
2693 CopSTASH_set(&PL_compiling, PL_defstash);
2694 PL_debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
2695 PL_globalstash = GvHV(gv_fetchpv("CORE::GLOBAL::", GV_ADDMULTI, SVt_PVHV));
2696 /* We must init $/ before switches are processed. */
2697 sv_setpvn(get_sv("/", TRUE), "\n", 1);
2701 S_open_script(pTHX_ char *scriptname, bool dosearch, SV *sv, int *fdscript)
2705 char *cpp_discard_flag;
2711 PL_origfilename = savepv("-e");
2714 /* if find_script() returns, it returns a malloc()-ed value */
2715 PL_origfilename = scriptname = find_script(scriptname, dosearch, NULL, 1);
2717 if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
2718 char *s = scriptname + 8;
2719 *fdscript = atoi(s);
2723 scriptname = savepv(s + 1);
2724 Safefree(PL_origfilename);
2725 PL_origfilename = scriptname;
2730 CopFILE_free(PL_curcop);
2731 CopFILE_set(PL_curcop, PL_origfilename);
2732 if (strEQ(PL_origfilename,"-"))
2734 if (*fdscript >= 0) {
2735 PL_rsfp = PerlIO_fdopen(*fdscript,PERL_SCRIPT_MODE);
2736 # if defined(HAS_FCNTL) && defined(F_SETFD)
2738 /* ensure close-on-exec */
2739 fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,1);
2742 else if (PL_preprocess) {
2743 char *cpp_cfg = CPPSTDIN;
2744 SV *cpp = newSVpvn("",0);
2745 SV *cmd = NEWSV(0,0);
2747 if (strEQ(cpp_cfg, "cppstdin"))
2748 Perl_sv_catpvf(aTHX_ cpp, "%s/", BIN_EXP);
2749 sv_catpv(cpp, cpp_cfg);
2752 sv_catpvn(sv, "-I", 2);
2753 sv_catpv(sv,PRIVLIB_EXP);
2756 DEBUG_P(PerlIO_printf(Perl_debug_log,
2757 "PL_preprocess: scriptname=\"%s\", cpp=\"%s\", sv=\"%s\", CPPMINUS=\"%s\"\n",
2758 scriptname, SvPVX (cpp), SvPVX (sv), CPPMINUS));
2760 # if defined(MSDOS) || defined(WIN32) || defined(VMS)
2767 cpp_discard_flag = "";
2769 cpp_discard_flag = "-C";
2773 perl = os2_execname(aTHX);
2775 perl = PL_origargv[0];
2779 /* This strips off Perl comments which might interfere with
2780 the C pre-processor, including #!. #line directives are
2781 deliberately stripped to avoid confusion with Perl's version
2782 of #line. FWP played some golf with it so it will fit
2783 into VMS's 255 character buffer.
2786 code = "(1../^#!.*perl/i)|/^\\s*#(?!\\s*((ifn?|un)def|(el|end)?if|define|include|else|error|pragma)\\b)/||!($|=1)||print";
2788 code = "/^\\s*#(?!\\s*((ifn?|un)def|(el|end)?if|define|include|else|error|pragma)\\b)/||!($|=1)||print";
2790 Perl_sv_setpvf(aTHX_ cmd, "\
2791 %s -ne%s%s%s %s | %"SVf" %s %"SVf" %s",
2792 perl, quote, code, quote, scriptname, cpp,
2793 cpp_discard_flag, sv, CPPMINUS);
2795 PL_doextract = FALSE;
2796 # ifdef IAMSUID /* actually, this is caught earlier */
2797 if (PL_euid != PL_uid && !PL_euid) { /* if running suidperl */
2799 (void)seteuid(PL_uid); /* musn't stay setuid root */
2801 # ifdef HAS_SETREUID
2802 (void)setreuid((Uid_t)-1, PL_uid);
2804 # ifdef HAS_SETRESUID
2805 (void)setresuid((Uid_t)-1, PL_uid, (Uid_t)-1);
2807 PerlProc_setuid(PL_uid);
2811 if (PerlProc_geteuid() != PL_uid)
2812 Perl_croak(aTHX_ "Can't do seteuid!\n");
2814 # endif /* IAMSUID */
2816 DEBUG_P(PerlIO_printf(Perl_debug_log,
2817 "PL_preprocess: cmd=\"%s\"\n",
2820 PL_rsfp = PerlProc_popen(SvPVX(cmd), "r");
2824 else if (!*scriptname) {
2825 forbid_setid("program input from stdin");
2826 PL_rsfp = PerlIO_stdin();
2829 PL_rsfp = PerlIO_open(scriptname,PERL_SCRIPT_MODE);
2830 # if defined(HAS_FCNTL) && defined(F_SETFD)
2832 /* ensure close-on-exec */
2833 fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,1);
2838 # ifndef IAMSUID /* in case script is not readable before setuid */
2840 PerlLIO_stat(CopFILE(PL_curcop),&PL_statbuf) >= 0 &&
2841 PL_statbuf.st_mode & (S_ISUID|S_ISGID))
2844 PerlProc_execv(Perl_form(aTHX_ "%s/sperl"PERL_FS_VER_FMT,
2845 BIN_EXP, (int)PERL_REVISION,
2847 (int)PERL_SUBVERSION), PL_origargv);
2848 Perl_croak(aTHX_ "Can't do setuid\n");
2854 Perl_croak(aTHX_ "Can't open perl script: %s\n",
2857 Perl_croak(aTHX_ "Can't open perl script \"%s\": %s\n",
2858 CopFILE(PL_curcop), Strerror(errno));
2864 * I_SYSSTATVFS HAS_FSTATVFS
2866 * I_STATFS HAS_FSTATFS HAS_GETFSSTAT
2867 * I_MNTENT HAS_GETMNTENT HAS_HASMNTOPT
2868 * here so that metaconfig picks them up. */
2872 S_fd_on_nosuid_fs(pTHX_ int fd)
2874 int check_okay = 0; /* able to do all the required sys/libcalls */
2875 int on_nosuid = 0; /* the fd is on a nosuid fs */
2877 * Preferred order: fstatvfs(), fstatfs(), ustat()+getmnt(), getmntent().
2878 * fstatvfs() is UNIX98.
2879 * fstatfs() is 4.3 BSD.
2880 * ustat()+getmnt() is pre-4.3 BSD.
2881 * getmntent() is O(number-of-mounted-filesystems) and can hang on
2882 * an irrelevant filesystem while trying to reach the right one.
2885 #undef FD_ON_NOSUID_CHECK_OKAY /* found the syscalls to do the check? */
2887 # if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
2888 defined(HAS_FSTATVFS)
2889 # define FD_ON_NOSUID_CHECK_OKAY
2890 struct statvfs stfs;
2892 check_okay = fstatvfs(fd, &stfs) == 0;
2893 on_nosuid = check_okay && (stfs.f_flag & ST_NOSUID);
2894 # endif /* fstatvfs */
2896 # if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
2897 defined(PERL_MOUNT_NOSUID) && \
2898 defined(HAS_FSTATFS) && \
2899 defined(HAS_STRUCT_STATFS) && \
2900 defined(HAS_STRUCT_STATFS_F_FLAGS)
2901 # define FD_ON_NOSUID_CHECK_OKAY
2904 check_okay = fstatfs(fd, &stfs) == 0;
2905 on_nosuid = check_okay && (stfs.f_flags & PERL_MOUNT_NOSUID);
2906 # endif /* fstatfs */
2908 # if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
2909 defined(PERL_MOUNT_NOSUID) && \
2910 defined(HAS_FSTAT) && \
2911 defined(HAS_USTAT) && \
2912 defined(HAS_GETMNT) && \
2913 defined(HAS_STRUCT_FS_DATA) && \
2915 # define FD_ON_NOSUID_CHECK_OKAY
2918 if (fstat(fd, &fdst) == 0) {
2920 if (ustat(fdst.st_dev, &us) == 0) {
2922 /* NOSTAT_ONE here because we're not examining fields which
2923 * vary between that case and STAT_ONE. */
2924 if (getmnt((int*)0, &fsd, (int)0, NOSTAT_ONE, us.f_fname) == 0) {
2925 size_t cmplen = sizeof(us.f_fname);
2926 if (sizeof(fsd.fd_req.path) < cmplen)
2927 cmplen = sizeof(fsd.fd_req.path);
2928 if (strnEQ(fsd.fd_req.path, us.f_fname, cmplen) &&
2929 fdst.st_dev == fsd.fd_req.dev) {
2931 on_nosuid = fsd.fd_req.flags & PERL_MOUNT_NOSUID;
2937 # endif /* fstat+ustat+getmnt */
2939 # if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
2940 defined(HAS_GETMNTENT) && \
2941 defined(HAS_HASMNTOPT) && \
2942 defined(MNTOPT_NOSUID)
2943 # define FD_ON_NOSUID_CHECK_OKAY
2944 FILE *mtab = fopen("/etc/mtab", "r");
2945 struct mntent *entry;
2948 if (mtab && (fstat(fd, &stb) == 0)) {
2949 while (entry = getmntent(mtab)) {
2950 if (stat(entry->mnt_dir, &fsb) == 0
2951 && fsb.st_dev == stb.st_dev)
2953 /* found the filesystem */
2955 if (hasmntopt(entry, MNTOPT_NOSUID))
2958 } /* A single fs may well fail its stat(). */
2963 # endif /* getmntent+hasmntopt */
2966 Perl_croak(aTHX_ "Can't check filesystem of script \"%s\" for nosuid", PL_origfilename);
2969 #endif /* IAMSUID */
2972 S_validate_suid(pTHX_ char *validarg, char *scriptname, int fdscript)
2978 /* do we need to emulate setuid on scripts? */
2980 /* This code is for those BSD systems that have setuid #! scripts disabled
2981 * in the kernel because of a security problem. Merely defining DOSUID
2982 * in perl will not fix that problem, but if you have disabled setuid
2983 * scripts in the kernel, this will attempt to emulate setuid and setgid
2984 * on scripts that have those now-otherwise-useless bits set. The setuid
2985 * root version must be called suidperl or sperlN.NNN. If regular perl
2986 * discovers that it has opened a setuid script, it calls suidperl with
2987 * the same argv that it had. If suidperl finds that the script it has
2988 * just opened is NOT setuid root, it sets the effective uid back to the
2989 * uid. We don't just make perl setuid root because that loses the
2990 * effective uid we had before invoking perl, if it was different from the
2993 * DOSUID must be defined in both perl and suidperl, and IAMSUID must
2994 * be defined in suidperl only. suidperl must be setuid root. The
2995 * Configure script will set this up for you if you want it.
3001 if (PerlLIO_fstat(PerlIO_fileno(PL_rsfp),&PL_statbuf) < 0) /* normal stat is insecure */
3002 Perl_croak(aTHX_ "Can't stat script \"%s\"",PL_origfilename);
3003 if (fdscript < 0 && PL_statbuf.st_mode & (S_ISUID|S_ISGID)) {
3008 #ifndef HAS_SETREUID
3009 /* On this access check to make sure the directories are readable,
3010 * there is actually a small window that the user could use to make
3011 * filename point to an accessible directory. So there is a faint
3012 * chance that someone could execute a setuid script down in a
3013 * non-accessible directory. I don't know what to do about that.
3014 * But I don't think it's too important. The manual lies when
3015 * it says access() is useful in setuid programs.
3017 if (PerlLIO_access(CopFILE(PL_curcop),1)) /*double check*/
3018 Perl_croak(aTHX_ "Permission denied");
3020 /* If we can swap euid and uid, then we can determine access rights
3021 * with a simple stat of the file, and then compare device and
3022 * inode to make sure we did stat() on the same file we opened.
3023 * Then we just have to make sure he or she can execute it.
3030 setreuid(PL_euid,PL_uid) < 0
3033 setresuid(PL_euid,PL_uid,(Uid_t)-1) < 0
3036 || PerlProc_getuid() != PL_euid || PerlProc_geteuid() != PL_uid)
3037 Perl_croak(aTHX_ "Can't swap uid and euid"); /* really paranoid */
3038 if (PerlLIO_stat(CopFILE(PL_curcop),&tmpstatbuf) < 0)
3039 Perl_croak(aTHX_ "Permission denied"); /* testing full pathname here */
3040 #if defined(IAMSUID) && !defined(NO_NOSUID_CHECK)
3041 if (fd_on_nosuid_fs(PerlIO_fileno(PL_rsfp)))
3042 Perl_croak(aTHX_ "Permission denied");
3044 if (tmpstatbuf.st_dev != PL_statbuf.st_dev ||
3045 tmpstatbuf.st_ino != PL_statbuf.st_ino) {
3046 (void)PerlIO_close(PL_rsfp);
3047 Perl_croak(aTHX_ "Permission denied\n");
3051 setreuid(PL_uid,PL_euid) < 0
3053 # if defined(HAS_SETRESUID)
3054 setresuid(PL_uid,PL_euid,(Uid_t)-1) < 0
3057 || PerlProc_getuid() != PL_uid || PerlProc_geteuid() != PL_euid)
3058 Perl_croak(aTHX_ "Can't reswap uid and euid");
3059 if (!cando(S_IXUSR,FALSE,&PL_statbuf)) /* can real uid exec? */
3060 Perl_croak(aTHX_ "Permission denied\n");
3062 #endif /* HAS_SETREUID */
3063 #endif /* IAMSUID */
3065 if (!S_ISREG(PL_statbuf.st_mode))
3066 Perl_croak(aTHX_ "Permission denied");
3067 if (PL_statbuf.st_mode & S_IWOTH)
3068 Perl_croak(aTHX_ "Setuid/gid script is writable by world");
3069 PL_doswitches = FALSE; /* -s is insecure in suid */
3070 CopLINE_inc(PL_curcop);
3071 if (sv_gets(PL_linestr, PL_rsfp, 0) == Nullch ||
3072 strnNE(SvPV(PL_linestr,n_a),"#!",2) ) /* required even on Sys V */
3073 Perl_croak(aTHX_ "No #! line");
3074 s = SvPV(PL_linestr,n_a)+2;
3076 while (!isSPACE(*s)) s++;
3077 for (s2 = s; (s2 > SvPV(PL_linestr,n_a)+2 &&
3078 (isDIGIT(s2[-1]) || strchr("._-", s2[-1]))); s2--) ;
3079 if (strnNE(s2-4,"perl",4) && strnNE(s-9,"perl",4)) /* sanity check */
3080 Perl_croak(aTHX_ "Not a perl script");
3081 while (*s == ' ' || *s == '\t') s++;
3083 * #! arg must be what we saw above. They can invoke it by
3084 * mentioning suidperl explicitly, but they may not add any strange
3085 * arguments beyond what #! says if they do invoke suidperl that way.
3087 len = strlen(validarg);
3088 if (strEQ(validarg," PHOOEY ") ||
3089 strnNE(s,validarg,len) || !isSPACE(s[len]))
3090 Perl_croak(aTHX_ "Args must match #! line");
3093 if (PL_euid != PL_uid && (PL_statbuf.st_mode & S_ISUID) &&
3094 PL_euid == PL_statbuf.st_uid)
3096 Perl_croak(aTHX_ "YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
3097 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
3098 #endif /* IAMSUID */
3100 if (PL_euid) { /* oops, we're not the setuid root perl */
3101 (void)PerlIO_close(PL_rsfp);
3104 PerlProc_execv(Perl_form(aTHX_ "%s/sperl"PERL_FS_VER_FMT, BIN_EXP,
3105 (int)PERL_REVISION, (int)PERL_VERSION,
3106 (int)PERL_SUBVERSION), PL_origargv);
3108 Perl_croak(aTHX_ "Can't do setuid\n");
3111 if (PL_statbuf.st_mode & S_ISGID && PL_statbuf.st_gid != PL_egid) {
3113 (void)setegid(PL_statbuf.st_gid);
3116 (void)setregid((Gid_t)-1,PL_statbuf.st_gid);
3118 #ifdef HAS_SETRESGID
3119 (void)setresgid((Gid_t)-1,PL_statbuf.st_gid,(Gid_t)-1);
3121 PerlProc_setgid(PL_statbuf.st_gid);
3125 if (PerlProc_getegid() != PL_statbuf.st_gid)
3126 Perl_croak(aTHX_ "Can't do setegid!\n");
3128 if (PL_statbuf.st_mode & S_ISUID) {
3129 if (PL_statbuf.st_uid != PL_euid)
3131 (void)seteuid(PL_statbuf.st_uid); /* all that for this */
3134 (void)setreuid((Uid_t)-1,PL_statbuf.st_uid);
3136 #ifdef HAS_SETRESUID
3137 (void)setresuid((Uid_t)-1,PL_statbuf.st_uid,(Uid_t)-1);
3139 PerlProc_setuid(PL_statbuf.st_uid);
3143 if (PerlProc_geteuid() != PL_statbuf.st_uid)
3144 Perl_croak(aTHX_ "Can't do seteuid!\n");
3146 else if (PL_uid) { /* oops, mustn't run as root */
3148 (void)seteuid((Uid_t)PL_uid);
3151 (void)setreuid((Uid_t)-1,(Uid_t)PL_uid);
3153 #ifdef HAS_SETRESUID
3154 (void)setresuid((Uid_t)-1,(Uid_t)PL_uid,(Uid_t)-1);
3156 PerlProc_setuid((Uid_t)PL_uid);
3160 if (PerlProc_geteuid() != PL_uid)
3161 Perl_croak(aTHX_ "Can't do seteuid!\n");
3164 if (!cando(S_IXUSR,TRUE,&PL_statbuf))
3165 Perl_croak(aTHX_ "Permission denied\n"); /* they can't do this */
3168 else if (PL_preprocess)
3169 Perl_croak(aTHX_ "-P not allowed for setuid/setgid script\n");
3170 else if (fdscript >= 0)
3171 Perl_croak(aTHX_ "fd script not allowed in suidperl\n");
3173 Perl_croak(aTHX_ "Script is not setuid/setgid in suidperl\n");
3175 /* We absolutely must clear out any saved ids here, so we */
3176 /* exec the real perl, substituting fd script for scriptname. */
3177 /* (We pass script name as "subdir" of fd, which perl will grok.) */
3178 PerlIO_rewind(PL_rsfp);
3179 PerlLIO_lseek(PerlIO_fileno(PL_rsfp),(Off_t)0,0); /* just in case rewind didn't */
3180 for (which = 1; PL_origargv[which] && PL_origargv[which] != scriptname; which++) ;
3181 if (!PL_origargv[which])
3182 Perl_croak(aTHX_ "Permission denied");
3183 PL_origargv[which] = savepv(Perl_form(aTHX_ "/dev/fd/%d/%s",
3184 PerlIO_fileno(PL_rsfp), PL_origargv[which]));
3185 #if defined(HAS_FCNTL) && defined(F_SETFD)
3186 fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,0); /* ensure no close-on-exec */
3188 PerlProc_execv(Perl_form(aTHX_ "%s/perl"PERL_FS_VER_FMT, BIN_EXP,
3189 (int)PERL_REVISION, (int)PERL_VERSION,
3190 (int)PERL_SUBVERSION), PL_origargv);/* try again */
3191 Perl_croak(aTHX_ "Can't do setuid\n");
3192 #endif /* IAMSUID */
3194 if (PL_euid != PL_uid || PL_egid != PL_gid) { /* (suidperl doesn't exist, in fact) */
3195 #ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
3196 PerlLIO_fstat(PerlIO_fileno(PL_rsfp),&PL_statbuf); /* may be either wrapped or real suid */
3197 if ((PL_euid != PL_uid && PL_euid == PL_statbuf.st_uid && PL_statbuf.st_mode & S_ISUID)
3199 (PL_egid != PL_gid && PL_egid == PL_statbuf.st_gid && PL_statbuf.st_mode & S_ISGID)
3202 Perl_croak(aTHX_ "YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
3203 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
3204 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
3205 /* not set-id, must be wrapped */
3211 S_find_beginning(pTHX)
3213 register char *s, *s2;
3214 #ifdef MACOS_TRADITIONAL
3218 /* skip forward in input to the real script? */
3221 #ifdef MACOS_TRADITIONAL
3222 /* Since the Mac OS does not honor #! arguments for us, we do it ourselves */
3224 while (PL_doextract || gMacPerl_AlwaysExtract) {
3225 if ((s = sv_gets(PL_linestr, PL_rsfp, 0)) == Nullch) {
3226 if (!gMacPerl_AlwaysExtract)
3227 Perl_croak(aTHX_ "No Perl script found in input\n");
3229 if (PL_doextract) /* require explicit override ? */
3230 if (!OverrideExtract(PL_origfilename))
3231 Perl_croak(aTHX_ "User aborted script\n");
3233 PL_doextract = FALSE;
3235 /* Pater peccavi, file does not have #! */
3236 PerlIO_rewind(PL_rsfp);
3241 while (PL_doextract) {
3242 if ((s = sv_gets(PL_linestr, PL_rsfp, 0)) == Nullch)
3243 Perl_croak(aTHX_ "No Perl script found in input\n");
3246 if (*s == '#' && s[1] == '!' && ((s = instr(s,"perl")) || (s = instr(s2,"PERL")))) {
3247 PerlIO_ungetc(PL_rsfp, '\n'); /* to keep line count right */
3248 PL_doextract = FALSE;
3249 while (*s && !(isSPACE (*s) || *s == '#')) s++;
3251 while (*s == ' ' || *s == '\t') s++;
3253 while (isDIGIT(s2[-1]) || strchr("-._", s2[-1])) s2--;
3254 if (strnEQ(s2-4,"perl",4))
3256 while ((s = moreswitches(s)))
3259 #ifdef MACOS_TRADITIONAL
3260 /* We are always searching for the #!perl line in MacPerl,
3261 * so if we find it, still keep the line count correct
3262 * by counting lines we already skipped over
3264 for (; maclines > 0 ; maclines--)
3265 PerlIO_ungetc(PL_rsfp, '\n');
3269 /* gMacPerl_AlwaysExtract is false in MPW tool */
3270 } else if (gMacPerl_AlwaysExtract) {
3281 PL_uid = PerlProc_getuid();
3282 PL_euid = PerlProc_geteuid();
3283 PL_gid = PerlProc_getgid();
3284 PL_egid = PerlProc_getegid();
3286 PL_uid |= PL_gid << 16;
3287 PL_euid |= PL_egid << 16;
3289 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
3293 S_forbid_setid(pTHX_ char *s)
3295 if (PL_euid != PL_uid)
3296 Perl_croak(aTHX_ "No %s allowed while running setuid", s);
3297 if (PL_egid != PL_gid)
3298 Perl_croak(aTHX_ "No %s allowed while running setgid", s);
3302 Perl_init_debugger(pTHX)
3304 HV *ostash = PL_curstash;
3306 PL_curstash = PL_debstash;
3307 PL_dbargs = GvAV(gv_AVadd((gv_fetchpv("args", GV_ADDMULTI, SVt_PVAV))));
3308 AvREAL_off(PL_dbargs);
3309 PL_DBgv = gv_fetchpv("DB", GV_ADDMULTI, SVt_PVGV);
3310 PL_DBline = gv_fetchpv("dbline", GV_ADDMULTI, SVt_PVAV);
3311 PL_DBsub = gv_HVadd(gv_fetchpv("sub", GV_ADDMULTI, SVt_PVHV));
3312 sv_upgrade(GvSV(PL_DBsub), SVt_IV); /* IVX accessed if PERLDB_SUB_NN */
3313 PL_DBsingle = GvSV((gv_fetchpv("single", GV_ADDMULTI, SVt_PV)));
3314 sv_setiv(PL_DBsingle, 0);
3315 PL_DBtrace = GvSV((gv_fetchpv("trace", GV_ADDMULTI, SVt_PV)));
3316 sv_setiv(PL_DBtrace, 0);
3317 PL_DBsignal = GvSV((gv_fetchpv("signal", GV_ADDMULTI, SVt_PV)));
3318 sv_setiv(PL_DBsignal, 0);
3319 PL_DBassertion = GvSV((gv_fetchpv("assertion", GV_ADDMULTI, SVt_PV)));
3320 sv_setiv(PL_DBassertion, 0);
3321 PL_curstash = ostash;
3324 #ifndef STRESS_REALLOC
3325 #define REASONABLE(size) (size)
3327 #define REASONABLE(size) (1) /* unreasonable */
3331 Perl_init_stacks(pTHX)
3333 /* start with 128-item stack and 8K cxstack */
3334 PL_curstackinfo = new_stackinfo(REASONABLE(128),
3335 REASONABLE(8192/sizeof(PERL_CONTEXT) - 1));
3336 PL_curstackinfo->si_type = PERLSI_MAIN;
3337 PL_curstack = PL_curstackinfo->si_stack;
3338 PL_mainstack = PL_curstack; /* remember in case we switch stacks */
3340 PL_stack_base = AvARRAY(PL_curstack);
3341 PL_stack_sp = PL_stack_base;
3342 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
3344 New(50,PL_tmps_stack,REASONABLE(128),SV*);
3347 PL_tmps_max = REASONABLE(128);
3349 New(54,PL_markstack,REASONABLE(32),I32);
3350 PL_markstack_ptr = PL_markstack;
3351 PL_markstack_max = PL_markstack + REASONABLE(32);
3355 New(54,PL_scopestack,REASONABLE(32),I32);
3356 PL_scopestack_ix = 0;
3357 PL_scopestack_max = REASONABLE(32);
3359 New(54,PL_savestack,REASONABLE(128),ANY);
3360 PL_savestack_ix = 0;
3361 PL_savestack_max = REASONABLE(128);
3363 New(54,PL_retstack,REASONABLE(16),OP*);
3365 PL_retstack_max = REASONABLE(16);
3373 while (PL_curstackinfo->si_next)
3374 PL_curstackinfo = PL_curstackinfo->si_next;
3375 while (PL_curstackinfo) {
3376 PERL_SI *p = PL_curstackinfo->si_prev;
3377 /* curstackinfo->si_stack got nuked by sv_free_arenas() */
3378 Safefree(PL_curstackinfo->si_cxstack);
3379 Safefree(PL_curstackinfo);
3380 PL_curstackinfo = p;
3382 Safefree(PL_tmps_stack);
3383 Safefree(PL_markstack);
3384 Safefree(PL_scopestack);
3385 Safefree(PL_savestack);
3386 Safefree(PL_retstack);
3395 lex_start(PL_linestr);
3397 PL_subname = newSVpvn("main",4);
3401 S_init_predump_symbols(pTHX)
3406 sv_setpvn(get_sv("\"", TRUE), " ", 1);
3407 PL_stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
3408 GvMULTI_on(PL_stdingv);
3409 io = GvIOp(PL_stdingv);
3410 IoTYPE(io) = IoTYPE_RDONLY;
3411 IoIFP(io) = PerlIO_stdin();
3412 tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
3414 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
3416 tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
3419 IoTYPE(io) = IoTYPE_WRONLY;
3420 IoOFP(io) = IoIFP(io) = PerlIO_stdout();
3422 tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
3424 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
3426 PL_stderrgv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
3427 GvMULTI_on(PL_stderrgv);
3428 io = GvIOp(PL_stderrgv);
3429 IoTYPE(io) = IoTYPE_WRONLY;
3430 IoOFP(io) = IoIFP(io) = PerlIO_stderr();
3431 tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
3433 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
3435 PL_statname = NEWSV(66,0); /* last filename we did stat on */
3438 Safefree(PL_osname);
3439 PL_osname = savepv(OSNAME);
3443 Perl_init_argv_symbols(pTHX_ register int argc, register char **argv)
3446 argc--,argv++; /* skip name of script */
3447 if (PL_doswitches) {
3448 for (; argc > 0 && **argv == '-'; argc--,argv++) {
3451 if (argv[0][1] == '-' && !argv[0][2]) {
3455 if ((s = strchr(argv[0], '='))) {
3457 sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),s);
3460 sv_setiv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),1);
3463 if ((PL_argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV))) {
3464 GvMULTI_on(PL_argvgv);
3465 (void)gv_AVadd(PL_argvgv);
3466 av_clear(GvAVn(PL_argvgv));
3467 for (; argc > 0; argc--,argv++) {
3468 SV *sv = newSVpv(argv[0],0);
3469 av_push(GvAVn(PL_argvgv),sv);
3470 if (!(PL_unicode & PERL_UNICODE_LOCALE_FLAG) || PL_utf8locale) {
3471 if (PL_unicode & PERL_UNICODE_ARGV_FLAG)
3474 if (PL_unicode & PERL_UNICODE_WIDESYSCALLS_FLAG) /* Sarathy? */
3475 (void)sv_utf8_decode(sv);
3480 #ifdef HAS_PROCSELFEXE
3481 /* This is a function so that we don't hold on to MAXPATHLEN
3482 bytes of stack longer than necessary
3485 S_procself_val(pTHX_ SV *sv, char *arg0)
3487 char buf[MAXPATHLEN];
3488 int len = readlink(PROCSELFEXE_PATH, buf, sizeof(buf) - 1);
3490 /* On Playstation2 Linux V1.0 (kernel 2.2.1) readlink(/proc/self/exe)
3491 includes a spurious NUL which will cause $^X to fail in system
3492 or backticks (this will prevent extensions from being built and
3493 many tests from working). readlink is not meant to add a NUL.
3494 Normal readlink works fine.
3496 if (len > 0 && buf[len-1] == '\0') {
3500 /* FreeBSD's implementation is acknowledged to be imperfect, sometimes
3501 returning the text "unknown" from the readlink rather than the path
3502 to the executable (or returning an error from the readlink). Any valid
3503 path has a '/' in it somewhere, so use that to validate the result.
3504 See http://www.freebsd.org/cgi/query-pr.cgi?pr=35703
3506 if (len > 0 && memchr(buf, '/', len)) {
3507 sv_setpvn(sv,buf,len);
3513 #endif /* HAS_PROCSELFEXE */
3516 S_init_postdump_symbols(pTHX_ register int argc, register char **argv, register char **env)
3522 PL_toptarget = NEWSV(0,0);
3523 sv_upgrade(PL_toptarget, SVt_PVFM);
3524 sv_setpvn(PL_toptarget, "", 0);
3525 PL_bodytarget = NEWSV(0,0);
3526 sv_upgrade(PL_bodytarget, SVt_PVFM);
3527 sv_setpvn(PL_bodytarget, "", 0);
3528 PL_formtarget = PL_bodytarget;
3532 init_argv_symbols(argc,argv);
3534 if ((tmpgv = gv_fetchpv("0",TRUE, SVt_PV))) {
3535 #ifdef MACOS_TRADITIONAL
3536 /* $0 is not majick on a Mac */
3537 sv_setpv(GvSV(tmpgv),MacPerl_MPWFileName(PL_origfilename));
3539 sv_setpv(GvSV(tmpgv),PL_origfilename);
3540 magicname("0", "0", 1);
3543 if ((tmpgv = gv_fetchpv("\030",TRUE, SVt_PV))) {/* $^X */
3544 #ifdef HAS_PROCSELFEXE
3545 S_procself_val(aTHX_ GvSV(tmpgv), PL_origargv[0]);
3548 sv_setpv(GvSV(tmpgv), os2_execname(aTHX));
3550 sv_setpv(GvSV(tmpgv),PL_origargv[0]);
3554 if ((PL_envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV))) {
3556 GvMULTI_on(PL_envgv);
3557 hv = GvHVn(PL_envgv);
3558 hv_magic(hv, Nullgv, PERL_MAGIC_env);
3559 #ifdef USE_ENVIRON_ARRAY
3560 /* Note that if the supplied env parameter is actually a copy
3561 of the global environ then it may now point to free'd memory
3562 if the environment has been modified since. To avoid this
3563 problem we treat env==NULL as meaning 'use the default'
3568 # ifdef USE_ITHREADS
3569 && PL_curinterp == aTHX
3573 environ[0] = Nullch;
3576 for (; *env; env++) {
3577 if (!(s = strchr(*env,'=')))
3584 sv = newSVpv(s+1, 0);
3585 (void)hv_store(hv, *env, s - *env, sv, 0);
3589 #endif /* USE_ENVIRON_ARRAY */
3592 if ((tmpgv = gv_fetchpv("$",TRUE, SVt_PV))) {
3593 SvREADONLY_off(GvSV(tmpgv));
3594 sv_setiv(GvSV(tmpgv), (IV)PerlProc_getpid());
3595 SvREADONLY_on(GvSV(tmpgv));
3597 #ifdef THREADS_HAVE_PIDS
3598 PL_ppid = (IV)getppid();
3601 /* touch @F array to prevent spurious warnings 20020415 MJD */
3603 (void) get_av("main::F", TRUE | GV_ADDMULTI);
3605 /* touch @- and @+ arrays to prevent spurious warnings 20020415 MJD */
3606 (void) get_av("main::-", TRUE | GV_ADDMULTI);
3607 (void) get_av("main::+", TRUE | GV_ADDMULTI);
3611 S_init_perllib(pTHX)
3616 s = PerlEnv_getenv("PERL5LIB");
3618 incpush(s, TRUE, TRUE, TRUE);
3620 incpush(PerlEnv_getenv("PERLLIB"), FALSE, FALSE, TRUE);
3622 /* Treat PERL5?LIB as a possible search list logical name -- the
3623 * "natural" VMS idiom for a Unix path string. We allow each
3624 * element to be a set of |-separated directories for compatibility.
3628 if (my_trnlnm("PERL5LIB",buf,0))
3629 do { incpush(buf,TRUE,TRUE,TRUE); } while (my_trnlnm("PERL5LIB",buf,++idx));
3631 while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE,FALSE,TRUE);
3635 /* Use the ~-expanded versions of APPLLIB (undocumented),
3636 ARCHLIB PRIVLIB SITEARCH SITELIB VENDORARCH and VENDORLIB
3639 incpush(APPLLIB_EXP, TRUE, TRUE, TRUE);
3643 incpush(ARCHLIB_EXP, FALSE, FALSE, TRUE);
3645 #ifdef MACOS_TRADITIONAL
3648 SV * privdir = NEWSV(55, 0);
3649 char * macperl = PerlEnv_getenv("MACPERL");
3654 Perl_sv_setpvf(aTHX_ privdir, "%slib:", macperl);
3655 if (PerlLIO_stat(SvPVX(privdir), &tmpstatbuf) >= 0 && S_ISDIR(tmpstatbuf.st_mode))
3656 incpush(SvPVX(privdir), TRUE, FALSE, TRUE);
3657 Perl_sv_setpvf(aTHX_ privdir, "%ssite_perl:", macperl);
3658 if (PerlLIO_stat(SvPVX(privdir), &tmpstatbuf) >= 0 && S_ISDIR(tmpstatbuf.st_mode))
3659 incpush(SvPVX(privdir), TRUE, FALSE, TRUE);
3661 SvREFCNT_dec(privdir);
3664 incpush(":", FALSE, FALSE, TRUE);
3667 # define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
3670 incpush(PRIVLIB_EXP, TRUE, FALSE, TRUE);
3672 incpush(PRIVLIB_EXP, FALSE, FALSE, TRUE);
3676 /* sitearch is always relative to sitelib on Windows for
3677 * DLL-based path intuition to work correctly */
3678 # if !defined(WIN32)
3679 incpush(SITEARCH_EXP, FALSE, FALSE, TRUE);
3685 /* this picks up sitearch as well */
3686 incpush(SITELIB_EXP, TRUE, FALSE, TRUE);
3688 incpush(SITELIB_EXP, FALSE, FALSE, TRUE);
3692 #ifdef SITELIB_STEM /* Search for version-specific dirs below here */
3693 incpush(SITELIB_STEM, FALSE, TRUE, TRUE);
3696 #ifdef PERL_VENDORARCH_EXP
3697 /* vendorarch is always relative to vendorlib on Windows for
3698 * DLL-based path intuition to work correctly */
3699 # if !defined(WIN32)
3700 incpush(PERL_VENDORARCH_EXP, FALSE, FALSE, TRUE);
3704 #ifdef PERL_VENDORLIB_EXP
3706 incpush(PERL_VENDORLIB_EXP, TRUE, FALSE, TRUE); /* this picks up vendorarch as well */
3708 incpush(PERL_VENDORLIB_EXP, FALSE, FALSE, TRUE);
3712 #ifdef PERL_VENDORLIB_STEM /* Search for version-specific dirs below here */
3713 incpush(PERL_VENDORLIB_STEM, FALSE, TRUE, TRUE);
3716 #ifdef PERL_OTHERLIBDIRS
3717 incpush(PERL_OTHERLIBDIRS, TRUE, TRUE, TRUE);
3721 incpush(".", FALSE, FALSE, TRUE);
3722 #endif /* MACOS_TRADITIONAL */
3725 #if defined(DOSISH) || defined(EPOC)
3726 # define PERLLIB_SEP ';'
3729 # define PERLLIB_SEP '|'
3731 # if defined(MACOS_TRADITIONAL)
3732 # define PERLLIB_SEP ','
3734 # define PERLLIB_SEP ':'
3738 #ifndef PERLLIB_MANGLE
3739 # define PERLLIB_MANGLE(s,n) (s)
3743 S_incpush(pTHX_ char *p, int addsubdirs, int addoldvers, int usesep)
3745 SV *subdir = Nullsv;
3750 if (addsubdirs || addoldvers) {
3751 subdir = sv_newmortal();
3754 /* Break at all separators */
3756 SV *libdir = NEWSV(55,0);
3759 /* skip any consecutive separators */
3761 while ( *p == PERLLIB_SEP ) {
3762 /* Uncomment the next line for PATH semantics */
3763 /* av_push(GvAVn(PL_incgv), newSVpvn(".", 1)); */
3768 if ( usesep && (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
3769 sv_setpvn(libdir, PERLLIB_MANGLE(p, (STRLEN)(s - p)),
3774 sv_setpv(libdir, PERLLIB_MANGLE(p, 0));
3775 p = Nullch; /* break out */
3777 #ifdef MACOS_TRADITIONAL
3778 if (!strchr(SvPVX(libdir), ':')) {
3781 sv_setpv(libdir, MacPerl_CanonDir(SvPVX(libdir), buf, 0));
3783 if (SvPVX(libdir)[SvCUR(libdir)-1] != ':')
3784 sv_catpv(libdir, ":");
3788 * BEFORE pushing libdir onto @INC we may first push version- and
3789 * archname-specific sub-directories.
3791 if (addsubdirs || addoldvers) {
3792 #ifdef PERL_INC_VERSION_LIST
3793 /* Configure terminates PERL_INC_VERSION_LIST with a NULL */
3794 const char *incverlist[] = { PERL_INC_VERSION_LIST };
3795 const char **incver;
3802 if ((unix = tounixspec_ts(SvPV(libdir,len),Nullch)) != Nullch) {
3804 while (unix[len-1] == '/') len--; /* Cosmetic */
3805 sv_usepvn(libdir,unix,len);
3808 PerlIO_printf(Perl_error_log,
3809 "Failed to unixify @INC element \"%s\"\n",
3813 #ifdef MACOS_TRADITIONAL
3814 #define PERL_AV_SUFFIX_FMT ""
3815 #define PERL_ARCH_FMT "%s:"
3816 #define PERL_ARCH_FMT_PATH PERL_FS_VER_FMT PERL_AV_SUFFIX_FMT
3818 #define PERL_AV_SUFFIX_FMT "/"
3819 #define PERL_ARCH_FMT "/%s"
3820 #define PERL_ARCH_FMT_PATH PERL_AV_SUFFIX_FMT PERL_FS_VER_FMT
3822 /* .../version/archname if -d .../version/archname */
3823 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT_PATH PERL_ARCH_FMT,
3825 (int)PERL_REVISION, (int)PERL_VERSION,
3826 (int)PERL_SUBVERSION, ARCHNAME);
3827 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
3828 S_ISDIR(tmpstatbuf.st_mode))
3829 av_push(GvAVn(PL_incgv), newSVsv(subdir));
3831 /* .../version if -d .../version */
3832 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT_PATH, libdir,
3833 (int)PERL_REVISION, (int)PERL_VERSION,
3834 (int)PERL_SUBVERSION);
3835 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
3836 S_ISDIR(tmpstatbuf.st_mode))
3837 av_push(GvAVn(PL_incgv), newSVsv(subdir));
3839 /* .../archname if -d .../archname */
3840 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT, libdir, ARCHNAME);
3841 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
3842 S_ISDIR(tmpstatbuf.st_mode))
3843 av_push(GvAVn(PL_incgv), newSVsv(subdir));
3846 #ifdef PERL_INC_VERSION_LIST
3848 for (incver = incverlist; *incver; incver++) {
3849 /* .../xxx if -d .../xxx */
3850 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT, libdir, *incver);
3851 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
3852 S_ISDIR(tmpstatbuf.st_mode))
3853 av_push(GvAVn(PL_incgv), newSVsv(subdir));
3859 /* finally push this lib directory on the end of @INC */
3860 av_push(GvAVn(PL_incgv), libdir);
3864 #ifdef USE_5005THREADS
3865 STATIC struct perl_thread *
3866 S_init_main_thread(pTHX)
3868 #if !defined(PERL_IMPLICIT_CONTEXT)
3869 struct perl_thread *thr;
3873 Newz(53, thr, 1, struct perl_thread);
3874 PL_curcop = &PL_compiling;
3875 thr->interp = PERL_GET_INTERP;
3876 thr->cvcache = newHV();
3877 thr->threadsv = newAV();
3878 /* thr->threadsvp is set when find_threadsv is called */
3879 thr->specific = newAV();
3880 thr->flags = THRf_R_JOINABLE;
3881 MUTEX_INIT(&thr->mutex);
3882 /* Handcraft thrsv similarly to mess_sv */
3883 New(53, PL_thrsv, 1, SV);
3884 Newz(53, xpv, 1, XPV);
3885 SvFLAGS(PL_thrsv) = SVt_PV;
3886 SvANY(PL_thrsv) = (void*)xpv;
3887 SvREFCNT(PL_thrsv) = 1 << 30; /* practically infinite */
3888 SvPVX(PL_thrsv) = (char*)thr;
3889 SvCUR_set(PL_thrsv, sizeof(thr));
3890 SvLEN_set(PL_thrsv, sizeof(thr));
3891 *SvEND(PL_thrsv) = '\0'; /* in the trailing_nul field */
3892 thr->oursv = PL_thrsv;
3893 PL_chopset = " \n-";
3896 MUTEX_LOCK(&PL_threads_mutex);
3902 MUTEX_UNLOCK(&PL_threads_mutex);
3904 #ifdef HAVE_THREAD_INTERN
3905 Perl_init_thread_intern(thr);
3908 #ifdef SET_THREAD_SELF
3909 SET_THREAD_SELF(thr);
3911 thr->self = pthread_self();
3912 #endif /* SET_THREAD_SELF */
3916 * These must come after the thread self setting
3917 * because sv_setpvn does SvTAINT and the taint
3918 * fields thread selfness being set.
3920 PL_toptarget = NEWSV(0,0);
3921 sv_upgrade(PL_toptarget, SVt_PVFM);
3922 sv_setpvn(PL_toptarget, "", 0);
3923 PL_bodytarget = NEWSV(0,0);
3924 sv_upgrade(PL_bodytarget, SVt_PVFM);
3925 sv_setpvn(PL_bodytarget, "", 0);
3926 PL_formtarget = PL_bodytarget;
3927 thr->errsv = newSVpvn("", 0);
3928 (void) find_threadsv("@"); /* Ensure $@ is initialised early */
3931 PL_peepp = MEMBER_TO_FPTR(Perl_peep);
3932 PL_regcompp = MEMBER_TO_FPTR(Perl_pregcomp);
3933 PL_regexecp = MEMBER_TO_FPTR(Perl_regexec_flags);
3934 PL_regint_start = MEMBER_TO_FPTR(Perl_re_intuit_start);
3935 PL_regint_string = MEMBER_TO_FPTR(Perl_re_intuit_string);
3936 PL_regfree = MEMBER_TO_FPTR(Perl_pregfree);
3938 PL_reginterp_cnt = 0;
3942 #endif /* USE_5005THREADS */
3945 Perl_call_list(pTHX_ I32 oldscope, AV *paramList)
3948 line_t oldline = CopLINE(PL_curcop);
3954 while (AvFILL(paramList) >= 0) {
3955 cv = (CV*)av_shift(paramList);
3957 if (paramList == PL_beginav) {
3958 /* save PL_beginav for compiler */
3959 if (! PL_beginav_save)
3960 PL_beginav_save = newAV();
3961 av_push(PL_beginav_save, (SV*)cv);
3963 else if (paramList == PL_checkav) {
3964 /* save PL_checkav for compiler */
3965 if (! PL_checkav_save)
3966 PL_checkav_save = newAV();
3967 av_push(PL_checkav_save, (SV*)cv);
3972 #ifdef PERL_FLEXIBLE_EXCEPTIONS
3973 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vcall_list_body), cv);
3979 #ifndef PERL_FLEXIBLE_EXCEPTIONS
3983 (void)SvPV(atsv, len);
3985 PL_curcop = &PL_compiling;
3986 CopLINE_set(PL_curcop, oldline);
3987 if (paramList == PL_beginav)
3988 sv_catpv(atsv, "BEGIN failed--compilation aborted");
3990 Perl_sv_catpvf(aTHX_ atsv,
3991 "%s failed--call queue aborted",
3992 paramList == PL_checkav ? "CHECK"
3993 : paramList == PL_initav ? "INIT"
3995 while (PL_scopestack_ix > oldscope)
3998 Perl_croak(aTHX_ "%"SVf"", atsv);
4005 /* my_exit() was called */
4006 while (PL_scopestack_ix > oldscope)
4009 PL_curstash = PL_defstash;
4010 PL_curcop = &PL_compiling;
4011 CopLINE_set(PL_curcop, oldline);
4013 if (PL_statusvalue && !(PL_exit_flags & PERL_EXIT_EXPECTED)) {
4014 if (paramList == PL_beginav)
4015 Perl_croak(aTHX_ "BEGIN failed--compilation aborted");
4017 Perl_croak(aTHX_ "%s failed--call queue aborted",
4018 paramList == PL_checkav ? "CHECK"
4019 : paramList == PL_initav ? "INIT"
4026 PL_curcop = &PL_compiling;
4027 CopLINE_set(PL_curcop, oldline);
4030 PerlIO_printf(Perl_error_log, "panic: restartop\n");
4038 #ifdef PERL_FLEXIBLE_EXCEPTIONS
4040 S_vcall_list_body(pTHX_ va_list args)
4042 CV *cv = va_arg(args, CV*);
4043 return call_list_body(cv);
4048 S_call_list_body(pTHX_ CV *cv)
4050 PUSHMARK(PL_stack_sp);
4051 call_sv((SV*)cv, G_EVAL|G_DISCARD);
4056 Perl_my_exit(pTHX_ U32 status)
4058 DEBUG_S(PerlIO_printf(Perl_debug_log, "my_exit: thread %p, status %lu\n",
4059 thr, (unsigned long) status));
4068 STATUS_NATIVE_SET(status);
4075 Perl_my_failure_exit(pTHX)
4078 if (vaxc$errno & 1) {
4079 if (STATUS_NATIVE & 1) /* fortuitiously includes "-1" */
4080 STATUS_NATIVE_SET(44);
4083 if (!vaxc$errno && errno) /* unlikely */
4084 STATUS_NATIVE_SET(44);
4086 STATUS_NATIVE_SET(vaxc$errno);
4091 STATUS_POSIX_SET(errno);
4093 exitstatus = STATUS_POSIX >> 8;
4094 if (exitstatus & 255)
4095 STATUS_POSIX_SET(exitstatus);
4097 STATUS_POSIX_SET(255);
4104 S_my_exit_jump(pTHX)
4106 register PERL_CONTEXT *cx;
4111 SvREFCNT_dec(PL_e_script);
4112 PL_e_script = Nullsv;
4115 POPSTACK_TO(PL_mainstack);
4116 if (cxstack_ix >= 0) {
4119 POPBLOCK(cx,PL_curpm);
4127 read_e_script(pTHX_ int idx, SV *buf_sv, int maxlen)
4130 p = SvPVX(PL_e_script);
4131 nl = strchr(p, '\n');
4132 nl = (nl) ? nl+1 : SvEND(PL_e_script);
4134 filter_del(read_e_script);
4137 sv_catpvn(buf_sv, p, nl-p);
4138 sv_chop(PL_e_script, nl);