3 * Copyright (c) 1987-1996 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 /* Omit -- it causes too much grief on mixed systems.
24 dEXT char rcsid[] = "perl.c\nPatch level: ###\n";
32 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
38 static void find_beginning _((void));
39 static void incpush _((char *));
40 static void init_ids _((void));
41 static void init_debugger _((void));
42 static void init_lexer _((void));
43 static void init_main_stash _((void));
44 static void init_perllib _((void));
45 static void init_postdump_symbols _((int, char **, char **));
46 static void init_predump_symbols _((void));
47 static void open_script _((char *, bool, SV *));
49 static void thread_destruct _((void *));
50 #endif /* USE_THREADS */
51 static void usage _((char *));
52 static void validate_suid _((char *, char*));
54 static int fdscript = -1;
59 PerlInterpreter *sv_interp;
62 New(53, sv_interp, 1, PerlInterpreter);
67 perl_construct( sv_interp )
68 register PerlInterpreter *sv_interp;
72 #endif /* USE_THREADS */
74 if (!(curinterp = sv_interp))
78 Zero(sv_interp, 1, PerlInterpreter);
82 #ifdef NEED_PTHREAD_INIT
84 #endif /* NEED_PTHREAD_INIT */
85 New(53, thr, 1, struct thread);
86 self = pthread_self();
87 if (pthread_key_create(&thr_key, thread_destruct))
88 croak("panic: pthread_key_create");
89 if (pthread_setspecific(thr_key, (void *) thr))
90 croak("panic: pthread_setspecific");
94 #endif /* USE_THREADS */
96 /* Init the real globals? */
98 linestr = NEWSV(65,80);
99 sv_upgrade(linestr,SVt_PVIV);
101 SvREADONLY_on(&sv_undef);
105 SvREADONLY_on(&sv_no);
107 sv_setpv(&sv_yes,Yes);
109 SvREADONLY_on(&sv_yes);
111 nrs = newSVpv("\n", 1);
112 rs = SvREFCNT_inc(nrs);
114 MUTEX_INIT(&malloc_mutex);
115 MUTEX_INIT(&sv_mutex);
116 MUTEX_INIT(&eval_mutex);
117 MUTEX_INIT(&nthreads_mutex);
118 COND_INIT(&nthreads_cond);
122 * There is no way we can refer to them from Perl so close them to save
123 * space. The other alternative would be to provide STDAUX and STDPRN
126 (void)fclose(stdaux);
127 (void)fclose(stdprn);
148 #if defined(SUBVERSION) && SUBVERSION > 0
149 sprintf(patchlevel, "%7.5f", 5.0 + (PATCHLEVEL / 1000.0)
150 + (SUBVERSION / 100000.0));
152 sprintf(patchlevel, "%5.3f", 5.0 + (PATCHLEVEL / 1000.0));
155 #if defined(LOCAL_PATCH_COUNT)
156 Ilocalpatches = local_patches; /* For possible -v */
159 fdpid = newAV(); /* for remembering popen pids by fd */
160 pidstatus = newHV();/* for remembering status of dead pids */
164 New(51,debname,128,char);
165 New(52,debdelim,128,char);
176 struct thread *thr = (struct thread *) arg;
178 * Decrement the global thread count and signal anyone listening.
179 * The only official thread listening is the original thread while
180 * in perl_destruct. It waits until it's the only thread and then
181 * performs END blocks and other process clean-ups.
183 DEBUG_L(fprintf(stderr, "thread_destruct: 0x%lx\n", (unsigned long) thr));
186 MUTEX_LOCK(&nthreads_mutex);
188 COND_BROADCAST(&nthreads_cond);
189 MUTEX_UNLOCK(&nthreads_mutex);
191 #endif /* USE_THREADS */
194 perl_destruct(sv_interp)
195 register PerlInterpreter *sv_interp;
198 int destruct_level; /* 0=none, 1=full, 2=full with checks */
202 if (!(curinterp = sv_interp))
206 /* Wait until all user-created threads go away */
207 MUTEX_LOCK(&nthreads_mutex);
210 DEBUG_L(fprintf(stderr, "perl_destruct: waiting for %d threads\n",
212 COND_WAIT(&nthreads_cond, &nthreads_mutex);
214 /* At this point, we're the last thread */
215 MUTEX_UNLOCK(&nthreads_mutex);
216 DEBUG_L(fprintf(stderr, "perl_destruct: armageddon has arrived\n"));
217 MUTEX_DESTROY(&nthreads_mutex);
218 COND_DESTROY(&nthreads_cond);
219 #endif /* USE_THREADS */
221 destruct_level = perl_destruct_level;
225 if (s = getenv("PERL_DESTRUCT_LEVEL"))
226 destruct_level = atoi(s);
234 /* We must account for everything. First the syntax tree. */
236 curpad = AvARRAY(comppad);
243 * Try to destruct global references. We do this first so that the
244 * destructors and destructees still exist. Some sv's might remain.
245 * Non-referenced objects are on their own.
252 if (destruct_level == 0){
254 DEBUG_P(debprofdump());
256 /* The exit() function will do everything that needs doing. */
260 /* Prepare to destruct main symbol table. */
266 if (destruct_level >= 2) {
267 if (scopestack_ix != 0)
268 warn("Unbalanced scopes: %d more ENTERs than LEAVEs\n", scopestack_ix);
269 if (savestack_ix != 0)
270 warn("Unbalanced saves: %d more saves than restores\n", savestack_ix);
271 if (tmps_floor != -1)
272 warn("Unbalanced tmps: %d more allocs than frees\n", tmps_floor + 1);
273 if (cxstack_ix != -1)
274 warn("Unbalanced context: %d more PUSHes than POPs\n", cxstack_ix + 1);
277 /* Now absolutely destruct everything, somehow or other, loops or no. */
279 while (sv_count != 0 && sv_count != last_sv_count) {
280 last_sv_count = sv_count;
284 warn("Scalars leaked: %d\n", sv_count);
287 DEBUG_P(debprofdump());
289 MUTEX_DESTROY(&sv_mutex);
290 MUTEX_DESTROY(&malloc_mutex);
291 MUTEX_DESTROY(&eval_mutex);
292 #endif /* USE_THREADS */
297 PerlInterpreter *sv_interp;
299 if (!(curinterp = sv_interp))
303 #if !defined(STANDARD_C) && !defined(HAS_GETENV_PROTOTYPE)
304 char *getenv _((char *)); /* Usually in <stdlib.h> */
308 perl_parse(sv_interp, xsinit, argc, argv, env)
309 PerlInterpreter *sv_interp;
310 void (*xsinit)_((void));
318 char *scriptname = NULL;
319 VOL bool dosearch = FALSE;
323 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
326 croak("suidperl is no longer needed since the kernel can now execute\n\
327 setuid perl scripts securely.\n");
331 if (!(curinterp = sv_interp))
336 #ifndef VMS /* VMS doesn't have environ array */
337 origenviron = environ;
343 /* Come here if running an undumped a.out. */
345 origfilename = savepv(argv[0]);
347 cxstack_ix = -1; /* start label stack again */
349 init_postdump_symbols(argc,argv,env);
357 switch (Sigsetjmp(top_env,1)) {
368 return(statusvalue); /* my_exit() was called */
370 fprintf(stderr, "panic: top_env\n");
374 sv_setpvn(linestr,"",0);
375 sv = newSVpv("",0); /* first used for -I flags */
378 for (argc--,argv++; argc > 0; argc--,argv++) {
379 if (argv[0][0] != '-' || !argv[0][1])
383 validarg = " PHOOEY ";
409 if (s = moreswitches(s))
414 if (euid != uid || egid != gid)
415 croak("No -e allowed in setuid scripts");
417 e_tmpname = savepv(TMPPATH);
418 (void)mktemp(e_tmpname);
420 croak("Can't mktemp()");
421 e_fp = fopen(e_tmpname,"w");
423 croak("Cannot open temporary file");
429 (void)putc('\n', e_fp);
437 av_push(GvAVn(incgv),newSVpv(s,0));
440 av_push(GvAVn(incgv),newSVpv(argv[1],0));
441 sv_catpv(sv,argv[1]);
458 preambleav = newAV();
459 av_push(preambleav, newSVpv("use Config qw(myconfig config_vars)",0));
461 Sv = newSVpv("print myconfig(),'@INC: '.\"@INC\\n\"",0);
464 Sv = newSVpv("config_vars(qw(",0);
469 av_push(preambleav, Sv);
470 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
484 croak("Unrecognized switch: -%s",s);
489 scriptname = argv[0];
491 if (Fflush(e_fp) || ferror(e_fp) || fclose(e_fp))
492 croak("Can't write to temp file for -e: %s", Strerror(errno));
495 scriptname = e_tmpname;
497 else if (scriptname == Nullch) {
499 if ( isatty(fileno(stdin)) )
507 open_script(scriptname,dosearch,sv);
509 validate_suid(validarg, scriptname);
514 compcv = (CV*)NEWSV(1104,0);
515 sv_upgrade((SV *)compcv, SVt_PVCV);
518 New(666, CvMUTEXP(compcv), 1, pthread_mutex_t);
519 MUTEX_INIT(CvMUTEXP(compcv));
520 New(666, CvCONDP(compcv), 1, pthread_cond_t);
521 COND_INIT(CvCONDP(compcv));
522 #endif /* USE_THREADS */
526 av_push(comppad, Nullsv);
527 curpad = AvARRAY(comppad);
529 comppad_name = padname;
530 comppad_name_fill = 0;
532 av_store(comppad_name, 0, newSVpv("@_", 2));
533 #endif /* USE_THREADS */
534 min_intro_pending = 0;
537 comppadlist = newAV();
538 AvREAL_off(comppadlist);
539 av_store(comppadlist, 0, (SV*)comppad_name);
540 av_store(comppadlist, 1, (SV*)comppad);
541 CvPADLIST(compcv) = comppadlist;
544 (*xsinit)(); /* in case linked C routines want magical variables */
549 init_predump_symbols();
551 init_postdump_symbols(argc,argv,env);
555 /* now parse the script */
558 if (yyparse() || error_count) {
560 croak("%s had compilation errors.\n", origfilename);
562 croak("Execution of %s aborted due to compilation errors.\n",
566 curcop->cop_line = 0;
570 (void)UNLINK(e_tmpname);
575 /* now that script is parsed, we can modify record separator */
577 rs = SvREFCNT_inc(nrs);
578 sv_setsv(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), rs);
589 #ifdef DEBUGGING_MSTATS
590 if ((s=getenv("PERL_DEBUG_MSTATS")) && atoi(s) >= 2)
591 dump_mstats("after compilation:");
601 PerlInterpreter *sv_interp;
604 if (!(curinterp = sv_interp))
606 switch (Sigsetjmp(top_env,1)) {
608 cxstack_ix = -1; /* start context stack again */
615 #ifdef DEBUGGING_MSTATS
616 if (getenv("PERL_DEBUG_MSTATS"))
617 dump_mstats("after execution: ");
619 return(statusvalue); /* my_exit() was called */
622 fprintf(stderr, "panic: restartop\n");
626 if (stack != mainstack) {
628 SWITCHSTACK(stack, mainstack);
635 DEBUG(fprintf(stderr,"\nEXECUTING...\n\n"));
637 DEBUG_L(fprintf(stderr,"main thread is 0x%lx\n", (unsigned long) thr));
638 #endif /* USE_THREADS */
641 fprintf(stderr,"%s syntax OK\n", origfilename);
644 if (perldb && DBsingle)
645 sv_setiv(DBsingle, 1);
655 else if (main_start) {
669 register CONTEXT *cx;
674 DEBUG_L(fprintf(stderr, "my_exit: thread 0x%lx, status %lu\n",
675 (unsigned long) thr, (unsigned long) status));
676 #endif /* USE_THREADS */
677 statusvalue = FIXSTATUS(status);
678 if (cxstack_ix >= 0) {
684 Siglongjmp(top_env, 2);
688 perl_get_sv(name, create)
692 GV* gv = gv_fetchpv(name, create, SVt_PV);
699 perl_get_av(name, create)
703 GV* gv = gv_fetchpv(name, create, SVt_PVAV);
712 perl_get_hv(name, create)
716 GV* gv = gv_fetchpv(name, create, SVt_PVHV);
725 perl_get_cv(name, create)
729 GV* gv = gv_fetchpv(name, create, SVt_PVCV);
730 if (create && !GvCV(gv))
731 return newSUB(start_subparse(),
732 newSVOP(OP_CONST, 0, newSVpv(name,0)),
740 /* Be sure to refetch the stack pointer after calling these routines. */
743 perl_call_argv(subname, flags, argv)
745 I32 flags; /* See G_* flags in cop.h */
746 register char **argv; /* null terminated arg list */
754 XPUSHs(sv_2mortal(newSVpv(*argv,0)));
759 return perl_call_pv(subname, flags);
763 perl_call_pv(subname, flags)
764 char *subname; /* name of the subroutine */
765 I32 flags; /* See G_* flags in cop.h */
767 return perl_call_sv((SV*)perl_get_cv(subname, TRUE), flags);
771 perl_call_method(methname, flags)
772 char *methname; /* name of the subroutine */
773 I32 flags; /* See G_* flags in cop.h */
780 XPUSHs(sv_2mortal(newSVpv(methname,0)));
783 return perl_call_sv(*stack_sp--, flags);
786 /* May be called with any of a CV, a GV, or an SV containing the name. */
788 perl_call_sv(sv, flags)
790 I32 flags; /* See G_* flags in cop.h */
793 LOGOP myop; /* fake syntax tree node */
795 I32 oldmark = TOPMARK;
800 if (flags & G_DISCARD) {
810 oldscope = scopestack_ix;
812 if (!(flags & G_NOARGS))
813 myop.op_flags = OPf_STACKED;
814 myop.op_next = Nullop;
815 myop.op_flags |= OPf_KNOW;
817 myop.op_flags |= OPf_LIST;
819 if (flags & G_EVAL) {
820 Copy(top_env, oldtop, 1, Sigjmp_buf);
822 cLOGOP->op_other = op;
824 /* we're trying to emulate pp_entertry() here */
826 register CONTEXT *cx;
832 push_return(op->op_next);
833 PUSHBLOCK(cx, CXt_EVAL, stack_sp);
835 eval_root = op; /* Only needed so that goto works right. */
838 if (flags & G_KEEPERR)
841 sv_setpv(GvSV(errgv),"");
846 switch (Sigsetjmp(top_env,1)) {
851 statusvalue = 255; /* XXX I don't think we use 1 anymore. */
857 /* my_exit() was called */
860 Copy(oldtop, top_env, 1, Sigjmp_buf);
862 croak("Callback called exit");
863 my_exit(statusvalue);
871 stack_sp = stack_base + oldmark;
876 *++stack_sp = &sv_undef;
882 if (op == (OP*)&myop)
883 op = pp_entersub(ARGS);
886 retval = stack_sp - (stack_base + oldmark);
887 if ((flags & G_EVAL) && !(flags & G_KEEPERR))
888 sv_setpv(GvSV(errgv),"");
891 if (flags & G_EVAL) {
892 if (scopestack_ix > oldscope) {
896 register CONTEXT *cx;
905 Copy(oldtop, top_env, 1, Sigjmp_buf);
907 if (flags & G_DISCARD) {
908 stack_sp = stack_base + oldmark;
919 perl_eval_sv(sv, flags)
921 I32 flags; /* See G_* flags in cop.h */
924 UNOP myop; /* fake syntax tree node */
926 I32 oldmark = sp - stack_base;
931 if (flags & G_DISCARD) {
941 oldscope = scopestack_ix;
943 if (!(flags & G_NOARGS))
944 myop.op_flags = OPf_STACKED;
945 myop.op_next = Nullop;
946 myop.op_flags |= OPf_KNOW;
948 myop.op_flags |= OPf_LIST;
950 Copy(top_env, oldtop, 1, Sigjmp_buf);
953 switch (Sigsetjmp(top_env,1)) {
958 statusvalue = 255; /* XXX I don't think we use 1 anymore. */
964 /* my_exit() was called */
967 Copy(oldtop, top_env, 1, Sigjmp_buf);
969 croak("Callback called exit");
970 my_exit(statusvalue);
978 stack_sp = stack_base + oldmark;
983 *++stack_sp = &sv_undef;
988 if (op == (OP*)&myop)
989 op = pp_entereval(ARGS);
992 retval = stack_sp - (stack_base + oldmark);
993 if ((flags & G_EVAL) && !(flags & G_KEEPERR))
994 sv_setpv(GvSV(errgv),"");
997 Copy(oldtop, top_env, 1, Sigjmp_buf);
998 if (flags & G_DISCARD) {
999 stack_sp = stack_base + oldmark;
1007 /* Require a module. */
1013 SV* sv = sv_newmortal();
1014 sv_setpv(sv, "require '");
1017 perl_eval_sv(sv, G_DISCARD);
1021 magicname(sym,name,namlen)
1028 if (gv = gv_fetchpv(sym,TRUE, SVt_PV))
1029 sv_magic(GvSV(gv), (SV*)gv, 0, name, namlen);
1033 # define PERLLIB_SEP ';'
1036 # define PERLLIB_SEP '|'
1038 # define PERLLIB_SEP ':'
1051 /* Break at all separators */
1053 /* First, skip any consecutive separators */
1054 while ( *p == PERLLIB_SEP ) {
1055 /* Uncomment the next line for PATH semantics */
1056 /* av_push(GvAVn(incgv), newSVpv(".", 1)); */
1059 if ( (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
1060 av_push(GvAVn(incgv), newSVpv(p, (STRLEN)(s - p)));
1063 av_push(GvAVn(incgv), newSVpv(p, 0));
1070 usage(name) /* XXX move this out into a module ? */
1073 /* This message really ought to be max 23 lines.
1074 * Removed -h because the user already knows that opton. Others? */
1075 printf("\nUsage: %s [switches] [--] [programfile] [arguments]", name);
1076 printf("\n -0[octal] specify record separator (\\0, if no argument)");
1077 printf("\n -a autosplit mode with -n or -p (splits $_ into @F)");
1078 printf("\n -c check syntax only (runs BEGIN and END blocks)");
1079 printf("\n -d[:debugger] run scripts under debugger");
1080 printf("\n -D[number/list] set debugging flags (argument is a bit mask or flags)");
1081 printf("\n -e 'command' one line of script. Several -e's allowed. Omit [programfile].");
1082 printf("\n -F/pattern/ split() pattern for autosplit (-a). The //'s are optional.");
1083 printf("\n -i[extension] edit <> files in place (make backup if extension supplied)");
1084 printf("\n -Idirectory specify @INC/#include directory (may be used more then once)");
1085 printf("\n -l[octal] enable line ending processing, specifies line teminator");
1086 printf("\n -[mM][-]module.. executes `use/no module...' before executing your script.");
1087 printf("\n -n assume 'while (<>) { ... }' loop arround your script");
1088 printf("\n -p assume loop like -n but print line also like sed");
1089 printf("\n -P run script through C preprocessor before compilation");
1091 printf("\n -R enable REXX variable pool");
1093 printf("\n -s enable some switch parsing for switches after script name");
1094 printf("\n -S look for the script using PATH environment variable");
1095 printf("\n -T turn on tainting checks");
1096 printf("\n -u dump core after parsing script");
1097 printf("\n -U allow unsafe operations");
1098 printf("\n -v print version number and patchlevel of perl");
1099 printf("\n -V[:variable] print perl configuration information");
1100 printf("\n -w TURN WARNINGS ON FOR COMPILATION OF YOUR SCRIPT.");
1101 printf("\n -x[directory] strip off text before #!perl line and perhaps cd to directory\n");
1104 /* This routine handles any switches that can be given during run */
1115 rschar = scan_oct(s, 4, &numlen);
1117 if (rschar & ~((U8)~0))
1119 else if (!rschar && numlen >= 2)
1120 nrs = newSVpv("", 0);
1123 nrs = newSVpv(&ch, 1);
1128 splitstr = savepv(s + 1);
1142 if (*s == ':' || *s == '=') {
1143 sprintf(buf, "use Devel::%s;", ++s);
1145 my_setenv("PERL5DB",buf);
1155 if (isALPHA(s[1])) {
1156 static char debopts[] = "psltocPmfrxuLHXD";
1159 for (s++; *s && (d = strchr(debopts,*s)); s++)
1160 debug |= 1 << (d - debopts);
1164 for (s++; isDIGIT(*s); s++) ;
1166 debug |= 0x80000000;
1168 warn("Recompile perl with -DDEBUGGING to use -D switch\n");
1169 for (s++; isALNUM(*s); s++) ;
1179 inplace = savepv(s+1);
1181 for (s = inplace; *s && !isSPACE(*s); s++) ;
1188 for (e = s; *e && !isSPACE(*e); e++) ;
1189 av_push(GvAVn(incgv),newSVpv(s,e-s));
1194 croak("No space allowed after -I");
1204 *ors = scan_oct(s, 3 + (*s == '0'), &numlen);
1209 ors = savepvn("\n\n", 2);
1213 ors = SvPV(nrs, orslen);
1217 taint_not("-M"); /* XXX ? */
1220 taint_not("-m"); /* XXX ? */
1225 /* -M-foo == 'no foo' */
1226 if (*s == '-') { use = "no "; ++s; }
1227 sv = newSVpv(use,0);
1229 /* We allow -M'Module qw(Foo Bar)' */
1230 while(isALNUM(*s) || *s==':') ++s;
1232 sv_catpv(sv, start);
1233 if (*(start-1) == 'm') {
1235 croak("Can't use '%c' after -mname", *s);
1236 sv_catpv( sv, " ()");
1239 sv_catpvn(sv, start, s-start);
1240 sv_catpv(sv, " split(/,/,q{");
1245 if (preambleav == NULL)
1246 preambleav = newAV();
1247 av_push(preambleav, sv);
1250 croak("No space allowed after -%c", *(s-1));
1278 #if defined(SUBVERSION) && SUBVERSION > 0
1279 printf("\nThis is perl, version 5.%03d_%02d", PATCHLEVEL, SUBVERSION);
1281 printf("\nThis is perl, version %s",patchlevel);
1284 #if defined(DEBUGGING) || defined(EMBED) || defined(MULTIPLICITY)
1285 fputs(" with", stdout);
1287 fputs(" DEBUGGING", stdout);
1290 fputs(" EMBED", stdout);
1293 fputs(" MULTIPLICITY", stdout);
1297 #if defined(LOCAL_PATCH_COUNT)
1298 if (LOCAL_PATCH_COUNT > 0)
1300 fputs("\n\tLocally applied patches:\n", stdout);
1301 for (i = 1; i <= LOCAL_PATCH_COUNT; i++) {
1302 if (Ilocalpatches[i])
1303 fprintf(stdout, "\t %s\n", Ilocalpatches[i]);
1307 printf("\n\tbuilt under %s",OSNAME);
1310 printf(" at %s %s",__DATE__,__TIME__);
1312 printf(" on %s",__DATE__);
1315 fputs("\n\t+ suidperl security patch", stdout);
1316 fputs("\n\nCopyright 1987-1996, Larry Wall\n",stdout);
1318 fputs("MS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n",
1322 fputs("OS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
1323 "Version 5 port Copyright (c) 1994-1995, Andreas Kaiser\n", stdout);
1326 fputs("atariST series port, ++jrb bammi@cadence.com\n", stdout);
1329 Perl may be copied only under the terms of either the Artistic License or the\n\
1330 GNU General Public License, which may be found in the Perl 5.0 source kit.\n\n",stdout);
1341 if (s[1] == '-') /* Additional switches on #! line. */
1354 croak("Can't emulate -%.1s on #! line",s);
1359 /* compliments of Tom Christiansen */
1361 /* unexec() can be found in the Gnu emacs distribution */
1370 sprintf (buf, "%s.perldump", origfilename);
1371 sprintf (tokenbuf, "%s/perl", BIN);
1373 status = unexec(buf, tokenbuf, &etext, sbrk(0), 0);
1375 fprintf(stderr, "unexec of %s into %s failed!\n", tokenbuf, buf);
1379 # include <lib$routines.h>
1380 lib$signal(SS$_DEBUG); /* ssdef.h #included from vmsish.h */
1382 ABORT(); /* for use with undump */
1392 curstash = defstash = newHV();
1393 curstname = newSVpv("main",4);
1394 gv = gv_fetchpv("main::",TRUE, SVt_PVHV);
1395 SvREFCNT_dec(GvHV(gv));
1396 GvHV(gv) = (HV*)SvREFCNT_inc(defstash);
1398 HvNAME(defstash) = savepv("main");
1399 incgv = gv_HVadd(gv_AVadd(gv_fetchpv("INC",TRUE, SVt_PVAV)));
1401 defgv = gv_fetchpv("_",TRUE, SVt_PVAV);
1402 errgv = gv_HVadd(gv_fetchpv("@", TRUE, SVt_PV));
1404 curstash = defstash;
1405 compiling.cop_stash = defstash;
1406 debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
1407 /* We must init $/ before switches are processed. */
1408 sv_setpvn(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), "\n", 1);
1411 #ifdef CAN_PROTOTYPE
1413 open_script(char *scriptname, bool dosearch, SV *sv)
1416 open_script(scriptname,dosearch,sv)
1422 char *xfound = Nullch;
1423 char *xfailed = Nullch;
1427 #if defined(DOSISH) && !defined(OS2) && !defined(atarist)
1428 #define SEARCH_EXTS ".bat", ".cmd", NULL
1431 # define SEARCH_EXTS ".pl", ".com", NULL
1433 /* additional extensions to try in each dir if scriptname not found */
1435 char *ext[] = { SEARCH_EXTS };
1436 int extidx = (strchr(scriptname,'.')) ? -1 : 0; /* has ext already */
1440 if (dosearch && !strpbrk(scriptname,":[</") && (my_getenv("DCL$PATH"))) {
1443 while (my_trnlnm("DCL$PATH",tokenbuf,idx++)) {
1444 strcat(tokenbuf,scriptname);
1446 if (dosearch && !strchr(scriptname, '/') && (s = getenv("PATH"))) {
1448 bufend = s + strlen(s);
1451 s = cpytill(tokenbuf,s,bufend,':',&len);
1454 for (len = 0; *s && *s != ',' && *s != ';'; tokenbuf[len++] = *s++);
1455 tokenbuf[len] = '\0';
1457 for (len = 0; *s && *s != ';'; tokenbuf[len++] = *s++);
1458 tokenbuf[len] = '\0';
1464 if (len && tokenbuf[len-1] != '/')
1467 if (len && ((tokenbuf[len-1] != '\\') && (tokenbuf[len-1] != '/')))
1469 if (len && tokenbuf[len-1] != '\\')
1472 (void)strcat(tokenbuf+len,"/");
1473 (void)strcat(tokenbuf+len,scriptname);
1477 len = strlen(tokenbuf);
1478 if (extidx > 0) /* reset after previous loop */
1482 DEBUG_p(fprintf(stderr,"Looking for %s\n",tokenbuf));
1483 retval = Stat(tokenbuf,&statbuf);
1485 } while ( retval < 0 /* not there */
1486 && extidx>=0 && ext[extidx] /* try an extension? */
1487 && strcpy(tokenbuf+len, ext[extidx++])
1492 if (S_ISREG(statbuf.st_mode)
1493 && cando(S_IRUSR,TRUE,&statbuf) && cando(S_IXUSR,TRUE,&statbuf)) {
1494 xfound = tokenbuf; /* bingo! */
1498 xfailed = savepv(tokenbuf);
1501 croak("Can't execute %s", xfailed ? xfailed : scriptname );
1504 scriptname = xfound;
1507 if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
1508 char *s = scriptname + 8;
1517 origfilename = savepv(e_tmpname ? "-e" : scriptname);
1518 curcop->cop_filegv = gv_fetchfile(origfilename);
1519 if (strEQ(origfilename,"-"))
1521 if (fdscript >= 0) {
1522 rsfp = fdopen(fdscript,"r");
1523 #if defined(HAS_FCNTL) && defined(F_SETFD)
1524 fcntl(fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
1527 else if (preprocess) {
1528 char *cpp = CPPSTDIN;
1530 if (strEQ(cpp,"cppstdin"))
1531 sprintf(tokenbuf, "%s/%s", SCRIPTDIR, cpp);
1533 sprintf(tokenbuf, "%s", cpp);
1535 sv_catpv(sv,PRIVLIB_EXP);
1537 (void)sprintf(buf, "\
1538 sed %s -e \"/^[^#]/b\" \
1539 -e \"/^#[ ]*include[ ]/b\" \
1540 -e \"/^#[ ]*define[ ]/b\" \
1541 -e \"/^#[ ]*if[ ]/b\" \
1542 -e \"/^#[ ]*ifdef[ ]/b\" \
1543 -e \"/^#[ ]*ifndef[ ]/b\" \
1544 -e \"/^#[ ]*else/b\" \
1545 -e \"/^#[ ]*elif[ ]/b\" \
1546 -e \"/^#[ ]*undef[ ]/b\" \
1547 -e \"/^#[ ]*endif/b\" \
1550 (doextract ? "-e \"1,/^#/d\n\"" : ""),
1552 (void)sprintf(buf, "\
1553 %s %s -e '/^[^#]/b' \
1554 -e '/^#[ ]*include[ ]/b' \
1555 -e '/^#[ ]*define[ ]/b' \
1556 -e '/^#[ ]*if[ ]/b' \
1557 -e '/^#[ ]*ifdef[ ]/b' \
1558 -e '/^#[ ]*ifndef[ ]/b' \
1559 -e '/^#[ ]*else/b' \
1560 -e '/^#[ ]*elif[ ]/b' \
1561 -e '/^#[ ]*undef[ ]/b' \
1562 -e '/^#[ ]*endif/b' \
1570 (doextract ? "-e '1,/^#/d\n'" : ""),
1572 scriptname, tokenbuf, SvPV(sv, na), CPPMINUS);
1574 #ifdef IAMSUID /* actually, this is caught earlier */
1575 if (euid != uid && !euid) { /* if running suidperl */
1577 (void)seteuid(uid); /* musn't stay setuid root */
1580 (void)setreuid((Uid_t)-1, uid);
1582 #ifdef HAS_SETRESUID
1583 (void)setresuid((Uid_t)-1, uid, (Uid_t)-1);
1589 if (geteuid() != uid)
1590 croak("Can't do seteuid!\n");
1592 #endif /* IAMSUID */
1593 rsfp = my_popen(buf,"r");
1595 else if (!*scriptname) {
1596 taint_not("program input from stdin");
1600 rsfp = fopen(scriptname,"r");
1601 #if defined(HAS_FCNTL) && defined(F_SETFD)
1602 fcntl(fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
1605 if ((FILE*)rsfp == Nullfp) {
1607 #ifndef IAMSUID /* in case script is not readable before setuid */
1608 if (euid && Stat(SvPVX(GvSV(curcop->cop_filegv)),&statbuf) >= 0 &&
1609 statbuf.st_mode & (S_ISUID|S_ISGID)) {
1610 (void)sprintf(buf, "%s/sperl%s", BIN, patchlevel);
1611 execv(buf, origargv); /* try again */
1612 croak("Can't do setuid\n");
1616 croak("Can't open perl script \"%s\": %s\n",
1617 SvPVX(GvSV(curcop->cop_filegv)), Strerror(errno));
1622 validate_suid(validarg, scriptname)
1628 /* do we need to emulate setuid on scripts? */
1630 /* This code is for those BSD systems that have setuid #! scripts disabled
1631 * in the kernel because of a security problem. Merely defining DOSUID
1632 * in perl will not fix that problem, but if you have disabled setuid
1633 * scripts in the kernel, this will attempt to emulate setuid and setgid
1634 * on scripts that have those now-otherwise-useless bits set. The setuid
1635 * root version must be called suidperl or sperlN.NNN. If regular perl
1636 * discovers that it has opened a setuid script, it calls suidperl with
1637 * the same argv that it had. If suidperl finds that the script it has
1638 * just opened is NOT setuid root, it sets the effective uid back to the
1639 * uid. We don't just make perl setuid root because that loses the
1640 * effective uid we had before invoking perl, if it was different from the
1643 * DOSUID must be defined in both perl and suidperl, and IAMSUID must
1644 * be defined in suidperl only. suidperl must be setuid root. The
1645 * Configure script will set this up for you if you want it.
1651 if (Fstat(fileno(rsfp),&statbuf) < 0) /* normal stat is insecure */
1652 croak("Can't stat script \"%s\"",origfilename);
1653 if (fdscript < 0 && statbuf.st_mode & (S_ISUID|S_ISGID)) {
1657 #ifndef HAS_SETREUID
1658 /* On this access check to make sure the directories are readable,
1659 * there is actually a small window that the user could use to make
1660 * filename point to an accessible directory. So there is a faint
1661 * chance that someone could execute a setuid script down in a
1662 * non-accessible directory. I don't know what to do about that.
1663 * But I don't think it's too important. The manual lies when
1664 * it says access() is useful in setuid programs.
1666 if (access(SvPVX(GvSV(curcop->cop_filegv)),1)) /*double check*/
1667 croak("Permission denied");
1669 /* If we can swap euid and uid, then we can determine access rights
1670 * with a simple stat of the file, and then compare device and
1671 * inode to make sure we did stat() on the same file we opened.
1672 * Then we just have to make sure he or she can execute it.
1675 struct stat tmpstatbuf;
1679 setreuid(euid,uid) < 0
1682 setresuid(euid,uid,(Uid_t)-1) < 0
1685 || getuid() != euid || geteuid() != uid)
1686 croak("Can't swap uid and euid"); /* really paranoid */
1687 if (Stat(SvPVX(GvSV(curcop->cop_filegv)),&tmpstatbuf) < 0)
1688 croak("Permission denied"); /* testing full pathname here */
1689 if (tmpstatbuf.st_dev != statbuf.st_dev ||
1690 tmpstatbuf.st_ino != statbuf.st_ino) {
1692 if (rsfp = my_popen("/bin/mail root","w")) { /* heh, heh */
1694 "User %d tried to run dev %d ino %d in place of dev %d ino %d!\n\
1695 (Filename of set-id script was %s, uid %d gid %d.)\n\nSincerely,\nperl\n",
1696 uid,tmpstatbuf.st_dev, tmpstatbuf.st_ino,
1697 statbuf.st_dev, statbuf.st_ino,
1698 SvPVX(GvSV(curcop->cop_filegv)),
1699 statbuf.st_uid, statbuf.st_gid);
1700 (void)my_pclose(rsfp);
1702 croak("Permission denied\n");
1706 setreuid(uid,euid) < 0
1708 # if defined(HAS_SETRESUID)
1709 setresuid(uid,euid,(Uid_t)-1) < 0
1712 || getuid() != uid || geteuid() != euid)
1713 croak("Can't reswap uid and euid");
1714 if (!cando(S_IXUSR,FALSE,&statbuf)) /* can real uid exec? */
1715 croak("Permission denied\n");
1717 #endif /* HAS_SETREUID */
1718 #endif /* IAMSUID */
1720 if (!S_ISREG(statbuf.st_mode))
1721 croak("Permission denied");
1722 if (statbuf.st_mode & S_IWOTH)
1723 croak("Setuid/gid script is writable by world");
1724 doswitches = FALSE; /* -s is insecure in suid */
1726 if (fgets(tokenbuf,sizeof tokenbuf, rsfp) == Nullch ||
1727 strnNE(tokenbuf,"#!",2) ) /* required even on Sys V */
1728 croak("No #! line");
1731 while (!isSPACE(*s)) s++;
1732 if (strnNE(s-4,"perl",4) && strnNE(s-9,"perl",4)) /* sanity check */
1733 croak("Not a perl script");
1734 while (*s == ' ' || *s == '\t') s++;
1736 * #! arg must be what we saw above. They can invoke it by
1737 * mentioning suidperl explicitly, but they may not add any strange
1738 * arguments beyond what #! says if they do invoke suidperl that way.
1740 len = strlen(validarg);
1741 if (strEQ(validarg," PHOOEY ") ||
1742 strnNE(s,validarg,len) || !isSPACE(s[len]))
1743 croak("Args must match #! line");
1746 if (euid != uid && (statbuf.st_mode & S_ISUID) &&
1747 euid == statbuf.st_uid)
1749 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
1750 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
1751 #endif /* IAMSUID */
1753 if (euid) { /* oops, we're not the setuid root perl */
1756 (void)sprintf(buf, "%s/sperl%s", BIN, patchlevel);
1757 execv(buf, origargv); /* try again */
1759 croak("Can't do setuid\n");
1762 if (statbuf.st_mode & S_ISGID && statbuf.st_gid != egid) {
1764 (void)setegid(statbuf.st_gid);
1767 (void)setregid((Gid_t)-1,statbuf.st_gid);
1769 #ifdef HAS_SETRESGID
1770 (void)setresgid((Gid_t)-1,statbuf.st_gid,(Gid_t)-1);
1772 setgid(statbuf.st_gid);
1776 if (getegid() != statbuf.st_gid)
1777 croak("Can't do setegid!\n");
1779 if (statbuf.st_mode & S_ISUID) {
1780 if (statbuf.st_uid != euid)
1782 (void)seteuid(statbuf.st_uid); /* all that for this */
1785 (void)setreuid((Uid_t)-1,statbuf.st_uid);
1787 #ifdef HAS_SETRESUID
1788 (void)setresuid((Uid_t)-1,statbuf.st_uid,(Uid_t)-1);
1790 setuid(statbuf.st_uid);
1794 if (geteuid() != statbuf.st_uid)
1795 croak("Can't do seteuid!\n");
1797 else if (uid) { /* oops, mustn't run as root */
1799 (void)seteuid((Uid_t)uid);
1802 (void)setreuid((Uid_t)-1,(Uid_t)uid);
1804 #ifdef HAS_SETRESUID
1805 (void)setresuid((Uid_t)-1,(Uid_t)uid,(Uid_t)-1);
1811 if (geteuid() != uid)
1812 croak("Can't do seteuid!\n");
1815 if (!cando(S_IXUSR,TRUE,&statbuf))
1816 croak("Permission denied\n"); /* they can't do this */
1819 else if (preprocess)
1820 croak("-P not allowed for setuid/setgid script\n");
1821 else if (fdscript >= 0)
1822 croak("fd script not allowed in suidperl\n");
1824 croak("Script is not setuid/setgid in suidperl\n");
1826 /* We absolutely must clear out any saved ids here, so we */
1827 /* exec the real perl, substituting fd script for scriptname. */
1828 /* (We pass script name as "subdir" of fd, which perl will grok.) */
1830 for (which = 1; origargv[which] && origargv[which] != scriptname; which++) ;
1831 if (!origargv[which])
1832 croak("Permission denied");
1833 (void)sprintf(buf, "/dev/fd/%d/%.127s", fileno(rsfp), origargv[which]);
1834 origargv[which] = buf;
1836 #if defined(HAS_FCNTL) && defined(F_SETFD)
1837 fcntl(fileno(rsfp),F_SETFD,0); /* ensure no close-on-exec */
1840 (void)sprintf(tokenbuf, "%s/perl%s", BIN, patchlevel);
1841 execv(tokenbuf, origargv); /* try again */
1842 croak("Can't do setuid\n");
1843 #endif /* IAMSUID */
1845 if (euid != uid || egid != gid) { /* (suidperl doesn't exist, in fact) */
1846 #ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
1847 Fstat(fileno(rsfp),&statbuf); /* may be either wrapped or real suid */
1848 if ((euid != uid && euid == statbuf.st_uid && statbuf.st_mode & S_ISUID)
1850 (egid != gid && egid == statbuf.st_gid && statbuf.st_mode & S_ISGID)
1853 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
1854 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
1855 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
1856 /* not set-id, must be wrapped */
1866 /* skip forward in input to the real script? */
1870 if ((s = sv_gets(linestr, rsfp, 0)) == Nullch)
1871 croak("No Perl script found in input\n");
1872 if (*s == '#' && s[1] == '!' && instr(s,"perl")) {
1873 ungetc('\n',rsfp); /* to keep line count right */
1875 if (s = instr(s,"perl -")) {
1878 while (s = moreswitches(s)) ;
1880 if (cddir && chdir(cddir) < 0)
1881 croak("Can't chdir to %s",cddir);
1889 uid = (int)getuid();
1890 euid = (int)geteuid();
1891 gid = (int)getgid();
1892 egid = (int)getegid();
1897 tainting |= (uid && (euid != uid || egid != gid));
1904 curstash = debstash;
1905 dbargs = GvAV(gv_AVadd((gv_fetchpv("args", GV_ADDMULTI, SVt_PVAV))));
1907 DBgv = gv_fetchpv("DB", GV_ADDMULTI, SVt_PVGV);
1908 DBline = gv_fetchpv("dbline", GV_ADDMULTI, SVt_PVAV);
1909 DBsub = gv_HVadd(gv_fetchpv("sub", GV_ADDMULTI, SVt_PVHV));
1910 DBsingle = GvSV((gv_fetchpv("single", GV_ADDMULTI, SVt_PV)));
1911 sv_setiv(DBsingle, 0);
1912 DBtrace = GvSV((gv_fetchpv("trace", GV_ADDMULTI, SVt_PV)));
1913 sv_setiv(DBtrace, 0);
1914 DBsignal = GvSV((gv_fetchpv("signal", GV_ADDMULTI, SVt_PV)));
1915 sv_setiv(DBsignal, 0);
1916 curstash = defstash;
1924 mainstack = stack; /* remember in case we switch stacks */
1925 AvREAL_off(stack); /* not a real array */
1926 av_extend(stack,127);
1928 stack_base = AvARRAY(stack);
1929 stack_sp = stack_base;
1930 stack_max = stack_base + 127;
1932 New(54,markstack,64,I32);
1933 markstack_ptr = markstack;
1934 markstack_max = markstack + 64;
1936 New(54,scopestack,32,I32);
1938 scopestack_max = 32;
1940 New(54,savestack,128,ANY);
1942 savestack_max = 128;
1944 New(54,retstack,16,OP*);
1948 cxstack_max = 8192 / sizeof(CONTEXT) - 2; /* Use most of 8K. */
1949 New(50,cxstack,cxstack_max + 1,CONTEXT);
1952 New(50,tmps_stack,128,SV*);
1957 static FILE *tmpfp; /* moved outside init_lexer() because of UNICOS bug */
1965 subname = newSVpv("main",4);
1969 init_predump_symbols()
1975 sv_setpvn(GvSV(gv_fetchpv("\"", TRUE, SVt_PV)), " ", 1);
1977 stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
1978 GvMULTI_on(stdingv);
1979 IoIFP(GvIOp(stdingv)) = stdin;
1980 tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
1982 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(stdingv));
1984 tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
1986 IoOFP(GvIOp(tmpgv)) = IoIFP(GvIOp(tmpgv)) = stdout;
1988 tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
1990 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(defoutgv));
1992 othergv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
1993 GvMULTI_on(othergv);
1994 IoOFP(GvIOp(othergv)) = IoIFP(GvIOp(othergv)) = stderr;
1995 tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
1997 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(othergv));
1999 statname = NEWSV(66,0); /* last filename we did stat on */
2001 osname = savepv(OSNAME);
2005 init_postdump_symbols(argc,argv,env)
2007 register char **argv;
2008 register char **env;
2014 argc--,argv++; /* skip name of script */
2016 for (; argc > 0 && **argv == '-'; argc--,argv++) {
2019 if (argv[0][1] == '-') {
2023 if (s = strchr(argv[0], '=')) {
2025 sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),s);
2028 sv_setiv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),1);
2031 toptarget = NEWSV(0,0);
2032 sv_upgrade(toptarget, SVt_PVFM);
2033 sv_setpvn(toptarget, "", 0);
2034 bodytarget = NEWSV(0,0);
2035 sv_upgrade(bodytarget, SVt_PVFM);
2036 sv_setpvn(bodytarget, "", 0);
2037 formtarget = bodytarget;
2040 if (tmpgv = gv_fetchpv("0",TRUE, SVt_PV)) {
2041 sv_setpv(GvSV(tmpgv),origfilename);
2042 magicname("0", "0", 1);
2044 if (tmpgv = gv_fetchpv("\024",TRUE, SVt_PV))
2046 if (tmpgv = gv_fetchpv("\030",TRUE, SVt_PV))
2047 sv_setpv(GvSV(tmpgv),origargv[0]);
2048 if (argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV)) {
2050 (void)gv_AVadd(argvgv);
2051 av_clear(GvAVn(argvgv));
2052 for (; argc > 0; argc--,argv++) {
2053 av_push(GvAVn(argvgv),newSVpv(argv[0],0));
2056 if (envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV)) {
2061 #ifndef VMS /* VMS doesn't have environ array */
2062 /* Note that if the supplied env parameter is actually a copy
2063 of the global environ then it may now point to free'd memory
2064 if the environment has been modified since. To avoid this
2065 problem we treat env==NULL as meaning 'use the default'
2069 if (env != environ) {
2070 environ[0] = Nullch;
2071 hv_magic(hv, envgv, 'E');
2073 for (; *env; env++) {
2074 if (!(s = strchr(*env,'=')))
2077 sv = newSVpv(s--,0);
2078 sv_magic(sv, sv, 'e', *env, s - *env);
2079 (void)hv_store(hv, *env, s - *env, sv, 0);
2083 #ifdef DYNAMIC_ENV_FETCH
2084 HvNAME(hv) = savepv(ENV_HV_NAME);
2086 hv_magic(hv, envgv, 'E');
2089 if (tmpgv = gv_fetchpv("$",TRUE, SVt_PV))
2090 sv_setiv(GvSV(tmpgv),(I32)getpid());
2099 s = getenv("PERL5LIB");
2103 incpush(getenv("PERLLIB"));
2107 incpush(APPLLIB_EXP);
2111 incpush(ARCHLIB_EXP);
2114 #define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
2116 incpush(PRIVLIB_EXP);
2119 incpush(SITEARCH_EXP);
2122 incpush(SITELIB_EXP);
2124 #ifdef OLDARCHLIB_EXP /* 5.00[01] compatibility */
2125 incpush(OLDARCHLIB_EXP);
2139 line_t oldline = curcop->cop_line;
2141 Copy(top_env, oldtop, 1, Sigjmp_buf);
2143 while (AvFILL(list) >= 0) {
2144 CV *cv = (CV*)av_shift(list);
2148 switch (Sigsetjmp(top_env,1)) {
2150 SV* atsv = GvSV(errgv);
2152 perl_call_sv((SV*)cv, G_EVAL|G_DISCARD);
2153 (void)SvPV(atsv, len);
2155 Copy(oldtop, top_env, 1, Sigjmp_buf);
2156 curcop = &compiling;
2157 curcop->cop_line = oldline;
2158 if (list == beginav)
2159 sv_catpv(atsv, "BEGIN failed--compilation aborted");
2161 sv_catpv(atsv, "END failed--cleanup aborted");
2162 croak("%s", SvPVX(atsv));
2168 statusvalue = 255; /* XXX I don't think we use 1 anymore. */
2174 /* my_exit() was called */
2175 curstash = defstash;
2179 Copy(oldtop, top_env, 1, Sigjmp_buf);
2180 curcop = &compiling;
2181 curcop->cop_line = oldline;
2183 if (list == beginav)
2184 croak("BEGIN failed--compilation aborted");
2186 croak("END failed--cleanup aborted");
2188 my_exit(statusvalue);
2193 fprintf(stderr, "panic: restartop\n");
2197 Copy(oldtop, top_env, 1, Sigjmp_buf);
2198 curcop = &compiling;
2199 curcop->cop_line = oldline;
2200 Siglongjmp(top_env, 3);
2204 Copy(oldtop, top_env, 1, Sigjmp_buf);