3 * Copyright (c) 1987-1998 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
16 #include "patchlevel.h"
18 /* XXX If this causes problems, set i_unistd=undef in the hint file. */
23 #if !defined(STANDARD_C) && !defined(HAS_GETENV_PROTOTYPE)
24 char *getenv _((char *)); /* Usually in <stdlib.h> */
34 dEXTCONST char rcsid[] = "perl.c\nPatch level: ###\n";
42 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
52 curcop = &compiling; \
59 laststype = OP_STAT; \
61 maxsysfd = MAXSYSFD; \
68 laststype = OP_STAT; \
72 static void find_beginning _((void));
73 static void forbid_setid _((char *));
74 static void incpush _((char *, int));
75 static void init_ids _((void));
76 static void init_debugger _((void));
77 static void init_lexer _((void));
78 static void init_main_stash _((void));
80 static struct perl_thread * init_main_thread _((void));
81 #endif /* USE_THREADS */
82 static void init_perllib _((void));
83 static void init_postdump_symbols _((int, char **, char **));
84 static void init_predump_symbols _((void));
85 static void my_exit_jump _((void)) __attribute__((noreturn));
86 static void nuke_stacks _((void));
87 static void open_script _((char *, bool, SV *));
88 static void usage _((char *));
89 static void validate_suid _((char *, char*));
91 static int fdscript = -1;
96 PerlInterpreter *sv_interp;
99 New(53, sv_interp, 1, PerlInterpreter);
104 perl_construct(register PerlInterpreter *sv_interp)
109 struct perl_thread *thr;
110 #endif /* FAKE_THREADS */
111 #endif /* USE_THREADS */
113 if (!(curinterp = sv_interp))
117 Zero(sv_interp, 1, PerlInterpreter);
120 /* Init the real globals (and main thread)? */
125 #ifdef ALLOC_THREAD_KEY
128 if (pthread_key_create(&thr_key, 0))
129 croak("panic: pthread_key_create");
131 MUTEX_INIT(&sv_mutex);
133 * Safe to use basic SV functions from now on (though
134 * not things like mortals or tainting yet).
136 MUTEX_INIT(&eval_mutex);
137 COND_INIT(&eval_cond);
138 MUTEX_INIT(&threads_mutex);
139 COND_INIT(&nthreads_cond);
140 #ifdef EMULATE_ATOMIC_REFCOUNTS
141 MUTEX_INIT(&svref_mutex);
142 #endif /* EMULATE_ATOMIC_REFCOUNTS */
144 thr = init_main_thread();
145 #endif /* USE_THREADS */
147 linestr = NEWSV(65,80);
148 sv_upgrade(linestr,SVt_PVIV);
150 if (!SvREADONLY(&sv_undef)) {
151 SvREADONLY_on(&sv_undef);
155 SvREADONLY_on(&sv_no);
157 sv_setpv(&sv_yes,Yes);
159 SvREADONLY_on(&sv_yes);
162 nrs = newSVpv("\n", 1);
163 rs = SvREFCNT_inc(nrs);
165 sighandlerp = sighandler;
170 * There is no way we can refer to them from Perl so close them to save
171 * space. The other alternative would be to provide STDAUX and STDPRN
174 (void)fclose(stdaux);
175 (void)fclose(stdprn);
182 perl_destruct_level = 1;
184 if(perl_destruct_level > 0)
189 lex_state = LEX_NOTPARSING;
191 start_env.je_prev = NULL;
192 start_env.je_ret = -1;
193 start_env.je_mustcatch = TRUE;
194 top_env = &start_env;
197 SET_NUMERIC_STANDARD();
198 #if defined(SUBVERSION) && SUBVERSION > 0
199 sprintf(patchlevel, "%7.5f", (double) 5
200 + ((double) PATCHLEVEL / (double) 1000)
201 + ((double) SUBVERSION / (double) 100000));
203 sprintf(patchlevel, "%5.3f", (double) 5 +
204 ((double) PATCHLEVEL / (double) 1000));
207 #if defined(LOCAL_PATCH_COUNT)
208 localpatches = local_patches; /* For possible -v */
211 PerlIO_init(); /* Hook to IO system */
213 fdpid = newAV(); /* for remembering popen pids by fd */
214 modglobal = newHV(); /* pointers to per-interpreter module globals */
217 New(51,debname,128,char);
218 New(52,debdelim,128,char);
225 perl_destruct(register PerlInterpreter *sv_interp)
228 int destruct_level; /* 0=none, 1=full, 2=full with checks */
233 #endif /* USE_THREADS */
235 if (!(curinterp = sv_interp))
240 /* Pass 1 on any remaining threads: detach joinables, join zombies */
242 MUTEX_LOCK(&threads_mutex);
243 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
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_L(PerlIO_printf(PerlIO_stderr(),
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(&threads_mutex);
264 SvREFCNT_dec((SV*)av);
265 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
266 "perl_destruct: joined zombie %p OK\n", t));
268 case THRf_R_JOINABLE:
269 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
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(&threads_mutex);
280 MUTEX_UNLOCK(&t->mutex);
283 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
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 */
295 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
296 "perl_destruct: final wait for %d threads\n",
298 COND_WAIT(&nthreads_cond, &threads_mutex);
300 /* At this point, we're the last thread */
301 MUTEX_UNLOCK(&threads_mutex);
302 DEBUG_L(PerlIO_printf(PerlIO_stderr(), "perl_destruct: armageddon has arrived\n"));
303 MUTEX_DESTROY(&threads_mutex);
304 COND_DESTROY(&nthreads_cond);
305 #endif /* !defined(FAKE_THREADS) */
306 #endif /* USE_THREADS */
308 destruct_level = 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 curpad = AvARRAY(comppad);
333 SvREFCNT_dec(main_cv);
338 * Try to destruct global references. We do this first so that the
339 * destructors and destructees still exist. Some sv's might remain.
340 * Non-referenced objects are on their own.
347 /* unhook hooks which will soon be, or use, destroyed data */
348 SvREFCNT_dec(warnhook);
350 SvREFCNT_dec(diehook);
352 SvREFCNT_dec(parsehook);
355 /* call exit list functions */
356 while (exitlistlen-- > 0)
357 exitlist[exitlistlen].fn(exitlist[exitlistlen].ptr);
361 if (destruct_level == 0){
363 DEBUG_P(debprofdump());
365 /* The exit() function will do everything that needs doing. */
369 /* loosen bonds of global variables */
372 (void)PerlIO_close(rsfp);
376 /* Filters for program text */
377 SvREFCNT_dec(rsfp_filters);
378 rsfp_filters = Nullav;
390 sawampersand = FALSE; /* must save all match strings */
391 sawstudy = FALSE; /* do fbm_instr on all strings */
406 /* magical thingies */
408 Safefree(ofs); /* $, */
411 Safefree(ors); /* $\ */
414 SvREFCNT_dec(nrs); /* $\ helper */
417 multiline = 0; /* $* */
419 SvREFCNT_dec(statname);
423 /* defgv, aka *_ should be taken care of elsewhere */
425 /* clean up after study() */
426 SvREFCNT_dec(lastscream);
428 Safefree(screamfirst);
430 Safefree(screamnext);
433 /* startup and shutdown function lists */
434 SvREFCNT_dec(beginav);
436 SvREFCNT_dec(initav);
441 /* shortcuts just get cleared */
451 /* reset so print() ends up where we expect */
454 /* Prepare to destruct main symbol table. */
461 if (destruct_level >= 2) {
462 if (scopestack_ix != 0)
463 warn("Unbalanced scopes: %ld more ENTERs than LEAVEs\n",
464 (long)scopestack_ix);
465 if (savestack_ix != 0)
466 warn("Unbalanced saves: %ld more saves than restores\n",
468 if (tmps_floor != -1)
469 warn("Unbalanced tmps: %ld more allocs than frees\n",
470 (long)tmps_floor + 1);
471 if (cxstack_ix != -1)
472 warn("Unbalanced context: %ld more PUSHes than POPs\n",
473 (long)cxstack_ix + 1);
476 /* Now absolutely destruct everything, somehow or other, loops or no. */
478 SvFLAGS(strtab) |= SVTYPEMASK; /* don't clean out strtab now */
479 while (sv_count != 0 && sv_count != last_sv_count) {
480 last_sv_count = sv_count;
483 SvFLAGS(strtab) &= ~SVTYPEMASK;
484 SvFLAGS(strtab) |= SVt_PVHV;
486 /* Destruct the global string table. */
488 /* Yell and reset the HeVAL() slots that are still holding refcounts,
489 * so that sv_free() won't fail on them.
498 array = HvARRAY(strtab);
502 warn("Unbalanced string table refcount: (%d) for \"%s\"",
503 HeVAL(hent) - Nullsv, HeKEY(hent));
504 HeVAL(hent) = &sv_undef;
514 SvREFCNT_dec(strtab);
517 warn("Scalars leaked: %ld\n", (long)sv_count);
521 /* No SVs have survived, need to clean out */
525 Safefree(origfilename);
527 hints = 0; /* Reset hints. Should hints be per-interpreter ? */
529 DEBUG_P(debprofdump());
531 MUTEX_DESTROY(&sv_mutex);
532 MUTEX_DESTROY(&eval_mutex);
533 COND_DESTROY(&eval_cond);
535 /* As the penultimate thing, free the non-arena SV for thrsv */
536 Safefree(SvPVX(thrsv));
537 Safefree(SvANY(thrsv));
540 #endif /* USE_THREADS */
542 /* As the absolutely last thing, free the non-arena SV for mess() */
545 /* we know that type >= SVt_PV */
547 Safefree(SvPVX(mess_sv));
548 Safefree(SvANY(mess_sv));
555 perl_free(PerlInterpreter *sv_interp)
557 if (!(curinterp = sv_interp))
563 perl_atexit(void (*fn) (void *), void *ptr)
565 Renew(exitlist, exitlistlen+1, PerlExitListEntry);
566 exitlist[exitlistlen].fn = fn;
567 exitlist[exitlistlen].ptr = ptr;
572 perl_parse(PerlInterpreter *sv_interp, void (*xsinit) (void), int argc, char **argv, char **env)
577 char *scriptname = NULL;
578 VOL bool dosearch = FALSE;
586 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
589 croak("suidperl is no longer needed since the kernel can now execute\n\
590 setuid perl scripts securely.\n");
594 if (!(curinterp = sv_interp))
597 #if defined(NeXT) && defined(__DYNAMIC__)
598 _dyld_lookup_and_bind
599 ("__environ", (unsigned long *) &environ_pointer, NULL);
604 #ifndef VMS /* VMS doesn't have environ array */
605 origenviron = environ;
611 /* Come here if running an undumped a.out. */
613 origfilename = savepv(argv[0]);
615 cxstack_ix = -1; /* start label stack again */
617 init_postdump_symbols(argc,argv,env);
622 curpad = AvARRAY(comppad);
627 SvREFCNT_dec(main_cv);
631 oldscope = scopestack_ix;
639 /* my_exit() was called */
640 while (scopestack_ix > oldscope)
645 call_list(oldscope, endav);
647 return STATUS_NATIVE_EXPORT;
650 PerlIO_printf(PerlIO_stderr(), "panic: top_env\n");
654 sv_setpvn(linestr,"",0);
655 sv = newSVpv("",0); /* first used for -I flags */
659 for (argc--,argv++; argc > 0; argc--,argv++) {
660 if (argv[0][0] != '-' || !argv[0][1])
664 validarg = " PHOOEY ";
690 if (s = moreswitches(s))
700 if (euid != uid || egid != gid)
701 croak("No -e allowed in setuid scripts");
703 #if defined(HAS_UMASK) && !defined(VMS)
704 int oldumask = PerlLIO_umask(0177);
706 e_tmpname = savepv(TMPPATH);
708 e_tmpfd = PerlLIO_mkstemp(e_tmpname);
709 #else /* use mktemp() */
710 (void)PerlLIO_mktemp(e_tmpname);
712 croak("Cannot generate temporary filename");
713 # if defined(HAS_OPEN3) && defined(O_EXCL)
714 e_tmpfd = open(e_tmpname,
715 O_WRONLY | O_CREAT | O_EXCL,
718 (void)UNLINK(e_tmpname);
719 /* Yes, potential race. But at least we can say we tried. */
720 e_fp = PerlIO_open(e_tmpname,"w");
722 #endif /* ifdef HAS_MKSTEMP */
723 #if defined(HAS_MKSTEMP) || (defined(HAS_OPEN3) && defined(O_EXCL))
725 croak("Cannot create temporary file \"%s\"", e_tmpname);
726 e_fp = PerlIO_fdopen(e_tmpfd,"w");
729 croak("Cannot create temporary file \"%s\"", e_tmpname);
730 #if defined(HAS_UMASK) && !defined(VMS)
731 (void)PerlLIO_umask(oldumask);
737 PerlIO_puts(e_fp,argv[1]);
741 croak("No code specified for -e");
742 (void)PerlIO_putc(e_fp,'\n');
744 case 'I': /* -I handled both here and in moreswitches() */
746 if (!*++s && (s=argv[1]) != Nullch) {
749 while (s && isSPACE(*s))
753 for (e = s; *e && !isSPACE(*e); e++) ;
760 } /* XXX else croak? */
774 preambleav = newAV();
775 av_push(preambleav, newSVpv("use Config qw(myconfig config_vars)",0));
777 Sv = newSVpv("print myconfig();",0);
779 sv_catpv(Sv,"print \"\\nCharacteristics of this PERLSHR image: \\n\",");
781 sv_catpv(Sv,"print \"\\nCharacteristics of this binary (from libperl): \\n\",");
783 #if defined(DEBUGGING) || defined(NO_EMBED) || defined(MULTIPLICITY)
784 sv_catpv(Sv,"\" Compile-time options:");
786 sv_catpv(Sv," DEBUGGING");
789 sv_catpv(Sv," NO_EMBED");
792 sv_catpv(Sv," MULTIPLICITY");
794 sv_catpv(Sv,"\\n\",");
796 #if defined(LOCAL_PATCH_COUNT)
797 if (LOCAL_PATCH_COUNT > 0) {
799 sv_catpv(Sv,"\" Locally applied patches:\\n\",");
800 for (i = 1; i <= LOCAL_PATCH_COUNT; i++) {
802 sv_catpvf(Sv,"\" \\t%s\\n\",",localpatches[i]);
806 sv_catpvf(Sv,"\" Built under %s\\n\"",OSNAME);
809 sv_catpvf(Sv,",\" Compiled at %s %s\\n\"",__DATE__,__TIME__);
811 sv_catpvf(Sv,",\" Compiled on %s\\n\"",__DATE__);
816 @env = map { \"$_=\\\"$ENV{$_}\\\"\" } sort grep {/^PERL/} keys %ENV; \
817 print \" \\%ENV:\\n @env\\n\" if @env; \
818 print \" \\@INC:\\n @INC\\n\";");
821 Sv = newSVpv("config_vars(qw(",0);
826 av_push(preambleav, Sv);
827 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
838 if (!*++s || isSPACE(*s)) {
842 /* catch use of gnu style long options */
843 if (strEQ(s, "version")) {
847 if (strEQ(s, "help")) {
854 croak("Unrecognized switch: -%s (-h will show valid options)",s);
859 if (!tainting && (s = PerlEnv_getenv("PERL5OPT"))) {
870 if (!strchr("DIMUdmw", *s))
871 croak("Illegal switch in PERL5OPT: -%c", *s);
877 scriptname = argv[0];
879 if (PerlIO_flush(e_fp) || PerlIO_error(e_fp) || PerlIO_close(e_fp)) {
881 warn("Did you forget to compile with -DMULTIPLICITY?");
883 croak("Can't write to temp file for -e: %s", Strerror(errno));
887 scriptname = e_tmpname;
889 else if (scriptname == Nullch) {
891 if ( PerlLIO_isatty(PerlIO_fileno(PerlIO_stdin())) )
899 open_script(scriptname,dosearch,sv);
901 validate_suid(validarg, scriptname);
906 main_cv = compcv = (CV*)NEWSV(1104,0);
907 sv_upgrade((SV *)compcv, SVt_PVCV);
911 av_push(comppad, Nullsv);
912 curpad = AvARRAY(comppad);
913 comppad_name = newAV();
914 comppad_name_fill = 0;
915 min_intro_pending = 0;
918 av_store(comppad_name, 0, newSVpv("@_", 2));
919 curpad[0] = (SV*)newAV();
920 SvPADMY_on(curpad[0]); /* XXX Needed? */
922 New(666, CvMUTEXP(compcv), 1, perl_mutex);
923 MUTEX_INIT(CvMUTEXP(compcv));
924 #endif /* USE_THREADS */
926 comppadlist = newAV();
927 AvREAL_off(comppadlist);
928 av_store(comppadlist, 0, (SV*)comppad_name);
929 av_store(comppadlist, 1, (SV*)comppad);
930 CvPADLIST(compcv) = comppadlist;
932 boot_core_UNIVERSAL();
934 (*xsinit)(); /* in case linked C routines want magical variables */
935 #if defined(VMS) || defined(WIN32) || defined(DJGPP)
939 init_predump_symbols();
941 init_postdump_symbols(argc,argv,env);
945 /* now parse the script */
947 SETERRNO(0,SS$_NORMAL);
949 if (yyparse() || error_count) {
951 croak("%s had compilation errors.\n", origfilename);
953 croak("Execution of %s aborted due to compilation errors.\n",
957 curcop->cop_line = 0;
961 (void)UNLINK(e_tmpname);
967 /* now that script is parsed, we can modify record separator */
969 rs = SvREFCNT_inc(nrs);
970 sv_setsv(perl_get_sv("/", TRUE), rs);
981 if ((s=PerlEnv_getenv("PERL_DEBUG_MSTATS")) && atoi(s) >= 2)
982 dump_mstats("after compilation:");
992 perl_run(PerlInterpreter *sv_interp)
999 if (!(curinterp = sv_interp))
1002 oldscope = scopestack_ix;
1007 cxstack_ix = -1; /* start context stack again */
1010 /* my_exit() was called */
1011 while (scopestack_ix > oldscope)
1014 curstash = defstash;
1016 call_list(oldscope, endav);
1018 if (PerlEnv_getenv("PERL_DEBUG_MSTATS"))
1019 dump_mstats("after execution: ");
1022 return STATUS_NATIVE_EXPORT;
1025 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
1030 POPSTACK_TO(mainstack);
1034 DEBUG_r(PerlIO_printf(Perl_debug_log, "%s $` $& $' support.\n",
1035 sawampersand ? "Enabling" : "Omitting"));
1038 DEBUG_x(dump_all());
1039 DEBUG(PerlIO_printf(Perl_debug_log, "\nEXECUTING...\n\n"));
1041 DEBUG_L(PerlIO_printf(Perl_debug_log, "main thread is 0x%lx\n",
1042 (unsigned long) thr));
1043 #endif /* USE_THREADS */
1046 PerlIO_printf(PerlIO_stderr(), "%s syntax OK\n", origfilename);
1049 if (PERLDB_SINGLE && DBsingle)
1050 sv_setiv(DBsingle, 1);
1052 call_list(oldscope, initav);
1062 else if (main_start) {
1063 CvDEPTH(main_cv) = 1;
1074 perl_get_sv(char *name, I32 create)
1078 if (name[1] == '\0' && !isALPHA(name[0])) {
1079 PADOFFSET tmp = find_threadsv(name);
1080 if (tmp != NOT_IN_PAD) {
1082 return THREADSV(tmp);
1085 #endif /* USE_THREADS */
1086 gv = gv_fetchpv(name, create, SVt_PV);
1093 perl_get_av(char *name, I32 create)
1095 GV* gv = gv_fetchpv(name, create, SVt_PVAV);
1104 perl_get_hv(char *name, I32 create)
1106 GV* gv = gv_fetchpv(name, create, SVt_PVHV);
1115 perl_get_cv(char *name, I32 create)
1117 GV* gv = gv_fetchpv(name, create, SVt_PVCV);
1118 if (create && !GvCVu(gv))
1119 return newSUB(start_subparse(FALSE, 0),
1120 newSVOP(OP_CONST, 0, newSVpv(name,0)),
1128 /* Be sure to refetch the stack pointer after calling these routines. */
1131 perl_call_argv(char *sub_name, I32 flags, register char **argv)
1133 /* See G_* flags in cop.h */
1134 /* null terminated arg list */
1141 XPUSHs(sv_2mortal(newSVpv(*argv,0)));
1146 return perl_call_pv(sub_name, flags);
1150 perl_call_pv(char *sub_name, I32 flags)
1151 /* name of the subroutine */
1152 /* See G_* flags in cop.h */
1154 return perl_call_sv((SV*)perl_get_cv(sub_name, TRUE), flags);
1158 perl_call_method(char *methname, I32 flags)
1159 /* name of the subroutine */
1160 /* See G_* flags in cop.h */
1166 XPUSHs(sv_2mortal(newSVpv(methname,0)));
1171 return perl_call_sv(*stack_sp--, flags);
1174 /* May be called with any of a CV, a GV, or an SV containing the name. */
1176 perl_call_sv(SV *sv, I32 flags)
1178 /* See G_* flags in cop.h */
1181 LOGOP myop; /* fake syntax tree node */
1186 bool oldcatch = CATCH_GET;
1191 if (flags & G_DISCARD) {
1196 Zero(&myop, 1, LOGOP);
1197 myop.op_next = Nullop;
1198 if (!(flags & G_NOARGS))
1199 myop.op_flags |= OPf_STACKED;
1200 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1201 (flags & G_ARRAY) ? OPf_WANT_LIST :
1206 EXTEND(stack_sp, 1);
1209 oldscope = scopestack_ix;
1211 if (PERLDB_SUB && curstash != debstash
1212 /* Handle first BEGIN of -d. */
1213 && (DBcv || (DBcv = GvCV(DBsub)))
1214 /* Try harder, since this may have been a sighandler, thus
1215 * curstash may be meaningless. */
1216 && (SvTYPE(sv) != SVt_PVCV || CvSTASH((CV*)sv) != debstash)
1217 && !(flags & G_NODEBUG))
1218 op->op_private |= OPpENTERSUB_DB;
1220 if (flags & G_EVAL) {
1221 cLOGOP->op_other = op;
1223 /* we're trying to emulate pp_entertry() here */
1225 register PERL_CONTEXT *cx;
1226 I32 gimme = GIMME_V;
1231 push_return(op->op_next);
1232 PUSHBLOCK(cx, CXt_EVAL, stack_sp);
1234 eval_root = op; /* Only needed so that goto works right. */
1237 if (flags & G_KEEPERR)
1252 /* my_exit() was called */
1253 curstash = defstash;
1257 croak("Callback called exit");
1266 stack_sp = stack_base + oldmark;
1267 if (flags & G_ARRAY)
1271 *++stack_sp = &sv_undef;
1279 if (op == (OP*)&myop)
1280 op = pp_entersub(ARGS);
1283 retval = stack_sp - (stack_base + oldmark);
1284 if ((flags & G_EVAL) && !(flags & G_KEEPERR))
1288 if (flags & G_EVAL) {
1289 if (scopestack_ix > oldscope) {
1293 register PERL_CONTEXT *cx;
1305 CATCH_SET(oldcatch);
1307 if (flags & G_DISCARD) {
1308 stack_sp = stack_base + oldmark;
1317 /* Eval a string. The G_EVAL flag is always assumed. */
1320 perl_eval_sv(SV *sv, I32 flags)
1322 /* See G_* flags in cop.h */
1325 UNOP myop; /* fake syntax tree node */
1326 I32 oldmark = SP - stack_base;
1333 if (flags & G_DISCARD) {
1341 EXTEND(stack_sp, 1);
1343 oldscope = scopestack_ix;
1345 if (!(flags & G_NOARGS))
1346 myop.op_flags = OPf_STACKED;
1347 myop.op_next = Nullop;
1348 myop.op_type = OP_ENTEREVAL;
1349 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1350 (flags & G_ARRAY) ? OPf_WANT_LIST :
1352 if (flags & G_KEEPERR)
1353 myop.op_flags |= OPf_SPECIAL;
1363 /* my_exit() was called */
1364 curstash = defstash;
1368 croak("Callback called exit");
1377 stack_sp = stack_base + oldmark;
1378 if (flags & G_ARRAY)
1382 *++stack_sp = &sv_undef;
1387 if (op == (OP*)&myop)
1388 op = pp_entereval(ARGS);
1391 retval = stack_sp - (stack_base + oldmark);
1392 if (!(flags & G_KEEPERR))
1397 if (flags & G_DISCARD) {
1398 stack_sp = stack_base + oldmark;
1408 perl_eval_pv(char *p, I32 croak_on_error)
1411 SV* sv = newSVpv(p, 0);
1414 perl_eval_sv(sv, G_SCALAR);
1421 if (croak_on_error && SvTRUE(ERRSV))
1422 croak(SvPVx(ERRSV, na));
1427 /* Require a module. */
1430 perl_require_pv(char *pv)
1432 SV* sv = sv_newmortal();
1433 sv_setpv(sv, "require '");
1436 perl_eval_sv(sv, G_DISCARD);
1440 magicname(char *sym, char *name, I32 namlen)
1444 if (gv = gv_fetchpv(sym,TRUE, SVt_PV))
1445 sv_magic(GvSV(gv), (SV*)gv, 0, name, namlen);
1449 usage(char *name) /* XXX move this out into a module ? */
1452 /* This message really ought to be max 23 lines.
1453 * Removed -h because the user already knows that opton. Others? */
1455 static char *usage[] = {
1456 "-0[octal] specify record separator (\\0, if no argument)",
1457 "-a autosplit mode with -n or -p (splits $_ into @F)",
1458 "-c check syntax only (runs BEGIN and END blocks)",
1459 "-d[:debugger] run scripts under debugger",
1460 "-D[number/list] set debugging flags (argument is a bit mask or flags)",
1461 "-e 'command' one line of script. Several -e's allowed. Omit [programfile].",
1462 "-F/pattern/ split() pattern for autosplit (-a). The //'s are optional.",
1463 "-i[extension] edit <> files in place (make backup if extension supplied)",
1464 "-Idirectory specify @INC/#include directory (may be used more than once)",
1465 "-l[octal] enable line ending processing, specifies line terminator",
1466 "-[mM][-]module.. executes `use/no module...' before executing your script.",
1467 "-n assume 'while (<>) { ... }' loop around your script",
1468 "-p assume loop like -n but print line also like sed",
1469 "-P run script through C preprocessor before compilation",
1470 "-s enable some switch parsing for switches after script name",
1471 "-S look for the script using PATH environment variable",
1472 "-T turn on tainting checks",
1473 "-u dump core after parsing script",
1474 "-U allow unsafe operations",
1475 "-v print version number, patchlevel plus VERY IMPORTANT perl info",
1476 "-V[:variable] print perl configuration information",
1477 "-w TURN WARNINGS ON FOR COMPILATION OF YOUR SCRIPT. Recommended.",
1478 "-x[directory] strip off text before #!perl line and perhaps cd to directory",
1484 printf("\nUsage: %s [switches] [--] [programfile] [arguments]", name);
1486 printf("\n %s", *p++);
1489 /* This routine handles any switches that can be given during run */
1492 moreswitches(char *s)
1501 rschar = scan_oct(s, 4, &numlen);
1503 if (rschar & ~((U8)~0))
1505 else if (!rschar && numlen >= 2)
1506 nrs = newSVpv("", 0);
1509 nrs = newSVpv(&ch, 1);
1515 splitstr = savepv(s + 1);
1529 if (*s == ':' || *s == '=') {
1530 my_setenv("PERL5DB", form("use Devel::%s;", ++s));
1534 perldb = PERLDB_ALL;
1541 if (isALPHA(s[1])) {
1542 static char debopts[] = "psltocPmfrxuLHXD";
1545 for (s++; *s && (d = strchr(debopts,*s)); s++)
1546 debug |= 1 << (d - debopts);
1550 for (s++; isDIGIT(*s); s++) ;
1552 debug |= 0x80000000;
1554 warn("Recompile perl with -DDEBUGGING to use -D switch\n");
1555 for (s++; isALNUM(*s); s++) ;
1565 inplace = savepv(s+1);
1567 for (s = inplace; *s && !isSPACE(*s); s++) ;
1570 if (*s == '-') /* Additional switches on #! line. */
1574 case 'I': /* -I handled both here and in parse_perl() */
1577 while (*s && isSPACE(*s))
1581 for (e = s; *e && !isSPACE(*e); e++) ;
1582 p = savepvn(s, e-s);
1588 croak("No space allowed after -I");
1598 *ors = scan_oct(s, 3 + (*s == '0'), &numlen);
1608 ors = SvPV(nrs, orslen);
1609 ors = savepvn(ors, orslen);
1613 forbid_setid("-M"); /* XXX ? */
1616 forbid_setid("-m"); /* XXX ? */
1621 /* -M-foo == 'no foo' */
1622 if (*s == '-') { use = "no "; ++s; }
1623 sv = newSVpv(use,0);
1625 /* We allow -M'Module qw(Foo Bar)' */
1626 while(isALNUM(*s) || *s==':') ++s;
1628 sv_catpv(sv, start);
1629 if (*(start-1) == 'm') {
1631 croak("Can't use '%c' after -mname", *s);
1632 sv_catpv( sv, " ()");
1635 sv_catpvn(sv, start, s-start);
1636 sv_catpv(sv, " split(/,/,q{");
1641 if (preambleav == NULL)
1642 preambleav = newAV();
1643 av_push(preambleav, sv);
1646 croak("No space allowed after -%c", *(s-1));
1663 croak("Too late for \"-T\" option");
1675 #if defined(SUBVERSION) && SUBVERSION > 0
1676 printf("\nThis is perl, version 5.%03d_%02d built for %s",
1677 PATCHLEVEL, SUBVERSION, ARCHNAME);
1679 printf("\nThis is perl, version %s built for %s",
1680 patchlevel, ARCHNAME);
1682 #if defined(LOCAL_PATCH_COUNT)
1683 if (LOCAL_PATCH_COUNT > 0)
1684 printf("\n(with %d registered patch%s, see perl -V for more detail)",
1685 LOCAL_PATCH_COUNT, (LOCAL_PATCH_COUNT!=1) ? "es" : "");
1688 printf("\n\nCopyright 1987-1998, Larry Wall\n");
1690 printf("\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
1693 printf("djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n");
1694 printf("djgpp v2 port (perl5004+) by Laszlo Molnar, 1997-1998\n");
1697 printf("\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
1698 "Version 5 port Copyright (c) 1994-1998, Andreas Kaiser, Ilya Zakharevich\n");
1701 printf("atariST series port, ++jrb bammi@cadence.com\n");
1704 Perl may be copied only under the terms of either the Artistic License or the\n\
1705 GNU General Public License, which may be found in the Perl 5.0 source kit.\n\n\
1706 Complete documentation for Perl, including FAQ lists, should be found on\n\
1707 this system using `man perl' or `perldoc perl'. If you have access to the\n\
1708 Internet, point your browser at http://www.perl.com/, the Perl Home Page.\n\n");
1716 if (s[1] == '-') /* Additional switches on #! line. */
1727 #ifdef ALTERNATE_SHEBANG
1728 case 'S': /* OS/2 needs -S on "extproc" line. */
1736 croak("Can't emulate -%.1s on #! line",s);
1741 /* compliments of Tom Christiansen */
1743 /* unexec() can be found in the Gnu emacs distribution */
1744 /* Known to work with -DUNEXEC and using unexelf.c from GNU emacs-20.2 */
1755 prog = newSVpv(BIN_EXP, 0);
1756 sv_catpv(prog, "/perl");
1757 file = newSVpv(origfilename, 0);
1758 sv_catpv(file, ".perldump");
1760 unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
1761 /* unexec prints msg to stderr in case of failure */
1762 PerlProc_exit(status);
1765 # include <lib$routines.h>
1766 lib$signal(SS$_DEBUG); /* ssdef.h #included from vmsish.h */
1768 ABORT(); /* for use with undump */
1774 init_main_stash(void)
1779 /* Note that strtab is a rather special HV. Assumptions are made
1780 about not iterating on it, and not adding tie magic to it.
1781 It is properly deallocated in perl_destruct() */
1783 HvSHAREKEYS_off(strtab); /* mandatory */
1784 Newz(506,((XPVHV*)SvANY(strtab))->xhv_array,
1785 sizeof(HE*) * (((XPVHV*)SvANY(strtab))->xhv_max + 1), char);
1787 curstash = defstash = newHV();
1788 curstname = newSVpv("main",4);
1789 gv = gv_fetchpv("main::",TRUE, SVt_PVHV);
1790 SvREFCNT_dec(GvHV(gv));
1791 GvHV(gv) = (HV*)SvREFCNT_inc(defstash);
1793 HvNAME(defstash) = savepv("main");
1794 incgv = gv_HVadd(gv_AVadd(gv_fetchpv("INC",TRUE, SVt_PVAV)));
1796 defgv = gv_fetchpv("_",TRUE, SVt_PVAV);
1797 errgv = gv_HVadd(gv_fetchpv("@", TRUE, SVt_PV));
1799 (void)form("%240s",""); /* Preallocate temp - for immediate signals. */
1800 sv_grow(ERRSV, 240); /* Preallocate - for immediate signals. */
1801 sv_setpvn(ERRSV, "", 0);
1802 curstash = defstash;
1803 compiling.cop_stash = defstash;
1804 debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
1805 globalstash = GvHV(gv_fetchpv("CORE::GLOBAL::", GV_ADDMULTI, SVt_PVHV));
1806 /* We must init $/ before switches are processed. */
1807 sv_setpvn(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), "\n", 1);
1811 open_script(char *scriptname, bool dosearch, SV *sv)
1816 scriptname = find_script(scriptname, dosearch, NULL, 0);
1818 if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
1819 char *s = scriptname + 8;
1828 origfilename = savepv(e_tmpname ? "-e" : scriptname);
1829 curcop->cop_filegv = gv_fetchfile(origfilename);
1830 if (strEQ(origfilename,"-"))
1832 if (fdscript >= 0) {
1833 rsfp = PerlIO_fdopen(fdscript,PERL_SCRIPT_MODE);
1834 #if defined(HAS_FCNTL) && defined(F_SETFD)
1836 fcntl(PerlIO_fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
1839 else if (preprocess) {
1840 char *cpp_cfg = CPPSTDIN;
1841 SV *cpp = NEWSV(0,0);
1842 SV *cmd = NEWSV(0,0);
1844 if (strEQ(cpp_cfg, "cppstdin"))
1845 sv_catpvf(cpp, "%s/", BIN_EXP);
1846 sv_catpv(cpp, cpp_cfg);
1849 sv_catpv(sv,PRIVLIB_EXP);
1853 sed %s -e \"/^[^#]/b\" \
1854 -e \"/^#[ ]*include[ ]/b\" \
1855 -e \"/^#[ ]*define[ ]/b\" \
1856 -e \"/^#[ ]*if[ ]/b\" \
1857 -e \"/^#[ ]*ifdef[ ]/b\" \
1858 -e \"/^#[ ]*ifndef[ ]/b\" \
1859 -e \"/^#[ ]*else/b\" \
1860 -e \"/^#[ ]*elif[ ]/b\" \
1861 -e \"/^#[ ]*undef[ ]/b\" \
1862 -e \"/^#[ ]*endif/b\" \
1865 (doextract ? "-e \"1,/^#/d\n\"" : ""),
1868 %s %s -e '/^[^#]/b' \
1869 -e '/^#[ ]*include[ ]/b' \
1870 -e '/^#[ ]*define[ ]/b' \
1871 -e '/^#[ ]*if[ ]/b' \
1872 -e '/^#[ ]*ifdef[ ]/b' \
1873 -e '/^#[ ]*ifndef[ ]/b' \
1874 -e '/^#[ ]*else/b' \
1875 -e '/^#[ ]*elif[ ]/b' \
1876 -e '/^#[ ]*undef[ ]/b' \
1877 -e '/^#[ ]*endif/b' \
1885 (doextract ? "-e '1,/^#/d\n'" : ""),
1887 scriptname, cpp, sv, CPPMINUS);
1889 #ifdef IAMSUID /* actually, this is caught earlier */
1890 if (euid != uid && !euid) { /* if running suidperl */
1892 (void)seteuid(uid); /* musn't stay setuid root */
1895 (void)setreuid((Uid_t)-1, uid);
1897 #ifdef HAS_SETRESUID
1898 (void)setresuid((Uid_t)-1, uid, (Uid_t)-1);
1904 if (geteuid() != uid)
1905 croak("Can't do seteuid!\n");
1907 #endif /* IAMSUID */
1908 rsfp = PerlProc_popen(SvPVX(cmd), "r");
1912 else if (!*scriptname) {
1913 forbid_setid("program input from stdin");
1914 rsfp = PerlIO_stdin();
1917 rsfp = PerlIO_open(scriptname,PERL_SCRIPT_MODE);
1918 #if defined(HAS_FCNTL) && defined(F_SETFD)
1920 fcntl(PerlIO_fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
1928 #ifndef IAMSUID /* in case script is not readable before setuid */
1929 if (euid && PerlLIO_stat(SvPVX(GvSV(curcop->cop_filegv)),&statbuf) >= 0 &&
1930 statbuf.st_mode & (S_ISUID|S_ISGID)) {
1932 PerlProc_execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
1933 croak("Can't do setuid\n");
1937 croak("Can't open perl script \"%s\": %s\n",
1938 SvPVX(GvSV(curcop->cop_filegv)), Strerror(errno));
1943 validate_suid(char *validarg, char *scriptname)
1947 /* do we need to emulate setuid on scripts? */
1949 /* This code is for those BSD systems that have setuid #! scripts disabled
1950 * in the kernel because of a security problem. Merely defining DOSUID
1951 * in perl will not fix that problem, but if you have disabled setuid
1952 * scripts in the kernel, this will attempt to emulate setuid and setgid
1953 * on scripts that have those now-otherwise-useless bits set. The setuid
1954 * root version must be called suidperl or sperlN.NNN. If regular perl
1955 * discovers that it has opened a setuid script, it calls suidperl with
1956 * the same argv that it had. If suidperl finds that the script it has
1957 * just opened is NOT setuid root, it sets the effective uid back to the
1958 * uid. We don't just make perl setuid root because that loses the
1959 * effective uid we had before invoking perl, if it was different from the
1962 * DOSUID must be defined in both perl and suidperl, and IAMSUID must
1963 * be defined in suidperl only. suidperl must be setuid root. The
1964 * Configure script will set this up for you if you want it.
1971 if (PerlLIO_fstat(PerlIO_fileno(rsfp),&statbuf) < 0) /* normal stat is insecure */
1972 croak("Can't stat script \"%s\"",origfilename);
1973 if (fdscript < 0 && statbuf.st_mode & (S_ISUID|S_ISGID)) {
1977 #ifndef HAS_SETREUID
1978 /* On this access check to make sure the directories are readable,
1979 * there is actually a small window that the user could use to make
1980 * filename point to an accessible directory. So there is a faint
1981 * chance that someone could execute a setuid script down in a
1982 * non-accessible directory. I don't know what to do about that.
1983 * But I don't think it's too important. The manual lies when
1984 * it says access() is useful in setuid programs.
1986 if (PerlLIO_access(SvPVX(GvSV(curcop->cop_filegv)),1)) /*double check*/
1987 croak("Permission denied");
1989 /* If we can swap euid and uid, then we can determine access rights
1990 * with a simple stat of the file, and then compare device and
1991 * inode to make sure we did stat() on the same file we opened.
1992 * Then we just have to make sure he or she can execute it.
1995 struct stat tmpstatbuf;
1999 setreuid(euid,uid) < 0
2002 setresuid(euid,uid,(Uid_t)-1) < 0
2005 || getuid() != euid || geteuid() != uid)
2006 croak("Can't swap uid and euid"); /* really paranoid */
2007 if (PerlLIO_stat(SvPVX(GvSV(curcop->cop_filegv)),&tmpstatbuf) < 0)
2008 croak("Permission denied"); /* testing full pathname here */
2009 if (tmpstatbuf.st_dev != statbuf.st_dev ||
2010 tmpstatbuf.st_ino != statbuf.st_ino) {
2011 (void)PerlIO_close(rsfp);
2012 if (rsfp = PerlProc_popen("/bin/mail root","w")) { /* heh, heh */
2014 "User %ld tried to run dev %ld ino %ld in place of dev %ld ino %ld!\n\
2015 (Filename of set-id script was %s, uid %ld gid %ld.)\n\nSincerely,\nperl\n",
2016 (long)uid,(long)tmpstatbuf.st_dev, (long)tmpstatbuf.st_ino,
2017 (long)statbuf.st_dev, (long)statbuf.st_ino,
2018 SvPVX(GvSV(curcop->cop_filegv)),
2019 (long)statbuf.st_uid, (long)statbuf.st_gid);
2020 (void)PerlProc_pclose(rsfp);
2022 croak("Permission denied\n");
2026 setreuid(uid,euid) < 0
2028 # if defined(HAS_SETRESUID)
2029 setresuid(uid,euid,(Uid_t)-1) < 0
2032 || getuid() != uid || geteuid() != euid)
2033 croak("Can't reswap uid and euid");
2034 if (!cando(S_IXUSR,FALSE,&statbuf)) /* can real uid exec? */
2035 croak("Permission denied\n");
2037 #endif /* HAS_SETREUID */
2038 #endif /* IAMSUID */
2040 if (!S_ISREG(statbuf.st_mode))
2041 croak("Permission denied");
2042 if (statbuf.st_mode & S_IWOTH)
2043 croak("Setuid/gid script is writable by world");
2044 doswitches = FALSE; /* -s is insecure in suid */
2046 if (sv_gets(linestr, rsfp, 0) == Nullch ||
2047 strnNE(SvPV(linestr,na),"#!",2) ) /* required even on Sys V */
2048 croak("No #! line");
2049 s = SvPV(linestr,na)+2;
2051 while (!isSPACE(*s)) s++;
2052 for (s2 = s; (s2 > SvPV(linestr,na)+2 &&
2053 (isDIGIT(s2[-1]) || strchr("._-", s2[-1]))); s2--) ;
2054 if (strnNE(s2-4,"perl",4) && strnNE(s-9,"perl",4)) /* sanity check */
2055 croak("Not a perl script");
2056 while (*s == ' ' || *s == '\t') s++;
2058 * #! arg must be what we saw above. They can invoke it by
2059 * mentioning suidperl explicitly, but they may not add any strange
2060 * arguments beyond what #! says if they do invoke suidperl that way.
2062 len = strlen(validarg);
2063 if (strEQ(validarg," PHOOEY ") ||
2064 strnNE(s,validarg,len) || !isSPACE(s[len]))
2065 croak("Args must match #! line");
2068 if (euid != uid && (statbuf.st_mode & S_ISUID) &&
2069 euid == statbuf.st_uid)
2071 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2072 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2073 #endif /* IAMSUID */
2075 if (euid) { /* oops, we're not the setuid root perl */
2076 (void)PerlIO_close(rsfp);
2079 PerlProc_execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
2081 croak("Can't do setuid\n");
2084 if (statbuf.st_mode & S_ISGID && statbuf.st_gid != egid) {
2086 (void)setegid(statbuf.st_gid);
2089 (void)setregid((Gid_t)-1,statbuf.st_gid);
2091 #ifdef HAS_SETRESGID
2092 (void)setresgid((Gid_t)-1,statbuf.st_gid,(Gid_t)-1);
2094 setgid(statbuf.st_gid);
2098 if (getegid() != statbuf.st_gid)
2099 croak("Can't do setegid!\n");
2101 if (statbuf.st_mode & S_ISUID) {
2102 if (statbuf.st_uid != euid)
2104 (void)seteuid(statbuf.st_uid); /* all that for this */
2107 (void)setreuid((Uid_t)-1,statbuf.st_uid);
2109 #ifdef HAS_SETRESUID
2110 (void)setresuid((Uid_t)-1,statbuf.st_uid,(Uid_t)-1);
2112 setuid(statbuf.st_uid);
2116 if (geteuid() != statbuf.st_uid)
2117 croak("Can't do seteuid!\n");
2119 else if (uid) { /* oops, mustn't run as root */
2121 (void)seteuid((Uid_t)uid);
2124 (void)setreuid((Uid_t)-1,(Uid_t)uid);
2126 #ifdef HAS_SETRESUID
2127 (void)setresuid((Uid_t)-1,(Uid_t)uid,(Uid_t)-1);
2133 if (geteuid() != uid)
2134 croak("Can't do seteuid!\n");
2137 if (!cando(S_IXUSR,TRUE,&statbuf))
2138 croak("Permission denied\n"); /* they can't do this */
2141 else if (preprocess)
2142 croak("-P not allowed for setuid/setgid script\n");
2143 else if (fdscript >= 0)
2144 croak("fd script not allowed in suidperl\n");
2146 croak("Script is not setuid/setgid in suidperl\n");
2148 /* We absolutely must clear out any saved ids here, so we */
2149 /* exec the real perl, substituting fd script for scriptname. */
2150 /* (We pass script name as "subdir" of fd, which perl will grok.) */
2151 PerlIO_rewind(rsfp);
2152 PerlLIO_lseek(PerlIO_fileno(rsfp),(Off_t)0,0); /* just in case rewind didn't */
2153 for (which = 1; origargv[which] && origargv[which] != scriptname; which++) ;
2154 if (!origargv[which])
2155 croak("Permission denied");
2156 origargv[which] = savepv(form("/dev/fd/%d/%s",
2157 PerlIO_fileno(rsfp), origargv[which]));
2158 #if defined(HAS_FCNTL) && defined(F_SETFD)
2159 fcntl(PerlIO_fileno(rsfp),F_SETFD,0); /* ensure no close-on-exec */
2161 PerlProc_execv(form("%s/perl%s", BIN_EXP, patchlevel), origargv); /* try again */
2162 croak("Can't do setuid\n");
2163 #endif /* IAMSUID */
2165 if (euid != uid || egid != gid) { /* (suidperl doesn't exist, in fact) */
2166 #ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
2168 PerlLIO_fstat(PerlIO_fileno(rsfp),&statbuf); /* may be either wrapped or real suid */
2169 if ((euid != uid && euid == statbuf.st_uid && statbuf.st_mode & S_ISUID)
2171 (egid != gid && egid == statbuf.st_gid && statbuf.st_mode & S_ISGID)
2174 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2175 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2176 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
2177 /* not set-id, must be wrapped */
2183 find_beginning(void)
2185 register char *s, *s2;
2187 /* skip forward in input to the real script? */
2191 if ((s = sv_gets(linestr, rsfp, 0)) == Nullch)
2192 croak("No Perl script found in input\n");
2193 if (*s == '#' && s[1] == '!' && (s = instr(s,"perl"))) {
2194 PerlIO_ungetc(rsfp, '\n'); /* to keep line count right */
2196 while (*s && !(isSPACE (*s) || *s == '#')) s++;
2198 while (*s == ' ' || *s == '\t') s++;
2200 while (isDIGIT(s2[-1]) || strchr("-._", s2[-1])) s2--;
2201 if (strnEQ(s2-4,"perl",4))
2203 while (s = moreswitches(s)) ;
2205 if (cddir && PerlDir_chdir(cddir) < 0)
2206 croak("Can't chdir to %s",cddir);
2214 uid = (int)getuid();
2215 euid = (int)geteuid();
2216 gid = (int)getgid();
2217 egid = (int)getegid();
2222 tainting |= (uid && (euid != uid || egid != gid));
2226 forbid_setid(char *s)
2229 croak("No %s allowed while running setuid", s);
2231 croak("No %s allowed while running setgid", s);
2238 curstash = debstash;
2239 dbargs = GvAV(gv_AVadd((gv_fetchpv("args", GV_ADDMULTI, SVt_PVAV))));
2241 DBgv = gv_fetchpv("DB", GV_ADDMULTI, SVt_PVGV);
2242 DBline = gv_fetchpv("dbline", GV_ADDMULTI, SVt_PVAV);
2243 DBsub = gv_HVadd(gv_fetchpv("sub", GV_ADDMULTI, SVt_PVHV));
2244 DBsingle = GvSV((gv_fetchpv("single", GV_ADDMULTI, SVt_PV)));
2245 sv_setiv(DBsingle, 0);
2246 DBtrace = GvSV((gv_fetchpv("trace", GV_ADDMULTI, SVt_PV)));
2247 sv_setiv(DBtrace, 0);
2248 DBsignal = GvSV((gv_fetchpv("signal", GV_ADDMULTI, SVt_PV)));
2249 sv_setiv(DBsignal, 0);
2250 curstash = defstash;
2253 #ifndef STRESS_REALLOC
2254 #define REASONABLE(size) (size)
2256 #define REASONABLE(size) (1) /* unreasonable */
2260 init_stacks(ARGSproto)
2262 /* start with 128-item stack and 8K cxstack */
2263 curstackinfo = new_stackinfo(REASONABLE(128),
2264 REASONABLE(8192/sizeof(PERL_CONTEXT) - 1));
2265 curstackinfo->si_type = SI_MAIN;
2266 curstack = curstackinfo->si_stack;
2267 mainstack = curstack; /* remember in case we switch stacks */
2269 stack_base = AvARRAY(curstack);
2270 stack_sp = stack_base;
2271 stack_max = stack_base + AvMAX(curstack);
2273 New(50,tmps_stack,REASONABLE(128),SV*);
2276 tmps_max = REASONABLE(128);
2279 * The following stacks almost certainly should be per-interpreter,
2280 * but for now they're not. XXX
2284 markstack_ptr = markstack;
2286 New(54,markstack,REASONABLE(32),I32);
2287 markstack_ptr = markstack;
2288 markstack_max = markstack + REASONABLE(32);
2296 New(54,scopestack,REASONABLE(32),I32);
2298 scopestack_max = REASONABLE(32);
2304 New(54,savestack,REASONABLE(128),ANY);
2306 savestack_max = REASONABLE(128);
2312 New(54,retstack,REASONABLE(16),OP*);
2314 retstack_max = REASONABLE(16);
2324 while (curstackinfo->si_next)
2325 curstackinfo = curstackinfo->si_next;
2326 while (curstackinfo) {
2327 PERL_SI *p = curstackinfo->si_prev;
2328 /* curstackinfo->si_stack got nuked by sv_free_arenas() */
2329 Safefree(curstackinfo->si_cxstack);
2330 Safefree(curstackinfo);
2333 Safefree(tmps_stack);
2340 static PerlIO *tmpfp; /* moved outside init_lexer() because of UNICOS bug */
2349 subname = newSVpv("main",4);
2353 init_predump_symbols(void)
2359 sv_setpvn(perl_get_sv("\"", TRUE), " ", 1);
2360 stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
2361 GvMULTI_on(stdingv);
2362 IoIFP(GvIOp(stdingv)) = PerlIO_stdin();
2363 tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
2365 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(stdingv));
2367 tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
2369 IoOFP(GvIOp(tmpgv)) = IoIFP(GvIOp(tmpgv)) = PerlIO_stdout();
2371 tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
2373 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(defoutgv));
2375 othergv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
2376 GvMULTI_on(othergv);
2377 IoOFP(GvIOp(othergv)) = IoIFP(GvIOp(othergv)) = PerlIO_stderr();
2378 tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
2380 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(othergv));
2382 statname = NEWSV(66,0); /* last filename we did stat on */
2385 osname = savepv(OSNAME);
2389 init_postdump_symbols(register int argc, register char **argv, register char **env)
2396 argc--,argv++; /* skip name of script */
2398 for (; argc > 0 && **argv == '-'; argc--,argv++) {
2401 if (argv[0][1] == '-') {
2405 if (s = strchr(argv[0], '=')) {
2407 sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),s);
2410 sv_setiv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),1);
2413 toptarget = NEWSV(0,0);
2414 sv_upgrade(toptarget, SVt_PVFM);
2415 sv_setpvn(toptarget, "", 0);
2416 bodytarget = NEWSV(0,0);
2417 sv_upgrade(bodytarget, SVt_PVFM);
2418 sv_setpvn(bodytarget, "", 0);
2419 formtarget = bodytarget;
2422 if (tmpgv = gv_fetchpv("0",TRUE, SVt_PV)) {
2423 sv_setpv(GvSV(tmpgv),origfilename);
2424 magicname("0", "0", 1);
2426 if (tmpgv = gv_fetchpv("\030",TRUE, SVt_PV))
2427 sv_setpv(GvSV(tmpgv),origargv[0]);
2428 if (argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV)) {
2430 (void)gv_AVadd(argvgv);
2431 av_clear(GvAVn(argvgv));
2432 for (; argc > 0; argc--,argv++) {
2433 av_push(GvAVn(argvgv),newSVpv(argv[0],0));
2436 if (envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV)) {
2440 hv_magic(hv, envgv, 'E');
2441 #ifndef VMS /* VMS doesn't have environ array */
2442 /* Note that if the supplied env parameter is actually a copy
2443 of the global environ then it may now point to free'd memory
2444 if the environment has been modified since. To avoid this
2445 problem we treat env==NULL as meaning 'use the default'
2450 environ[0] = Nullch;
2451 for (; *env; env++) {
2452 if (!(s = strchr(*env,'=')))
2455 #if defined(WIN32) || defined(MSDOS)
2458 sv = newSVpv(s--,0);
2459 (void)hv_store(hv, *env, s - *env, sv, 0);
2461 #if defined(__BORLANDC__) && defined(USE_WIN32_RTL_ENV)
2462 /* Sins of the RTL. See note in my_setenv(). */
2463 (void)PerlEnv_putenv(savepv(*env));
2467 #ifdef DYNAMIC_ENV_FETCH
2468 HvNAME(hv) = savepv(ENV_HV_NAME);
2472 if (tmpgv = gv_fetchpv("$",TRUE, SVt_PV))
2473 sv_setiv(GvSV(tmpgv), (IV)getpid());
2482 s = PerlEnv_getenv("PERL5LIB");
2486 incpush(PerlEnv_getenv("PERLLIB"), FALSE);
2488 /* Treat PERL5?LIB as a possible search list logical name -- the
2489 * "natural" VMS idiom for a Unix path string. We allow each
2490 * element to be a set of |-separated directories for compatibility.
2494 if (my_trnlnm("PERL5LIB",buf,0))
2495 do { incpush(buf,TRUE); } while (my_trnlnm("PERL5LIB",buf,++idx));
2497 while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE);
2501 /* Use the ~-expanded versions of APPLLIB (undocumented),
2502 ARCHLIB PRIVLIB SITEARCH and SITELIB
2505 incpush(APPLLIB_EXP, TRUE);
2509 incpush(ARCHLIB_EXP, FALSE);
2512 #define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
2514 incpush(PRIVLIB_EXP, FALSE);
2517 incpush(SITEARCH_EXP, FALSE);
2520 incpush(SITELIB_EXP, FALSE);
2523 incpush(".", FALSE);
2527 # define PERLLIB_SEP ';'
2530 # define PERLLIB_SEP '|'
2532 # define PERLLIB_SEP ':'
2535 #ifndef PERLLIB_MANGLE
2536 # define PERLLIB_MANGLE(s,n) (s)
2540 incpush(char *p, int addsubdirs)
2542 SV *subdir = Nullsv;
2543 static char *archpat_auto;
2549 subdir = NEWSV(55,0);
2550 if (!archpat_auto) {
2551 STRLEN len = (sizeof(ARCHNAME) + strlen(patchlevel)
2552 + sizeof("//auto"));
2553 New(55, archpat_auto, len, char);
2554 sprintf(archpat_auto, "/%s/%s/auto", ARCHNAME, patchlevel);
2556 for (len = sizeof(ARCHNAME) + 2;
2557 archpat_auto[len] != '\0' && archpat_auto[len] != '/'; len++)
2558 if (archpat_auto[len] == '.') archpat_auto[len] = '_';
2563 /* Break at all separators */
2565 SV *libdir = NEWSV(55,0);
2568 /* skip any consecutive separators */
2569 while ( *p == PERLLIB_SEP ) {
2570 /* Uncomment the next line for PATH semantics */
2571 /* av_push(GvAVn(incgv), newSVpv(".", 1)); */
2575 if ( (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
2576 sv_setpvn(libdir, PERLLIB_MANGLE(p, (STRLEN)(s - p)),
2581 sv_setpv(libdir, PERLLIB_MANGLE(p, 0));
2582 p = Nullch; /* break out */
2586 * BEFORE pushing libdir onto @INC we may first push version- and
2587 * archname-specific sub-directories.
2590 struct stat tmpstatbuf;
2595 if ((unix = tounixspec_ts(SvPV(libdir,na),Nullch)) != Nullch) {
2597 while (unix[len-1] == '/') len--; /* Cosmetic */
2598 sv_usepvn(libdir,unix,len);
2601 PerlIO_printf(PerlIO_stderr(),
2602 "Failed to unixify @INC element \"%s\"\n",
2605 /* .../archname/version if -d .../archname/version/auto */
2606 sv_setsv(subdir, libdir);
2607 sv_catpv(subdir, archpat_auto);
2608 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2609 S_ISDIR(tmpstatbuf.st_mode))
2610 av_push(GvAVn(incgv),
2611 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2613 /* .../archname if -d .../archname/auto */
2614 sv_insert(subdir, SvCUR(libdir) + sizeof(ARCHNAME),
2615 strlen(patchlevel) + 1, "", 0);
2616 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2617 S_ISDIR(tmpstatbuf.st_mode))
2618 av_push(GvAVn(incgv),
2619 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2622 /* finally push this lib directory on the end of @INC */
2623 av_push(GvAVn(incgv), libdir);
2626 SvREFCNT_dec(subdir);
2630 static struct perl_thread *
2633 struct perl_thread *thr;
2636 Newz(53, thr, 1, struct perl_thread);
2637 curcop = &compiling;
2638 thr->cvcache = newHV();
2639 thr->threadsv = newAV();
2640 /* thr->threadsvp is set when find_threadsv is called */
2641 thr->specific = newAV();
2642 thr->errhv = newHV();
2643 thr->flags = THRf_R_JOINABLE;
2644 MUTEX_INIT(&thr->mutex);
2645 /* Handcraft thrsv similarly to mess_sv */
2646 New(53, thrsv, 1, SV);
2647 Newz(53, xpv, 1, XPV);
2648 SvFLAGS(thrsv) = SVt_PV;
2649 SvANY(thrsv) = (void*)xpv;
2650 SvREFCNT(thrsv) = 1 << 30; /* practically infinite */
2651 SvPVX(thrsv) = (char*)thr;
2652 SvCUR_set(thrsv, sizeof(thr));
2653 SvLEN_set(thrsv, sizeof(thr));
2654 *SvEND(thrsv) = '\0'; /* in the trailing_nul field */
2658 MUTEX_LOCK(&threads_mutex);
2663 MUTEX_UNLOCK(&threads_mutex);
2665 #ifdef HAVE_THREAD_INTERN
2666 init_thread_intern(thr);
2669 #ifdef SET_THREAD_SELF
2670 SET_THREAD_SELF(thr);
2672 thr->self = pthread_self();
2673 #endif /* SET_THREAD_SELF */
2677 * These must come after the SET_THR because sv_setpvn does
2678 * SvTAINT and the taint fields require dTHR.
2680 toptarget = NEWSV(0,0);
2681 sv_upgrade(toptarget, SVt_PVFM);
2682 sv_setpvn(toptarget, "", 0);
2683 bodytarget = NEWSV(0,0);
2684 sv_upgrade(bodytarget, SVt_PVFM);
2685 sv_setpvn(bodytarget, "", 0);
2686 formtarget = bodytarget;
2687 thr->errsv = newSVpv("", 0);
2688 (void) find_threadsv("@"); /* Ensure $@ is initialised early */
2691 #endif /* USE_THREADS */
2694 call_list(I32 oldscope, AV *list)
2697 line_t oldline = curcop->cop_line;
2702 while (AvFILL(list) >= 0) {
2703 CV *cv = (CV*)av_shift(list);
2712 perl_call_sv((SV*)cv, G_EVAL|G_DISCARD);
2713 (void)SvPV(atsv, len);
2716 curcop = &compiling;
2717 curcop->cop_line = oldline;
2718 if (list == beginav)
2719 sv_catpv(atsv, "BEGIN failed--compilation aborted");
2721 sv_catpv(atsv, "END failed--cleanup aborted");
2722 while (scopestack_ix > oldscope)
2724 croak("%s", SvPVX(atsv));
2732 /* my_exit() was called */
2733 while (scopestack_ix > oldscope)
2736 curstash = defstash;
2738 call_list(oldscope, endav);
2740 curcop = &compiling;
2741 curcop->cop_line = oldline;
2743 if (list == beginav)
2744 croak("BEGIN failed--compilation aborted");
2746 croak("END failed--cleanup aborted");
2752 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
2757 curcop = &compiling;
2758 curcop->cop_line = oldline;
2771 DEBUG_L(PerlIO_printf(Perl_debug_log, "my_exit: thread %p, status %lu\n",
2772 thr, (unsigned long) status));
2773 #endif /* USE_THREADS */
2782 STATUS_NATIVE_SET(status);
2789 my_failure_exit(void)
2792 if (vaxc$errno & 1) {
2793 if (STATUS_NATIVE & 1) /* fortuitiously includes "-1" */
2794 STATUS_NATIVE_SET(44);
2797 if (!vaxc$errno && errno) /* unlikely */
2798 STATUS_NATIVE_SET(44);
2800 STATUS_NATIVE_SET(vaxc$errno);
2805 STATUS_POSIX_SET(errno);
2807 exitstatus = STATUS_POSIX >> 8;
2808 if (exitstatus & 255)
2809 STATUS_POSIX_SET(exitstatus);
2811 STATUS_POSIX_SET(255);
2821 register PERL_CONTEXT *cx;
2830 (void)UNLINK(e_tmpname);
2831 Safefree(e_tmpname);
2835 POPSTACK_TO(mainstack);
2836 if (cxstack_ix >= 0) {