3 * Copyright (c) 1987-1999 Larry Wall
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
11 * "A ship then new they built for him/of mithril and of elven glass" --Bilbo
15 #define PERL_IN_PERL_C
17 #include "patchlevel.h" /* for local_patches */
19 /* XXX If this causes problems, set i_unistd=undef in the hint file. */
24 #if !defined(STANDARD_C) && !defined(HAS_GETENV_PROTOTYPE)
25 char *getenv (char *); /* Usually in <stdlib.h> */
28 static I32 read_e_script(pTHXo_ int idx, SV *buf_sv, int maxlen);
43 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
51 perl_alloc(struct IPerlMem* ipM, struct IPerlEnv* ipE,
52 struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
53 struct IPerlDir* ipD, struct IPerlSock* ipS,
54 struct IPerlProc* ipP)
56 CPerlObj* pPerl = new(ipM) CPerlObj(ipM, ipE, ipStd, ipLIO, ipD, ipS, ipP);
64 #ifdef PERL_IMPLICIT_SYS
66 perl_alloc_using(struct IPerlMem* ipM, struct IPerlEnv* ipE,
67 struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
68 struct IPerlDir* ipD, struct IPerlSock* ipS,
69 struct IPerlProc* ipP)
71 PerlInterpreter *my_perl;
73 /* New() needs interpreter, so call malloc() instead */
74 my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
75 PERL_SET_INTERP(my_perl);
76 Zero(my_perl, 1, PerlInterpreter);
90 PerlInterpreter *my_perl;
92 /* New() needs interpreter, so call malloc() instead */
93 my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
94 PERL_SET_INTERP(my_perl);
97 #endif /* PERL_IMPLICIT_SYS */
98 #endif /* PERL_OBJECT */
101 perl_construct(pTHXx)
106 struct perl_thread *thr = NULL;
107 #endif /* FAKE_THREADS */
108 #endif /* USE_THREADS */
112 PL_perl_destruct_level = 1;
114 if (PL_perl_destruct_level > 0)
118 /* Init the real globals (and main thread)? */
123 #ifdef ALLOC_THREAD_KEY
126 if (pthread_key_create(&PL_thr_key, 0))
127 Perl_croak(aTHX_ "panic: pthread_key_create");
129 MUTEX_INIT(&PL_sv_mutex);
131 * Safe to use basic SV functions from now on (though
132 * not things like mortals or tainting yet).
134 MUTEX_INIT(&PL_eval_mutex);
135 COND_INIT(&PL_eval_cond);
136 MUTEX_INIT(&PL_threads_mutex);
137 COND_INIT(&PL_nthreads_cond);
138 #ifdef EMULATE_ATOMIC_REFCOUNTS
139 MUTEX_INIT(&PL_svref_mutex);
140 #endif /* EMULATE_ATOMIC_REFCOUNTS */
142 MUTEX_INIT(&PL_cred_mutex);
144 thr = init_main_thread();
145 #endif /* USE_THREADS */
147 PL_protect = MEMBER_TO_FPTR(Perl_default_protect); /* for exceptions */
149 PL_curcop = &PL_compiling; /* needed by ckWARN, right away */
151 PL_linestr = NEWSV(65,79);
152 sv_upgrade(PL_linestr,SVt_PVIV);
154 if (!SvREADONLY(&PL_sv_undef)) {
155 /* set read-only and try to insure than we wont see REFCNT==0
158 SvREADONLY_on(&PL_sv_undef);
159 SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
161 sv_setpv(&PL_sv_no,PL_No);
163 SvREADONLY_on(&PL_sv_no);
164 SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
166 sv_setpv(&PL_sv_yes,PL_Yes);
168 SvREADONLY_on(&PL_sv_yes);
169 SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
174 /* PL_sighandlerp = sighandler; */
176 PL_sighandlerp = Perl_sighandler;
178 PL_pidstatus = newHV();
182 * There is no way we can refer to them from Perl so close them to save
183 * space. The other alternative would be to provide STDAUX and STDPRN
186 (void)fclose(stdaux);
187 (void)fclose(stdprn);
191 PL_nrs = newSVpvn("\n", 1);
192 PL_rs = SvREFCNT_inc(PL_nrs);
197 PL_lex_state = LEX_NOTPARSING;
203 SET_NUMERIC_STANDARD();
205 #if defined(PERL_SUBVERSION) && PERL_SUBVERSION > 0
206 sprintf(PL_patchlevel, "%7.5f", (double) PERL_REVISION
207 + ((double) PERL_VERSION / (double) 1000)
208 + ((double) PERL_SUBVERSION / (double) 100000));
210 sprintf(PL_patchlevel, "%5.3f", (double) PERL_REVISION +
211 ((double) PERL_VERSION / (double) 1000));
214 #if defined(LOCAL_PATCH_COUNT)
215 PL_localpatches = local_patches; /* For possible -v */
218 PerlIO_init(); /* Hook to IO system */
220 PL_fdpid = newAV(); /* for remembering popen pids by fd */
221 PL_modglobal = newHV(); /* pointers to per-interpreter module globals */
230 int destruct_level; /* 0=none, 1=full, 2=full with checks */
236 #endif /* USE_THREADS */
240 /* Pass 1 on any remaining threads: detach joinables, join zombies */
242 MUTEX_LOCK(&PL_threads_mutex);
243 DEBUG_S(PerlIO_printf(Perl_debug_log,
244 "perl_destruct: waiting for %d threads...\n",
246 for (t = thr->next; t != thr; t = t->next) {
247 MUTEX_LOCK(&t->mutex);
248 switch (ThrSTATE(t)) {
251 DEBUG_S(PerlIO_printf(Perl_debug_log,
252 "perl_destruct: joining zombie %p\n", t));
253 ThrSETSTATE(t, THRf_DEAD);
254 MUTEX_UNLOCK(&t->mutex);
257 * The SvREFCNT_dec below may take a long time (e.g. av
258 * may contain an object scalar whose destructor gets
259 * called) so we have to unlock threads_mutex and start
262 MUTEX_UNLOCK(&PL_threads_mutex);
264 SvREFCNT_dec((SV*)av);
265 DEBUG_S(PerlIO_printf(Perl_debug_log,
266 "perl_destruct: joined zombie %p OK\n", t));
268 case THRf_R_JOINABLE:
269 DEBUG_S(PerlIO_printf(Perl_debug_log,
270 "perl_destruct: detaching thread %p\n", t));
271 ThrSETSTATE(t, THRf_R_DETACHED);
273 * We unlock threads_mutex and t->mutex in the opposite order
274 * from which we locked them just so that DETACH won't
275 * deadlock if it panics. It's only a breach of good style
276 * not a bug since they are unlocks not locks.
278 MUTEX_UNLOCK(&PL_threads_mutex);
280 MUTEX_UNLOCK(&t->mutex);
283 DEBUG_S(PerlIO_printf(Perl_debug_log,
284 "perl_destruct: ignoring %p (state %u)\n",
286 MUTEX_UNLOCK(&t->mutex);
287 /* fall through and out */
290 /* We leave the above "Pass 1" loop with threads_mutex still locked */
292 /* Pass 2 on remaining threads: wait for the thread count to drop to one */
293 while (PL_nthreads > 1)
295 DEBUG_S(PerlIO_printf(Perl_debug_log,
296 "perl_destruct: final wait for %d threads\n",
298 COND_WAIT(&PL_nthreads_cond, &PL_threads_mutex);
300 /* At this point, we're the last thread */
301 MUTEX_UNLOCK(&PL_threads_mutex);
302 DEBUG_S(PerlIO_printf(Perl_debug_log, "perl_destruct: armageddon has arrived\n"));
303 MUTEX_DESTROY(&PL_threads_mutex);
304 COND_DESTROY(&PL_nthreads_cond);
305 #endif /* !defined(FAKE_THREADS) */
306 #endif /* USE_THREADS */
308 destruct_level = PL_perl_destruct_level;
312 if (s = PerlEnv_getenv("PERL_DESTRUCT_LEVEL")) {
314 if (destruct_level < i)
323 /* We must account for everything. */
325 /* Destroy the main CV and syntax tree */
327 PL_curpad = AvARRAY(PL_comppad);
328 op_free(PL_main_root);
329 PL_main_root = Nullop;
331 PL_curcop = &PL_compiling;
332 PL_main_start = Nullop;
333 SvREFCNT_dec(PL_main_cv);
337 if (PL_sv_objcount) {
339 * Try to destruct global references. We do this first so that the
340 * destructors and destructees still exist. Some sv's might remain.
341 * Non-referenced objects are on their own.
346 /* unhook hooks which will soon be, or use, destroyed data */
347 SvREFCNT_dec(PL_warnhook);
348 PL_warnhook = Nullsv;
349 SvREFCNT_dec(PL_diehook);
352 /* call exit list functions */
353 while (PL_exitlistlen-- > 0)
354 PL_exitlist[PL_exitlistlen].fn(aTHXo_ PL_exitlist[PL_exitlistlen].ptr);
356 Safefree(PL_exitlist);
358 if (destruct_level == 0){
360 DEBUG_P(debprofdump());
362 /* The exit() function will do everything that needs doing. */
366 /* loosen bonds of global variables */
369 (void)PerlIO_close(PL_rsfp);
373 /* Filters for program text */
374 SvREFCNT_dec(PL_rsfp_filters);
375 PL_rsfp_filters = Nullav;
378 PL_preprocess = FALSE;
384 PL_doswitches = FALSE;
385 PL_dowarn = G_WARN_OFF;
386 PL_doextract = FALSE;
387 PL_sawampersand = FALSE; /* must save all match strings */
390 Safefree(PL_inplace);
394 SvREFCNT_dec(PL_e_script);
395 PL_e_script = Nullsv;
398 /* magical thingies */
400 Safefree(PL_ofs); /* $, */
403 Safefree(PL_ors); /* $\ */
406 SvREFCNT_dec(PL_rs); /* $/ */
409 SvREFCNT_dec(PL_nrs); /* $/ helper */
412 PL_multiline = 0; /* $* */
414 SvREFCNT_dec(PL_statname);
415 PL_statname = Nullsv;
418 /* defgv, aka *_ should be taken care of elsewhere */
420 /* clean up after study() */
421 SvREFCNT_dec(PL_lastscream);
422 PL_lastscream = Nullsv;
423 Safefree(PL_screamfirst);
425 Safefree(PL_screamnext);
429 Safefree(PL_efloatbuf);
430 PL_efloatbuf = Nullch;
433 /* startup and shutdown function lists */
434 SvREFCNT_dec(PL_beginav);
435 SvREFCNT_dec(PL_endav);
436 SvREFCNT_dec(PL_initav);
441 /* shortcuts just get cleared */
447 PL_argvoutgv = Nullgv;
449 PL_stderrgv = Nullgv;
450 PL_last_in_gv = Nullgv;
453 /* reset so print() ends up where we expect */
456 /* Prepare to destruct main symbol table. */
462 /* clear queued errors */
463 SvREFCNT_dec(PL_errors);
467 if (destruct_level >= 2 && ckWARN_d(WARN_INTERNAL)) {
468 if (PL_scopestack_ix != 0)
469 Perl_warner(aTHX_ WARN_INTERNAL,
470 "Unbalanced scopes: %ld more ENTERs than LEAVEs\n",
471 (long)PL_scopestack_ix);
472 if (PL_savestack_ix != 0)
473 Perl_warner(aTHX_ WARN_INTERNAL,
474 "Unbalanced saves: %ld more saves than restores\n",
475 (long)PL_savestack_ix);
476 if (PL_tmps_floor != -1)
477 Perl_warner(aTHX_ WARN_INTERNAL,"Unbalanced tmps: %ld more allocs than frees\n",
478 (long)PL_tmps_floor + 1);
479 if (cxstack_ix != -1)
480 Perl_warner(aTHX_ WARN_INTERNAL,"Unbalanced context: %ld more PUSHes than POPs\n",
481 (long)cxstack_ix + 1);
484 /* Now absolutely destruct everything, somehow or other, loops or no. */
486 SvFLAGS(PL_strtab) |= SVTYPEMASK; /* don't clean out strtab now */
487 while (PL_sv_count != 0 && PL_sv_count != last_sv_count) {
488 last_sv_count = PL_sv_count;
491 SvFLAGS(PL_strtab) &= ~SVTYPEMASK;
492 SvFLAGS(PL_strtab) |= SVt_PVHV;
494 /* Destruct the global string table. */
496 /* Yell and reset the HeVAL() slots that are still holding refcounts,
497 * so that sv_free() won't fail on them.
505 max = HvMAX(PL_strtab);
506 array = HvARRAY(PL_strtab);
509 if (hent && ckWARN_d(WARN_INTERNAL)) {
510 Perl_warner(aTHX_ WARN_INTERNAL,
511 "Unbalanced string table refcount: (%d) for \"%s\"",
512 HeVAL(hent) - Nullsv, HeKEY(hent));
513 HeVAL(hent) = Nullsv;
523 SvREFCNT_dec(PL_strtab);
525 if (PL_sv_count != 0 && ckWARN_d(WARN_INTERNAL))
526 Perl_warner(aTHX_ WARN_INTERNAL,"Scalars leaked: %ld\n", (long)PL_sv_count);
530 /* No SVs have survived, need to clean out */
532 PL_pidstatus = Nullhv;
533 Safefree(PL_origfilename);
534 Safefree(PL_archpat_auto);
535 Safefree(PL_reg_start_tmp);
537 Safefree(PL_reg_curpm);
538 Safefree(PL_reg_poscache);
539 Safefree(HeKEY_hek(&PL_hv_fetch_ent_mh));
540 Safefree(PL_op_mask);
542 PL_hints = 0; /* Reset hints. Should hints be per-interpreter ? */
544 DEBUG_P(debprofdump());
546 MUTEX_DESTROY(&PL_strtab_mutex);
547 MUTEX_DESTROY(&PL_sv_mutex);
548 MUTEX_DESTROY(&PL_eval_mutex);
549 MUTEX_DESTROY(&PL_cred_mutex);
550 COND_DESTROY(&PL_eval_cond);
551 #ifdef EMULATE_ATOMIC_REFCOUNTS
552 MUTEX_DESTROY(&PL_svref_mutex);
553 #endif /* EMULATE_ATOMIC_REFCOUNTS */
555 /* As the penultimate thing, free the non-arena SV for thrsv */
556 Safefree(SvPVX(PL_thrsv));
557 Safefree(SvANY(PL_thrsv));
560 #endif /* USE_THREADS */
562 /* As the absolutely last thing, free the non-arena SV for mess() */
565 /* it could have accumulated taint magic */
566 if (SvTYPE(PL_mess_sv) >= SVt_PVMG) {
569 for (mg = SvMAGIC(PL_mess_sv); mg; mg = moremagic) {
570 moremagic = mg->mg_moremagic;
571 if (mg->mg_ptr && mg->mg_type != 'g' && mg->mg_len >= 0)
572 Safefree(mg->mg_ptr);
576 /* we know that type >= SVt_PV */
577 SvOOK_off(PL_mess_sv);
578 Safefree(SvPVX(PL_mess_sv));
579 Safefree(SvANY(PL_mess_sv));
580 Safefree(PL_mess_sv);
588 #if defined(PERL_OBJECT)
596 Perl_call_atexit(pTHX_ ATEXIT_t fn, void *ptr)
598 Renew(PL_exitlist, PL_exitlistlen+1, PerlExitListEntry);
599 PL_exitlist[PL_exitlistlen].fn = fn;
600 PL_exitlist[PL_exitlistlen].ptr = ptr;
605 perl_parse(pTHXx_ XSINIT_t xsinit, int argc, char **argv, char **env)
615 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
618 Perl_croak(aTHX_ "suidperl is no longer needed since the kernel can now execute\n\
619 setuid perl scripts securely.\n");
623 #if defined(__DYNAMIC__) && (defined(NeXT) || defined(__NeXT__))
624 _dyld_lookup_and_bind
625 ("__environ", (unsigned long *) &environ_pointer, NULL);
630 #ifndef VMS /* VMS doesn't have environ array */
631 PL_origenviron = environ;
636 /* Come here if running an undumped a.out. */
638 PL_origfilename = savepv(argv[0]);
639 PL_do_undump = FALSE;
640 cxstack_ix = -1; /* start label stack again */
642 init_postdump_symbols(argc,argv,env);
647 PL_curpad = AvARRAY(PL_comppad);
648 op_free(PL_main_root);
649 PL_main_root = Nullop;
651 PL_main_start = Nullop;
652 SvREFCNT_dec(PL_main_cv);
656 oldscope = PL_scopestack_ix;
657 PL_dowarn = G_WARN_OFF;
659 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_parse_body),
668 /* my_exit() was called */
669 while (PL_scopestack_ix > oldscope)
672 PL_curstash = PL_defstash;
673 if (PL_endav && !PL_minus_c)
674 call_list(oldscope, PL_endav);
675 return STATUS_NATIVE_EXPORT;
677 PerlIO_printf(Perl_error_log, "panic: top_env\n");
684 S_parse_body(pTHX_ va_list args)
687 int argc = PL_origargc;
688 char **argv = PL_origargv;
689 char **env = va_arg(args, char**);
690 char *scriptname = NULL;
692 VOL bool dosearch = FALSE;
697 char *cddir = Nullch;
699 XSINIT_t xsinit = va_arg(args, XSINIT_t);
701 sv_setpvn(PL_linestr,"",0);
702 sv = newSVpvn("",0); /* first used for -I flags */
706 for (argc--,argv++; argc > 0; argc--,argv++) {
707 if (argv[0][0] != '-' || !argv[0][1])
711 validarg = " PHOOEY ";
718 #ifndef PERL_STRICT_CR
742 if (s = moreswitches(s))
752 #ifdef MACOS_TRADITIONAL
753 /* ignore -e for Dev:Pseudo argument */
754 if (argv[1] && !strcmp(argv[1], "Dev:Pseudo"))
757 if (PL_euid != PL_uid || PL_egid != PL_gid)
758 Perl_croak(aTHX_ "No -e allowed in setuid scripts");
760 PL_e_script = newSVpvn("",0);
761 filter_add(read_e_script, NULL);
764 sv_catpv(PL_e_script, s);
766 sv_catpv(PL_e_script, argv[1]);
770 Perl_croak(aTHX_ "No code specified for -e");
771 sv_catpv(PL_e_script, "\n");
774 case 'I': /* -I handled both here and in moreswitches() */
776 if (!*++s && (s=argv[1]) != Nullch) {
779 while (s && isSPACE(*s))
783 for (e = s; *e && !isSPACE(*e); e++) ;
790 } /* XXX else croak? */
794 PL_preprocess = TRUE;
804 PL_preambleav = newAV();
805 av_push(PL_preambleav, newSVpv("use Config qw(myconfig config_vars)",0));
807 PL_Sv = newSVpv("print myconfig();",0);
809 sv_catpv(PL_Sv,"print \"\\nCharacteristics of this PERLSHR image: \\n\",");
811 sv_catpv(PL_Sv,"print \"\\nCharacteristics of this binary (from libperl): \\n\",");
813 sv_catpv(PL_Sv,"\" Compile-time options:");
815 sv_catpv(PL_Sv," DEBUGGING");
818 sv_catpv(PL_Sv," MULTIPLICITY");
821 sv_catpv(PL_Sv," USE_THREADS");
824 sv_catpv(PL_Sv," PERL_OBJECT");
826 # ifdef PERL_IMPLICIT_CONTEXT
827 sv_catpv(PL_Sv," PERL_IMPLICIT_CONTEXT");
829 # ifdef PERL_IMPLICIT_SYS
830 sv_catpv(PL_Sv," PERL_IMPLICIT_SYS");
832 sv_catpv(PL_Sv,"\\n\",");
834 #if defined(LOCAL_PATCH_COUNT)
835 if (LOCAL_PATCH_COUNT > 0) {
837 sv_catpv(PL_Sv,"\" Locally applied patches:\\n\",");
838 for (i = 1; i <= LOCAL_PATCH_COUNT; i++) {
839 if (PL_localpatches[i])
840 Perl_sv_catpvf(aTHX_ PL_Sv,"q\" \t%s\n\",",PL_localpatches[i]);
844 Perl_sv_catpvf(aTHX_ PL_Sv,"\" Built under %s\\n\"",OSNAME);
847 Perl_sv_catpvf(aTHX_ PL_Sv,",\" Compiled at %s %s\\n\"",__DATE__,__TIME__);
849 Perl_sv_catpvf(aTHX_ PL_Sv,",\" Compiled on %s\\n\"",__DATE__);
854 @env = map { \"$_=\\\"$ENV{$_}\\\"\" } sort grep {/^PERL/} keys %ENV; \
855 print \" \\%ENV:\\n @env\\n\" if @env; \
856 print \" \\@INC:\\n @INC\\n\";");
859 PL_Sv = newSVpv("config_vars(qw(",0);
860 sv_catpv(PL_Sv, ++s);
861 sv_catpv(PL_Sv, "))");
864 av_push(PL_preambleav, PL_Sv);
865 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
876 if (!*++s || isSPACE(*s)) {
880 /* catch use of gnu style long options */
881 if (strEQ(s, "version")) {
885 if (strEQ(s, "help")) {
892 Perl_croak(aTHX_ "Unrecognized switch: -%s (-h will show valid options)",s);
898 #ifndef SECURE_INTERNAL_GETENV
901 (s = PerlEnv_getenv("PERL5OPT"))) {
904 if (*s == '-' && *(s+1) == 'T')
917 if (!strchr("DIMUdmw", *s))
918 Perl_croak(aTHX_ "Illegal switch in PERL5OPT: -%c", *s);
925 scriptname = argv[0];
928 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
930 else if (scriptname == Nullch) {
932 if ( PerlLIO_isatty(PerlIO_fileno(PerlIO_stdin())) )
940 open_script(scriptname,dosearch,sv,&fdscript);
942 validate_suid(validarg, scriptname,fdscript);
944 #if defined(SIGCHLD) || defined(SIGCLD)
947 # define SIGCHLD SIGCLD
949 Sighandler_t sigstate = rsignal_state(SIGCHLD);
950 if (sigstate == SIG_IGN) {
951 if (ckWARN(WARN_SIGNAL))
952 Perl_warner(aTHX_ WARN_SIGNAL,
953 "Can't ignore signal CHLD, forcing to default");
954 (void)rsignal(SIGCHLD, (Sighandler_t)SIG_DFL);
959 #ifdef MACOS_TRADITIONAL
960 if (PL_doextract || gAlwaysExtract)
965 if (cddir && PerlDir_chdir(cddir) < 0)
966 Perl_croak(aTHX_ "Can't chdir to %s",cddir);
969 PL_main_cv = PL_compcv = (CV*)NEWSV(1104,0);
970 sv_upgrade((SV *)PL_compcv, SVt_PVCV);
971 CvUNIQUE_on(PL_compcv);
973 PL_comppad = newAV();
974 av_push(PL_comppad, Nullsv);
975 PL_curpad = AvARRAY(PL_comppad);
976 PL_comppad_name = newAV();
977 PL_comppad_name_fill = 0;
978 PL_min_intro_pending = 0;
981 av_store(PL_comppad_name, 0, newSVpvn("@_", 2));
982 PL_curpad[0] = (SV*)newAV();
983 SvPADMY_on(PL_curpad[0]); /* XXX Needed? */
984 CvOWNER(PL_compcv) = 0;
985 New(666, CvMUTEXP(PL_compcv), 1, perl_mutex);
986 MUTEX_INIT(CvMUTEXP(PL_compcv));
987 #endif /* USE_THREADS */
989 comppadlist = newAV();
990 AvREAL_off(comppadlist);
991 av_store(comppadlist, 0, (SV*)PL_comppad_name);
992 av_store(comppadlist, 1, (SV*)PL_comppad);
993 CvPADLIST(PL_compcv) = comppadlist;
995 boot_core_UNIVERSAL();
999 (*xsinit)(aTHXo); /* in case linked C routines want magical variables */
1000 #if defined(VMS) || defined(WIN32) || defined(DJGPP)
1008 init_predump_symbols();
1009 /* init_postdump_symbols not currently designed to be called */
1010 /* more than once (ENV isn't cleared first, for example) */
1011 /* But running with -u leaves %ENV & @ARGV undefined! XXX */
1013 init_postdump_symbols(argc,argv,env);
1017 /* now parse the script */
1019 SETERRNO(0,SS$_NORMAL);
1021 #ifdef MACOS_TRADITIONAL
1022 if (gSyntaxError = (yyparse() || PL_error_count)) {
1024 Perl_croak(aTHX_ "%s had compilation errors.\n", MPWFileName(PL_origfilename));
1026 Perl_croak(aTHX_ "Execution of %s aborted due to compilation errors.\n",
1027 MPWFileName(PL_origfilename));
1031 if (yyparse() || PL_error_count) {
1033 Perl_croak(aTHX_ "%s had compilation errors.\n", PL_origfilename);
1035 Perl_croak(aTHX_ "Execution of %s aborted due to compilation errors.\n",
1040 PL_curcop->cop_line = 0;
1041 PL_curstash = PL_defstash;
1042 PL_preprocess = FALSE;
1044 SvREFCNT_dec(PL_e_script);
1045 PL_e_script = Nullsv;
1048 /* now that script is parsed, we can modify record separator */
1049 SvREFCNT_dec(PL_rs);
1050 PL_rs = SvREFCNT_inc(PL_nrs);
1051 sv_setsv(get_sv("/", TRUE), PL_rs);
1056 gv_check(PL_defstash);
1062 if ((s=PerlEnv_getenv("PERL_DEBUG_MSTATS")) && atoi(s) >= 2)
1063 dump_mstats("after compilation:");
1082 oldscope = PL_scopestack_ix;
1085 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_run_body), oldscope);
1088 cxstack_ix = -1; /* start context stack again */
1090 case 0: /* normal completion */
1091 case 2: /* my_exit() */
1092 while (PL_scopestack_ix > oldscope)
1095 PL_curstash = PL_defstash;
1096 if (PL_endav && !PL_minus_c)
1097 call_list(oldscope, PL_endav);
1099 if (PerlEnv_getenv("PERL_DEBUG_MSTATS"))
1100 dump_mstats("after execution: ");
1102 return STATUS_NATIVE_EXPORT;
1105 POPSTACK_TO(PL_mainstack);
1108 PerlIO_printf(Perl_error_log, "panic: restartop\n");
1118 S_run_body(pTHX_ va_list args)
1121 I32 oldscope = va_arg(args, I32);
1123 DEBUG_r(PerlIO_printf(Perl_debug_log, "%s $` $& $' support.\n",
1124 PL_sawampersand ? "Enabling" : "Omitting"));
1126 if (!PL_restartop) {
1127 DEBUG_x(dump_all());
1128 DEBUG(PerlIO_printf(Perl_debug_log, "\nEXECUTING...\n\n"));
1129 DEBUG_S(PerlIO_printf(Perl_debug_log, "main thread is 0x%"UVxf"\n",
1133 #ifdef MACOS_TRADITIONAL
1134 PerlIO_printf(PerlIO_stderr(), "%s syntax OK\n", MPWFileName(PL_origfilename));
1136 PerlIO_printf(Perl_error_log, "%s syntax OK\n", PL_origfilename);
1140 if (PERLDB_SINGLE && PL_DBsingle)
1141 sv_setiv(PL_DBsingle, 1);
1143 call_list(oldscope, PL_initav);
1149 PL_op = PL_restartop;
1153 else if (PL_main_start) {
1154 CvDEPTH(PL_main_cv) = 1;
1155 PL_op = PL_main_start;
1165 Perl_get_sv(pTHX_ const char *name, I32 create)
1169 if (name[1] == '\0' && !isALPHA(name[0])) {
1170 PADOFFSET tmp = find_threadsv(name);
1171 if (tmp != NOT_IN_PAD) {
1173 return THREADSV(tmp);
1176 #endif /* USE_THREADS */
1177 gv = gv_fetchpv(name, create, SVt_PV);
1184 Perl_get_av(pTHX_ const char *name, I32 create)
1186 GV* gv = gv_fetchpv(name, create, SVt_PVAV);
1195 Perl_get_hv(pTHX_ const char *name, I32 create)
1197 GV* gv = gv_fetchpv(name, create, SVt_PVHV);
1206 Perl_get_cv(pTHX_ const char *name, I32 create)
1208 GV* gv = gv_fetchpv(name, create, SVt_PVCV);
1209 /* XXX unsafe for threads if eval_owner isn't held */
1210 /* XXX this is probably not what they think they're getting.
1211 * It has the same effect as "sub name;", i.e. just a forward
1213 if (create && !GvCVu(gv))
1214 return newSUB(start_subparse(FALSE, 0),
1215 newSVOP(OP_CONST, 0, newSVpv(name,0)),
1223 /* Be sure to refetch the stack pointer after calling these routines. */
1226 Perl_call_argv(pTHX_ const char *sub_name, I32 flags, register char **argv)
1228 /* See G_* flags in cop.h */
1229 /* null terminated arg list */
1236 XPUSHs(sv_2mortal(newSVpv(*argv,0)));
1241 return call_pv(sub_name, flags);
1245 Perl_call_pv(pTHX_ const char *sub_name, I32 flags)
1246 /* name of the subroutine */
1247 /* See G_* flags in cop.h */
1249 return call_sv((SV*)get_cv(sub_name, TRUE), flags);
1253 Perl_call_method(pTHX_ const char *methname, I32 flags)
1254 /* name of the subroutine */
1255 /* See G_* flags in cop.h */
1261 XPUSHs(sv_2mortal(newSVpv(methname,0)));
1266 return call_sv(*PL_stack_sp--, flags);
1269 /* May be called with any of a CV, a GV, or an SV containing the name. */
1271 Perl_call_sv(pTHX_ SV *sv, I32 flags)
1273 /* See G_* flags in cop.h */
1276 LOGOP myop; /* fake syntax tree node */
1280 bool oldcatch = CATCH_GET;
1285 if (flags & G_DISCARD) {
1290 Zero(&myop, 1, LOGOP);
1291 myop.op_next = Nullop;
1292 if (!(flags & G_NOARGS))
1293 myop.op_flags |= OPf_STACKED;
1294 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1295 (flags & G_ARRAY) ? OPf_WANT_LIST :
1300 EXTEND(PL_stack_sp, 1);
1301 *++PL_stack_sp = sv;
1303 oldscope = PL_scopestack_ix;
1305 if (PERLDB_SUB && PL_curstash != PL_debstash
1306 /* Handle first BEGIN of -d. */
1307 && (PL_DBcv || (PL_DBcv = GvCV(PL_DBsub)))
1308 /* Try harder, since this may have been a sighandler, thus
1309 * curstash may be meaningless. */
1310 && (SvTYPE(sv) != SVt_PVCV || CvSTASH((CV*)sv) != PL_debstash)
1311 && !(flags & G_NODEBUG))
1312 PL_op->op_private |= OPpENTERSUB_DB;
1314 if (!(flags & G_EVAL)) {
1316 call_xbody((OP*)&myop, FALSE);
1317 retval = PL_stack_sp - (PL_stack_base + oldmark);
1318 CATCH_SET(oldcatch);
1321 cLOGOP->op_other = PL_op;
1323 /* we're trying to emulate pp_entertry() here */
1325 register PERL_CONTEXT *cx;
1326 I32 gimme = GIMME_V;
1331 push_return(PL_op->op_next);
1332 PUSHBLOCK(cx, CXt_EVAL, PL_stack_sp);
1334 PL_eval_root = PL_op; /* Only needed so that goto works right. */
1336 PL_in_eval = EVAL_INEVAL;
1337 if (flags & G_KEEPERR)
1338 PL_in_eval |= EVAL_KEEPERR;
1345 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_call_body),
1349 retval = PL_stack_sp - (PL_stack_base + oldmark);
1350 if (!(flags & G_KEEPERR))
1357 /* my_exit() was called */
1358 PL_curstash = PL_defstash;
1361 Perl_croak(aTHX_ "Callback called exit");
1366 PL_op = PL_restartop;
1370 PL_stack_sp = PL_stack_base + oldmark;
1371 if (flags & G_ARRAY)
1375 *++PL_stack_sp = &PL_sv_undef;
1380 if (PL_scopestack_ix > oldscope) {
1384 register PERL_CONTEXT *cx;
1395 if (flags & G_DISCARD) {
1396 PL_stack_sp = PL_stack_base + oldmark;
1406 S_call_body(pTHX_ va_list args)
1408 OP *myop = va_arg(args, OP*);
1409 int is_eval = va_arg(args, int);
1411 call_xbody(myop, is_eval);
1416 S_call_xbody(pTHX_ OP *myop, int is_eval)
1420 if (PL_op == myop) {
1422 PL_op = Perl_pp_entereval(aTHX);
1424 PL_op = Perl_pp_entersub(aTHX);
1430 /* Eval a string. The G_EVAL flag is always assumed. */
1433 Perl_eval_sv(pTHX_ SV *sv, I32 flags)
1435 /* See G_* flags in cop.h */
1438 UNOP myop; /* fake syntax tree node */
1439 I32 oldmark = SP - PL_stack_base;
1446 if (flags & G_DISCARD) {
1453 Zero(PL_op, 1, UNOP);
1454 EXTEND(PL_stack_sp, 1);
1455 *++PL_stack_sp = sv;
1456 oldscope = PL_scopestack_ix;
1458 if (!(flags & G_NOARGS))
1459 myop.op_flags = OPf_STACKED;
1460 myop.op_next = Nullop;
1461 myop.op_type = OP_ENTEREVAL;
1462 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1463 (flags & G_ARRAY) ? OPf_WANT_LIST :
1465 if (flags & G_KEEPERR)
1466 myop.op_flags |= OPf_SPECIAL;
1469 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_call_body),
1473 retval = PL_stack_sp - (PL_stack_base + oldmark);
1474 if (!(flags & G_KEEPERR))
1481 /* my_exit() was called */
1482 PL_curstash = PL_defstash;
1485 Perl_croak(aTHX_ "Callback called exit");
1490 PL_op = PL_restartop;
1494 PL_stack_sp = PL_stack_base + oldmark;
1495 if (flags & G_ARRAY)
1499 *++PL_stack_sp = &PL_sv_undef;
1504 if (flags & G_DISCARD) {
1505 PL_stack_sp = PL_stack_base + oldmark;
1515 Perl_eval_pv(pTHX_ const char *p, I32 croak_on_error)
1518 SV* sv = newSVpv(p, 0);
1521 eval_sv(sv, G_SCALAR);
1528 if (croak_on_error && SvTRUE(ERRSV)) {
1530 Perl_croak(aTHX_ SvPVx(ERRSV, n_a));
1536 /* Require a module. */
1539 Perl_require_pv(pTHX_ const char *pv)
1543 PUSHSTACKi(PERLSI_REQUIRE);
1545 sv = sv_newmortal();
1546 sv_setpv(sv, "require '");
1549 eval_sv(sv, G_DISCARD);
1555 Perl_magicname(pTHX_ char *sym, char *name, I32 namlen)
1559 if (gv = gv_fetchpv(sym,TRUE, SVt_PV))
1560 sv_magic(GvSV(gv), (SV*)gv, 0, name, namlen);
1564 S_usage(pTHX_ char *name) /* XXX move this out into a module ? */
1566 /* This message really ought to be max 23 lines.
1567 * Removed -h because the user already knows that opton. Others? */
1569 static char *usage_msg[] = {
1570 "-0[octal] specify record separator (\\0, if no argument)",
1571 "-a autosplit mode with -n or -p (splits $_ into @F)",
1572 "-c check syntax only (runs BEGIN and END blocks)",
1573 "-d[:debugger] run program under debugger",
1574 "-D[number/list] set debugging flags (argument is a bit mask or alphabets)",
1575 "-e 'command' one line of program (several -e's allowed, omit programfile)",
1576 "-F/pattern/ split() pattern for -a switch (//'s are optional)",
1577 "-i[extension] edit <> files in place (makes backup if extension supplied)",
1578 "-Idirectory specify @INC/#include directory (several -I's allowed)",
1579 "-l[octal] enable line ending processing, specifies line terminator",
1580 "-[mM][-]module execute `use/no module...' before executing program",
1581 "-n assume 'while (<>) { ... }' loop around program",
1582 "-p assume loop like -n but print line also, like sed",
1583 "-P run program through C preprocessor before compilation",
1584 "-s enable rudimentary parsing for switches after programfile",
1585 "-S look for programfile using PATH environment variable",
1586 "-T enable tainting checks",
1587 "-u dump core after parsing program",
1588 "-U allow unsafe operations",
1589 "-v print version, subversion (includes VERY IMPORTANT perl info)",
1590 "-V[:variable] print configuration summary (or a single Config.pm variable)",
1591 "-w enable many useful warnings (RECOMMENDED)",
1592 "-x[directory] strip off text before #!perl line and perhaps cd to directory",
1596 char **p = usage_msg;
1598 printf("\nUsage: %s [switches] [--] [programfile] [arguments]", name);
1600 printf("\n %s", *p++);
1603 /* This routine handles any switches that can be given during run */
1606 Perl_moreswitches(pTHX_ char *s)
1615 rschar = (U32)scan_oct(s, 4, &numlen);
1616 SvREFCNT_dec(PL_nrs);
1617 if (rschar & ~((U8)~0))
1618 PL_nrs = &PL_sv_undef;
1619 else if (!rschar && numlen >= 2)
1620 PL_nrs = newSVpvn("", 0);
1623 PL_nrs = newSVpvn(&ch, 1);
1629 PL_splitstr = savepv(s + 1);
1643 if (*s == ':' || *s == '=') {
1644 my_setenv("PERL5DB", Perl_form(aTHX_ "use Devel::%s;", ++s));
1648 PL_perldb = PERLDB_ALL;
1656 if (isALPHA(s[1])) {
1657 static char debopts[] = "psltocPmfrxuLHXDS";
1660 for (s++; *s && (d = strchr(debopts,*s)); s++)
1661 PL_debug |= 1 << (d - debopts);
1664 PL_debug = atoi(s+1);
1665 for (s++; isDIGIT(*s); s++) ;
1667 PL_debug |= 0x80000000;
1670 if (ckWARN_d(WARN_DEBUGGING))
1671 Perl_warner(aTHX_ WARN_DEBUGGING,
1672 "Recompile perl with -DDEBUGGING to use -D switch\n");
1673 for (s++; isALNUM(*s); s++) ;
1679 usage(PL_origargv[0]);
1683 Safefree(PL_inplace);
1684 PL_inplace = savepv(s+1);
1686 for (s = PL_inplace; *s && !isSPACE(*s); s++) ;
1689 if (*s == '-') /* Additional switches on #! line. */
1693 case 'I': /* -I handled both here and in parse_perl() */
1696 while (*s && isSPACE(*s))
1700 for (e = s; *e && !isSPACE(*e); e++) ;
1701 p = savepvn(s, e-s);
1707 Perl_croak(aTHX_ "No space allowed after -I");
1715 PL_ors = savepv("\n");
1717 *PL_ors = (char)scan_oct(s, 3 + (*s == '0'), &numlen);
1722 if (RsPARA(PL_nrs)) {
1727 PL_ors = SvPV(PL_nrs, PL_orslen);
1728 PL_ors = savepvn(PL_ors, PL_orslen);
1732 forbid_setid("-M"); /* XXX ? */
1735 forbid_setid("-m"); /* XXX ? */
1740 /* -M-foo == 'no foo' */
1741 if (*s == '-') { use = "no "; ++s; }
1742 sv = newSVpv(use,0);
1744 /* We allow -M'Module qw(Foo Bar)' */
1745 while(isALNUM(*s) || *s==':') ++s;
1747 sv_catpv(sv, start);
1748 if (*(start-1) == 'm') {
1750 Perl_croak(aTHX_ "Can't use '%c' after -mname", *s);
1751 sv_catpv( sv, " ()");
1754 sv_catpvn(sv, start, s-start);
1755 sv_catpv(sv, " split(/,/,q{");
1760 if (PL_preambleav == NULL)
1761 PL_preambleav = newAV();
1762 av_push(PL_preambleav, sv);
1765 Perl_croak(aTHX_ "No space allowed after -%c", *(s-1));
1777 PL_doswitches = TRUE;
1782 Perl_croak(aTHX_ "Too late for \"-T\" option");
1786 #ifdef MACOS_TRADITIONAL
1787 Perl_croak(aTHX_ "Believe me, you don't want to use \"-u\" on a Macintosh");
1789 PL_do_undump = TRUE;
1797 #if defined(PERL_SUBVERSION) && PERL_SUBVERSION > 0
1798 printf("\nThis is perl, version %d.%03d_%02d built for %s",
1799 PERL_REVISION, PERL_VERSION, PERL_SUBVERSION, ARCHNAME);
1801 printf("\nThis is perl, version %s built for %s",
1802 PL_patchlevel, ARCHNAME);
1804 #if defined(LOCAL_PATCH_COUNT)
1805 if (LOCAL_PATCH_COUNT > 0)
1806 printf("\n(with %d registered patch%s, see perl -V for more detail)",
1807 (int)LOCAL_PATCH_COUNT, (LOCAL_PATCH_COUNT!=1) ? "es" : "");
1810 printf("\n\nCopyright 1987-1999, Larry Wall\n");
1811 #ifdef MACOS_TRADITIONAL
1812 fputs("Macintosh port Copyright 1991-1999, Matthias Neeracher\n", stdout);
1815 printf("\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
1818 printf("djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n");
1819 printf("djgpp v2 port (perl5004+) by Laszlo Molnar, 1997-1999\n");
1822 printf("\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
1823 "Version 5 port Copyright (c) 1994-1999, Andreas Kaiser, Ilya Zakharevich\n");
1826 printf("atariST series port, ++jrb bammi@cadence.com\n");
1829 printf("BeOS port Copyright Tom Spindler, 1997-1999\n");
1832 printf("MPE/iX port Copyright by Mark Klein and Mark Bixby, 1996-1999\n");
1835 printf("MVS (OS390) port by Mortice Kern Systems, 1997-1999\n");
1838 printf("Stratus VOS port by Paul_Green@stratus.com, 1997-1999\n");
1841 printf("VM/ESA port by Neale Ferguson, 1998-1999\n");
1844 printf("BS2000 (POSIX) port by Start Amadeus GmbH, 1998-1999\n");
1847 printf("MiNT port by Guido Flohr, 1997-1999\n");
1849 #ifdef BINARY_BUILD_NOTICE
1850 BINARY_BUILD_NOTICE;
1853 Perl may be copied only under the terms of either the Artistic License or the\n\
1854 GNU General Public License, which may be found in the Perl 5.0 source kit.\n\n\
1855 Complete documentation for Perl, including FAQ lists, should be found on\n\
1856 this system using `man perl' or `perldoc perl'. If you have access to the\n\
1857 Internet, point your browser at http://www.perl.com/, the Perl Home Page.\n\n");
1860 if (! (PL_dowarn & G_WARN_ALL_MASK))
1861 PL_dowarn |= G_WARN_ON;
1865 PL_dowarn = G_WARN_ALL_ON|G_WARN_ON;
1866 PL_compiling.cop_warnings = WARN_ALL ;
1870 PL_dowarn = G_WARN_ALL_OFF;
1871 PL_compiling.cop_warnings = WARN_NONE ;
1876 if (s[1] == '-') /* Additional switches on #! line. */
1881 #if defined(WIN32) || !defined(PERL_STRICT_CR)
1887 #ifdef ALTERNATE_SHEBANG
1888 case 'S': /* OS/2 needs -S on "extproc" line. */
1896 Perl_croak(aTHX_ "Can't emulate -%.1s on #! line",s);
1901 /* compliments of Tom Christiansen */
1903 /* unexec() can be found in the Gnu emacs distribution */
1904 /* Known to work with -DUNEXEC and using unexelf.c from GNU emacs-20.2 */
1907 Perl_my_unexec(pTHX)
1915 prog = newSVpv(BIN_EXP, 0);
1916 sv_catpv(prog, "/perl");
1917 file = newSVpv(PL_origfilename, 0);
1918 sv_catpv(file, ".perldump");
1920 unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
1921 /* unexec prints msg to stderr in case of failure */
1922 PerlProc_exit(status);
1925 # include <lib$routines.h>
1926 lib$signal(SS$_DEBUG); /* ssdef.h #included from vmsish.h */
1928 ABORT(); /* for use with undump */
1933 /* initialize curinterp */
1938 #ifdef PERL_OBJECT /* XXX kludge */
1941 PL_chopset = " \n-"; \
1942 PL_copline = NOLINE; \
1943 PL_curcop = &PL_compiling;\
1944 PL_curcopdb = NULL; \
1946 PL_dumpindent = 4; \
1947 PL_laststatval = -1; \
1948 PL_laststype = OP_STAT; \
1949 PL_maxscream = -1; \
1950 PL_maxsysfd = MAXSYSFD; \
1951 PL_statname = Nullsv; \
1952 PL_tmps_floor = -1; \
1954 PL_op_mask = NULL; \
1955 PL_laststatval = -1; \
1956 PL_laststype = OP_STAT; \
1957 PL_mess_sv = Nullsv; \
1958 PL_splitstr = " "; \
1959 PL_generation = 100; \
1960 PL_exitlist = NULL; \
1961 PL_exitlistlen = 0; \
1963 PL_in_clean_objs = FALSE; \
1964 PL_in_clean_all = FALSE; \
1965 PL_profiledata = NULL; \
1967 PL_rsfp_filters = Nullav; \
1972 # ifdef MULTIPLICITY
1973 # define PERLVAR(var,type)
1974 # define PERLVARA(var,n,type)
1975 # if defined(PERL_IMPLICIT_CONTEXT)
1976 # if defined(USE_THREADS)
1977 # define PERLVARI(var,type,init) PERL_GET_INTERP->var = init;
1978 # define PERLVARIC(var,type,init) PERL_GET_INTERP->var = init;
1979 # else /* !USE_THREADS */
1980 # define PERLVARI(var,type,init) aTHX->var = init;
1981 # define PERLVARIC(var,type,init) aTHX->var = init;
1982 # endif /* USE_THREADS */
1984 # define PERLVARI(var,type,init) PERL_GET_INTERP->var = init;
1985 # define PERLVARIC(var,type,init) PERL_GET_INTERP->var = init;
1987 # include "intrpvar.h"
1988 # ifndef USE_THREADS
1989 # include "thrdvar.h"
1996 # define PERLVAR(var,type)
1997 # define PERLVARA(var,n,type)
1998 # define PERLVARI(var,type,init) PL_##var = init;
1999 # define PERLVARIC(var,type,init) PL_##var = init;
2000 # include "intrpvar.h"
2001 # ifndef USE_THREADS
2002 # include "thrdvar.h"
2011 #ifdef MACOS_TRADITIONAL
2012 /* In MacOS time() already returns values in excess of 2**31-1,
2013 * therefore we patch the integerness away. */
2014 PL_opargs[OP_TIME] &= ~OA_RETINTEGER;
2020 S_init_main_stash(pTHX)
2025 /* Note that strtab is a rather special HV. Assumptions are made
2026 about not iterating on it, and not adding tie magic to it.
2027 It is properly deallocated in perl_destruct() */
2028 PL_strtab = newHV();
2030 MUTEX_INIT(&PL_strtab_mutex);
2032 HvSHAREKEYS_off(PL_strtab); /* mandatory */
2033 hv_ksplit(PL_strtab, 512);
2035 PL_curstash = PL_defstash = newHV();
2036 PL_curstname = newSVpvn("main",4);
2037 gv = gv_fetchpv("main::",TRUE, SVt_PVHV);
2038 SvREFCNT_dec(GvHV(gv));
2039 GvHV(gv) = (HV*)SvREFCNT_inc(PL_defstash);
2041 HvNAME(PL_defstash) = savepv("main");
2042 PL_incgv = gv_HVadd(gv_AVadd(gv_fetchpv("INC",TRUE, SVt_PVAV)));
2043 GvMULTI_on(PL_incgv);
2044 PL_hintgv = gv_fetchpv("\010",TRUE, SVt_PV); /* ^H */
2045 GvMULTI_on(PL_hintgv);
2046 PL_defgv = gv_fetchpv("_",TRUE, SVt_PVAV);
2047 PL_errgv = gv_HVadd(gv_fetchpv("@", TRUE, SVt_PV));
2048 GvMULTI_on(PL_errgv);
2049 PL_replgv = gv_fetchpv("\022", TRUE, SVt_PV); /* ^R */
2050 GvMULTI_on(PL_replgv);
2051 (void)Perl_form(aTHX_ "%240s",""); /* Preallocate temp - for immediate signals. */
2052 sv_grow(ERRSV, 240); /* Preallocate - for immediate signals. */
2053 sv_setpvn(ERRSV, "", 0);
2054 PL_curstash = PL_defstash;
2055 PL_compiling.cop_stash = PL_defstash;
2056 PL_debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
2057 PL_globalstash = GvHV(gv_fetchpv("CORE::GLOBAL::", GV_ADDMULTI, SVt_PVHV));
2058 /* We must init $/ before switches are processed. */
2059 sv_setpvn(get_sv("/", TRUE), "\n", 1);
2063 S_open_script(pTHX_ char *scriptname, bool dosearch, SV *sv, int *fdscript)
2071 PL_origfilename = savepv("-e");
2074 /* if find_script() returns, it returns a malloc()-ed value */
2075 PL_origfilename = scriptname = find_script(scriptname, dosearch, NULL, 1);
2077 if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
2078 char *s = scriptname + 8;
2079 *fdscript = atoi(s);
2083 scriptname = savepv(s + 1);
2084 Safefree(PL_origfilename);
2085 PL_origfilename = scriptname;
2090 PL_curcop->cop_filegv = gv_fetchfile(PL_origfilename);
2091 if (strEQ(PL_origfilename,"-"))
2093 if (*fdscript >= 0) {
2094 PL_rsfp = PerlIO_fdopen(*fdscript,PERL_SCRIPT_MODE);
2095 #if defined(HAS_FCNTL) && defined(F_SETFD)
2097 fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,1); /* ensure close-on-exec */
2100 else if (PL_preprocess) {
2101 char *cpp_cfg = CPPSTDIN;
2102 SV *cpp = newSVpvn("",0);
2103 SV *cmd = NEWSV(0,0);
2105 if (strEQ(cpp_cfg, "cppstdin"))
2106 Perl_sv_catpvf(aTHX_ cpp, "%s/", BIN_EXP);
2107 sv_catpv(cpp, cpp_cfg);
2110 sv_catpv(sv,PRIVLIB_EXP);
2113 Perl_sv_setpvf(aTHX_ cmd, "\
2114 sed %s -e \"/^[^#]/b\" \
2115 -e \"/^#[ ]*include[ ]/b\" \
2116 -e \"/^#[ ]*define[ ]/b\" \
2117 -e \"/^#[ ]*if[ ]/b\" \
2118 -e \"/^#[ ]*ifdef[ ]/b\" \
2119 -e \"/^#[ ]*ifndef[ ]/b\" \
2120 -e \"/^#[ ]*else/b\" \
2121 -e \"/^#[ ]*elif[ ]/b\" \
2122 -e \"/^#[ ]*undef[ ]/b\" \
2123 -e \"/^#[ ]*endif/b\" \
2126 (PL_doextract ? "-e \"1,/^#/d\n\"" : ""),
2129 Perl_sv_setpvf(aTHX_ cmd, "\
2130 %s %s -e '/^[^#]/b' \
2131 -e '/^#[ ]*include[ ]/b' \
2132 -e '/^#[ ]*define[ ]/b' \
2133 -e '/^#[ ]*if[ ]/b' \
2134 -e '/^#[ ]*ifdef[ ]/b' \
2135 -e '/^#[ ]*ifndef[ ]/b' \
2136 -e '/^#[ ]*else/b' \
2137 -e '/^#[ ]*elif[ ]/b' \
2138 -e '/^#[ ]*undef[ ]/b' \
2139 -e '/^#[ ]*endif/b' \
2143 Perl_sv_setpvf(aTHX_ cmd, "\
2144 %s %s -e '/^[^#]/b' \
2145 -e '/^#[ ]*include[ ]/b' \
2146 -e '/^#[ ]*define[ ]/b' \
2147 -e '/^#[ ]*if[ ]/b' \
2148 -e '/^#[ ]*ifdef[ ]/b' \
2149 -e '/^#[ ]*ifndef[ ]/b' \
2150 -e '/^#[ ]*else/b' \
2151 -e '/^#[ ]*elif[ ]/b' \
2152 -e '/^#[ ]*undef[ ]/b' \
2153 -e '/^#[ ]*endif/b' \
2162 (PL_doextract ? "-e '1,/^#/d\n'" : ""),
2164 scriptname, cpp, sv, CPPMINUS);
2165 PL_doextract = FALSE;
2166 #ifdef IAMSUID /* actually, this is caught earlier */
2167 if (PL_euid != PL_uid && !PL_euid) { /* if running suidperl */
2169 (void)seteuid(PL_uid); /* musn't stay setuid root */
2172 (void)setreuid((Uid_t)-1, PL_uid);
2174 #ifdef HAS_SETRESUID
2175 (void)setresuid((Uid_t)-1, PL_uid, (Uid_t)-1);
2177 PerlProc_setuid(PL_uid);
2181 if (PerlProc_geteuid() != PL_uid)
2182 Perl_croak(aTHX_ "Can't do seteuid!\n");
2184 #endif /* IAMSUID */
2185 PL_rsfp = PerlProc_popen(SvPVX(cmd), "r");
2189 else if (!*scriptname) {
2190 forbid_setid("program input from stdin");
2191 PL_rsfp = PerlIO_stdin();
2194 PL_rsfp = PerlIO_open(scriptname,PERL_SCRIPT_MODE);
2195 #if defined(HAS_FCNTL) && defined(F_SETFD)
2197 fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,1); /* ensure close-on-exec */
2202 #ifndef IAMSUID /* in case script is not readable before setuid */
2204 PerlLIO_stat(SvPVX(GvSV(PL_curcop->cop_filegv)),&PL_statbuf) >= 0 &&
2205 PL_statbuf.st_mode & (S_ISUID|S_ISGID))
2208 PerlProc_execv(Perl_form(aTHX_ "%s/sperl%s", BIN_EXP, PL_patchlevel), PL_origargv);
2209 Perl_croak(aTHX_ "Can't do setuid\n");
2213 Perl_croak(aTHX_ "Can't open perl script \"%s\": %s\n",
2214 SvPVX(GvSV(PL_curcop->cop_filegv)), Strerror(errno));
2219 * I_SYSSTATVFS HAS_FSTATVFS
2221 * I_STATFS HAS_FSTATFS
2222 * I_MNTENT HAS_GETMNTENT HAS_HASMNTOPT
2223 * here so that metaconfig picks them up. */
2227 S_fd_on_nosuid_fs(pTHX_ int fd)
2229 int check_okay = 0; /* able to do all the required sys/libcalls */
2230 int on_nosuid = 0; /* the fd is on a nosuid fs */
2232 * Preferred order: fstatvfs(), fstatfs(), ustat()+getmnt(), getmntent().
2233 * fstatvfs() is UNIX98.
2234 * fstatfs() is 4.3 BSD.
2235 * ustat()+getmnt() is pre-4.3 BSD.
2236 * getmntent() is O(number-of-mounted-filesystems) and can hang on
2237 * an irrelevant filesystem while trying to reach the right one.
2240 # ifdef HAS_FSTATVFS
2241 struct statvfs stfs;
2242 check_okay = fstatvfs(fd, &stfs) == 0;
2243 on_nosuid = check_okay && (stfs.f_flag & ST_NOSUID);
2245 # ifdef PERL_MOUNT_NOSUID
2246 # if defined(HAS_FSTATFS) && \
2247 defined(HAS_STRUCT_STATFS) && \
2248 defined(HAS_STRUCT_STATFS_F_FLAGS)
2250 check_okay = fstatfs(fd, &stfs) == 0;
2251 on_nosuid = check_okay && (stfs.f_flags & PERL_MOUNT_NOSUID);
2253 # if defined(HAS_FSTAT) && \
2254 defined(HAS_USTAT) && \
2255 defined(HAS_GETMNT) && \
2256 defined(HAS_STRUCT_FS_DATA) &&
2259 if (fstat(fd, &fdst) == 0) {
2261 if (ustat(fdst.st_dev, &us) == 0) {
2263 /* NOSTAT_ONE here because we're not examining fields which
2264 * vary between that case and STAT_ONE. */
2265 if (getmnt((int*)0, &fsd, (int)0, NOSTAT_ONE, us.f_fname) == 0) {
2266 size_t cmplen = sizeof(us.f_fname);
2267 if (sizeof(fsd.fd_req.path) < cmplen)
2268 cmplen = sizeof(fsd.fd_req.path);
2269 if (strnEQ(fsd.fd_req.path, us.f_fname, cmplen) &&
2270 fdst.st_dev == fsd.fd_req.dev) {
2272 on_nosuid = fsd.fd_req.flags & PERL_MOUNT_NOSUID;
2278 # endif /* fstat+ustat+getmnt */
2279 # endif /* fstatfs */
2281 # if defined(HAS_GETMNTENT) && \
2282 defined(HAS_HASMNTOPT) && \
2283 defined(MNTOPT_NOSUID)
2284 FILE *mtab = fopen("/etc/mtab", "r");
2285 struct mntent *entry;
2286 struct stat stb, fsb;
2288 if (mtab && (fstat(fd, &stb) == 0)) {
2289 while (entry = getmntent(mtab)) {
2290 if (stat(entry->mnt_dir, &fsb) == 0
2291 && fsb.st_dev == stb.st_dev)
2293 /* found the filesystem */
2295 if (hasmntopt(entry, MNTOPT_NOSUID))
2298 } /* A single fs may well fail its stat(). */
2303 # endif /* getmntent+hasmntopt */
2304 # endif /* PERL_MOUNT_NOSUID: fstatfs or fstat+ustat+statfs */
2305 # endif /* statvfs */
2308 Perl_croak(aTHX_ "Can't check filesystem of script \"%s\" for nosuid", PL_origfilename);
2311 #endif /* IAMSUID */
2314 S_validate_suid(pTHX_ char *validarg, char *scriptname, int fdscript)
2318 /* do we need to emulate setuid on scripts? */
2320 /* This code is for those BSD systems that have setuid #! scripts disabled
2321 * in the kernel because of a security problem. Merely defining DOSUID
2322 * in perl will not fix that problem, but if you have disabled setuid
2323 * scripts in the kernel, this will attempt to emulate setuid and setgid
2324 * on scripts that have those now-otherwise-useless bits set. The setuid
2325 * root version must be called suidperl or sperlN.NNN. If regular perl
2326 * discovers that it has opened a setuid script, it calls suidperl with
2327 * the same argv that it had. If suidperl finds that the script it has
2328 * just opened is NOT setuid root, it sets the effective uid back to the
2329 * uid. We don't just make perl setuid root because that loses the
2330 * effective uid we had before invoking perl, if it was different from the
2333 * DOSUID must be defined in both perl and suidperl, and IAMSUID must
2334 * be defined in suidperl only. suidperl must be setuid root. The
2335 * Configure script will set this up for you if you want it.
2342 if (PerlLIO_fstat(PerlIO_fileno(PL_rsfp),&PL_statbuf) < 0) /* normal stat is insecure */
2343 Perl_croak(aTHX_ "Can't stat script \"%s\"",PL_origfilename);
2344 if (fdscript < 0 && PL_statbuf.st_mode & (S_ISUID|S_ISGID)) {
2349 #ifndef HAS_SETREUID
2350 /* On this access check to make sure the directories are readable,
2351 * there is actually a small window that the user could use to make
2352 * filename point to an accessible directory. So there is a faint
2353 * chance that someone could execute a setuid script down in a
2354 * non-accessible directory. I don't know what to do about that.
2355 * But I don't think it's too important. The manual lies when
2356 * it says access() is useful in setuid programs.
2358 if (PerlLIO_access(SvPVX(GvSV(PL_curcop->cop_filegv)),1)) /*double check*/
2359 Perl_croak(aTHX_ "Permission denied");
2361 /* If we can swap euid and uid, then we can determine access rights
2362 * with a simple stat of the file, and then compare device and
2363 * inode to make sure we did stat() on the same file we opened.
2364 * Then we just have to make sure he or she can execute it.
2367 struct stat tmpstatbuf;
2371 setreuid(PL_euid,PL_uid) < 0
2374 setresuid(PL_euid,PL_uid,(Uid_t)-1) < 0
2377 || PerlProc_getuid() != PL_euid || PerlProc_geteuid() != PL_uid)
2378 Perl_croak(aTHX_ "Can't swap uid and euid"); /* really paranoid */
2379 if (PerlLIO_stat(SvPVX(GvSV(PL_curcop->cop_filegv)),&tmpstatbuf) < 0)
2380 Perl_croak(aTHX_ "Permission denied"); /* testing full pathname here */
2381 #if defined(IAMSUID) && !defined(NO_NOSUID_CHECK)
2382 if (fd_on_nosuid_fs(PerlIO_fileno(PL_rsfp)))
2383 Perl_croak(aTHX_ "Permission denied");
2385 if (tmpstatbuf.st_dev != PL_statbuf.st_dev ||
2386 tmpstatbuf.st_ino != PL_statbuf.st_ino) {
2387 (void)PerlIO_close(PL_rsfp);
2388 if (PL_rsfp = PerlProc_popen("/bin/mail root","w")) { /* heh, heh */
2389 PerlIO_printf(PL_rsfp,
2390 "User %"Uid_t_f" tried to run dev %ld ino %ld in place of dev %ld ino %ld!\n\
2391 (Filename of set-id script was %s, uid %"Uid_t_f" gid %"Gid_t_f".)\n\nSincerely,\nperl\n",
2392 PL_uid,(long)tmpstatbuf.st_dev, (long)tmpstatbuf.st_ino,
2393 (long)PL_statbuf.st_dev, (long)PL_statbuf.st_ino,
2394 SvPVX(GvSV(PL_curcop->cop_filegv)),
2395 PL_statbuf.st_uid, PL_statbuf.st_gid);
2396 (void)PerlProc_pclose(PL_rsfp);
2398 Perl_croak(aTHX_ "Permission denied\n");
2402 setreuid(PL_uid,PL_euid) < 0
2404 # if defined(HAS_SETRESUID)
2405 setresuid(PL_uid,PL_euid,(Uid_t)-1) < 0
2408 || PerlProc_getuid() != PL_uid || PerlProc_geteuid() != PL_euid)
2409 Perl_croak(aTHX_ "Can't reswap uid and euid");
2410 if (!cando(S_IXUSR,FALSE,&PL_statbuf)) /* can real uid exec? */
2411 Perl_croak(aTHX_ "Permission denied\n");
2413 #endif /* HAS_SETREUID */
2414 #endif /* IAMSUID */
2416 if (!S_ISREG(PL_statbuf.st_mode))
2417 Perl_croak(aTHX_ "Permission denied");
2418 if (PL_statbuf.st_mode & S_IWOTH)
2419 Perl_croak(aTHX_ "Setuid/gid script is writable by world");
2420 PL_doswitches = FALSE; /* -s is insecure in suid */
2421 PL_curcop->cop_line++;
2422 if (sv_gets(PL_linestr, PL_rsfp, 0) == Nullch ||
2423 strnNE(SvPV(PL_linestr,n_a),"#!",2) ) /* required even on Sys V */
2424 Perl_croak(aTHX_ "No #! line");
2425 s = SvPV(PL_linestr,n_a)+2;
2427 while (!isSPACE(*s)) s++;
2428 for (s2 = s; (s2 > SvPV(PL_linestr,n_a)+2 &&
2429 (isDIGIT(s2[-1]) || strchr("._-", s2[-1]))); s2--) ;
2430 if (strnNE(s2-4,"perl",4) && strnNE(s-9,"perl",4)) /* sanity check */
2431 Perl_croak(aTHX_ "Not a perl script");
2432 while (*s == ' ' || *s == '\t') s++;
2434 * #! arg must be what we saw above. They can invoke it by
2435 * mentioning suidperl explicitly, but they may not add any strange
2436 * arguments beyond what #! says if they do invoke suidperl that way.
2438 len = strlen(validarg);
2439 if (strEQ(validarg," PHOOEY ") ||
2440 strnNE(s,validarg,len) || !isSPACE(s[len]))
2441 Perl_croak(aTHX_ "Args must match #! line");
2444 if (PL_euid != PL_uid && (PL_statbuf.st_mode & S_ISUID) &&
2445 PL_euid == PL_statbuf.st_uid)
2447 Perl_croak(aTHX_ "YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2448 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2449 #endif /* IAMSUID */
2451 if (PL_euid) { /* oops, we're not the setuid root perl */
2452 (void)PerlIO_close(PL_rsfp);
2455 PerlProc_execv(Perl_form(aTHX_ "%s/sperl%s", BIN_EXP, PL_patchlevel), PL_origargv);
2457 Perl_croak(aTHX_ "Can't do setuid\n");
2460 if (PL_statbuf.st_mode & S_ISGID && PL_statbuf.st_gid != PL_egid) {
2462 (void)setegid(PL_statbuf.st_gid);
2465 (void)setregid((Gid_t)-1,PL_statbuf.st_gid);
2467 #ifdef HAS_SETRESGID
2468 (void)setresgid((Gid_t)-1,PL_statbuf.st_gid,(Gid_t)-1);
2470 PerlProc_setgid(PL_statbuf.st_gid);
2474 if (PerlProc_getegid() != PL_statbuf.st_gid)
2475 Perl_croak(aTHX_ "Can't do setegid!\n");
2477 if (PL_statbuf.st_mode & S_ISUID) {
2478 if (PL_statbuf.st_uid != PL_euid)
2480 (void)seteuid(PL_statbuf.st_uid); /* all that for this */
2483 (void)setreuid((Uid_t)-1,PL_statbuf.st_uid);
2485 #ifdef HAS_SETRESUID
2486 (void)setresuid((Uid_t)-1,PL_statbuf.st_uid,(Uid_t)-1);
2488 PerlProc_setuid(PL_statbuf.st_uid);
2492 if (PerlProc_geteuid() != PL_statbuf.st_uid)
2493 Perl_croak(aTHX_ "Can't do seteuid!\n");
2495 else if (PL_uid) { /* oops, mustn't run as root */
2497 (void)seteuid((Uid_t)PL_uid);
2500 (void)setreuid((Uid_t)-1,(Uid_t)PL_uid);
2502 #ifdef HAS_SETRESUID
2503 (void)setresuid((Uid_t)-1,(Uid_t)PL_uid,(Uid_t)-1);
2505 PerlProc_setuid((Uid_t)PL_uid);
2509 if (PerlProc_geteuid() != PL_uid)
2510 Perl_croak(aTHX_ "Can't do seteuid!\n");
2513 if (!cando(S_IXUSR,TRUE,&PL_statbuf))
2514 Perl_croak(aTHX_ "Permission denied\n"); /* they can't do this */
2517 else if (PL_preprocess)
2518 Perl_croak(aTHX_ "-P not allowed for setuid/setgid script\n");
2519 else if (fdscript >= 0)
2520 Perl_croak(aTHX_ "fd script not allowed in suidperl\n");
2522 Perl_croak(aTHX_ "Script is not setuid/setgid in suidperl\n");
2524 /* We absolutely must clear out any saved ids here, so we */
2525 /* exec the real perl, substituting fd script for scriptname. */
2526 /* (We pass script name as "subdir" of fd, which perl will grok.) */
2527 PerlIO_rewind(PL_rsfp);
2528 PerlLIO_lseek(PerlIO_fileno(PL_rsfp),(Off_t)0,0); /* just in case rewind didn't */
2529 for (which = 1; PL_origargv[which] && PL_origargv[which] != scriptname; which++) ;
2530 if (!PL_origargv[which])
2531 Perl_croak(aTHX_ "Permission denied");
2532 PL_origargv[which] = savepv(Perl_form(aTHX_ "/dev/fd/%d/%s",
2533 PerlIO_fileno(PL_rsfp), PL_origargv[which]));
2534 #if defined(HAS_FCNTL) && defined(F_SETFD)
2535 fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,0); /* ensure no close-on-exec */
2537 PerlProc_execv(Perl_form(aTHX_ "%s/perl%s", BIN_EXP, PL_patchlevel), PL_origargv);/* try again */
2538 Perl_croak(aTHX_ "Can't do setuid\n");
2539 #endif /* IAMSUID */
2541 if (PL_euid != PL_uid || PL_egid != PL_gid) { /* (suidperl doesn't exist, in fact) */
2542 #ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
2544 PerlLIO_fstat(PerlIO_fileno(PL_rsfp),&PL_statbuf); /* may be either wrapped or real suid */
2545 if ((PL_euid != PL_uid && PL_euid == PL_statbuf.st_uid && PL_statbuf.st_mode & S_ISUID)
2547 (PL_egid != PL_gid && PL_egid == PL_statbuf.st_gid && PL_statbuf.st_mode & S_ISGID)
2550 Perl_croak(aTHX_ "YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2551 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2552 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
2553 /* not set-id, must be wrapped */
2559 S_find_beginning(pTHX)
2561 register char *s, *s2;
2563 /* skip forward in input to the real script? */
2566 #ifdef MACOS_TRADITIONAL
2567 /* Since the Mac OS does not honor !# arguments for us,
2568 * we do it ourselves. */
2569 while (PL_doextract || gAlwaysExtract) {
2570 if ((s = sv_gets(PL_linestr, PL_rsfp, 0)) == Nullch) {
2571 if (!gAlwaysExtract)
2572 Perl_croak(aTHX_ "No Perl script found in input\n");
2574 if (PL_doextract) /* require explicit override ? */
2575 if (!OverrideExtract(PL_origfilename))
2576 Perl_croak(aTHX_ "User aborted script\n");
2578 PL_doextract = FALSE;
2580 /* Pater peccavi, file does not have #! */
2581 PerlIO_rewind(PL_rsfp);
2586 while (PL_doextract) {
2587 if ((s = sv_gets(PL_linestr, PL_rsfp, 0)) == Nullch)
2588 Perl_croak(aTHX_ "No Perl script found in input\n");
2590 if (*s == '#' && s[1] == '!' && (s = instr(s,"perl"))) {
2591 PerlIO_ungetc(PL_rsfp, '\n'); /* to keep line count right */
2592 PL_doextract = FALSE;
2593 while (*s && !(isSPACE (*s) || *s == '#')) s++;
2595 while (*s == ' ' || *s == '\t') s++;
2597 while (isDIGIT(s2[-1]) || strchr("-._", s2[-1])) s2--;
2598 if (strnEQ(s2-4,"perl",4))
2600 while (s = moreswitches(s)) ;
2610 PL_uid = PerlProc_getuid();
2611 PL_euid = PerlProc_geteuid();
2612 PL_gid = PerlProc_getgid();
2613 PL_egid = PerlProc_getegid();
2615 PL_uid |= PL_gid << 16;
2616 PL_euid |= PL_egid << 16;
2618 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2622 S_forbid_setid(pTHX_ char *s)
2624 if (PL_euid != PL_uid)
2625 Perl_croak(aTHX_ "No %s allowed while running setuid", s);
2626 if (PL_egid != PL_gid)
2627 Perl_croak(aTHX_ "No %s allowed while running setgid", s);
2631 Perl_init_debugger(pTHX)
2634 HV *ostash = PL_curstash;
2636 PL_curstash = PL_debstash;
2637 PL_dbargs = GvAV(gv_AVadd((gv_fetchpv("args", GV_ADDMULTI, SVt_PVAV))));
2638 AvREAL_off(PL_dbargs);
2639 PL_DBgv = gv_fetchpv("DB", GV_ADDMULTI, SVt_PVGV);
2640 PL_DBline = gv_fetchpv("dbline", GV_ADDMULTI, SVt_PVAV);
2641 PL_DBsub = gv_HVadd(gv_fetchpv("sub", GV_ADDMULTI, SVt_PVHV));
2642 sv_upgrade(GvSV(PL_DBsub), SVt_IV); /* IVX accessed if PERLDB_SUB_NN */
2643 PL_DBsingle = GvSV((gv_fetchpv("single", GV_ADDMULTI, SVt_PV)));
2644 sv_setiv(PL_DBsingle, 0);
2645 PL_DBtrace = GvSV((gv_fetchpv("trace", GV_ADDMULTI, SVt_PV)));
2646 sv_setiv(PL_DBtrace, 0);
2647 PL_DBsignal = GvSV((gv_fetchpv("signal", GV_ADDMULTI, SVt_PV)));
2648 sv_setiv(PL_DBsignal, 0);
2649 PL_curstash = ostash;
2652 #ifndef STRESS_REALLOC
2653 #define REASONABLE(size) (size)
2655 #define REASONABLE(size) (1) /* unreasonable */
2659 Perl_init_stacks(pTHX)
2661 /* start with 128-item stack and 8K cxstack */
2662 PL_curstackinfo = new_stackinfo(REASONABLE(128),
2663 REASONABLE(8192/sizeof(PERL_CONTEXT) - 1));
2664 PL_curstackinfo->si_type = PERLSI_MAIN;
2665 PL_curstack = PL_curstackinfo->si_stack;
2666 PL_mainstack = PL_curstack; /* remember in case we switch stacks */
2668 PL_stack_base = AvARRAY(PL_curstack);
2669 PL_stack_sp = PL_stack_base;
2670 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
2672 New(50,PL_tmps_stack,REASONABLE(128),SV*);
2675 PL_tmps_max = REASONABLE(128);
2677 New(54,PL_markstack,REASONABLE(32),I32);
2678 PL_markstack_ptr = PL_markstack;
2679 PL_markstack_max = PL_markstack + REASONABLE(32);
2683 New(54,PL_scopestack,REASONABLE(32),I32);
2684 PL_scopestack_ix = 0;
2685 PL_scopestack_max = REASONABLE(32);
2687 New(54,PL_savestack,REASONABLE(128),ANY);
2688 PL_savestack_ix = 0;
2689 PL_savestack_max = REASONABLE(128);
2691 New(54,PL_retstack,REASONABLE(16),OP*);
2693 PL_retstack_max = REASONABLE(16);
2702 while (PL_curstackinfo->si_next)
2703 PL_curstackinfo = PL_curstackinfo->si_next;
2704 while (PL_curstackinfo) {
2705 PERL_SI *p = PL_curstackinfo->si_prev;
2706 /* curstackinfo->si_stack got nuked by sv_free_arenas() */
2707 Safefree(PL_curstackinfo->si_cxstack);
2708 Safefree(PL_curstackinfo);
2709 PL_curstackinfo = p;
2711 Safefree(PL_tmps_stack);
2712 Safefree(PL_markstack);
2713 Safefree(PL_scopestack);
2714 Safefree(PL_savestack);
2715 Safefree(PL_retstack);
2719 static PerlIO *tmpfp; /* moved outside init_lexer() because of UNICOS bug */
2730 lex_start(PL_linestr);
2732 PL_subname = newSVpvn("main",4);
2736 S_init_predump_symbols(pTHX)
2743 sv_setpvn(get_sv("\"", TRUE), " ", 1);
2744 PL_stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
2745 GvMULTI_on(PL_stdingv);
2746 io = GvIOp(PL_stdingv);
2747 IoIFP(io) = PerlIO_stdin();
2748 tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
2750 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
2752 tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
2755 IoOFP(io) = IoIFP(io) = PerlIO_stdout();
2757 tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
2759 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
2761 PL_stderrgv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
2762 GvMULTI_on(PL_stderrgv);
2763 io = GvIOp(PL_stderrgv);
2764 IoOFP(io) = IoIFP(io) = PerlIO_stderr();
2765 tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
2767 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
2769 PL_statname = NEWSV(66,0); /* last filename we did stat on */
2772 Safefree(PL_osname);
2773 PL_osname = savepv(OSNAME);
2777 S_init_postdump_symbols(pTHX_ register int argc, register char **argv, register char **env)
2784 argc--,argv++; /* skip name of script */
2785 if (PL_doswitches) {
2786 for (; argc > 0 && **argv == '-'; argc--,argv++) {
2789 if (argv[0][1] == '-') {
2793 if (s = strchr(argv[0], '=')) {
2795 sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),s);
2798 sv_setiv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),1);
2801 PL_toptarget = NEWSV(0,0);
2802 sv_upgrade(PL_toptarget, SVt_PVFM);
2803 sv_setpvn(PL_toptarget, "", 0);
2804 PL_bodytarget = NEWSV(0,0);
2805 sv_upgrade(PL_bodytarget, SVt_PVFM);
2806 sv_setpvn(PL_bodytarget, "", 0);
2807 PL_formtarget = PL_bodytarget;
2810 if (tmpgv = gv_fetchpv("0",TRUE, SVt_PV)) {
2811 #ifdef MACOS_TRADITIONAL
2812 sv_setpv(GvSV(tmpgv),MPWFileName(PL_origfilename));
2813 /* $0 is not majick on a Mac */
2815 sv_setpv(GvSV(tmpgv),PL_origfilename);
2816 magicname("0", "0", 1);
2819 if (tmpgv = gv_fetchpv("\030",TRUE, SVt_PV))
2821 sv_setpv(GvSV(tmpgv), os2_execname());
2823 sv_setpv(GvSV(tmpgv),PL_origargv[0]);
2825 if (PL_argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV)) {
2826 GvMULTI_on(PL_argvgv);
2827 (void)gv_AVadd(PL_argvgv);
2828 av_clear(GvAVn(PL_argvgv));
2829 for (; argc > 0; argc--,argv++) {
2830 av_push(GvAVn(PL_argvgv),newSVpv(argv[0],0));
2833 if (PL_envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV)) {
2835 GvMULTI_on(PL_envgv);
2836 hv = GvHVn(PL_envgv);
2837 hv_magic(hv, PL_envgv, 'E');
2838 #if !defined( VMS) && !defined(EPOC) /* VMS doesn't have environ array */
2839 /* Note that if the supplied env parameter is actually a copy
2840 of the global environ then it may now point to free'd memory
2841 if the environment has been modified since. To avoid this
2842 problem we treat env==NULL as meaning 'use the default'
2847 environ[0] = Nullch;
2848 for (; *env; env++) {
2849 if (!(s = strchr(*env,'=')))
2855 sv = newSVpv(s--,0);
2856 (void)hv_store(hv, *env, s - *env, sv, 0);
2858 #if defined(__BORLANDC__) && defined(USE_WIN32_RTL_ENV)
2859 /* Sins of the RTL. See note in my_setenv(). */
2860 (void)PerlEnv_putenv(savepv(*env));
2864 #ifdef DYNAMIC_ENV_FETCH
2865 HvNAME(hv) = savepv(ENV_HV_NAME);
2869 if (tmpgv = gv_fetchpv("$",TRUE, SVt_PV))
2870 sv_setiv(GvSV(tmpgv), (IV)getpid());
2874 S_init_perllib(pTHX)
2879 s = PerlEnv_getenv("PERL5LIB");
2883 incpush(PerlEnv_getenv("PERLLIB"), FALSE);
2885 /* Treat PERL5?LIB as a possible search list logical name -- the
2886 * "natural" VMS idiom for a Unix path string. We allow each
2887 * element to be a set of |-separated directories for compatibility.
2891 if (my_trnlnm("PERL5LIB",buf,0))
2892 do { incpush(buf,TRUE); } while (my_trnlnm("PERL5LIB",buf,++idx));
2894 while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE);
2898 /* Use the ~-expanded versions of APPLLIB (undocumented),
2899 ARCHLIB PRIVLIB SITEARCH and SITELIB
2902 incpush(APPLLIB_EXP, TRUE);
2906 incpush(ARCHLIB_EXP, FALSE);
2908 #ifdef MACOS_TRADITIONAL
2910 struct stat tmpstatbuf;
2911 SV * privdir = NEWSV(55, 0);
2912 char * macperl = getenv("MACPERL") || "";
2914 Perl_sv_setpvf(privdir, "%slib:", macperl);
2915 if (PerlLIO_stat(SvPVX(privdir), &tmpstatbuf) >= 0 && S_ISDIR(tmpstatbuf.st_mode))
2916 incpush(SvPVX(privdir), TRUE);
2917 Perl_sv_setpvf(privdir, "%ssite_perl:", macperl);
2918 if (PerlLIO_stat(SvPVX(privdir), &tmpstatbuf) >= 0 && S_ISDIR(tmpstatbuf.st_mode))
2919 incpush(SvPVX(privdir), TRUE);
2921 SvREFCNT_dec(privdir);
2924 incpush(":", FALSE);
2927 #define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
2930 incpush(PRIVLIB_EXP, TRUE);
2932 incpush(PRIVLIB_EXP, FALSE);
2936 incpush(SITEARCH_EXP, FALSE);
2940 incpush(SITELIB_EXP, TRUE);
2942 incpush(SITELIB_EXP, FALSE);
2945 #if defined(PERL_VENDORLIB_EXP)
2947 incpush(PERL_VENDORLIB_EXP, TRUE);
2949 incpush(PERL_VENDORLIB_EXP, FALSE);
2953 incpush(".", FALSE);
2954 #endif /* MACOS_TRADITIONAL */
2957 #if defined(MACOS_TRADITIONAL)
2958 # define PERLLIB_SEP ','
2960 # if defined(DOSISH)
2961 # define PERLLIB_SEP ';'
2964 # define PERLLIB_SEP '|'
2966 # define PERLLIB_SEP ':'
2970 #ifndef PERLLIB_MANGLE
2971 # define PERLLIB_MANGLE(s,n) (s)
2975 S_incpush(pTHX_ char *p, int addsubdirs)
2977 SV *subdir = Nullsv;
2983 subdir = sv_newmortal();
2984 if (!PL_archpat_auto) {
2985 STRLEN len = (sizeof(ARCHNAME) + strlen(PL_patchlevel)
2986 + sizeof("//auto"));
2987 New(55, PL_archpat_auto, len, char);
2988 #ifdef MACOS_TRADITIONAL
2989 sprintf(PL_archpat_auto, "%s:%s:auto:", ARCHNAME, PL_patchlevel);
2991 sprintf(PL_archpat_auto, "/%s/%s/auto", ARCHNAME, PL_patchlevel);
2994 for (len = sizeof(ARCHNAME) + 2;
2995 PL_archpat_auto[len] != '\0' && PL_archpat_auto[len] != '/'; len++)
2996 if (PL_archpat_auto[len] == '.') PL_archpat_auto[len] = '_';
3001 /* Break at all separators */
3003 SV *libdir = NEWSV(55,0);
3006 /* skip any consecutive separators */
3007 while ( *p == PERLLIB_SEP ) {
3008 /* Uncomment the next line for PATH semantics */
3009 /* av_push(GvAVn(PL_incgv), newSVpvn(".", 1)); */
3013 if ( (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
3014 sv_setpvn(libdir, PERLLIB_MANGLE(p, (STRLEN)(s - p)),
3019 sv_setpv(libdir, PERLLIB_MANGLE(p, 0));
3020 p = Nullch; /* break out */
3022 #ifdef MACOS_TRADITIONAL
3023 if (!strchr(SvPVX(libdir), ':'))
3024 sv_insert(libdir, 0, 0, ":", 1);
3025 if (SvPVX(libdir)[SvCUR(libdir)-1] != ':')
3026 sv_catpv(libdir, ":");
3030 * BEFORE pushing libdir onto @INC we may first push version- and
3031 * archname-specific sub-directories.
3034 struct stat tmpstatbuf;
3039 if ((unix = tounixspec_ts(SvPV(libdir,len),Nullch)) != Nullch) {
3041 while (unix[len-1] == '/') len--; /* Cosmetic */
3042 sv_usepvn(libdir,unix,len);
3045 PerlIO_printf(Perl_error_log,
3046 "Failed to unixify @INC element \"%s\"\n",
3049 /* .../archname/version if -d .../archname/version/auto */
3050 sv_setsv(subdir, libdir);
3051 sv_catpv(subdir, PL_archpat_auto);
3052 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
3053 S_ISDIR(tmpstatbuf.st_mode))
3054 av_push(GvAVn(PL_incgv),
3055 newSVpvn(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
3057 /* .../archname if -d .../archname/auto */
3058 sv_insert(subdir, SvCUR(libdir) + sizeof(ARCHNAME),
3059 strlen(PL_patchlevel) + 1, "", 0);
3060 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
3061 S_ISDIR(tmpstatbuf.st_mode))
3062 av_push(GvAVn(PL_incgv),
3063 newSVpvn(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
3066 /* finally push this lib directory on the end of @INC */
3067 av_push(GvAVn(PL_incgv), libdir);
3072 STATIC struct perl_thread *
3073 S_init_main_thread(pTHX)
3075 #if !defined(PERL_IMPLICIT_CONTEXT)
3076 struct perl_thread *thr;
3080 Newz(53, thr, 1, struct perl_thread);
3081 PL_curcop = &PL_compiling;
3082 thr->interp = PERL_GET_INTERP;
3083 thr->cvcache = newHV();
3084 thr->threadsv = newAV();
3085 /* thr->threadsvp is set when find_threadsv is called */
3086 thr->specific = newAV();
3087 thr->flags = THRf_R_JOINABLE;
3088 MUTEX_INIT(&thr->mutex);
3089 /* Handcraft thrsv similarly to mess_sv */
3090 New(53, PL_thrsv, 1, SV);
3091 Newz(53, xpv, 1, XPV);
3092 SvFLAGS(PL_thrsv) = SVt_PV;
3093 SvANY(PL_thrsv) = (void*)xpv;
3094 SvREFCNT(PL_thrsv) = 1 << 30; /* practically infinite */
3095 SvPVX(PL_thrsv) = (char*)thr;
3096 SvCUR_set(PL_thrsv, sizeof(thr));
3097 SvLEN_set(PL_thrsv, sizeof(thr));
3098 *SvEND(PL_thrsv) = '\0'; /* in the trailing_nul field */
3099 thr->oursv = PL_thrsv;
3100 PL_chopset = " \n-";
3103 MUTEX_LOCK(&PL_threads_mutex);
3108 MUTEX_UNLOCK(&PL_threads_mutex);
3110 #ifdef HAVE_THREAD_INTERN
3111 Perl_init_thread_intern(thr);
3114 #ifdef SET_THREAD_SELF
3115 SET_THREAD_SELF(thr);
3117 thr->self = pthread_self();
3118 #endif /* SET_THREAD_SELF */
3122 * These must come after the SET_THR because sv_setpvn does
3123 * SvTAINT and the taint fields require dTHR.
3125 PL_toptarget = NEWSV(0,0);
3126 sv_upgrade(PL_toptarget, SVt_PVFM);
3127 sv_setpvn(PL_toptarget, "", 0);
3128 PL_bodytarget = NEWSV(0,0);
3129 sv_upgrade(PL_bodytarget, SVt_PVFM);
3130 sv_setpvn(PL_bodytarget, "", 0);
3131 PL_formtarget = PL_bodytarget;
3132 thr->errsv = newSVpvn("", 0);
3133 (void) find_threadsv("@"); /* Ensure $@ is initialised early */
3136 PL_regcompp = MEMBER_TO_FPTR(Perl_pregcomp);
3137 PL_regexecp = MEMBER_TO_FPTR(Perl_regexec_flags);
3138 PL_regint_start = MEMBER_TO_FPTR(Perl_re_intuit_start);
3139 PL_regint_string = MEMBER_TO_FPTR(Perl_re_intuit_string);
3140 PL_regfree = MEMBER_TO_FPTR(Perl_pregfree);
3142 PL_reginterp_cnt = 0;
3146 #endif /* USE_THREADS */
3149 Perl_call_list(pTHX_ I32 oldscope, AV *paramList)
3153 line_t oldline = PL_curcop->cop_line;
3159 while (AvFILL(paramList) >= 0) {
3160 cv = (CV*)av_shift(paramList);
3162 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_call_list_body), cv);
3165 (void)SvPV(atsv, len);
3167 PL_curcop = &PL_compiling;
3168 PL_curcop->cop_line = oldline;
3169 if (paramList == PL_beginav)
3170 sv_catpv(atsv, "BEGIN failed--compilation aborted");
3172 sv_catpv(atsv, "END failed--cleanup aborted");
3173 while (PL_scopestack_ix > oldscope)
3175 Perl_croak(aTHX_ "%s", SvPVX(atsv));
3182 /* my_exit() was called */
3183 while (PL_scopestack_ix > oldscope)
3186 PL_curstash = PL_defstash;
3187 if (PL_endav && !PL_minus_c)
3188 call_list(oldscope, PL_endav);
3189 PL_curcop = &PL_compiling;
3190 PL_curcop->cop_line = oldline;
3191 if (PL_statusvalue) {
3192 if (paramList == PL_beginav)
3193 Perl_croak(aTHX_ "BEGIN failed--compilation aborted");
3195 Perl_croak(aTHX_ "END failed--cleanup aborted");
3201 PL_curcop = &PL_compiling;
3202 PL_curcop->cop_line = oldline;
3205 PerlIO_printf(Perl_error_log, "panic: restartop\n");
3213 S_call_list_body(pTHX_ va_list args)
3216 CV *cv = va_arg(args, CV*);
3218 PUSHMARK(PL_stack_sp);
3219 call_sv((SV*)cv, G_EVAL|G_DISCARD);
3224 Perl_my_exit(pTHX_ U32 status)
3228 DEBUG_S(PerlIO_printf(Perl_debug_log, "my_exit: thread %p, status %lu\n",
3229 thr, (unsigned long) status));
3238 STATUS_NATIVE_SET(status);
3245 Perl_my_failure_exit(pTHX)
3248 if (vaxc$errno & 1) {
3249 if (STATUS_NATIVE & 1) /* fortuitiously includes "-1" */
3250 STATUS_NATIVE_SET(44);
3253 if (!vaxc$errno && errno) /* unlikely */
3254 STATUS_NATIVE_SET(44);
3256 STATUS_NATIVE_SET(vaxc$errno);
3261 STATUS_POSIX_SET(errno);
3263 exitstatus = STATUS_POSIX >> 8;
3264 if (exitstatus & 255)
3265 STATUS_POSIX_SET(exitstatus);
3267 STATUS_POSIX_SET(255);
3274 S_my_exit_jump(pTHX)
3277 register PERL_CONTEXT *cx;
3282 SvREFCNT_dec(PL_e_script);
3283 PL_e_script = Nullsv;
3286 POPSTACK_TO(PL_mainstack);
3287 if (cxstack_ix >= 0) {
3290 POPBLOCK(cx,PL_curpm);
3303 read_e_script(pTHXo_ int idx, SV *buf_sv, int maxlen)
3306 p = SvPVX(PL_e_script);
3307 nl = strchr(p, '\n');
3308 nl = (nl) ? nl+1 : SvEND(PL_e_script);
3310 filter_del(read_e_script);
3313 sv_catpvn(buf_sv, p, nl-p);
3314 sv_chop(PL_e_script, nl);