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");
93 #endif /* USE_THREADS */
95 /* Init the real globals? */
97 linestr = NEWSV(65,80);
98 sv_upgrade(linestr,SVt_PVIV);
100 SvREADONLY_on(&sv_undef);
104 SvREADONLY_on(&sv_no);
106 sv_setpv(&sv_yes,Yes);
108 SvREADONLY_on(&sv_yes);
110 nrs = newSVpv("\n", 1);
111 rs = SvREFCNT_inc(nrs);
113 MUTEX_INIT(&malloc_mutex);
114 MUTEX_INIT(&sv_mutex);
115 MUTEX_INIT(&eval_mutex);
116 MUTEX_INIT(&nthreads_mutex);
117 COND_INIT(&nthreads_cond);
121 * There is no way we can refer to them from Perl so close them to save
122 * space. The other alternative would be to provide STDAUX and STDPRN
125 (void)fclose(stdaux);
126 (void)fclose(stdprn);
147 #if defined(SUBVERSION) && SUBVERSION > 0
148 sprintf(patchlevel, "%7.5f", 5.0 + (PATCHLEVEL / 1000.0)
149 + (SUBVERSION / 100000.0));
151 sprintf(patchlevel, "%5.3f", 5.0 + (PATCHLEVEL / 1000.0));
154 #if defined(LOCAL_PATCH_COUNT)
155 Ilocalpatches = local_patches; /* For possible -v */
158 fdpid = newAV(); /* for remembering popen pids by fd */
159 pidstatus = newHV();/* for remembering status of dead pids */
163 New(51,debname,128,char);
164 New(52,debdelim,128,char);
175 struct thread *thr = (struct thread *) arg;
177 * Decrement the global thread count and signal anyone listening.
178 * The only official thread listening is the original thread while
179 * in perl_destruct. It waits until it's the only thread and then
180 * performs END blocks and other process clean-ups.
182 DEBUG_L(fprintf(stderr, "thread_destruct: 0x%lx\n", (unsigned long) thr));
185 MUTEX_LOCK(&nthreads_mutex);
187 COND_BROADCAST(&nthreads_cond);
188 MUTEX_UNLOCK(&nthreads_mutex);
190 #endif /* USE_THREADS */
193 perl_destruct(sv_interp)
194 register PerlInterpreter *sv_interp;
197 int destruct_level; /* 0=none, 1=full, 2=full with checks */
201 if (!(curinterp = sv_interp))
205 /* Wait until all user-created threads go away */
206 MUTEX_LOCK(&nthreads_mutex);
209 DEBUG_L(fprintf(stderr, "perl_destruct: waiting for %d threads\n",
211 COND_WAIT(&nthreads_cond, &nthreads_mutex);
213 /* At this point, we're the last thread */
214 MUTEX_UNLOCK(&nthreads_mutex);
215 DEBUG_L(fprintf(stderr, "perl_destruct: armageddon has arrived\n"));
216 MUTEX_DESTROY(&nthreads_mutex);
217 COND_DESTROY(&nthreads_cond);
218 #endif /* USE_THREADS */
220 destruct_level = perl_destruct_level;
224 if (s = getenv("PERL_DESTRUCT_LEVEL"))
225 destruct_level = atoi(s);
233 /* We must account for everything. First the syntax tree. */
235 curpad = AvARRAY(comppad);
242 * Try to destruct global references. We do this first so that the
243 * destructors and destructees still exist. Some sv's might remain.
244 * Non-referenced objects are on their own.
251 if (destruct_level == 0){
253 DEBUG_P(debprofdump());
255 /* The exit() function will do everything that needs doing. */
259 /* Prepare to destruct main symbol table. */
265 if (destruct_level >= 2) {
266 if (scopestack_ix != 0)
267 warn("Unbalanced scopes: %d more ENTERs than LEAVEs\n", scopestack_ix);
268 if (savestack_ix != 0)
269 warn("Unbalanced saves: %d more saves than restores\n", savestack_ix);
270 if (tmps_floor != -1)
271 warn("Unbalanced tmps: %d more allocs than frees\n", tmps_floor + 1);
272 if (cxstack_ix != -1)
273 warn("Unbalanced context: %d more PUSHes than POPs\n", cxstack_ix + 1);
276 /* Now absolutely destruct everything, somehow or other, loops or no. */
278 while (sv_count != 0 && sv_count != last_sv_count) {
279 last_sv_count = sv_count;
283 warn("Scalars leaked: %d\n", sv_count);
286 DEBUG_P(debprofdump());
288 MUTEX_DESTROY(&sv_mutex);
289 MUTEX_DESTROY(&malloc_mutex);
290 MUTEX_DESTROY(&eval_mutex);
291 #endif /* USE_THREADS */
296 PerlInterpreter *sv_interp;
298 if (!(curinterp = sv_interp))
302 #if !defined(STANDARD_C) && !defined(HAS_GETENV_PROTOTYPE)
303 char *getenv _((char *)); /* Usually in <stdlib.h> */
307 perl_parse(sv_interp, xsinit, argc, argv, env)
308 PerlInterpreter *sv_interp;
309 void (*xsinit)_((void));
317 char *scriptname = NULL;
318 VOL bool dosearch = FALSE;
322 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
325 croak("suidperl is no longer needed since the kernel can now execute\n\
326 setuid perl scripts securely.\n");
330 if (!(curinterp = sv_interp))
335 #ifndef VMS /* VMS doesn't have environ array */
336 origenviron = environ;
342 /* Come here if running an undumped a.out. */
344 origfilename = savepv(argv[0]);
346 cxstack_ix = -1; /* start label stack again */
348 init_postdump_symbols(argc,argv,env);
356 switch (Sigsetjmp(top_env,1)) {
367 return(statusvalue); /* my_exit() was called */
369 fprintf(stderr, "panic: top_env\n");
373 sv_setpvn(linestr,"",0);
374 sv = newSVpv("",0); /* first used for -I flags */
377 for (argc--,argv++; argc > 0; argc--,argv++) {
378 if (argv[0][0] != '-' || !argv[0][1])
382 validarg = " PHOOEY ";
408 if (s = moreswitches(s))
413 if (euid != uid || egid != gid)
414 croak("No -e allowed in setuid scripts");
416 e_tmpname = savepv(TMPPATH);
417 (void)mktemp(e_tmpname);
419 croak("Can't mktemp()");
420 e_fp = fopen(e_tmpname,"w");
422 croak("Cannot open temporary file");
428 (void)putc('\n', e_fp);
436 av_push(GvAVn(incgv),newSVpv(s,0));
439 av_push(GvAVn(incgv),newSVpv(argv[1],0));
440 sv_catpv(sv,argv[1]);
457 preambleav = newAV();
458 av_push(preambleav, newSVpv("use Config qw(myconfig config_vars)",0));
460 Sv = newSVpv("print myconfig(),'@INC: '.\"@INC\\n\"",0);
463 Sv = newSVpv("config_vars(qw(",0);
468 av_push(preambleav, Sv);
469 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
483 croak("Unrecognized switch: -%s",s);
488 scriptname = argv[0];
490 if (Fflush(e_fp) || ferror(e_fp) || fclose(e_fp))
491 croak("Can't write to temp file for -e: %s", Strerror(errno));
494 scriptname = e_tmpname;
496 else if (scriptname == Nullch) {
498 if ( isatty(fileno(stdin)) )
506 open_script(scriptname,dosearch,sv);
508 validate_suid(validarg, scriptname);
513 compcv = (CV*)NEWSV(1104,0);
514 sv_upgrade((SV *)compcv, SVt_PVCV);
517 New(666, CvMUTEXP(compcv), 1, pthread_mutex_t);
518 MUTEX_INIT(CvMUTEXP(compcv));
519 New(666, CvCONDP(compcv), 1, pthread_cond_t);
520 COND_INIT(CvCONDP(compcv));
521 #endif /* USE_THREADS */
525 av_push(comppad, Nullsv);
526 curpad = AvARRAY(comppad);
528 comppad_name = padname;
529 comppad_name_fill = 0;
531 av_store(comppad_name, 0, newSVpv("@_", 2));
532 #endif /* USE_THREADS */
533 min_intro_pending = 0;
536 comppadlist = newAV();
537 AvREAL_off(comppadlist);
538 av_store(comppadlist, 0, (SV*)comppad_name);
539 av_store(comppadlist, 1, (SV*)comppad);
540 CvPADLIST(compcv) = comppadlist;
543 (*xsinit)(); /* in case linked C routines want magical variables */
548 init_predump_symbols();
550 init_postdump_symbols(argc,argv,env);
554 /* now parse the script */
557 if (yyparse() || error_count) {
559 croak("%s had compilation errors.\n", origfilename);
561 croak("Execution of %s aborted due to compilation errors.\n",
565 curcop->cop_line = 0;
569 (void)UNLINK(e_tmpname);
574 /* now that script is parsed, we can modify record separator */
576 rs = SvREFCNT_inc(nrs);
577 sv_setsv(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), rs);
588 #ifdef DEBUGGING_MSTATS
589 if ((s=getenv("PERL_DEBUG_MSTATS")) && atoi(s) >= 2)
590 dump_mstats("after compilation:");
600 PerlInterpreter *sv_interp;
603 if (!(curinterp = sv_interp))
605 switch (Sigsetjmp(top_env,1)) {
607 cxstack_ix = -1; /* start context stack again */
614 #ifdef DEBUGGING_MSTATS
615 if (getenv("PERL_DEBUG_MSTATS"))
616 dump_mstats("after execution: ");
618 return(statusvalue); /* my_exit() was called */
621 fprintf(stderr, "panic: restartop\n");
625 if (stack != mainstack) {
627 SWITCHSTACK(stack, mainstack);
634 DEBUG(fprintf(stderr,"\nEXECUTING...\n\n"));
636 DEBUG_L(fprintf(stderr,"main thread is 0x%lx\n", (unsigned long) thr));
637 #endif /* USE_THREADS */
640 fprintf(stderr,"%s syntax OK\n", origfilename);
643 if (perldb && DBsingle)
644 sv_setiv(DBsingle, 1);
654 else if (main_start) {
668 register CONTEXT *cx;
673 DEBUG_L(fprintf(stderr, "my_exit: thread 0x%lx, status %lu\n",
674 (unsigned long) thr, (unsigned long) status));
675 #endif /* USE_THREADS */
676 statusvalue = FIXSTATUS(status);
677 if (cxstack_ix >= 0) {
683 Siglongjmp(top_env, 2);
687 perl_get_sv(name, create)
691 GV* gv = gv_fetchpv(name, create, SVt_PV);
698 perl_get_av(name, create)
702 GV* gv = gv_fetchpv(name, create, SVt_PVAV);
711 perl_get_hv(name, create)
715 GV* gv = gv_fetchpv(name, create, SVt_PVHV);
724 perl_get_cv(name, create)
728 GV* gv = gv_fetchpv(name, create, SVt_PVCV);
729 if (create && !GvCV(gv))
730 return newSUB(start_subparse(),
731 newSVOP(OP_CONST, 0, newSVpv(name,0)),
739 /* Be sure to refetch the stack pointer after calling these routines. */
742 perl_call_argv(subname, flags, argv)
744 I32 flags; /* See G_* flags in cop.h */
745 register char **argv; /* null terminated arg list */
753 XPUSHs(sv_2mortal(newSVpv(*argv,0)));
758 return perl_call_pv(subname, flags);
762 perl_call_pv(subname, flags)
763 char *subname; /* name of the subroutine */
764 I32 flags; /* See G_* flags in cop.h */
766 return perl_call_sv((SV*)perl_get_cv(subname, TRUE), flags);
770 perl_call_method(methname, flags)
771 char *methname; /* name of the subroutine */
772 I32 flags; /* See G_* flags in cop.h */
779 XPUSHs(sv_2mortal(newSVpv(methname,0)));
782 return perl_call_sv(*stack_sp--, flags);
785 /* May be called with any of a CV, a GV, or an SV containing the name. */
787 perl_call_sv(sv, flags)
789 I32 flags; /* See G_* flags in cop.h */
792 LOGOP myop; /* fake syntax tree node */
794 I32 oldmark = TOPMARK;
799 if (flags & G_DISCARD) {
809 oldscope = scopestack_ix;
811 if (!(flags & G_NOARGS))
812 myop.op_flags = OPf_STACKED;
813 myop.op_next = Nullop;
814 myop.op_flags |= OPf_KNOW;
816 myop.op_flags |= OPf_LIST;
818 if (flags & G_EVAL) {
819 Copy(top_env, oldtop, 1, Sigjmp_buf);
821 cLOGOP->op_other = op;
823 /* we're trying to emulate pp_entertry() here */
825 register CONTEXT *cx;
831 push_return(op->op_next);
832 PUSHBLOCK(cx, CXt_EVAL, stack_sp);
834 eval_root = op; /* Only needed so that goto works right. */
837 if (flags & G_KEEPERR)
840 sv_setpv(GvSV(errgv),"");
845 switch (Sigsetjmp(top_env,1)) {
850 statusvalue = 255; /* XXX I don't think we use 1 anymore. */
856 /* my_exit() was called */
859 Copy(oldtop, top_env, 1, Sigjmp_buf);
861 croak("Callback called exit");
862 my_exit(statusvalue);
870 stack_sp = stack_base + oldmark;
875 *++stack_sp = &sv_undef;
881 if (op == (OP*)&myop)
882 op = pp_entersub(ARGS);
885 retval = stack_sp - (stack_base + oldmark);
886 if ((flags & G_EVAL) && !(flags & G_KEEPERR))
887 sv_setpv(GvSV(errgv),"");
890 if (flags & G_EVAL) {
891 if (scopestack_ix > oldscope) {
895 register CONTEXT *cx;
904 Copy(oldtop, top_env, 1, Sigjmp_buf);
906 if (flags & G_DISCARD) {
907 stack_sp = stack_base + oldmark;
918 perl_eval_sv(sv, flags)
920 I32 flags; /* See G_* flags in cop.h */
923 UNOP myop; /* fake syntax tree node */
925 I32 oldmark = sp - stack_base;
930 if (flags & G_DISCARD) {
940 oldscope = scopestack_ix;
942 if (!(flags & G_NOARGS))
943 myop.op_flags = OPf_STACKED;
944 myop.op_next = Nullop;
945 myop.op_flags |= OPf_KNOW;
947 myop.op_flags |= OPf_LIST;
949 Copy(top_env, oldtop, 1, Sigjmp_buf);
952 switch (Sigsetjmp(top_env,1)) {
957 statusvalue = 255; /* XXX I don't think we use 1 anymore. */
963 /* my_exit() was called */
966 Copy(oldtop, top_env, 1, Sigjmp_buf);
968 croak("Callback called exit");
969 my_exit(statusvalue);
977 stack_sp = stack_base + oldmark;
982 *++stack_sp = &sv_undef;
987 if (op == (OP*)&myop)
988 op = pp_entereval(ARGS);
991 retval = stack_sp - (stack_base + oldmark);
992 if ((flags & G_EVAL) && !(flags & G_KEEPERR))
993 sv_setpv(GvSV(errgv),"");
996 Copy(oldtop, top_env, 1, Sigjmp_buf);
997 if (flags & G_DISCARD) {
998 stack_sp = stack_base + oldmark;
1006 /* Require a module. */
1012 SV* sv = sv_newmortal();
1013 sv_setpv(sv, "require '");
1016 perl_eval_sv(sv, G_DISCARD);
1020 magicname(sym,name,namlen)
1027 if (gv = gv_fetchpv(sym,TRUE, SVt_PV))
1028 sv_magic(GvSV(gv), (SV*)gv, 0, name, namlen);
1032 # define PERLLIB_SEP ';'
1035 # define PERLLIB_SEP '|'
1037 # define PERLLIB_SEP ':'
1050 /* Break at all separators */
1052 /* First, skip any consecutive separators */
1053 while ( *p == PERLLIB_SEP ) {
1054 /* Uncomment the next line for PATH semantics */
1055 /* av_push(GvAVn(incgv), newSVpv(".", 1)); */
1058 if ( (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
1059 av_push(GvAVn(incgv), newSVpv(p, (STRLEN)(s - p)));
1062 av_push(GvAVn(incgv), newSVpv(p, 0));
1069 usage(name) /* XXX move this out into a module ? */
1072 /* This message really ought to be max 23 lines.
1073 * Removed -h because the user already knows that opton. Others? */
1074 printf("\nUsage: %s [switches] [--] [programfile] [arguments]", name);
1075 printf("\n -0[octal] specify record separator (\\0, if no argument)");
1076 printf("\n -a autosplit mode with -n or -p (splits $_ into @F)");
1077 printf("\n -c check syntax only (runs BEGIN and END blocks)");
1078 printf("\n -d[:debugger] run scripts under debugger");
1079 printf("\n -D[number/list] set debugging flags (argument is a bit mask or flags)");
1080 printf("\n -e 'command' one line of script. Several -e's allowed. Omit [programfile].");
1081 printf("\n -F/pattern/ split() pattern for autosplit (-a). The //'s are optional.");
1082 printf("\n -i[extension] edit <> files in place (make backup if extension supplied)");
1083 printf("\n -Idirectory specify @INC/#include directory (may be used more then once)");
1084 printf("\n -l[octal] enable line ending processing, specifies line teminator");
1085 printf("\n -[mM][-]module.. executes `use/no module...' before executing your script.");
1086 printf("\n -n assume 'while (<>) { ... }' loop arround your script");
1087 printf("\n -p assume loop like -n but print line also like sed");
1088 printf("\n -P run script through C preprocessor before compilation");
1090 printf("\n -R enable REXX variable pool");
1092 printf("\n -s enable some switch parsing for switches after script name");
1093 printf("\n -S look for the script using PATH environment variable");
1094 printf("\n -T turn on tainting checks");
1095 printf("\n -u dump core after parsing script");
1096 printf("\n -U allow unsafe operations");
1097 printf("\n -v print version number and patchlevel of perl");
1098 printf("\n -V[:variable] print perl configuration information");
1099 printf("\n -w TURN WARNINGS ON FOR COMPILATION OF YOUR SCRIPT.");
1100 printf("\n -x[directory] strip off text before #!perl line and perhaps cd to directory\n");
1103 /* This routine handles any switches that can be given during run */
1114 rschar = scan_oct(s, 4, &numlen);
1116 if (rschar & ~((U8)~0))
1118 else if (!rschar && numlen >= 2)
1119 nrs = newSVpv("", 0);
1122 nrs = newSVpv(&ch, 1);
1127 splitstr = savepv(s + 1);
1141 if (*s == ':' || *s == '=') {
1142 sprintf(buf, "use Devel::%s;", ++s);
1144 my_setenv("PERL5DB",buf);
1154 if (isALPHA(s[1])) {
1155 static char debopts[] = "psltocPmfrxuLHXD";
1158 for (s++; *s && (d = strchr(debopts,*s)); s++)
1159 debug |= 1 << (d - debopts);
1163 for (s++; isDIGIT(*s); s++) ;
1165 debug |= 0x80000000;
1167 warn("Recompile perl with -DDEBUGGING to use -D switch\n");
1168 for (s++; isALNUM(*s); s++) ;
1178 inplace = savepv(s+1);
1180 for (s = inplace; *s && !isSPACE(*s); s++) ;
1187 for (e = s; *e && !isSPACE(*e); e++) ;
1188 av_push(GvAVn(incgv),newSVpv(s,e-s));
1193 croak("No space allowed after -I");
1203 *ors = scan_oct(s, 3 + (*s == '0'), &numlen);
1208 ors = savepvn("\n\n", 2);
1212 ors = SvPV(nrs, orslen);
1216 taint_not("-M"); /* XXX ? */
1219 taint_not("-m"); /* XXX ? */
1224 /* -M-foo == 'no foo' */
1225 if (*s == '-') { use = "no "; ++s; }
1226 sv = newSVpv(use,0);
1228 /* We allow -M'Module qw(Foo Bar)' */
1229 while(isALNUM(*s) || *s==':') ++s;
1231 sv_catpv(sv, start);
1232 if (*(start-1) == 'm') {
1234 croak("Can't use '%c' after -mname", *s);
1235 sv_catpv( sv, " ()");
1238 sv_catpvn(sv, start, s-start);
1239 sv_catpv(sv, " split(/,/,q{");
1244 if (preambleav == NULL)
1245 preambleav = newAV();
1246 av_push(preambleav, sv);
1249 croak("No space allowed after -%c", *(s-1));
1277 #if defined(SUBVERSION) && SUBVERSION > 0
1278 printf("\nThis is perl, version 5.%03d_%02d", PATCHLEVEL, SUBVERSION);
1280 printf("\nThis is perl, version %s",patchlevel);
1283 #if defined(DEBUGGING) || defined(EMBED) || defined(MULTIPLICITY)
1284 fputs(" with", stdout);
1286 fputs(" DEBUGGING", stdout);
1289 fputs(" EMBED", stdout);
1292 fputs(" MULTIPLICITY", stdout);
1296 #if defined(LOCAL_PATCH_COUNT)
1297 if (LOCAL_PATCH_COUNT > 0)
1299 fputs("\n\tLocally applied patches:\n", stdout);
1300 for (i = 1; i <= LOCAL_PATCH_COUNT; i++) {
1301 if (Ilocalpatches[i])
1302 fprintf(stdout, "\t %s\n", Ilocalpatches[i]);
1306 printf("\n\tbuilt under %s",OSNAME);
1309 printf(" at %s %s",__DATE__,__TIME__);
1311 printf(" on %s",__DATE__);
1314 fputs("\n\t+ suidperl security patch", stdout);
1315 fputs("\n\nCopyright 1987-1996, Larry Wall\n",stdout);
1317 fputs("MS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n",
1321 fputs("OS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
1322 "Version 5 port Copyright (c) 1994-1995, Andreas Kaiser\n", stdout);
1325 fputs("atariST series port, ++jrb bammi@cadence.com\n", stdout);
1328 Perl may be copied only under the terms of either the Artistic License or the\n\
1329 GNU General Public License, which may be found in the Perl 5.0 source kit.\n\n",stdout);
1340 if (s[1] == '-') /* Additional switches on #! line. */
1353 croak("Can't emulate -%.1s on #! line",s);
1358 /* compliments of Tom Christiansen */
1360 /* unexec() can be found in the Gnu emacs distribution */
1369 sprintf (buf, "%s.perldump", origfilename);
1370 sprintf (tokenbuf, "%s/perl", BIN);
1372 status = unexec(buf, tokenbuf, &etext, sbrk(0), 0);
1374 fprintf(stderr, "unexec of %s into %s failed!\n", tokenbuf, buf);
1378 # include <lib$routines.h>
1379 lib$signal(SS$_DEBUG); /* ssdef.h #included from vmsish.h */
1381 ABORT(); /* for use with undump */
1391 curstash = defstash = newHV();
1392 curstname = newSVpv("main",4);
1393 gv = gv_fetchpv("main::",TRUE, SVt_PVHV);
1394 SvREFCNT_dec(GvHV(gv));
1395 GvHV(gv) = (HV*)SvREFCNT_inc(defstash);
1397 HvNAME(defstash) = savepv("main");
1398 incgv = gv_HVadd(gv_AVadd(gv_fetchpv("INC",TRUE, SVt_PVAV)));
1400 defgv = gv_fetchpv("_",TRUE, SVt_PVAV);
1401 errgv = gv_HVadd(gv_fetchpv("@", TRUE, SVt_PV));
1403 curstash = defstash;
1404 compiling.cop_stash = defstash;
1405 debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
1406 /* We must init $/ before switches are processed. */
1407 sv_setpvn(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), "\n", 1);
1410 #ifdef CAN_PROTOTYPE
1412 open_script(char *scriptname, bool dosearch, SV *sv)
1415 open_script(scriptname,dosearch,sv)
1421 char *xfound = Nullch;
1422 char *xfailed = Nullch;
1426 #if defined(DOSISH) && !defined(OS2) && !defined(atarist)
1427 #define SEARCH_EXTS ".bat", ".cmd", NULL
1430 # define SEARCH_EXTS ".pl", ".com", NULL
1432 /* additional extensions to try in each dir if scriptname not found */
1434 char *ext[] = { SEARCH_EXTS };
1435 int extidx = (strchr(scriptname,'.')) ? -1 : 0; /* has ext already */
1439 if (dosearch && !strpbrk(scriptname,":[</") && (my_getenv("DCL$PATH"))) {
1442 while (my_trnlnm("DCL$PATH",tokenbuf,idx++)) {
1443 strcat(tokenbuf,scriptname);
1445 if (dosearch && !strchr(scriptname, '/') && (s = getenv("PATH"))) {
1447 bufend = s + strlen(s);
1450 s = cpytill(tokenbuf,s,bufend,':',&len);
1453 for (len = 0; *s && *s != ',' && *s != ';'; tokenbuf[len++] = *s++);
1454 tokenbuf[len] = '\0';
1456 for (len = 0; *s && *s != ';'; tokenbuf[len++] = *s++);
1457 tokenbuf[len] = '\0';
1463 if (len && tokenbuf[len-1] != '/')
1466 if (len && ((tokenbuf[len-1] != '\\') && (tokenbuf[len-1] != '/')))
1468 if (len && tokenbuf[len-1] != '\\')
1471 (void)strcat(tokenbuf+len,"/");
1472 (void)strcat(tokenbuf+len,scriptname);
1476 len = strlen(tokenbuf);
1477 if (extidx > 0) /* reset after previous loop */
1481 DEBUG_p(fprintf(stderr,"Looking for %s\n",tokenbuf));
1482 retval = Stat(tokenbuf,&statbuf);
1484 } while ( retval < 0 /* not there */
1485 && extidx>=0 && ext[extidx] /* try an extension? */
1486 && strcpy(tokenbuf+len, ext[extidx++])
1491 if (S_ISREG(statbuf.st_mode)
1492 && cando(S_IRUSR,TRUE,&statbuf) && cando(S_IXUSR,TRUE,&statbuf)) {
1493 xfound = tokenbuf; /* bingo! */
1497 xfailed = savepv(tokenbuf);
1500 croak("Can't execute %s", xfailed ? xfailed : scriptname );
1503 scriptname = xfound;
1506 if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
1507 char *s = scriptname + 8;
1516 origfilename = savepv(e_tmpname ? "-e" : scriptname);
1517 curcop->cop_filegv = gv_fetchfile(origfilename);
1518 if (strEQ(origfilename,"-"))
1520 if (fdscript >= 0) {
1521 rsfp = fdopen(fdscript,"r");
1522 #if defined(HAS_FCNTL) && defined(F_SETFD)
1523 fcntl(fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
1526 else if (preprocess) {
1527 char *cpp = CPPSTDIN;
1529 if (strEQ(cpp,"cppstdin"))
1530 sprintf(tokenbuf, "%s/%s", SCRIPTDIR, cpp);
1532 sprintf(tokenbuf, "%s", cpp);
1534 sv_catpv(sv,PRIVLIB_EXP);
1536 (void)sprintf(buf, "\
1537 sed %s -e \"/^[^#]/b\" \
1538 -e \"/^#[ ]*include[ ]/b\" \
1539 -e \"/^#[ ]*define[ ]/b\" \
1540 -e \"/^#[ ]*if[ ]/b\" \
1541 -e \"/^#[ ]*ifdef[ ]/b\" \
1542 -e \"/^#[ ]*ifndef[ ]/b\" \
1543 -e \"/^#[ ]*else/b\" \
1544 -e \"/^#[ ]*elif[ ]/b\" \
1545 -e \"/^#[ ]*undef[ ]/b\" \
1546 -e \"/^#[ ]*endif/b\" \
1549 (doextract ? "-e \"1,/^#/d\n\"" : ""),
1551 (void)sprintf(buf, "\
1552 %s %s -e '/^[^#]/b' \
1553 -e '/^#[ ]*include[ ]/b' \
1554 -e '/^#[ ]*define[ ]/b' \
1555 -e '/^#[ ]*if[ ]/b' \
1556 -e '/^#[ ]*ifdef[ ]/b' \
1557 -e '/^#[ ]*ifndef[ ]/b' \
1558 -e '/^#[ ]*else/b' \
1559 -e '/^#[ ]*elif[ ]/b' \
1560 -e '/^#[ ]*undef[ ]/b' \
1561 -e '/^#[ ]*endif/b' \
1569 (doextract ? "-e '1,/^#/d\n'" : ""),
1571 scriptname, tokenbuf, SvPV(sv, na), CPPMINUS);
1573 #ifdef IAMSUID /* actually, this is caught earlier */
1574 if (euid != uid && !euid) { /* if running suidperl */
1576 (void)seteuid(uid); /* musn't stay setuid root */
1579 (void)setreuid((Uid_t)-1, uid);
1581 #ifdef HAS_SETRESUID
1582 (void)setresuid((Uid_t)-1, uid, (Uid_t)-1);
1588 if (geteuid() != uid)
1589 croak("Can't do seteuid!\n");
1591 #endif /* IAMSUID */
1592 rsfp = my_popen(buf,"r");
1594 else if (!*scriptname) {
1595 taint_not("program input from stdin");
1599 rsfp = fopen(scriptname,"r");
1600 #if defined(HAS_FCNTL) && defined(F_SETFD)
1601 fcntl(fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
1604 if ((FILE*)rsfp == Nullfp) {
1606 #ifndef IAMSUID /* in case script is not readable before setuid */
1607 if (euid && Stat(SvPVX(GvSV(curcop->cop_filegv)),&statbuf) >= 0 &&
1608 statbuf.st_mode & (S_ISUID|S_ISGID)) {
1609 (void)sprintf(buf, "%s/sperl%s", BIN, patchlevel);
1610 execv(buf, origargv); /* try again */
1611 croak("Can't do setuid\n");
1615 croak("Can't open perl script \"%s\": %s\n",
1616 SvPVX(GvSV(curcop->cop_filegv)), Strerror(errno));
1621 validate_suid(validarg, scriptname)
1627 /* do we need to emulate setuid on scripts? */
1629 /* This code is for those BSD systems that have setuid #! scripts disabled
1630 * in the kernel because of a security problem. Merely defining DOSUID
1631 * in perl will not fix that problem, but if you have disabled setuid
1632 * scripts in the kernel, this will attempt to emulate setuid and setgid
1633 * on scripts that have those now-otherwise-useless bits set. The setuid
1634 * root version must be called suidperl or sperlN.NNN. If regular perl
1635 * discovers that it has opened a setuid script, it calls suidperl with
1636 * the same argv that it had. If suidperl finds that the script it has
1637 * just opened is NOT setuid root, it sets the effective uid back to the
1638 * uid. We don't just make perl setuid root because that loses the
1639 * effective uid we had before invoking perl, if it was different from the
1642 * DOSUID must be defined in both perl and suidperl, and IAMSUID must
1643 * be defined in suidperl only. suidperl must be setuid root. The
1644 * Configure script will set this up for you if you want it.
1650 if (Fstat(fileno(rsfp),&statbuf) < 0) /* normal stat is insecure */
1651 croak("Can't stat script \"%s\"",origfilename);
1652 if (fdscript < 0 && statbuf.st_mode & (S_ISUID|S_ISGID)) {
1656 #ifndef HAS_SETREUID
1657 /* On this access check to make sure the directories are readable,
1658 * there is actually a small window that the user could use to make
1659 * filename point to an accessible directory. So there is a faint
1660 * chance that someone could execute a setuid script down in a
1661 * non-accessible directory. I don't know what to do about that.
1662 * But I don't think it's too important. The manual lies when
1663 * it says access() is useful in setuid programs.
1665 if (access(SvPVX(GvSV(curcop->cop_filegv)),1)) /*double check*/
1666 croak("Permission denied");
1668 /* If we can swap euid and uid, then we can determine access rights
1669 * with a simple stat of the file, and then compare device and
1670 * inode to make sure we did stat() on the same file we opened.
1671 * Then we just have to make sure he or she can execute it.
1674 struct stat tmpstatbuf;
1678 setreuid(euid,uid) < 0
1681 setresuid(euid,uid,(Uid_t)-1) < 0
1684 || getuid() != euid || geteuid() != uid)
1685 croak("Can't swap uid and euid"); /* really paranoid */
1686 if (Stat(SvPVX(GvSV(curcop->cop_filegv)),&tmpstatbuf) < 0)
1687 croak("Permission denied"); /* testing full pathname here */
1688 if (tmpstatbuf.st_dev != statbuf.st_dev ||
1689 tmpstatbuf.st_ino != statbuf.st_ino) {
1691 if (rsfp = my_popen("/bin/mail root","w")) { /* heh, heh */
1693 "User %d tried to run dev %d ino %d in place of dev %d ino %d!\n\
1694 (Filename of set-id script was %s, uid %d gid %d.)\n\nSincerely,\nperl\n",
1695 uid,tmpstatbuf.st_dev, tmpstatbuf.st_ino,
1696 statbuf.st_dev, statbuf.st_ino,
1697 SvPVX(GvSV(curcop->cop_filegv)),
1698 statbuf.st_uid, statbuf.st_gid);
1699 (void)my_pclose(rsfp);
1701 croak("Permission denied\n");
1705 setreuid(uid,euid) < 0
1707 # if defined(HAS_SETRESUID)
1708 setresuid(uid,euid,(Uid_t)-1) < 0
1711 || getuid() != uid || geteuid() != euid)
1712 croak("Can't reswap uid and euid");
1713 if (!cando(S_IXUSR,FALSE,&statbuf)) /* can real uid exec? */
1714 croak("Permission denied\n");
1716 #endif /* HAS_SETREUID */
1717 #endif /* IAMSUID */
1719 if (!S_ISREG(statbuf.st_mode))
1720 croak("Permission denied");
1721 if (statbuf.st_mode & S_IWOTH)
1722 croak("Setuid/gid script is writable by world");
1723 doswitches = FALSE; /* -s is insecure in suid */
1725 if (fgets(tokenbuf,sizeof tokenbuf, rsfp) == Nullch ||
1726 strnNE(tokenbuf,"#!",2) ) /* required even on Sys V */
1727 croak("No #! line");
1730 while (!isSPACE(*s)) s++;
1731 if (strnNE(s-4,"perl",4) && strnNE(s-9,"perl",4)) /* sanity check */
1732 croak("Not a perl script");
1733 while (*s == ' ' || *s == '\t') s++;
1735 * #! arg must be what we saw above. They can invoke it by
1736 * mentioning suidperl explicitly, but they may not add any strange
1737 * arguments beyond what #! says if they do invoke suidperl that way.
1739 len = strlen(validarg);
1740 if (strEQ(validarg," PHOOEY ") ||
1741 strnNE(s,validarg,len) || !isSPACE(s[len]))
1742 croak("Args must match #! line");
1745 if (euid != uid && (statbuf.st_mode & S_ISUID) &&
1746 euid == statbuf.st_uid)
1748 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
1749 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
1750 #endif /* IAMSUID */
1752 if (euid) { /* oops, we're not the setuid root perl */
1755 (void)sprintf(buf, "%s/sperl%s", BIN, patchlevel);
1756 execv(buf, origargv); /* try again */
1758 croak("Can't do setuid\n");
1761 if (statbuf.st_mode & S_ISGID && statbuf.st_gid != egid) {
1763 (void)setegid(statbuf.st_gid);
1766 (void)setregid((Gid_t)-1,statbuf.st_gid);
1768 #ifdef HAS_SETRESGID
1769 (void)setresgid((Gid_t)-1,statbuf.st_gid,(Gid_t)-1);
1771 setgid(statbuf.st_gid);
1775 if (getegid() != statbuf.st_gid)
1776 croak("Can't do setegid!\n");
1778 if (statbuf.st_mode & S_ISUID) {
1779 if (statbuf.st_uid != euid)
1781 (void)seteuid(statbuf.st_uid); /* all that for this */
1784 (void)setreuid((Uid_t)-1,statbuf.st_uid);
1786 #ifdef HAS_SETRESUID
1787 (void)setresuid((Uid_t)-1,statbuf.st_uid,(Uid_t)-1);
1789 setuid(statbuf.st_uid);
1793 if (geteuid() != statbuf.st_uid)
1794 croak("Can't do seteuid!\n");
1796 else if (uid) { /* oops, mustn't run as root */
1798 (void)seteuid((Uid_t)uid);
1801 (void)setreuid((Uid_t)-1,(Uid_t)uid);
1803 #ifdef HAS_SETRESUID
1804 (void)setresuid((Uid_t)-1,(Uid_t)uid,(Uid_t)-1);
1810 if (geteuid() != uid)
1811 croak("Can't do seteuid!\n");
1814 if (!cando(S_IXUSR,TRUE,&statbuf))
1815 croak("Permission denied\n"); /* they can't do this */
1818 else if (preprocess)
1819 croak("-P not allowed for setuid/setgid script\n");
1820 else if (fdscript >= 0)
1821 croak("fd script not allowed in suidperl\n");
1823 croak("Script is not setuid/setgid in suidperl\n");
1825 /* We absolutely must clear out any saved ids here, so we */
1826 /* exec the real perl, substituting fd script for scriptname. */
1827 /* (We pass script name as "subdir" of fd, which perl will grok.) */
1829 for (which = 1; origargv[which] && origargv[which] != scriptname; which++) ;
1830 if (!origargv[which])
1831 croak("Permission denied");
1832 (void)sprintf(buf, "/dev/fd/%d/%.127s", fileno(rsfp), origargv[which]);
1833 origargv[which] = buf;
1835 #if defined(HAS_FCNTL) && defined(F_SETFD)
1836 fcntl(fileno(rsfp),F_SETFD,0); /* ensure no close-on-exec */
1839 (void)sprintf(tokenbuf, "%s/perl%s", BIN, patchlevel);
1840 execv(tokenbuf, origargv); /* try again */
1841 croak("Can't do setuid\n");
1842 #endif /* IAMSUID */
1844 if (euid != uid || egid != gid) { /* (suidperl doesn't exist, in fact) */
1845 #ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
1846 Fstat(fileno(rsfp),&statbuf); /* may be either wrapped or real suid */
1847 if ((euid != uid && euid == statbuf.st_uid && statbuf.st_mode & S_ISUID)
1849 (egid != gid && egid == statbuf.st_gid && statbuf.st_mode & S_ISGID)
1852 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
1853 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
1854 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
1855 /* not set-id, must be wrapped */
1865 /* skip forward in input to the real script? */
1869 if ((s = sv_gets(linestr, rsfp, 0)) == Nullch)
1870 croak("No Perl script found in input\n");
1871 if (*s == '#' && s[1] == '!' && instr(s,"perl")) {
1872 ungetc('\n',rsfp); /* to keep line count right */
1874 if (s = instr(s,"perl -")) {
1877 while (s = moreswitches(s)) ;
1879 if (cddir && chdir(cddir) < 0)
1880 croak("Can't chdir to %s",cddir);
1888 uid = (int)getuid();
1889 euid = (int)geteuid();
1890 gid = (int)getgid();
1891 egid = (int)getegid();
1896 tainting |= (uid && (euid != uid || egid != gid));
1903 curstash = debstash;
1904 dbargs = GvAV(gv_AVadd((gv_fetchpv("args", GV_ADDMULTI, SVt_PVAV))));
1906 DBgv = gv_fetchpv("DB", GV_ADDMULTI, SVt_PVGV);
1907 DBline = gv_fetchpv("dbline", GV_ADDMULTI, SVt_PVAV);
1908 DBsub = gv_HVadd(gv_fetchpv("sub", GV_ADDMULTI, SVt_PVHV));
1909 DBsingle = GvSV((gv_fetchpv("single", GV_ADDMULTI, SVt_PV)));
1910 sv_setiv(DBsingle, 0);
1911 DBtrace = GvSV((gv_fetchpv("trace", GV_ADDMULTI, SVt_PV)));
1912 sv_setiv(DBtrace, 0);
1913 DBsignal = GvSV((gv_fetchpv("signal", GV_ADDMULTI, SVt_PV)));
1914 sv_setiv(DBsignal, 0);
1915 curstash = defstash;
1923 mainstack = stack; /* remember in case we switch stacks */
1924 AvREAL_off(stack); /* not a real array */
1925 av_extend(stack,127);
1927 stack_base = AvARRAY(stack);
1928 stack_sp = stack_base;
1929 stack_max = stack_base + 127;
1931 New(54,markstack,64,I32);
1932 markstack_ptr = markstack;
1933 markstack_max = markstack + 64;
1935 New(54,scopestack,32,I32);
1937 scopestack_max = 32;
1939 New(54,savestack,128,ANY);
1941 savestack_max = 128;
1943 New(54,retstack,16,OP*);
1947 cxstack_max = 8192 / sizeof(CONTEXT) - 2; /* Use most of 8K. */
1948 New(50,cxstack,cxstack_max + 1,CONTEXT);
1951 New(50,tmps_stack,128,SV*);
1956 static FILE *tmpfp; /* moved outside init_lexer() because of UNICOS bug */
1964 subname = newSVpv("main",4);
1968 init_predump_symbols()
1974 sv_setpvn(GvSV(gv_fetchpv("\"", TRUE, SVt_PV)), " ", 1);
1976 stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
1977 GvMULTI_on(stdingv);
1978 IoIFP(GvIOp(stdingv)) = stdin;
1979 tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
1981 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(stdingv));
1983 tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
1985 IoOFP(GvIOp(tmpgv)) = IoIFP(GvIOp(tmpgv)) = stdout;
1987 tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
1989 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(defoutgv));
1991 othergv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
1992 GvMULTI_on(othergv);
1993 IoOFP(GvIOp(othergv)) = IoIFP(GvIOp(othergv)) = stderr;
1994 tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
1996 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(othergv));
1998 statname = NEWSV(66,0); /* last filename we did stat on */
2000 osname = savepv(OSNAME);
2004 init_postdump_symbols(argc,argv,env)
2006 register char **argv;
2007 register char **env;
2013 argc--,argv++; /* skip name of script */
2015 for (; argc > 0 && **argv == '-'; argc--,argv++) {
2018 if (argv[0][1] == '-') {
2022 if (s = strchr(argv[0], '=')) {
2024 sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),s);
2027 sv_setiv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),1);
2030 toptarget = NEWSV(0,0);
2031 sv_upgrade(toptarget, SVt_PVFM);
2032 sv_setpvn(toptarget, "", 0);
2033 bodytarget = NEWSV(0,0);
2034 sv_upgrade(bodytarget, SVt_PVFM);
2035 sv_setpvn(bodytarget, "", 0);
2036 formtarget = bodytarget;
2039 if (tmpgv = gv_fetchpv("0",TRUE, SVt_PV)) {
2040 sv_setpv(GvSV(tmpgv),origfilename);
2041 magicname("0", "0", 1);
2043 if (tmpgv = gv_fetchpv("\024",TRUE, SVt_PV))
2045 if (tmpgv = gv_fetchpv("\030",TRUE, SVt_PV))
2046 sv_setpv(GvSV(tmpgv),origargv[0]);
2047 if (argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV)) {
2049 (void)gv_AVadd(argvgv);
2050 av_clear(GvAVn(argvgv));
2051 for (; argc > 0; argc--,argv++) {
2052 av_push(GvAVn(argvgv),newSVpv(argv[0],0));
2055 if (envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV)) {
2060 #ifndef VMS /* VMS doesn't have environ array */
2061 /* Note that if the supplied env parameter is actually a copy
2062 of the global environ then it may now point to free'd memory
2063 if the environment has been modified since. To avoid this
2064 problem we treat env==NULL as meaning 'use the default'
2068 if (env != environ) {
2069 environ[0] = Nullch;
2070 hv_magic(hv, envgv, 'E');
2072 for (; *env; env++) {
2073 if (!(s = strchr(*env,'=')))
2076 sv = newSVpv(s--,0);
2077 sv_magic(sv, sv, 'e', *env, s - *env);
2078 (void)hv_store(hv, *env, s - *env, sv, 0);
2082 #ifdef DYNAMIC_ENV_FETCH
2083 HvNAME(hv) = savepv(ENV_HV_NAME);
2085 hv_magic(hv, envgv, 'E');
2088 if (tmpgv = gv_fetchpv("$",TRUE, SVt_PV))
2089 sv_setiv(GvSV(tmpgv),(I32)getpid());
2098 s = getenv("PERL5LIB");
2102 incpush(getenv("PERLLIB"));
2106 incpush(APPLLIB_EXP);
2110 incpush(ARCHLIB_EXP);
2113 #define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
2115 incpush(PRIVLIB_EXP);
2118 incpush(SITEARCH_EXP);
2121 incpush(SITELIB_EXP);
2123 #ifdef OLDARCHLIB_EXP /* 5.00[01] compatibility */
2124 incpush(OLDARCHLIB_EXP);
2138 line_t oldline = curcop->cop_line;
2140 Copy(top_env, oldtop, 1, Sigjmp_buf);
2142 while (AvFILL(list) >= 0) {
2143 CV *cv = (CV*)av_shift(list);
2147 switch (Sigsetjmp(top_env,1)) {
2149 SV* atsv = GvSV(errgv);
2151 perl_call_sv((SV*)cv, G_EVAL|G_DISCARD);
2152 (void)SvPV(atsv, len);
2154 Copy(oldtop, top_env, 1, Sigjmp_buf);
2155 curcop = &compiling;
2156 curcop->cop_line = oldline;
2157 if (list == beginav)
2158 sv_catpv(atsv, "BEGIN failed--compilation aborted");
2160 sv_catpv(atsv, "END failed--cleanup aborted");
2161 croak("%s", SvPVX(atsv));
2167 statusvalue = 255; /* XXX I don't think we use 1 anymore. */
2173 /* my_exit() was called */
2174 curstash = defstash;
2178 Copy(oldtop, top_env, 1, Sigjmp_buf);
2179 curcop = &compiling;
2180 curcop->cop_line = oldline;
2182 if (list == beginav)
2183 croak("BEGIN failed--compilation aborted");
2185 croak("END failed--cleanup aborted");
2187 my_exit(statusvalue);
2192 fprintf(stderr, "panic: restartop\n");
2196 Copy(oldtop, top_env, 1, Sigjmp_buf);
2197 curcop = &compiling;
2198 curcop->cop_line = oldline;
2199 Siglongjmp(top_env, 3);
2203 Copy(oldtop, top_env, 1, Sigjmp_buf);