3 * Copyright (c) 1987-2003 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 */
21 char *nw_get_sitelib(const char *pl);
24 /* XXX If this causes problems, set i_unistd=undef in the hint file. */
41 #if !defined(STANDARD_C) && !defined(HAS_GETENV_PROTOTYPE) && !defined(PERL_MICRO)
42 char *getenv (char *); /* Usually in <stdlib.h> */
45 static I32 read_e_script(pTHX_ int idx, SV *buf_sv, int maxlen);
53 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
59 #if defined(USE_ITHREADS)
60 # define INIT_TLS_AND_INTERP \
62 if (!PL_curinterp) { \
63 PERL_SET_INTERP(my_perl); \
66 PERL_SET_THX(my_perl); \
70 PERL_SET_THX(my_perl); \
74 # define INIT_TLS_AND_INTERP \
76 if (!PL_curinterp) { \
77 PERL_SET_INTERP(my_perl); \
79 PERL_SET_THX(my_perl); \
83 #ifdef PERL_IMPLICIT_SYS
85 perl_alloc_using(struct IPerlMem* ipM, struct IPerlMem* ipMS,
86 struct IPerlMem* ipMP, struct IPerlEnv* ipE,
87 struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
88 struct IPerlDir* ipD, struct IPerlSock* ipS,
89 struct IPerlProc* ipP)
91 PerlInterpreter *my_perl;
92 /* New() needs interpreter, so call malloc() instead */
93 my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
95 Zero(my_perl, 1, PerlInterpreter);
111 =head1 Embedding Functions
113 =for apidoc perl_alloc
115 Allocates a new Perl interpreter. See L<perlembed>.
123 PerlInterpreter *my_perl;
124 #ifdef USE_5005THREADS
128 /* New() needs interpreter, so call malloc() instead */
129 my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
132 Zero(my_perl, 1, PerlInterpreter);
135 #endif /* PERL_IMPLICIT_SYS */
138 =for apidoc perl_construct
140 Initializes a new Perl interpreter. See L<perlembed>.
146 perl_construct(pTHXx)
150 PL_perl_destruct_level = 1;
152 if (PL_perl_destruct_level > 0)
156 /* Init the real globals (and main thread)? */
159 MUTEX_INIT(&PL_dollarzero_mutex); /* for $0 modifying */
161 #ifdef PERL_FLEXIBLE_EXCEPTIONS
162 PL_protect = MEMBER_TO_FPTR(Perl_default_protect); /* for exceptions */
165 PL_curcop = &PL_compiling; /* needed by ckWARN, right away */
167 PL_linestr = NEWSV(65,79);
168 sv_upgrade(PL_linestr,SVt_PVIV);
170 if (!SvREADONLY(&PL_sv_undef)) {
171 /* set read-only and try to insure than we wont see REFCNT==0
174 SvREADONLY_on(&PL_sv_undef);
175 SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
177 sv_setpv(&PL_sv_no,PL_No);
179 SvREADONLY_on(&PL_sv_no);
180 SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
182 sv_setpv(&PL_sv_yes,PL_Yes);
184 SvREADONLY_on(&PL_sv_yes);
185 SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
188 PL_sighandlerp = Perl_sighandler;
189 PL_pidstatus = newHV();
192 PL_rs = newSVpvn("\n", 1);
197 PL_lex_state = LEX_NOTPARSING;
203 SET_NUMERIC_STANDARD();
207 PL_patchlevel = NEWSV(0,4);
208 (void)SvUPGRADE(PL_patchlevel, SVt_PVNV);
209 if (PERL_REVISION > 127 || PERL_VERSION > 127 || PERL_SUBVERSION > 127)
210 SvGROW(PL_patchlevel, UTF8_MAXLEN*3+1);
211 s = (U8*)SvPVX(PL_patchlevel);
212 /* Build version strings using "native" characters */
213 s = uvchr_to_utf8(s, (UV)PERL_REVISION);
214 s = uvchr_to_utf8(s, (UV)PERL_VERSION);
215 s = uvchr_to_utf8(s, (UV)PERL_SUBVERSION);
217 SvCUR_set(PL_patchlevel, s - (U8*)SvPVX(PL_patchlevel));
218 SvPOK_on(PL_patchlevel);
219 SvNVX(PL_patchlevel) = (NV)PERL_REVISION +
220 ((NV)PERL_VERSION / (NV)1000) +
221 ((NV)PERL_SUBVERSION / (NV)1000000);
222 SvNOK_on(PL_patchlevel); /* dual valued */
223 SvUTF8_on(PL_patchlevel);
224 SvREADONLY_on(PL_patchlevel);
227 #if defined(LOCAL_PATCH_COUNT)
228 PL_localpatches = local_patches; /* For possible -v */
231 #ifdef HAVE_INTERP_INTERN
235 PerlIO_init(aTHX); /* Hook to IO system */
237 PL_fdpid = newAV(); /* for remembering popen pids by fd */
238 PL_modglobal = newHV(); /* pointers to per-interpreter module globals */
239 PL_errors = newSVpvn("",0);
240 sv_setpvn(PERL_DEBUG_PAD(0), "", 0); /* For regex debugging. */
241 sv_setpvn(PERL_DEBUG_PAD(1), "", 0); /* ext/re needs these */
242 sv_setpvn(PERL_DEBUG_PAD(2), "", 0); /* even without DEBUGGING. */
244 PL_regex_padav = newAV();
245 av_push(PL_regex_padav,(SV*)newAV()); /* First entry is an array of empty elements */
246 PL_regex_pad = AvARRAY(PL_regex_padav);
248 #ifdef USE_REENTRANT_API
249 Perl_reentrant_init(aTHX);
252 /* Note that strtab is a rather special HV. Assumptions are made
253 about not iterating on it, and not adding tie magic to it.
254 It is properly deallocated in perl_destruct() */
257 HvSHAREKEYS_off(PL_strtab); /* mandatory */
258 hv_ksplit(PL_strtab, 512);
260 #if defined(__DYNAMIC__) && (defined(NeXT) || defined(__NeXT__))
261 _dyld_lookup_and_bind
262 ("__environ", (unsigned long *) &environ_pointer, NULL);
265 #ifdef USE_ENVIRON_ARRAY
266 PL_origenviron = environ;
269 /* Use sysconf(_SC_CLK_TCK) if available, if not
270 * available or if the sysconf() fails, use the HZ. */
271 #if defined(HAS_SYSCONF) && defined(_SC_CLK_TCK)
272 PL_clocktick = sysconf(_SC_CLK_TCK);
273 if (PL_clocktick <= 0)
281 =for apidoc nothreadhook
283 Stub that provides thread hook for perl_destruct when there are
290 Perl_nothreadhook(pTHX)
296 =for apidoc perl_destruct
298 Shuts down a Perl interpreter. See L<perlembed>.
306 volatile int destruct_level; /* 0=none, 1=full, 2=full with checks */
308 #ifdef USE_5005THREADS
310 #endif /* USE_5005THREADS */
312 /* wait for all pseudo-forked children to finish */
313 PERL_WAIT_FOR_CHILDREN;
315 destruct_level = PL_perl_destruct_level;
319 if ((s = PerlEnv_getenv("PERL_DESTRUCT_LEVEL"))) {
321 if (destruct_level < i)
328 if(PL_exit_flags & PERL_EXIT_DESTRUCT_END) {
333 if (PL_endav && !PL_minus_c)
334 call_list(PL_scopestack_ix, PL_endav);
340 /* Need to flush since END blocks can produce output */
343 if (CALL_FPTR(PL_threadhook)(aTHX)) {
344 /* Threads hook has vetoed further cleanup */
345 return STATUS_NATIVE_EXPORT;
348 /* We must account for everything. */
350 /* Destroy the main CV and syntax tree */
352 op_free(PL_main_root);
353 PL_main_root = Nullop;
355 PL_curcop = &PL_compiling;
356 PL_main_start = Nullop;
357 SvREFCNT_dec(PL_main_cv);
361 /* Tell PerlIO we are about to tear things apart in case
362 we have layers which are using resources that should
366 PerlIO_destruct(aTHX);
368 if (PL_sv_objcount) {
370 * Try to destruct global references. We do this first so that the
371 * destructors and destructees still exist. Some sv's might remain.
372 * Non-referenced objects are on their own.
377 /* unhook hooks which will soon be, or use, destroyed data */
378 SvREFCNT_dec(PL_warnhook);
379 PL_warnhook = Nullsv;
380 SvREFCNT_dec(PL_diehook);
383 /* call exit list functions */
384 while (PL_exitlistlen-- > 0)
385 PL_exitlist[PL_exitlistlen].fn(aTHX_ PL_exitlist[PL_exitlistlen].ptr);
387 Safefree(PL_exitlist);
392 if (destruct_level == 0){
394 DEBUG_P(debprofdump());
396 #if defined(PERLIO_LAYERS)
397 /* No more IO - including error messages ! */
398 PerlIO_cleanup(aTHX);
401 /* The exit() function will do everything that needs doing. */
402 return STATUS_NATIVE_EXPORT;
405 /* jettison our possibly duplicated environment */
406 /* if PERL_USE_SAFE_PUTENV is defined environ will not have been copied
407 * so we certainly shouldn't free it here
409 #if defined(USE_ENVIRON_ARRAY) && !defined(PERL_USE_SAFE_PUTENV)
410 if (environ != PL_origenviron
412 /* only main thread can free environ[0] contents */
413 && PL_curinterp == aTHX
419 for (i = 0; environ[i]; i++)
420 safesysfree(environ[i]);
422 /* Must use safesysfree() when working with environ. */
423 safesysfree(environ);
425 environ = PL_origenviron;
430 /* the syntax tree is shared between clones
431 * so op_free(PL_main_root) only ReREFCNT_dec's
432 * REGEXPs in the parent interpreter
433 * we need to manually ReREFCNT_dec for the clones
436 I32 i = AvFILLp(PL_regex_padav) + 1;
437 SV **ary = AvARRAY(PL_regex_padav);
441 REGEXP *re = INT2PTR(REGEXP *,SvIVX(resv));
443 if (SvFLAGS(resv) & SVf_BREAK) {
444 /* this is PL_reg_curpm, already freed
445 * flag is set in regexec.c:S_regtry
447 SvFLAGS(resv) &= ~SVf_BREAK;
449 else if(SvREPADTMP(resv)) {
450 SvREPADTMP_off(resv);
457 SvREFCNT_dec(PL_regex_padav);
458 PL_regex_padav = Nullav;
462 /* loosen bonds of global variables */
465 (void)PerlIO_close(PL_rsfp);
469 /* Filters for program text */
470 SvREFCNT_dec(PL_rsfp_filters);
471 PL_rsfp_filters = Nullav;
474 PL_preprocess = FALSE;
480 PL_doswitches = FALSE;
481 PL_dowarn = G_WARN_OFF;
482 PL_doextract = FALSE;
483 PL_sawampersand = FALSE; /* must save all match strings */
486 Safefree(PL_inplace);
488 SvREFCNT_dec(PL_patchlevel);
491 SvREFCNT_dec(PL_e_script);
492 PL_e_script = Nullsv;
495 /* magical thingies */
497 SvREFCNT_dec(PL_ofs_sv); /* $, */
500 SvREFCNT_dec(PL_ors_sv); /* $\ */
503 SvREFCNT_dec(PL_rs); /* $/ */
506 PL_multiline = 0; /* $* */
507 Safefree(PL_osname); /* $^O */
510 SvREFCNT_dec(PL_statname);
511 PL_statname = Nullsv;
514 /* defgv, aka *_ should be taken care of elsewhere */
516 /* clean up after study() */
517 SvREFCNT_dec(PL_lastscream);
518 PL_lastscream = Nullsv;
519 Safefree(PL_screamfirst);
521 Safefree(PL_screamnext);
525 Safefree(PL_efloatbuf);
526 PL_efloatbuf = Nullch;
529 /* startup and shutdown function lists */
530 SvREFCNT_dec(PL_beginav);
531 SvREFCNT_dec(PL_beginav_save);
532 SvREFCNT_dec(PL_endav);
533 SvREFCNT_dec(PL_checkav);
534 SvREFCNT_dec(PL_checkav_save);
535 SvREFCNT_dec(PL_initav);
537 PL_beginav_save = Nullav;
540 PL_checkav_save = Nullav;
543 /* shortcuts just get cleared */
549 PL_argvoutgv = Nullgv;
551 PL_stderrgv = Nullgv;
552 PL_last_in_gv = Nullgv;
554 PL_debstash = Nullhv;
556 /* reset so print() ends up where we expect */
559 SvREFCNT_dec(PL_argvout_stack);
560 PL_argvout_stack = Nullav;
562 SvREFCNT_dec(PL_modglobal);
563 PL_modglobal = Nullhv;
564 SvREFCNT_dec(PL_preambleav);
565 PL_preambleav = Nullav;
566 SvREFCNT_dec(PL_subname);
568 SvREFCNT_dec(PL_linestr);
570 SvREFCNT_dec(PL_pidstatus);
571 PL_pidstatus = Nullhv;
572 SvREFCNT_dec(PL_toptarget);
573 PL_toptarget = Nullsv;
574 SvREFCNT_dec(PL_bodytarget);
575 PL_bodytarget = Nullsv;
576 PL_formtarget = Nullsv;
578 /* free locale stuff */
579 #ifdef USE_LOCALE_COLLATE
580 Safefree(PL_collation_name);
581 PL_collation_name = Nullch;
584 #ifdef USE_LOCALE_NUMERIC
585 Safefree(PL_numeric_name);
586 PL_numeric_name = Nullch;
587 SvREFCNT_dec(PL_numeric_radix_sv);
590 /* clear utf8 character classes */
591 SvREFCNT_dec(PL_utf8_alnum);
592 SvREFCNT_dec(PL_utf8_alnumc);
593 SvREFCNT_dec(PL_utf8_ascii);
594 SvREFCNT_dec(PL_utf8_alpha);
595 SvREFCNT_dec(PL_utf8_space);
596 SvREFCNT_dec(PL_utf8_cntrl);
597 SvREFCNT_dec(PL_utf8_graph);
598 SvREFCNT_dec(PL_utf8_digit);
599 SvREFCNT_dec(PL_utf8_upper);
600 SvREFCNT_dec(PL_utf8_lower);
601 SvREFCNT_dec(PL_utf8_print);
602 SvREFCNT_dec(PL_utf8_punct);
603 SvREFCNT_dec(PL_utf8_xdigit);
604 SvREFCNT_dec(PL_utf8_mark);
605 SvREFCNT_dec(PL_utf8_toupper);
606 SvREFCNT_dec(PL_utf8_totitle);
607 SvREFCNT_dec(PL_utf8_tolower);
608 SvREFCNT_dec(PL_utf8_tofold);
609 SvREFCNT_dec(PL_utf8_idstart);
610 SvREFCNT_dec(PL_utf8_idcont);
611 PL_utf8_alnum = Nullsv;
612 PL_utf8_alnumc = Nullsv;
613 PL_utf8_ascii = Nullsv;
614 PL_utf8_alpha = Nullsv;
615 PL_utf8_space = Nullsv;
616 PL_utf8_cntrl = Nullsv;
617 PL_utf8_graph = Nullsv;
618 PL_utf8_digit = Nullsv;
619 PL_utf8_upper = Nullsv;
620 PL_utf8_lower = Nullsv;
621 PL_utf8_print = Nullsv;
622 PL_utf8_punct = Nullsv;
623 PL_utf8_xdigit = Nullsv;
624 PL_utf8_mark = Nullsv;
625 PL_utf8_toupper = Nullsv;
626 PL_utf8_totitle = Nullsv;
627 PL_utf8_tolower = Nullsv;
628 PL_utf8_tofold = Nullsv;
629 PL_utf8_idstart = Nullsv;
630 PL_utf8_idcont = Nullsv;
632 if (!specialWARN(PL_compiling.cop_warnings))
633 SvREFCNT_dec(PL_compiling.cop_warnings);
634 PL_compiling.cop_warnings = Nullsv;
635 if (!specialCopIO(PL_compiling.cop_io))
636 SvREFCNT_dec(PL_compiling.cop_io);
637 PL_compiling.cop_io = Nullsv;
638 CopFILE_free(&PL_compiling);
639 CopSTASH_free(&PL_compiling);
641 /* Prepare to destruct main symbol table. */
646 SvREFCNT_dec(PL_curstname);
647 PL_curstname = Nullsv;
649 /* clear queued errors */
650 SvREFCNT_dec(PL_errors);
654 if (destruct_level >= 2 && ckWARN_d(WARN_INTERNAL)) {
655 if (PL_scopestack_ix != 0)
656 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
657 "Unbalanced scopes: %ld more ENTERs than LEAVEs\n",
658 (long)PL_scopestack_ix);
659 if (PL_savestack_ix != 0)
660 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
661 "Unbalanced saves: %ld more saves than restores\n",
662 (long)PL_savestack_ix);
663 if (PL_tmps_floor != -1)
664 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),"Unbalanced tmps: %ld more allocs than frees\n",
665 (long)PL_tmps_floor + 1);
666 if (cxstack_ix != -1)
667 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),"Unbalanced context: %ld more PUSHes than POPs\n",
668 (long)cxstack_ix + 1);
671 /* Now absolutely destruct everything, somehow or other, loops or no. */
672 SvFLAGS(PL_fdpid) |= SVTYPEMASK; /* don't clean out pid table now */
673 SvFLAGS(PL_strtab) |= SVTYPEMASK; /* don't clean out strtab now */
675 /* the 2 is for PL_fdpid and PL_strtab */
676 while (PL_sv_count > 2 && sv_clean_all())
679 SvFLAGS(PL_fdpid) &= ~SVTYPEMASK;
680 SvFLAGS(PL_fdpid) |= SVt_PVAV;
681 SvFLAGS(PL_strtab) &= ~SVTYPEMASK;
682 SvFLAGS(PL_strtab) |= SVt_PVHV;
684 AvREAL_off(PL_fdpid); /* no surviving entries */
685 SvREFCNT_dec(PL_fdpid); /* needed in io_close() */
688 #ifdef HAVE_INTERP_INTERN
692 /* Destruct the global string table. */
694 /* Yell and reset the HeVAL() slots that are still holding refcounts,
695 * so that sv_free() won't fail on them.
703 max = HvMAX(PL_strtab);
704 array = HvARRAY(PL_strtab);
707 if (hent && ckWARN_d(WARN_INTERNAL)) {
708 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
709 "Unbalanced string table refcount: (%d) for \"%s\"",
710 HeVAL(hent) - Nullsv, HeKEY(hent));
711 HeVAL(hent) = Nullsv;
721 SvREFCNT_dec(PL_strtab);
724 /* free the pointer table used for cloning */
725 ptr_table_free(PL_ptr_table);
728 /* free special SVs */
730 SvREFCNT(&PL_sv_yes) = 0;
731 sv_clear(&PL_sv_yes);
732 SvANY(&PL_sv_yes) = NULL;
733 SvFLAGS(&PL_sv_yes) = 0;
735 SvREFCNT(&PL_sv_no) = 0;
737 SvANY(&PL_sv_no) = NULL;
738 SvFLAGS(&PL_sv_no) = 0;
742 for (i=0; i<=2; i++) {
743 SvREFCNT(PERL_DEBUG_PAD(i)) = 0;
744 sv_clear(PERL_DEBUG_PAD(i));
745 SvANY(PERL_DEBUG_PAD(i)) = NULL;
746 SvFLAGS(PERL_DEBUG_PAD(i)) = 0;
750 if (PL_sv_count != 0 && ckWARN_d(WARN_INTERNAL))
751 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),"Scalars leaked: %ld\n", (long)PL_sv_count);
753 #ifdef DEBUG_LEAKING_SCALARS
754 if (PL_sv_count != 0) {
759 for (sva = PL_sv_arenaroot; sva; sva = (SV*)SvANY(sva)) {
760 svend = &sva[SvREFCNT(sva)];
761 for (sv = sva + 1; sv < svend; ++sv) {
762 if (SvTYPE(sv) != SVTYPEMASK) {
763 PerlIO_printf(Perl_debug_log, "leaked: 0x%p\n", sv);
771 #if defined(PERLIO_LAYERS)
772 /* No more IO - including error messages ! */
773 PerlIO_cleanup(aTHX);
776 /* sv_undef needs to stay immortal until after PerlIO_cleanup
777 as currently layers use it rather than Nullsv as a marker
778 for no arg - and will try and SvREFCNT_dec it.
780 SvREFCNT(&PL_sv_undef) = 0;
781 SvREADONLY_off(&PL_sv_undef);
783 Safefree(PL_origfilename);
784 Safefree(PL_reg_start_tmp);
786 Safefree(PL_reg_curpm);
787 Safefree(PL_reg_poscache);
788 Safefree(HeKEY_hek(&PL_hv_fetch_ent_mh));
789 Safefree(PL_op_mask);
790 Safefree(PL_psig_ptr);
791 Safefree(PL_psig_name);
792 Safefree(PL_bitcount);
793 Safefree(PL_psig_pend);
795 PL_hints = 0; /* Reset hints. Should hints be per-interpreter ? */
797 DEBUG_P(debprofdump());
799 #ifdef USE_REENTRANT_API
800 Perl_reentrant_free(aTHX);
805 /* As the absolutely last thing, free the non-arena SV for mess() */
808 /* it could have accumulated taint magic */
809 if (SvTYPE(PL_mess_sv) >= SVt_PVMG) {
812 for (mg = SvMAGIC(PL_mess_sv); mg; mg = moremagic) {
813 moremagic = mg->mg_moremagic;
814 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global
816 Safefree(mg->mg_ptr);
820 /* we know that type >= SVt_PV */
821 (void)SvOOK_off(PL_mess_sv);
822 Safefree(SvPVX(PL_mess_sv));
823 Safefree(SvANY(PL_mess_sv));
824 Safefree(PL_mess_sv);
827 return STATUS_NATIVE_EXPORT;
831 =for apidoc perl_free
833 Releases a Perl interpreter. See L<perlembed>.
841 #if defined(WIN32) || defined(NETWARE)
842 # if defined(PERL_IMPLICIT_SYS)
844 void *host = nw_internal_host;
846 void *host = w32_internal_host;
850 nw_delete_internal_host(host);
852 win32_delete_internal_host(host);
863 Perl_call_atexit(pTHX_ ATEXIT_t fn, void *ptr)
865 Renew(PL_exitlist, PL_exitlistlen+1, PerlExitListEntry);
866 PL_exitlist[PL_exitlistlen].fn = fn;
867 PL_exitlist[PL_exitlistlen].ptr = ptr;
872 =for apidoc perl_parse
874 Tells a Perl interpreter to parse a Perl script. See L<perlembed>.
880 perl_parse(pTHXx_ XSINIT_t xsinit, int argc, char **argv, char **env)
885 #ifdef USE_5005THREADS
889 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
892 Perl_croak(aTHX_ "suidperl is no longer needed since the kernel can now execute\n\
893 setuid perl scripts securely.\n");
902 /* Come here if running an undumped a.out. */
904 PL_origfilename = savepv(argv[0]);
905 PL_do_undump = FALSE;
906 cxstack_ix = -1; /* start label stack again */
908 init_postdump_symbols(argc,argv,env);
913 op_free(PL_main_root);
914 PL_main_root = Nullop;
916 PL_main_start = Nullop;
917 SvREFCNT_dec(PL_main_cv);
921 oldscope = PL_scopestack_ix;
922 PL_dowarn = G_WARN_OFF;
924 #ifdef PERL_FLEXIBLE_EXCEPTIONS
925 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vparse_body), env, xsinit);
931 #ifndef PERL_FLEXIBLE_EXCEPTIONS
932 parse_body(env,xsinit);
935 call_list(oldscope, PL_checkav);
942 /* my_exit() was called */
943 while (PL_scopestack_ix > oldscope)
946 PL_curstash = PL_defstash;
948 call_list(oldscope, PL_checkav);
949 ret = STATUS_NATIVE_EXPORT;
952 PerlIO_printf(Perl_error_log, "panic: top_env\n");
960 #ifdef PERL_FLEXIBLE_EXCEPTIONS
962 S_vparse_body(pTHX_ va_list args)
964 char **env = va_arg(args, char**);
965 XSINIT_t xsinit = va_arg(args, XSINIT_t);
967 return parse_body(env, xsinit);
972 S_parse_body(pTHX_ char **env, XSINIT_t xsinit)
974 int argc = PL_origargc;
975 char **argv = PL_origargv;
976 char *scriptname = NULL;
978 VOL bool dosearch = FALSE;
982 char *cddir = Nullch;
984 sv_setpvn(PL_linestr,"",0);
985 sv = newSVpvn("",0); /* first used for -I flags */
989 for (argc--,argv++; argc > 0; argc--,argv++) {
990 if (argv[0][0] != '-' || !argv[0][1])
994 validarg = " PHOOEY ";
1003 win32_argv2utf8(argc-1, argv+1);
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 rschar = (U32)grok_oct(s, &numlen, &flags, NULL);
2178 SvREFCNT_dec(PL_rs);
2179 if (rschar & ~((U8)~0))
2180 PL_rs = &PL_sv_undef;
2181 else if (!rschar && numlen >= 2)
2182 PL_rs = newSVpvn("", 0);
2184 char ch = (char)rschar;
2185 PL_rs = newSVpvn(&ch, 1);
2191 PL_unicode = parse_unicode_opts(&s);
2196 while (*s && !isSPACE(*s)) ++s;
2198 PL_splitstr = savepv(PL_splitstr);
2211 /* The following permits -d:Mod to accepts arguments following an =
2212 in the fashion that -MSome::Mod does. */
2213 if (*s == ':' || *s == '=') {
2216 sv = newSVpv("use Devel::", 0);
2218 /* We now allow -d:Module=Foo,Bar */
2219 while(isALNUM(*s) || *s==':') ++s;
2221 sv_catpv(sv, start);
2223 sv_catpvn(sv, start, s-start);
2224 sv_catpv(sv, " split(/,/,q{");
2229 my_setenv("PERL5DB", SvPV(sv, PL_na));
2232 PL_perldb = PERLDB_ALL;
2240 if (isALPHA(s[1])) {
2241 /* if adding extra options, remember to update DEBUG_MASK */
2242 static char debopts[] = "psltocPmfrxu HXDSTRJvC";
2245 for (s++; *s && (d = strchr(debopts,*s)); s++)
2246 PL_debug |= 1 << (d - debopts);
2249 PL_debug = atoi(s+1);
2250 for (s++; isDIGIT(*s); s++) ;
2253 if (DEBUG_p_TEST_ && ckWARN_d(WARN_DEBUGGING))
2254 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
2255 "-Dp not implemented on this platform\n");
2257 PL_debug |= DEBUG_TOP_FLAG;
2258 #else /* !DEBUGGING */
2259 if (ckWARN_d(WARN_DEBUGGING))
2260 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
2261 "Recompile perl with -DDEBUGGING to use -D switch\n");
2262 for (s++; isALNUM(*s); s++) ;
2268 usage(PL_origargv[0]);
2272 Safefree(PL_inplace);
2273 #if defined(__CYGWIN__) /* do backup extension automagically */
2274 if (*(s+1) == '\0') {
2275 PL_inplace = savepv(".bak");
2278 #endif /* __CYGWIN__ */
2279 PL_inplace = savepv(s+1);
2281 for (s = PL_inplace; *s && !isSPACE(*s); s++) ;
2284 if (*s == '-') /* Additional switches on #! line. */
2288 case 'I': /* -I handled both here and in parse_body() */
2291 while (*s && isSPACE(*s))
2296 /* ignore trailing spaces (possibly followed by other switches) */
2298 for (e = p; *e && !isSPACE(*e); e++) ;
2302 } while (*p && *p != '-');
2303 e = savepvn(s, e-s);
2304 incpush(e, TRUE, TRUE, FALSE);
2311 Perl_croak(aTHX_ "No directory specified for -I");
2317 SvREFCNT_dec(PL_ors_sv);
2322 PL_ors_sv = newSVpvn("\n",1);
2323 numlen = 3 + (*s == '0');
2324 *SvPVX(PL_ors_sv) = (char)grok_oct(s, &numlen, &flags, NULL);
2328 if (RsPARA(PL_rs)) {
2329 PL_ors_sv = newSVpvn("\n\n",2);
2332 PL_ors_sv = newSVsv(PL_rs);
2339 PL_preambleav = newAV();
2341 SV *sv = newSVpvn("use assertions::activate split(/,/,q{",37);
2345 av_push(PL_preambleav, sv);
2348 av_push(PL_preambleav, newSVpvn("use assertions::activate",24));
2351 forbid_setid("-M"); /* XXX ? */
2354 forbid_setid("-m"); /* XXX ? */
2359 /* -M-foo == 'no foo' */
2360 if (*s == '-') { use = "no "; ++s; }
2361 sv = newSVpv(use,0);
2363 /* We allow -M'Module qw(Foo Bar)' */
2364 while(isALNUM(*s) || *s==':') ++s;
2366 sv_catpv(sv, start);
2367 if (*(start-1) == 'm') {
2369 Perl_croak(aTHX_ "Can't use '%c' after -mname", *s);
2370 sv_catpv( sv, " ()");
2374 Perl_croak(aTHX_ "Module name required with -%c option",
2376 sv_catpvn(sv, start, s-start);
2377 sv_catpv(sv, " split(/,/,q{");
2383 PL_preambleav = newAV();
2384 av_push(PL_preambleav, sv);
2387 Perl_croak(aTHX_ "No space allowed after -%c", *(s-1));
2399 PL_doswitches = TRUE;
2404 Perl_croak(aTHX_ "Too late for \"-t\" option");
2409 Perl_croak(aTHX_ "Too late for \"-T\" option");
2413 #ifdef MACOS_TRADITIONAL
2414 Perl_croak(aTHX_ "Believe me, you don't want to use \"-u\" on a Macintosh");
2416 PL_do_undump = TRUE;
2425 PerlIO_printf(PerlIO_stdout(),
2426 Perl_form(aTHX_ "\nThis is perl, v%"VDf" built for %s",
2427 PL_patchlevel, ARCHNAME));
2429 /* Adjust verbose output as in the perl that ships with the DG/UX OS from EMC */
2430 PerlIO_printf(PerlIO_stdout(),
2431 Perl_form(aTHX_ "\nThis is perl, version %vd\n", PL_patchlevel));
2432 PerlIO_printf(PerlIO_stdout(),
2433 Perl_form(aTHX_ " built under %s at %s %s\n",
2434 OSNAME, __DATE__, __TIME__));
2435 PerlIO_printf(PerlIO_stdout(),
2436 Perl_form(aTHX_ " OS Specific Release: %s\n",
2440 #if defined(LOCAL_PATCH_COUNT)
2441 if (LOCAL_PATCH_COUNT > 0)
2442 PerlIO_printf(PerlIO_stdout(),
2443 "\n(with %d registered patch%s, "
2444 "see perl -V for more detail)",
2445 (int)LOCAL_PATCH_COUNT,
2446 (LOCAL_PATCH_COUNT!=1) ? "es" : "");
2449 PerlIO_printf(PerlIO_stdout(),
2450 "\n\nCopyright 1987-2003, Larry Wall\n");
2451 #ifdef MACOS_TRADITIONAL
2452 PerlIO_printf(PerlIO_stdout(),
2453 "\nMac OS port Copyright 1991-2002, Matthias Neeracher;\n"
2454 "maintained by Chris Nandor\n");
2457 PerlIO_printf(PerlIO_stdout(),
2458 "\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
2461 PerlIO_printf(PerlIO_stdout(),
2462 "djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n"
2463 "djgpp v2 port (perl5004+) by Laszlo Molnar, 1997-1999\n");
2466 PerlIO_printf(PerlIO_stdout(),
2467 "\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
2468 "Version 5 port Copyright (c) 1994-2002, Andreas Kaiser, Ilya Zakharevich\n");
2471 PerlIO_printf(PerlIO_stdout(),
2472 "atariST series port, ++jrb bammi@cadence.com\n");
2475 PerlIO_printf(PerlIO_stdout(),
2476 "BeOS port Copyright Tom Spindler, 1997-1999\n");
2479 PerlIO_printf(PerlIO_stdout(),
2480 "MPE/iX port Copyright by Mark Klein and Mark Bixby, 1996-2002\n");
2483 PerlIO_printf(PerlIO_stdout(),
2484 "MVS (OS390) port by Mortice Kern Systems, 1997-1999\n");
2487 PerlIO_printf(PerlIO_stdout(),
2488 "Stratus VOS port by Paul.Green@stratus.com, 1997-2002\n");
2491 PerlIO_printf(PerlIO_stdout(),
2492 "VM/ESA port by Neale Ferguson, 1998-1999\n");
2495 PerlIO_printf(PerlIO_stdout(),
2496 "BS2000 (POSIX) port by Start Amadeus GmbH, 1998-1999\n");
2499 PerlIO_printf(PerlIO_stdout(),
2500 "MiNT port by Guido Flohr, 1997-1999\n");
2503 PerlIO_printf(PerlIO_stdout(),
2504 "EPOC port by Olaf Flebbe, 1999-2002\n");
2507 printf("WINCE port by Rainer Keuchel, 2001-2002\n");
2508 printf("Built on " __DATE__ " " __TIME__ "\n\n");
2511 #ifdef BINARY_BUILD_NOTICE
2512 BINARY_BUILD_NOTICE;
2514 PerlIO_printf(PerlIO_stdout(),
2516 Perl may be copied only under the terms of either the Artistic License or the\n\
2517 GNU General Public License, which may be found in the Perl 5 source kit.\n\n\
2518 Complete documentation for Perl, including FAQ lists, should be found on\n\
2519 this system using `man perl' or `perldoc perl'. If you have access to the\n\
2520 Internet, point your browser at http://www.perl.com/, the Perl Home Page.\n\n");
2523 if (! (PL_dowarn & G_WARN_ALL_MASK))
2524 PL_dowarn |= G_WARN_ON;
2528 PL_dowarn = G_WARN_ALL_ON|G_WARN_ON;
2529 if (!specialWARN(PL_compiling.cop_warnings))
2530 SvREFCNT_dec(PL_compiling.cop_warnings);
2531 PL_compiling.cop_warnings = pWARN_ALL ;
2535 PL_dowarn = G_WARN_ALL_OFF;
2536 if (!specialWARN(PL_compiling.cop_warnings))
2537 SvREFCNT_dec(PL_compiling.cop_warnings);
2538 PL_compiling.cop_warnings = pWARN_NONE ;
2543 if (s[1] == '-') /* Additional switches on #! line. */
2548 #if defined(WIN32) || !defined(PERL_STRICT_CR)
2554 #ifdef ALTERNATE_SHEBANG
2555 case 'S': /* OS/2 needs -S on "extproc" line. */
2563 Perl_croak(aTHX_ "Can't emulate -%.1s on #! line",s);
2568 /* compliments of Tom Christiansen */
2570 /* unexec() can be found in the Gnu emacs distribution */
2571 /* Known to work with -DUNEXEC and using unexelf.c from GNU emacs-20.2 */
2574 Perl_my_unexec(pTHX)
2582 prog = newSVpv(BIN_EXP, 0);
2583 sv_catpv(prog, "/perl");
2584 file = newSVpv(PL_origfilename, 0);
2585 sv_catpv(file, ".perldump");
2587 unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
2588 /* unexec prints msg to stderr in case of failure */
2589 PerlProc_exit(status);
2592 # include <lib$routines.h>
2593 lib$signal(SS$_DEBUG); /* ssdef.h #included from vmsish.h */
2595 ABORT(); /* for use with undump */
2600 /* initialize curinterp */
2606 # define PERLVAR(var,type)
2607 # define PERLVARA(var,n,type)
2608 # if defined(PERL_IMPLICIT_CONTEXT)
2609 # if defined(USE_5005THREADS)
2610 # define PERLVARI(var,type,init) PERL_GET_INTERP->var = init;
2611 # define PERLVARIC(var,type,init) PERL_GET_INTERP->var = init;
2612 # else /* !USE_5005THREADS */
2613 # define PERLVARI(var,type,init) aTHX->var = init;
2614 # define PERLVARIC(var,type,init) aTHX->var = init;
2615 # endif /* USE_5005THREADS */
2617 # define PERLVARI(var,type,init) PERL_GET_INTERP->var = init;
2618 # define PERLVARIC(var,type,init) PERL_GET_INTERP->var = init;
2620 # include "intrpvar.h"
2621 # ifndef USE_5005THREADS
2622 # include "thrdvar.h"
2629 # define PERLVAR(var,type)
2630 # define PERLVARA(var,n,type)
2631 # define PERLVARI(var,type,init) PL_##var = init;
2632 # define PERLVARIC(var,type,init) PL_##var = init;
2633 # include "intrpvar.h"
2634 # ifndef USE_5005THREADS
2635 # include "thrdvar.h"
2646 S_init_main_stash(pTHX)
2650 PL_curstash = PL_defstash = newHV();
2651 PL_curstname = newSVpvn("main",4);
2652 gv = gv_fetchpv("main::",TRUE, SVt_PVHV);
2653 SvREFCNT_dec(GvHV(gv));
2654 GvHV(gv) = (HV*)SvREFCNT_inc(PL_defstash);
2656 HvNAME(PL_defstash) = savepv("main");
2657 PL_incgv = gv_HVadd(gv_AVadd(gv_fetchpv("INC",TRUE, SVt_PVAV)));
2658 GvMULTI_on(PL_incgv);
2659 PL_hintgv = gv_fetchpv("\010",TRUE, SVt_PV); /* ^H */
2660 GvMULTI_on(PL_hintgv);
2661 PL_defgv = gv_fetchpv("_",TRUE, SVt_PVAV);
2662 PL_errgv = gv_HVadd(gv_fetchpv("@", TRUE, SVt_PV));
2663 GvMULTI_on(PL_errgv);
2664 PL_replgv = gv_fetchpv("\022", TRUE, SVt_PV); /* ^R */
2665 GvMULTI_on(PL_replgv);
2666 (void)Perl_form(aTHX_ "%240s",""); /* Preallocate temp - for immediate signals. */
2667 sv_grow(ERRSV, 240); /* Preallocate - for immediate signals. */
2668 sv_setpvn(ERRSV, "", 0);
2669 PL_curstash = PL_defstash;
2670 CopSTASH_set(&PL_compiling, PL_defstash);
2671 PL_debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
2672 PL_globalstash = GvHV(gv_fetchpv("CORE::GLOBAL::", GV_ADDMULTI, SVt_PVHV));
2673 /* We must init $/ before switches are processed. */
2674 sv_setpvn(get_sv("/", TRUE), "\n", 1);
2678 S_open_script(pTHX_ char *scriptname, bool dosearch, SV *sv, int *fdscript)
2682 char *cpp_discard_flag;
2688 PL_origfilename = savepv("-e");
2691 /* if find_script() returns, it returns a malloc()-ed value */
2692 PL_origfilename = scriptname = find_script(scriptname, dosearch, NULL, 1);
2694 if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
2695 char *s = scriptname + 8;
2696 *fdscript = atoi(s);
2700 scriptname = savepv(s + 1);
2701 Safefree(PL_origfilename);
2702 PL_origfilename = scriptname;
2707 CopFILE_free(PL_curcop);
2708 CopFILE_set(PL_curcop, PL_origfilename);
2709 if (strEQ(PL_origfilename,"-"))
2711 if (*fdscript >= 0) {
2712 PL_rsfp = PerlIO_fdopen(*fdscript,PERL_SCRIPT_MODE);
2713 # if defined(HAS_FCNTL) && defined(F_SETFD)
2715 /* ensure close-on-exec */
2716 fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,1);
2719 else if (PL_preprocess) {
2720 char *cpp_cfg = CPPSTDIN;
2721 SV *cpp = newSVpvn("",0);
2722 SV *cmd = NEWSV(0,0);
2724 if (strEQ(cpp_cfg, "cppstdin"))
2725 Perl_sv_catpvf(aTHX_ cpp, "%s/", BIN_EXP);
2726 sv_catpv(cpp, cpp_cfg);
2729 sv_catpvn(sv, "-I", 2);
2730 sv_catpv(sv,PRIVLIB_EXP);
2733 DEBUG_P(PerlIO_printf(Perl_debug_log,
2734 "PL_preprocess: scriptname=\"%s\", cpp=\"%s\", sv=\"%s\", CPPMINUS=\"%s\"\n",
2735 scriptname, SvPVX (cpp), SvPVX (sv), CPPMINUS));
2737 # if defined(MSDOS) || defined(WIN32) || defined(VMS)
2744 cpp_discard_flag = "";
2746 cpp_discard_flag = "-C";
2750 perl = os2_execname(aTHX);
2752 perl = PL_origargv[0];
2756 /* This strips off Perl comments which might interfere with
2757 the C pre-processor, including #!. #line directives are
2758 deliberately stripped to avoid confusion with Perl's version
2759 of #line. FWP played some golf with it so it will fit
2760 into VMS's 255 character buffer.
2763 code = "(1../^#!.*perl/i)|/^\\s*#(?!\\s*((ifn?|un)def|(el|end)?if|define|include|else|error|pragma)\\b)/||!($|=1)||print";
2765 code = "/^\\s*#(?!\\s*((ifn?|un)def|(el|end)?if|define|include|else|error|pragma)\\b)/||!($|=1)||print";
2767 Perl_sv_setpvf(aTHX_ cmd, "\
2768 %s -ne%s%s%s %s | %"SVf" %s %"SVf" %s",
2769 perl, quote, code, quote, scriptname, cpp,
2770 cpp_discard_flag, sv, CPPMINUS);
2772 PL_doextract = FALSE;
2773 # ifdef IAMSUID /* actually, this is caught earlier */
2774 if (PL_euid != PL_uid && !PL_euid) { /* if running suidperl */
2776 (void)seteuid(PL_uid); /* musn't stay setuid root */
2778 # ifdef HAS_SETREUID
2779 (void)setreuid((Uid_t)-1, PL_uid);
2781 # ifdef HAS_SETRESUID
2782 (void)setresuid((Uid_t)-1, PL_uid, (Uid_t)-1);
2784 PerlProc_setuid(PL_uid);
2788 if (PerlProc_geteuid() != PL_uid)
2789 Perl_croak(aTHX_ "Can't do seteuid!\n");
2791 # endif /* IAMSUID */
2793 DEBUG_P(PerlIO_printf(Perl_debug_log,
2794 "PL_preprocess: cmd=\"%s\"\n",
2797 PL_rsfp = PerlProc_popen(SvPVX(cmd), "r");
2801 else if (!*scriptname) {
2802 forbid_setid("program input from stdin");
2803 PL_rsfp = PerlIO_stdin();
2806 PL_rsfp = PerlIO_open(scriptname,PERL_SCRIPT_MODE);
2807 # if defined(HAS_FCNTL) && defined(F_SETFD)
2809 /* ensure close-on-exec */
2810 fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,1);
2815 # ifndef IAMSUID /* in case script is not readable before setuid */
2817 PerlLIO_stat(CopFILE(PL_curcop),&PL_statbuf) >= 0 &&
2818 PL_statbuf.st_mode & (S_ISUID|S_ISGID))
2821 PerlProc_execv(Perl_form(aTHX_ "%s/sperl"PERL_FS_VER_FMT,
2822 BIN_EXP, (int)PERL_REVISION,
2824 (int)PERL_SUBVERSION), PL_origargv);
2825 Perl_croak(aTHX_ "Can't do setuid\n");
2831 Perl_croak(aTHX_ "Can't open perl script: %s\n",
2834 Perl_croak(aTHX_ "Can't open perl script \"%s\": %s\n",
2835 CopFILE(PL_curcop), Strerror(errno));
2841 * I_SYSSTATVFS HAS_FSTATVFS
2843 * I_STATFS HAS_FSTATFS HAS_GETFSSTAT
2844 * I_MNTENT HAS_GETMNTENT HAS_HASMNTOPT
2845 * here so that metaconfig picks them up. */
2849 S_fd_on_nosuid_fs(pTHX_ int fd)
2851 int check_okay = 0; /* able to do all the required sys/libcalls */
2852 int on_nosuid = 0; /* the fd is on a nosuid fs */
2854 * Preferred order: fstatvfs(), fstatfs(), ustat()+getmnt(), getmntent().
2855 * fstatvfs() is UNIX98.
2856 * fstatfs() is 4.3 BSD.
2857 * ustat()+getmnt() is pre-4.3 BSD.
2858 * getmntent() is O(number-of-mounted-filesystems) and can hang on
2859 * an irrelevant filesystem while trying to reach the right one.
2862 #undef FD_ON_NOSUID_CHECK_OKAY /* found the syscalls to do the check? */
2864 # if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
2865 defined(HAS_FSTATVFS)
2866 # define FD_ON_NOSUID_CHECK_OKAY
2867 struct statvfs stfs;
2869 check_okay = fstatvfs(fd, &stfs) == 0;
2870 on_nosuid = check_okay && (stfs.f_flag & ST_NOSUID);
2871 # endif /* fstatvfs */
2873 # if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
2874 defined(PERL_MOUNT_NOSUID) && \
2875 defined(HAS_FSTATFS) && \
2876 defined(HAS_STRUCT_STATFS) && \
2877 defined(HAS_STRUCT_STATFS_F_FLAGS)
2878 # define FD_ON_NOSUID_CHECK_OKAY
2881 check_okay = fstatfs(fd, &stfs) == 0;
2882 on_nosuid = check_okay && (stfs.f_flags & PERL_MOUNT_NOSUID);
2883 # endif /* fstatfs */
2885 # if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
2886 defined(PERL_MOUNT_NOSUID) && \
2887 defined(HAS_FSTAT) && \
2888 defined(HAS_USTAT) && \
2889 defined(HAS_GETMNT) && \
2890 defined(HAS_STRUCT_FS_DATA) && \
2892 # define FD_ON_NOSUID_CHECK_OKAY
2895 if (fstat(fd, &fdst) == 0) {
2897 if (ustat(fdst.st_dev, &us) == 0) {
2899 /* NOSTAT_ONE here because we're not examining fields which
2900 * vary between that case and STAT_ONE. */
2901 if (getmnt((int*)0, &fsd, (int)0, NOSTAT_ONE, us.f_fname) == 0) {
2902 size_t cmplen = sizeof(us.f_fname);
2903 if (sizeof(fsd.fd_req.path) < cmplen)
2904 cmplen = sizeof(fsd.fd_req.path);
2905 if (strnEQ(fsd.fd_req.path, us.f_fname, cmplen) &&
2906 fdst.st_dev == fsd.fd_req.dev) {
2908 on_nosuid = fsd.fd_req.flags & PERL_MOUNT_NOSUID;
2914 # endif /* fstat+ustat+getmnt */
2916 # if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
2917 defined(HAS_GETMNTENT) && \
2918 defined(HAS_HASMNTOPT) && \
2919 defined(MNTOPT_NOSUID)
2920 # define FD_ON_NOSUID_CHECK_OKAY
2921 FILE *mtab = fopen("/etc/mtab", "r");
2922 struct mntent *entry;
2925 if (mtab && (fstat(fd, &stb) == 0)) {
2926 while (entry = getmntent(mtab)) {
2927 if (stat(entry->mnt_dir, &fsb) == 0
2928 && fsb.st_dev == stb.st_dev)
2930 /* found the filesystem */
2932 if (hasmntopt(entry, MNTOPT_NOSUID))
2935 } /* A single fs may well fail its stat(). */
2940 # endif /* getmntent+hasmntopt */
2943 Perl_croak(aTHX_ "Can't check filesystem of script \"%s\" for nosuid", PL_origfilename);
2946 #endif /* IAMSUID */
2949 S_validate_suid(pTHX_ char *validarg, char *scriptname, int fdscript)
2955 /* do we need to emulate setuid on scripts? */
2957 /* This code is for those BSD systems that have setuid #! scripts disabled
2958 * in the kernel because of a security problem. Merely defining DOSUID
2959 * in perl will not fix that problem, but if you have disabled setuid
2960 * scripts in the kernel, this will attempt to emulate setuid and setgid
2961 * on scripts that have those now-otherwise-useless bits set. The setuid
2962 * root version must be called suidperl or sperlN.NNN. If regular perl
2963 * discovers that it has opened a setuid script, it calls suidperl with
2964 * the same argv that it had. If suidperl finds that the script it has
2965 * just opened is NOT setuid root, it sets the effective uid back to the
2966 * uid. We don't just make perl setuid root because that loses the
2967 * effective uid we had before invoking perl, if it was different from the
2970 * DOSUID must be defined in both perl and suidperl, and IAMSUID must
2971 * be defined in suidperl only. suidperl must be setuid root. The
2972 * Configure script will set this up for you if you want it.
2978 if (PerlLIO_fstat(PerlIO_fileno(PL_rsfp),&PL_statbuf) < 0) /* normal stat is insecure */
2979 Perl_croak(aTHX_ "Can't stat script \"%s\"",PL_origfilename);
2980 if (fdscript < 0 && PL_statbuf.st_mode & (S_ISUID|S_ISGID)) {
2985 #ifndef HAS_SETREUID
2986 /* On this access check to make sure the directories are readable,
2987 * there is actually a small window that the user could use to make
2988 * filename point to an accessible directory. So there is a faint
2989 * chance that someone could execute a setuid script down in a
2990 * non-accessible directory. I don't know what to do about that.
2991 * But I don't think it's too important. The manual lies when
2992 * it says access() is useful in setuid programs.
2994 if (PerlLIO_access(CopFILE(PL_curcop),1)) /*double check*/
2995 Perl_croak(aTHX_ "Permission denied");
2997 /* If we can swap euid and uid, then we can determine access rights
2998 * with a simple stat of the file, and then compare device and
2999 * inode to make sure we did stat() on the same file we opened.
3000 * Then we just have to make sure he or she can execute it.
3007 setreuid(PL_euid,PL_uid) < 0
3010 setresuid(PL_euid,PL_uid,(Uid_t)-1) < 0
3013 || PerlProc_getuid() != PL_euid || PerlProc_geteuid() != PL_uid)
3014 Perl_croak(aTHX_ "Can't swap uid and euid"); /* really paranoid */
3015 if (PerlLIO_stat(CopFILE(PL_curcop),&tmpstatbuf) < 0)
3016 Perl_croak(aTHX_ "Permission denied"); /* testing full pathname here */
3017 #if defined(IAMSUID) && !defined(NO_NOSUID_CHECK)
3018 if (fd_on_nosuid_fs(PerlIO_fileno(PL_rsfp)))
3019 Perl_croak(aTHX_ "Permission denied");
3021 if (tmpstatbuf.st_dev != PL_statbuf.st_dev ||
3022 tmpstatbuf.st_ino != PL_statbuf.st_ino) {
3023 (void)PerlIO_close(PL_rsfp);
3024 Perl_croak(aTHX_ "Permission denied\n");
3028 setreuid(PL_uid,PL_euid) < 0
3030 # if defined(HAS_SETRESUID)
3031 setresuid(PL_uid,PL_euid,(Uid_t)-1) < 0
3034 || PerlProc_getuid() != PL_uid || PerlProc_geteuid() != PL_euid)
3035 Perl_croak(aTHX_ "Can't reswap uid and euid");
3036 if (!cando(S_IXUSR,FALSE,&PL_statbuf)) /* can real uid exec? */
3037 Perl_croak(aTHX_ "Permission denied\n");
3039 #endif /* HAS_SETREUID */
3040 #endif /* IAMSUID */
3042 if (!S_ISREG(PL_statbuf.st_mode))
3043 Perl_croak(aTHX_ "Permission denied");
3044 if (PL_statbuf.st_mode & S_IWOTH)
3045 Perl_croak(aTHX_ "Setuid/gid script is writable by world");
3046 PL_doswitches = FALSE; /* -s is insecure in suid */
3047 CopLINE_inc(PL_curcop);
3048 if (sv_gets(PL_linestr, PL_rsfp, 0) == Nullch ||
3049 strnNE(SvPV(PL_linestr,n_a),"#!",2) ) /* required even on Sys V */
3050 Perl_croak(aTHX_ "No #! line");
3051 s = SvPV(PL_linestr,n_a)+2;
3053 while (!isSPACE(*s)) s++;
3054 for (s2 = s; (s2 > SvPV(PL_linestr,n_a)+2 &&
3055 (isDIGIT(s2[-1]) || strchr("._-", s2[-1]))); s2--) ;
3056 if (strnNE(s2-4,"perl",4) && strnNE(s-9,"perl",4)) /* sanity check */
3057 Perl_croak(aTHX_ "Not a perl script");
3058 while (*s == ' ' || *s == '\t') s++;
3060 * #! arg must be what we saw above. They can invoke it by
3061 * mentioning suidperl explicitly, but they may not add any strange
3062 * arguments beyond what #! says if they do invoke suidperl that way.
3064 len = strlen(validarg);
3065 if (strEQ(validarg," PHOOEY ") ||
3066 strnNE(s,validarg,len) || !isSPACE(s[len]))
3067 Perl_croak(aTHX_ "Args must match #! line");
3070 if (PL_euid != PL_uid && (PL_statbuf.st_mode & S_ISUID) &&
3071 PL_euid == PL_statbuf.st_uid)
3073 Perl_croak(aTHX_ "YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
3074 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
3075 #endif /* IAMSUID */
3077 if (PL_euid) { /* oops, we're not the setuid root perl */
3078 (void)PerlIO_close(PL_rsfp);
3081 PerlProc_execv(Perl_form(aTHX_ "%s/sperl"PERL_FS_VER_FMT, BIN_EXP,
3082 (int)PERL_REVISION, (int)PERL_VERSION,
3083 (int)PERL_SUBVERSION), PL_origargv);
3085 Perl_croak(aTHX_ "Can't do setuid\n");
3088 if (PL_statbuf.st_mode & S_ISGID && PL_statbuf.st_gid != PL_egid) {
3090 (void)setegid(PL_statbuf.st_gid);
3093 (void)setregid((Gid_t)-1,PL_statbuf.st_gid);
3095 #ifdef HAS_SETRESGID
3096 (void)setresgid((Gid_t)-1,PL_statbuf.st_gid,(Gid_t)-1);
3098 PerlProc_setgid(PL_statbuf.st_gid);
3102 if (PerlProc_getegid() != PL_statbuf.st_gid)
3103 Perl_croak(aTHX_ "Can't do setegid!\n");
3105 if (PL_statbuf.st_mode & S_ISUID) {
3106 if (PL_statbuf.st_uid != PL_euid)
3108 (void)seteuid(PL_statbuf.st_uid); /* all that for this */
3111 (void)setreuid((Uid_t)-1,PL_statbuf.st_uid);
3113 #ifdef HAS_SETRESUID
3114 (void)setresuid((Uid_t)-1,PL_statbuf.st_uid,(Uid_t)-1);
3116 PerlProc_setuid(PL_statbuf.st_uid);
3120 if (PerlProc_geteuid() != PL_statbuf.st_uid)
3121 Perl_croak(aTHX_ "Can't do seteuid!\n");
3123 else if (PL_uid) { /* oops, mustn't run as root */
3125 (void)seteuid((Uid_t)PL_uid);
3128 (void)setreuid((Uid_t)-1,(Uid_t)PL_uid);
3130 #ifdef HAS_SETRESUID
3131 (void)setresuid((Uid_t)-1,(Uid_t)PL_uid,(Uid_t)-1);
3133 PerlProc_setuid((Uid_t)PL_uid);
3137 if (PerlProc_geteuid() != PL_uid)
3138 Perl_croak(aTHX_ "Can't do seteuid!\n");
3141 if (!cando(S_IXUSR,TRUE,&PL_statbuf))
3142 Perl_croak(aTHX_ "Permission denied\n"); /* they can't do this */
3145 else if (PL_preprocess)
3146 Perl_croak(aTHX_ "-P not allowed for setuid/setgid script\n");
3147 else if (fdscript >= 0)
3148 Perl_croak(aTHX_ "fd script not allowed in suidperl\n");
3150 Perl_croak(aTHX_ "Script is not setuid/setgid in suidperl\n");
3152 /* We absolutely must clear out any saved ids here, so we */
3153 /* exec the real perl, substituting fd script for scriptname. */
3154 /* (We pass script name as "subdir" of fd, which perl will grok.) */
3155 PerlIO_rewind(PL_rsfp);
3156 PerlLIO_lseek(PerlIO_fileno(PL_rsfp),(Off_t)0,0); /* just in case rewind didn't */
3157 for (which = 1; PL_origargv[which] && PL_origargv[which] != scriptname; which++) ;
3158 if (!PL_origargv[which])
3159 Perl_croak(aTHX_ "Permission denied");
3160 PL_origargv[which] = savepv(Perl_form(aTHX_ "/dev/fd/%d/%s",
3161 PerlIO_fileno(PL_rsfp), PL_origargv[which]));
3162 #if defined(HAS_FCNTL) && defined(F_SETFD)
3163 fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,0); /* ensure no close-on-exec */
3165 PerlProc_execv(Perl_form(aTHX_ "%s/perl"PERL_FS_VER_FMT, BIN_EXP,
3166 (int)PERL_REVISION, (int)PERL_VERSION,
3167 (int)PERL_SUBVERSION), PL_origargv);/* try again */
3168 Perl_croak(aTHX_ "Can't do setuid\n");
3169 #endif /* IAMSUID */
3171 if (PL_euid != PL_uid || PL_egid != PL_gid) { /* (suidperl doesn't exist, in fact) */
3172 #ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
3173 PerlLIO_fstat(PerlIO_fileno(PL_rsfp),&PL_statbuf); /* may be either wrapped or real suid */
3174 if ((PL_euid != PL_uid && PL_euid == PL_statbuf.st_uid && PL_statbuf.st_mode & S_ISUID)
3176 (PL_egid != PL_gid && PL_egid == PL_statbuf.st_gid && PL_statbuf.st_mode & S_ISGID)
3179 Perl_croak(aTHX_ "YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
3180 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
3181 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
3182 /* not set-id, must be wrapped */
3188 S_find_beginning(pTHX)
3190 register char *s, *s2;
3191 #ifdef MACOS_TRADITIONAL
3195 /* skip forward in input to the real script? */
3198 #ifdef MACOS_TRADITIONAL
3199 /* Since the Mac OS does not honor #! arguments for us, we do it ourselves */
3201 while (PL_doextract || gMacPerl_AlwaysExtract) {
3202 if ((s = sv_gets(PL_linestr, PL_rsfp, 0)) == Nullch) {
3203 if (!gMacPerl_AlwaysExtract)
3204 Perl_croak(aTHX_ "No Perl script found in input\n");
3206 if (PL_doextract) /* require explicit override ? */
3207 if (!OverrideExtract(PL_origfilename))
3208 Perl_croak(aTHX_ "User aborted script\n");
3210 PL_doextract = FALSE;
3212 /* Pater peccavi, file does not have #! */
3213 PerlIO_rewind(PL_rsfp);
3218 while (PL_doextract) {
3219 if ((s = sv_gets(PL_linestr, PL_rsfp, 0)) == Nullch)
3220 Perl_croak(aTHX_ "No Perl script found in input\n");
3223 if (*s == '#' && s[1] == '!' && ((s = instr(s,"perl")) || (s = instr(s2,"PERL")))) {
3224 PerlIO_ungetc(PL_rsfp, '\n'); /* to keep line count right */
3225 PL_doextract = FALSE;
3226 while (*s && !(isSPACE (*s) || *s == '#')) s++;
3228 while (*s == ' ' || *s == '\t') s++;
3230 while (isDIGIT(s2[-1]) || strchr("-._", s2[-1])) s2--;
3231 if (strnEQ(s2-4,"perl",4))
3233 while ((s = moreswitches(s)))
3236 #ifdef MACOS_TRADITIONAL
3237 /* We are always searching for the #!perl line in MacPerl,
3238 * so if we find it, still keep the line count correct
3239 * by counting lines we already skipped over
3241 for (; maclines > 0 ; maclines--)
3242 PerlIO_ungetc(PL_rsfp, '\n');
3246 /* gMacPerl_AlwaysExtract is false in MPW tool */
3247 } else if (gMacPerl_AlwaysExtract) {
3258 PL_uid = PerlProc_getuid();
3259 PL_euid = PerlProc_geteuid();
3260 PL_gid = PerlProc_getgid();
3261 PL_egid = PerlProc_getegid();
3263 PL_uid |= PL_gid << 16;
3264 PL_euid |= PL_egid << 16;
3266 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
3270 S_forbid_setid(pTHX_ char *s)
3272 if (PL_euid != PL_uid)
3273 Perl_croak(aTHX_ "No %s allowed while running setuid", s);
3274 if (PL_egid != PL_gid)
3275 Perl_croak(aTHX_ "No %s allowed while running setgid", s);
3279 Perl_init_debugger(pTHX)
3281 HV *ostash = PL_curstash;
3283 PL_curstash = PL_debstash;
3284 PL_dbargs = GvAV(gv_AVadd((gv_fetchpv("args", GV_ADDMULTI, SVt_PVAV))));
3285 AvREAL_off(PL_dbargs);
3286 PL_DBgv = gv_fetchpv("DB", GV_ADDMULTI, SVt_PVGV);
3287 PL_DBline = gv_fetchpv("dbline", GV_ADDMULTI, SVt_PVAV);
3288 PL_DBsub = gv_HVadd(gv_fetchpv("sub", GV_ADDMULTI, SVt_PVHV));
3289 sv_upgrade(GvSV(PL_DBsub), SVt_IV); /* IVX accessed if PERLDB_SUB_NN */
3290 PL_DBsingle = GvSV((gv_fetchpv("single", GV_ADDMULTI, SVt_PV)));
3291 sv_setiv(PL_DBsingle, 0);
3292 PL_DBtrace = GvSV((gv_fetchpv("trace", GV_ADDMULTI, SVt_PV)));
3293 sv_setiv(PL_DBtrace, 0);
3294 PL_DBsignal = GvSV((gv_fetchpv("signal", GV_ADDMULTI, SVt_PV)));
3295 sv_setiv(PL_DBsignal, 0);
3296 PL_DBassertion = GvSV((gv_fetchpv("assertion", GV_ADDMULTI, SVt_PV)));
3297 sv_setiv(PL_DBassertion, 0);
3298 PL_curstash = ostash;
3301 #ifndef STRESS_REALLOC
3302 #define REASONABLE(size) (size)
3304 #define REASONABLE(size) (1) /* unreasonable */
3308 Perl_init_stacks(pTHX)
3310 /* start with 128-item stack and 8K cxstack */
3311 PL_curstackinfo = new_stackinfo(REASONABLE(128),
3312 REASONABLE(8192/sizeof(PERL_CONTEXT) - 1));
3313 PL_curstackinfo->si_type = PERLSI_MAIN;
3314 PL_curstack = PL_curstackinfo->si_stack;
3315 PL_mainstack = PL_curstack; /* remember in case we switch stacks */
3317 PL_stack_base = AvARRAY(PL_curstack);
3318 PL_stack_sp = PL_stack_base;
3319 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
3321 New(50,PL_tmps_stack,REASONABLE(128),SV*);
3324 PL_tmps_max = REASONABLE(128);
3326 New(54,PL_markstack,REASONABLE(32),I32);
3327 PL_markstack_ptr = PL_markstack;
3328 PL_markstack_max = PL_markstack + REASONABLE(32);
3332 New(54,PL_scopestack,REASONABLE(32),I32);
3333 PL_scopestack_ix = 0;
3334 PL_scopestack_max = REASONABLE(32);
3336 New(54,PL_savestack,REASONABLE(128),ANY);
3337 PL_savestack_ix = 0;
3338 PL_savestack_max = REASONABLE(128);
3340 New(54,PL_retstack,REASONABLE(16),OP*);
3342 PL_retstack_max = REASONABLE(16);
3350 while (PL_curstackinfo->si_next)
3351 PL_curstackinfo = PL_curstackinfo->si_next;
3352 while (PL_curstackinfo) {
3353 PERL_SI *p = PL_curstackinfo->si_prev;
3354 /* curstackinfo->si_stack got nuked by sv_free_arenas() */
3355 Safefree(PL_curstackinfo->si_cxstack);
3356 Safefree(PL_curstackinfo);
3357 PL_curstackinfo = p;
3359 Safefree(PL_tmps_stack);
3360 Safefree(PL_markstack);
3361 Safefree(PL_scopestack);
3362 Safefree(PL_savestack);
3363 Safefree(PL_retstack);
3372 lex_start(PL_linestr);
3374 PL_subname = newSVpvn("main",4);
3378 S_init_predump_symbols(pTHX)
3383 sv_setpvn(get_sv("\"", TRUE), " ", 1);
3384 PL_stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
3385 GvMULTI_on(PL_stdingv);
3386 io = GvIOp(PL_stdingv);
3387 IoTYPE(io) = IoTYPE_RDONLY;
3388 IoIFP(io) = PerlIO_stdin();
3389 tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
3391 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
3393 tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
3396 IoTYPE(io) = IoTYPE_WRONLY;
3397 IoOFP(io) = IoIFP(io) = PerlIO_stdout();
3399 tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
3401 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
3403 PL_stderrgv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
3404 GvMULTI_on(PL_stderrgv);
3405 io = GvIOp(PL_stderrgv);
3406 IoTYPE(io) = IoTYPE_WRONLY;
3407 IoOFP(io) = IoIFP(io) = PerlIO_stderr();
3408 tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
3410 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
3412 PL_statname = NEWSV(66,0); /* last filename we did stat on */
3415 Safefree(PL_osname);
3416 PL_osname = savepv(OSNAME);
3420 Perl_init_argv_symbols(pTHX_ register int argc, register char **argv)
3423 argc--,argv++; /* skip name of script */
3424 if (PL_doswitches) {
3425 for (; argc > 0 && **argv == '-'; argc--,argv++) {
3428 if (argv[0][1] == '-' && !argv[0][2]) {
3432 if ((s = strchr(argv[0], '='))) {
3434 sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),s);
3437 sv_setiv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),1);
3440 if ((PL_argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV))) {
3441 GvMULTI_on(PL_argvgv);
3442 (void)gv_AVadd(PL_argvgv);
3443 av_clear(GvAVn(PL_argvgv));
3444 for (; argc > 0; argc--,argv++) {
3445 SV *sv = newSVpv(argv[0],0);
3446 av_push(GvAVn(PL_argvgv),sv);
3447 if (!(PL_unicode & PERL_UNICODE_LOCALE_FLAG) || PL_utf8locale) {
3448 if (PL_unicode & PERL_UNICODE_ARGV_FLAG)
3451 if (PL_unicode & PERL_UNICODE_WIDESYSCALLS_FLAG) /* Sarathy? */
3452 (void)sv_utf8_decode(sv);
3457 #ifdef HAS_PROCSELFEXE
3458 /* This is a function so that we don't hold on to MAXPATHLEN
3459 bytes of stack longer than necessary
3462 S_procself_val(pTHX_ SV *sv, char *arg0)
3464 char buf[MAXPATHLEN];
3465 int len = readlink(PROCSELFEXE_PATH, buf, sizeof(buf) - 1);
3467 /* On Playstation2 Linux V1.0 (kernel 2.2.1) readlink(/proc/self/exe)
3468 includes a spurious NUL which will cause $^X to fail in system
3469 or backticks (this will prevent extensions from being built and
3470 many tests from working). readlink is not meant to add a NUL.
3471 Normal readlink works fine.
3473 if (len > 0 && buf[len-1] == '\0') {
3477 /* FreeBSD's implementation is acknowledged to be imperfect, sometimes
3478 returning the text "unknown" from the readlink rather than the path
3479 to the executable (or returning an error from the readlink). Any valid
3480 path has a '/' in it somewhere, so use that to validate the result.
3481 See http://www.freebsd.org/cgi/query-pr.cgi?pr=35703
3483 if (len > 0 && memchr(buf, '/', len)) {
3484 sv_setpvn(sv,buf,len);
3490 #endif /* HAS_PROCSELFEXE */
3493 S_init_postdump_symbols(pTHX_ register int argc, register char **argv, register char **env)
3499 PL_toptarget = NEWSV(0,0);
3500 sv_upgrade(PL_toptarget, SVt_PVFM);
3501 sv_setpvn(PL_toptarget, "", 0);
3502 PL_bodytarget = NEWSV(0,0);
3503 sv_upgrade(PL_bodytarget, SVt_PVFM);
3504 sv_setpvn(PL_bodytarget, "", 0);
3505 PL_formtarget = PL_bodytarget;
3509 init_argv_symbols(argc,argv);
3511 if ((tmpgv = gv_fetchpv("0",TRUE, SVt_PV))) {
3512 #ifdef MACOS_TRADITIONAL
3513 /* $0 is not majick on a Mac */
3514 sv_setpv(GvSV(tmpgv),MacPerl_MPWFileName(PL_origfilename));
3516 sv_setpv(GvSV(tmpgv),PL_origfilename);
3517 magicname("0", "0", 1);
3520 if ((tmpgv = gv_fetchpv("\030",TRUE, SVt_PV))) {/* $^X */
3521 #ifdef HAS_PROCSELFEXE
3522 S_procself_val(aTHX_ GvSV(tmpgv), PL_origargv[0]);
3525 sv_setpv(GvSV(tmpgv), os2_execname(aTHX));
3527 sv_setpv(GvSV(tmpgv),PL_origargv[0]);
3531 if ((PL_envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV))) {
3533 GvMULTI_on(PL_envgv);
3534 hv = GvHVn(PL_envgv);
3535 hv_magic(hv, Nullgv, PERL_MAGIC_env);
3536 #ifdef USE_ENVIRON_ARRAY
3537 /* Note that if the supplied env parameter is actually a copy
3538 of the global environ then it may now point to free'd memory
3539 if the environment has been modified since. To avoid this
3540 problem we treat env==NULL as meaning 'use the default'
3545 # ifdef USE_ITHREADS
3546 && PL_curinterp == aTHX
3550 environ[0] = Nullch;
3553 for (; *env; env++) {
3554 if (!(s = strchr(*env,'=')))
3561 sv = newSVpv(s+1, 0);
3562 (void)hv_store(hv, *env, s - *env, sv, 0);
3566 #endif /* USE_ENVIRON_ARRAY */
3569 if ((tmpgv = gv_fetchpv("$",TRUE, SVt_PV))) {
3570 SvREADONLY_off(GvSV(tmpgv));
3571 sv_setiv(GvSV(tmpgv), (IV)PerlProc_getpid());
3572 SvREADONLY_on(GvSV(tmpgv));
3574 #ifdef THREADS_HAVE_PIDS
3575 PL_ppid = (IV)getppid();
3578 /* touch @F array to prevent spurious warnings 20020415 MJD */
3580 (void) get_av("main::F", TRUE | GV_ADDMULTI);
3582 /* touch @- and @+ arrays to prevent spurious warnings 20020415 MJD */
3583 (void) get_av("main::-", TRUE | GV_ADDMULTI);
3584 (void) get_av("main::+", TRUE | GV_ADDMULTI);
3588 S_init_perllib(pTHX)
3593 s = PerlEnv_getenv("PERL5LIB");
3595 incpush(s, TRUE, TRUE, TRUE);
3597 incpush(PerlEnv_getenv("PERLLIB"), FALSE, FALSE, TRUE);
3599 /* Treat PERL5?LIB as a possible search list logical name -- the
3600 * "natural" VMS idiom for a Unix path string. We allow each
3601 * element to be a set of |-separated directories for compatibility.
3605 if (my_trnlnm("PERL5LIB",buf,0))
3606 do { incpush(buf,TRUE,TRUE,TRUE); } while (my_trnlnm("PERL5LIB",buf,++idx));
3608 while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE,FALSE,TRUE);
3612 /* Use the ~-expanded versions of APPLLIB (undocumented),
3613 ARCHLIB PRIVLIB SITEARCH SITELIB VENDORARCH and VENDORLIB
3616 incpush(APPLLIB_EXP, TRUE, TRUE, TRUE);
3620 incpush(ARCHLIB_EXP, FALSE, FALSE, TRUE);
3622 #ifdef MACOS_TRADITIONAL
3625 SV * privdir = NEWSV(55, 0);
3626 char * macperl = PerlEnv_getenv("MACPERL");
3631 Perl_sv_setpvf(aTHX_ privdir, "%slib:", macperl);
3632 if (PerlLIO_stat(SvPVX(privdir), &tmpstatbuf) >= 0 && S_ISDIR(tmpstatbuf.st_mode))
3633 incpush(SvPVX(privdir), TRUE, FALSE, TRUE);
3634 Perl_sv_setpvf(aTHX_ privdir, "%ssite_perl:", macperl);
3635 if (PerlLIO_stat(SvPVX(privdir), &tmpstatbuf) >= 0 && S_ISDIR(tmpstatbuf.st_mode))
3636 incpush(SvPVX(privdir), TRUE, FALSE, TRUE);
3638 SvREFCNT_dec(privdir);
3641 incpush(":", FALSE, FALSE, TRUE);
3644 # define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
3647 incpush(PRIVLIB_EXP, TRUE, FALSE, TRUE);
3649 incpush(PRIVLIB_EXP, FALSE, FALSE, TRUE);
3653 /* sitearch is always relative to sitelib on Windows for
3654 * DLL-based path intuition to work correctly */
3655 # if !defined(WIN32)
3656 incpush(SITEARCH_EXP, FALSE, FALSE, TRUE);
3662 /* this picks up sitearch as well */
3663 incpush(SITELIB_EXP, TRUE, FALSE, TRUE);
3665 incpush(SITELIB_EXP, FALSE, FALSE, TRUE);
3669 #ifdef SITELIB_STEM /* Search for version-specific dirs below here */
3670 incpush(SITELIB_STEM, FALSE, TRUE, TRUE);
3673 #ifdef PERL_VENDORARCH_EXP
3674 /* vendorarch is always relative to vendorlib on Windows for
3675 * DLL-based path intuition to work correctly */
3676 # if !defined(WIN32)
3677 incpush(PERL_VENDORARCH_EXP, FALSE, FALSE, TRUE);
3681 #ifdef PERL_VENDORLIB_EXP
3683 incpush(PERL_VENDORLIB_EXP, TRUE, FALSE, TRUE); /* this picks up vendorarch as well */
3685 incpush(PERL_VENDORLIB_EXP, FALSE, FALSE, TRUE);
3689 #ifdef PERL_VENDORLIB_STEM /* Search for version-specific dirs below here */
3690 incpush(PERL_VENDORLIB_STEM, FALSE, TRUE, TRUE);
3693 #ifdef PERL_OTHERLIBDIRS
3694 incpush(PERL_OTHERLIBDIRS, TRUE, TRUE, TRUE);
3698 incpush(".", FALSE, FALSE, TRUE);
3699 #endif /* MACOS_TRADITIONAL */
3702 #if defined(DOSISH) || defined(EPOC)
3703 # define PERLLIB_SEP ';'
3706 # define PERLLIB_SEP '|'
3708 # if defined(MACOS_TRADITIONAL)
3709 # define PERLLIB_SEP ','
3711 # define PERLLIB_SEP ':'
3715 #ifndef PERLLIB_MANGLE
3716 # define PERLLIB_MANGLE(s,n) (s)
3720 S_incpush(pTHX_ char *p, int addsubdirs, int addoldvers, int usesep)
3722 SV *subdir = Nullsv;
3727 if (addsubdirs || addoldvers) {
3728 subdir = sv_newmortal();
3731 /* Break at all separators */
3733 SV *libdir = NEWSV(55,0);
3736 /* skip any consecutive separators */
3738 while ( *p == PERLLIB_SEP ) {
3739 /* Uncomment the next line for PATH semantics */
3740 /* av_push(GvAVn(PL_incgv), newSVpvn(".", 1)); */
3745 if ( usesep && (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
3746 sv_setpvn(libdir, PERLLIB_MANGLE(p, (STRLEN)(s - p)),
3751 sv_setpv(libdir, PERLLIB_MANGLE(p, 0));
3752 p = Nullch; /* break out */
3754 #ifdef MACOS_TRADITIONAL
3755 if (!strchr(SvPVX(libdir), ':')) {
3758 sv_setpv(libdir, MacPerl_CanonDir(SvPVX(libdir), buf, 0));
3760 if (SvPVX(libdir)[SvCUR(libdir)-1] != ':')
3761 sv_catpv(libdir, ":");
3765 * BEFORE pushing libdir onto @INC we may first push version- and
3766 * archname-specific sub-directories.
3768 if (addsubdirs || addoldvers) {
3769 #ifdef PERL_INC_VERSION_LIST
3770 /* Configure terminates PERL_INC_VERSION_LIST with a NULL */
3771 const char *incverlist[] = { PERL_INC_VERSION_LIST };
3772 const char **incver;
3779 if ((unix = tounixspec_ts(SvPV(libdir,len),Nullch)) != Nullch) {
3781 while (unix[len-1] == '/') len--; /* Cosmetic */
3782 sv_usepvn(libdir,unix,len);
3785 PerlIO_printf(Perl_error_log,
3786 "Failed to unixify @INC element \"%s\"\n",
3790 #ifdef MACOS_TRADITIONAL
3791 #define PERL_AV_SUFFIX_FMT ""
3792 #define PERL_ARCH_FMT "%s:"
3793 #define PERL_ARCH_FMT_PATH PERL_FS_VER_FMT PERL_AV_SUFFIX_FMT
3795 #define PERL_AV_SUFFIX_FMT "/"
3796 #define PERL_ARCH_FMT "/%s"
3797 #define PERL_ARCH_FMT_PATH PERL_AV_SUFFIX_FMT PERL_FS_VER_FMT
3799 /* .../version/archname if -d .../version/archname */
3800 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT_PATH PERL_ARCH_FMT,
3802 (int)PERL_REVISION, (int)PERL_VERSION,
3803 (int)PERL_SUBVERSION, ARCHNAME);
3804 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
3805 S_ISDIR(tmpstatbuf.st_mode))
3806 av_push(GvAVn(PL_incgv), newSVsv(subdir));
3808 /* .../version if -d .../version */
3809 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT_PATH, libdir,
3810 (int)PERL_REVISION, (int)PERL_VERSION,
3811 (int)PERL_SUBVERSION);
3812 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
3813 S_ISDIR(tmpstatbuf.st_mode))
3814 av_push(GvAVn(PL_incgv), newSVsv(subdir));
3816 /* .../archname if -d .../archname */
3817 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT, libdir, ARCHNAME);
3818 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
3819 S_ISDIR(tmpstatbuf.st_mode))
3820 av_push(GvAVn(PL_incgv), newSVsv(subdir));
3823 #ifdef PERL_INC_VERSION_LIST
3825 for (incver = incverlist; *incver; incver++) {
3826 /* .../xxx if -d .../xxx */
3827 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT, libdir, *incver);
3828 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
3829 S_ISDIR(tmpstatbuf.st_mode))
3830 av_push(GvAVn(PL_incgv), newSVsv(subdir));
3836 /* finally push this lib directory on the end of @INC */
3837 av_push(GvAVn(PL_incgv), libdir);
3841 #ifdef USE_5005THREADS
3842 STATIC struct perl_thread *
3843 S_init_main_thread(pTHX)
3845 #if !defined(PERL_IMPLICIT_CONTEXT)
3846 struct perl_thread *thr;
3850 Newz(53, thr, 1, struct perl_thread);
3851 PL_curcop = &PL_compiling;
3852 thr->interp = PERL_GET_INTERP;
3853 thr->cvcache = newHV();
3854 thr->threadsv = newAV();
3855 /* thr->threadsvp is set when find_threadsv is called */
3856 thr->specific = newAV();
3857 thr->flags = THRf_R_JOINABLE;
3858 MUTEX_INIT(&thr->mutex);
3859 /* Handcraft thrsv similarly to mess_sv */
3860 New(53, PL_thrsv, 1, SV);
3861 Newz(53, xpv, 1, XPV);
3862 SvFLAGS(PL_thrsv) = SVt_PV;
3863 SvANY(PL_thrsv) = (void*)xpv;
3864 SvREFCNT(PL_thrsv) = 1 << 30; /* practically infinite */
3865 SvPVX(PL_thrsv) = (char*)thr;
3866 SvCUR_set(PL_thrsv, sizeof(thr));
3867 SvLEN_set(PL_thrsv, sizeof(thr));
3868 *SvEND(PL_thrsv) = '\0'; /* in the trailing_nul field */
3869 thr->oursv = PL_thrsv;
3870 PL_chopset = " \n-";
3873 MUTEX_LOCK(&PL_threads_mutex);
3879 MUTEX_UNLOCK(&PL_threads_mutex);
3881 #ifdef HAVE_THREAD_INTERN
3882 Perl_init_thread_intern(thr);
3885 #ifdef SET_THREAD_SELF
3886 SET_THREAD_SELF(thr);
3888 thr->self = pthread_self();
3889 #endif /* SET_THREAD_SELF */
3893 * These must come after the thread self setting
3894 * because sv_setpvn does SvTAINT and the taint
3895 * fields thread selfness being set.
3897 PL_toptarget = NEWSV(0,0);
3898 sv_upgrade(PL_toptarget, SVt_PVFM);
3899 sv_setpvn(PL_toptarget, "", 0);
3900 PL_bodytarget = NEWSV(0,0);
3901 sv_upgrade(PL_bodytarget, SVt_PVFM);
3902 sv_setpvn(PL_bodytarget, "", 0);
3903 PL_formtarget = PL_bodytarget;
3904 thr->errsv = newSVpvn("", 0);
3905 (void) find_threadsv("@"); /* Ensure $@ is initialised early */
3908 PL_peepp = MEMBER_TO_FPTR(Perl_peep);
3909 PL_regcompp = MEMBER_TO_FPTR(Perl_pregcomp);
3910 PL_regexecp = MEMBER_TO_FPTR(Perl_regexec_flags);
3911 PL_regint_start = MEMBER_TO_FPTR(Perl_re_intuit_start);
3912 PL_regint_string = MEMBER_TO_FPTR(Perl_re_intuit_string);
3913 PL_regfree = MEMBER_TO_FPTR(Perl_pregfree);
3915 PL_reginterp_cnt = 0;
3919 #endif /* USE_5005THREADS */
3922 Perl_call_list(pTHX_ I32 oldscope, AV *paramList)
3925 line_t oldline = CopLINE(PL_curcop);
3931 while (AvFILL(paramList) >= 0) {
3932 cv = (CV*)av_shift(paramList);
3934 if (paramList == PL_beginav) {
3935 /* save PL_beginav for compiler */
3936 if (! PL_beginav_save)
3937 PL_beginav_save = newAV();
3938 av_push(PL_beginav_save, (SV*)cv);
3940 else if (paramList == PL_checkav) {
3941 /* save PL_checkav for compiler */
3942 if (! PL_checkav_save)
3943 PL_checkav_save = newAV();
3944 av_push(PL_checkav_save, (SV*)cv);
3949 #ifdef PERL_FLEXIBLE_EXCEPTIONS
3950 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vcall_list_body), cv);
3956 #ifndef PERL_FLEXIBLE_EXCEPTIONS
3960 (void)SvPV(atsv, len);
3962 PL_curcop = &PL_compiling;
3963 CopLINE_set(PL_curcop, oldline);
3964 if (paramList == PL_beginav)
3965 sv_catpv(atsv, "BEGIN failed--compilation aborted");
3967 Perl_sv_catpvf(aTHX_ atsv,
3968 "%s failed--call queue aborted",
3969 paramList == PL_checkav ? "CHECK"
3970 : paramList == PL_initav ? "INIT"
3972 while (PL_scopestack_ix > oldscope)
3975 Perl_croak(aTHX_ "%"SVf"", atsv);
3982 /* my_exit() was called */
3983 while (PL_scopestack_ix > oldscope)
3986 PL_curstash = PL_defstash;
3987 PL_curcop = &PL_compiling;
3988 CopLINE_set(PL_curcop, oldline);
3990 if (PL_statusvalue && !(PL_exit_flags & PERL_EXIT_EXPECTED)) {
3991 if (paramList == PL_beginav)
3992 Perl_croak(aTHX_ "BEGIN failed--compilation aborted");
3994 Perl_croak(aTHX_ "%s failed--call queue aborted",
3995 paramList == PL_checkav ? "CHECK"
3996 : paramList == PL_initav ? "INIT"
4003 PL_curcop = &PL_compiling;
4004 CopLINE_set(PL_curcop, oldline);
4007 PerlIO_printf(Perl_error_log, "panic: restartop\n");
4015 #ifdef PERL_FLEXIBLE_EXCEPTIONS
4017 S_vcall_list_body(pTHX_ va_list args)
4019 CV *cv = va_arg(args, CV*);
4020 return call_list_body(cv);
4025 S_call_list_body(pTHX_ CV *cv)
4027 PUSHMARK(PL_stack_sp);
4028 call_sv((SV*)cv, G_EVAL|G_DISCARD);
4033 Perl_my_exit(pTHX_ U32 status)
4035 DEBUG_S(PerlIO_printf(Perl_debug_log, "my_exit: thread %p, status %lu\n",
4036 thr, (unsigned long) status));
4045 STATUS_NATIVE_SET(status);
4052 Perl_my_failure_exit(pTHX)
4055 if (vaxc$errno & 1) {
4056 if (STATUS_NATIVE & 1) /* fortuitiously includes "-1" */
4057 STATUS_NATIVE_SET(44);
4060 if (!vaxc$errno && errno) /* unlikely */
4061 STATUS_NATIVE_SET(44);
4063 STATUS_NATIVE_SET(vaxc$errno);
4068 STATUS_POSIX_SET(errno);
4070 exitstatus = STATUS_POSIX >> 8;
4071 if (exitstatus & 255)
4072 STATUS_POSIX_SET(exitstatus);
4074 STATUS_POSIX_SET(255);
4081 S_my_exit_jump(pTHX)
4083 register PERL_CONTEXT *cx;
4088 SvREFCNT_dec(PL_e_script);
4089 PL_e_script = Nullsv;
4092 POPSTACK_TO(PL_mainstack);
4093 if (cxstack_ix >= 0) {
4096 POPBLOCK(cx,PL_curpm);
4104 read_e_script(pTHX_ int idx, SV *buf_sv, int maxlen)
4107 p = SvPVX(PL_e_script);
4108 nl = strchr(p, '\n');
4109 nl = (nl) ? nl+1 : SvEND(PL_e_script);
4111 filter_del(read_e_script);
4114 sv_catpvn(buf_sv, p, nl-p);
4115 sv_chop(PL_e_script, nl);