3 * Copyright (c) 1987-2002 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);
389 if (destruct_level == 0){
391 DEBUG_P(debprofdump());
393 #if defined(PERLIO_LAYERS)
394 /* No more IO - including error messages ! */
395 PerlIO_cleanup(aTHX);
398 /* The exit() function will do everything that needs doing. */
399 return STATUS_NATIVE_EXPORT;
402 /* jettison our possibly duplicated environment */
403 /* if PERL_USE_SAFE_PUTENV is defined environ will not have been copied
404 * so we certainly shouldn't free it here
406 #if defined(USE_ENVIRON_ARRAY) && !defined(PERL_USE_SAFE_PUTENV)
407 if (environ != PL_origenviron
409 /* only main thread can free environ[0] contents */
410 && PL_curinterp == aTHX
416 for (i = 0; environ[i]; i++)
417 safesysfree(environ[i]);
419 /* Must use safesysfree() when working with environ. */
420 safesysfree(environ);
422 environ = PL_origenviron;
427 /* the syntax tree is shared between clones
428 * so op_free(PL_main_root) only ReREFCNT_dec's
429 * REGEXPs in the parent interpreter
430 * we need to manually ReREFCNT_dec for the clones
433 I32 i = AvFILLp(PL_regex_padav) + 1;
434 SV **ary = AvARRAY(PL_regex_padav);
438 REGEXP *re = INT2PTR(REGEXP *,SvIVX(resv));
440 if (SvFLAGS(resv) & SVf_BREAK) {
441 /* this is PL_reg_curpm, already freed
442 * flag is set in regexec.c:S_regtry
444 SvFLAGS(resv) &= ~SVf_BREAK;
446 else if(SvREPADTMP(resv)) {
447 SvREPADTMP_off(resv);
454 SvREFCNT_dec(PL_regex_padav);
455 PL_regex_padav = Nullav;
459 /* loosen bonds of global variables */
462 (void)PerlIO_close(PL_rsfp);
466 /* Filters for program text */
467 SvREFCNT_dec(PL_rsfp_filters);
468 PL_rsfp_filters = Nullav;
471 PL_preprocess = FALSE;
477 PL_doswitches = FALSE;
478 PL_dowarn = G_WARN_OFF;
479 PL_doextract = FALSE;
480 PL_sawampersand = FALSE; /* must save all match strings */
483 Safefree(PL_inplace);
485 SvREFCNT_dec(PL_patchlevel);
488 SvREFCNT_dec(PL_e_script);
489 PL_e_script = Nullsv;
492 /* magical thingies */
494 SvREFCNT_dec(PL_ofs_sv); /* $, */
497 SvREFCNT_dec(PL_ors_sv); /* $\ */
500 SvREFCNT_dec(PL_rs); /* $/ */
503 PL_multiline = 0; /* $* */
504 Safefree(PL_osname); /* $^O */
507 SvREFCNT_dec(PL_statname);
508 PL_statname = Nullsv;
511 /* defgv, aka *_ should be taken care of elsewhere */
513 /* clean up after study() */
514 SvREFCNT_dec(PL_lastscream);
515 PL_lastscream = Nullsv;
516 Safefree(PL_screamfirst);
518 Safefree(PL_screamnext);
522 Safefree(PL_efloatbuf);
523 PL_efloatbuf = Nullch;
526 /* startup and shutdown function lists */
527 SvREFCNT_dec(PL_beginav);
528 SvREFCNT_dec(PL_beginav_save);
529 SvREFCNT_dec(PL_endav);
530 SvREFCNT_dec(PL_checkav);
531 SvREFCNT_dec(PL_checkav_save);
532 SvREFCNT_dec(PL_initav);
534 PL_beginav_save = Nullav;
537 PL_checkav_save = Nullav;
540 /* shortcuts just get cleared */
546 PL_argvoutgv = Nullgv;
548 PL_stderrgv = Nullgv;
549 PL_last_in_gv = Nullgv;
551 PL_debstash = Nullhv;
553 /* reset so print() ends up where we expect */
556 SvREFCNT_dec(PL_argvout_stack);
557 PL_argvout_stack = Nullav;
559 SvREFCNT_dec(PL_modglobal);
560 PL_modglobal = Nullhv;
561 SvREFCNT_dec(PL_preambleav);
562 PL_preambleav = Nullav;
563 SvREFCNT_dec(PL_subname);
565 SvREFCNT_dec(PL_linestr);
567 SvREFCNT_dec(PL_pidstatus);
568 PL_pidstatus = Nullhv;
569 SvREFCNT_dec(PL_toptarget);
570 PL_toptarget = Nullsv;
571 SvREFCNT_dec(PL_bodytarget);
572 PL_bodytarget = Nullsv;
573 PL_formtarget = Nullsv;
575 /* free locale stuff */
576 #ifdef USE_LOCALE_COLLATE
577 Safefree(PL_collation_name);
578 PL_collation_name = Nullch;
581 #ifdef USE_LOCALE_NUMERIC
582 Safefree(PL_numeric_name);
583 PL_numeric_name = Nullch;
584 SvREFCNT_dec(PL_numeric_radix_sv);
587 /* clear utf8 character classes */
588 SvREFCNT_dec(PL_utf8_alnum);
589 SvREFCNT_dec(PL_utf8_alnumc);
590 SvREFCNT_dec(PL_utf8_ascii);
591 SvREFCNT_dec(PL_utf8_alpha);
592 SvREFCNT_dec(PL_utf8_space);
593 SvREFCNT_dec(PL_utf8_cntrl);
594 SvREFCNT_dec(PL_utf8_graph);
595 SvREFCNT_dec(PL_utf8_digit);
596 SvREFCNT_dec(PL_utf8_upper);
597 SvREFCNT_dec(PL_utf8_lower);
598 SvREFCNT_dec(PL_utf8_print);
599 SvREFCNT_dec(PL_utf8_punct);
600 SvREFCNT_dec(PL_utf8_xdigit);
601 SvREFCNT_dec(PL_utf8_mark);
602 SvREFCNT_dec(PL_utf8_toupper);
603 SvREFCNT_dec(PL_utf8_totitle);
604 SvREFCNT_dec(PL_utf8_tolower);
605 SvREFCNT_dec(PL_utf8_tofold);
606 SvREFCNT_dec(PL_utf8_idstart);
607 SvREFCNT_dec(PL_utf8_idcont);
608 PL_utf8_alnum = Nullsv;
609 PL_utf8_alnumc = Nullsv;
610 PL_utf8_ascii = Nullsv;
611 PL_utf8_alpha = Nullsv;
612 PL_utf8_space = Nullsv;
613 PL_utf8_cntrl = Nullsv;
614 PL_utf8_graph = Nullsv;
615 PL_utf8_digit = Nullsv;
616 PL_utf8_upper = Nullsv;
617 PL_utf8_lower = Nullsv;
618 PL_utf8_print = Nullsv;
619 PL_utf8_punct = Nullsv;
620 PL_utf8_xdigit = Nullsv;
621 PL_utf8_mark = Nullsv;
622 PL_utf8_toupper = Nullsv;
623 PL_utf8_totitle = Nullsv;
624 PL_utf8_tolower = Nullsv;
625 PL_utf8_tofold = Nullsv;
626 PL_utf8_idstart = Nullsv;
627 PL_utf8_idcont = Nullsv;
629 if (!specialWARN(PL_compiling.cop_warnings))
630 SvREFCNT_dec(PL_compiling.cop_warnings);
631 PL_compiling.cop_warnings = Nullsv;
632 if (!specialCopIO(PL_compiling.cop_io))
633 SvREFCNT_dec(PL_compiling.cop_io);
634 PL_compiling.cop_io = Nullsv;
635 CopFILE_free(&PL_compiling);
636 CopSTASH_free(&PL_compiling);
638 /* Prepare to destruct main symbol table. */
643 SvREFCNT_dec(PL_curstname);
644 PL_curstname = Nullsv;
646 /* clear queued errors */
647 SvREFCNT_dec(PL_errors);
651 if (destruct_level >= 2 && ckWARN_d(WARN_INTERNAL)) {
652 if (PL_scopestack_ix != 0)
653 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
654 "Unbalanced scopes: %ld more ENTERs than LEAVEs\n",
655 (long)PL_scopestack_ix);
656 if (PL_savestack_ix != 0)
657 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
658 "Unbalanced saves: %ld more saves than restores\n",
659 (long)PL_savestack_ix);
660 if (PL_tmps_floor != -1)
661 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),"Unbalanced tmps: %ld more allocs than frees\n",
662 (long)PL_tmps_floor + 1);
663 if (cxstack_ix != -1)
664 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),"Unbalanced context: %ld more PUSHes than POPs\n",
665 (long)cxstack_ix + 1);
668 /* Now absolutely destruct everything, somehow or other, loops or no. */
669 SvFLAGS(PL_fdpid) |= SVTYPEMASK; /* don't clean out pid table now */
670 SvFLAGS(PL_strtab) |= SVTYPEMASK; /* don't clean out strtab now */
672 /* the 2 is for PL_fdpid and PL_strtab */
673 while (PL_sv_count > 2 && sv_clean_all())
676 SvFLAGS(PL_fdpid) &= ~SVTYPEMASK;
677 SvFLAGS(PL_fdpid) |= SVt_PVAV;
678 SvFLAGS(PL_strtab) &= ~SVTYPEMASK;
679 SvFLAGS(PL_strtab) |= SVt_PVHV;
681 AvREAL_off(PL_fdpid); /* no surviving entries */
682 SvREFCNT_dec(PL_fdpid); /* needed in io_close() */
685 #ifdef HAVE_INTERP_INTERN
689 /* Destruct the global string table. */
691 /* Yell and reset the HeVAL() slots that are still holding refcounts,
692 * so that sv_free() won't fail on them.
700 max = HvMAX(PL_strtab);
701 array = HvARRAY(PL_strtab);
704 if (hent && ckWARN_d(WARN_INTERNAL)) {
705 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
706 "Unbalanced string table refcount: (%d) for \"%s\"",
707 HeVAL(hent) - Nullsv, HeKEY(hent));
708 HeVAL(hent) = Nullsv;
718 SvREFCNT_dec(PL_strtab);
721 /* free the pointer table used for cloning */
722 ptr_table_free(PL_ptr_table);
725 /* free special SVs */
727 SvREFCNT(&PL_sv_yes) = 0;
728 sv_clear(&PL_sv_yes);
729 SvANY(&PL_sv_yes) = NULL;
730 SvFLAGS(&PL_sv_yes) = 0;
732 SvREFCNT(&PL_sv_no) = 0;
734 SvANY(&PL_sv_no) = NULL;
735 SvFLAGS(&PL_sv_no) = 0;
739 for (i=0; i<=2; i++) {
740 SvREFCNT(PERL_DEBUG_PAD(i)) = 0;
741 sv_clear(PERL_DEBUG_PAD(i));
742 SvANY(PERL_DEBUG_PAD(i)) = NULL;
743 SvFLAGS(PERL_DEBUG_PAD(i)) = 0;
747 if (PL_sv_count != 0 && ckWARN_d(WARN_INTERNAL))
748 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),"Scalars leaked: %ld\n", (long)PL_sv_count);
750 #ifdef DEBUG_LEAKING_SCALARS
751 if (PL_sv_count != 0) {
756 for (sva = PL_sv_arenaroot; sva; sva = (SV*)SvANY(sva)) {
757 svend = &sva[SvREFCNT(sva)];
758 for (sv = sva + 1; sv < svend; ++sv) {
759 if (SvTYPE(sv) != SVTYPEMASK) {
760 PerlIO_printf(Perl_debug_log, "leaked: 0x%p\n", sv);
768 #if defined(PERLIO_LAYERS)
769 /* No more IO - including error messages ! */
770 PerlIO_cleanup(aTHX);
773 /* sv_undef needs to stay immortal until after PerlIO_cleanup
774 as currently layers use it rather than Nullsv as a marker
775 for no arg - and will try and SvREFCNT_dec it.
777 SvREFCNT(&PL_sv_undef) = 0;
778 SvREADONLY_off(&PL_sv_undef);
780 Safefree(PL_origfilename);
781 Safefree(PL_reg_start_tmp);
783 Safefree(PL_reg_curpm);
784 Safefree(PL_reg_poscache);
785 Safefree(HeKEY_hek(&PL_hv_fetch_ent_mh));
786 Safefree(PL_op_mask);
787 Safefree(PL_psig_ptr);
788 Safefree(PL_psig_name);
789 Safefree(PL_bitcount);
790 Safefree(PL_psig_pend);
792 PL_hints = 0; /* Reset hints. Should hints be per-interpreter ? */
794 DEBUG_P(debprofdump());
796 #ifdef USE_REENTRANT_API
797 Perl_reentrant_free(aTHX);
802 /* As the absolutely last thing, free the non-arena SV for mess() */
805 /* it could have accumulated taint magic */
806 if (SvTYPE(PL_mess_sv) >= SVt_PVMG) {
809 for (mg = SvMAGIC(PL_mess_sv); mg; mg = moremagic) {
810 moremagic = mg->mg_moremagic;
811 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global
813 Safefree(mg->mg_ptr);
817 /* we know that type >= SVt_PV */
818 (void)SvOOK_off(PL_mess_sv);
819 Safefree(SvPVX(PL_mess_sv));
820 Safefree(SvANY(PL_mess_sv));
821 Safefree(PL_mess_sv);
824 return STATUS_NATIVE_EXPORT;
828 =for apidoc perl_free
830 Releases a Perl interpreter. See L<perlembed>.
838 #if defined(WIN32) || defined(NETWARE)
839 # if defined(PERL_IMPLICIT_SYS)
841 void *host = nw_internal_host;
843 void *host = w32_internal_host;
847 nw_delete_internal_host(host);
849 win32_delete_internal_host(host);
860 Perl_call_atexit(pTHX_ ATEXIT_t fn, void *ptr)
862 Renew(PL_exitlist, PL_exitlistlen+1, PerlExitListEntry);
863 PL_exitlist[PL_exitlistlen].fn = fn;
864 PL_exitlist[PL_exitlistlen].ptr = ptr;
869 =for apidoc perl_parse
871 Tells a Perl interpreter to parse a Perl script. See L<perlembed>.
877 perl_parse(pTHXx_ XSINIT_t xsinit, int argc, char **argv, char **env)
882 #ifdef USE_5005THREADS
886 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
889 Perl_croak(aTHX_ "suidperl is no longer needed since the kernel can now execute\n\
890 setuid perl scripts securely.\n");
899 /* Come here if running an undumped a.out. */
901 PL_origfilename = savepv(argv[0]);
902 PL_do_undump = FALSE;
903 cxstack_ix = -1; /* start label stack again */
905 init_postdump_symbols(argc,argv,env);
910 op_free(PL_main_root);
911 PL_main_root = Nullop;
913 PL_main_start = Nullop;
914 SvREFCNT_dec(PL_main_cv);
918 oldscope = PL_scopestack_ix;
919 PL_dowarn = G_WARN_OFF;
921 #ifdef PERL_FLEXIBLE_EXCEPTIONS
922 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vparse_body), env, xsinit);
928 #ifndef PERL_FLEXIBLE_EXCEPTIONS
929 parse_body(env,xsinit);
932 call_list(oldscope, PL_checkav);
939 /* my_exit() was called */
940 while (PL_scopestack_ix > oldscope)
943 PL_curstash = PL_defstash;
945 call_list(oldscope, PL_checkav);
946 ret = STATUS_NATIVE_EXPORT;
949 PerlIO_printf(Perl_error_log, "panic: top_env\n");
957 #ifdef PERL_FLEXIBLE_EXCEPTIONS
959 S_vparse_body(pTHX_ va_list args)
961 char **env = va_arg(args, char**);
962 XSINIT_t xsinit = va_arg(args, XSINIT_t);
964 return parse_body(env, xsinit);
969 S_parse_body(pTHX_ char **env, XSINIT_t xsinit)
971 int argc = PL_origargc;
972 char **argv = PL_origargv;
973 char *scriptname = NULL;
975 VOL bool dosearch = FALSE;
979 char *cddir = Nullch;
981 sv_setpvn(PL_linestr,"",0);
982 sv = newSVpvn("",0); /* first used for -I flags */
986 for (argc--,argv++; argc > 0; argc--,argv++) {
987 if (argv[0][0] != '-' || !argv[0][1])
991 validarg = " PHOOEY ";
1000 win32_argv2utf8(argc-1, argv+1);
1003 #ifndef PERL_STRICT_CR
1028 if ((s = moreswitches(s)))
1033 if( !PL_tainting ) {
1034 PL_taint_warn = TRUE;
1041 PL_taint_warn = FALSE;
1046 #ifdef MACOS_TRADITIONAL
1047 /* ignore -e for Dev:Pseudo argument */
1048 if (argv[1] && !strcmp(argv[1], "Dev:Pseudo"))
1051 if (PL_euid != PL_uid || PL_egid != PL_gid)
1052 Perl_croak(aTHX_ "No -e allowed in setuid scripts");
1054 PL_e_script = newSVpvn("",0);
1055 filter_add(read_e_script, NULL);
1058 sv_catpv(PL_e_script, s);
1060 sv_catpv(PL_e_script, argv[1]);
1064 Perl_croak(aTHX_ "No code specified for -e");
1065 sv_catpv(PL_e_script, "\n");
1068 case 'I': /* -I handled both here and in moreswitches() */
1070 if (!*++s && (s=argv[1]) != Nullch) {
1075 STRLEN len = strlen(s);
1076 p = savepvn(s, len);
1077 incpush(p, TRUE, TRUE, FALSE);
1078 sv_catpvn(sv, "-I", 2);
1079 sv_catpvn(sv, p, len);
1080 sv_catpvn(sv, " ", 1);
1084 Perl_croak(aTHX_ "No directory specified for -I");
1088 PL_preprocess = TRUE;
1098 PL_preambleav = newAV();
1099 av_push(PL_preambleav, newSVpv("use Config qw(myconfig config_vars)",0));
1101 PL_Sv = newSVpv("print myconfig();",0);
1103 sv_catpv(PL_Sv,"print \"\\nCharacteristics of this PERLSHR image: \\n\",");
1105 sv_catpv(PL_Sv,"print \"\\nCharacteristics of this binary (from libperl): \\n\",");
1107 sv_catpv(PL_Sv,"\" Compile-time options:");
1109 sv_catpv(PL_Sv," DEBUGGING");
1111 # ifdef MULTIPLICITY
1112 sv_catpv(PL_Sv," MULTIPLICITY");
1114 # ifdef USE_5005THREADS
1115 sv_catpv(PL_Sv," USE_5005THREADS");
1117 # ifdef USE_ITHREADS
1118 sv_catpv(PL_Sv," USE_ITHREADS");
1120 # ifdef USE_64_BIT_INT
1121 sv_catpv(PL_Sv," USE_64_BIT_INT");
1123 # ifdef USE_64_BIT_ALL
1124 sv_catpv(PL_Sv," USE_64_BIT_ALL");
1126 # ifdef USE_LONG_DOUBLE
1127 sv_catpv(PL_Sv," USE_LONG_DOUBLE");
1129 # ifdef USE_LARGE_FILES
1130 sv_catpv(PL_Sv," USE_LARGE_FILES");
1133 sv_catpv(PL_Sv," USE_SOCKS");
1135 # ifdef PERL_IMPLICIT_CONTEXT
1136 sv_catpv(PL_Sv," PERL_IMPLICIT_CONTEXT");
1138 # ifdef PERL_IMPLICIT_SYS
1139 sv_catpv(PL_Sv," PERL_IMPLICIT_SYS");
1141 sv_catpv(PL_Sv,"\\n\",");
1143 #if defined(LOCAL_PATCH_COUNT)
1144 if (LOCAL_PATCH_COUNT > 0) {
1146 sv_catpv(PL_Sv,"\" Locally applied patches:\\n\",");
1147 for (i = 1; i <= LOCAL_PATCH_COUNT; i++) {
1148 if (PL_localpatches[i])
1149 Perl_sv_catpvf(aTHX_ PL_Sv,"q\" \t%s\n\",",PL_localpatches[i]);
1153 Perl_sv_catpvf(aTHX_ PL_Sv,"\" Built under %s\\n\"",OSNAME);
1156 Perl_sv_catpvf(aTHX_ PL_Sv,",\" Compiled at %s %s\\n\"",__DATE__,__TIME__);
1158 Perl_sv_catpvf(aTHX_ PL_Sv,",\" Compiled on %s\\n\"",__DATE__);
1161 sv_catpv(PL_Sv, "; \
1163 @env = map { \"$_=\\\"$ENV{$_}\\\"\" } sort grep {/^PERL/} keys %ENV; ");
1166 push @env, \"CYGWIN=\\\"$ENV{CYGWIN}\\\"\";");
1169 print \" \\%ENV:\\n @env\\n\" if @env; \
1170 print \" \\@INC:\\n @INC\\n\";");
1173 PL_Sv = newSVpv("config_vars(qw(",0);
1174 sv_catpv(PL_Sv, ++s);
1175 sv_catpv(PL_Sv, "))");
1178 av_push(PL_preambleav, PL_Sv);
1179 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
1182 PL_doextract = TRUE;
1190 if (!*++s || isSPACE(*s)) {
1194 /* catch use of gnu style long options */
1195 if (strEQ(s, "version")) {
1199 if (strEQ(s, "help")) {
1206 Perl_croak(aTHX_ "Unrecognized switch: -%s (-h will show valid options)",s);
1210 sv_setsv(get_sv("/", TRUE), PL_rs);
1213 #ifndef SECURE_INTERNAL_GETENV
1216 (s = PerlEnv_getenv("PERL5OPT")))
1221 if (*s == '-' && *(s+1) == 'T') {
1223 PL_taint_warn = FALSE;
1226 char *popt_copy = Nullch;
1239 if (!strchr("DIMUdmtwA", *s))
1240 Perl_croak(aTHX_ "Illegal switch in PERL5OPT: -%c", *s);
1244 popt_copy = SvPVX(sv_2mortal(newSVpv(popt,0)));
1245 s = popt_copy + (s - popt);
1246 d = popt_copy + (d - popt);
1253 if( !PL_tainting ) {
1254 PL_taint_warn = TRUE;
1264 if (PL_taint_warn && PL_dowarn != G_WARN_ALL_OFF) {
1265 PL_compiling.cop_warnings = newSVpvn(WARN_TAINTstring, WARNsize);
1269 scriptname = argv[0];
1272 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
1274 else if (scriptname == Nullch) {
1276 if ( PerlLIO_isatty(PerlIO_fileno(PerlIO_stdin())) )
1284 open_script(scriptname,dosearch,sv,&fdscript);
1286 validate_suid(validarg, scriptname,fdscript);
1289 #if defined(SIGCHLD) || defined(SIGCLD)
1292 # define SIGCHLD SIGCLD
1294 Sighandler_t sigstate = rsignal_state(SIGCHLD);
1295 if (sigstate == SIG_IGN) {
1296 if (ckWARN(WARN_SIGNAL))
1297 Perl_warner(aTHX_ packWARN(WARN_SIGNAL),
1298 "Can't ignore signal CHLD, forcing to default");
1299 (void)rsignal(SIGCHLD, (Sighandler_t)SIG_DFL);
1305 #ifdef MACOS_TRADITIONAL
1306 if (PL_doextract || gMacPerl_AlwaysExtract) {
1311 if (cddir && PerlDir_chdir(cddir) < 0)
1312 Perl_croak(aTHX_ "Can't chdir to %s",cddir);
1316 PL_main_cv = PL_compcv = (CV*)NEWSV(1104,0);
1317 sv_upgrade((SV *)PL_compcv, SVt_PVCV);
1318 CvUNIQUE_on(PL_compcv);
1320 CvPADLIST(PL_compcv) = pad_new(0);
1321 #ifdef USE_5005THREADS
1322 CvOWNER(PL_compcv) = 0;
1323 New(666, CvMUTEXP(PL_compcv), 1, perl_mutex);
1324 MUTEX_INIT(CvMUTEXP(PL_compcv));
1325 #endif /* USE_5005THREADS */
1328 boot_core_UNIVERSAL();
1330 boot_core_xsutils();
1334 (*xsinit)(aTHX); /* in case linked C routines want magical variables */
1336 #if defined(VMS) || defined(WIN32) || defined(DJGPP) || defined(__CYGWIN__) || defined(EPOC)
1342 # ifdef HAS_SOCKS5_INIT
1343 socks5_init(argv[0]);
1349 init_predump_symbols();
1350 /* init_postdump_symbols not currently designed to be called */
1351 /* more than once (ENV isn't cleared first, for example) */
1352 /* But running with -u leaves %ENV & @ARGV undefined! XXX */
1354 init_postdump_symbols(argc,argv,env);
1356 /* PL_unicode is turned on by -C or by $ENV{PERL_UNICODE}.
1357 * PL_utf8locale is conditionally turned on by
1358 * locale.c:Perl_init_i18nl10n() if the environment
1359 * look like the user wants to use UTF-8. */
1360 if (PL_unicode) { /* Requires init_predump_symbols(). */
1365 if (!(PL_unicode & PERL_UNICODE_LOCALE_FLAG) || PL_utf8locale) {
1366 /* Turn on UTF-8-ness on STDIN, STDOUT, STDERR
1367 * and the default open discipline. */
1368 if ((PL_unicode & PERL_UNICODE_STDIN_FLAG) &&
1369 PL_stdingv && (io = GvIO(PL_stdingv)) &&
1371 PerlIO_binmode(aTHX_ fp, IoTYPE(io), 0, ":utf8");
1372 if ((PL_unicode & PERL_UNICODE_STDOUT_FLAG) &&
1373 PL_defoutgv && (io = GvIO(PL_defoutgv)) &&
1375 PerlIO_binmode(aTHX_ fp, IoTYPE(io), 0, ":utf8");
1376 if ((PL_unicode & PERL_UNICODE_STDERR_FLAG) &&
1377 PL_stderrgv && (io = GvIO(PL_stderrgv)) &&
1379 PerlIO_binmode(aTHX_ fp, IoTYPE(io), 0, ":utf8");
1380 if ((PL_unicode & PERL_UNICODE_INOUT_FLAG) &&
1381 (sv = GvSV(gv_fetchpv("\017PEN", TRUE, SVt_PV)))) {
1382 U32 in = PL_unicode & PERL_UNICODE_IN_FLAG;
1383 U32 out = PL_unicode & PERL_UNICODE_OUT_FLAG;
1386 sv_setpvn(sv, ":utf8\0:utf8", 11);
1388 sv_setpvn(sv, ":utf8\0", 6);
1391 sv_setpvn(sv, "\0:utf8", 6);
1397 if ((s = PerlEnv_getenv("PERL_SIGNALS"))) {
1398 if (strEQ(s, "unsafe"))
1399 PL_signals |= PERL_SIGNALS_UNSAFE_FLAG;
1400 else if (strEQ(s, "safe"))
1401 PL_signals &= ~PERL_SIGNALS_UNSAFE_FLAG;
1403 Perl_croak(aTHX_ "PERL_SIGNALS illegal: \"%s\"", s);
1408 /* now parse the script */
1410 SETERRNO(0,SS_NORMAL);
1412 #ifdef MACOS_TRADITIONAL
1413 if (gMacPerl_SyntaxError = (yyparse() || PL_error_count)) {
1415 Perl_croak(aTHX_ "%s had compilation errors.\n", MacPerl_MPWFileName(PL_origfilename));
1417 Perl_croak(aTHX_ "Execution of %s aborted due to compilation errors.\n",
1418 MacPerl_MPWFileName(PL_origfilename));
1422 if (yyparse() || PL_error_count) {
1424 Perl_croak(aTHX_ "%s had compilation errors.\n", PL_origfilename);
1426 Perl_croak(aTHX_ "Execution of %s aborted due to compilation errors.\n",
1431 CopLINE_set(PL_curcop, 0);
1432 PL_curstash = PL_defstash;
1433 PL_preprocess = FALSE;
1435 SvREFCNT_dec(PL_e_script);
1436 PL_e_script = Nullsv;
1443 SAVECOPFILE(PL_curcop);
1444 SAVECOPLINE(PL_curcop);
1445 gv_check(PL_defstash);
1452 if ((s=PerlEnv_getenv("PERL_DEBUG_MSTATS")) && atoi(s) >= 2)
1453 dump_mstats("after compilation:");
1462 =for apidoc perl_run
1464 Tells a Perl interpreter to run. See L<perlembed>.
1475 #ifdef USE_5005THREADS
1479 oldscope = PL_scopestack_ix;
1484 #ifdef PERL_FLEXIBLE_EXCEPTIONS
1486 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vrun_body), oldscope);
1492 cxstack_ix = -1; /* start context stack again */
1494 case 0: /* normal completion */
1495 #ifndef PERL_FLEXIBLE_EXCEPTIONS
1500 case 2: /* my_exit() */
1501 while (PL_scopestack_ix > oldscope)
1504 PL_curstash = PL_defstash;
1505 if (!(PL_exit_flags & PERL_EXIT_DESTRUCT_END) &&
1506 PL_endav && !PL_minus_c)
1507 call_list(oldscope, PL_endav);
1509 if (PerlEnv_getenv("PERL_DEBUG_MSTATS"))
1510 dump_mstats("after execution: ");
1512 ret = STATUS_NATIVE_EXPORT;
1516 POPSTACK_TO(PL_mainstack);
1519 PerlIO_printf(Perl_error_log, "panic: restartop\n");
1529 #ifdef PERL_FLEXIBLE_EXCEPTIONS
1531 S_vrun_body(pTHX_ va_list args)
1533 I32 oldscope = va_arg(args, I32);
1535 return run_body(oldscope);
1541 S_run_body(pTHX_ I32 oldscope)
1543 DEBUG_r(PerlIO_printf(Perl_debug_log, "%s $` $& $' support.\n",
1544 PL_sawampersand ? "Enabling" : "Omitting"));
1546 if (!PL_restartop) {
1547 DEBUG_x(dump_all());
1548 DEBUG(PerlIO_printf(Perl_debug_log, "\nEXECUTING...\n\n"));
1549 DEBUG_S(PerlIO_printf(Perl_debug_log, "main thread is 0x%"UVxf"\n",
1553 #ifdef MACOS_TRADITIONAL
1554 PerlIO_printf(Perl_error_log, "%s%s syntax OK\n",
1555 (gMacPerl_ErrorFormat ? "# " : ""),
1556 MacPerl_MPWFileName(PL_origfilename));
1558 PerlIO_printf(Perl_error_log, "%s syntax OK\n", PL_origfilename);
1562 if (PERLDB_SINGLE && PL_DBsingle)
1563 sv_setiv(PL_DBsingle, 1);
1565 call_list(oldscope, PL_initav);
1571 PL_op = PL_restartop;
1575 else if (PL_main_start) {
1576 CvDEPTH(PL_main_cv) = 1;
1577 PL_op = PL_main_start;
1587 =head1 SV Manipulation Functions
1589 =for apidoc p||get_sv
1591 Returns the SV of the specified Perl scalar. If C<create> is set and the
1592 Perl variable does not exist then it will be created. If C<create> is not
1593 set and the variable does not exist then NULL is returned.
1599 Perl_get_sv(pTHX_ const char *name, I32 create)
1602 #ifdef USE_5005THREADS
1603 if (name[1] == '\0' && !isALPHA(name[0])) {
1604 PADOFFSET tmp = find_threadsv(name);
1605 if (tmp != NOT_IN_PAD)
1606 return THREADSV(tmp);
1608 #endif /* USE_5005THREADS */
1609 gv = gv_fetchpv(name, create, SVt_PV);
1616 =head1 Array Manipulation Functions
1618 =for apidoc p||get_av
1620 Returns the AV of the specified Perl array. If C<create> is set and the
1621 Perl variable does not exist then it will be created. If C<create> is not
1622 set and the variable does not exist then NULL is returned.
1628 Perl_get_av(pTHX_ const char *name, I32 create)
1630 GV* gv = gv_fetchpv(name, create, SVt_PVAV);
1639 =head1 Hash Manipulation Functions
1641 =for apidoc p||get_hv
1643 Returns the HV of the specified Perl hash. If C<create> is set and the
1644 Perl variable does not exist then it will be created. If C<create> is not
1645 set and the variable does not exist then NULL is returned.
1651 Perl_get_hv(pTHX_ const char *name, I32 create)
1653 GV* gv = gv_fetchpv(name, create, SVt_PVHV);
1662 =head1 CV Manipulation Functions
1664 =for apidoc p||get_cv
1666 Returns the CV of the specified Perl subroutine. If C<create> is set and
1667 the Perl subroutine does not exist then it will be declared (which has the
1668 same effect as saying C<sub name;>). If C<create> is not set and the
1669 subroutine does not exist then NULL is returned.
1675 Perl_get_cv(pTHX_ const char *name, I32 create)
1677 GV* gv = gv_fetchpv(name, create, SVt_PVCV);
1678 /* XXX unsafe for threads if eval_owner isn't held */
1679 /* XXX this is probably not what they think they're getting.
1680 * It has the same effect as "sub name;", i.e. just a forward
1682 if (create && !GvCVu(gv))
1683 return newSUB(start_subparse(FALSE, 0),
1684 newSVOP(OP_CONST, 0, newSVpv(name,0)),
1692 /* Be sure to refetch the stack pointer after calling these routines. */
1696 =head1 Callback Functions
1698 =for apidoc p||call_argv
1700 Performs a callback to the specified Perl sub. See L<perlcall>.
1706 Perl_call_argv(pTHX_ const char *sub_name, I32 flags, register char **argv)
1708 /* See G_* flags in cop.h */
1709 /* null terminated arg list */
1716 XPUSHs(sv_2mortal(newSVpv(*argv,0)));
1721 return call_pv(sub_name, flags);
1725 =for apidoc p||call_pv
1727 Performs a callback to the specified Perl sub. See L<perlcall>.
1733 Perl_call_pv(pTHX_ const char *sub_name, I32 flags)
1734 /* name of the subroutine */
1735 /* See G_* flags in cop.h */
1737 return call_sv((SV*)get_cv(sub_name, TRUE), flags);
1741 =for apidoc p||call_method
1743 Performs a callback to the specified Perl method. The blessed object must
1744 be on the stack. See L<perlcall>.
1750 Perl_call_method(pTHX_ const char *methname, I32 flags)
1751 /* name of the subroutine */
1752 /* See G_* flags in cop.h */
1754 return call_sv(sv_2mortal(newSVpv(methname,0)), flags | G_METHOD);
1757 /* May be called with any of a CV, a GV, or an SV containing the name. */
1759 =for apidoc p||call_sv
1761 Performs a callback to the Perl sub whose name is in the SV. See
1768 Perl_call_sv(pTHX_ SV *sv, I32 flags)
1769 /* See G_* flags in cop.h */
1772 LOGOP myop; /* fake syntax tree node */
1775 volatile I32 retval = 0;
1777 bool oldcatch = CATCH_GET;
1782 if (flags & G_DISCARD) {
1787 Zero(&myop, 1, LOGOP);
1788 myop.op_next = Nullop;
1789 if (!(flags & G_NOARGS))
1790 myop.op_flags |= OPf_STACKED;
1791 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1792 (flags & G_ARRAY) ? OPf_WANT_LIST :
1797 EXTEND(PL_stack_sp, 1);
1798 *++PL_stack_sp = sv;
1800 oldscope = PL_scopestack_ix;
1802 if (PERLDB_SUB && PL_curstash != PL_debstash
1803 /* Handle first BEGIN of -d. */
1804 && (PL_DBcv || (PL_DBcv = GvCV(PL_DBsub)))
1805 /* Try harder, since this may have been a sighandler, thus
1806 * curstash may be meaningless. */
1807 && (SvTYPE(sv) != SVt_PVCV || CvSTASH((CV*)sv) != PL_debstash)
1808 && !(flags & G_NODEBUG))
1809 PL_op->op_private |= OPpENTERSUB_DB;
1811 if (flags & G_METHOD) {
1812 Zero(&method_op, 1, UNOP);
1813 method_op.op_next = PL_op;
1814 method_op.op_ppaddr = PL_ppaddr[OP_METHOD];
1815 myop.op_ppaddr = PL_ppaddr[OP_ENTERSUB];
1816 PL_op = (OP*)&method_op;
1819 if (!(flags & G_EVAL)) {
1821 call_body((OP*)&myop, FALSE);
1822 retval = PL_stack_sp - (PL_stack_base + oldmark);
1823 CATCH_SET(oldcatch);
1826 myop.op_other = (OP*)&myop;
1828 /* we're trying to emulate pp_entertry() here */
1830 register PERL_CONTEXT *cx;
1831 I32 gimme = GIMME_V;
1836 push_return(Nullop);
1837 PUSHBLOCK(cx, (CXt_EVAL|CXp_TRYBLOCK), PL_stack_sp);
1839 PL_eval_root = PL_op; /* Only needed so that goto works right. */
1841 PL_in_eval = EVAL_INEVAL;
1842 if (flags & G_KEEPERR)
1843 PL_in_eval |= EVAL_KEEPERR;
1849 #ifdef PERL_FLEXIBLE_EXCEPTIONS
1851 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vcall_body),
1858 #ifndef PERL_FLEXIBLE_EXCEPTIONS
1860 call_body((OP*)&myop, FALSE);
1862 retval = PL_stack_sp - (PL_stack_base + oldmark);
1863 if (!(flags & G_KEEPERR))
1870 /* my_exit() was called */
1871 PL_curstash = PL_defstash;
1874 if (PL_statusvalue && !(PL_exit_flags & PERL_EXIT_EXPECTED))
1875 Perl_croak(aTHX_ "Callback called exit");
1880 PL_op = PL_restartop;
1884 PL_stack_sp = PL_stack_base + oldmark;
1885 if (flags & G_ARRAY)
1889 *++PL_stack_sp = &PL_sv_undef;
1894 if (PL_scopestack_ix > oldscope) {
1898 register PERL_CONTEXT *cx;
1910 if (flags & G_DISCARD) {
1911 PL_stack_sp = PL_stack_base + oldmark;
1920 #ifdef PERL_FLEXIBLE_EXCEPTIONS
1922 S_vcall_body(pTHX_ va_list args)
1924 OP *myop = va_arg(args, OP*);
1925 int is_eval = va_arg(args, int);
1927 call_body(myop, is_eval);
1933 S_call_body(pTHX_ OP *myop, int is_eval)
1935 if (PL_op == myop) {
1937 PL_op = Perl_pp_entereval(aTHX); /* this doesn't do a POPMARK */
1939 PL_op = Perl_pp_entersub(aTHX); /* this does */
1945 /* Eval a string. The G_EVAL flag is always assumed. */
1948 =for apidoc p||eval_sv
1950 Tells Perl to C<eval> the string in the SV.
1956 Perl_eval_sv(pTHX_ SV *sv, I32 flags)
1958 /* See G_* flags in cop.h */
1961 UNOP myop; /* fake syntax tree node */
1962 volatile I32 oldmark = SP - PL_stack_base;
1963 volatile I32 retval = 0;
1969 if (flags & G_DISCARD) {
1976 Zero(PL_op, 1, UNOP);
1977 EXTEND(PL_stack_sp, 1);
1978 *++PL_stack_sp = sv;
1979 oldscope = PL_scopestack_ix;
1981 if (!(flags & G_NOARGS))
1982 myop.op_flags = OPf_STACKED;
1983 myop.op_next = Nullop;
1984 myop.op_type = OP_ENTEREVAL;
1985 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1986 (flags & G_ARRAY) ? OPf_WANT_LIST :
1988 if (flags & G_KEEPERR)
1989 myop.op_flags |= OPf_SPECIAL;
1991 #ifdef PERL_FLEXIBLE_EXCEPTIONS
1993 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vcall_body),
2000 #ifndef PERL_FLEXIBLE_EXCEPTIONS
2002 call_body((OP*)&myop,TRUE);
2004 retval = PL_stack_sp - (PL_stack_base + oldmark);
2005 if (!(flags & G_KEEPERR))
2012 /* my_exit() was called */
2013 PL_curstash = PL_defstash;
2016 if (PL_statusvalue && !(PL_exit_flags & PERL_EXIT_EXPECTED))
2017 Perl_croak(aTHX_ "Callback called exit");
2022 PL_op = PL_restartop;
2026 PL_stack_sp = PL_stack_base + oldmark;
2027 if (flags & G_ARRAY)
2031 *++PL_stack_sp = &PL_sv_undef;
2037 if (flags & G_DISCARD) {
2038 PL_stack_sp = PL_stack_base + oldmark;
2048 =for apidoc p||eval_pv
2050 Tells Perl to C<eval> the given string and return an SV* result.
2056 Perl_eval_pv(pTHX_ const char *p, I32 croak_on_error)
2059 SV* sv = newSVpv(p, 0);
2061 eval_sv(sv, G_SCALAR);
2068 if (croak_on_error && SvTRUE(ERRSV)) {
2070 Perl_croak(aTHX_ SvPVx(ERRSV, n_a));
2076 /* Require a module. */
2079 =head1 Embedding Functions
2081 =for apidoc p||require_pv
2083 Tells Perl to C<require> the file named by the string argument. It is
2084 analogous to the Perl code C<eval "require '$file'">. It's even
2085 implemented that way; consider using Perl_load_module instead.
2090 Perl_require_pv(pTHX_ const char *pv)
2094 PUSHSTACKi(PERLSI_REQUIRE);
2096 sv = sv_newmortal();
2097 sv_setpv(sv, "require '");
2100 eval_sv(sv, G_DISCARD);
2106 Perl_magicname(pTHX_ char *sym, char *name, I32 namlen)
2110 if ((gv = gv_fetchpv(sym,TRUE, SVt_PV)))
2111 sv_magic(GvSV(gv), (SV*)gv, PERL_MAGIC_sv, name, namlen);
2115 S_usage(pTHX_ char *name) /* XXX move this out into a module ? */
2117 /* This message really ought to be max 23 lines.
2118 * Removed -h because the user already knows that option. Others? */
2120 static char *usage_msg[] = {
2121 "-0[octal] specify record separator (\\0, if no argument)",
2122 "-a autosplit mode with -n or -p (splits $_ into @F)",
2123 "-C enable native wide character system interfaces",
2124 "-c check syntax only (runs BEGIN and CHECK blocks)",
2125 "-d[:debugger] run program under debugger",
2126 "-D[number/list] set debugging flags (argument is a bit mask or alphabets)",
2127 "-e 'command' one line of program (several -e's allowed, omit programfile)",
2128 "-F/pattern/ split() pattern for -a switch (//'s are optional)",
2129 "-i[extension] edit <> files in place (makes backup if extension supplied)",
2130 "-Idirectory specify @INC/#include directory (several -I's allowed)",
2131 "-l[octal] enable line ending processing, specifies line terminator",
2132 "-[mM][-]module execute `use/no module...' before executing program",
2133 "-n assume 'while (<>) { ... }' loop around program",
2134 "-p assume loop like -n but print line also, like sed",
2135 "-P run program through C preprocessor before compilation",
2136 "-s enable rudimentary parsing for switches after programfile",
2137 "-S look for programfile using PATH environment variable",
2138 "-T enable tainting checks",
2139 "-t enable tainting warnings",
2140 "-u dump core after parsing program",
2141 "-U allow unsafe operations",
2142 "-v print version, subversion (includes VERY IMPORTANT perl info)",
2143 "-V[:variable] print configuration summary (or a single Config.pm variable)",
2144 "-w enable many useful warnings (RECOMMENDED)",
2145 "-W enable all warnings",
2146 "-X disable all warnings",
2147 "-x[directory] strip off text before #!perl line and perhaps cd to directory",
2151 char **p = usage_msg;
2153 PerlIO_printf(PerlIO_stdout(),
2154 "\nUsage: %s [switches] [--] [programfile] [arguments]",
2157 PerlIO_printf(PerlIO_stdout(), "\n %s", *p++);
2160 /* This routine handles any switches that can be given during run */
2163 Perl_moreswitches(pTHX_ char *s)
2173 rschar = (U32)grok_oct(s, &numlen, &flags, NULL);
2174 SvREFCNT_dec(PL_rs);
2175 if (rschar & ~((U8)~0))
2176 PL_rs = &PL_sv_undef;
2177 else if (!rschar && numlen >= 2)
2178 PL_rs = newSVpvn("", 0);
2180 char ch = (char)rschar;
2181 PL_rs = newSVpvn(&ch, 1);
2187 PL_unicode = parse_unicode_opts(&s);
2192 while (*s && !isSPACE(*s)) ++s;
2194 PL_splitstr = savepv(PL_splitstr);
2207 /* The following permits -d:Mod to accepts arguments following an =
2208 in the fashion that -MSome::Mod does. */
2209 if (*s == ':' || *s == '=') {
2212 sv = newSVpv("use Devel::", 0);
2214 /* We now allow -d:Module=Foo,Bar */
2215 while(isALNUM(*s) || *s==':') ++s;
2217 sv_catpv(sv, start);
2219 sv_catpvn(sv, start, s-start);
2220 sv_catpv(sv, " split(/,/,q{");
2225 my_setenv("PERL5DB", SvPV(sv, PL_na));
2228 PL_perldb = PERLDB_ALL;
2236 if (isALPHA(s[1])) {
2237 /* if adding extra options, remember to update DEBUG_MASK */
2238 static char debopts[] = "psltocPmfrxu HXDSTRJvC";
2241 for (s++; *s && (d = strchr(debopts,*s)); s++)
2242 PL_debug |= 1 << (d - debopts);
2245 PL_debug = atoi(s+1);
2246 for (s++; isDIGIT(*s); s++) ;
2249 if (DEBUG_p_TEST_ && ckWARN_d(WARN_DEBUGGING))
2250 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
2251 "-Dp not implemented on this platform\n");
2253 PL_debug |= DEBUG_TOP_FLAG;
2254 #else /* !DEBUGGING */
2255 if (ckWARN_d(WARN_DEBUGGING))
2256 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
2257 "Recompile perl with -DDEBUGGING to use -D switch\n");
2258 for (s++; isALNUM(*s); s++) ;
2264 usage(PL_origargv[0]);
2268 Safefree(PL_inplace);
2269 #if defined(__CYGWIN__) /* do backup extension automagically */
2270 if (*(s+1) == '\0') {
2271 PL_inplace = savepv(".bak");
2274 #endif /* __CYGWIN__ */
2275 PL_inplace = savepv(s+1);
2277 for (s = PL_inplace; *s && !isSPACE(*s); s++) ;
2280 if (*s == '-') /* Additional switches on #! line. */
2284 case 'I': /* -I handled both here and in parse_body() */
2287 while (*s && isSPACE(*s))
2292 /* ignore trailing spaces (possibly followed by other switches) */
2294 for (e = p; *e && !isSPACE(*e); e++) ;
2298 } while (*p && *p != '-');
2299 e = savepvn(s, e-s);
2300 incpush(e, TRUE, TRUE, FALSE);
2307 Perl_croak(aTHX_ "No directory specified for -I");
2313 SvREFCNT_dec(PL_ors_sv);
2318 PL_ors_sv = newSVpvn("\n",1);
2319 numlen = 3 + (*s == '0');
2320 *SvPVX(PL_ors_sv) = (char)grok_oct(s, &numlen, &flags, NULL);
2324 if (RsPARA(PL_rs)) {
2325 PL_ors_sv = newSVpvn("\n\n",2);
2328 PL_ors_sv = newSVsv(PL_rs);
2335 SV *sv=newSVpv("use assertions::activate split(/,/,q{",0);
2340 PL_preambleav = newAV();
2341 av_push(PL_preambleav, sv);
2344 Perl_croak(aTHX_ "No space allowed after -A");
2347 forbid_setid("-M"); /* XXX ? */
2350 forbid_setid("-m"); /* XXX ? */
2355 /* -M-foo == 'no foo' */
2356 if (*s == '-') { use = "no "; ++s; }
2357 sv = newSVpv(use,0);
2359 /* We allow -M'Module qw(Foo Bar)' */
2360 while(isALNUM(*s) || *s==':') ++s;
2362 sv_catpv(sv, start);
2363 if (*(start-1) == 'm') {
2365 Perl_croak(aTHX_ "Can't use '%c' after -mname", *s);
2366 sv_catpv( sv, " ()");
2370 Perl_croak(aTHX_ "Module name required with -%c option",
2372 sv_catpvn(sv, start, s-start);
2373 sv_catpv(sv, " split(/,/,q{");
2379 PL_preambleav = newAV();
2380 av_push(PL_preambleav, sv);
2383 Perl_croak(aTHX_ "No space allowed after -%c", *(s-1));
2395 PL_doswitches = TRUE;
2400 Perl_croak(aTHX_ "Too late for \"-t\" option");
2405 Perl_croak(aTHX_ "Too late for \"-T\" option");
2409 #ifdef MACOS_TRADITIONAL
2410 Perl_croak(aTHX_ "Believe me, you don't want to use \"-u\" on a Macintosh");
2412 PL_do_undump = TRUE;
2421 PerlIO_printf(PerlIO_stdout(),
2422 Perl_form(aTHX_ "\nThis is perl, v%"VDf" built for %s",
2423 PL_patchlevel, ARCHNAME));
2425 /* Adjust verbose output as in the perl that ships with the DG/UX OS from EMC */
2426 PerlIO_printf(PerlIO_stdout(),
2427 Perl_form(aTHX_ "\nThis is perl, version %vd\n", PL_patchlevel));
2428 PerlIO_printf(PerlIO_stdout(),
2429 Perl_form(aTHX_ " built under %s at %s %s\n",
2430 OSNAME, __DATE__, __TIME__));
2431 PerlIO_printf(PerlIO_stdout(),
2432 Perl_form(aTHX_ " OS Specific Release: %s\n",
2436 #if defined(LOCAL_PATCH_COUNT)
2437 if (LOCAL_PATCH_COUNT > 0)
2438 PerlIO_printf(PerlIO_stdout(),
2439 "\n(with %d registered patch%s, "
2440 "see perl -V for more detail)",
2441 (int)LOCAL_PATCH_COUNT,
2442 (LOCAL_PATCH_COUNT!=1) ? "es" : "");
2445 PerlIO_printf(PerlIO_stdout(),
2446 "\n\nCopyright 1987-2002, Larry Wall\n");
2447 #ifdef MACOS_TRADITIONAL
2448 PerlIO_printf(PerlIO_stdout(),
2449 "\nMac OS port Copyright 1991-2002, Matthias Neeracher;\n"
2450 "maintained by Chris Nandor\n");
2453 PerlIO_printf(PerlIO_stdout(),
2454 "\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
2457 PerlIO_printf(PerlIO_stdout(),
2458 "djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n"
2459 "djgpp v2 port (perl5004+) by Laszlo Molnar, 1997-1999\n");
2462 PerlIO_printf(PerlIO_stdout(),
2463 "\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
2464 "Version 5 port Copyright (c) 1994-2002, Andreas Kaiser, Ilya Zakharevich\n");
2467 PerlIO_printf(PerlIO_stdout(),
2468 "atariST series port, ++jrb bammi@cadence.com\n");
2471 PerlIO_printf(PerlIO_stdout(),
2472 "BeOS port Copyright Tom Spindler, 1997-1999\n");
2475 PerlIO_printf(PerlIO_stdout(),
2476 "MPE/iX port Copyright by Mark Klein and Mark Bixby, 1996-2002\n");
2479 PerlIO_printf(PerlIO_stdout(),
2480 "MVS (OS390) port by Mortice Kern Systems, 1997-1999\n");
2483 PerlIO_printf(PerlIO_stdout(),
2484 "Stratus VOS port by Paul.Green@stratus.com, 1997-2002\n");
2487 PerlIO_printf(PerlIO_stdout(),
2488 "VM/ESA port by Neale Ferguson, 1998-1999\n");
2491 PerlIO_printf(PerlIO_stdout(),
2492 "BS2000 (POSIX) port by Start Amadeus GmbH, 1998-1999\n");
2495 PerlIO_printf(PerlIO_stdout(),
2496 "MiNT port by Guido Flohr, 1997-1999\n");
2499 PerlIO_printf(PerlIO_stdout(),
2500 "EPOC port by Olaf Flebbe, 1999-2002\n");
2503 printf("WINCE port by Rainer Keuchel, 2001-2002\n");
2504 printf("Built on " __DATE__ " " __TIME__ "\n\n");
2507 #ifdef BINARY_BUILD_NOTICE
2508 BINARY_BUILD_NOTICE;
2510 PerlIO_printf(PerlIO_stdout(),
2512 Perl may be copied only under the terms of either the Artistic License or the\n\
2513 GNU General Public License, which may be found in the Perl 5 source kit.\n\n\
2514 Complete documentation for Perl, including FAQ lists, should be found on\n\
2515 this system using `man perl' or `perldoc perl'. If you have access to the\n\
2516 Internet, point your browser at http://www.perl.com/, the Perl Home Page.\n\n");
2519 if (! (PL_dowarn & G_WARN_ALL_MASK))
2520 PL_dowarn |= G_WARN_ON;
2524 PL_dowarn = G_WARN_ALL_ON|G_WARN_ON;
2525 if (!specialWARN(PL_compiling.cop_warnings))
2526 SvREFCNT_dec(PL_compiling.cop_warnings);
2527 PL_compiling.cop_warnings = pWARN_ALL ;
2531 PL_dowarn = G_WARN_ALL_OFF;
2532 if (!specialWARN(PL_compiling.cop_warnings))
2533 SvREFCNT_dec(PL_compiling.cop_warnings);
2534 PL_compiling.cop_warnings = pWARN_NONE ;
2539 if (s[1] == '-') /* Additional switches on #! line. */
2544 #if defined(WIN32) || !defined(PERL_STRICT_CR)
2550 #ifdef ALTERNATE_SHEBANG
2551 case 'S': /* OS/2 needs -S on "extproc" line. */
2559 Perl_croak(aTHX_ "Can't emulate -%.1s on #! line",s);
2564 /* compliments of Tom Christiansen */
2566 /* unexec() can be found in the Gnu emacs distribution */
2567 /* Known to work with -DUNEXEC and using unexelf.c from GNU emacs-20.2 */
2570 Perl_my_unexec(pTHX)
2578 prog = newSVpv(BIN_EXP, 0);
2579 sv_catpv(prog, "/perl");
2580 file = newSVpv(PL_origfilename, 0);
2581 sv_catpv(file, ".perldump");
2583 unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
2584 /* unexec prints msg to stderr in case of failure */
2585 PerlProc_exit(status);
2588 # include <lib$routines.h>
2589 lib$signal(SS$_DEBUG); /* ssdef.h #included from vmsish.h */
2591 ABORT(); /* for use with undump */
2596 /* initialize curinterp */
2602 # define PERLVAR(var,type)
2603 # define PERLVARA(var,n,type)
2604 # if defined(PERL_IMPLICIT_CONTEXT)
2605 # if defined(USE_5005THREADS)
2606 # define PERLVARI(var,type,init) PERL_GET_INTERP->var = init;
2607 # define PERLVARIC(var,type,init) PERL_GET_INTERP->var = init;
2608 # else /* !USE_5005THREADS */
2609 # define PERLVARI(var,type,init) aTHX->var = init;
2610 # define PERLVARIC(var,type,init) aTHX->var = init;
2611 # endif /* USE_5005THREADS */
2613 # define PERLVARI(var,type,init) PERL_GET_INTERP->var = init;
2614 # define PERLVARIC(var,type,init) PERL_GET_INTERP->var = init;
2616 # include "intrpvar.h"
2617 # ifndef USE_5005THREADS
2618 # include "thrdvar.h"
2625 # define PERLVAR(var,type)
2626 # define PERLVARA(var,n,type)
2627 # define PERLVARI(var,type,init) PL_##var = init;
2628 # define PERLVARIC(var,type,init) PL_##var = init;
2629 # include "intrpvar.h"
2630 # ifndef USE_5005THREADS
2631 # include "thrdvar.h"
2642 S_init_main_stash(pTHX)
2646 PL_curstash = PL_defstash = newHV();
2647 PL_curstname = newSVpvn("main",4);
2648 gv = gv_fetchpv("main::",TRUE, SVt_PVHV);
2649 SvREFCNT_dec(GvHV(gv));
2650 GvHV(gv) = (HV*)SvREFCNT_inc(PL_defstash);
2652 HvNAME(PL_defstash) = savepv("main");
2653 PL_incgv = gv_HVadd(gv_AVadd(gv_fetchpv("INC",TRUE, SVt_PVAV)));
2654 GvMULTI_on(PL_incgv);
2655 PL_hintgv = gv_fetchpv("\010",TRUE, SVt_PV); /* ^H */
2656 GvMULTI_on(PL_hintgv);
2657 PL_defgv = gv_fetchpv("_",TRUE, SVt_PVAV);
2658 PL_errgv = gv_HVadd(gv_fetchpv("@", TRUE, SVt_PV));
2659 GvMULTI_on(PL_errgv);
2660 PL_replgv = gv_fetchpv("\022", TRUE, SVt_PV); /* ^R */
2661 GvMULTI_on(PL_replgv);
2662 (void)Perl_form(aTHX_ "%240s",""); /* Preallocate temp - for immediate signals. */
2663 sv_grow(ERRSV, 240); /* Preallocate - for immediate signals. */
2664 sv_setpvn(ERRSV, "", 0);
2665 PL_curstash = PL_defstash;
2666 CopSTASH_set(&PL_compiling, PL_defstash);
2667 PL_debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
2668 PL_globalstash = GvHV(gv_fetchpv("CORE::GLOBAL::", GV_ADDMULTI, SVt_PVHV));
2669 /* We must init $/ before switches are processed. */
2670 sv_setpvn(get_sv("/", TRUE), "\n", 1);
2674 S_open_script(pTHX_ char *scriptname, bool dosearch, SV *sv, int *fdscript)
2678 char *cpp_discard_flag;
2684 PL_origfilename = savepv("-e");
2687 /* if find_script() returns, it returns a malloc()-ed value */
2688 PL_origfilename = scriptname = find_script(scriptname, dosearch, NULL, 1);
2690 if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
2691 char *s = scriptname + 8;
2692 *fdscript = atoi(s);
2696 scriptname = savepv(s + 1);
2697 Safefree(PL_origfilename);
2698 PL_origfilename = scriptname;
2703 CopFILE_free(PL_curcop);
2704 CopFILE_set(PL_curcop, PL_origfilename);
2705 if (strEQ(PL_origfilename,"-"))
2707 if (*fdscript >= 0) {
2708 PL_rsfp = PerlIO_fdopen(*fdscript,PERL_SCRIPT_MODE);
2709 # if defined(HAS_FCNTL) && defined(F_SETFD)
2711 /* ensure close-on-exec */
2712 fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,1);
2715 else if (PL_preprocess) {
2716 char *cpp_cfg = CPPSTDIN;
2717 SV *cpp = newSVpvn("",0);
2718 SV *cmd = NEWSV(0,0);
2720 if (strEQ(cpp_cfg, "cppstdin"))
2721 Perl_sv_catpvf(aTHX_ cpp, "%s/", BIN_EXP);
2722 sv_catpv(cpp, cpp_cfg);
2725 sv_catpvn(sv, "-I", 2);
2726 sv_catpv(sv,PRIVLIB_EXP);
2729 DEBUG_P(PerlIO_printf(Perl_debug_log,
2730 "PL_preprocess: scriptname=\"%s\", cpp=\"%s\", sv=\"%s\", CPPMINUS=\"%s\"\n",
2731 scriptname, SvPVX (cpp), SvPVX (sv), CPPMINUS));
2733 # if defined(MSDOS) || defined(WIN32) || defined(VMS)
2740 cpp_discard_flag = "";
2742 cpp_discard_flag = "-C";
2746 perl = os2_execname(aTHX);
2748 perl = PL_origargv[0];
2752 /* This strips off Perl comments which might interfere with
2753 the C pre-processor, including #!. #line directives are
2754 deliberately stripped to avoid confusion with Perl's version
2755 of #line. FWP played some golf with it so it will fit
2756 into VMS's 255 character buffer.
2759 code = "(1../^#!.*perl/i)|/^\\s*#(?!\\s*((ifn?|un)def|(el|end)?if|define|include|else|error|pragma)\\b)/||!($|=1)||print";
2761 code = "/^\\s*#(?!\\s*((ifn?|un)def|(el|end)?if|define|include|else|error|pragma)\\b)/||!($|=1)||print";
2763 Perl_sv_setpvf(aTHX_ cmd, "\
2764 %s -ne%s%s%s %s | %"SVf" %s %"SVf" %s",
2765 perl, quote, code, quote, scriptname, cpp,
2766 cpp_discard_flag, sv, CPPMINUS);
2768 PL_doextract = FALSE;
2769 # ifdef IAMSUID /* actually, this is caught earlier */
2770 if (PL_euid != PL_uid && !PL_euid) { /* if running suidperl */
2772 (void)seteuid(PL_uid); /* musn't stay setuid root */
2774 # ifdef HAS_SETREUID
2775 (void)setreuid((Uid_t)-1, PL_uid);
2777 # ifdef HAS_SETRESUID
2778 (void)setresuid((Uid_t)-1, PL_uid, (Uid_t)-1);
2780 PerlProc_setuid(PL_uid);
2784 if (PerlProc_geteuid() != PL_uid)
2785 Perl_croak(aTHX_ "Can't do seteuid!\n");
2787 # endif /* IAMSUID */
2789 DEBUG_P(PerlIO_printf(Perl_debug_log,
2790 "PL_preprocess: cmd=\"%s\"\n",
2793 PL_rsfp = PerlProc_popen(SvPVX(cmd), "r");
2797 else if (!*scriptname) {
2798 forbid_setid("program input from stdin");
2799 PL_rsfp = PerlIO_stdin();
2802 PL_rsfp = PerlIO_open(scriptname,PERL_SCRIPT_MODE);
2803 # if defined(HAS_FCNTL) && defined(F_SETFD)
2805 /* ensure close-on-exec */
2806 fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,1);
2811 # ifndef IAMSUID /* in case script is not readable before setuid */
2813 PerlLIO_stat(CopFILE(PL_curcop),&PL_statbuf) >= 0 &&
2814 PL_statbuf.st_mode & (S_ISUID|S_ISGID))
2817 PerlProc_execv(Perl_form(aTHX_ "%s/sperl"PERL_FS_VER_FMT,
2818 BIN_EXP, (int)PERL_REVISION,
2820 (int)PERL_SUBVERSION), PL_origargv);
2821 Perl_croak(aTHX_ "Can't do setuid\n");
2827 Perl_croak(aTHX_ "Can't open perl script: %s\n",
2830 Perl_croak(aTHX_ "Can't open perl script \"%s\": %s\n",
2831 CopFILE(PL_curcop), Strerror(errno));
2837 * I_SYSSTATVFS HAS_FSTATVFS
2839 * I_STATFS HAS_FSTATFS HAS_GETFSSTAT
2840 * I_MNTENT HAS_GETMNTENT HAS_HASMNTOPT
2841 * here so that metaconfig picks them up. */
2845 S_fd_on_nosuid_fs(pTHX_ int fd)
2847 int check_okay = 0; /* able to do all the required sys/libcalls */
2848 int on_nosuid = 0; /* the fd is on a nosuid fs */
2850 * Preferred order: fstatvfs(), fstatfs(), ustat()+getmnt(), getmntent().
2851 * fstatvfs() is UNIX98.
2852 * fstatfs() is 4.3 BSD.
2853 * ustat()+getmnt() is pre-4.3 BSD.
2854 * getmntent() is O(number-of-mounted-filesystems) and can hang on
2855 * an irrelevant filesystem while trying to reach the right one.
2858 #undef FD_ON_NOSUID_CHECK_OKAY /* found the syscalls to do the check? */
2860 # if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
2861 defined(HAS_FSTATVFS)
2862 # define FD_ON_NOSUID_CHECK_OKAY
2863 struct statvfs stfs;
2865 check_okay = fstatvfs(fd, &stfs) == 0;
2866 on_nosuid = check_okay && (stfs.f_flag & ST_NOSUID);
2867 # endif /* fstatvfs */
2869 # if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
2870 defined(PERL_MOUNT_NOSUID) && \
2871 defined(HAS_FSTATFS) && \
2872 defined(HAS_STRUCT_STATFS) && \
2873 defined(HAS_STRUCT_STATFS_F_FLAGS)
2874 # define FD_ON_NOSUID_CHECK_OKAY
2877 check_okay = fstatfs(fd, &stfs) == 0;
2878 on_nosuid = check_okay && (stfs.f_flags & PERL_MOUNT_NOSUID);
2879 # endif /* fstatfs */
2881 # if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
2882 defined(PERL_MOUNT_NOSUID) && \
2883 defined(HAS_FSTAT) && \
2884 defined(HAS_USTAT) && \
2885 defined(HAS_GETMNT) && \
2886 defined(HAS_STRUCT_FS_DATA) && \
2888 # define FD_ON_NOSUID_CHECK_OKAY
2891 if (fstat(fd, &fdst) == 0) {
2893 if (ustat(fdst.st_dev, &us) == 0) {
2895 /* NOSTAT_ONE here because we're not examining fields which
2896 * vary between that case and STAT_ONE. */
2897 if (getmnt((int*)0, &fsd, (int)0, NOSTAT_ONE, us.f_fname) == 0) {
2898 size_t cmplen = sizeof(us.f_fname);
2899 if (sizeof(fsd.fd_req.path) < cmplen)
2900 cmplen = sizeof(fsd.fd_req.path);
2901 if (strnEQ(fsd.fd_req.path, us.f_fname, cmplen) &&
2902 fdst.st_dev == fsd.fd_req.dev) {
2904 on_nosuid = fsd.fd_req.flags & PERL_MOUNT_NOSUID;
2910 # endif /* fstat+ustat+getmnt */
2912 # if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
2913 defined(HAS_GETMNTENT) && \
2914 defined(HAS_HASMNTOPT) && \
2915 defined(MNTOPT_NOSUID)
2916 # define FD_ON_NOSUID_CHECK_OKAY
2917 FILE *mtab = fopen("/etc/mtab", "r");
2918 struct mntent *entry;
2921 if (mtab && (fstat(fd, &stb) == 0)) {
2922 while (entry = getmntent(mtab)) {
2923 if (stat(entry->mnt_dir, &fsb) == 0
2924 && fsb.st_dev == stb.st_dev)
2926 /* found the filesystem */
2928 if (hasmntopt(entry, MNTOPT_NOSUID))
2931 } /* A single fs may well fail its stat(). */
2936 # endif /* getmntent+hasmntopt */
2939 Perl_croak(aTHX_ "Can't check filesystem of script \"%s\" for nosuid", PL_origfilename);
2942 #endif /* IAMSUID */
2945 S_validate_suid(pTHX_ char *validarg, char *scriptname, int fdscript)
2951 /* do we need to emulate setuid on scripts? */
2953 /* This code is for those BSD systems that have setuid #! scripts disabled
2954 * in the kernel because of a security problem. Merely defining DOSUID
2955 * in perl will not fix that problem, but if you have disabled setuid
2956 * scripts in the kernel, this will attempt to emulate setuid and setgid
2957 * on scripts that have those now-otherwise-useless bits set. The setuid
2958 * root version must be called suidperl or sperlN.NNN. If regular perl
2959 * discovers that it has opened a setuid script, it calls suidperl with
2960 * the same argv that it had. If suidperl finds that the script it has
2961 * just opened is NOT setuid root, it sets the effective uid back to the
2962 * uid. We don't just make perl setuid root because that loses the
2963 * effective uid we had before invoking perl, if it was different from the
2966 * DOSUID must be defined in both perl and suidperl, and IAMSUID must
2967 * be defined in suidperl only. suidperl must be setuid root. The
2968 * Configure script will set this up for you if you want it.
2974 if (PerlLIO_fstat(PerlIO_fileno(PL_rsfp),&PL_statbuf) < 0) /* normal stat is insecure */
2975 Perl_croak(aTHX_ "Can't stat script \"%s\"",PL_origfilename);
2976 if (fdscript < 0 && PL_statbuf.st_mode & (S_ISUID|S_ISGID)) {
2981 #ifndef HAS_SETREUID
2982 /* On this access check to make sure the directories are readable,
2983 * there is actually a small window that the user could use to make
2984 * filename point to an accessible directory. So there is a faint
2985 * chance that someone could execute a setuid script down in a
2986 * non-accessible directory. I don't know what to do about that.
2987 * But I don't think it's too important. The manual lies when
2988 * it says access() is useful in setuid programs.
2990 if (PerlLIO_access(CopFILE(PL_curcop),1)) /*double check*/
2991 Perl_croak(aTHX_ "Permission denied");
2993 /* If we can swap euid and uid, then we can determine access rights
2994 * with a simple stat of the file, and then compare device and
2995 * inode to make sure we did stat() on the same file we opened.
2996 * Then we just have to make sure he or she can execute it.
3003 setreuid(PL_euid,PL_uid) < 0
3006 setresuid(PL_euid,PL_uid,(Uid_t)-1) < 0
3009 || PerlProc_getuid() != PL_euid || PerlProc_geteuid() != PL_uid)
3010 Perl_croak(aTHX_ "Can't swap uid and euid"); /* really paranoid */
3011 if (PerlLIO_stat(CopFILE(PL_curcop),&tmpstatbuf) < 0)
3012 Perl_croak(aTHX_ "Permission denied"); /* testing full pathname here */
3013 #if defined(IAMSUID) && !defined(NO_NOSUID_CHECK)
3014 if (fd_on_nosuid_fs(PerlIO_fileno(PL_rsfp)))
3015 Perl_croak(aTHX_ "Permission denied");
3017 if (tmpstatbuf.st_dev != PL_statbuf.st_dev ||
3018 tmpstatbuf.st_ino != PL_statbuf.st_ino) {
3019 (void)PerlIO_close(PL_rsfp);
3020 Perl_croak(aTHX_ "Permission denied\n");
3024 setreuid(PL_uid,PL_euid) < 0
3026 # if defined(HAS_SETRESUID)
3027 setresuid(PL_uid,PL_euid,(Uid_t)-1) < 0
3030 || PerlProc_getuid() != PL_uid || PerlProc_geteuid() != PL_euid)
3031 Perl_croak(aTHX_ "Can't reswap uid and euid");
3032 if (!cando(S_IXUSR,FALSE,&PL_statbuf)) /* can real uid exec? */
3033 Perl_croak(aTHX_ "Permission denied\n");
3035 #endif /* HAS_SETREUID */
3036 #endif /* IAMSUID */
3038 if (!S_ISREG(PL_statbuf.st_mode))
3039 Perl_croak(aTHX_ "Permission denied");
3040 if (PL_statbuf.st_mode & S_IWOTH)
3041 Perl_croak(aTHX_ "Setuid/gid script is writable by world");
3042 PL_doswitches = FALSE; /* -s is insecure in suid */
3043 CopLINE_inc(PL_curcop);
3044 if (sv_gets(PL_linestr, PL_rsfp, 0) == Nullch ||
3045 strnNE(SvPV(PL_linestr,n_a),"#!",2) ) /* required even on Sys V */
3046 Perl_croak(aTHX_ "No #! line");
3047 s = SvPV(PL_linestr,n_a)+2;
3049 while (!isSPACE(*s)) s++;
3050 for (s2 = s; (s2 > SvPV(PL_linestr,n_a)+2 &&
3051 (isDIGIT(s2[-1]) || strchr("._-", s2[-1]))); s2--) ;
3052 if (strnNE(s2-4,"perl",4) && strnNE(s-9,"perl",4)) /* sanity check */
3053 Perl_croak(aTHX_ "Not a perl script");
3054 while (*s == ' ' || *s == '\t') s++;
3056 * #! arg must be what we saw above. They can invoke it by
3057 * mentioning suidperl explicitly, but they may not add any strange
3058 * arguments beyond what #! says if they do invoke suidperl that way.
3060 len = strlen(validarg);
3061 if (strEQ(validarg," PHOOEY ") ||
3062 strnNE(s,validarg,len) || !isSPACE(s[len]))
3063 Perl_croak(aTHX_ "Args must match #! line");
3066 if (PL_euid != PL_uid && (PL_statbuf.st_mode & S_ISUID) &&
3067 PL_euid == PL_statbuf.st_uid)
3069 Perl_croak(aTHX_ "YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
3070 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
3071 #endif /* IAMSUID */
3073 if (PL_euid) { /* oops, we're not the setuid root perl */
3074 (void)PerlIO_close(PL_rsfp);
3077 PerlProc_execv(Perl_form(aTHX_ "%s/sperl"PERL_FS_VER_FMT, BIN_EXP,
3078 (int)PERL_REVISION, (int)PERL_VERSION,
3079 (int)PERL_SUBVERSION), PL_origargv);
3081 Perl_croak(aTHX_ "Can't do setuid\n");
3084 if (PL_statbuf.st_mode & S_ISGID && PL_statbuf.st_gid != PL_egid) {
3086 (void)setegid(PL_statbuf.st_gid);
3089 (void)setregid((Gid_t)-1,PL_statbuf.st_gid);
3091 #ifdef HAS_SETRESGID
3092 (void)setresgid((Gid_t)-1,PL_statbuf.st_gid,(Gid_t)-1);
3094 PerlProc_setgid(PL_statbuf.st_gid);
3098 if (PerlProc_getegid() != PL_statbuf.st_gid)
3099 Perl_croak(aTHX_ "Can't do setegid!\n");
3101 if (PL_statbuf.st_mode & S_ISUID) {
3102 if (PL_statbuf.st_uid != PL_euid)
3104 (void)seteuid(PL_statbuf.st_uid); /* all that for this */
3107 (void)setreuid((Uid_t)-1,PL_statbuf.st_uid);
3109 #ifdef HAS_SETRESUID
3110 (void)setresuid((Uid_t)-1,PL_statbuf.st_uid,(Uid_t)-1);
3112 PerlProc_setuid(PL_statbuf.st_uid);
3116 if (PerlProc_geteuid() != PL_statbuf.st_uid)
3117 Perl_croak(aTHX_ "Can't do seteuid!\n");
3119 else if (PL_uid) { /* oops, mustn't run as root */
3121 (void)seteuid((Uid_t)PL_uid);
3124 (void)setreuid((Uid_t)-1,(Uid_t)PL_uid);
3126 #ifdef HAS_SETRESUID
3127 (void)setresuid((Uid_t)-1,(Uid_t)PL_uid,(Uid_t)-1);
3129 PerlProc_setuid((Uid_t)PL_uid);
3133 if (PerlProc_geteuid() != PL_uid)
3134 Perl_croak(aTHX_ "Can't do seteuid!\n");
3137 if (!cando(S_IXUSR,TRUE,&PL_statbuf))
3138 Perl_croak(aTHX_ "Permission denied\n"); /* they can't do this */
3141 else if (PL_preprocess)
3142 Perl_croak(aTHX_ "-P not allowed for setuid/setgid script\n");
3143 else if (fdscript >= 0)
3144 Perl_croak(aTHX_ "fd script not allowed in suidperl\n");
3146 Perl_croak(aTHX_ "Script is not setuid/setgid in suidperl\n");
3148 /* We absolutely must clear out any saved ids here, so we */
3149 /* exec the real perl, substituting fd script for scriptname. */
3150 /* (We pass script name as "subdir" of fd, which perl will grok.) */
3151 PerlIO_rewind(PL_rsfp);
3152 PerlLIO_lseek(PerlIO_fileno(PL_rsfp),(Off_t)0,0); /* just in case rewind didn't */
3153 for (which = 1; PL_origargv[which] && PL_origargv[which] != scriptname; which++) ;
3154 if (!PL_origargv[which])
3155 Perl_croak(aTHX_ "Permission denied");
3156 PL_origargv[which] = savepv(Perl_form(aTHX_ "/dev/fd/%d/%s",
3157 PerlIO_fileno(PL_rsfp), PL_origargv[which]));
3158 #if defined(HAS_FCNTL) && defined(F_SETFD)
3159 fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,0); /* ensure no close-on-exec */
3161 PerlProc_execv(Perl_form(aTHX_ "%s/perl"PERL_FS_VER_FMT, BIN_EXP,
3162 (int)PERL_REVISION, (int)PERL_VERSION,
3163 (int)PERL_SUBVERSION), PL_origargv);/* try again */
3164 Perl_croak(aTHX_ "Can't do setuid\n");
3165 #endif /* IAMSUID */
3167 if (PL_euid != PL_uid || PL_egid != PL_gid) { /* (suidperl doesn't exist, in fact) */
3168 #ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
3169 PerlLIO_fstat(PerlIO_fileno(PL_rsfp),&PL_statbuf); /* may be either wrapped or real suid */
3170 if ((PL_euid != PL_uid && PL_euid == PL_statbuf.st_uid && PL_statbuf.st_mode & S_ISUID)
3172 (PL_egid != PL_gid && PL_egid == PL_statbuf.st_gid && PL_statbuf.st_mode & S_ISGID)
3175 Perl_croak(aTHX_ "YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
3176 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
3177 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
3178 /* not set-id, must be wrapped */
3184 S_find_beginning(pTHX)
3186 register char *s, *s2;
3187 #ifdef MACOS_TRADITIONAL
3191 /* skip forward in input to the real script? */
3194 #ifdef MACOS_TRADITIONAL
3195 /* Since the Mac OS does not honor #! arguments for us, we do it ourselves */
3197 while (PL_doextract || gMacPerl_AlwaysExtract) {
3198 if ((s = sv_gets(PL_linestr, PL_rsfp, 0)) == Nullch) {
3199 if (!gMacPerl_AlwaysExtract)
3200 Perl_croak(aTHX_ "No Perl script found in input\n");
3202 if (PL_doextract) /* require explicit override ? */
3203 if (!OverrideExtract(PL_origfilename))
3204 Perl_croak(aTHX_ "User aborted script\n");
3206 PL_doextract = FALSE;
3208 /* Pater peccavi, file does not have #! */
3209 PerlIO_rewind(PL_rsfp);
3214 while (PL_doextract) {
3215 if ((s = sv_gets(PL_linestr, PL_rsfp, 0)) == Nullch)
3216 Perl_croak(aTHX_ "No Perl script found in input\n");
3219 if (*s == '#' && s[1] == '!' && ((s = instr(s,"perl")) || (s = instr(s2,"PERL")))) {
3220 PerlIO_ungetc(PL_rsfp, '\n'); /* to keep line count right */
3221 PL_doextract = FALSE;
3222 while (*s && !(isSPACE (*s) || *s == '#')) s++;
3224 while (*s == ' ' || *s == '\t') s++;
3226 while (isDIGIT(s2[-1]) || strchr("-._", s2[-1])) s2--;
3227 if (strnEQ(s2-4,"perl",4))
3229 while ((s = moreswitches(s)))
3232 #ifdef MACOS_TRADITIONAL
3233 /* We are always searching for the #!perl line in MacPerl,
3234 * so if we find it, still keep the line count correct
3235 * by counting lines we already skipped over
3237 for (; maclines > 0 ; maclines--)
3238 PerlIO_ungetc(PL_rsfp, '\n');
3242 /* gMacPerl_AlwaysExtract is false in MPW tool */
3243 } else if (gMacPerl_AlwaysExtract) {
3254 PL_uid = PerlProc_getuid();
3255 PL_euid = PerlProc_geteuid();
3256 PL_gid = PerlProc_getgid();
3257 PL_egid = PerlProc_getegid();
3259 PL_uid |= PL_gid << 16;
3260 PL_euid |= PL_egid << 16;
3262 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
3266 S_forbid_setid(pTHX_ char *s)
3268 if (PL_euid != PL_uid)
3269 Perl_croak(aTHX_ "No %s allowed while running setuid", s);
3270 if (PL_egid != PL_gid)
3271 Perl_croak(aTHX_ "No %s allowed while running setgid", s);
3275 Perl_init_debugger(pTHX)
3277 HV *ostash = PL_curstash;
3279 PL_curstash = PL_debstash;
3280 PL_dbargs = GvAV(gv_AVadd((gv_fetchpv("args", GV_ADDMULTI, SVt_PVAV))));
3281 AvREAL_off(PL_dbargs);
3282 PL_DBgv = gv_fetchpv("DB", GV_ADDMULTI, SVt_PVGV);
3283 PL_DBline = gv_fetchpv("dbline", GV_ADDMULTI, SVt_PVAV);
3284 PL_DBsub = gv_HVadd(gv_fetchpv("sub", GV_ADDMULTI, SVt_PVHV));
3285 sv_upgrade(GvSV(PL_DBsub), SVt_IV); /* IVX accessed if PERLDB_SUB_NN */
3286 PL_DBsingle = GvSV((gv_fetchpv("single", GV_ADDMULTI, SVt_PV)));
3287 sv_setiv(PL_DBsingle, 0);
3288 PL_DBtrace = GvSV((gv_fetchpv("trace", GV_ADDMULTI, SVt_PV)));
3289 sv_setiv(PL_DBtrace, 0);
3290 PL_DBsignal = GvSV((gv_fetchpv("signal", GV_ADDMULTI, SVt_PV)));
3291 sv_setiv(PL_DBsignal, 0);
3292 PL_DBassertion = GvSV((gv_fetchpv("assertion", GV_ADDMULTI, SVt_PV)));
3293 sv_setiv(PL_DBassertion, 0);
3294 PL_curstash = ostash;
3297 #ifndef STRESS_REALLOC
3298 #define REASONABLE(size) (size)
3300 #define REASONABLE(size) (1) /* unreasonable */
3304 Perl_init_stacks(pTHX)
3306 /* start with 128-item stack and 8K cxstack */
3307 PL_curstackinfo = new_stackinfo(REASONABLE(128),
3308 REASONABLE(8192/sizeof(PERL_CONTEXT) - 1));
3309 PL_curstackinfo->si_type = PERLSI_MAIN;
3310 PL_curstack = PL_curstackinfo->si_stack;
3311 PL_mainstack = PL_curstack; /* remember in case we switch stacks */
3313 PL_stack_base = AvARRAY(PL_curstack);
3314 PL_stack_sp = PL_stack_base;
3315 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
3317 New(50,PL_tmps_stack,REASONABLE(128),SV*);
3320 PL_tmps_max = REASONABLE(128);
3322 New(54,PL_markstack,REASONABLE(32),I32);
3323 PL_markstack_ptr = PL_markstack;
3324 PL_markstack_max = PL_markstack + REASONABLE(32);
3328 New(54,PL_scopestack,REASONABLE(32),I32);
3329 PL_scopestack_ix = 0;
3330 PL_scopestack_max = REASONABLE(32);
3332 New(54,PL_savestack,REASONABLE(128),ANY);
3333 PL_savestack_ix = 0;
3334 PL_savestack_max = REASONABLE(128);
3336 New(54,PL_retstack,REASONABLE(16),OP*);
3338 PL_retstack_max = REASONABLE(16);
3346 while (PL_curstackinfo->si_next)
3347 PL_curstackinfo = PL_curstackinfo->si_next;
3348 while (PL_curstackinfo) {
3349 PERL_SI *p = PL_curstackinfo->si_prev;
3350 /* curstackinfo->si_stack got nuked by sv_free_arenas() */
3351 Safefree(PL_curstackinfo->si_cxstack);
3352 Safefree(PL_curstackinfo);
3353 PL_curstackinfo = p;
3355 Safefree(PL_tmps_stack);
3356 Safefree(PL_markstack);
3357 Safefree(PL_scopestack);
3358 Safefree(PL_savestack);
3359 Safefree(PL_retstack);
3368 lex_start(PL_linestr);
3370 PL_subname = newSVpvn("main",4);
3374 S_init_predump_symbols(pTHX)
3379 sv_setpvn(get_sv("\"", TRUE), " ", 1);
3380 PL_stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
3381 GvMULTI_on(PL_stdingv);
3382 io = GvIOp(PL_stdingv);
3383 IoTYPE(io) = IoTYPE_RDONLY;
3384 IoIFP(io) = PerlIO_stdin();
3385 tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
3387 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
3389 tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
3392 IoTYPE(io) = IoTYPE_WRONLY;
3393 IoOFP(io) = IoIFP(io) = PerlIO_stdout();
3395 tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
3397 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
3399 PL_stderrgv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
3400 GvMULTI_on(PL_stderrgv);
3401 io = GvIOp(PL_stderrgv);
3402 IoTYPE(io) = IoTYPE_WRONLY;
3403 IoOFP(io) = IoIFP(io) = PerlIO_stderr();
3404 tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
3406 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
3408 PL_statname = NEWSV(66,0); /* last filename we did stat on */
3411 Safefree(PL_osname);
3412 PL_osname = savepv(OSNAME);
3416 Perl_init_argv_symbols(pTHX_ register int argc, register char **argv)
3419 argc--,argv++; /* skip name of script */
3420 if (PL_doswitches) {
3421 for (; argc > 0 && **argv == '-'; argc--,argv++) {
3424 if (argv[0][1] == '-' && !argv[0][2]) {
3428 if ((s = strchr(argv[0], '='))) {
3430 sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),s);
3433 sv_setiv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),1);
3436 if ((PL_argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV))) {
3437 GvMULTI_on(PL_argvgv);
3438 (void)gv_AVadd(PL_argvgv);
3439 av_clear(GvAVn(PL_argvgv));
3440 for (; argc > 0; argc--,argv++) {
3441 SV *sv = newSVpv(argv[0],0);
3442 av_push(GvAVn(PL_argvgv),sv);
3443 if (!(PL_unicode & PERL_UNICODE_LOCALE_FLAG) || PL_utf8locale) {
3444 if (PL_unicode & PERL_UNICODE_ARGV_FLAG)
3447 if (PL_unicode & PERL_UNICODE_WIDESYSCALLS_FLAG) /* Sarathy? */
3448 (void)sv_utf8_decode(sv);
3453 #ifdef HAS_PROCSELFEXE
3454 /* This is a function so that we don't hold on to MAXPATHLEN
3455 bytes of stack longer than necessary
3458 S_procself_val(pTHX_ SV *sv, char *arg0)
3460 char buf[MAXPATHLEN];
3461 int len = readlink(PROCSELFEXE_PATH, buf, sizeof(buf) - 1);
3463 /* On Playstation2 Linux V1.0 (kernel 2.2.1) readlink(/proc/self/exe)
3464 includes a spurious NUL which will cause $^X to fail in system
3465 or backticks (this will prevent extensions from being built and
3466 many tests from working). readlink is not meant to add a NUL.
3467 Normal readlink works fine.
3469 if (len > 0 && buf[len-1] == '\0') {
3473 /* FreeBSD's implementation is acknowledged to be imperfect, sometimes
3474 returning the text "unknown" from the readlink rather than the path
3475 to the executable (or returning an error from the readlink). Any valid
3476 path has a '/' in it somewhere, so use that to validate the result.
3477 See http://www.freebsd.org/cgi/query-pr.cgi?pr=35703
3479 if (len > 0 && memchr(buf, '/', len)) {
3480 sv_setpvn(sv,buf,len);
3486 #endif /* HAS_PROCSELFEXE */
3489 S_init_postdump_symbols(pTHX_ register int argc, register char **argv, register char **env)
3495 PL_toptarget = NEWSV(0,0);
3496 sv_upgrade(PL_toptarget, SVt_PVFM);
3497 sv_setpvn(PL_toptarget, "", 0);
3498 PL_bodytarget = NEWSV(0,0);
3499 sv_upgrade(PL_bodytarget, SVt_PVFM);
3500 sv_setpvn(PL_bodytarget, "", 0);
3501 PL_formtarget = PL_bodytarget;
3505 init_argv_symbols(argc,argv);
3507 if ((tmpgv = gv_fetchpv("0",TRUE, SVt_PV))) {
3508 #ifdef MACOS_TRADITIONAL
3509 /* $0 is not majick on a Mac */
3510 sv_setpv(GvSV(tmpgv),MacPerl_MPWFileName(PL_origfilename));
3512 sv_setpv(GvSV(tmpgv),PL_origfilename);
3513 magicname("0", "0", 1);
3516 if ((tmpgv = gv_fetchpv("\030",TRUE, SVt_PV))) {/* $^X */
3517 #ifdef HAS_PROCSELFEXE
3518 S_procself_val(aTHX_ GvSV(tmpgv), PL_origargv[0]);
3521 sv_setpv(GvSV(tmpgv), os2_execname(aTHX));
3523 sv_setpv(GvSV(tmpgv),PL_origargv[0]);
3527 if ((PL_envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV))) {
3529 GvMULTI_on(PL_envgv);
3530 hv = GvHVn(PL_envgv);
3531 hv_magic(hv, Nullgv, PERL_MAGIC_env);
3532 #ifdef USE_ENVIRON_ARRAY
3533 /* Note that if the supplied env parameter is actually a copy
3534 of the global environ then it may now point to free'd memory
3535 if the environment has been modified since. To avoid this
3536 problem we treat env==NULL as meaning 'use the default'
3541 # ifdef USE_ITHREADS
3542 && PL_curinterp == aTHX
3546 environ[0] = Nullch;
3549 for (; *env; env++) {
3550 if (!(s = strchr(*env,'=')))
3557 sv = newSVpv(s+1, 0);
3558 (void)hv_store(hv, *env, s - *env, sv, 0);
3562 #endif /* USE_ENVIRON_ARRAY */
3565 if ((tmpgv = gv_fetchpv("$",TRUE, SVt_PV))) {
3566 SvREADONLY_off(GvSV(tmpgv));
3567 sv_setiv(GvSV(tmpgv), (IV)PerlProc_getpid());
3568 SvREADONLY_on(GvSV(tmpgv));
3570 #ifdef THREADS_HAVE_PIDS
3571 PL_ppid = (IV)getppid();
3574 /* touch @F array to prevent spurious warnings 20020415 MJD */
3576 (void) get_av("main::F", TRUE | GV_ADDMULTI);
3578 /* touch @- and @+ arrays to prevent spurious warnings 20020415 MJD */
3579 (void) get_av("main::-", TRUE | GV_ADDMULTI);
3580 (void) get_av("main::+", TRUE | GV_ADDMULTI);
3584 S_init_perllib(pTHX)
3589 s = PerlEnv_getenv("PERL5LIB");
3591 incpush(s, TRUE, TRUE, TRUE);
3593 incpush(PerlEnv_getenv("PERLLIB"), FALSE, FALSE, TRUE);
3595 /* Treat PERL5?LIB as a possible search list logical name -- the
3596 * "natural" VMS idiom for a Unix path string. We allow each
3597 * element to be a set of |-separated directories for compatibility.
3601 if (my_trnlnm("PERL5LIB",buf,0))
3602 do { incpush(buf,TRUE,TRUE,TRUE); } while (my_trnlnm("PERL5LIB",buf,++idx));
3604 while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE,FALSE,TRUE);
3608 /* Use the ~-expanded versions of APPLLIB (undocumented),
3609 ARCHLIB PRIVLIB SITEARCH SITELIB VENDORARCH and VENDORLIB
3612 incpush(APPLLIB_EXP, TRUE, TRUE, TRUE);
3616 incpush(ARCHLIB_EXP, FALSE, FALSE, TRUE);
3618 #ifdef MACOS_TRADITIONAL
3621 SV * privdir = NEWSV(55, 0);
3622 char * macperl = PerlEnv_getenv("MACPERL");
3627 Perl_sv_setpvf(aTHX_ privdir, "%slib:", macperl);
3628 if (PerlLIO_stat(SvPVX(privdir), &tmpstatbuf) >= 0 && S_ISDIR(tmpstatbuf.st_mode))
3629 incpush(SvPVX(privdir), TRUE, FALSE, TRUE);
3630 Perl_sv_setpvf(aTHX_ privdir, "%ssite_perl:", macperl);
3631 if (PerlLIO_stat(SvPVX(privdir), &tmpstatbuf) >= 0 && S_ISDIR(tmpstatbuf.st_mode))
3632 incpush(SvPVX(privdir), TRUE, FALSE, TRUE);
3634 SvREFCNT_dec(privdir);
3637 incpush(":", FALSE, FALSE, TRUE);
3640 # define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
3643 incpush(PRIVLIB_EXP, TRUE, FALSE, TRUE);
3645 incpush(PRIVLIB_EXP, FALSE, FALSE, TRUE);
3649 /* sitearch is always relative to sitelib on Windows for
3650 * DLL-based path intuition to work correctly */
3651 # if !defined(WIN32)
3652 incpush(SITEARCH_EXP, FALSE, FALSE, TRUE);
3658 /* this picks up sitearch as well */
3659 incpush(SITELIB_EXP, TRUE, FALSE, TRUE);
3661 incpush(SITELIB_EXP, FALSE, FALSE, TRUE);
3665 #ifdef SITELIB_STEM /* Search for version-specific dirs below here */
3666 incpush(SITELIB_STEM, FALSE, TRUE, TRUE);
3669 #ifdef PERL_VENDORARCH_EXP
3670 /* vendorarch is always relative to vendorlib on Windows for
3671 * DLL-based path intuition to work correctly */
3672 # if !defined(WIN32)
3673 incpush(PERL_VENDORARCH_EXP, FALSE, FALSE, TRUE);
3677 #ifdef PERL_VENDORLIB_EXP
3679 incpush(PERL_VENDORLIB_EXP, TRUE, FALSE, TRUE); /* this picks up vendorarch as well */
3681 incpush(PERL_VENDORLIB_EXP, FALSE, FALSE, TRUE);
3685 #ifdef PERL_VENDORLIB_STEM /* Search for version-specific dirs below here */
3686 incpush(PERL_VENDORLIB_STEM, FALSE, TRUE, TRUE);
3689 #ifdef PERL_OTHERLIBDIRS
3690 incpush(PERL_OTHERLIBDIRS, TRUE, TRUE, TRUE);
3694 incpush(".", FALSE, FALSE, TRUE);
3695 #endif /* MACOS_TRADITIONAL */
3698 #if defined(DOSISH) || defined(EPOC)
3699 # define PERLLIB_SEP ';'
3702 # define PERLLIB_SEP '|'
3704 # if defined(MACOS_TRADITIONAL)
3705 # define PERLLIB_SEP ','
3707 # define PERLLIB_SEP ':'
3711 #ifndef PERLLIB_MANGLE
3712 # define PERLLIB_MANGLE(s,n) (s)
3716 S_incpush(pTHX_ char *p, int addsubdirs, int addoldvers, int usesep)
3718 SV *subdir = Nullsv;
3723 if (addsubdirs || addoldvers) {
3724 subdir = sv_newmortal();
3727 /* Break at all separators */
3729 SV *libdir = NEWSV(55,0);
3732 /* skip any consecutive separators */
3734 while ( *p == PERLLIB_SEP ) {
3735 /* Uncomment the next line for PATH semantics */
3736 /* av_push(GvAVn(PL_incgv), newSVpvn(".", 1)); */
3741 if ( usesep && (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
3742 sv_setpvn(libdir, PERLLIB_MANGLE(p, (STRLEN)(s - p)),
3747 sv_setpv(libdir, PERLLIB_MANGLE(p, 0));
3748 p = Nullch; /* break out */
3750 #ifdef MACOS_TRADITIONAL
3751 if (!strchr(SvPVX(libdir), ':')) {
3754 sv_setpv(libdir, MacPerl_CanonDir(SvPVX(libdir), buf, 0));
3756 if (SvPVX(libdir)[SvCUR(libdir)-1] != ':')
3757 sv_catpv(libdir, ":");
3761 * BEFORE pushing libdir onto @INC we may first push version- and
3762 * archname-specific sub-directories.
3764 if (addsubdirs || addoldvers) {
3765 #ifdef PERL_INC_VERSION_LIST
3766 /* Configure terminates PERL_INC_VERSION_LIST with a NULL */
3767 const char *incverlist[] = { PERL_INC_VERSION_LIST };
3768 const char **incver;
3775 if ((unix = tounixspec_ts(SvPV(libdir,len),Nullch)) != Nullch) {
3777 while (unix[len-1] == '/') len--; /* Cosmetic */
3778 sv_usepvn(libdir,unix,len);
3781 PerlIO_printf(Perl_error_log,
3782 "Failed to unixify @INC element \"%s\"\n",
3786 #ifdef MACOS_TRADITIONAL
3787 #define PERL_AV_SUFFIX_FMT ""
3788 #define PERL_ARCH_FMT "%s:"
3789 #define PERL_ARCH_FMT_PATH PERL_FS_VER_FMT PERL_AV_SUFFIX_FMT
3791 #define PERL_AV_SUFFIX_FMT "/"
3792 #define PERL_ARCH_FMT "/%s"
3793 #define PERL_ARCH_FMT_PATH PERL_AV_SUFFIX_FMT PERL_FS_VER_FMT
3795 /* .../version/archname if -d .../version/archname */
3796 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT_PATH PERL_ARCH_FMT,
3798 (int)PERL_REVISION, (int)PERL_VERSION,
3799 (int)PERL_SUBVERSION, ARCHNAME);
3800 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
3801 S_ISDIR(tmpstatbuf.st_mode))
3802 av_push(GvAVn(PL_incgv), newSVsv(subdir));
3804 /* .../version if -d .../version */
3805 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT_PATH, libdir,
3806 (int)PERL_REVISION, (int)PERL_VERSION,
3807 (int)PERL_SUBVERSION);
3808 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
3809 S_ISDIR(tmpstatbuf.st_mode))
3810 av_push(GvAVn(PL_incgv), newSVsv(subdir));
3812 /* .../archname if -d .../archname */
3813 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT, libdir, ARCHNAME);
3814 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
3815 S_ISDIR(tmpstatbuf.st_mode))
3816 av_push(GvAVn(PL_incgv), newSVsv(subdir));
3819 #ifdef PERL_INC_VERSION_LIST
3821 for (incver = incverlist; *incver; incver++) {
3822 /* .../xxx if -d .../xxx */
3823 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT, libdir, *incver);
3824 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
3825 S_ISDIR(tmpstatbuf.st_mode))
3826 av_push(GvAVn(PL_incgv), newSVsv(subdir));
3832 /* finally push this lib directory on the end of @INC */
3833 av_push(GvAVn(PL_incgv), libdir);
3837 #ifdef USE_5005THREADS
3838 STATIC struct perl_thread *
3839 S_init_main_thread(pTHX)
3841 #if !defined(PERL_IMPLICIT_CONTEXT)
3842 struct perl_thread *thr;
3846 Newz(53, thr, 1, struct perl_thread);
3847 PL_curcop = &PL_compiling;
3848 thr->interp = PERL_GET_INTERP;
3849 thr->cvcache = newHV();
3850 thr->threadsv = newAV();
3851 /* thr->threadsvp is set when find_threadsv is called */
3852 thr->specific = newAV();
3853 thr->flags = THRf_R_JOINABLE;
3854 MUTEX_INIT(&thr->mutex);
3855 /* Handcraft thrsv similarly to mess_sv */
3856 New(53, PL_thrsv, 1, SV);
3857 Newz(53, xpv, 1, XPV);
3858 SvFLAGS(PL_thrsv) = SVt_PV;
3859 SvANY(PL_thrsv) = (void*)xpv;
3860 SvREFCNT(PL_thrsv) = 1 << 30; /* practically infinite */
3861 SvPVX(PL_thrsv) = (char*)thr;
3862 SvCUR_set(PL_thrsv, sizeof(thr));
3863 SvLEN_set(PL_thrsv, sizeof(thr));
3864 *SvEND(PL_thrsv) = '\0'; /* in the trailing_nul field */
3865 thr->oursv = PL_thrsv;
3866 PL_chopset = " \n-";
3869 MUTEX_LOCK(&PL_threads_mutex);
3875 MUTEX_UNLOCK(&PL_threads_mutex);
3877 #ifdef HAVE_THREAD_INTERN
3878 Perl_init_thread_intern(thr);
3881 #ifdef SET_THREAD_SELF
3882 SET_THREAD_SELF(thr);
3884 thr->self = pthread_self();
3885 #endif /* SET_THREAD_SELF */
3889 * These must come after the thread self setting
3890 * because sv_setpvn does SvTAINT and the taint
3891 * fields thread selfness being set.
3893 PL_toptarget = NEWSV(0,0);
3894 sv_upgrade(PL_toptarget, SVt_PVFM);
3895 sv_setpvn(PL_toptarget, "", 0);
3896 PL_bodytarget = NEWSV(0,0);
3897 sv_upgrade(PL_bodytarget, SVt_PVFM);
3898 sv_setpvn(PL_bodytarget, "", 0);
3899 PL_formtarget = PL_bodytarget;
3900 thr->errsv = newSVpvn("", 0);
3901 (void) find_threadsv("@"); /* Ensure $@ is initialised early */
3904 PL_peepp = MEMBER_TO_FPTR(Perl_peep);
3905 PL_regcompp = MEMBER_TO_FPTR(Perl_pregcomp);
3906 PL_regexecp = MEMBER_TO_FPTR(Perl_regexec_flags);
3907 PL_regint_start = MEMBER_TO_FPTR(Perl_re_intuit_start);
3908 PL_regint_string = MEMBER_TO_FPTR(Perl_re_intuit_string);
3909 PL_regfree = MEMBER_TO_FPTR(Perl_pregfree);
3911 PL_reginterp_cnt = 0;
3915 #endif /* USE_5005THREADS */
3918 Perl_call_list(pTHX_ I32 oldscope, AV *paramList)
3921 line_t oldline = CopLINE(PL_curcop);
3927 while (AvFILL(paramList) >= 0) {
3928 cv = (CV*)av_shift(paramList);
3930 if (paramList == PL_beginav) {
3931 /* save PL_beginav for compiler */
3932 if (! PL_beginav_save)
3933 PL_beginav_save = newAV();
3934 av_push(PL_beginav_save, (SV*)cv);
3936 else if (paramList == PL_checkav) {
3937 /* save PL_checkav for compiler */
3938 if (! PL_checkav_save)
3939 PL_checkav_save = newAV();
3940 av_push(PL_checkav_save, (SV*)cv);
3945 #ifdef PERL_FLEXIBLE_EXCEPTIONS
3946 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vcall_list_body), cv);
3952 #ifndef PERL_FLEXIBLE_EXCEPTIONS
3956 (void)SvPV(atsv, len);
3958 PL_curcop = &PL_compiling;
3959 CopLINE_set(PL_curcop, oldline);
3960 if (paramList == PL_beginav)
3961 sv_catpv(atsv, "BEGIN failed--compilation aborted");
3963 Perl_sv_catpvf(aTHX_ atsv,
3964 "%s failed--call queue aborted",
3965 paramList == PL_checkav ? "CHECK"
3966 : paramList == PL_initav ? "INIT"
3968 while (PL_scopestack_ix > oldscope)
3971 Perl_croak(aTHX_ "%"SVf"", atsv);
3978 /* my_exit() was called */
3979 while (PL_scopestack_ix > oldscope)
3982 PL_curstash = PL_defstash;
3983 PL_curcop = &PL_compiling;
3984 CopLINE_set(PL_curcop, oldline);
3986 if (PL_statusvalue && !(PL_exit_flags & PERL_EXIT_EXPECTED)) {
3987 if (paramList == PL_beginav)
3988 Perl_croak(aTHX_ "BEGIN failed--compilation aborted");
3990 Perl_croak(aTHX_ "%s failed--call queue aborted",
3991 paramList == PL_checkav ? "CHECK"
3992 : paramList == PL_initav ? "INIT"
3999 PL_curcop = &PL_compiling;
4000 CopLINE_set(PL_curcop, oldline);
4003 PerlIO_printf(Perl_error_log, "panic: restartop\n");
4011 #ifdef PERL_FLEXIBLE_EXCEPTIONS
4013 S_vcall_list_body(pTHX_ va_list args)
4015 CV *cv = va_arg(args, CV*);
4016 return call_list_body(cv);
4021 S_call_list_body(pTHX_ CV *cv)
4023 PUSHMARK(PL_stack_sp);
4024 call_sv((SV*)cv, G_EVAL|G_DISCARD);
4029 Perl_my_exit(pTHX_ U32 status)
4031 DEBUG_S(PerlIO_printf(Perl_debug_log, "my_exit: thread %p, status %lu\n",
4032 thr, (unsigned long) status));
4041 STATUS_NATIVE_SET(status);
4048 Perl_my_failure_exit(pTHX)
4051 if (vaxc$errno & 1) {
4052 if (STATUS_NATIVE & 1) /* fortuitiously includes "-1" */
4053 STATUS_NATIVE_SET(44);
4056 if (!vaxc$errno && errno) /* unlikely */
4057 STATUS_NATIVE_SET(44);
4059 STATUS_NATIVE_SET(vaxc$errno);
4064 STATUS_POSIX_SET(errno);
4066 exitstatus = STATUS_POSIX >> 8;
4067 if (exitstatus & 255)
4068 STATUS_POSIX_SET(exitstatus);
4070 STATUS_POSIX_SET(255);
4077 S_my_exit_jump(pTHX)
4079 register PERL_CONTEXT *cx;
4084 SvREFCNT_dec(PL_e_script);
4085 PL_e_script = Nullsv;
4088 POPSTACK_TO(PL_mainstack);
4089 if (cxstack_ix >= 0) {
4092 POPBLOCK(cx,PL_curpm);
4100 read_e_script(pTHX_ int idx, SV *buf_sv, int maxlen)
4103 p = SvPVX(PL_e_script);
4104 nl = strchr(p, '\n');
4105 nl = (nl) ? nl+1 : SvEND(PL_e_script);
4107 filter_del(read_e_script);
4110 sv_catpvn(buf_sv, p, nl-p);
4111 sv_chop(PL_e_script, nl);