This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[win32] merge change#897 from maintbranch
[perl5.git] / perl.c
CommitLineData
a0d0e21e
LW
1/* perl.c
2 *
a411490c 3 * Copyright (c) 1987-1998 Larry Wall
a687059c 4 *
352d5a3a
LW
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.
a687059c 7 *
8d063cd8
LW
8 */
9
a0d0e21e
LW
10/*
11 * "A ship then new they built for him/of mithril and of elven glass" --Bilbo
12 */
45d8adaa 13
378cc40b
LW
14#include "EXTERN.h"
15#include "perl.h"
a687059c 16#include "patchlevel.h"
378cc40b 17
df5cef82 18/* XXX If this causes problems, set i_unistd=undef in the hint file. */
a0d0e21e
LW
19#ifdef I_UNISTD
20#include <unistd.h>
21#endif
a0d0e21e 22
54310121 23#if !defined(STANDARD_C) && !defined(HAS_GETENV_PROTOTYPE)
24char *getenv _((char *)); /* Usually in <stdlib.h> */
25#endif
26
51fa4eea
JH
27#ifdef I_FCNTL
28#include <fcntl.h>
29#endif
30#ifdef I_SYS_FILE
31#include <sys/file.h>
32#endif
33
71be2cbc 34dEXTCONST char rcsid[] = "perl.c\nPatch level: ###\n";
463ee0b2 35
a687059c
LW
36#ifdef IAMSUID
37#ifndef DOSUID
38#define DOSUID
39#endif
40#endif
378cc40b 41
a687059c
LW
42#ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
43#ifdef DOSUID
44#undef DOSUID
45#endif
46#endif
8d063cd8 47
8ebc5c01 48#define I_REINIT \
49 STMT_START { \
50 chopset = " \n-"; \
51 copline = NOLINE; \
52 curcop = &compiling; \
53 curcopdb = NULL; \
54 cxstack_ix = -1; \
55 cxstack_max = 128; \
56 dbargs = 0; \
57 dlmax = 128; \
58 laststatval = -1; \
59 laststype = OP_STAT; \
60 maxscream = -1; \
61 maxsysfd = MAXSYSFD; \
62 statname = Nullsv; \
63 tmps_floor = -1; \
64 tmps_ix = -1; \
65 op_mask = NULL; \
66 dlmax = 128; \
67 laststatval = -1; \
68 laststype = OP_STAT; \
46fc3d4c 69 mess_sv = Nullsv; \
8ebc5c01 70 } STMT_END
71
a0d0e21e 72static void find_beginning _((void));
bbce6d69 73static void forbid_setid _((char *));
774d564b 74static void incpush _((char *, int));
748a9306 75static void init_ids _((void));
a0d0e21e
LW
76static void init_debugger _((void));
77static void init_lexer _((void));
78static void init_main_stash _((void));
199100c8 79#ifdef USE_THREADS
52e1cb5e 80static struct perl_thread * init_main_thread _((void));
199100c8 81#endif /* USE_THREADS */
a0d0e21e
LW
82static void init_perllib _((void));
83static void init_postdump_symbols _((int, char **, char **));
84static void init_predump_symbols _((void));
f86702cc 85static void my_exit_jump _((void)) __attribute__((noreturn));
6e72f9df 86static void nuke_stacks _((void));
a0d0e21e 87static void open_script _((char *, bool, SV *));
ab821d7f 88static void usage _((char *));
96436eeb 89static void validate_suid _((char *, char*));
90
91static int fdscript = -1;
79072805 92
93a17b20 93PerlInterpreter *
8ac85365 94perl_alloc(void)
79072805 95{
93a17b20 96 PerlInterpreter *sv_interp;
79072805 97
8990e307 98 curinterp = 0;
93a17b20 99 New(53, sv_interp, 1, PerlInterpreter);
79072805
LW
100 return sv_interp;
101}
102
103void
8ac85365 104perl_construct(register PerlInterpreter *sv_interp)
79072805 105{
a863c7d1
MB
106#ifdef USE_THREADS
107 int i;
108#ifndef FAKE_THREADS
52e1cb5e 109 struct perl_thread *thr;
a863c7d1
MB
110#endif /* FAKE_THREADS */
111#endif /* USE_THREADS */
11343788 112
79072805
LW
113 if (!(curinterp = sv_interp))
114 return;
115
8990e307 116#ifdef MULTIPLICITY
93a17b20 117 Zero(sv_interp, 1, PerlInterpreter);
8990e307 118#endif
79072805 119
33f46ff6 120 /* Init the real globals (and main thread)? */
c116a00c 121 if (!linestr) {
11343788 122#ifdef USE_THREADS
8023c3ce 123
33f46ff6 124 INIT_THREADS;
d55594ae
GS
125#ifdef ALLOC_THREAD_KEY
126 ALLOC_THREAD_KEY;
127#else
a863c7d1
MB
128 if (pthread_key_create(&thr_key, 0))
129 croak("panic: pthread_key_create");
d55594ae 130#endif
c116a00c 131 MUTEX_INIT(&sv_mutex);
a863c7d1
MB
132 /*
133 * Safe to use basic SV functions from now on (though
134 * not things like mortals or tainting yet).
135 */
c116a00c
MB
136 MUTEX_INIT(&eval_mutex);
137 COND_INIT(&eval_cond);
33f46ff6 138 MUTEX_INIT(&threads_mutex);
c116a00c 139 COND_INIT(&nthreads_cond);
dce16143
MB
140#ifdef EMULATE_ATOMIC_REFCOUNTS
141 MUTEX_INIT(&svref_mutex);
142#endif /* EMULATE_ATOMIC_REFCOUNTS */
a863c7d1 143
199100c8 144 thr = init_main_thread();
11343788
MB
145#endif /* USE_THREADS */
146
79072805 147 linestr = NEWSV(65,80);
ed6116ce 148 sv_upgrade(linestr,SVt_PVIV);
79072805 149
6e72f9df 150 if (!SvREADONLY(&sv_undef)) {
151 SvREADONLY_on(&sv_undef);
79072805 152
6e72f9df 153 sv_setpv(&sv_no,No);
154 SvNV(&sv_no);
155 SvREADONLY_on(&sv_no);
79072805 156
6e72f9df 157 sv_setpv(&sv_yes,Yes);
158 SvNV(&sv_yes);
159 SvREADONLY_on(&sv_yes);
160 }
79072805 161
c07a80fd 162 nrs = newSVpv("\n", 1);
163 rs = SvREFCNT_inc(nrs);
164
c23142e2 165 sighandlerp = sighandler;
44a8e56a 166 pidstatus = newHV();
167
79072805
LW
168#ifdef MSDOS
169 /*
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
172 * filehandles.
173 */
174 (void)fclose(stdaux);
175 (void)fclose(stdprn);
176#endif
177 }
178
1a441de9 179 init_stacks(ARGS);
8990e307 180#ifdef MULTIPLICITY
8ebc5c01 181 I_REINIT;
182 perl_destruct_level = 1;
183#else
184 if(perl_destruct_level > 0)
185 I_REINIT;
79072805
LW
186#endif
187
748a9306 188 init_ids();
fb73857a 189 lex_state = LEX_NOTPARSING;
a5f75d66 190
54310121 191 start_env.je_prev = NULL;
192 start_env.je_ret = -1;
193 start_env.je_mustcatch = TRUE;
194 top_env = &start_env;
f86702cc 195 STATUS_ALL_SUCCESS;
196
36477c24 197 SET_NUMERIC_STANDARD();
a5f75d66 198#if defined(SUBVERSION) && SUBVERSION > 0
e2666263 199 sprintf(patchlevel, "%7.5f", (double) 5
200 + ((double) PATCHLEVEL / (double) 1000)
201 + ((double) SUBVERSION / (double) 100000));
a5f75d66 202#else
e2666263 203 sprintf(patchlevel, "%5.3f", (double) 5 +
204 ((double) PATCHLEVEL / (double) 1000));
a5f75d66 205#endif
79072805 206
ab821d7f 207#if defined(LOCAL_PATCH_COUNT)
6e72f9df 208 localpatches = local_patches; /* For possible -v */
ab821d7f 209#endif
210
4b556e6c 211 PerlIO_init(); /* Hook to IO system */
760ac839 212
4b556e6c
JD
213 fdpid = newAV(); /* for remembering popen pids by fd */
214 modglobal = newHV(); /* pointers to per-interpreter module globals */
8990e307 215
11343788
MB
216 DEBUG( {
217 New(51,debname,128,char);
218 New(52,debdelim,128,char);
219 } )
220
8990e307 221 ENTER;
79072805
LW
222}
223
224void
8ac85365 225perl_destruct(register PerlInterpreter *sv_interp)
79072805 226{
11343788 227 dTHR;
748a9306 228 int destruct_level; /* 0=none, 1=full, 2=full with checks */
8990e307 229 I32 last_sv_count;
a0d0e21e 230 HV *hv;
1f2bfc8a 231#ifdef USE_THREADS
33f46ff6 232 Thread t;
1f2bfc8a 233#endif /* USE_THREADS */
8990e307 234
79072805
LW
235 if (!(curinterp = sv_interp))
236 return;
748a9306 237
11343788 238#ifdef USE_THREADS
0f15f207 239#ifndef FAKE_THREADS
8023c3ce
MB
240 /* Pass 1 on any remaining threads: detach joinables, join zombies */
241 retry_cleanup:
33f46ff6
MB
242 MUTEX_LOCK(&threads_mutex);
243 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
c7848ba1 244 "perl_destruct: waiting for %d threads...\n",
33f46ff6
MB
245 nthreads - 1));
246 for (t = thr->next; t != thr; t = t->next) {
605e5515
MB
247 MUTEX_LOCK(&t->mutex);
248 switch (ThrSTATE(t)) {
249 AV *av;
c7848ba1
MB
250 case THRf_ZOMBIE:
251 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
252 "perl_destruct: joining zombie %p\n", t));
605e5515
MB
253 ThrSETSTATE(t, THRf_DEAD);
254 MUTEX_UNLOCK(&t->mutex);
255 nthreads--;
8023c3ce
MB
256 /*
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
260 * all over again.
261 */
605e5515 262 MUTEX_UNLOCK(&threads_mutex);
ea0efc06 263 JOIN(t, &av);
605e5515 264 SvREFCNT_dec((SV*)av);
c7848ba1
MB
265 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
266 "perl_destruct: joined zombie %p OK\n", t));
8023c3ce 267 goto retry_cleanup;
c7848ba1
MB
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);
272 /*
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.
277 */
278 MUTEX_UNLOCK(&threads_mutex);
279 DETACH(t);
280 MUTEX_UNLOCK(&t->mutex);
8023c3ce 281 goto retry_cleanup;
c7848ba1
MB
282 default:
283 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
284 "perl_destruct: ignoring %p (state %u)\n",
285 t, ThrSTATE(t)));
286 MUTEX_UNLOCK(&t->mutex);
c7848ba1 287 /* fall through and out */
33f46ff6
MB
288 }
289 }
8023c3ce
MB
290 /* We leave the above "Pass 1" loop with threads_mutex still locked */
291
292 /* Pass 2 on remaining threads: wait for the thread count to drop to one */
11343788
MB
293 while (nthreads > 1)
294 {
33f46ff6 295 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
c7848ba1 296 "perl_destruct: final wait for %d threads\n",
33f46ff6
MB
297 nthreads - 1));
298 COND_WAIT(&nthreads_cond, &threads_mutex);
11343788
MB
299 }
300 /* At this point, we're the last thread */
33f46ff6 301 MUTEX_UNLOCK(&threads_mutex);
d9f997d7 302 DEBUG_L(PerlIO_printf(PerlIO_stderr(), "perl_destruct: armageddon has arrived\n"));
33f46ff6 303 MUTEX_DESTROY(&threads_mutex);
11343788 304 COND_DESTROY(&nthreads_cond);
0f15f207 305#endif /* !defined(FAKE_THREADS) */
11343788
MB
306#endif /* USE_THREADS */
307
748a9306 308 destruct_level = perl_destruct_level;
4633a7c4
LW
309#ifdef DEBUGGING
310 {
311 char *s;
5fd9e9a4 312 if (s = PerlEnv_getenv("PERL_DESTRUCT_LEVEL")) {
5f05dabc 313 int i = atoi(s);
314 if (destruct_level < i)
315 destruct_level = i;
316 }
4633a7c4
LW
317 }
318#endif
319
8990e307 320 LEAVE;
a0d0e21e
LW
321 FREETMPS;
322
ff0cee69 323 /* We must account for everything. */
324
325 /* Destroy the main CV and syntax tree */
6e72f9df 326 if (main_root) {
327 curpad = AvARRAY(comppad);
328 op_free(main_root);
ff0cee69 329 main_root = Nullop;
a0d0e21e 330 }
bac4b2ad 331 curcop = &compiling;
ff0cee69 332 main_start = Nullop;
333 SvREFCNT_dec(main_cv);
334 main_cv = Nullcv;
335
a0d0e21e
LW
336 if (sv_objcount) {
337 /*
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.
341 */
342
343 dirty = TRUE;
344 sv_clean_objs();
8990e307
LW
345 }
346
5cd24f17 347 /* unhook hooks which will soon be, or use, destroyed data */
348 SvREFCNT_dec(warnhook);
349 warnhook = Nullsv;
350 SvREFCNT_dec(diehook);
351 diehook = Nullsv;
352 SvREFCNT_dec(parsehook);
353 parsehook = Nullsv;
354
4b556e6c
JD
355 /* call exit list functions */
356 while (exitlistlen-- > 0)
357 exitlist[exitlistlen].fn(exitlist[exitlistlen].ptr);
358
359 Safefree(exitlist);
360
a0d0e21e 361 if (destruct_level == 0){
8990e307 362
a0d0e21e
LW
363 DEBUG_P(debprofdump());
364
365 /* The exit() function will do everything that needs doing. */
366 return;
367 }
5dd60ef7 368
5f05dabc 369 /* loosen bonds of global variables */
370
8ebc5c01 371 if(rsfp) {
372 (void)PerlIO_close(rsfp);
373 rsfp = Nullfp;
374 }
375
376 /* Filters for program text */
377 SvREFCNT_dec(rsfp_filters);
378 rsfp_filters = Nullav;
379
380 /* switches */
381 preprocess = FALSE;
382 minus_n = FALSE;
383 minus_p = FALSE;
384 minus_l = FALSE;
385 minus_a = FALSE;
386 minus_F = FALSE;
387 doswitches = FALSE;
388 dowarn = FALSE;
389 doextract = FALSE;
390 sawampersand = FALSE; /* must save all match strings */
391 sawstudy = FALSE; /* do fbm_instr on all strings */
392 sawvec = FALSE;
393 unsafe = FALSE;
394
395 Safefree(inplace);
396 inplace = Nullch;
397
398 Safefree(e_tmpname);
399 e_tmpname = Nullch;
400
401 if (e_fp) {
402 PerlIO_close(e_fp);
403 e_fp = Nullfp;
404 }
405
406 /* magical thingies */
407
408 Safefree(ofs); /* $, */
409 ofs = Nullch;
5f05dabc 410
8ebc5c01 411 Safefree(ors); /* $\ */
412 ors = Nullch;
413
414 SvREFCNT_dec(nrs); /* $\ helper */
5f05dabc 415 nrs = Nullsv;
416
8ebc5c01 417 multiline = 0; /* $* */
5f05dabc 418
8ebc5c01 419 SvREFCNT_dec(statname);
5f05dabc 420 statname = Nullsv;
421 statgv = Nullgv;
5f05dabc 422
8ebc5c01 423 /* defgv, aka *_ should be taken care of elsewhere */
424
8ebc5c01 425 /* clean up after study() */
426 SvREFCNT_dec(lastscream);
427 lastscream = Nullsv;
428 Safefree(screamfirst);
429 screamfirst = 0;
430 Safefree(screamnext);
431 screamnext = 0;
432
433 /* startup and shutdown function lists */
434 SvREFCNT_dec(beginav);
435 SvREFCNT_dec(endav);
77a005ab 436 SvREFCNT_dec(initav);
5618dfe8 437 beginav = Nullav;
5618dfe8 438 endav = Nullav;
77a005ab 439 initav = Nullav;
5618dfe8 440
8ebc5c01 441 /* shortcuts just get cleared */
442 envgv = Nullgv;
443 siggv = Nullgv;
444 incgv = Nullgv;
12f917ad 445 errgv = Nullgv;
8ebc5c01 446 argvgv = Nullgv;
447 argvoutgv = Nullgv;
448 stdingv = Nullgv;
449 last_in_gv = Nullgv;
450
451 /* reset so print() ends up where we expect */
452 setdefout(Nullgv);
453
a0d0e21e 454 /* Prepare to destruct main symbol table. */
5f05dabc 455
a0d0e21e 456 hv = defstash;
85e6fe83 457 defstash = 0;
a0d0e21e
LW
458 SvREFCNT_dec(hv);
459
460 FREETMPS;
461 if (destruct_level >= 2) {
462 if (scopestack_ix != 0)
ff0cee69 463 warn("Unbalanced scopes: %ld more ENTERs than LEAVEs\n",
464 (long)scopestack_ix);
a0d0e21e 465 if (savestack_ix != 0)
ff0cee69 466 warn("Unbalanced saves: %ld more saves than restores\n",
467 (long)savestack_ix);
a0d0e21e 468 if (tmps_floor != -1)
ff0cee69 469 warn("Unbalanced tmps: %ld more allocs than frees\n",
470 (long)tmps_floor + 1);
a0d0e21e 471 if (cxstack_ix != -1)
ff0cee69 472 warn("Unbalanced context: %ld more PUSHes than POPs\n",
473 (long)cxstack_ix + 1);
a0d0e21e 474 }
8990e307
LW
475
476 /* Now absolutely destruct everything, somehow or other, loops or no. */
8990e307 477 last_sv_count = 0;
6e72f9df 478 SvFLAGS(strtab) |= SVTYPEMASK; /* don't clean out strtab now */
8990e307
LW
479 while (sv_count != 0 && sv_count != last_sv_count) {
480 last_sv_count = sv_count;
481 sv_clean_all();
482 }
6e72f9df 483 SvFLAGS(strtab) &= ~SVTYPEMASK;
484 SvFLAGS(strtab) |= SVt_PVHV;
485
486 /* Destruct the global string table. */
487 {
488 /* Yell and reset the HeVAL() slots that are still holding refcounts,
489 * so that sv_free() won't fail on them.
490 */
491 I32 riter;
492 I32 max;
493 HE *hent;
494 HE **array;
495
496 riter = 0;
497 max = HvMAX(strtab);
498 array = HvARRAY(strtab);
499 hent = array[0];
500 for (;;) {
501 if (hent) {
502 warn("Unbalanced string table refcount: (%d) for \"%s\"",
503 HeVAL(hent) - Nullsv, HeKEY(hent));
16bdeea2 504 HeVAL(hent) = Nullsv;
6e72f9df 505 hent = HeNEXT(hent);
506 }
507 if (!hent) {
508 if (++riter > max)
509 break;
510 hent = array[riter];
511 }
512 }
513 }
514 SvREFCNT_dec(strtab);
515
8990e307 516 if (sv_count != 0)
ff0cee69 517 warn("Scalars leaked: %ld\n", (long)sv_count);
6e72f9df 518
4633a7c4 519 sv_free_arenas();
44a8e56a 520
521 /* No SVs have survived, need to clean out */
522 linestr = NULL;
523 pidstatus = Nullhv;
6e72f9df 524 if (origfilename)
525 Safefree(origfilename);
526 nuke_stacks();
fc36a67e 527 hints = 0; /* Reset hints. Should hints be per-interpreter ? */
a0d0e21e
LW
528
529 DEBUG_P(debprofdump());
11343788
MB
530#ifdef USE_THREADS
531 MUTEX_DESTROY(&sv_mutex);
11343788 532 MUTEX_DESTROY(&eval_mutex);
c116a00c 533 COND_DESTROY(&eval_cond);
fc36a67e 534
8023c3ce
MB
535 /* As the penultimate thing, free the non-arena SV for thrsv */
536 Safefree(SvPVX(thrsv));
537 Safefree(SvANY(thrsv));
538 Safefree(thrsv);
539 thrsv = Nullsv;
540#endif /* USE_THREADS */
541
fc36a67e 542 /* As the absolutely last thing, free the non-arena SV for mess() */
543
544 if (mess_sv) {
545 /* we know that type >= SVt_PV */
546 SvOOK_off(mess_sv);
547 Safefree(SvPVX(mess_sv));
548 Safefree(SvANY(mess_sv));
549 Safefree(mess_sv);
550 mess_sv = Nullsv;
551 }
79072805
LW
552}
553
554void
8ac85365 555perl_free(PerlInterpreter *sv_interp)
79072805
LW
556{
557 if (!(curinterp = sv_interp))
558 return;
559 Safefree(sv_interp);
560}
561
4b556e6c
JD
562void
563perl_atexit(void (*fn) (void *), void *ptr)
564{
565 Renew(exitlist, exitlistlen+1, PerlExitListEntry);
566 exitlist[exitlistlen].fn = fn;
567 exitlist[exitlistlen].ptr = ptr;
568 ++exitlistlen;
569}
570
79072805 571int
8ac85365 572perl_parse(PerlInterpreter *sv_interp, void (*xsinit) (void), int argc, char **argv, char **env)
8d063cd8 573{
11343788 574 dTHR;
79072805 575 register SV *sv;
8d063cd8 576 register char *s;
1a30305b 577 char *scriptname = NULL;
a0d0e21e 578 VOL bool dosearch = FALSE;
13281fa4 579 char *validarg = "";
2ae324a7 580 I32 oldscope;
748a9306 581 AV* comppadlist;
e5c9fcd0 582 int e_tmpfd = -1;
54310121 583 dJMPENV;
22921e25 584 int ret;
8d063cd8 585
a687059c
LW
586#ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
587#ifdef IAMSUID
588#undef IAMSUID
463ee0b2 589 croak("suidperl is no longer needed since the kernel can now execute\n\
a687059c
LW
590setuid perl scripts securely.\n");
591#endif
592#endif
593
79072805
LW
594 if (!(curinterp = sv_interp))
595 return 255;
596
6e72f9df 597#if defined(NeXT) && defined(__DYNAMIC__)
598 _dyld_lookup_and_bind
599 ("__environ", (unsigned long *) &environ_pointer, NULL);
600#endif /* environ */
601
ac58e20f
LW
602 origargv = argv;
603 origargc = argc;
a0d0e21e 604#ifndef VMS /* VMS doesn't have environ array */
fe14fcc3 605 origenviron = environ;
a0d0e21e 606#endif
ab821d7f 607 e_tmpname = Nullch;
a0d0e21e
LW
608
609 if (do_undump) {
610
611 /* Come here if running an undumped a.out. */
612
613 origfilename = savepv(argv[0]);
614 do_undump = FALSE;
615 cxstack_ix = -1; /* start label stack again */
748a9306 616 init_ids();
a0d0e21e
LW
617 init_postdump_symbols(argc,argv,env);
618 return 0;
619 }
620
ff0cee69 621 if (main_root) {
622 curpad = AvARRAY(comppad);
a0d0e21e 623 op_free(main_root);
ff0cee69 624 main_root = Nullop;
625 }
626 main_start = Nullop;
627 SvREFCNT_dec(main_cv);
628 main_cv = Nullcv;
79072805 629
f86702cc 630 time(&basetime);
2ae324a7 631 oldscope = scopestack_ix;
f86702cc 632
22921e25
CS
633 JMPENV_PUSH(ret);
634 switch (ret) {
79072805 635 case 1:
f86702cc 636 STATUS_ALL_FAILURE;
637 /* FALL THROUGH */
79072805 638 case 2:
f86702cc 639 /* my_exit() was called */
2ae324a7 640 while (scopestack_ix > oldscope)
641 LEAVE;
84902520 642 FREETMPS;
8990e307
LW
643 curstash = defstash;
644 if (endav)
68dc0745 645 call_list(oldscope, endav);
54310121 646 JMPENV_POP;
f86702cc 647 return STATUS_NATIVE_EXPORT;
79072805 648 case 3:
54310121 649 JMPENV_POP;
760ac839 650 PerlIO_printf(PerlIO_stderr(), "panic: top_env\n");
8990e307 651 return 1;
79072805
LW
652 }
653
79072805
LW
654 sv_setpvn(linestr,"",0);
655 sv = newSVpv("",0); /* first used for -I flags */
8990e307 656 SAVEFREESV(sv);
79072805 657 init_main_stash();
54310121 658
33b78306 659 for (argc--,argv++; argc > 0; argc--,argv++) {
8d063cd8
LW
660 if (argv[0][0] != '-' || !argv[0][1])
661 break;
13281fa4
LW
662#ifdef DOSUID
663 if (*validarg)
664 validarg = " PHOOEY ";
665 else
666 validarg = argv[0];
667#endif
668 s = argv[0]+1;
8d063cd8 669 reswitch:
13281fa4 670 switch (*s) {
7b8d334a 671 case ' ':
27e2fb84 672 case '0':
2304df62 673 case 'F':
378cc40b 674 case 'a':
33b78306 675 case 'c':
a687059c 676 case 'd':
8d063cd8 677 case 'D':
4633a7c4 678 case 'h':
33b78306 679 case 'i':
fe14fcc3 680 case 'l':
1a30305b 681 case 'M':
682 case 'm':
33b78306
LW
683 case 'n':
684 case 'p':
79072805 685 case 's':
33b78306
LW
686 case 'u':
687 case 'U':
688 case 'v':
689 case 'w':
690 if (s = moreswitches(s))
691 goto reswitch;
8d063cd8 692 break;
33b78306 693
f86702cc 694 case 'T':
695 tainting = TRUE;
696 s++;
697 goto reswitch;
698
8d063cd8 699 case 'e':
a687059c 700 if (euid != uid || egid != gid)
463ee0b2 701 croak("No -e allowed in setuid scripts");
8d063cd8 702 if (!e_fp) {
6ee623d5 703#if defined(HAS_UMASK) && !defined(VMS)
51fa4eea
JH
704 int oldumask = PerlLIO_umask(0177);
705#endif
a0d0e21e 706 e_tmpname = savepv(TMPPATH);
e5c9fcd0
AD
707#ifdef HAS_MKSTEMP
708 e_tmpfd = PerlLIO_mkstemp(e_tmpname);
e5c9fcd0 709#else /* use mktemp() */
3028581b 710 (void)PerlLIO_mktemp(e_tmpname);
83025b21 711 if (!*e_tmpname)
51fa4eea
JH
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,
716 0600);
717# else
718 (void)UNLINK(e_tmpname);
719 /* Yes, potential race. But at least we can say we tried. */
760ac839 720 e_fp = PerlIO_open(e_tmpname,"w");
51fa4eea
JH
721# endif
722#endif /* ifdef HAS_MKSTEMP */
723#if defined(HAS_MKSTEMP) || (defined(HAS_OPEN3) && defined(O_EXCL))
724 if (e_tmpfd < 0)
725 croak("Cannot create temporary file \"%s\"", e_tmpname);
726 e_fp = PerlIO_fdopen(e_tmpfd,"w");
727#endif
e5c9fcd0 728 if (!e_fp)
51fa4eea 729 croak("Cannot create temporary file \"%s\"", e_tmpname);
6ee623d5 730#if defined(HAS_UMASK) && !defined(VMS)
51fa4eea
JH
731 (void)PerlLIO_umask(oldumask);
732#endif
8d063cd8 733 }
552a7a9b 734 if (*++s)
735 PerlIO_puts(e_fp,s);
736 else if (argv[1]) {
760ac839 737 PerlIO_puts(e_fp,argv[1]);
33b78306
LW
738 argc--,argv++;
739 }
552a7a9b 740 else
741 croak("No code specified for -e");
760ac839 742 (void)PerlIO_putc(e_fp,'\n');
8d063cd8 743 break;
fb73857a 744 case 'I': /* -I handled both here and in moreswitches() */
bbce6d69 745 forbid_setid("-I");
fb73857a 746 if (!*++s && (s=argv[1]) != Nullch) {
8d063cd8 747 argc--,argv++;
8d063cd8 748 }
fb73857a 749 while (s && isSPACE(*s))
750 ++s;
751 if (s && *s) {
752 char *e, *p;
753 for (e = s; *e && !isSPACE(*e); e++) ;
754 p = savepvn(s, e-s);
755 incpush(p, TRUE);
756 sv_catpv(sv,"-I");
757 sv_catpv(sv,p);
758 sv_catpv(sv," ");
759 Safefree(p);
760 } /* XXX else croak? */
8d063cd8 761 break;
8d063cd8 762 case 'P':
bbce6d69 763 forbid_setid("-P");
8d063cd8 764 preprocess = TRUE;
13281fa4 765 s++;
8d063cd8 766 goto reswitch;
378cc40b 767 case 'S':
bbce6d69 768 forbid_setid("-S");
378cc40b 769 dosearch = TRUE;
13281fa4 770 s++;
378cc40b 771 goto reswitch;
1a30305b 772 case 'V':
773 if (!preambleav)
774 preambleav = newAV();
775 av_push(preambleav, newSVpv("use Config qw(myconfig config_vars)",0));
776 if (*++s != ':') {
6e72f9df 777 Sv = newSVpv("print myconfig();",0);
778#ifdef VMS
779 sv_catpv(Sv,"print \"\\nCharacteristics of this PERLSHR image: \\n\",");
780#else
781 sv_catpv(Sv,"print \"\\nCharacteristics of this binary (from libperl): \\n\",");
782#endif
54310121 783#if defined(DEBUGGING) || defined(NO_EMBED) || defined(MULTIPLICITY)
46fc3d4c 784 sv_catpv(Sv,"\" Compile-time options:");
6e72f9df 785# ifdef DEBUGGING
46fc3d4c 786 sv_catpv(Sv," DEBUGGING");
6e72f9df 787# endif
54310121 788# ifdef NO_EMBED
46fc3d4c 789 sv_catpv(Sv," NO_EMBED");
6e72f9df 790# endif
791# ifdef MULTIPLICITY
46fc3d4c 792 sv_catpv(Sv," MULTIPLICITY");
6e72f9df 793# endif
46fc3d4c 794 sv_catpv(Sv,"\\n\",");
6e72f9df 795#endif
796#if defined(LOCAL_PATCH_COUNT)
54310121 797 if (LOCAL_PATCH_COUNT > 0) {
798 int i;
5cd24f17 799 sv_catpv(Sv,"\" Locally applied patches:\\n\",");
6e72f9df 800 for (i = 1; i <= LOCAL_PATCH_COUNT; i++) {
46fc3d4c 801 if (localpatches[i])
802 sv_catpvf(Sv,"\" \\t%s\\n\",",localpatches[i]);
6e72f9df 803 }
804 }
805#endif
46fc3d4c 806 sv_catpvf(Sv,"\" Built under %s\\n\"",OSNAME);
6e72f9df 807#ifdef __DATE__
808# ifdef __TIME__
46fc3d4c 809 sv_catpvf(Sv,",\" Compiled at %s %s\\n\"",__DATE__,__TIME__);
6e72f9df 810# else
46fc3d4c 811 sv_catpvf(Sv,",\" Compiled on %s\\n\"",__DATE__);
6e72f9df 812# endif
6e72f9df 813#endif
54310121 814 sv_catpv(Sv, "; \
815$\"=\"\\n \"; \
816@env = map { \"$_=\\\"$ENV{$_}\\\"\" } sort grep {/^PERL/} keys %ENV; \
817print \" \\%ENV:\\n @env\\n\" if @env; \
818print \" \\@INC:\\n @INC\\n\";");
1a30305b 819 }
820 else {
821 Sv = newSVpv("config_vars(qw(",0);
822 sv_catpv(Sv, ++s);
823 sv_catpv(Sv, "))");
824 s += strlen(s);
825 }
826 av_push(preambleav, Sv);
c07a80fd 827 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
1a30305b 828 goto reswitch;
33b78306
LW
829 case 'x':
830 doextract = TRUE;
13281fa4 831 s++;
33b78306 832 if (*s)
a0d0e21e 833 cddir = savepv(s);
33b78306 834 break;
8d063cd8
LW
835 case 0:
836 break;
fb73857a 837 case '-':
838 if (!*++s || isSPACE(*s)) {
839 argc--,argv++;
840 goto switch_end;
841 }
842 /* catch use of gnu style long options */
843 if (strEQ(s, "version")) {
844 s = "v";
845 goto reswitch;
846 }
847 if (strEQ(s, "help")) {
848 s = "h";
849 goto reswitch;
850 }
851 s--;
852 /* FALL THROUGH */
8d063cd8 853 default:
90248788 854 croak("Unrecognized switch: -%s (-h will show valid options)",s);
8d063cd8
LW
855 }
856 }
857 switch_end:
54310121 858
5fd9e9a4 859 if (!tainting && (s = PerlEnv_getenv("PERL5OPT"))) {
fb73857a 860 while (s && *s) {
54310121 861 while (isSPACE(*s))
862 s++;
863 if (*s == '-') {
864 s++;
865 if (isSPACE(*s))
866 continue;
867 }
868 if (!*s)
869 break;
870 if (!strchr("DIMUdmw", *s))
871 croak("Illegal switch in PERL5OPT: -%c", *s);
872 s = moreswitches(s);
873 }
874 }
875
1a30305b 876 if (!scriptname)
877 scriptname = argv[0];
8d063cd8 878 if (e_fp) {
68dc0745 879 if (PerlIO_flush(e_fp) || PerlIO_error(e_fp) || PerlIO_close(e_fp)) {
880#ifndef MULTIPLICITY
881 warn("Did you forget to compile with -DMULTIPLICITY?");
882#endif
2304df62 883 croak("Can't write to temp file for -e: %s", Strerror(errno));
68dc0745 884 }
ab821d7f 885 e_fp = Nullfp;
8d063cd8 886 argc++,argv--;
45d8adaa 887 scriptname = e_tmpname;
8d063cd8 888 }
79072805
LW
889 else if (scriptname == Nullch) {
890#ifdef MSDOS
3028581b 891 if ( PerlLIO_isatty(PerlIO_fileno(PerlIO_stdin())) )
55497cff 892 moreswitches("h");
fe14fcc3 893#endif
79072805
LW
894 scriptname = "-";
895 }
fe14fcc3 896
79072805 897 init_perllib();
8d063cd8 898
79072805 899 open_script(scriptname,dosearch,sv);
8d063cd8 900
96436eeb 901 validate_suid(validarg, scriptname);
378cc40b 902
79072805
LW
903 if (doextract)
904 find_beginning();
905
4fdae800 906 main_cv = compcv = (CV*)NEWSV(1104,0);
748a9306 907 sv_upgrade((SV *)compcv, SVt_PVCV);
07055b4c 908 CvUNIQUE_on(compcv);
748a9306 909
6e72f9df 910 comppad = newAV();
79072805
LW
911 av_push(comppad, Nullsv);
912 curpad = AvARRAY(comppad);
6e72f9df 913 comppad_name = newAV();
8990e307 914 comppad_name_fill = 0;
e858de61
MB
915 min_intro_pending = 0;
916 padix = 0;
11343788
MB
917#ifdef USE_THREADS
918 av_store(comppad_name, 0, newSVpv("@_", 2));
e858de61 919 curpad[0] = (SV*)newAV();
6d4ff0d2 920 SvPADMY_on(curpad[0]); /* XXX Needed? */
e858de61 921 CvOWNER(compcv) = 0;
12ca11f6 922 New(666, CvMUTEXP(compcv), 1, perl_mutex);
e858de61 923 MUTEX_INIT(CvMUTEXP(compcv));
11343788 924#endif /* USE_THREADS */
79072805 925
748a9306
LW
926 comppadlist = newAV();
927 AvREAL_off(comppadlist);
8e07c86e
AD
928 av_store(comppadlist, 0, (SV*)comppad_name);
929 av_store(comppadlist, 1, (SV*)comppad);
748a9306
LW
930 CvPADLIST(compcv) = comppadlist;
931
6e72f9df 932 boot_core_UNIVERSAL();
a0d0e21e
LW
933 if (xsinit)
934 (*xsinit)(); /* in case linked C routines want magical variables */
39e571d4 935#if defined(VMS) || defined(WIN32) || defined(DJGPP)
748a9306
LW
936 init_os_extras();
937#endif
93a17b20 938
93a17b20 939 init_predump_symbols();
8990e307
LW
940 if (!do_undump)
941 init_postdump_symbols(argc,argv,env);
93a17b20 942
79072805
LW
943 init_lexer();
944
945 /* now parse the script */
946
61bb5906 947 SETERRNO(0,SS$_NORMAL);
79072805
LW
948 error_count = 0;
949 if (yyparse() || error_count) {
950 if (minus_c)
463ee0b2 951 croak("%s had compilation errors.\n", origfilename);
79072805 952 else {
463ee0b2 953 croak("Execution of %s aborted due to compilation errors.\n",
79072805 954 origfilename);
378cc40b 955 }
79072805
LW
956 }
957 curcop->cop_line = 0;
958 curstash = defstash;
959 preprocess = FALSE;
ab821d7f 960 if (e_tmpname) {
79072805 961 (void)UNLINK(e_tmpname);
ab821d7f 962 Safefree(e_tmpname);
963 e_tmpname = Nullch;
e5c9fcd0 964 e_tmpfd = -1;
378cc40b 965 }
a687059c 966
93a17b20 967 /* now that script is parsed, we can modify record separator */
c07a80fd 968 SvREFCNT_dec(rs);
969 rs = SvREFCNT_inc(nrs);
e1c148c2 970 sv_setsv(perl_get_sv("/", TRUE), rs);
79072805
LW
971 if (do_undump)
972 my_unexec();
973
8990e307
LW
974 if (dowarn)
975 gv_check(defstash);
976
a0d0e21e
LW
977 LEAVE;
978 FREETMPS;
c07a80fd 979
3562ef9b 980#ifdef MYMALLOC
5fd9e9a4 981 if ((s=PerlEnv_getenv("PERL_DEBUG_MSTATS")) && atoi(s) >= 2)
c07a80fd 982 dump_mstats("after compilation:");
983#endif
984
a0d0e21e
LW
985 ENTER;
986 restartop = 0;
54310121 987 JMPENV_POP;
79072805
LW
988 return 0;
989}
990
991int
8ac85365 992perl_run(PerlInterpreter *sv_interp)
79072805 993{
e336de0d 994 dSP;
2ae324a7 995 I32 oldscope;
22921e25
CS
996 dJMPENV;
997 int ret;
2ae324a7 998
79072805
LW
999 if (!(curinterp = sv_interp))
1000 return 255;
2ae324a7 1001
1002 oldscope = scopestack_ix;
1003
22921e25
CS
1004 JMPENV_PUSH(ret);
1005 switch (ret) {
79072805
LW
1006 case 1:
1007 cxstack_ix = -1; /* start context stack again */
1008 break;
1009 case 2:
f86702cc 1010 /* my_exit() was called */
2ae324a7 1011 while (scopestack_ix > oldscope)
1012 LEAVE;
84902520 1013 FREETMPS;
79072805 1014 curstash = defstash;
93a17b20 1015 if (endav)
68dc0745 1016 call_list(oldscope, endav);
3562ef9b 1017#ifdef MYMALLOC
5fd9e9a4 1018 if (PerlEnv_getenv("PERL_DEBUG_MSTATS"))
c07a80fd 1019 dump_mstats("after execution: ");
1020#endif
54310121 1021 JMPENV_POP;
f86702cc 1022 return STATUS_NATIVE_EXPORT;
79072805
LW
1023 case 3:
1024 if (!restartop) {
760ac839 1025 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
a0d0e21e 1026 FREETMPS;
54310121 1027 JMPENV_POP;
8990e307 1028 return 1;
83025b21 1029 }
e336de0d 1030 POPSTACK_TO(mainstack);
79072805 1031 break;
8d063cd8 1032 }
79072805 1033
fb73857a 1034 DEBUG_r(PerlIO_printf(Perl_debug_log, "%s $` $& $' support.\n",
6e72f9df 1035 sawampersand ? "Enabling" : "Omitting"));
1036
79072805
LW
1037 if (!restartop) {
1038 DEBUG_x(dump_all());
760ac839 1039 DEBUG(PerlIO_printf(Perl_debug_log, "\nEXECUTING...\n\n"));
11343788 1040#ifdef USE_THREADS
5dc0d613
MB
1041 DEBUG_L(PerlIO_printf(Perl_debug_log, "main thread is 0x%lx\n",
1042 (unsigned long) thr));
11343788 1043#endif /* USE_THREADS */
79072805
LW
1044
1045 if (minus_c) {
760ac839 1046 PerlIO_printf(PerlIO_stderr(), "%s syntax OK\n", origfilename);
79072805
LW
1047 my_exit(0);
1048 }
84902520 1049 if (PERLDB_SINGLE && DBsingle)
a0d0e21e 1050 sv_setiv(DBsingle, 1);
7d07dbc2
MB
1051 if (initav)
1052 call_list(oldscope, initav);
45d8adaa 1053 }
79072805
LW
1054
1055 /* do it */
1056
1057 if (restartop) {
1058 op = restartop;
1059 restartop = 0;
ab821d7f 1060 runops();
79072805
LW
1061 }
1062 else if (main_start) {
4fdae800 1063 CvDEPTH(main_cv) = 1;
79072805 1064 op = main_start;
ab821d7f 1065 runops();
79072805 1066 }
79072805
LW
1067
1068 my_exit(0);
54310121 1069 /* NOTREACHED */
a0d0e21e 1070 return 0;
79072805
LW
1071}
1072
a0d0e21e 1073SV*
8ac85365 1074perl_get_sv(char *name, I32 create)
a0d0e21e 1075{
2faa37cc 1076 GV *gv;
38a03e6e 1077#ifdef USE_THREADS
2faa37cc 1078 if (name[1] == '\0' && !isALPHA(name[0])) {
54b9620d 1079 PADOFFSET tmp = find_threadsv(name);
2faa37cc
MB
1080 if (tmp != NOT_IN_PAD) {
1081 dTHR;
940cb80d 1082 return THREADSV(tmp);
2faa37cc 1083 }
38a03e6e
MB
1084 }
1085#endif /* USE_THREADS */
2faa37cc 1086 gv = gv_fetchpv(name, create, SVt_PV);
a0d0e21e
LW
1087 if (gv)
1088 return GvSV(gv);
1089 return Nullsv;
1090}
1091
1092AV*
8ac85365 1093perl_get_av(char *name, I32 create)
a0d0e21e
LW
1094{
1095 GV* gv = gv_fetchpv(name, create, SVt_PVAV);
1096 if (create)
1097 return GvAVn(gv);
1098 if (gv)
1099 return GvAV(gv);
1100 return Nullav;
1101}
1102
1103HV*
8ac85365 1104perl_get_hv(char *name, I32 create)
a0d0e21e
LW
1105{
1106 GV* gv = gv_fetchpv(name, create, SVt_PVHV);
1107 if (create)
1108 return GvHVn(gv);
1109 if (gv)
1110 return GvHV(gv);
1111 return Nullhv;
1112}
1113
1114CV*
8ac85365 1115perl_get_cv(char *name, I32 create)
a0d0e21e
LW
1116{
1117 GV* gv = gv_fetchpv(name, create, SVt_PVCV);
8ebc5c01 1118 if (create && !GvCVu(gv))
774d564b 1119 return newSUB(start_subparse(FALSE, 0),
a0d0e21e 1120 newSVOP(OP_CONST, 0, newSVpv(name,0)),
4633a7c4 1121 Nullop,
a0d0e21e
LW
1122 Nullop);
1123 if (gv)
8ebc5c01 1124 return GvCVu(gv);
a0d0e21e
LW
1125 return Nullcv;
1126}
1127
79072805
LW
1128/* Be sure to refetch the stack pointer after calling these routines. */
1129
a0d0e21e 1130I32
22239a37 1131perl_call_argv(char *sub_name, I32 flags, register char **argv)
8ac85365
NIS
1132
1133 /* See G_* flags in cop.h */
1134 /* null terminated arg list */
8990e307 1135{
a0d0e21e 1136 dSP;
8990e307 1137
924508f0 1138 PUSHMARK(SP);
a0d0e21e 1139 if (argv) {
8990e307 1140 while (*argv) {
a0d0e21e 1141 XPUSHs(sv_2mortal(newSVpv(*argv,0)));
8990e307
LW
1142 argv++;
1143 }
a0d0e21e 1144 PUTBACK;
8990e307 1145 }
22239a37 1146 return perl_call_pv(sub_name, flags);
8990e307
LW
1147}
1148
a0d0e21e 1149I32
22239a37 1150perl_call_pv(char *sub_name, I32 flags)
8ac85365
NIS
1151 /* name of the subroutine */
1152 /* See G_* flags in cop.h */
a0d0e21e 1153{
22239a37 1154 return perl_call_sv((SV*)perl_get_cv(sub_name, TRUE), flags);
a0d0e21e
LW
1155}
1156
1157I32
8ac85365
NIS
1158perl_call_method(char *methname, I32 flags)
1159 /* name of the subroutine */
1160 /* See G_* flags in cop.h */
a0d0e21e
LW
1161{
1162 dSP;
1163 OP myop;
1164 if (!op)
1165 op = &myop;
1166 XPUSHs(sv_2mortal(newSVpv(methname,0)));
1167 PUTBACK;
11343788 1168 pp_method(ARGS);
a0d0e21e
LW
1169 return perl_call_sv(*stack_sp--, flags);
1170}
1171
1172/* May be called with any of a CV, a GV, or an SV containing the name. */
1173I32
8ac85365
NIS
1174perl_call_sv(SV *sv, I32 flags)
1175
1176 /* See G_* flags in cop.h */
a0d0e21e 1177{
924508f0 1178 dSP;
a0d0e21e 1179 LOGOP myop; /* fake syntax tree node */
aa689395 1180 I32 oldmark;
a0d0e21e 1181 I32 retval;
a0d0e21e 1182 I32 oldscope;
6e72f9df 1183 static CV *DBcv;
54310121 1184 bool oldcatch = CATCH_GET;
1185 dJMPENV;
22921e25 1186 int ret;
d6602a8c 1187 OP* oldop = op;
1e422769 1188
a0d0e21e
LW
1189 if (flags & G_DISCARD) {
1190 ENTER;
1191 SAVETMPS;
1192 }
1193
aa689395 1194 Zero(&myop, 1, LOGOP);
54310121 1195 myop.op_next = Nullop;
f51d4af5 1196 if (!(flags & G_NOARGS))
aa689395 1197 myop.op_flags |= OPf_STACKED;
54310121 1198 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1199 (flags & G_ARRAY) ? OPf_WANT_LIST :
1200 OPf_WANT_SCALAR);
462e5cf6 1201 SAVEOP();
a0d0e21e 1202 op = (OP*)&myop;
aa689395 1203
a0d0e21e
LW
1204 EXTEND(stack_sp, 1);
1205 *++stack_sp = sv;
aa689395 1206 oldmark = TOPMARK;
a0d0e21e
LW
1207 oldscope = scopestack_ix;
1208
84902520 1209 if (PERLDB_SUB && curstash != debstash
36477c24 1210 /* Handle first BEGIN of -d. */
1211 && (DBcv || (DBcv = GvCV(DBsub)))
1212 /* Try harder, since this may have been a sighandler, thus
1213 * curstash may be meaningless. */
491527d0
GS
1214 && (SvTYPE(sv) != SVt_PVCV || CvSTASH((CV*)sv) != debstash)
1215 && !(flags & G_NODEBUG))
6e72f9df 1216 op->op_private |= OPpENTERSUB_DB;
a0d0e21e
LW
1217
1218 if (flags & G_EVAL) {
a0d0e21e
LW
1219 cLOGOP->op_other = op;
1220 markstack_ptr--;
4633a7c4
LW
1221 /* we're trying to emulate pp_entertry() here */
1222 {
c09156bb 1223 register PERL_CONTEXT *cx;
54310121 1224 I32 gimme = GIMME_V;
4633a7c4
LW
1225
1226 ENTER;
1227 SAVETMPS;
1228
1229 push_return(op->op_next);
1230 PUSHBLOCK(cx, CXt_EVAL, stack_sp);
1231 PUSHEVAL(cx, 0, 0);
1232 eval_root = op; /* Only needed so that goto works right. */
1233
1234 in_eval = 1;
1235 if (flags & G_KEEPERR)
1236 in_eval |= 4;
1237 else
38a03e6e 1238 sv_setpv(ERRSV,"");
4633a7c4 1239 }
a0d0e21e
LW
1240 markstack_ptr++;
1241
22921e25
CS
1242 JMPENV_PUSH(ret);
1243 switch (ret) {
a0d0e21e
LW
1244 case 0:
1245 break;
1246 case 1:
f86702cc 1247 STATUS_ALL_FAILURE;
a0d0e21e
LW
1248 /* FALL THROUGH */
1249 case 2:
1250 /* my_exit() was called */
1251 curstash = defstash;
1252 FREETMPS;
54310121 1253 JMPENV_POP;
a0d0e21e
LW
1254 if (statusvalue)
1255 croak("Callback called exit");
f86702cc 1256 my_exit_jump();
a0d0e21e
LW
1257 /* NOTREACHED */
1258 case 3:
1259 if (restartop) {
1260 op = restartop;
1261 restartop = 0;
54310121 1262 break;
a0d0e21e
LW
1263 }
1264 stack_sp = stack_base + oldmark;
1265 if (flags & G_ARRAY)
1266 retval = 0;
1267 else {
1268 retval = 1;
1269 *++stack_sp = &sv_undef;
1270 }
1271 goto cleanup;
1272 }
1273 }
1e422769 1274 else
54310121 1275 CATCH_SET(TRUE);
a0d0e21e
LW
1276
1277 if (op == (OP*)&myop)
11343788 1278 op = pp_entersub(ARGS);
a0d0e21e 1279 if (op)
ab821d7f 1280 runops();
a0d0e21e 1281 retval = stack_sp - (stack_base + oldmark);
4633a7c4 1282 if ((flags & G_EVAL) && !(flags & G_KEEPERR))
38a03e6e 1283 sv_setpv(ERRSV,"");
a0d0e21e
LW
1284
1285 cleanup:
1286 if (flags & G_EVAL) {
1287 if (scopestack_ix > oldscope) {
a0a2876f
LW
1288 SV **newsp;
1289 PMOP *newpm;
1290 I32 gimme;
c09156bb 1291 register PERL_CONTEXT *cx;
a0a2876f
LW
1292 I32 optype;
1293
1294 POPBLOCK(cx,newpm);
1295 POPEVAL(cx);
1296 pop_return();
1297 curpm = newpm;
1298 LEAVE;
a0d0e21e 1299 }
54310121 1300 JMPENV_POP;
a0d0e21e 1301 }
1e422769 1302 else
54310121 1303 CATCH_SET(oldcatch);
1e422769 1304
a0d0e21e
LW
1305 if (flags & G_DISCARD) {
1306 stack_sp = stack_base + oldmark;
1307 retval = 0;
1308 FREETMPS;
1309 LEAVE;
1310 }
d6602a8c 1311 op = oldop;
a0d0e21e
LW
1312 return retval;
1313}
1314
6e72f9df 1315/* Eval a string. The G_EVAL flag is always assumed. */
8990e307 1316
a0d0e21e 1317I32
8ac85365
NIS
1318perl_eval_sv(SV *sv, I32 flags)
1319
1320 /* See G_* flags in cop.h */
a0d0e21e 1321{
924508f0 1322 dSP;
a0d0e21e 1323 UNOP myop; /* fake syntax tree node */
924508f0 1324 I32 oldmark = SP - stack_base;
4633a7c4 1325 I32 retval;
4633a7c4 1326 I32 oldscope;
54310121 1327 dJMPENV;
22921e25 1328 int ret;
84902520
TB
1329 OP* oldop = op;
1330
4633a7c4
LW
1331 if (flags & G_DISCARD) {
1332 ENTER;
1333 SAVETMPS;
1334 }
1335
462e5cf6 1336 SAVEOP();
79072805 1337 op = (OP*)&myop;
a0d0e21e 1338 Zero(op, 1, UNOP);
4633a7c4
LW
1339 EXTEND(stack_sp, 1);
1340 *++stack_sp = sv;
1341 oldscope = scopestack_ix;
79072805 1342
4633a7c4
LW
1343 if (!(flags & G_NOARGS))
1344 myop.op_flags = OPf_STACKED;
79072805 1345 myop.op_next = Nullop;
6e72f9df 1346 myop.op_type = OP_ENTEREVAL;
54310121 1347 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1348 (flags & G_ARRAY) ? OPf_WANT_LIST :
1349 OPf_WANT_SCALAR);
6e72f9df 1350 if (flags & G_KEEPERR)
1351 myop.op_flags |= OPf_SPECIAL;
4633a7c4 1352
22921e25
CS
1353 JMPENV_PUSH(ret);
1354 switch (ret) {
4633a7c4
LW
1355 case 0:
1356 break;
1357 case 1:
f86702cc 1358 STATUS_ALL_FAILURE;
4633a7c4
LW
1359 /* FALL THROUGH */
1360 case 2:
1361 /* my_exit() was called */
1362 curstash = defstash;
1363 FREETMPS;
54310121 1364 JMPENV_POP;
4633a7c4
LW
1365 if (statusvalue)
1366 croak("Callback called exit");
f86702cc 1367 my_exit_jump();
4633a7c4
LW
1368 /* NOTREACHED */
1369 case 3:
1370 if (restartop) {
1371 op = restartop;
1372 restartop = 0;
54310121 1373 break;
4633a7c4
LW
1374 }
1375 stack_sp = stack_base + oldmark;
1376 if (flags & G_ARRAY)
1377 retval = 0;
1378 else {
1379 retval = 1;
1380 *++stack_sp = &sv_undef;
1381 }
1382 goto cleanup;
1383 }
1384
1385 if (op == (OP*)&myop)
11343788 1386 op = pp_entereval(ARGS);
4633a7c4 1387 if (op)
ab821d7f 1388 runops();
4633a7c4 1389 retval = stack_sp - (stack_base + oldmark);
6e72f9df 1390 if (!(flags & G_KEEPERR))
38a03e6e 1391 sv_setpv(ERRSV,"");
4633a7c4
LW
1392
1393 cleanup:
54310121 1394 JMPENV_POP;
4633a7c4
LW
1395 if (flags & G_DISCARD) {
1396 stack_sp = stack_base + oldmark;
1397 retval = 0;
1398 FREETMPS;
1399 LEAVE;
1400 }
84902520 1401 op = oldop;
4633a7c4
LW
1402 return retval;
1403}
1404
137443ea 1405SV*
8ac85365 1406perl_eval_pv(char *p, I32 croak_on_error)
137443ea 1407{
1408 dSP;
1409 SV* sv = newSVpv(p, 0);
1410
924508f0 1411 PUSHMARK(SP);
137443ea 1412 perl_eval_sv(sv, G_SCALAR);
1413 SvREFCNT_dec(sv);
1414
1415 SPAGAIN;
1416 sv = POPs;
1417 PUTBACK;
1418
38a03e6e
MB
1419 if (croak_on_error && SvTRUE(ERRSV))
1420 croak(SvPVx(ERRSV, na));
137443ea 1421
1422 return sv;
1423}
1424
4633a7c4
LW
1425/* Require a module. */
1426
1427void
8ac85365 1428perl_require_pv(char *pv)
4633a7c4
LW
1429{
1430 SV* sv = sv_newmortal();
1431 sv_setpv(sv, "require '");
1432 sv_catpv(sv, pv);
1433 sv_catpv(sv, "'");
1434 perl_eval_sv(sv, G_DISCARD);
79072805
LW
1435}
1436
79072805 1437void
8ac85365 1438magicname(char *sym, char *name, I32 namlen)
79072805
LW
1439{
1440 register GV *gv;
1441
85e6fe83 1442 if (gv = gv_fetchpv(sym,TRUE, SVt_PV))
79072805
LW
1443 sv_magic(GvSV(gv), (SV*)gv, 0, name, namlen);
1444}
1445
ab821d7f 1446static void
8ac85365
NIS
1447usage(char *name) /* XXX move this out into a module ? */
1448
4633a7c4 1449{
ab821d7f 1450 /* This message really ought to be max 23 lines.
1451 * Removed -h because the user already knows that opton. Others? */
fb73857a 1452
1453 static char *usage[] = {
1454"-0[octal] specify record separator (\\0, if no argument)",
1455"-a autosplit mode with -n or -p (splits $_ into @F)",
1456"-c check syntax only (runs BEGIN and END blocks)",
1457"-d[:debugger] run scripts under debugger",
1458"-D[number/list] set debugging flags (argument is a bit mask or flags)",
1459"-e 'command' one line of script. Several -e's allowed. Omit [programfile].",
1460"-F/pattern/ split() pattern for autosplit (-a). The //'s are optional.",
1461"-i[extension] edit <> files in place (make backup if extension supplied)",
1462"-Idirectory specify @INC/#include directory (may be used more than once)",
1463"-l[octal] enable line ending processing, specifies line terminator",
1464"-[mM][-]module.. executes `use/no module...' before executing your script.",
1465"-n assume 'while (<>) { ... }' loop around your script",
1466"-p assume loop like -n but print line also like sed",
1467"-P run script through C preprocessor before compilation",
1468"-s enable some switch parsing for switches after script name",
1469"-S look for the script using PATH environment variable",
1470"-T turn on tainting checks",
1471"-u dump core after parsing script",
1472"-U allow unsafe operations",
95103687 1473"-v print version number, patchlevel plus VERY IMPORTANT perl info",
fb73857a 1474"-V[:variable] print perl configuration information",
1475"-w TURN WARNINGS ON FOR COMPILATION OF YOUR SCRIPT. Recommended.",
1476"-x[directory] strip off text before #!perl line and perhaps cd to directory",
1477"\n",
1478NULL
1479};
1480 char **p = usage;
1481
ab821d7f 1482 printf("\nUsage: %s [switches] [--] [programfile] [arguments]", name);
fb73857a 1483 while (*p)
1484 printf("\n %s", *p++);
4633a7c4
LW
1485}
1486
79072805
LW
1487/* This routine handles any switches that can be given during run */
1488
1489char *
8ac85365 1490moreswitches(char *s)
79072805
LW
1491{
1492 I32 numlen;
c07a80fd 1493 U32 rschar;
79072805
LW
1494
1495 switch (*s) {
1496 case '0':
a863c7d1
MB
1497 {
1498 dTHR;
c07a80fd 1499 rschar = scan_oct(s, 4, &numlen);
1500 SvREFCNT_dec(nrs);
1501 if (rschar & ~((U8)~0))
1502 nrs = &sv_undef;
1503 else if (!rschar && numlen >= 2)
1504 nrs = newSVpv("", 0);
1505 else {
1506 char ch = rschar;
1507 nrs = newSVpv(&ch, 1);
79072805
LW
1508 }
1509 return s + numlen;
a863c7d1 1510 }
2304df62
AD
1511 case 'F':
1512 minus_F = TRUE;
a0d0e21e 1513 splitstr = savepv(s + 1);
2304df62
AD
1514 s += strlen(s);
1515 return s;
79072805
LW
1516 case 'a':
1517 minus_a = TRUE;
1518 s++;
1519 return s;
1520 case 'c':
1521 minus_c = TRUE;
1522 s++;
1523 return s;
1524 case 'd':
bbce6d69 1525 forbid_setid("-d");
4633a7c4 1526 s++;
c07a80fd 1527 if (*s == ':' || *s == '=') {
46fc3d4c 1528 my_setenv("PERL5DB", form("use Devel::%s;", ++s));
4633a7c4 1529 s += strlen(s);
4633a7c4 1530 }
a0d0e21e 1531 if (!perldb) {
84902520 1532 perldb = PERLDB_ALL;
a0d0e21e
LW
1533 init_debugger();
1534 }
79072805
LW
1535 return s;
1536 case 'D':
1537#ifdef DEBUGGING
bbce6d69 1538 forbid_setid("-D");
79072805 1539 if (isALPHA(s[1])) {
8990e307 1540 static char debopts[] = "psltocPmfrxuLHXD";
79072805
LW
1541 char *d;
1542
93a17b20 1543 for (s++; *s && (d = strchr(debopts,*s)); s++)
79072805
LW
1544 debug |= 1 << (d - debopts);
1545 }
1546 else {
1547 debug = atoi(s+1);
1548 for (s++; isDIGIT(*s); s++) ;
1549 }
8990e307 1550 debug |= 0x80000000;
79072805
LW
1551#else
1552 warn("Recompile perl with -DDEBUGGING to use -D switch\n");
a0d0e21e 1553 for (s++; isALNUM(*s); s++) ;
79072805
LW
1554#endif
1555 /*SUPPRESS 530*/
1556 return s;
4633a7c4
LW
1557 case 'h':
1558 usage(origargv[0]);
3028581b 1559 PerlProc_exit(0);
79072805
LW
1560 case 'i':
1561 if (inplace)
1562 Safefree(inplace);
a0d0e21e 1563 inplace = savepv(s+1);
79072805
LW
1564 /*SUPPRESS 530*/
1565 for (s = inplace; *s && !isSPACE(*s); s++) ;
7b8d334a 1566 if (*s) {
fb73857a 1567 *s++ = '\0';
7b8d334a
GS
1568 if (*s == '-') /* Additional switches on #! line. */
1569 s++;
1570 }
fb73857a 1571 return s;
1572 case 'I': /* -I handled both here and in parse_perl() */
bbce6d69 1573 forbid_setid("-I");
fb73857a 1574 ++s;
1575 while (*s && isSPACE(*s))
1576 ++s;
1577 if (*s) {
774d564b 1578 char *e, *p;
748a9306 1579 for (e = s; *e && !isSPACE(*e); e++) ;
774d564b 1580 p = savepvn(s, e-s);
1581 incpush(p, TRUE);
1582 Safefree(p);
fb73857a 1583 s = e;
79072805
LW
1584 }
1585 else
463ee0b2 1586 croak("No space allowed after -I");
fb73857a 1587 return s;
79072805
LW
1588 case 'l':
1589 minus_l = TRUE;
1590 s++;
a0d0e21e
LW
1591 if (ors)
1592 Safefree(ors);
79072805 1593 if (isDIGIT(*s)) {
a0d0e21e 1594 ors = savepv("\n");
79072805
LW
1595 orslen = 1;
1596 *ors = scan_oct(s, 3 + (*s == '0'), &numlen);
1597 s += numlen;
1598 }
1599 else {
a863c7d1 1600 dTHR;
c07a80fd 1601 if (RsPARA(nrs)) {
6e72f9df 1602 ors = "\n\n";
c07a80fd 1603 orslen = 2;
1604 }
1605 else
1606 ors = SvPV(nrs, orslen);
6e72f9df 1607 ors = savepvn(ors, orslen);
79072805
LW
1608 }
1609 return s;
1a30305b 1610 case 'M':
bbce6d69 1611 forbid_setid("-M"); /* XXX ? */
1a30305b 1612 /* FALL THROUGH */
1613 case 'm':
bbce6d69 1614 forbid_setid("-m"); /* XXX ? */
1a30305b 1615 if (*++s) {
a5f75d66 1616 char *start;
11343788 1617 SV *sv;
a5f75d66
AD
1618 char *use = "use ";
1619 /* -M-foo == 'no foo' */
1620 if (*s == '-') { use = "no "; ++s; }
11343788 1621 sv = newSVpv(use,0);
a5f75d66 1622 start = s;
1a30305b 1623 /* We allow -M'Module qw(Foo Bar)' */
c07a80fd 1624 while(isALNUM(*s) || *s==':') ++s;
1625 if (*s != '=') {
11343788 1626 sv_catpv(sv, start);
c07a80fd 1627 if (*(start-1) == 'm') {
1628 if (*s != '\0')
1629 croak("Can't use '%c' after -mname", *s);
11343788 1630 sv_catpv( sv, " ()");
c07a80fd 1631 }
1632 } else {
11343788
MB
1633 sv_catpvn(sv, start, s-start);
1634 sv_catpv(sv, " split(/,/,q{");
1635 sv_catpv(sv, ++s);
1636 sv_catpv(sv, "})");
c07a80fd 1637 }
1a30305b 1638 s += strlen(s);
c07a80fd 1639 if (preambleav == NULL)
1640 preambleav = newAV();
11343788 1641 av_push(preambleav, sv);
1a30305b 1642 }
1643 else
1644 croak("No space allowed after -%c", *(s-1));
1645 return s;
79072805
LW
1646 case 'n':
1647 minus_n = TRUE;
1648 s++;
1649 return s;
1650 case 'p':
1651 minus_p = TRUE;
1652 s++;
1653 return s;
1654 case 's':
bbce6d69 1655 forbid_setid("-s");
79072805
LW
1656 doswitches = TRUE;
1657 s++;
1658 return s;
463ee0b2 1659 case 'T':
f86702cc 1660 if (!tainting)
9607fc9c 1661 croak("Too late for \"-T\" option");
463ee0b2
LW
1662 s++;
1663 return s;
79072805
LW
1664 case 'u':
1665 do_undump = TRUE;
1666 s++;
1667 return s;
1668 case 'U':
1669 unsafe = TRUE;
1670 s++;
1671 return s;
1672 case 'v':
a5f75d66 1673#if defined(SUBVERSION) && SUBVERSION > 0
fb73857a 1674 printf("\nThis is perl, version 5.%03d_%02d built for %s",
1675 PATCHLEVEL, SUBVERSION, ARCHNAME);
a5f75d66 1676#else
fb73857a 1677 printf("\nThis is perl, version %s built for %s",
1678 patchlevel, ARCHNAME);
1679#endif
1680#if defined(LOCAL_PATCH_COUNT)
1681 if (LOCAL_PATCH_COUNT > 0)
1682 printf("\n(with %d registered patch%s, see perl -V for more detail)",
1683 LOCAL_PATCH_COUNT, (LOCAL_PATCH_COUNT!=1) ? "es" : "");
a5f75d66 1684#endif
1a30305b 1685
a411490c 1686 printf("\n\nCopyright 1987-1998, Larry Wall\n");
79072805 1687#ifdef MSDOS
fb73857a 1688 printf("\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
55497cff 1689#endif
1690#ifdef DJGPP
1691 printf("djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n");
9731c6ca 1692 printf("djgpp v2 port (perl5004+) by Laszlo Molnar, 1997-1998\n");
4633a7c4 1693#endif
79072805 1694#ifdef OS2
5dd60ef7 1695 printf("\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
a411490c 1696 "Version 5 port Copyright (c) 1994-1998, Andreas Kaiser, Ilya Zakharevich\n");
79072805 1697#endif
79072805 1698#ifdef atarist
760ac839 1699 printf("atariST series port, ++jrb bammi@cadence.com\n");
79072805 1700#endif
760ac839 1701 printf("\n\
79072805 1702Perl may be copied only under the terms of either the Artistic License or the\n\
95103687
GS
1703GNU General Public License, which may be found in the Perl 5.0 source kit.\n\n\
1704Complete documentation for Perl, including FAQ lists, should be found on\n\
1705this system using `man perl' or `perldoc perl'. If you have access to the\n\
1706Internet, point your browser at http://www.perl.com/, the Perl Home Page.\n\n");
3028581b 1707 PerlProc_exit(0);
79072805
LW
1708 case 'w':
1709 dowarn = TRUE;
1710 s++;
1711 return s;
a0d0e21e 1712 case '*':
79072805
LW
1713 case ' ':
1714 if (s[1] == '-') /* Additional switches on #! line. */
1715 return s+2;
1716 break;
a0d0e21e 1717 case '-':
79072805 1718 case 0:
a868473f
NIS
1719#ifdef WIN32
1720 case '\r':
1721#endif
79072805
LW
1722 case '\n':
1723 case '\t':
1724 break;
aa689395 1725#ifdef ALTERNATE_SHEBANG
1726 case 'S': /* OS/2 needs -S on "extproc" line. */
1727 break;
1728#endif
a0d0e21e
LW
1729 case 'P':
1730 if (preprocess)
1731 return s+1;
1732 /* FALL THROUGH */
79072805 1733 default:
a0d0e21e 1734 croak("Can't emulate -%.1s on #! line",s);
79072805
LW
1735 }
1736 return Nullch;
1737}
1738
1739/* compliments of Tom Christiansen */
1740
1741/* unexec() can be found in the Gnu emacs distribution */
1742
1743void
8ac85365 1744my_unexec(void)
79072805
LW
1745{
1746#ifdef UNEXEC
46fc3d4c 1747 SV* prog;
1748 SV* file;
79072805
LW
1749 int status;
1750 extern int etext;
1751
46fc3d4c 1752 prog = newSVpv(BIN_EXP);
1753 sv_catpv(prog, "/perl");
1754 file = newSVpv(origfilename);
1755 sv_catpv(file, ".perldump");
79072805 1756
46fc3d4c 1757 status = unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
79072805 1758 if (status)
46fc3d4c 1759 PerlIO_printf(PerlIO_stderr(), "unexec of %s into %s failed!\n",
1760 SvPVX(prog), SvPVX(file));
3028581b 1761 PerlProc_exit(status);
79072805 1762#else
a5f75d66
AD
1763# ifdef VMS
1764# include <lib$routines.h>
1765 lib$signal(SS$_DEBUG); /* ssdef.h #included from vmsish.h */
aa689395 1766# else
79072805 1767 ABORT(); /* for use with undump */
aa689395 1768# endif
a5f75d66 1769#endif
79072805
LW
1770}
1771
1772static void
8ac85365 1773init_main_stash(void)
79072805 1774{
11343788 1775 dTHR;
463ee0b2 1776 GV *gv;
6e72f9df 1777
1778 /* Note that strtab is a rather special HV. Assumptions are made
1779 about not iterating on it, and not adding tie magic to it.
1780 It is properly deallocated in perl_destruct() */
1781 strtab = newHV();
1782 HvSHAREKEYS_off(strtab); /* mandatory */
1783 Newz(506,((XPVHV*)SvANY(strtab))->xhv_array,
1784 sizeof(HE*) * (((XPVHV*)SvANY(strtab))->xhv_max + 1), char);
1785
463ee0b2 1786 curstash = defstash = newHV();
79072805 1787 curstname = newSVpv("main",4);
adbc6bb1
LW
1788 gv = gv_fetchpv("main::",TRUE, SVt_PVHV);
1789 SvREFCNT_dec(GvHV(gv));
1790 GvHV(gv) = (HV*)SvREFCNT_inc(defstash);
463ee0b2 1791 SvREADONLY_on(gv);
a0d0e21e 1792 HvNAME(defstash) = savepv("main");
85e6fe83 1793 incgv = gv_HVadd(gv_AVadd(gv_fetchpv("INC",TRUE, SVt_PVAV)));
a5f75d66 1794 GvMULTI_on(incgv);
a0d0e21e 1795 defgv = gv_fetchpv("_",TRUE, SVt_PVAV);
12f917ad
MB
1796 errgv = gv_HVadd(gv_fetchpv("@", TRUE, SVt_PV));
1797 GvMULTI_on(errgv);
84902520 1798 (void)form("%240s",""); /* Preallocate temp - for immediate signals. */
38a03e6e
MB
1799 sv_grow(ERRSV, 240); /* Preallocate - for immediate signals. */
1800 sv_setpvn(ERRSV, "", 0);
8990e307
LW
1801 curstash = defstash;
1802 compiling.cop_stash = defstash;
adbc6bb1 1803 debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
49dc05e3 1804 globalstash = GvHV(gv_fetchpv("CORE::GLOBAL::", GV_ADDMULTI, SVt_PVHV));
4633a7c4
LW
1805 /* We must init $/ before switches are processed. */
1806 sv_setpvn(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), "\n", 1);
79072805
LW
1807}
1808
a0d0e21e
LW
1809static void
1810open_script(char *scriptname, bool dosearch, SV *sv)
79072805 1811{
0f15f207 1812 dTHR;
79072805 1813 register char *s;
2a92aaa0 1814
491527d0 1815 scriptname = find_script(scriptname, dosearch, NULL, 0);
79072805 1816
96436eeb 1817 if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
1818 char *s = scriptname + 8;
1819 fdscript = atoi(s);
1820 while (isDIGIT(*s))
1821 s++;
1822 if (*s)
1823 scriptname = s + 1;
1824 }
1825 else
1826 fdscript = -1;
ab821d7f 1827 origfilename = savepv(e_tmpname ? "-e" : scriptname);
79072805
LW
1828 curcop->cop_filegv = gv_fetchfile(origfilename);
1829 if (strEQ(origfilename,"-"))
1830 scriptname = "";
96436eeb 1831 if (fdscript >= 0) {
a868473f 1832 rsfp = PerlIO_fdopen(fdscript,PERL_SCRIPT_MODE);
96436eeb 1833#if defined(HAS_FCNTL) && defined(F_SETFD)
7aa04957
CS
1834 if (rsfp)
1835 fcntl(PerlIO_fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
96436eeb 1836#endif
1837 }
1838 else if (preprocess) {
46fc3d4c 1839 char *cpp_cfg = CPPSTDIN;
1840 SV *cpp = NEWSV(0,0);
1841 SV *cmd = NEWSV(0,0);
1842
1843 if (strEQ(cpp_cfg, "cppstdin"))
1844 sv_catpvf(cpp, "%s/", BIN_EXP);
1845 sv_catpv(cpp, cpp_cfg);
79072805 1846
79072805 1847 sv_catpv(sv,"-I");
fed7345c 1848 sv_catpv(sv,PRIVLIB_EXP);
46fc3d4c 1849
79072805 1850#ifdef MSDOS
46fc3d4c 1851 sv_setpvf(cmd, "\
79072805
LW
1852sed %s -e \"/^[^#]/b\" \
1853 -e \"/^#[ ]*include[ ]/b\" \
1854 -e \"/^#[ ]*define[ ]/b\" \
1855 -e \"/^#[ ]*if[ ]/b\" \
1856 -e \"/^#[ ]*ifdef[ ]/b\" \
1857 -e \"/^#[ ]*ifndef[ ]/b\" \
1858 -e \"/^#[ ]*else/b\" \
1859 -e \"/^#[ ]*elif[ ]/b\" \
1860 -e \"/^#[ ]*undef[ ]/b\" \
1861 -e \"/^#[ ]*endif/b\" \
1862 -e \"s/^#.*//\" \
fc36a67e 1863 %s | %_ -C %_ %s",
79072805
LW
1864 (doextract ? "-e \"1,/^#/d\n\"" : ""),
1865#else
46fc3d4c 1866 sv_setpvf(cmd, "\
79072805
LW
1867%s %s -e '/^[^#]/b' \
1868 -e '/^#[ ]*include[ ]/b' \
1869 -e '/^#[ ]*define[ ]/b' \
1870 -e '/^#[ ]*if[ ]/b' \
1871 -e '/^#[ ]*ifdef[ ]/b' \
1872 -e '/^#[ ]*ifndef[ ]/b' \
1873 -e '/^#[ ]*else/b' \
1874 -e '/^#[ ]*elif[ ]/b' \
1875 -e '/^#[ ]*undef[ ]/b' \
1876 -e '/^#[ ]*endif/b' \
1877 -e 's/^[ ]*#.*//' \
fc36a67e 1878 %s | %_ -C %_ %s",
79072805
LW
1879#ifdef LOC_SED
1880 LOC_SED,
1881#else
1882 "sed",
1883#endif
1884 (doextract ? "-e '1,/^#/d\n'" : ""),
1885#endif
46fc3d4c 1886 scriptname, cpp, sv, CPPMINUS);
79072805
LW
1887 doextract = FALSE;
1888#ifdef IAMSUID /* actually, this is caught earlier */
1889 if (euid != uid && !euid) { /* if running suidperl */
1890#ifdef HAS_SETEUID
1891 (void)seteuid(uid); /* musn't stay setuid root */
1892#else
1893#ifdef HAS_SETREUID
85e6fe83
LW
1894 (void)setreuid((Uid_t)-1, uid);
1895#else
1896#ifdef HAS_SETRESUID
1897 (void)setresuid((Uid_t)-1, uid, (Uid_t)-1);
79072805
LW
1898#else
1899 setuid(uid);
1900#endif
1901#endif
85e6fe83 1902#endif
79072805 1903 if (geteuid() != uid)
463ee0b2 1904 croak("Can't do seteuid!\n");
79072805
LW
1905 }
1906#endif /* IAMSUID */
3028581b 1907 rsfp = PerlProc_popen(SvPVX(cmd), "r");
46fc3d4c 1908 SvREFCNT_dec(cmd);
1909 SvREFCNT_dec(cpp);
79072805
LW
1910 }
1911 else if (!*scriptname) {
bbce6d69 1912 forbid_setid("program input from stdin");
760ac839 1913 rsfp = PerlIO_stdin();
79072805 1914 }
96436eeb 1915 else {
a868473f 1916 rsfp = PerlIO_open(scriptname,PERL_SCRIPT_MODE);
96436eeb 1917#if defined(HAS_FCNTL) && defined(F_SETFD)
7aa04957
CS
1918 if (rsfp)
1919 fcntl(PerlIO_fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
96436eeb 1920#endif
1921 }
5dd60ef7 1922 if (e_tmpname) {
1923 e_fp = rsfp;
1924 }
7aa04957 1925 if (!rsfp) {
13281fa4 1926#ifdef DOSUID
a687059c 1927#ifndef IAMSUID /* in case script is not readable before setuid */
c6ed36e1 1928 if (euid && PerlLIO_stat(SvPVX(GvSV(curcop->cop_filegv)),&statbuf) >= 0 &&
13281fa4 1929 statbuf.st_mode & (S_ISUID|S_ISGID)) {
46fc3d4c 1930 /* try again */
3028581b 1931 PerlProc_execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
463ee0b2 1932 croak("Can't do setuid\n");
13281fa4
LW
1933 }
1934#endif
1935#endif
463ee0b2 1936 croak("Can't open perl script \"%s\": %s\n",
2304df62 1937 SvPVX(GvSV(curcop->cop_filegv)), Strerror(errno));
13281fa4 1938 }
79072805 1939}
8d063cd8 1940
79072805 1941static void
8ac85365 1942validate_suid(char *validarg, char *scriptname)
79072805 1943{
96436eeb 1944 int which;
1945
13281fa4
LW
1946 /* do we need to emulate setuid on scripts? */
1947
1948 /* This code is for those BSD systems that have setuid #! scripts disabled
1949 * in the kernel because of a security problem. Merely defining DOSUID
1950 * in perl will not fix that problem, but if you have disabled setuid
1951 * scripts in the kernel, this will attempt to emulate setuid and setgid
1952 * on scripts that have those now-otherwise-useless bits set. The setuid
27e2fb84
LW
1953 * root version must be called suidperl or sperlN.NNN. If regular perl
1954 * discovers that it has opened a setuid script, it calls suidperl with
1955 * the same argv that it had. If suidperl finds that the script it has
1956 * just opened is NOT setuid root, it sets the effective uid back to the
1957 * uid. We don't just make perl setuid root because that loses the
1958 * effective uid we had before invoking perl, if it was different from the
1959 * uid.
13281fa4
LW
1960 *
1961 * DOSUID must be defined in both perl and suidperl, and IAMSUID must
1962 * be defined in suidperl only. suidperl must be setuid root. The
1963 * Configure script will set this up for you if you want it.
1964 */
a687059c 1965
13281fa4 1966#ifdef DOSUID
ea0efc06 1967 dTHR;
6e72f9df 1968 char *s, *s2;
a0d0e21e 1969
3028581b 1970 if (PerlLIO_fstat(PerlIO_fileno(rsfp),&statbuf) < 0) /* normal stat is insecure */
463ee0b2 1971 croak("Can't stat script \"%s\"",origfilename);
96436eeb 1972 if (fdscript < 0 && statbuf.st_mode & (S_ISUID|S_ISGID)) {
79072805 1973 I32 len;
13281fa4 1974
a687059c 1975#ifdef IAMSUID
fe14fcc3 1976#ifndef HAS_SETREUID
a687059c
LW
1977 /* On this access check to make sure the directories are readable,
1978 * there is actually a small window that the user could use to make
1979 * filename point to an accessible directory. So there is a faint
1980 * chance that someone could execute a setuid script down in a
1981 * non-accessible directory. I don't know what to do about that.
1982 * But I don't think it's too important. The manual lies when
1983 * it says access() is useful in setuid programs.
1984 */
3028581b 1985 if (PerlLIO_access(SvPVX(GvSV(curcop->cop_filegv)),1)) /*double check*/
463ee0b2 1986 croak("Permission denied");
a687059c
LW
1987#else
1988 /* If we can swap euid and uid, then we can determine access rights
1989 * with a simple stat of the file, and then compare device and
1990 * inode to make sure we did stat() on the same file we opened.
1991 * Then we just have to make sure he or she can execute it.
1992 */
1993 {
1994 struct stat tmpstatbuf;
1995
85e6fe83
LW
1996 if (
1997#ifdef HAS_SETREUID
1998 setreuid(euid,uid) < 0
a0d0e21e
LW
1999#else
2000# if HAS_SETRESUID
85e6fe83 2001 setresuid(euid,uid,(Uid_t)-1) < 0
a0d0e21e 2002# endif
85e6fe83
LW
2003#endif
2004 || getuid() != euid || geteuid() != uid)
463ee0b2 2005 croak("Can't swap uid and euid"); /* really paranoid */
c6ed36e1 2006 if (PerlLIO_stat(SvPVX(GvSV(curcop->cop_filegv)),&tmpstatbuf) < 0)
463ee0b2 2007 croak("Permission denied"); /* testing full pathname here */
a687059c
LW
2008 if (tmpstatbuf.st_dev != statbuf.st_dev ||
2009 tmpstatbuf.st_ino != statbuf.st_ino) {
760ac839 2010 (void)PerlIO_close(rsfp);
3028581b 2011 if (rsfp = PerlProc_popen("/bin/mail root","w")) { /* heh, heh */
760ac839 2012 PerlIO_printf(rsfp,
ff0cee69 2013"User %ld tried to run dev %ld ino %ld in place of dev %ld ino %ld!\n\
2014(Filename of set-id script was %s, uid %ld gid %ld.)\n\nSincerely,\nperl\n",
2015 (long)uid,(long)tmpstatbuf.st_dev, (long)tmpstatbuf.st_ino,
2016 (long)statbuf.st_dev, (long)statbuf.st_ino,
463ee0b2 2017 SvPVX(GvSV(curcop->cop_filegv)),
ff0cee69 2018 (long)statbuf.st_uid, (long)statbuf.st_gid);
3028581b 2019 (void)PerlProc_pclose(rsfp);
a687059c 2020 }
463ee0b2 2021 croak("Permission denied\n");
a687059c 2022 }
85e6fe83
LW
2023 if (
2024#ifdef HAS_SETREUID
2025 setreuid(uid,euid) < 0
a0d0e21e
LW
2026#else
2027# if defined(HAS_SETRESUID)
85e6fe83 2028 setresuid(uid,euid,(Uid_t)-1) < 0
a0d0e21e 2029# endif
85e6fe83
LW
2030#endif
2031 || getuid() != uid || geteuid() != euid)
463ee0b2 2032 croak("Can't reswap uid and euid");
27e2fb84 2033 if (!cando(S_IXUSR,FALSE,&statbuf)) /* can real uid exec? */
463ee0b2 2034 croak("Permission denied\n");
a687059c 2035 }
fe14fcc3 2036#endif /* HAS_SETREUID */
a687059c
LW
2037#endif /* IAMSUID */
2038
27e2fb84 2039 if (!S_ISREG(statbuf.st_mode))
463ee0b2 2040 croak("Permission denied");
27e2fb84 2041 if (statbuf.st_mode & S_IWOTH)
463ee0b2 2042 croak("Setuid/gid script is writable by world");
13281fa4 2043 doswitches = FALSE; /* -s is insecure in suid */
79072805 2044 curcop->cop_line++;
760ac839
LW
2045 if (sv_gets(linestr, rsfp, 0) == Nullch ||
2046 strnNE(SvPV(linestr,na),"#!",2) ) /* required even on Sys V */
463ee0b2 2047 croak("No #! line");
760ac839 2048 s = SvPV(linestr,na)+2;
663a0e37 2049 if (*s == ' ') s++;
45d8adaa 2050 while (!isSPACE(*s)) s++;
760ac839 2051 for (s2 = s; (s2 > SvPV(linestr,na)+2 &&
6e72f9df 2052 (isDIGIT(s2[-1]) || strchr("._-", s2[-1]))); s2--) ;
2053 if (strnNE(s2-4,"perl",4) && strnNE(s-9,"perl",4)) /* sanity check */
463ee0b2 2054 croak("Not a perl script");
a687059c 2055 while (*s == ' ' || *s == '\t') s++;
13281fa4
LW
2056 /*
2057 * #! arg must be what we saw above. They can invoke it by
2058 * mentioning suidperl explicitly, but they may not add any strange
2059 * arguments beyond what #! says if they do invoke suidperl that way.
2060 */
2061 len = strlen(validarg);
2062 if (strEQ(validarg," PHOOEY ") ||
45d8adaa 2063 strnNE(s,validarg,len) || !isSPACE(s[len]))
463ee0b2 2064 croak("Args must match #! line");
a687059c
LW
2065
2066#ifndef IAMSUID
2067 if (euid != uid && (statbuf.st_mode & S_ISUID) &&
2068 euid == statbuf.st_uid)
2069 if (!do_undump)
463ee0b2 2070 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
a687059c
LW
2071FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2072#endif /* IAMSUID */
13281fa4
LW
2073
2074 if (euid) { /* oops, we're not the setuid root perl */
760ac839 2075 (void)PerlIO_close(rsfp);
13281fa4 2076#ifndef IAMSUID
46fc3d4c 2077 /* try again */
3028581b 2078 PerlProc_execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
13281fa4 2079#endif
463ee0b2 2080 croak("Can't do setuid\n");
13281fa4
LW
2081 }
2082
83025b21 2083 if (statbuf.st_mode & S_ISGID && statbuf.st_gid != egid) {
fe14fcc3 2084#ifdef HAS_SETEGID
a687059c
LW
2085 (void)setegid(statbuf.st_gid);
2086#else
fe14fcc3 2087#ifdef HAS_SETREGID
85e6fe83
LW
2088 (void)setregid((Gid_t)-1,statbuf.st_gid);
2089#else
2090#ifdef HAS_SETRESGID
2091 (void)setresgid((Gid_t)-1,statbuf.st_gid,(Gid_t)-1);
a687059c
LW
2092#else
2093 setgid(statbuf.st_gid);
2094#endif
2095#endif
85e6fe83 2096#endif
83025b21 2097 if (getegid() != statbuf.st_gid)
463ee0b2 2098 croak("Can't do setegid!\n");
83025b21 2099 }
a687059c
LW
2100 if (statbuf.st_mode & S_ISUID) {
2101 if (statbuf.st_uid != euid)
fe14fcc3 2102#ifdef HAS_SETEUID
a687059c
LW
2103 (void)seteuid(statbuf.st_uid); /* all that for this */
2104#else
fe14fcc3 2105#ifdef HAS_SETREUID
85e6fe83
LW
2106 (void)setreuid((Uid_t)-1,statbuf.st_uid);
2107#else
2108#ifdef HAS_SETRESUID
2109 (void)setresuid((Uid_t)-1,statbuf.st_uid,(Uid_t)-1);
a687059c
LW
2110#else
2111 setuid(statbuf.st_uid);
2112#endif
2113#endif
85e6fe83 2114#endif
83025b21 2115 if (geteuid() != statbuf.st_uid)
463ee0b2 2116 croak("Can't do seteuid!\n");
a687059c 2117 }
83025b21 2118 else if (uid) { /* oops, mustn't run as root */
fe14fcc3 2119#ifdef HAS_SETEUID
85e6fe83 2120 (void)seteuid((Uid_t)uid);
a687059c 2121#else
fe14fcc3 2122#ifdef HAS_SETREUID
85e6fe83 2123 (void)setreuid((Uid_t)-1,(Uid_t)uid);
a687059c 2124#else
85e6fe83
LW
2125#ifdef HAS_SETRESUID
2126 (void)setresuid((Uid_t)-1,(Uid_t)uid,(Uid_t)-1);
2127#else
2128 setuid((Uid_t)uid);
2129#endif
a687059c
LW
2130#endif
2131#endif
83025b21 2132 if (geteuid() != uid)
463ee0b2 2133 croak("Can't do seteuid!\n");
83025b21 2134 }
748a9306 2135 init_ids();
27e2fb84 2136 if (!cando(S_IXUSR,TRUE,&statbuf))
463ee0b2 2137 croak("Permission denied\n"); /* they can't do this */
13281fa4
LW
2138 }
2139#ifdef IAMSUID
2140 else if (preprocess)
463ee0b2 2141 croak("-P not allowed for setuid/setgid script\n");
96436eeb 2142 else if (fdscript >= 0)
2143 croak("fd script not allowed in suidperl\n");
13281fa4 2144 else
463ee0b2 2145 croak("Script is not setuid/setgid in suidperl\n");
96436eeb 2146
2147 /* We absolutely must clear out any saved ids here, so we */
2148 /* exec the real perl, substituting fd script for scriptname. */
2149 /* (We pass script name as "subdir" of fd, which perl will grok.) */
760ac839 2150 PerlIO_rewind(rsfp);
3028581b 2151 PerlLIO_lseek(PerlIO_fileno(rsfp),(Off_t)0,0); /* just in case rewind didn't */
96436eeb 2152 for (which = 1; origargv[which] && origargv[which] != scriptname; which++) ;
2153 if (!origargv[which])
2154 croak("Permission denied");
46fc3d4c 2155 origargv[which] = savepv(form("/dev/fd/%d/%s",
2156 PerlIO_fileno(rsfp), origargv[which]));
96436eeb 2157#if defined(HAS_FCNTL) && defined(F_SETFD)
760ac839 2158 fcntl(PerlIO_fileno(rsfp),F_SETFD,0); /* ensure no close-on-exec */
96436eeb 2159#endif
3028581b 2160 PerlProc_execv(form("%s/perl%s", BIN_EXP, patchlevel), origargv); /* try again */
96436eeb 2161 croak("Can't do setuid\n");
13281fa4 2162#endif /* IAMSUID */
a687059c 2163#else /* !DOSUID */
a687059c
LW
2164 if (euid != uid || egid != gid) { /* (suidperl doesn't exist, in fact) */
2165#ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
96827780 2166 dTHR;
3028581b 2167 PerlLIO_fstat(PerlIO_fileno(rsfp),&statbuf); /* may be either wrapped or real suid */
a687059c
LW
2168 if ((euid != uid && euid == statbuf.st_uid && statbuf.st_mode & S_ISUID)
2169 ||
2170 (egid != gid && egid == statbuf.st_gid && statbuf.st_mode & S_ISGID)
2171 )
2172 if (!do_undump)
463ee0b2 2173 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
a687059c
LW
2174FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2175#endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
2176 /* not set-id, must be wrapped */
a687059c 2177 }
13281fa4 2178#endif /* DOSUID */
79072805 2179}
13281fa4 2180
79072805 2181static void
8ac85365 2182find_beginning(void)
79072805 2183{
6e72f9df 2184 register char *s, *s2;
33b78306
LW
2185
2186 /* skip forward in input to the real script? */
2187
bbce6d69 2188 forbid_setid("-x");
33b78306 2189 while (doextract) {
79072805 2190 if ((s = sv_gets(linestr, rsfp, 0)) == Nullch)
463ee0b2 2191 croak("No Perl script found in input\n");
6e72f9df 2192 if (*s == '#' && s[1] == '!' && (s = instr(s,"perl"))) {
760ac839 2193 PerlIO_ungetc(rsfp, '\n'); /* to keep line count right */
33b78306 2194 doextract = FALSE;
6e72f9df 2195 while (*s && !(isSPACE (*s) || *s == '#')) s++;
2196 s2 = s;
2197 while (*s == ' ' || *s == '\t') s++;
2198 if (*s++ == '-') {
2199 while (isDIGIT(s2[-1]) || strchr("-._", s2[-1])) s2--;
2200 if (strnEQ(s2-4,"perl",4))
2201 /*SUPPRESS 530*/
2202 while (s = moreswitches(s)) ;
33b78306 2203 }
3028581b 2204 if (cddir && PerlDir_chdir(cddir) < 0)
463ee0b2 2205 croak("Can't chdir to %s",cddir);
83025b21
LW
2206 }
2207 }
2208}
2209
79072805 2210static void
8ac85365 2211init_ids(void)
352d5a3a 2212{
748a9306
LW
2213 uid = (int)getuid();
2214 euid = (int)geteuid();
2215 gid = (int)getgid();
2216 egid = (int)getegid();
2217#ifdef VMS
2218 uid |= gid << 16;
2219 euid |= egid << 16;
2220#endif
4633a7c4 2221 tainting |= (uid && (euid != uid || egid != gid));
748a9306 2222}
79072805 2223
748a9306 2224static void
8ac85365 2225forbid_setid(char *s)
bbce6d69 2226{
2227 if (euid != uid)
2228 croak("No %s allowed while running setuid", s);
2229 if (egid != gid)
2230 croak("No %s allowed while running setgid", s);
2231}
2232
2233static void
8ac85365 2234init_debugger(void)
748a9306 2235{
11343788 2236 dTHR;
79072805 2237 curstash = debstash;
748a9306 2238 dbargs = GvAV(gv_AVadd((gv_fetchpv("args", GV_ADDMULTI, SVt_PVAV))));
79072805 2239 AvREAL_off(dbargs);
a0d0e21e
LW
2240 DBgv = gv_fetchpv("DB", GV_ADDMULTI, SVt_PVGV);
2241 DBline = gv_fetchpv("dbline", GV_ADDMULTI, SVt_PVAV);
748a9306
LW
2242 DBsub = gv_HVadd(gv_fetchpv("sub", GV_ADDMULTI, SVt_PVHV));
2243 DBsingle = GvSV((gv_fetchpv("single", GV_ADDMULTI, SVt_PV)));
c07a80fd 2244 sv_setiv(DBsingle, 0);
748a9306 2245 DBtrace = GvSV((gv_fetchpv("trace", GV_ADDMULTI, SVt_PV)));
c07a80fd 2246 sv_setiv(DBtrace, 0);
748a9306 2247 DBsignal = GvSV((gv_fetchpv("signal", GV_ADDMULTI, SVt_PV)));
c07a80fd 2248 sv_setiv(DBsignal, 0);
79072805 2249 curstash = defstash;
352d5a3a
LW
2250}
2251
2ce36478
SM
2252#ifndef STRESS_REALLOC
2253#define REASONABLE(size) (size)
2254#else
2255#define REASONABLE(size) (1) /* unreasonable */
2256#endif
2257
11343788 2258void
8ac85365 2259init_stacks(ARGSproto)
79072805 2260{
e336de0d
GS
2261 /* start with 128-item stack and 8K cxstack */
2262 curstackinfo = new_stackinfo(REASONABLE(128),
2263 REASONABLE(8192/sizeof(PERL_CONTEXT) - 1));
2264 curstackinfo->si_type = SI_MAIN;
2265 curstack = curstackinfo->si_stack;
5f05dabc 2266 mainstack = curstack; /* remember in case we switch stacks */
79072805 2267
6e72f9df 2268 stack_base = AvARRAY(curstack);
79072805 2269 stack_sp = stack_base;
e336de0d 2270 stack_max = stack_base + AvMAX(curstack);
8990e307 2271
2ce36478 2272 New(50,tmps_stack,REASONABLE(128),SV*);
6d4ff0d2 2273 tmps_floor = -1;
8990e307 2274 tmps_ix = -1;
2ce36478 2275 tmps_max = REASONABLE(128);
8990e307 2276
5f05dabc 2277 /*
2278 * The following stacks almost certainly should be per-interpreter,
2279 * but for now they're not. XXX
2280 */
2281
6e72f9df 2282 if (markstack) {
2283 markstack_ptr = markstack;
2284 } else {
2ce36478 2285 New(54,markstack,REASONABLE(32),I32);
6e72f9df 2286 markstack_ptr = markstack;
2ce36478 2287 markstack_max = markstack + REASONABLE(32);
6e72f9df 2288 }
79072805 2289
e336de0d
GS
2290 SET_MARKBASE;
2291
6e72f9df 2292 if (scopestack) {
2293 scopestack_ix = 0;
2294 } else {
2ce36478 2295 New(54,scopestack,REASONABLE(32),I32);
6e72f9df 2296 scopestack_ix = 0;
2ce36478 2297 scopestack_max = REASONABLE(32);
6e72f9df 2298 }
79072805 2299
6e72f9df 2300 if (savestack) {
2301 savestack_ix = 0;
2302 } else {
2ce36478 2303 New(54,savestack,REASONABLE(128),ANY);
6e72f9df 2304 savestack_ix = 0;
2ce36478 2305 savestack_max = REASONABLE(128);
6e72f9df 2306 }
79072805 2307
6e72f9df 2308 if (retstack) {
2309 retstack_ix = 0;
2310 } else {
2ce36478 2311 New(54,retstack,REASONABLE(16),OP*);
6e72f9df 2312 retstack_ix = 0;
2ce36478 2313 retstack_max = REASONABLE(16);
5f05dabc 2314 }
378cc40b 2315}
33b78306 2316
2ce36478
SM
2317#undef REASONABLE
2318
6e72f9df 2319static void
8ac85365 2320nuke_stacks(void)
6e72f9df 2321{
e858de61 2322 dTHR;
e336de0d
GS
2323 while (curstackinfo->si_next)
2324 curstackinfo = curstackinfo->si_next;
2325 while (curstackinfo) {
2326 PERL_SI *p = curstackinfo->si_prev;
bac4b2ad 2327 /* curstackinfo->si_stack got nuked by sv_free_arenas() */
e336de0d
GS
2328 Safefree(curstackinfo->si_cxstack);
2329 Safefree(curstackinfo);
2330 curstackinfo = p;
2331 }
6e72f9df 2332 Safefree(tmps_stack);
5f05dabc 2333 DEBUG( {
2334 Safefree(debname);
2335 Safefree(debdelim);
2336 } )
378cc40b 2337}
33b78306 2338
760ac839 2339static PerlIO *tmpfp; /* moved outside init_lexer() because of UNICOS bug */
7aa04957 2340
79072805 2341static void
8ac85365 2342init_lexer(void)
8990e307 2343{
a0d0e21e 2344 tmpfp = rsfp;
90248788 2345 rsfp = Nullfp;
8990e307
LW
2346 lex_start(linestr);
2347 rsfp = tmpfp;
2348 subname = newSVpv("main",4);
2349}
2350
2351static void
8ac85365 2352init_predump_symbols(void)
45d8adaa 2353{
11343788 2354 dTHR;
93a17b20 2355 GV *tmpgv;
a0d0e21e 2356 GV *othergv;
79072805 2357
e1c148c2 2358 sv_setpvn(perl_get_sv("\"", TRUE), " ", 1);
85e6fe83 2359 stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
a5f75d66 2360 GvMULTI_on(stdingv);
760ac839 2361 IoIFP(GvIOp(stdingv)) = PerlIO_stdin();
adbc6bb1 2362 tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
a5f75d66 2363 GvMULTI_on(tmpgv);
a0d0e21e 2364 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(stdingv));
79072805 2365
85e6fe83 2366 tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
a5f75d66 2367 GvMULTI_on(tmpgv);
760ac839 2368 IoOFP(GvIOp(tmpgv)) = IoIFP(GvIOp(tmpgv)) = PerlIO_stdout();
4633a7c4 2369 setdefout(tmpgv);
adbc6bb1 2370 tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
a5f75d66 2371 GvMULTI_on(tmpgv);
a0d0e21e 2372 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(defoutgv));
79072805 2373
a0d0e21e 2374 othergv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
a5f75d66 2375 GvMULTI_on(othergv);
760ac839 2376 IoOFP(GvIOp(othergv)) = IoIFP(GvIOp(othergv)) = PerlIO_stderr();
adbc6bb1 2377 tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
a5f75d66 2378 GvMULTI_on(tmpgv);
a0d0e21e 2379 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(othergv));
79072805
LW
2380
2381 statname = NEWSV(66,0); /* last filename we did stat on */
ab821d7f 2382
6e72f9df 2383 if (!osname)
2384 osname = savepv(OSNAME);
79072805 2385}
33b78306 2386
79072805 2387static void
8ac85365 2388init_postdump_symbols(register int argc, register char **argv, register char **env)
33b78306 2389{
a863c7d1 2390 dTHR;
79072805
LW
2391 char *s;
2392 SV *sv;
2393 GV* tmpgv;
fe14fcc3 2394
79072805
LW
2395 argc--,argv++; /* skip name of script */
2396 if (doswitches) {
2397 for (; argc > 0 && **argv == '-'; argc--,argv++) {
2398 if (!argv[0][1])
2399 break;
2400 if (argv[0][1] == '-') {
2401 argc--,argv++;
2402 break;
2403 }
93a17b20 2404 if (s = strchr(argv[0], '=')) {
79072805 2405 *s++ = '\0';
85e6fe83 2406 sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),s);
79072805
LW
2407 }
2408 else
85e6fe83 2409 sv_setiv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),1);
fe14fcc3 2410 }
79072805
LW
2411 }
2412 toptarget = NEWSV(0,0);
2413 sv_upgrade(toptarget, SVt_PVFM);
2414 sv_setpvn(toptarget, "", 0);
748a9306 2415 bodytarget = NEWSV(0,0);
79072805
LW
2416 sv_upgrade(bodytarget, SVt_PVFM);
2417 sv_setpvn(bodytarget, "", 0);
2418 formtarget = bodytarget;
2419
bbce6d69 2420 TAINT;
85e6fe83 2421 if (tmpgv = gv_fetchpv("0",TRUE, SVt_PV)) {
79072805
LW
2422 sv_setpv(GvSV(tmpgv),origfilename);
2423 magicname("0", "0", 1);
2424 }
85e6fe83 2425 if (tmpgv = gv_fetchpv("\030",TRUE, SVt_PV))
79072805 2426 sv_setpv(GvSV(tmpgv),origargv[0]);
85e6fe83 2427 if (argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV)) {
a5f75d66 2428 GvMULTI_on(argvgv);
79072805
LW
2429 (void)gv_AVadd(argvgv);
2430 av_clear(GvAVn(argvgv));
2431 for (; argc > 0; argc--,argv++) {
a0d0e21e 2432 av_push(GvAVn(argvgv),newSVpv(argv[0],0));
79072805
LW
2433 }
2434 }
85e6fe83 2435 if (envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV)) {
79072805 2436 HV *hv;
a5f75d66 2437 GvMULTI_on(envgv);
79072805 2438 hv = GvHVn(envgv);
5aabfad6 2439 hv_magic(hv, envgv, 'E');
a0d0e21e 2440#ifndef VMS /* VMS doesn't have environ array */
4633a7c4
LW
2441 /* Note that if the supplied env parameter is actually a copy
2442 of the global environ then it may now point to free'd memory
2443 if the environment has been modified since. To avoid this
2444 problem we treat env==NULL as meaning 'use the default'
2445 */
2446 if (!env)
2447 env = environ;
5aabfad6 2448 if (env != environ)
79072805
LW
2449 environ[0] = Nullch;
2450 for (; *env; env++) {
93a17b20 2451 if (!(s = strchr(*env,'=')))
79072805
LW
2452 continue;
2453 *s++ = '\0';
39e571d4 2454#if defined(WIN32) || defined(MSDOS)
137443ea 2455 (void)strupr(*env);
2456#endif
79072805
LW
2457 sv = newSVpv(s--,0);
2458 (void)hv_store(hv, *env, s - *env, sv, 0);
2459 *s = '=';
3e3baf6d
TB
2460#if defined(__BORLANDC__) && defined(USE_WIN32_RTL_ENV)
2461 /* Sins of the RTL. See note in my_setenv(). */
5fd9e9a4 2462 (void)PerlEnv_putenv(savepv(*env));
3e3baf6d 2463#endif
fe14fcc3 2464 }
4550b24a 2465#endif
2466#ifdef DYNAMIC_ENV_FETCH
2467 HvNAME(hv) = savepv(ENV_HV_NAME);
2468#endif
79072805 2469 }
bbce6d69 2470 TAINT_NOT;
85e6fe83 2471 if (tmpgv = gv_fetchpv("$",TRUE, SVt_PV))
1e422769 2472 sv_setiv(GvSV(tmpgv), (IV)getpid());
33b78306 2473}
34de22dd 2474
79072805 2475static void
8ac85365 2476init_perllib(void)
34de22dd 2477{
85e6fe83
LW
2478 char *s;
2479 if (!tainting) {
552a7a9b 2480#ifndef VMS
5fd9e9a4 2481 s = PerlEnv_getenv("PERL5LIB");
85e6fe83 2482 if (s)
774d564b 2483 incpush(s, TRUE);
85e6fe83 2484 else
5fd9e9a4 2485 incpush(PerlEnv_getenv("PERLLIB"), FALSE);
552a7a9b 2486#else /* VMS */
2487 /* Treat PERL5?LIB as a possible search list logical name -- the
2488 * "natural" VMS idiom for a Unix path string. We allow each
2489 * element to be a set of |-separated directories for compatibility.
2490 */
2491 char buf[256];
2492 int idx = 0;
2493 if (my_trnlnm("PERL5LIB",buf,0))
774d564b 2494 do { incpush(buf,TRUE); } while (my_trnlnm("PERL5LIB",buf,++idx));
552a7a9b 2495 else
774d564b 2496 while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE);
552a7a9b 2497#endif /* VMS */
85e6fe83 2498 }
34de22dd 2499
c90c0ff4 2500/* Use the ~-expanded versions of APPLLIB (undocumented),
dfe9444c 2501 ARCHLIB PRIVLIB SITEARCH and SITELIB
df5cef82 2502*/
4633a7c4 2503#ifdef APPLLIB_EXP
43051805 2504 incpush(APPLLIB_EXP, TRUE);
16d20bd9 2505#endif
4633a7c4 2506
fed7345c 2507#ifdef ARCHLIB_EXP
774d564b 2508 incpush(ARCHLIB_EXP, FALSE);
a0d0e21e 2509#endif
fed7345c
AD
2510#ifndef PRIVLIB_EXP
2511#define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
34de22dd 2512#endif
774d564b 2513 incpush(PRIVLIB_EXP, FALSE);
4633a7c4
LW
2514
2515#ifdef SITEARCH_EXP
774d564b 2516 incpush(SITEARCH_EXP, FALSE);
4633a7c4
LW
2517#endif
2518#ifdef SITELIB_EXP
774d564b 2519 incpush(SITELIB_EXP, FALSE);
4633a7c4 2520#endif
4633a7c4 2521 if (!tainting)
774d564b 2522 incpush(".", FALSE);
2523}
2524
2525#if defined(DOSISH)
2526# define PERLLIB_SEP ';'
2527#else
2528# if defined(VMS)
2529# define PERLLIB_SEP '|'
2530# else
2531# define PERLLIB_SEP ':'
2532# endif
2533#endif
2534#ifndef PERLLIB_MANGLE
2535# define PERLLIB_MANGLE(s,n) (s)
2536#endif
2537
2538static void
8ac85365 2539incpush(char *p, int addsubdirs)
774d564b 2540{
2541 SV *subdir = Nullsv;
2542 static char *archpat_auto;
2543
2544 if (!p)
2545 return;
2546
2547 if (addsubdirs) {
8c52afec 2548 subdir = NEWSV(55,0);
774d564b 2549 if (!archpat_auto) {
2550 STRLEN len = (sizeof(ARCHNAME) + strlen(patchlevel)
2551 + sizeof("//auto"));
2552 New(55, archpat_auto, len, char);
2553 sprintf(archpat_auto, "/%s/%s/auto", ARCHNAME, patchlevel);
aa689395 2554#ifdef VMS
2555 for (len = sizeof(ARCHNAME) + 2;
2556 archpat_auto[len] != '\0' && archpat_auto[len] != '/'; len++)
2557 if (archpat_auto[len] == '.') archpat_auto[len] = '_';
2558#endif
774d564b 2559 }
2560 }
2561
2562 /* Break at all separators */
2563 while (p && *p) {
8c52afec 2564 SV *libdir = NEWSV(55,0);
774d564b 2565 char *s;
2566
2567 /* skip any consecutive separators */
2568 while ( *p == PERLLIB_SEP ) {
2569 /* Uncomment the next line for PATH semantics */
2570 /* av_push(GvAVn(incgv), newSVpv(".", 1)); */
2571 p++;
2572 }
2573
2574 if ( (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
2575 sv_setpvn(libdir, PERLLIB_MANGLE(p, (STRLEN)(s - p)),
2576 (STRLEN)(s - p));
2577 p = s + 1;
2578 }
2579 else {
2580 sv_setpv(libdir, PERLLIB_MANGLE(p, 0));
2581 p = Nullch; /* break out */
2582 }
2583
2584 /*
2585 * BEFORE pushing libdir onto @INC we may first push version- and
2586 * archname-specific sub-directories.
2587 */
2588 if (addsubdirs) {
2589 struct stat tmpstatbuf;
aa689395 2590#ifdef VMS
2591 char *unix;
2592 STRLEN len;
774d564b 2593
aa689395 2594 if ((unix = tounixspec_ts(SvPV(libdir,na),Nullch)) != Nullch) {
2595 len = strlen(unix);
2596 while (unix[len-1] == '/') len--; /* Cosmetic */
2597 sv_usepvn(libdir,unix,len);
2598 }
2599 else
2600 PerlIO_printf(PerlIO_stderr(),
2601 "Failed to unixify @INC element \"%s\"\n",
2602 SvPV(libdir,na));
2603#endif
4fdae800 2604 /* .../archname/version if -d .../archname/version/auto */
774d564b 2605 sv_setsv(subdir, libdir);
2606 sv_catpv(subdir, archpat_auto);
c6ed36e1 2607 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
774d564b 2608 S_ISDIR(tmpstatbuf.st_mode))
2609 av_push(GvAVn(incgv),
2610 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2611
4fdae800 2612 /* .../archname if -d .../archname/auto */
774d564b 2613 sv_insert(subdir, SvCUR(libdir) + sizeof(ARCHNAME),
2614 strlen(patchlevel) + 1, "", 0);
c6ed36e1 2615 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
774d564b 2616 S_ISDIR(tmpstatbuf.st_mode))
2617 av_push(GvAVn(incgv),
2618 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2619 }
2620
2621 /* finally push this lib directory on the end of @INC */
2622 av_push(GvAVn(incgv), libdir);
2623 }
2624
2625 SvREFCNT_dec(subdir);
34de22dd 2626}
93a17b20 2627
199100c8 2628#ifdef USE_THREADS
52e1cb5e 2629static struct perl_thread *
199100c8
MB
2630init_main_thread()
2631{
52e1cb5e 2632 struct perl_thread *thr;
199100c8
MB
2633 XPV *xpv;
2634
52e1cb5e 2635 Newz(53, thr, 1, struct perl_thread);
199100c8
MB
2636 curcop = &compiling;
2637 thr->cvcache = newHV();
54b9620d 2638 thr->threadsv = newAV();
940cb80d 2639 /* thr->threadsvp is set when find_threadsv is called */
199100c8 2640 thr->specific = newAV();
38a03e6e 2641 thr->errhv = newHV();
199100c8
MB
2642 thr->flags = THRf_R_JOINABLE;
2643 MUTEX_INIT(&thr->mutex);
2644 /* Handcraft thrsv similarly to mess_sv */
2645 New(53, thrsv, 1, SV);
2646 Newz(53, xpv, 1, XPV);
2647 SvFLAGS(thrsv) = SVt_PV;
2648 SvANY(thrsv) = (void*)xpv;
2649 SvREFCNT(thrsv) = 1 << 30; /* practically infinite */
2650 SvPVX(thrsv) = (char*)thr;
2651 SvCUR_set(thrsv, sizeof(thr));
2652 SvLEN_set(thrsv, sizeof(thr));
2653 *SvEND(thrsv) = '\0'; /* in the trailing_nul field */
2654 thr->oursv = thrsv;
199100c8
MB
2655 chopset = " \n-";
2656
2657 MUTEX_LOCK(&threads_mutex);
2658 nthreads++;
2659 thr->tid = 0;
2660 thr->next = thr;
2661 thr->prev = thr;
2662 MUTEX_UNLOCK(&threads_mutex);
2663
4b026b9e
GS
2664#ifdef HAVE_THREAD_INTERN
2665 init_thread_intern(thr);
235db74f
GS
2666#endif
2667
2668#ifdef SET_THREAD_SELF
2669 SET_THREAD_SELF(thr);
199100c8
MB
2670#else
2671 thr->self = pthread_self();
235db74f 2672#endif /* SET_THREAD_SELF */
199100c8
MB
2673 SET_THR(thr);
2674
2675 /*
2676 * These must come after the SET_THR because sv_setpvn does
2677 * SvTAINT and the taint fields require dTHR.
2678 */
2679 toptarget = NEWSV(0,0);
2680 sv_upgrade(toptarget, SVt_PVFM);
2681 sv_setpvn(toptarget, "", 0);
2682 bodytarget = NEWSV(0,0);
2683 sv_upgrade(bodytarget, SVt_PVFM);
2684 sv_setpvn(bodytarget, "", 0);
2685 formtarget = bodytarget;
2faa37cc 2686 thr->errsv = newSVpv("", 0);
78857c3c 2687 (void) find_threadsv("@"); /* Ensure $@ is initialised early */
199100c8
MB
2688 return thr;
2689}
2690#endif /* USE_THREADS */
2691
93a17b20 2692void
8ac85365 2693call_list(I32 oldscope, AV *list)
93a17b20 2694{
11343788 2695 dTHR;
a0d0e21e 2696 line_t oldline = curcop->cop_line;
22921e25
CS
2697 STRLEN len;
2698 dJMPENV;
2699 int ret;
93a17b20 2700
93965878 2701 while (AvFILL(list) >= 0) {
8990e307 2702 CV *cv = (CV*)av_shift(list);
93a17b20 2703
8990e307 2704 SAVEFREESV(cv);
a0d0e21e 2705
22921e25
CS
2706 JMPENV_PUSH(ret);
2707 switch (ret) {
748a9306 2708 case 0: {
38a03e6e 2709 SV* atsv = ERRSV;
748a9306
LW
2710 PUSHMARK(stack_sp);
2711 perl_call_sv((SV*)cv, G_EVAL|G_DISCARD);
12f917ad 2712 (void)SvPV(atsv, len);
748a9306 2713 if (len) {
54310121 2714 JMPENV_POP;
748a9306
LW
2715 curcop = &compiling;
2716 curcop->cop_line = oldline;
2717 if (list == beginav)
12f917ad 2718 sv_catpv(atsv, "BEGIN failed--compilation aborted");
748a9306 2719 else
12f917ad 2720 sv_catpv(atsv, "END failed--cleanup aborted");
2ae324a7 2721 while (scopestack_ix > oldscope)
2722 LEAVE;
12f917ad 2723 croak("%s", SvPVX(atsv));
748a9306 2724 }
a0d0e21e 2725 }
85e6fe83
LW
2726 break;
2727 case 1:
f86702cc 2728 STATUS_ALL_FAILURE;
85e6fe83
LW
2729 /* FALL THROUGH */
2730 case 2:
2731 /* my_exit() was called */
2ae324a7 2732 while (scopestack_ix > oldscope)
2733 LEAVE;
84902520 2734 FREETMPS;
85e6fe83
LW
2735 curstash = defstash;
2736 if (endav)
68dc0745 2737 call_list(oldscope, endav);
54310121 2738 JMPENV_POP;
a0d0e21e
LW
2739 curcop = &compiling;
2740 curcop->cop_line = oldline;
85e6fe83
LW
2741 if (statusvalue) {
2742 if (list == beginav)
a0d0e21e 2743 croak("BEGIN failed--compilation aborted");
85e6fe83 2744 else
a0d0e21e 2745 croak("END failed--cleanup aborted");
85e6fe83 2746 }
f86702cc 2747 my_exit_jump();
85e6fe83 2748 /* NOTREACHED */
85e6fe83
LW
2749 case 3:
2750 if (!restartop) {
760ac839 2751 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
a0d0e21e 2752 FREETMPS;
85e6fe83
LW
2753 break;
2754 }
54310121 2755 JMPENV_POP;
a0d0e21e
LW
2756 curcop = &compiling;
2757 curcop->cop_line = oldline;
54310121 2758 JMPENV_JUMP(3);
8990e307 2759 }
54310121 2760 JMPENV_POP;
93a17b20 2761 }
93a17b20 2762}
93a17b20 2763
f86702cc 2764void
8ac85365 2765my_exit(U32 status)
f86702cc 2766{
5dc0d613
MB
2767 dTHR;
2768
2769#ifdef USE_THREADS
a863c7d1
MB
2770 DEBUG_L(PerlIO_printf(Perl_debug_log, "my_exit: thread %p, status %lu\n",
2771 thr, (unsigned long) status));
5dc0d613 2772#endif /* USE_THREADS */
f86702cc 2773 switch (status) {
2774 case 0:
2775 STATUS_ALL_SUCCESS;
2776 break;
2777 case 1:
2778 STATUS_ALL_FAILURE;
2779 break;
2780 default:
2781 STATUS_NATIVE_SET(status);
2782 break;
2783 }
2784 my_exit_jump();
2785}
2786
2787void
8ac85365 2788my_failure_exit(void)
f86702cc 2789{
2790#ifdef VMS
2791 if (vaxc$errno & 1) {
4fdae800 2792 if (STATUS_NATIVE & 1) /* fortuitiously includes "-1" */
2793 STATUS_NATIVE_SET(44);
f86702cc 2794 }
2795 else {
ff0cee69 2796 if (!vaxc$errno && errno) /* unlikely */
4fdae800 2797 STATUS_NATIVE_SET(44);
f86702cc 2798 else
4fdae800 2799 STATUS_NATIVE_SET(vaxc$errno);
f86702cc 2800 }
2801#else
9b599b2a 2802 int exitstatus;
f86702cc 2803 if (errno & 255)
2804 STATUS_POSIX_SET(errno);
9b599b2a
GS
2805 else {
2806 exitstatus = STATUS_POSIX >> 8;
2807 if (exitstatus & 255)
2808 STATUS_POSIX_SET(exitstatus);
2809 else
2810 STATUS_POSIX_SET(255);
2811 }
f86702cc 2812#endif
2813 my_exit_jump();
93a17b20
LW
2814}
2815
f86702cc 2816static void
8ac85365 2817my_exit_jump(void)
f86702cc 2818{
bac4b2ad 2819 dSP;
c09156bb 2820 register PERL_CONTEXT *cx;
f86702cc 2821 I32 gimme;
2822 SV **newsp;
2823
2824 if (e_tmpname) {
2825 if (e_fp) {
2826 PerlIO_close(e_fp);
2827 e_fp = Nullfp;
2828 }
2829 (void)UNLINK(e_tmpname);
2830 Safefree(e_tmpname);
2831 e_tmpname = Nullch;
2832 }
2833
bac4b2ad 2834 POPSTACK_TO(mainstack);
f86702cc 2835 if (cxstack_ix >= 0) {
2836 if (cxstack_ix > 0)
2837 dounwind(0);
2838 POPBLOCK(cx,curpm);
2839 LEAVE;
2840 }
ff0cee69 2841
54310121 2842 JMPENV_JUMP(2);
f86702cc 2843}
4e35701f 2844
aeea060c 2845
22239a37 2846