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
1027 if ((s = moreswitches(s)))
1032 if( !PL_tainting ) {
1033 PL_taint_warn = TRUE;
1040 PL_taint_warn = FALSE;
1045 #ifdef MACOS_TRADITIONAL
1046 /* ignore -e for Dev:Pseudo argument */
1047 if (argv[1] && !strcmp(argv[1], "Dev:Pseudo"))
1050 if (PL_euid != PL_uid || PL_egid != PL_gid)
1051 Perl_croak(aTHX_ "No -e allowed in setuid scripts");
1053 PL_e_script = newSVpvn("",0);
1054 filter_add(read_e_script, NULL);
1057 sv_catpv(PL_e_script, s);
1059 sv_catpv(PL_e_script, argv[1]);
1063 Perl_croak(aTHX_ "No code specified for -e");
1064 sv_catpv(PL_e_script, "\n");
1067 case 'I': /* -I handled both here and in moreswitches() */
1069 if (!*++s && (s=argv[1]) != Nullch) {
1074 STRLEN len = strlen(s);
1075 p = savepvn(s, len);
1076 incpush(p, TRUE, TRUE, FALSE);
1077 sv_catpvn(sv, "-I", 2);
1078 sv_catpvn(sv, p, len);
1079 sv_catpvn(sv, " ", 1);
1083 Perl_croak(aTHX_ "No directory specified for -I");
1087 PL_preprocess = TRUE;
1097 PL_preambleav = newAV();
1098 av_push(PL_preambleav, newSVpv("use Config qw(myconfig config_vars)",0));
1100 PL_Sv = newSVpv("print myconfig();",0);
1102 sv_catpv(PL_Sv,"print \"\\nCharacteristics of this PERLSHR image: \\n\",");
1104 sv_catpv(PL_Sv,"print \"\\nCharacteristics of this binary (from libperl): \\n\",");
1106 sv_catpv(PL_Sv,"\" Compile-time options:");
1108 sv_catpv(PL_Sv," DEBUGGING");
1110 # ifdef MULTIPLICITY
1111 sv_catpv(PL_Sv," MULTIPLICITY");
1113 # ifdef USE_5005THREADS
1114 sv_catpv(PL_Sv," USE_5005THREADS");
1116 # ifdef USE_ITHREADS
1117 sv_catpv(PL_Sv," USE_ITHREADS");
1119 # ifdef USE_64_BIT_INT
1120 sv_catpv(PL_Sv," USE_64_BIT_INT");
1122 # ifdef USE_64_BIT_ALL
1123 sv_catpv(PL_Sv," USE_64_BIT_ALL");
1125 # ifdef USE_LONG_DOUBLE
1126 sv_catpv(PL_Sv," USE_LONG_DOUBLE");
1128 # ifdef USE_LARGE_FILES
1129 sv_catpv(PL_Sv," USE_LARGE_FILES");
1132 sv_catpv(PL_Sv," USE_SOCKS");
1134 # ifdef PERL_IMPLICIT_CONTEXT
1135 sv_catpv(PL_Sv," PERL_IMPLICIT_CONTEXT");
1137 # ifdef PERL_IMPLICIT_SYS
1138 sv_catpv(PL_Sv," PERL_IMPLICIT_SYS");
1140 sv_catpv(PL_Sv,"\\n\",");
1142 #if defined(LOCAL_PATCH_COUNT)
1143 if (LOCAL_PATCH_COUNT > 0) {
1145 sv_catpv(PL_Sv,"\" Locally applied patches:\\n\",");
1146 for (i = 1; i <= LOCAL_PATCH_COUNT; i++) {
1147 if (PL_localpatches[i])
1148 Perl_sv_catpvf(aTHX_ PL_Sv,"q\" \t%s\n\",",PL_localpatches[i]);
1152 Perl_sv_catpvf(aTHX_ PL_Sv,"\" Built under %s\\n\"",OSNAME);
1155 Perl_sv_catpvf(aTHX_ PL_Sv,",\" Compiled at %s %s\\n\"",__DATE__,__TIME__);
1157 Perl_sv_catpvf(aTHX_ PL_Sv,",\" Compiled on %s\\n\"",__DATE__);
1160 sv_catpv(PL_Sv, "; \
1162 @env = map { \"$_=\\\"$ENV{$_}\\\"\" } sort grep {/^PERL/} keys %ENV; ");
1165 push @env, \"CYGWIN=\\\"$ENV{CYGWIN}\\\"\";");
1168 print \" \\%ENV:\\n @env\\n\" if @env; \
1169 print \" \\@INC:\\n @INC\\n\";");
1172 PL_Sv = newSVpv("config_vars(qw(",0);
1173 sv_catpv(PL_Sv, ++s);
1174 sv_catpv(PL_Sv, "))");
1177 av_push(PL_preambleav, PL_Sv);
1178 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
1181 PL_doextract = TRUE;
1189 if (!*++s || isSPACE(*s)) {
1193 /* catch use of gnu style long options */
1194 if (strEQ(s, "version")) {
1198 if (strEQ(s, "help")) {
1205 Perl_croak(aTHX_ "Unrecognized switch: -%s (-h will show valid options)",s);
1209 sv_setsv(get_sv("/", TRUE), PL_rs);
1212 #ifndef SECURE_INTERNAL_GETENV
1215 (s = PerlEnv_getenv("PERL5OPT")))
1220 if (*s == '-' && *(s+1) == 'T') {
1222 PL_taint_warn = FALSE;
1225 char *popt_copy = Nullch;
1238 if (!strchr("DIMUdmtw", *s))
1239 Perl_croak(aTHX_ "Illegal switch in PERL5OPT: -%c", *s);
1243 popt_copy = SvPVX(sv_2mortal(newSVpv(popt,0)));
1244 s = popt_copy + (s - popt);
1245 d = popt_copy + (d - popt);
1252 if( !PL_tainting ) {
1253 PL_taint_warn = TRUE;
1263 if (PL_taint_warn && PL_dowarn != G_WARN_ALL_OFF) {
1264 PL_compiling.cop_warnings = newSVpvn(WARN_TAINTstring, WARNsize);
1268 scriptname = argv[0];
1271 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
1273 else if (scriptname == Nullch) {
1275 if ( PerlLIO_isatty(PerlIO_fileno(PerlIO_stdin())) )
1283 open_script(scriptname,dosearch,sv,&fdscript);
1285 validate_suid(validarg, scriptname,fdscript);
1288 #if defined(SIGCHLD) || defined(SIGCLD)
1291 # define SIGCHLD SIGCLD
1293 Sighandler_t sigstate = rsignal_state(SIGCHLD);
1294 if (sigstate == SIG_IGN) {
1295 if (ckWARN(WARN_SIGNAL))
1296 Perl_warner(aTHX_ packWARN(WARN_SIGNAL),
1297 "Can't ignore signal CHLD, forcing to default");
1298 (void)rsignal(SIGCHLD, (Sighandler_t)SIG_DFL);
1304 #ifdef MACOS_TRADITIONAL
1305 if (PL_doextract || gMacPerl_AlwaysExtract) {
1310 if (cddir && PerlDir_chdir(cddir) < 0)
1311 Perl_croak(aTHX_ "Can't chdir to %s",cddir);
1315 PL_main_cv = PL_compcv = (CV*)NEWSV(1104,0);
1316 sv_upgrade((SV *)PL_compcv, SVt_PVCV);
1317 CvUNIQUE_on(PL_compcv);
1319 CvPADLIST(PL_compcv) = pad_new(0);
1320 #ifdef USE_5005THREADS
1321 CvOWNER(PL_compcv) = 0;
1322 New(666, CvMUTEXP(PL_compcv), 1, perl_mutex);
1323 MUTEX_INIT(CvMUTEXP(PL_compcv));
1324 #endif /* USE_5005THREADS */
1327 boot_core_UNIVERSAL();
1329 boot_core_xsutils();
1333 (*xsinit)(aTHX); /* in case linked C routines want magical variables */
1335 #if defined(VMS) || defined(WIN32) || defined(DJGPP) || defined(__CYGWIN__) || defined(EPOC)
1341 # ifdef HAS_SOCKS5_INIT
1342 socks5_init(argv[0]);
1348 init_predump_symbols();
1349 /* init_postdump_symbols not currently designed to be called */
1350 /* more than once (ENV isn't cleared first, for example) */
1351 /* But running with -u leaves %ENV & @ARGV undefined! XXX */
1353 init_postdump_symbols(argc,argv,env);
1355 /* PL_unicode is turned on by -C or by $ENV{PERL_UNICODE}.
1356 * PL_utf8locale is conditionally turned on by
1357 * locale.c:Perl_init_i18nl10n() if the environment
1358 * look like the user wants to use UTF-8. */
1359 if (PL_unicode) { /* Requires init_predump_symbols(). */
1364 if (!(PL_unicode & PERL_UNICODE_LOCALE_FLAG) || PL_utf8locale) {
1365 /* Turn on UTF-8-ness on STDIN, STDOUT, STDERR
1366 * and the default open discipline. */
1367 if ((PL_unicode & PERL_UNICODE_STDIN_FLAG) &&
1368 PL_stdingv && (io = GvIO(PL_stdingv)) &&
1370 PerlIO_binmode(aTHX_ fp, IoTYPE(io), 0, ":utf8");
1371 if ((PL_unicode & PERL_UNICODE_STDOUT_FLAG) &&
1372 PL_defoutgv && (io = GvIO(PL_defoutgv)) &&
1374 PerlIO_binmode(aTHX_ fp, IoTYPE(io), 0, ":utf8");
1375 if ((PL_unicode & PERL_UNICODE_STDERR_FLAG) &&
1376 PL_stderrgv && (io = GvIO(PL_stderrgv)) &&
1378 PerlIO_binmode(aTHX_ fp, IoTYPE(io), 0, ":utf8");
1379 if ((PL_unicode & PERL_UNICODE_INOUT_FLAG) &&
1380 (sv = GvSV(gv_fetchpv("\017PEN", TRUE, SVt_PV)))) {
1381 U32 in = PL_unicode & PERL_UNICODE_IN_FLAG;
1382 U32 out = PL_unicode & PERL_UNICODE_OUT_FLAG;
1385 sv_setpvn(sv, ":utf8\0:utf8", 11);
1387 sv_setpvn(sv, ":utf8\0", 6);
1390 sv_setpvn(sv, "\0:utf8", 6);
1398 /* now parse the script */
1400 SETERRNO(0,SS_NORMAL);
1402 #ifdef MACOS_TRADITIONAL
1403 if (gMacPerl_SyntaxError = (yyparse() || PL_error_count)) {
1405 Perl_croak(aTHX_ "%s had compilation errors.\n", MacPerl_MPWFileName(PL_origfilename));
1407 Perl_croak(aTHX_ "Execution of %s aborted due to compilation errors.\n",
1408 MacPerl_MPWFileName(PL_origfilename));
1412 if (yyparse() || PL_error_count) {
1414 Perl_croak(aTHX_ "%s had compilation errors.\n", PL_origfilename);
1416 Perl_croak(aTHX_ "Execution of %s aborted due to compilation errors.\n",
1421 CopLINE_set(PL_curcop, 0);
1422 PL_curstash = PL_defstash;
1423 PL_preprocess = FALSE;
1425 SvREFCNT_dec(PL_e_script);
1426 PL_e_script = Nullsv;
1433 SAVECOPFILE(PL_curcop);
1434 SAVECOPLINE(PL_curcop);
1435 gv_check(PL_defstash);
1442 if ((s=PerlEnv_getenv("PERL_DEBUG_MSTATS")) && atoi(s) >= 2)
1443 dump_mstats("after compilation:");
1452 =for apidoc perl_run
1454 Tells a Perl interpreter to run. See L<perlembed>.
1465 #ifdef USE_5005THREADS
1469 oldscope = PL_scopestack_ix;
1474 #ifdef PERL_FLEXIBLE_EXCEPTIONS
1476 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vrun_body), oldscope);
1482 cxstack_ix = -1; /* start context stack again */
1484 case 0: /* normal completion */
1485 #ifndef PERL_FLEXIBLE_EXCEPTIONS
1490 case 2: /* my_exit() */
1491 while (PL_scopestack_ix > oldscope)
1494 PL_curstash = PL_defstash;
1495 if (!(PL_exit_flags & PERL_EXIT_DESTRUCT_END) &&
1496 PL_endav && !PL_minus_c)
1497 call_list(oldscope, PL_endav);
1499 if (PerlEnv_getenv("PERL_DEBUG_MSTATS"))
1500 dump_mstats("after execution: ");
1502 ret = STATUS_NATIVE_EXPORT;
1506 POPSTACK_TO(PL_mainstack);
1509 PerlIO_printf(Perl_error_log, "panic: restartop\n");
1519 #ifdef PERL_FLEXIBLE_EXCEPTIONS
1521 S_vrun_body(pTHX_ va_list args)
1523 I32 oldscope = va_arg(args, I32);
1525 return run_body(oldscope);
1531 S_run_body(pTHX_ I32 oldscope)
1533 DEBUG_r(PerlIO_printf(Perl_debug_log, "%s $` $& $' support.\n",
1534 PL_sawampersand ? "Enabling" : "Omitting"));
1536 if (!PL_restartop) {
1537 DEBUG_x(dump_all());
1538 DEBUG(PerlIO_printf(Perl_debug_log, "\nEXECUTING...\n\n"));
1539 DEBUG_S(PerlIO_printf(Perl_debug_log, "main thread is 0x%"UVxf"\n",
1543 #ifdef MACOS_TRADITIONAL
1544 PerlIO_printf(Perl_error_log, "%s%s syntax OK\n",
1545 (gMacPerl_ErrorFormat ? "# " : ""),
1546 MacPerl_MPWFileName(PL_origfilename));
1548 PerlIO_printf(Perl_error_log, "%s syntax OK\n", PL_origfilename);
1552 if (PERLDB_SINGLE && PL_DBsingle)
1553 sv_setiv(PL_DBsingle, 1);
1555 call_list(oldscope, PL_initav);
1561 PL_op = PL_restartop;
1565 else if (PL_main_start) {
1566 CvDEPTH(PL_main_cv) = 1;
1567 PL_op = PL_main_start;
1577 =head1 SV Manipulation Functions
1579 =for apidoc p||get_sv
1581 Returns the SV of the specified Perl scalar. If C<create> is set and the
1582 Perl variable does not exist then it will be created. If C<create> is not
1583 set and the variable does not exist then NULL is returned.
1589 Perl_get_sv(pTHX_ const char *name, I32 create)
1592 #ifdef USE_5005THREADS
1593 if (name[1] == '\0' && !isALPHA(name[0])) {
1594 PADOFFSET tmp = find_threadsv(name);
1595 if (tmp != NOT_IN_PAD)
1596 return THREADSV(tmp);
1598 #endif /* USE_5005THREADS */
1599 gv = gv_fetchpv(name, create, SVt_PV);
1606 =head1 Array Manipulation Functions
1608 =for apidoc p||get_av
1610 Returns the AV of the specified Perl array. If C<create> is set and the
1611 Perl variable does not exist then it will be created. If C<create> is not
1612 set and the variable does not exist then NULL is returned.
1618 Perl_get_av(pTHX_ const char *name, I32 create)
1620 GV* gv = gv_fetchpv(name, create, SVt_PVAV);
1629 =head1 Hash Manipulation Functions
1631 =for apidoc p||get_hv
1633 Returns the HV of the specified Perl hash. If C<create> is set and the
1634 Perl variable does not exist then it will be created. If C<create> is not
1635 set and the variable does not exist then NULL is returned.
1641 Perl_get_hv(pTHX_ const char *name, I32 create)
1643 GV* gv = gv_fetchpv(name, create, SVt_PVHV);
1652 =head1 CV Manipulation Functions
1654 =for apidoc p||get_cv
1656 Returns the CV of the specified Perl subroutine. If C<create> is set and
1657 the Perl subroutine does not exist then it will be declared (which has the
1658 same effect as saying C<sub name;>). If C<create> is not set and the
1659 subroutine does not exist then NULL is returned.
1665 Perl_get_cv(pTHX_ const char *name, I32 create)
1667 GV* gv = gv_fetchpv(name, create, SVt_PVCV);
1668 /* XXX unsafe for threads if eval_owner isn't held */
1669 /* XXX this is probably not what they think they're getting.
1670 * It has the same effect as "sub name;", i.e. just a forward
1672 if (create && !GvCVu(gv))
1673 return newSUB(start_subparse(FALSE, 0),
1674 newSVOP(OP_CONST, 0, newSVpv(name,0)),
1682 /* Be sure to refetch the stack pointer after calling these routines. */
1686 =head1 Callback Functions
1688 =for apidoc p||call_argv
1690 Performs a callback to the specified Perl sub. See L<perlcall>.
1696 Perl_call_argv(pTHX_ const char *sub_name, I32 flags, register char **argv)
1698 /* See G_* flags in cop.h */
1699 /* null terminated arg list */
1706 XPUSHs(sv_2mortal(newSVpv(*argv,0)));
1711 return call_pv(sub_name, flags);
1715 =for apidoc p||call_pv
1717 Performs a callback to the specified Perl sub. See L<perlcall>.
1723 Perl_call_pv(pTHX_ const char *sub_name, I32 flags)
1724 /* name of the subroutine */
1725 /* See G_* flags in cop.h */
1727 return call_sv((SV*)get_cv(sub_name, TRUE), flags);
1731 =for apidoc p||call_method
1733 Performs a callback to the specified Perl method. The blessed object must
1734 be on the stack. See L<perlcall>.
1740 Perl_call_method(pTHX_ const char *methname, I32 flags)
1741 /* name of the subroutine */
1742 /* See G_* flags in cop.h */
1744 return call_sv(sv_2mortal(newSVpv(methname,0)), flags | G_METHOD);
1747 /* May be called with any of a CV, a GV, or an SV containing the name. */
1749 =for apidoc p||call_sv
1751 Performs a callback to the Perl sub whose name is in the SV. See
1758 Perl_call_sv(pTHX_ SV *sv, I32 flags)
1759 /* See G_* flags in cop.h */
1762 LOGOP myop; /* fake syntax tree node */
1765 volatile I32 retval = 0;
1767 bool oldcatch = CATCH_GET;
1772 if (flags & G_DISCARD) {
1777 Zero(&myop, 1, LOGOP);
1778 myop.op_next = Nullop;
1779 if (!(flags & G_NOARGS))
1780 myop.op_flags |= OPf_STACKED;
1781 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1782 (flags & G_ARRAY) ? OPf_WANT_LIST :
1787 EXTEND(PL_stack_sp, 1);
1788 *++PL_stack_sp = sv;
1790 oldscope = PL_scopestack_ix;
1792 if (PERLDB_SUB && PL_curstash != PL_debstash
1793 /* Handle first BEGIN of -d. */
1794 && (PL_DBcv || (PL_DBcv = GvCV(PL_DBsub)))
1795 /* Try harder, since this may have been a sighandler, thus
1796 * curstash may be meaningless. */
1797 && (SvTYPE(sv) != SVt_PVCV || CvSTASH((CV*)sv) != PL_debstash)
1798 && !(flags & G_NODEBUG))
1799 PL_op->op_private |= OPpENTERSUB_DB;
1801 if (flags & G_METHOD) {
1802 Zero(&method_op, 1, UNOP);
1803 method_op.op_next = PL_op;
1804 method_op.op_ppaddr = PL_ppaddr[OP_METHOD];
1805 myop.op_ppaddr = PL_ppaddr[OP_ENTERSUB];
1806 PL_op = (OP*)&method_op;
1809 if (!(flags & G_EVAL)) {
1811 call_body((OP*)&myop, FALSE);
1812 retval = PL_stack_sp - (PL_stack_base + oldmark);
1813 CATCH_SET(oldcatch);
1816 myop.op_other = (OP*)&myop;
1818 /* we're trying to emulate pp_entertry() here */
1820 register PERL_CONTEXT *cx;
1821 I32 gimme = GIMME_V;
1826 push_return(Nullop);
1827 PUSHBLOCK(cx, (CXt_EVAL|CXp_TRYBLOCK), PL_stack_sp);
1829 PL_eval_root = PL_op; /* Only needed so that goto works right. */
1831 PL_in_eval = EVAL_INEVAL;
1832 if (flags & G_KEEPERR)
1833 PL_in_eval |= EVAL_KEEPERR;
1839 #ifdef PERL_FLEXIBLE_EXCEPTIONS
1841 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vcall_body),
1848 #ifndef PERL_FLEXIBLE_EXCEPTIONS
1850 call_body((OP*)&myop, FALSE);
1852 retval = PL_stack_sp - (PL_stack_base + oldmark);
1853 if (!(flags & G_KEEPERR))
1860 /* my_exit() was called */
1861 PL_curstash = PL_defstash;
1864 if (PL_statusvalue && !(PL_exit_flags & PERL_EXIT_EXPECTED))
1865 Perl_croak(aTHX_ "Callback called exit");
1870 PL_op = PL_restartop;
1874 PL_stack_sp = PL_stack_base + oldmark;
1875 if (flags & G_ARRAY)
1879 *++PL_stack_sp = &PL_sv_undef;
1884 if (PL_scopestack_ix > oldscope) {
1888 register PERL_CONTEXT *cx;
1900 if (flags & G_DISCARD) {
1901 PL_stack_sp = PL_stack_base + oldmark;
1910 #ifdef PERL_FLEXIBLE_EXCEPTIONS
1912 S_vcall_body(pTHX_ va_list args)
1914 OP *myop = va_arg(args, OP*);
1915 int is_eval = va_arg(args, int);
1917 call_body(myop, is_eval);
1923 S_call_body(pTHX_ OP *myop, int is_eval)
1925 if (PL_op == myop) {
1927 PL_op = Perl_pp_entereval(aTHX); /* this doesn't do a POPMARK */
1929 PL_op = Perl_pp_entersub(aTHX); /* this does */
1935 /* Eval a string. The G_EVAL flag is always assumed. */
1938 =for apidoc p||eval_sv
1940 Tells Perl to C<eval> the string in the SV.
1946 Perl_eval_sv(pTHX_ SV *sv, I32 flags)
1948 /* See G_* flags in cop.h */
1951 UNOP myop; /* fake syntax tree node */
1952 volatile I32 oldmark = SP - PL_stack_base;
1953 volatile I32 retval = 0;
1959 if (flags & G_DISCARD) {
1966 Zero(PL_op, 1, UNOP);
1967 EXTEND(PL_stack_sp, 1);
1968 *++PL_stack_sp = sv;
1969 oldscope = PL_scopestack_ix;
1971 if (!(flags & G_NOARGS))
1972 myop.op_flags = OPf_STACKED;
1973 myop.op_next = Nullop;
1974 myop.op_type = OP_ENTEREVAL;
1975 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1976 (flags & G_ARRAY) ? OPf_WANT_LIST :
1978 if (flags & G_KEEPERR)
1979 myop.op_flags |= OPf_SPECIAL;
1981 #ifdef PERL_FLEXIBLE_EXCEPTIONS
1983 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vcall_body),
1990 #ifndef PERL_FLEXIBLE_EXCEPTIONS
1992 call_body((OP*)&myop,TRUE);
1994 retval = PL_stack_sp - (PL_stack_base + oldmark);
1995 if (!(flags & G_KEEPERR))
2002 /* my_exit() was called */
2003 PL_curstash = PL_defstash;
2006 if (PL_statusvalue && !(PL_exit_flags & PERL_EXIT_EXPECTED))
2007 Perl_croak(aTHX_ "Callback called exit");
2012 PL_op = PL_restartop;
2016 PL_stack_sp = PL_stack_base + oldmark;
2017 if (flags & G_ARRAY)
2021 *++PL_stack_sp = &PL_sv_undef;
2027 if (flags & G_DISCARD) {
2028 PL_stack_sp = PL_stack_base + oldmark;
2038 =for apidoc p||eval_pv
2040 Tells Perl to C<eval> the given string and return an SV* result.
2046 Perl_eval_pv(pTHX_ const char *p, I32 croak_on_error)
2049 SV* sv = newSVpv(p, 0);
2051 eval_sv(sv, G_SCALAR);
2058 if (croak_on_error && SvTRUE(ERRSV)) {
2060 Perl_croak(aTHX_ SvPVx(ERRSV, n_a));
2066 /* Require a module. */
2069 =head1 Embedding Functions
2071 =for apidoc p||require_pv
2073 Tells Perl to C<require> the file named by the string argument. It is
2074 analogous to the Perl code C<eval "require '$file'">. It's even
2075 implemented that way; consider using Perl_load_module instead.
2080 Perl_require_pv(pTHX_ const char *pv)
2084 PUSHSTACKi(PERLSI_REQUIRE);
2086 sv = sv_newmortal();
2087 sv_setpv(sv, "require '");
2090 eval_sv(sv, G_DISCARD);
2096 Perl_magicname(pTHX_ char *sym, char *name, I32 namlen)
2100 if ((gv = gv_fetchpv(sym,TRUE, SVt_PV)))
2101 sv_magic(GvSV(gv), (SV*)gv, PERL_MAGIC_sv, name, namlen);
2105 S_usage(pTHX_ char *name) /* XXX move this out into a module ? */
2107 /* This message really ought to be max 23 lines.
2108 * Removed -h because the user already knows that option. Others? */
2110 static char *usage_msg[] = {
2111 "-0[octal] specify record separator (\\0, if no argument)",
2112 "-a autosplit mode with -n or -p (splits $_ into @F)",
2113 "-C enable native wide character system interfaces",
2114 "-c check syntax only (runs BEGIN and CHECK blocks)",
2115 "-d[:debugger] run program under debugger",
2116 "-D[number/list] set debugging flags (argument is a bit mask or alphabets)",
2117 "-e 'command' one line of program (several -e's allowed, omit programfile)",
2118 "-F/pattern/ split() pattern for -a switch (//'s are optional)",
2119 "-i[extension] edit <> files in place (makes backup if extension supplied)",
2120 "-Idirectory specify @INC/#include directory (several -I's allowed)",
2121 "-l[octal] enable line ending processing, specifies line terminator",
2122 "-[mM][-]module execute `use/no module...' before executing program",
2123 "-n assume 'while (<>) { ... }' loop around program",
2124 "-p assume loop like -n but print line also, like sed",
2125 "-P run program through C preprocessor before compilation",
2126 "-s enable rudimentary parsing for switches after programfile",
2127 "-S look for programfile using PATH environment variable",
2128 "-T enable tainting checks",
2129 "-t enable tainting warnings",
2130 "-u dump core after parsing program",
2131 "-U allow unsafe operations",
2132 "-v print version, subversion (includes VERY IMPORTANT perl info)",
2133 "-V[:variable] print configuration summary (or a single Config.pm variable)",
2134 "-w enable many useful warnings (RECOMMENDED)",
2135 "-W enable all warnings",
2136 "-X disable all warnings",
2137 "-x[directory] strip off text before #!perl line and perhaps cd to directory",
2141 char **p = usage_msg;
2143 PerlIO_printf(PerlIO_stdout(),
2144 "\nUsage: %s [switches] [--] [programfile] [arguments]",
2147 PerlIO_printf(PerlIO_stdout(), "\n %s", *p++);
2150 /* This routine handles any switches that can be given during run */
2153 Perl_moreswitches(pTHX_ char *s)
2163 rschar = (U32)grok_oct(s, &numlen, &flags, NULL);
2164 SvREFCNT_dec(PL_rs);
2165 if (rschar & ~((U8)~0))
2166 PL_rs = &PL_sv_undef;
2167 else if (!rschar && numlen >= 2)
2168 PL_rs = newSVpvn("", 0);
2170 char ch = (char)rschar;
2171 PL_rs = newSVpvn(&ch, 1);
2177 PL_unicode = parse_unicode_opts(&s);
2182 while (*s && !isSPACE(*s)) ++s;
2184 PL_splitstr = savepv(PL_splitstr);
2197 /* The following permits -d:Mod to accepts arguments following an =
2198 in the fashion that -MSome::Mod does. */
2199 if (*s == ':' || *s == '=') {
2202 sv = newSVpv("use Devel::", 0);
2204 /* We now allow -d:Module=Foo,Bar */
2205 while(isALNUM(*s) || *s==':') ++s;
2207 sv_catpv(sv, start);
2209 sv_catpvn(sv, start, s-start);
2210 sv_catpv(sv, " split(/,/,q{");
2215 my_setenv("PERL5DB", SvPV(sv, PL_na));
2218 PL_perldb = PERLDB_ALL;
2226 if (isALPHA(s[1])) {
2227 /* if adding extra options, remember to update DEBUG_MASK */
2228 static char debopts[] = "psltocPmfrxu HXDSTRJvC";
2231 for (s++; *s && (d = strchr(debopts,*s)); s++)
2232 PL_debug |= 1 << (d - debopts);
2235 PL_debug = atoi(s+1);
2236 for (s++; isDIGIT(*s); s++) ;
2239 if (DEBUG_p_TEST_ && ckWARN_d(WARN_DEBUGGING))
2240 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
2241 "-Dp not implemented on this platform\n");
2243 PL_debug |= DEBUG_TOP_FLAG;
2244 #else /* !DEBUGGING */
2245 if (ckWARN_d(WARN_DEBUGGING))
2246 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
2247 "Recompile perl with -DDEBUGGING to use -D switch\n");
2248 for (s++; isALNUM(*s); s++) ;
2254 usage(PL_origargv[0]);
2258 Safefree(PL_inplace);
2259 #if defined(__CYGWIN__) /* do backup extension automagically */
2260 if (*(s+1) == '\0') {
2261 PL_inplace = savepv(".bak");
2264 #endif /* __CYGWIN__ */
2265 PL_inplace = savepv(s+1);
2267 for (s = PL_inplace; *s && !isSPACE(*s); s++) ;
2270 if (*s == '-') /* Additional switches on #! line. */
2274 case 'I': /* -I handled both here and in parse_body() */
2277 while (*s && isSPACE(*s))
2282 /* ignore trailing spaces (possibly followed by other switches) */
2284 for (e = p; *e && !isSPACE(*e); e++) ;
2288 } while (*p && *p != '-');
2289 e = savepvn(s, e-s);
2290 incpush(e, TRUE, TRUE, FALSE);
2297 Perl_croak(aTHX_ "No directory specified for -I");
2303 SvREFCNT_dec(PL_ors_sv);
2308 PL_ors_sv = newSVpvn("\n",1);
2309 numlen = 3 + (*s == '0');
2310 *SvPVX(PL_ors_sv) = (char)grok_oct(s, &numlen, &flags, NULL);
2314 if (RsPARA(PL_rs)) {
2315 PL_ors_sv = newSVpvn("\n\n",2);
2318 PL_ors_sv = newSVsv(PL_rs);
2323 forbid_setid("-M"); /* XXX ? */
2326 forbid_setid("-m"); /* XXX ? */
2331 /* -M-foo == 'no foo' */
2332 if (*s == '-') { use = "no "; ++s; }
2333 sv = newSVpv(use,0);
2335 /* We allow -M'Module qw(Foo Bar)' */
2336 while(isALNUM(*s) || *s==':') ++s;
2338 sv_catpv(sv, start);
2339 if (*(start-1) == 'm') {
2341 Perl_croak(aTHX_ "Can't use '%c' after -mname", *s);
2342 sv_catpv( sv, " ()");
2346 Perl_croak(aTHX_ "Module name required with -%c option",
2348 sv_catpvn(sv, start, s-start);
2349 sv_catpv(sv, " split(/,/,q{");
2355 PL_preambleav = newAV();
2356 av_push(PL_preambleav, sv);
2359 Perl_croak(aTHX_ "No space allowed after -%c", *(s-1));
2371 PL_doswitches = TRUE;
2376 Perl_croak(aTHX_ "Too late for \"-t\" option");
2381 Perl_croak(aTHX_ "Too late for \"-T\" option");
2385 #ifdef MACOS_TRADITIONAL
2386 Perl_croak(aTHX_ "Believe me, you don't want to use \"-u\" on a Macintosh");
2388 PL_do_undump = TRUE;
2397 PerlIO_printf(PerlIO_stdout(),
2398 Perl_form(aTHX_ "\nThis is perl, v%"VDf" built for %s",
2399 PL_patchlevel, ARCHNAME));
2401 /* Adjust verbose output as in the perl that ships with the DG/UX OS from EMC */
2402 PerlIO_printf(PerlIO_stdout(),
2403 Perl_form(aTHX_ "\nThis is perl, version %vd\n", PL_patchlevel));
2404 PerlIO_printf(PerlIO_stdout(),
2405 Perl_form(aTHX_ " built under %s at %s %s\n",
2406 OSNAME, __DATE__, __TIME__));
2407 PerlIO_printf(PerlIO_stdout(),
2408 Perl_form(aTHX_ " OS Specific Release: %s\n",
2412 #if defined(LOCAL_PATCH_COUNT)
2413 if (LOCAL_PATCH_COUNT > 0)
2414 PerlIO_printf(PerlIO_stdout(),
2415 "\n(with %d registered patch%s, "
2416 "see perl -V for more detail)",
2417 (int)LOCAL_PATCH_COUNT,
2418 (LOCAL_PATCH_COUNT!=1) ? "es" : "");
2421 PerlIO_printf(PerlIO_stdout(),
2422 "\n\nCopyright 1987-2002, Larry Wall\n");
2423 #ifdef MACOS_TRADITIONAL
2424 PerlIO_printf(PerlIO_stdout(),
2425 "\nMac OS port Copyright 1991-2002, Matthias Neeracher;\n"
2426 "maintained by Chris Nandor\n");
2429 PerlIO_printf(PerlIO_stdout(),
2430 "\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
2433 PerlIO_printf(PerlIO_stdout(),
2434 "djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n"
2435 "djgpp v2 port (perl5004+) by Laszlo Molnar, 1997-1999\n");
2438 PerlIO_printf(PerlIO_stdout(),
2439 "\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
2440 "Version 5 port Copyright (c) 1994-2002, Andreas Kaiser, Ilya Zakharevich\n");
2443 PerlIO_printf(PerlIO_stdout(),
2444 "atariST series port, ++jrb bammi@cadence.com\n");
2447 PerlIO_printf(PerlIO_stdout(),
2448 "BeOS port Copyright Tom Spindler, 1997-1999\n");
2451 PerlIO_printf(PerlIO_stdout(),
2452 "MPE/iX port Copyright by Mark Klein and Mark Bixby, 1996-2002\n");
2455 PerlIO_printf(PerlIO_stdout(),
2456 "MVS (OS390) port by Mortice Kern Systems, 1997-1999\n");
2459 PerlIO_printf(PerlIO_stdout(),
2460 "Stratus VOS port by Paul.Green@stratus.com, 1997-2002\n");
2463 PerlIO_printf(PerlIO_stdout(),
2464 "VM/ESA port by Neale Ferguson, 1998-1999\n");
2467 PerlIO_printf(PerlIO_stdout(),
2468 "BS2000 (POSIX) port by Start Amadeus GmbH, 1998-1999\n");
2471 PerlIO_printf(PerlIO_stdout(),
2472 "MiNT port by Guido Flohr, 1997-1999\n");
2475 PerlIO_printf(PerlIO_stdout(),
2476 "EPOC port by Olaf Flebbe, 1999-2002\n");
2479 printf("WINCE port by Rainer Keuchel, 2001-2002\n");
2480 printf("Built on " __DATE__ " " __TIME__ "\n\n");
2483 #ifdef BINARY_BUILD_NOTICE
2484 BINARY_BUILD_NOTICE;
2486 PerlIO_printf(PerlIO_stdout(),
2488 Perl may be copied only under the terms of either the Artistic License or the\n\
2489 GNU General Public License, which may be found in the Perl 5 source kit.\n\n\
2490 Complete documentation for Perl, including FAQ lists, should be found on\n\
2491 this system using `man perl' or `perldoc perl'. If you have access to the\n\
2492 Internet, point your browser at http://www.perl.com/, the Perl Home Page.\n\n");
2495 if (! (PL_dowarn & G_WARN_ALL_MASK))
2496 PL_dowarn |= G_WARN_ON;
2500 PL_dowarn = G_WARN_ALL_ON|G_WARN_ON;
2501 if (!specialWARN(PL_compiling.cop_warnings))
2502 SvREFCNT_dec(PL_compiling.cop_warnings);
2503 PL_compiling.cop_warnings = pWARN_ALL ;
2507 PL_dowarn = G_WARN_ALL_OFF;
2508 if (!specialWARN(PL_compiling.cop_warnings))
2509 SvREFCNT_dec(PL_compiling.cop_warnings);
2510 PL_compiling.cop_warnings = pWARN_NONE ;
2515 if (s[1] == '-') /* Additional switches on #! line. */
2520 #if defined(WIN32) || !defined(PERL_STRICT_CR)
2526 #ifdef ALTERNATE_SHEBANG
2527 case 'S': /* OS/2 needs -S on "extproc" line. */
2535 Perl_croak(aTHX_ "Can't emulate -%.1s on #! line",s);
2540 /* compliments of Tom Christiansen */
2542 /* unexec() can be found in the Gnu emacs distribution */
2543 /* Known to work with -DUNEXEC and using unexelf.c from GNU emacs-20.2 */
2546 Perl_my_unexec(pTHX)
2554 prog = newSVpv(BIN_EXP, 0);
2555 sv_catpv(prog, "/perl");
2556 file = newSVpv(PL_origfilename, 0);
2557 sv_catpv(file, ".perldump");
2559 unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
2560 /* unexec prints msg to stderr in case of failure */
2561 PerlProc_exit(status);
2564 # include <lib$routines.h>
2565 lib$signal(SS$_DEBUG); /* ssdef.h #included from vmsish.h */
2567 ABORT(); /* for use with undump */
2572 /* initialize curinterp */
2578 # define PERLVAR(var,type)
2579 # define PERLVARA(var,n,type)
2580 # if defined(PERL_IMPLICIT_CONTEXT)
2581 # if defined(USE_5005THREADS)
2582 # define PERLVARI(var,type,init) PERL_GET_INTERP->var = init;
2583 # define PERLVARIC(var,type,init) PERL_GET_INTERP->var = init;
2584 # else /* !USE_5005THREADS */
2585 # define PERLVARI(var,type,init) aTHX->var = init;
2586 # define PERLVARIC(var,type,init) aTHX->var = init;
2587 # endif /* USE_5005THREADS */
2589 # define PERLVARI(var,type,init) PERL_GET_INTERP->var = init;
2590 # define PERLVARIC(var,type,init) PERL_GET_INTERP->var = init;
2592 # include "intrpvar.h"
2593 # ifndef USE_5005THREADS
2594 # include "thrdvar.h"
2601 # define PERLVAR(var,type)
2602 # define PERLVARA(var,n,type)
2603 # define PERLVARI(var,type,init) PL_##var = init;
2604 # define PERLVARIC(var,type,init) PL_##var = init;
2605 # include "intrpvar.h"
2606 # ifndef USE_5005THREADS
2607 # include "thrdvar.h"
2618 S_init_main_stash(pTHX)
2622 PL_curstash = PL_defstash = newHV();
2623 PL_curstname = newSVpvn("main",4);
2624 gv = gv_fetchpv("main::",TRUE, SVt_PVHV);
2625 SvREFCNT_dec(GvHV(gv));
2626 GvHV(gv) = (HV*)SvREFCNT_inc(PL_defstash);
2628 HvNAME(PL_defstash) = savepv("main");
2629 PL_incgv = gv_HVadd(gv_AVadd(gv_fetchpv("INC",TRUE, SVt_PVAV)));
2630 GvMULTI_on(PL_incgv);
2631 PL_hintgv = gv_fetchpv("\010",TRUE, SVt_PV); /* ^H */
2632 GvMULTI_on(PL_hintgv);
2633 PL_defgv = gv_fetchpv("_",TRUE, SVt_PVAV);
2634 PL_errgv = gv_HVadd(gv_fetchpv("@", TRUE, SVt_PV));
2635 GvMULTI_on(PL_errgv);
2636 PL_replgv = gv_fetchpv("\022", TRUE, SVt_PV); /* ^R */
2637 GvMULTI_on(PL_replgv);
2638 (void)Perl_form(aTHX_ "%240s",""); /* Preallocate temp - for immediate signals. */
2639 sv_grow(ERRSV, 240); /* Preallocate - for immediate signals. */
2640 sv_setpvn(ERRSV, "", 0);
2641 PL_curstash = PL_defstash;
2642 CopSTASH_set(&PL_compiling, PL_defstash);
2643 PL_debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
2644 PL_globalstash = GvHV(gv_fetchpv("CORE::GLOBAL::", GV_ADDMULTI, SVt_PVHV));
2645 /* We must init $/ before switches are processed. */
2646 sv_setpvn(get_sv("/", TRUE), "\n", 1);
2650 S_open_script(pTHX_ char *scriptname, bool dosearch, SV *sv, int *fdscript)
2654 char *cpp_discard_flag;
2660 PL_origfilename = savepv("-e");
2663 /* if find_script() returns, it returns a malloc()-ed value */
2664 PL_origfilename = scriptname = find_script(scriptname, dosearch, NULL, 1);
2666 if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
2667 char *s = scriptname + 8;
2668 *fdscript = atoi(s);
2672 scriptname = savepv(s + 1);
2673 Safefree(PL_origfilename);
2674 PL_origfilename = scriptname;
2679 CopFILE_free(PL_curcop);
2680 CopFILE_set(PL_curcop, PL_origfilename);
2681 if (strEQ(PL_origfilename,"-"))
2683 if (*fdscript >= 0) {
2684 PL_rsfp = PerlIO_fdopen(*fdscript,PERL_SCRIPT_MODE);
2685 # if defined(HAS_FCNTL) && defined(F_SETFD)
2687 /* ensure close-on-exec */
2688 fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,1);
2691 else if (PL_preprocess) {
2692 char *cpp_cfg = CPPSTDIN;
2693 SV *cpp = newSVpvn("",0);
2694 SV *cmd = NEWSV(0,0);
2696 if (strEQ(cpp_cfg, "cppstdin"))
2697 Perl_sv_catpvf(aTHX_ cpp, "%s/", BIN_EXP);
2698 sv_catpv(cpp, cpp_cfg);
2701 sv_catpvn(sv, "-I", 2);
2702 sv_catpv(sv,PRIVLIB_EXP);
2705 DEBUG_P(PerlIO_printf(Perl_debug_log,
2706 "PL_preprocess: scriptname=\"%s\", cpp=\"%s\", sv=\"%s\", CPPMINUS=\"%s\"\n",
2707 scriptname, SvPVX (cpp), SvPVX (sv), CPPMINUS));
2709 # if defined(MSDOS) || defined(WIN32) || defined(VMS)
2716 cpp_discard_flag = "";
2718 cpp_discard_flag = "-C";
2722 perl = os2_execname(aTHX);
2724 perl = PL_origargv[0];
2728 /* This strips off Perl comments which might interfere with
2729 the C pre-processor, including #!. #line directives are
2730 deliberately stripped to avoid confusion with Perl's version
2731 of #line. FWP played some golf with it so it will fit
2732 into VMS's 255 character buffer.
2735 code = "(1../^#!.*perl/i)|/^\\s*#(?!\\s*((ifn?|un)def|(el|end)?if|define|include|else|error|pragma)\\b)/||!($|=1)||print";
2737 code = "/^\\s*#(?!\\s*((ifn?|un)def|(el|end)?if|define|include|else|error|pragma)\\b)/||!($|=1)||print";
2739 Perl_sv_setpvf(aTHX_ cmd, "\
2740 %s -ne%s%s%s %s | %"SVf" %s %"SVf" %s",
2741 perl, quote, code, quote, scriptname, cpp,
2742 cpp_discard_flag, sv, CPPMINUS);
2744 PL_doextract = FALSE;
2745 # ifdef IAMSUID /* actually, this is caught earlier */
2746 if (PL_euid != PL_uid && !PL_euid) { /* if running suidperl */
2748 (void)seteuid(PL_uid); /* musn't stay setuid root */
2750 # ifdef HAS_SETREUID
2751 (void)setreuid((Uid_t)-1, PL_uid);
2753 # ifdef HAS_SETRESUID
2754 (void)setresuid((Uid_t)-1, PL_uid, (Uid_t)-1);
2756 PerlProc_setuid(PL_uid);
2760 if (PerlProc_geteuid() != PL_uid)
2761 Perl_croak(aTHX_ "Can't do seteuid!\n");
2763 # endif /* IAMSUID */
2765 DEBUG_P(PerlIO_printf(Perl_debug_log,
2766 "PL_preprocess: cmd=\"%s\"\n",
2769 PL_rsfp = PerlProc_popen(SvPVX(cmd), "r");
2773 else if (!*scriptname) {
2774 forbid_setid("program input from stdin");
2775 PL_rsfp = PerlIO_stdin();
2778 PL_rsfp = PerlIO_open(scriptname,PERL_SCRIPT_MODE);
2779 # if defined(HAS_FCNTL) && defined(F_SETFD)
2781 /* ensure close-on-exec */
2782 fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,1);
2787 # ifndef IAMSUID /* in case script is not readable before setuid */
2789 PerlLIO_stat(CopFILE(PL_curcop),&PL_statbuf) >= 0 &&
2790 PL_statbuf.st_mode & (S_ISUID|S_ISGID))
2793 PerlProc_execv(Perl_form(aTHX_ "%s/sperl"PERL_FS_VER_FMT,
2794 BIN_EXP, (int)PERL_REVISION,
2796 (int)PERL_SUBVERSION), PL_origargv);
2797 Perl_croak(aTHX_ "Can't do setuid\n");
2803 Perl_croak(aTHX_ "Can't open perl script: %s\n",
2806 Perl_croak(aTHX_ "Can't open perl script \"%s\": %s\n",
2807 CopFILE(PL_curcop), Strerror(errno));
2813 * I_SYSSTATVFS HAS_FSTATVFS
2815 * I_STATFS HAS_FSTATFS HAS_GETFSSTAT
2816 * I_MNTENT HAS_GETMNTENT HAS_HASMNTOPT
2817 * here so that metaconfig picks them up. */
2821 S_fd_on_nosuid_fs(pTHX_ int fd)
2823 int check_okay = 0; /* able to do all the required sys/libcalls */
2824 int on_nosuid = 0; /* the fd is on a nosuid fs */
2826 * Preferred order: fstatvfs(), fstatfs(), ustat()+getmnt(), getmntent().
2827 * fstatvfs() is UNIX98.
2828 * fstatfs() is 4.3 BSD.
2829 * ustat()+getmnt() is pre-4.3 BSD.
2830 * getmntent() is O(number-of-mounted-filesystems) and can hang on
2831 * an irrelevant filesystem while trying to reach the right one.
2834 #undef FD_ON_NOSUID_CHECK_OKAY /* found the syscalls to do the check? */
2836 # if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
2837 defined(HAS_FSTATVFS)
2838 # define FD_ON_NOSUID_CHECK_OKAY
2839 struct statvfs stfs;
2841 check_okay = fstatvfs(fd, &stfs) == 0;
2842 on_nosuid = check_okay && (stfs.f_flag & ST_NOSUID);
2843 # endif /* fstatvfs */
2845 # if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
2846 defined(PERL_MOUNT_NOSUID) && \
2847 defined(HAS_FSTATFS) && \
2848 defined(HAS_STRUCT_STATFS) && \
2849 defined(HAS_STRUCT_STATFS_F_FLAGS)
2850 # define FD_ON_NOSUID_CHECK_OKAY
2853 check_okay = fstatfs(fd, &stfs) == 0;
2854 on_nosuid = check_okay && (stfs.f_flags & PERL_MOUNT_NOSUID);
2855 # endif /* fstatfs */
2857 # if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
2858 defined(PERL_MOUNT_NOSUID) && \
2859 defined(HAS_FSTAT) && \
2860 defined(HAS_USTAT) && \
2861 defined(HAS_GETMNT) && \
2862 defined(HAS_STRUCT_FS_DATA) && \
2864 # define FD_ON_NOSUID_CHECK_OKAY
2867 if (fstat(fd, &fdst) == 0) {
2869 if (ustat(fdst.st_dev, &us) == 0) {
2871 /* NOSTAT_ONE here because we're not examining fields which
2872 * vary between that case and STAT_ONE. */
2873 if (getmnt((int*)0, &fsd, (int)0, NOSTAT_ONE, us.f_fname) == 0) {
2874 size_t cmplen = sizeof(us.f_fname);
2875 if (sizeof(fsd.fd_req.path) < cmplen)
2876 cmplen = sizeof(fsd.fd_req.path);
2877 if (strnEQ(fsd.fd_req.path, us.f_fname, cmplen) &&
2878 fdst.st_dev == fsd.fd_req.dev) {
2880 on_nosuid = fsd.fd_req.flags & PERL_MOUNT_NOSUID;
2886 # endif /* fstat+ustat+getmnt */
2888 # if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
2889 defined(HAS_GETMNTENT) && \
2890 defined(HAS_HASMNTOPT) && \
2891 defined(MNTOPT_NOSUID)
2892 # define FD_ON_NOSUID_CHECK_OKAY
2893 FILE *mtab = fopen("/etc/mtab", "r");
2894 struct mntent *entry;
2897 if (mtab && (fstat(fd, &stb) == 0)) {
2898 while (entry = getmntent(mtab)) {
2899 if (stat(entry->mnt_dir, &fsb) == 0
2900 && fsb.st_dev == stb.st_dev)
2902 /* found the filesystem */
2904 if (hasmntopt(entry, MNTOPT_NOSUID))
2907 } /* A single fs may well fail its stat(). */
2912 # endif /* getmntent+hasmntopt */
2915 Perl_croak(aTHX_ "Can't check filesystem of script \"%s\" for nosuid", PL_origfilename);
2918 #endif /* IAMSUID */
2921 S_validate_suid(pTHX_ char *validarg, char *scriptname, int fdscript)
2927 /* do we need to emulate setuid on scripts? */
2929 /* This code is for those BSD systems that have setuid #! scripts disabled
2930 * in the kernel because of a security problem. Merely defining DOSUID
2931 * in perl will not fix that problem, but if you have disabled setuid
2932 * scripts in the kernel, this will attempt to emulate setuid and setgid
2933 * on scripts that have those now-otherwise-useless bits set. The setuid
2934 * root version must be called suidperl or sperlN.NNN. If regular perl
2935 * discovers that it has opened a setuid script, it calls suidperl with
2936 * the same argv that it had. If suidperl finds that the script it has
2937 * just opened is NOT setuid root, it sets the effective uid back to the
2938 * uid. We don't just make perl setuid root because that loses the
2939 * effective uid we had before invoking perl, if it was different from the
2942 * DOSUID must be defined in both perl and suidperl, and IAMSUID must
2943 * be defined in suidperl only. suidperl must be setuid root. The
2944 * Configure script will set this up for you if you want it.
2950 if (PerlLIO_fstat(PerlIO_fileno(PL_rsfp),&PL_statbuf) < 0) /* normal stat is insecure */
2951 Perl_croak(aTHX_ "Can't stat script \"%s\"",PL_origfilename);
2952 if (fdscript < 0 && PL_statbuf.st_mode & (S_ISUID|S_ISGID)) {
2957 #ifndef HAS_SETREUID
2958 /* On this access check to make sure the directories are readable,
2959 * there is actually a small window that the user could use to make
2960 * filename point to an accessible directory. So there is a faint
2961 * chance that someone could execute a setuid script down in a
2962 * non-accessible directory. I don't know what to do about that.
2963 * But I don't think it's too important. The manual lies when
2964 * it says access() is useful in setuid programs.
2966 if (PerlLIO_access(CopFILE(PL_curcop),1)) /*double check*/
2967 Perl_croak(aTHX_ "Permission denied");
2969 /* If we can swap euid and uid, then we can determine access rights
2970 * with a simple stat of the file, and then compare device and
2971 * inode to make sure we did stat() on the same file we opened.
2972 * Then we just have to make sure he or she can execute it.
2979 setreuid(PL_euid,PL_uid) < 0
2982 setresuid(PL_euid,PL_uid,(Uid_t)-1) < 0
2985 || PerlProc_getuid() != PL_euid || PerlProc_geteuid() != PL_uid)
2986 Perl_croak(aTHX_ "Can't swap uid and euid"); /* really paranoid */
2987 if (PerlLIO_stat(CopFILE(PL_curcop),&tmpstatbuf) < 0)
2988 Perl_croak(aTHX_ "Permission denied"); /* testing full pathname here */
2989 #if defined(IAMSUID) && !defined(NO_NOSUID_CHECK)
2990 if (fd_on_nosuid_fs(PerlIO_fileno(PL_rsfp)))
2991 Perl_croak(aTHX_ "Permission denied");
2993 if (tmpstatbuf.st_dev != PL_statbuf.st_dev ||
2994 tmpstatbuf.st_ino != PL_statbuf.st_ino) {
2995 (void)PerlIO_close(PL_rsfp);
2996 Perl_croak(aTHX_ "Permission denied\n");
3000 setreuid(PL_uid,PL_euid) < 0
3002 # if defined(HAS_SETRESUID)
3003 setresuid(PL_uid,PL_euid,(Uid_t)-1) < 0
3006 || PerlProc_getuid() != PL_uid || PerlProc_geteuid() != PL_euid)
3007 Perl_croak(aTHX_ "Can't reswap uid and euid");
3008 if (!cando(S_IXUSR,FALSE,&PL_statbuf)) /* can real uid exec? */
3009 Perl_croak(aTHX_ "Permission denied\n");
3011 #endif /* HAS_SETREUID */
3012 #endif /* IAMSUID */
3014 if (!S_ISREG(PL_statbuf.st_mode))
3015 Perl_croak(aTHX_ "Permission denied");
3016 if (PL_statbuf.st_mode & S_IWOTH)
3017 Perl_croak(aTHX_ "Setuid/gid script is writable by world");
3018 PL_doswitches = FALSE; /* -s is insecure in suid */
3019 CopLINE_inc(PL_curcop);
3020 if (sv_gets(PL_linestr, PL_rsfp, 0) == Nullch ||
3021 strnNE(SvPV(PL_linestr,n_a),"#!",2) ) /* required even on Sys V */
3022 Perl_croak(aTHX_ "No #! line");
3023 s = SvPV(PL_linestr,n_a)+2;
3025 while (!isSPACE(*s)) s++;
3026 for (s2 = s; (s2 > SvPV(PL_linestr,n_a)+2 &&
3027 (isDIGIT(s2[-1]) || strchr("._-", s2[-1]))); s2--) ;
3028 if (strnNE(s2-4,"perl",4) && strnNE(s-9,"perl",4)) /* sanity check */
3029 Perl_croak(aTHX_ "Not a perl script");
3030 while (*s == ' ' || *s == '\t') s++;
3032 * #! arg must be what we saw above. They can invoke it by
3033 * mentioning suidperl explicitly, but they may not add any strange
3034 * arguments beyond what #! says if they do invoke suidperl that way.
3036 len = strlen(validarg);
3037 if (strEQ(validarg," PHOOEY ") ||
3038 strnNE(s,validarg,len) || !isSPACE(s[len]))
3039 Perl_croak(aTHX_ "Args must match #! line");
3042 if (PL_euid != PL_uid && (PL_statbuf.st_mode & S_ISUID) &&
3043 PL_euid == PL_statbuf.st_uid)
3045 Perl_croak(aTHX_ "YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
3046 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
3047 #endif /* IAMSUID */
3049 if (PL_euid) { /* oops, we're not the setuid root perl */
3050 (void)PerlIO_close(PL_rsfp);
3053 PerlProc_execv(Perl_form(aTHX_ "%s/sperl"PERL_FS_VER_FMT, BIN_EXP,
3054 (int)PERL_REVISION, (int)PERL_VERSION,
3055 (int)PERL_SUBVERSION), PL_origargv);
3057 Perl_croak(aTHX_ "Can't do setuid\n");
3060 if (PL_statbuf.st_mode & S_ISGID && PL_statbuf.st_gid != PL_egid) {
3062 (void)setegid(PL_statbuf.st_gid);
3065 (void)setregid((Gid_t)-1,PL_statbuf.st_gid);
3067 #ifdef HAS_SETRESGID
3068 (void)setresgid((Gid_t)-1,PL_statbuf.st_gid,(Gid_t)-1);
3070 PerlProc_setgid(PL_statbuf.st_gid);
3074 if (PerlProc_getegid() != PL_statbuf.st_gid)
3075 Perl_croak(aTHX_ "Can't do setegid!\n");
3077 if (PL_statbuf.st_mode & S_ISUID) {
3078 if (PL_statbuf.st_uid != PL_euid)
3080 (void)seteuid(PL_statbuf.st_uid); /* all that for this */
3083 (void)setreuid((Uid_t)-1,PL_statbuf.st_uid);
3085 #ifdef HAS_SETRESUID
3086 (void)setresuid((Uid_t)-1,PL_statbuf.st_uid,(Uid_t)-1);
3088 PerlProc_setuid(PL_statbuf.st_uid);
3092 if (PerlProc_geteuid() != PL_statbuf.st_uid)
3093 Perl_croak(aTHX_ "Can't do seteuid!\n");
3095 else if (PL_uid) { /* oops, mustn't run as root */
3097 (void)seteuid((Uid_t)PL_uid);
3100 (void)setreuid((Uid_t)-1,(Uid_t)PL_uid);
3102 #ifdef HAS_SETRESUID
3103 (void)setresuid((Uid_t)-1,(Uid_t)PL_uid,(Uid_t)-1);
3105 PerlProc_setuid((Uid_t)PL_uid);
3109 if (PerlProc_geteuid() != PL_uid)
3110 Perl_croak(aTHX_ "Can't do seteuid!\n");
3113 if (!cando(S_IXUSR,TRUE,&PL_statbuf))
3114 Perl_croak(aTHX_ "Permission denied\n"); /* they can't do this */
3117 else if (PL_preprocess)
3118 Perl_croak(aTHX_ "-P not allowed for setuid/setgid script\n");
3119 else if (fdscript >= 0)
3120 Perl_croak(aTHX_ "fd script not allowed in suidperl\n");
3122 Perl_croak(aTHX_ "Script is not setuid/setgid in suidperl\n");
3124 /* We absolutely must clear out any saved ids here, so we */
3125 /* exec the real perl, substituting fd script for scriptname. */
3126 /* (We pass script name as "subdir" of fd, which perl will grok.) */
3127 PerlIO_rewind(PL_rsfp);
3128 PerlLIO_lseek(PerlIO_fileno(PL_rsfp),(Off_t)0,0); /* just in case rewind didn't */
3129 for (which = 1; PL_origargv[which] && PL_origargv[which] != scriptname; which++) ;
3130 if (!PL_origargv[which])
3131 Perl_croak(aTHX_ "Permission denied");
3132 PL_origargv[which] = savepv(Perl_form(aTHX_ "/dev/fd/%d/%s",
3133 PerlIO_fileno(PL_rsfp), PL_origargv[which]));
3134 #if defined(HAS_FCNTL) && defined(F_SETFD)
3135 fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,0); /* ensure no close-on-exec */
3137 PerlProc_execv(Perl_form(aTHX_ "%s/perl"PERL_FS_VER_FMT, BIN_EXP,
3138 (int)PERL_REVISION, (int)PERL_VERSION,
3139 (int)PERL_SUBVERSION), PL_origargv);/* try again */
3140 Perl_croak(aTHX_ "Can't do setuid\n");
3141 #endif /* IAMSUID */
3143 if (PL_euid != PL_uid || PL_egid != PL_gid) { /* (suidperl doesn't exist, in fact) */
3144 #ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
3145 PerlLIO_fstat(PerlIO_fileno(PL_rsfp),&PL_statbuf); /* may be either wrapped or real suid */
3146 if ((PL_euid != PL_uid && PL_euid == PL_statbuf.st_uid && PL_statbuf.st_mode & S_ISUID)
3148 (PL_egid != PL_gid && PL_egid == PL_statbuf.st_gid && PL_statbuf.st_mode & S_ISGID)
3151 Perl_croak(aTHX_ "YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
3152 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
3153 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
3154 /* not set-id, must be wrapped */
3160 S_find_beginning(pTHX)
3162 register char *s, *s2;
3163 #ifdef MACOS_TRADITIONAL
3167 /* skip forward in input to the real script? */
3170 #ifdef MACOS_TRADITIONAL
3171 /* Since the Mac OS does not honor #! arguments for us, we do it ourselves */
3173 while (PL_doextract || gMacPerl_AlwaysExtract) {
3174 if ((s = sv_gets(PL_linestr, PL_rsfp, 0)) == Nullch) {
3175 if (!gMacPerl_AlwaysExtract)
3176 Perl_croak(aTHX_ "No Perl script found in input\n");
3178 if (PL_doextract) /* require explicit override ? */
3179 if (!OverrideExtract(PL_origfilename))
3180 Perl_croak(aTHX_ "User aborted script\n");
3182 PL_doextract = FALSE;
3184 /* Pater peccavi, file does not have #! */
3185 PerlIO_rewind(PL_rsfp);
3190 while (PL_doextract) {
3191 if ((s = sv_gets(PL_linestr, PL_rsfp, 0)) == Nullch)
3192 Perl_croak(aTHX_ "No Perl script found in input\n");
3195 if (*s == '#' && s[1] == '!' && ((s = instr(s,"perl")) || (s = instr(s2,"PERL")))) {
3196 PerlIO_ungetc(PL_rsfp, '\n'); /* to keep line count right */
3197 PL_doextract = FALSE;
3198 while (*s && !(isSPACE (*s) || *s == '#')) s++;
3200 while (*s == ' ' || *s == '\t') s++;
3202 while (isDIGIT(s2[-1]) || strchr("-._", s2[-1])) s2--;
3203 if (strnEQ(s2-4,"perl",4))
3205 while ((s = moreswitches(s)))
3208 #ifdef MACOS_TRADITIONAL
3209 /* We are always searching for the #!perl line in MacPerl,
3210 * so if we find it, still keep the line count correct
3211 * by counting lines we already skipped over
3213 for (; maclines > 0 ; maclines--)
3214 PerlIO_ungetc(PL_rsfp, '\n');
3218 /* gMacPerl_AlwaysExtract is false in MPW tool */
3219 } else if (gMacPerl_AlwaysExtract) {
3230 PL_uid = PerlProc_getuid();
3231 PL_euid = PerlProc_geteuid();
3232 PL_gid = PerlProc_getgid();
3233 PL_egid = PerlProc_getegid();
3235 PL_uid |= PL_gid << 16;
3236 PL_euid |= PL_egid << 16;
3238 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
3242 S_forbid_setid(pTHX_ char *s)
3244 if (PL_euid != PL_uid)
3245 Perl_croak(aTHX_ "No %s allowed while running setuid", s);
3246 if (PL_egid != PL_gid)
3247 Perl_croak(aTHX_ "No %s allowed while running setgid", s);
3251 Perl_init_debugger(pTHX)
3253 HV *ostash = PL_curstash;
3255 PL_curstash = PL_debstash;
3256 PL_dbargs = GvAV(gv_AVadd((gv_fetchpv("args", GV_ADDMULTI, SVt_PVAV))));
3257 AvREAL_off(PL_dbargs);
3258 PL_DBgv = gv_fetchpv("DB", GV_ADDMULTI, SVt_PVGV);
3259 PL_DBline = gv_fetchpv("dbline", GV_ADDMULTI, SVt_PVAV);
3260 PL_DBsub = gv_HVadd(gv_fetchpv("sub", GV_ADDMULTI, SVt_PVHV));
3261 sv_upgrade(GvSV(PL_DBsub), SVt_IV); /* IVX accessed if PERLDB_SUB_NN */
3262 PL_DBsingle = GvSV((gv_fetchpv("single", GV_ADDMULTI, SVt_PV)));
3263 sv_setiv(PL_DBsingle, 0);
3264 PL_DBtrace = GvSV((gv_fetchpv("trace", GV_ADDMULTI, SVt_PV)));
3265 sv_setiv(PL_DBtrace, 0);
3266 PL_DBsignal = GvSV((gv_fetchpv("signal", GV_ADDMULTI, SVt_PV)));
3267 sv_setiv(PL_DBsignal, 0);
3268 PL_curstash = ostash;
3271 #ifndef STRESS_REALLOC
3272 #define REASONABLE(size) (size)
3274 #define REASONABLE(size) (1) /* unreasonable */
3278 Perl_init_stacks(pTHX)
3280 /* start with 128-item stack and 8K cxstack */
3281 PL_curstackinfo = new_stackinfo(REASONABLE(128),
3282 REASONABLE(8192/sizeof(PERL_CONTEXT) - 1));
3283 PL_curstackinfo->si_type = PERLSI_MAIN;
3284 PL_curstack = PL_curstackinfo->si_stack;
3285 PL_mainstack = PL_curstack; /* remember in case we switch stacks */
3287 PL_stack_base = AvARRAY(PL_curstack);
3288 PL_stack_sp = PL_stack_base;
3289 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
3291 New(50,PL_tmps_stack,REASONABLE(128),SV*);
3294 PL_tmps_max = REASONABLE(128);
3296 New(54,PL_markstack,REASONABLE(32),I32);
3297 PL_markstack_ptr = PL_markstack;
3298 PL_markstack_max = PL_markstack + REASONABLE(32);
3302 New(54,PL_scopestack,REASONABLE(32),I32);
3303 PL_scopestack_ix = 0;
3304 PL_scopestack_max = REASONABLE(32);
3306 New(54,PL_savestack,REASONABLE(128),ANY);
3307 PL_savestack_ix = 0;
3308 PL_savestack_max = REASONABLE(128);
3310 New(54,PL_retstack,REASONABLE(16),OP*);
3312 PL_retstack_max = REASONABLE(16);
3320 while (PL_curstackinfo->si_next)
3321 PL_curstackinfo = PL_curstackinfo->si_next;
3322 while (PL_curstackinfo) {
3323 PERL_SI *p = PL_curstackinfo->si_prev;
3324 /* curstackinfo->si_stack got nuked by sv_free_arenas() */
3325 Safefree(PL_curstackinfo->si_cxstack);
3326 Safefree(PL_curstackinfo);
3327 PL_curstackinfo = p;
3329 Safefree(PL_tmps_stack);
3330 Safefree(PL_markstack);
3331 Safefree(PL_scopestack);
3332 Safefree(PL_savestack);
3333 Safefree(PL_retstack);
3342 lex_start(PL_linestr);
3344 PL_subname = newSVpvn("main",4);
3348 S_init_predump_symbols(pTHX)
3353 sv_setpvn(get_sv("\"", TRUE), " ", 1);
3354 PL_stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
3355 GvMULTI_on(PL_stdingv);
3356 io = GvIOp(PL_stdingv);
3357 IoTYPE(io) = IoTYPE_RDONLY;
3358 IoIFP(io) = PerlIO_stdin();
3359 tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
3361 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
3363 tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
3366 IoTYPE(io) = IoTYPE_WRONLY;
3367 IoOFP(io) = IoIFP(io) = PerlIO_stdout();
3369 tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
3371 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
3373 PL_stderrgv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
3374 GvMULTI_on(PL_stderrgv);
3375 io = GvIOp(PL_stderrgv);
3376 IoTYPE(io) = IoTYPE_WRONLY;
3377 IoOFP(io) = IoIFP(io) = PerlIO_stderr();
3378 tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
3380 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
3382 PL_statname = NEWSV(66,0); /* last filename we did stat on */
3385 Safefree(PL_osname);
3386 PL_osname = savepv(OSNAME);
3390 Perl_init_argv_symbols(pTHX_ register int argc, register char **argv)
3393 argc--,argv++; /* skip name of script */
3394 if (PL_doswitches) {
3395 for (; argc > 0 && **argv == '-'; argc--,argv++) {
3398 if (argv[0][1] == '-' && !argv[0][2]) {
3402 if ((s = strchr(argv[0], '='))) {
3404 sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),s);
3407 sv_setiv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),1);
3410 if ((PL_argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV))) {
3411 GvMULTI_on(PL_argvgv);
3412 (void)gv_AVadd(PL_argvgv);
3413 av_clear(GvAVn(PL_argvgv));
3414 for (; argc > 0; argc--,argv++) {
3415 SV *sv = newSVpv(argv[0],0);
3416 av_push(GvAVn(PL_argvgv),sv);
3417 if (PL_unicode & PERL_UNICODE_ARGV_FLAG)
3419 if (PL_unicode & PERL_UNICODE_WIDESYSCALLS_FLAG) /* Sarathy? */
3420 (void)sv_utf8_decode(sv);
3425 #ifdef HAS_PROCSELFEXE
3426 /* This is a function so that we don't hold on to MAXPATHLEN
3427 bytes of stack longer than necessary
3430 S_procself_val(pTHX_ SV *sv, char *arg0)
3432 char buf[MAXPATHLEN];
3433 int len = readlink(PROCSELFEXE_PATH, buf, sizeof(buf) - 1);
3435 /* On Playstation2 Linux V1.0 (kernel 2.2.1) readlink(/proc/self/exe)
3436 includes a spurious NUL which will cause $^X to fail in system
3437 or backticks (this will prevent extensions from being built and
3438 many tests from working). readlink is not meant to add a NUL.
3439 Normal readlink works fine.
3441 if (len > 0 && buf[len-1] == '\0') {
3445 /* FreeBSD's implementation is acknowledged to be imperfect, sometimes
3446 returning the text "unknown" from the readlink rather than the path
3447 to the executable (or returning an error from the readlink). Any valid
3448 path has a '/' in it somewhere, so use that to validate the result.
3449 See http://www.freebsd.org/cgi/query-pr.cgi?pr=35703
3451 if (len > 0 && memchr(buf, '/', len)) {
3452 sv_setpvn(sv,buf,len);
3458 #endif /* HAS_PROCSELFEXE */
3461 S_init_postdump_symbols(pTHX_ register int argc, register char **argv, register char **env)
3467 PL_toptarget = NEWSV(0,0);
3468 sv_upgrade(PL_toptarget, SVt_PVFM);
3469 sv_setpvn(PL_toptarget, "", 0);
3470 PL_bodytarget = NEWSV(0,0);
3471 sv_upgrade(PL_bodytarget, SVt_PVFM);
3472 sv_setpvn(PL_bodytarget, "", 0);
3473 PL_formtarget = PL_bodytarget;
3477 init_argv_symbols(argc,argv);
3479 if ((tmpgv = gv_fetchpv("0",TRUE, SVt_PV))) {
3480 #ifdef MACOS_TRADITIONAL
3481 /* $0 is not majick on a Mac */
3482 sv_setpv(GvSV(tmpgv),MacPerl_MPWFileName(PL_origfilename));
3484 sv_setpv(GvSV(tmpgv),PL_origfilename);
3485 magicname("0", "0", 1);
3488 if ((tmpgv = gv_fetchpv("\030",TRUE, SVt_PV))) {/* $^X */
3489 #ifdef HAS_PROCSELFEXE
3490 S_procself_val(aTHX_ GvSV(tmpgv), PL_origargv[0]);
3493 sv_setpv(GvSV(tmpgv), os2_execname(aTHX));
3495 sv_setpv(GvSV(tmpgv),PL_origargv[0]);
3499 if ((PL_envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV))) {
3501 GvMULTI_on(PL_envgv);
3502 hv = GvHVn(PL_envgv);
3503 hv_magic(hv, Nullgv, PERL_MAGIC_env);
3504 #ifdef USE_ENVIRON_ARRAY
3505 /* Note that if the supplied env parameter is actually a copy
3506 of the global environ then it may now point to free'd memory
3507 if the environment has been modified since. To avoid this
3508 problem we treat env==NULL as meaning 'use the default'
3513 # ifdef USE_ITHREADS
3514 && PL_curinterp == aTHX
3518 environ[0] = Nullch;
3521 for (; *env; env++) {
3522 if (!(s = strchr(*env,'=')))
3529 sv = newSVpv(s+1, 0);
3530 (void)hv_store(hv, *env, s - *env, sv, 0);
3534 #endif /* USE_ENVIRON_ARRAY */
3537 if ((tmpgv = gv_fetchpv("$",TRUE, SVt_PV))) {
3538 SvREADONLY_off(GvSV(tmpgv));
3539 sv_setiv(GvSV(tmpgv), (IV)PerlProc_getpid());
3540 SvREADONLY_on(GvSV(tmpgv));
3542 #ifdef THREADS_HAVE_PIDS
3543 PL_ppid = (IV)getppid();
3546 /* touch @F array to prevent spurious warnings 20020415 MJD */
3548 (void) get_av("main::F", TRUE | GV_ADDMULTI);
3550 /* touch @- and @+ arrays to prevent spurious warnings 20020415 MJD */
3551 (void) get_av("main::-", TRUE | GV_ADDMULTI);
3552 (void) get_av("main::+", TRUE | GV_ADDMULTI);
3556 S_init_perllib(pTHX)
3561 s = PerlEnv_getenv("PERL5LIB");
3563 incpush(s, TRUE, TRUE, TRUE);
3565 incpush(PerlEnv_getenv("PERLLIB"), FALSE, FALSE, TRUE);
3567 /* Treat PERL5?LIB as a possible search list logical name -- the
3568 * "natural" VMS idiom for a Unix path string. We allow each
3569 * element to be a set of |-separated directories for compatibility.
3573 if (my_trnlnm("PERL5LIB",buf,0))
3574 do { incpush(buf,TRUE,TRUE,TRUE); } while (my_trnlnm("PERL5LIB",buf,++idx));
3576 while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE,FALSE,TRUE);
3580 /* Use the ~-expanded versions of APPLLIB (undocumented),
3581 ARCHLIB PRIVLIB SITEARCH SITELIB VENDORARCH and VENDORLIB
3584 incpush(APPLLIB_EXP, TRUE, TRUE, TRUE);
3588 incpush(ARCHLIB_EXP, FALSE, FALSE, TRUE);
3590 #ifdef MACOS_TRADITIONAL
3593 SV * privdir = NEWSV(55, 0);
3594 char * macperl = PerlEnv_getenv("MACPERL");
3599 Perl_sv_setpvf(aTHX_ privdir, "%slib:", macperl);
3600 if (PerlLIO_stat(SvPVX(privdir), &tmpstatbuf) >= 0 && S_ISDIR(tmpstatbuf.st_mode))
3601 incpush(SvPVX(privdir), TRUE, FALSE, TRUE);
3602 Perl_sv_setpvf(aTHX_ privdir, "%ssite_perl:", macperl);
3603 if (PerlLIO_stat(SvPVX(privdir), &tmpstatbuf) >= 0 && S_ISDIR(tmpstatbuf.st_mode))
3604 incpush(SvPVX(privdir), TRUE, FALSE, TRUE);
3606 SvREFCNT_dec(privdir);
3609 incpush(":", FALSE, FALSE, TRUE);
3612 # define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
3615 incpush(PRIVLIB_EXP, TRUE, FALSE, TRUE);
3617 incpush(PRIVLIB_EXP, FALSE, FALSE, TRUE);
3621 /* sitearch is always relative to sitelib on Windows for
3622 * DLL-based path intuition to work correctly */
3623 # if !defined(WIN32)
3624 incpush(SITEARCH_EXP, FALSE, FALSE, TRUE);
3630 /* this picks up sitearch as well */
3631 incpush(SITELIB_EXP, TRUE, FALSE, TRUE);
3633 incpush(SITELIB_EXP, FALSE, FALSE, TRUE);
3637 #ifdef SITELIB_STEM /* Search for version-specific dirs below here */
3638 incpush(SITELIB_STEM, FALSE, TRUE, TRUE);
3641 #ifdef PERL_VENDORARCH_EXP
3642 /* vendorarch is always relative to vendorlib on Windows for
3643 * DLL-based path intuition to work correctly */
3644 # if !defined(WIN32)
3645 incpush(PERL_VENDORARCH_EXP, FALSE, FALSE, TRUE);
3649 #ifdef PERL_VENDORLIB_EXP
3651 incpush(PERL_VENDORLIB_EXP, TRUE, FALSE, TRUE); /* this picks up vendorarch as well */
3653 incpush(PERL_VENDORLIB_EXP, FALSE, FALSE, TRUE);
3657 #ifdef PERL_VENDORLIB_STEM /* Search for version-specific dirs below here */
3658 incpush(PERL_VENDORLIB_STEM, FALSE, TRUE, TRUE);
3661 #ifdef PERL_OTHERLIBDIRS
3662 incpush(PERL_OTHERLIBDIRS, TRUE, TRUE, TRUE);
3666 incpush(".", FALSE, FALSE, TRUE);
3667 #endif /* MACOS_TRADITIONAL */
3670 #if defined(DOSISH) || defined(EPOC)
3671 # define PERLLIB_SEP ';'
3674 # define PERLLIB_SEP '|'
3676 # if defined(MACOS_TRADITIONAL)
3677 # define PERLLIB_SEP ','
3679 # define PERLLIB_SEP ':'
3683 #ifndef PERLLIB_MANGLE
3684 # define PERLLIB_MANGLE(s,n) (s)
3688 S_incpush(pTHX_ char *p, int addsubdirs, int addoldvers, int usesep)
3690 SV *subdir = Nullsv;
3695 if (addsubdirs || addoldvers) {
3696 subdir = sv_newmortal();
3699 /* Break at all separators */
3701 SV *libdir = NEWSV(55,0);
3704 /* skip any consecutive separators */
3706 while ( *p == PERLLIB_SEP ) {
3707 /* Uncomment the next line for PATH semantics */
3708 /* av_push(GvAVn(PL_incgv), newSVpvn(".", 1)); */
3713 if ( usesep && (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
3714 sv_setpvn(libdir, PERLLIB_MANGLE(p, (STRLEN)(s - p)),
3719 sv_setpv(libdir, PERLLIB_MANGLE(p, 0));
3720 p = Nullch; /* break out */
3722 #ifdef MACOS_TRADITIONAL
3723 if (!strchr(SvPVX(libdir), ':')) {
3726 sv_setpv(libdir, MacPerl_CanonDir(SvPVX(libdir), buf, 0));
3728 if (SvPVX(libdir)[SvCUR(libdir)-1] != ':')
3729 sv_catpv(libdir, ":");
3733 * BEFORE pushing libdir onto @INC we may first push version- and
3734 * archname-specific sub-directories.
3736 if (addsubdirs || addoldvers) {
3737 #ifdef PERL_INC_VERSION_LIST
3738 /* Configure terminates PERL_INC_VERSION_LIST with a NULL */
3739 const char *incverlist[] = { PERL_INC_VERSION_LIST };
3740 const char **incver;
3747 if ((unix = tounixspec_ts(SvPV(libdir,len),Nullch)) != Nullch) {
3749 while (unix[len-1] == '/') len--; /* Cosmetic */
3750 sv_usepvn(libdir,unix,len);
3753 PerlIO_printf(Perl_error_log,
3754 "Failed to unixify @INC element \"%s\"\n",
3758 #ifdef MACOS_TRADITIONAL
3759 #define PERL_AV_SUFFIX_FMT ""
3760 #define PERL_ARCH_FMT "%s:"
3761 #define PERL_ARCH_FMT_PATH PERL_FS_VER_FMT PERL_AV_SUFFIX_FMT
3763 #define PERL_AV_SUFFIX_FMT "/"
3764 #define PERL_ARCH_FMT "/%s"
3765 #define PERL_ARCH_FMT_PATH PERL_AV_SUFFIX_FMT PERL_FS_VER_FMT
3767 /* .../version/archname if -d .../version/archname */
3768 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT_PATH PERL_ARCH_FMT,
3770 (int)PERL_REVISION, (int)PERL_VERSION,
3771 (int)PERL_SUBVERSION, ARCHNAME);
3772 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
3773 S_ISDIR(tmpstatbuf.st_mode))
3774 av_push(GvAVn(PL_incgv), newSVsv(subdir));
3776 /* .../version if -d .../version */
3777 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT_PATH, libdir,
3778 (int)PERL_REVISION, (int)PERL_VERSION,
3779 (int)PERL_SUBVERSION);
3780 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
3781 S_ISDIR(tmpstatbuf.st_mode))
3782 av_push(GvAVn(PL_incgv), newSVsv(subdir));
3784 /* .../archname if -d .../archname */
3785 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT, libdir, ARCHNAME);
3786 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
3787 S_ISDIR(tmpstatbuf.st_mode))
3788 av_push(GvAVn(PL_incgv), newSVsv(subdir));
3791 #ifdef PERL_INC_VERSION_LIST
3793 for (incver = incverlist; *incver; incver++) {
3794 /* .../xxx if -d .../xxx */
3795 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT, libdir, *incver);
3796 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
3797 S_ISDIR(tmpstatbuf.st_mode))
3798 av_push(GvAVn(PL_incgv), newSVsv(subdir));
3804 /* finally push this lib directory on the end of @INC */
3805 av_push(GvAVn(PL_incgv), libdir);
3809 #ifdef USE_5005THREADS
3810 STATIC struct perl_thread *
3811 S_init_main_thread(pTHX)
3813 #if !defined(PERL_IMPLICIT_CONTEXT)
3814 struct perl_thread *thr;
3818 Newz(53, thr, 1, struct perl_thread);
3819 PL_curcop = &PL_compiling;
3820 thr->interp = PERL_GET_INTERP;
3821 thr->cvcache = newHV();
3822 thr->threadsv = newAV();
3823 /* thr->threadsvp is set when find_threadsv is called */
3824 thr->specific = newAV();
3825 thr->flags = THRf_R_JOINABLE;
3826 MUTEX_INIT(&thr->mutex);
3827 /* Handcraft thrsv similarly to mess_sv */
3828 New(53, PL_thrsv, 1, SV);
3829 Newz(53, xpv, 1, XPV);
3830 SvFLAGS(PL_thrsv) = SVt_PV;
3831 SvANY(PL_thrsv) = (void*)xpv;
3832 SvREFCNT(PL_thrsv) = 1 << 30; /* practically infinite */
3833 SvPVX(PL_thrsv) = (char*)thr;
3834 SvCUR_set(PL_thrsv, sizeof(thr));
3835 SvLEN_set(PL_thrsv, sizeof(thr));
3836 *SvEND(PL_thrsv) = '\0'; /* in the trailing_nul field */
3837 thr->oursv = PL_thrsv;
3838 PL_chopset = " \n-";
3841 MUTEX_LOCK(&PL_threads_mutex);
3847 MUTEX_UNLOCK(&PL_threads_mutex);
3849 #ifdef HAVE_THREAD_INTERN
3850 Perl_init_thread_intern(thr);
3853 #ifdef SET_THREAD_SELF
3854 SET_THREAD_SELF(thr);
3856 thr->self = pthread_self();
3857 #endif /* SET_THREAD_SELF */
3861 * These must come after the thread self setting
3862 * because sv_setpvn does SvTAINT and the taint
3863 * fields thread selfness being set.
3865 PL_toptarget = NEWSV(0,0);
3866 sv_upgrade(PL_toptarget, SVt_PVFM);
3867 sv_setpvn(PL_toptarget, "", 0);
3868 PL_bodytarget = NEWSV(0,0);
3869 sv_upgrade(PL_bodytarget, SVt_PVFM);
3870 sv_setpvn(PL_bodytarget, "", 0);
3871 PL_formtarget = PL_bodytarget;
3872 thr->errsv = newSVpvn("", 0);
3873 (void) find_threadsv("@"); /* Ensure $@ is initialised early */
3876 PL_peepp = MEMBER_TO_FPTR(Perl_peep);
3877 PL_regcompp = MEMBER_TO_FPTR(Perl_pregcomp);
3878 PL_regexecp = MEMBER_TO_FPTR(Perl_regexec_flags);
3879 PL_regint_start = MEMBER_TO_FPTR(Perl_re_intuit_start);
3880 PL_regint_string = MEMBER_TO_FPTR(Perl_re_intuit_string);
3881 PL_regfree = MEMBER_TO_FPTR(Perl_pregfree);
3883 PL_reginterp_cnt = 0;
3887 #endif /* USE_5005THREADS */
3890 Perl_call_list(pTHX_ I32 oldscope, AV *paramList)
3893 line_t oldline = CopLINE(PL_curcop);
3899 while (AvFILL(paramList) >= 0) {
3900 cv = (CV*)av_shift(paramList);
3902 if (paramList == PL_beginav) {
3903 /* save PL_beginav for compiler */
3904 if (! PL_beginav_save)
3905 PL_beginav_save = newAV();
3906 av_push(PL_beginav_save, (SV*)cv);
3908 else if (paramList == PL_checkav) {
3909 /* save PL_checkav for compiler */
3910 if (! PL_checkav_save)
3911 PL_checkav_save = newAV();
3912 av_push(PL_checkav_save, (SV*)cv);
3917 #ifdef PERL_FLEXIBLE_EXCEPTIONS
3918 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vcall_list_body), cv);
3924 #ifndef PERL_FLEXIBLE_EXCEPTIONS
3928 (void)SvPV(atsv, len);
3930 PL_curcop = &PL_compiling;
3931 CopLINE_set(PL_curcop, oldline);
3932 if (paramList == PL_beginav)
3933 sv_catpv(atsv, "BEGIN failed--compilation aborted");
3935 Perl_sv_catpvf(aTHX_ atsv,
3936 "%s failed--call queue aborted",
3937 paramList == PL_checkav ? "CHECK"
3938 : paramList == PL_initav ? "INIT"
3940 while (PL_scopestack_ix > oldscope)
3943 Perl_croak(aTHX_ "%"SVf"", atsv);
3950 /* my_exit() was called */
3951 while (PL_scopestack_ix > oldscope)
3954 PL_curstash = PL_defstash;
3955 PL_curcop = &PL_compiling;
3956 CopLINE_set(PL_curcop, oldline);
3958 if (PL_statusvalue && !(PL_exit_flags & PERL_EXIT_EXPECTED)) {
3959 if (paramList == PL_beginav)
3960 Perl_croak(aTHX_ "BEGIN failed--compilation aborted");
3962 Perl_croak(aTHX_ "%s failed--call queue aborted",
3963 paramList == PL_checkav ? "CHECK"
3964 : paramList == PL_initav ? "INIT"
3971 PL_curcop = &PL_compiling;
3972 CopLINE_set(PL_curcop, oldline);
3975 PerlIO_printf(Perl_error_log, "panic: restartop\n");
3983 #ifdef PERL_FLEXIBLE_EXCEPTIONS
3985 S_vcall_list_body(pTHX_ va_list args)
3987 CV *cv = va_arg(args, CV*);
3988 return call_list_body(cv);
3993 S_call_list_body(pTHX_ CV *cv)
3995 PUSHMARK(PL_stack_sp);
3996 call_sv((SV*)cv, G_EVAL|G_DISCARD);
4001 Perl_my_exit(pTHX_ U32 status)
4003 DEBUG_S(PerlIO_printf(Perl_debug_log, "my_exit: thread %p, status %lu\n",
4004 thr, (unsigned long) status));
4013 STATUS_NATIVE_SET(status);
4020 Perl_my_failure_exit(pTHX)
4023 if (vaxc$errno & 1) {
4024 if (STATUS_NATIVE & 1) /* fortuitiously includes "-1" */
4025 STATUS_NATIVE_SET(44);
4028 if (!vaxc$errno && errno) /* unlikely */
4029 STATUS_NATIVE_SET(44);
4031 STATUS_NATIVE_SET(vaxc$errno);
4036 STATUS_POSIX_SET(errno);
4038 exitstatus = STATUS_POSIX >> 8;
4039 if (exitstatus & 255)
4040 STATUS_POSIX_SET(exitstatus);
4042 STATUS_POSIX_SET(255);
4049 S_my_exit_jump(pTHX)
4051 register PERL_CONTEXT *cx;
4056 SvREFCNT_dec(PL_e_script);
4057 PL_e_script = Nullsv;
4060 POPSTACK_TO(PL_mainstack);
4061 if (cxstack_ix >= 0) {
4064 POPBLOCK(cx,PL_curpm);
4072 read_e_script(pTHX_ int idx, SV *buf_sv, int maxlen)
4075 p = SvPVX(PL_e_script);
4076 nl = strchr(p, '\n');
4077 nl = (nl) ? nl+1 : SvEND(PL_e_script);
4079 filter_del(read_e_script);
4082 sv_catpvn(buf_sv, p, nl-p);
4083 sv_chop(PL_e_script, nl);