This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[win32] merge changes#989,990,992 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();
1d3434b8
GS
940 /* init_postdump_symbols not currently designed to be called */
941 /* more than once (ENV isn't cleared first, for example) */
942 /* But running with -u leaves %ENV & @ARGV undefined! XXX */
8990e307
LW
943 if (!do_undump)
944 init_postdump_symbols(argc,argv,env);
93a17b20 945
79072805
LW
946 init_lexer();
947
948 /* now parse the script */
949
61bb5906 950 SETERRNO(0,SS$_NORMAL);
79072805
LW
951 error_count = 0;
952 if (yyparse() || error_count) {
953 if (minus_c)
463ee0b2 954 croak("%s had compilation errors.\n", origfilename);
79072805 955 else {
463ee0b2 956 croak("Execution of %s aborted due to compilation errors.\n",
79072805 957 origfilename);
378cc40b 958 }
79072805
LW
959 }
960 curcop->cop_line = 0;
961 curstash = defstash;
962 preprocess = FALSE;
ab821d7f 963 if (e_tmpname) {
79072805 964 (void)UNLINK(e_tmpname);
ab821d7f 965 Safefree(e_tmpname);
966 e_tmpname = Nullch;
e5c9fcd0 967 e_tmpfd = -1;
378cc40b 968 }
a687059c 969
93a17b20 970 /* now that script is parsed, we can modify record separator */
c07a80fd 971 SvREFCNT_dec(rs);
972 rs = SvREFCNT_inc(nrs);
e1c148c2 973 sv_setsv(perl_get_sv("/", TRUE), rs);
79072805
LW
974 if (do_undump)
975 my_unexec();
976
8990e307
LW
977 if (dowarn)
978 gv_check(defstash);
979
a0d0e21e
LW
980 LEAVE;
981 FREETMPS;
c07a80fd 982
3562ef9b 983#ifdef MYMALLOC
5fd9e9a4 984 if ((s=PerlEnv_getenv("PERL_DEBUG_MSTATS")) && atoi(s) >= 2)
c07a80fd 985 dump_mstats("after compilation:");
986#endif
987
a0d0e21e
LW
988 ENTER;
989 restartop = 0;
54310121 990 JMPENV_POP;
79072805
LW
991 return 0;
992}
993
994int
8ac85365 995perl_run(PerlInterpreter *sv_interp)
79072805 996{
e336de0d 997 dSP;
2ae324a7 998 I32 oldscope;
22921e25
CS
999 dJMPENV;
1000 int ret;
2ae324a7 1001
79072805
LW
1002 if (!(curinterp = sv_interp))
1003 return 255;
2ae324a7 1004
1005 oldscope = scopestack_ix;
1006
22921e25
CS
1007 JMPENV_PUSH(ret);
1008 switch (ret) {
79072805
LW
1009 case 1:
1010 cxstack_ix = -1; /* start context stack again */
1011 break;
1012 case 2:
f86702cc 1013 /* my_exit() was called */
2ae324a7 1014 while (scopestack_ix > oldscope)
1015 LEAVE;
84902520 1016 FREETMPS;
79072805 1017 curstash = defstash;
93a17b20 1018 if (endav)
68dc0745 1019 call_list(oldscope, endav);
3562ef9b 1020#ifdef MYMALLOC
5fd9e9a4 1021 if (PerlEnv_getenv("PERL_DEBUG_MSTATS"))
c07a80fd 1022 dump_mstats("after execution: ");
1023#endif
54310121 1024 JMPENV_POP;
f86702cc 1025 return STATUS_NATIVE_EXPORT;
79072805
LW
1026 case 3:
1027 if (!restartop) {
760ac839 1028 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
a0d0e21e 1029 FREETMPS;
54310121 1030 JMPENV_POP;
8990e307 1031 return 1;
83025b21 1032 }
e336de0d 1033 POPSTACK_TO(mainstack);
79072805 1034 break;
8d063cd8 1035 }
79072805 1036
fb73857a 1037 DEBUG_r(PerlIO_printf(Perl_debug_log, "%s $` $& $' support.\n",
6e72f9df 1038 sawampersand ? "Enabling" : "Omitting"));
1039
79072805
LW
1040 if (!restartop) {
1041 DEBUG_x(dump_all());
760ac839 1042 DEBUG(PerlIO_printf(Perl_debug_log, "\nEXECUTING...\n\n"));
11343788 1043#ifdef USE_THREADS
5dc0d613
MB
1044 DEBUG_L(PerlIO_printf(Perl_debug_log, "main thread is 0x%lx\n",
1045 (unsigned long) thr));
11343788 1046#endif /* USE_THREADS */
79072805
LW
1047
1048 if (minus_c) {
760ac839 1049 PerlIO_printf(PerlIO_stderr(), "%s syntax OK\n", origfilename);
79072805
LW
1050 my_exit(0);
1051 }
84902520 1052 if (PERLDB_SINGLE && DBsingle)
a0d0e21e 1053 sv_setiv(DBsingle, 1);
7d07dbc2
MB
1054 if (initav)
1055 call_list(oldscope, initav);
45d8adaa 1056 }
79072805
LW
1057
1058 /* do it */
1059
1060 if (restartop) {
1061 op = restartop;
1062 restartop = 0;
ab821d7f 1063 runops();
79072805
LW
1064 }
1065 else if (main_start) {
4fdae800 1066 CvDEPTH(main_cv) = 1;
79072805 1067 op = main_start;
ab821d7f 1068 runops();
79072805 1069 }
79072805
LW
1070
1071 my_exit(0);
54310121 1072 /* NOTREACHED */
a0d0e21e 1073 return 0;
79072805
LW
1074}
1075
a0d0e21e 1076SV*
8ac85365 1077perl_get_sv(char *name, I32 create)
a0d0e21e 1078{
2faa37cc 1079 GV *gv;
38a03e6e 1080#ifdef USE_THREADS
2faa37cc 1081 if (name[1] == '\0' && !isALPHA(name[0])) {
54b9620d 1082 PADOFFSET tmp = find_threadsv(name);
2faa37cc
MB
1083 if (tmp != NOT_IN_PAD) {
1084 dTHR;
940cb80d 1085 return THREADSV(tmp);
2faa37cc 1086 }
38a03e6e
MB
1087 }
1088#endif /* USE_THREADS */
2faa37cc 1089 gv = gv_fetchpv(name, create, SVt_PV);
a0d0e21e
LW
1090 if (gv)
1091 return GvSV(gv);
1092 return Nullsv;
1093}
1094
1095AV*
8ac85365 1096perl_get_av(char *name, I32 create)
a0d0e21e
LW
1097{
1098 GV* gv = gv_fetchpv(name, create, SVt_PVAV);
1099 if (create)
1100 return GvAVn(gv);
1101 if (gv)
1102 return GvAV(gv);
1103 return Nullav;
1104}
1105
1106HV*
8ac85365 1107perl_get_hv(char *name, I32 create)
a0d0e21e
LW
1108{
1109 GV* gv = gv_fetchpv(name, create, SVt_PVHV);
1110 if (create)
1111 return GvHVn(gv);
1112 if (gv)
1113 return GvHV(gv);
1114 return Nullhv;
1115}
1116
1117CV*
8ac85365 1118perl_get_cv(char *name, I32 create)
a0d0e21e
LW
1119{
1120 GV* gv = gv_fetchpv(name, create, SVt_PVCV);
8ebc5c01 1121 if (create && !GvCVu(gv))
774d564b 1122 return newSUB(start_subparse(FALSE, 0),
a0d0e21e 1123 newSVOP(OP_CONST, 0, newSVpv(name,0)),
4633a7c4 1124 Nullop,
a0d0e21e
LW
1125 Nullop);
1126 if (gv)
8ebc5c01 1127 return GvCVu(gv);
a0d0e21e
LW
1128 return Nullcv;
1129}
1130
79072805
LW
1131/* Be sure to refetch the stack pointer after calling these routines. */
1132
a0d0e21e 1133I32
22239a37 1134perl_call_argv(char *sub_name, I32 flags, register char **argv)
8ac85365
NIS
1135
1136 /* See G_* flags in cop.h */
1137 /* null terminated arg list */
8990e307 1138{
a0d0e21e 1139 dSP;
8990e307 1140
924508f0 1141 PUSHMARK(SP);
a0d0e21e 1142 if (argv) {
8990e307 1143 while (*argv) {
a0d0e21e 1144 XPUSHs(sv_2mortal(newSVpv(*argv,0)));
8990e307
LW
1145 argv++;
1146 }
a0d0e21e 1147 PUTBACK;
8990e307 1148 }
22239a37 1149 return perl_call_pv(sub_name, flags);
8990e307
LW
1150}
1151
a0d0e21e 1152I32
22239a37 1153perl_call_pv(char *sub_name, I32 flags)
8ac85365
NIS
1154 /* name of the subroutine */
1155 /* See G_* flags in cop.h */
a0d0e21e 1156{
22239a37 1157 return perl_call_sv((SV*)perl_get_cv(sub_name, TRUE), flags);
a0d0e21e
LW
1158}
1159
1160I32
8ac85365
NIS
1161perl_call_method(char *methname, I32 flags)
1162 /* name of the subroutine */
1163 /* See G_* flags in cop.h */
a0d0e21e
LW
1164{
1165 dSP;
1166 OP myop;
1167 if (!op)
1168 op = &myop;
1169 XPUSHs(sv_2mortal(newSVpv(methname,0)));
1170 PUTBACK;
11343788 1171 pp_method(ARGS);
6ff81951
GS
1172 if(op == &myop)
1173 op = Nullop;
a0d0e21e
LW
1174 return perl_call_sv(*stack_sp--, flags);
1175}
1176
1177/* May be called with any of a CV, a GV, or an SV containing the name. */
1178I32
8ac85365
NIS
1179perl_call_sv(SV *sv, I32 flags)
1180
1181 /* See G_* flags in cop.h */
a0d0e21e 1182{
924508f0 1183 dSP;
a0d0e21e 1184 LOGOP myop; /* fake syntax tree node */
aa689395 1185 I32 oldmark;
a0d0e21e 1186 I32 retval;
a0d0e21e 1187 I32 oldscope;
6e72f9df 1188 static CV *DBcv;
54310121 1189 bool oldcatch = CATCH_GET;
1190 dJMPENV;
22921e25 1191 int ret;
d6602a8c 1192 OP* oldop = op;
1e422769 1193
a0d0e21e
LW
1194 if (flags & G_DISCARD) {
1195 ENTER;
1196 SAVETMPS;
1197 }
1198
aa689395 1199 Zero(&myop, 1, LOGOP);
54310121 1200 myop.op_next = Nullop;
f51d4af5 1201 if (!(flags & G_NOARGS))
aa689395 1202 myop.op_flags |= OPf_STACKED;
54310121 1203 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1204 (flags & G_ARRAY) ? OPf_WANT_LIST :
1205 OPf_WANT_SCALAR);
462e5cf6 1206 SAVEOP();
a0d0e21e 1207 op = (OP*)&myop;
aa689395 1208
a0d0e21e
LW
1209 EXTEND(stack_sp, 1);
1210 *++stack_sp = sv;
aa689395 1211 oldmark = TOPMARK;
a0d0e21e
LW
1212 oldscope = scopestack_ix;
1213
84902520 1214 if (PERLDB_SUB && curstash != debstash
36477c24 1215 /* Handle first BEGIN of -d. */
1216 && (DBcv || (DBcv = GvCV(DBsub)))
1217 /* Try harder, since this may have been a sighandler, thus
1218 * curstash may be meaningless. */
491527d0
GS
1219 && (SvTYPE(sv) != SVt_PVCV || CvSTASH((CV*)sv) != debstash)
1220 && !(flags & G_NODEBUG))
6e72f9df 1221 op->op_private |= OPpENTERSUB_DB;
a0d0e21e
LW
1222
1223 if (flags & G_EVAL) {
a0d0e21e
LW
1224 cLOGOP->op_other = op;
1225 markstack_ptr--;
4633a7c4
LW
1226 /* we're trying to emulate pp_entertry() here */
1227 {
c09156bb 1228 register PERL_CONTEXT *cx;
54310121 1229 I32 gimme = GIMME_V;
4633a7c4
LW
1230
1231 ENTER;
1232 SAVETMPS;
1233
1234 push_return(op->op_next);
1235 PUSHBLOCK(cx, CXt_EVAL, stack_sp);
1236 PUSHEVAL(cx, 0, 0);
1237 eval_root = op; /* Only needed so that goto works right. */
1238
1239 in_eval = 1;
1240 if (flags & G_KEEPERR)
1241 in_eval |= 4;
1242 else
38a03e6e 1243 sv_setpv(ERRSV,"");
4633a7c4 1244 }
a0d0e21e
LW
1245 markstack_ptr++;
1246
22921e25
CS
1247 JMPENV_PUSH(ret);
1248 switch (ret) {
a0d0e21e
LW
1249 case 0:
1250 break;
1251 case 1:
f86702cc 1252 STATUS_ALL_FAILURE;
a0d0e21e
LW
1253 /* FALL THROUGH */
1254 case 2:
1255 /* my_exit() was called */
1256 curstash = defstash;
1257 FREETMPS;
54310121 1258 JMPENV_POP;
a0d0e21e
LW
1259 if (statusvalue)
1260 croak("Callback called exit");
f86702cc 1261 my_exit_jump();
a0d0e21e
LW
1262 /* NOTREACHED */
1263 case 3:
1264 if (restartop) {
1265 op = restartop;
1266 restartop = 0;
54310121 1267 break;
a0d0e21e
LW
1268 }
1269 stack_sp = stack_base + oldmark;
1270 if (flags & G_ARRAY)
1271 retval = 0;
1272 else {
1273 retval = 1;
1274 *++stack_sp = &sv_undef;
1275 }
1276 goto cleanup;
1277 }
1278 }
1e422769 1279 else
54310121 1280 CATCH_SET(TRUE);
a0d0e21e
LW
1281
1282 if (op == (OP*)&myop)
11343788 1283 op = pp_entersub(ARGS);
a0d0e21e 1284 if (op)
ab821d7f 1285 runops();
a0d0e21e 1286 retval = stack_sp - (stack_base + oldmark);
4633a7c4 1287 if ((flags & G_EVAL) && !(flags & G_KEEPERR))
38a03e6e 1288 sv_setpv(ERRSV,"");
a0d0e21e
LW
1289
1290 cleanup:
1291 if (flags & G_EVAL) {
1292 if (scopestack_ix > oldscope) {
a0a2876f
LW
1293 SV **newsp;
1294 PMOP *newpm;
1295 I32 gimme;
c09156bb 1296 register PERL_CONTEXT *cx;
a0a2876f
LW
1297 I32 optype;
1298
1299 POPBLOCK(cx,newpm);
1300 POPEVAL(cx);
1301 pop_return();
1302 curpm = newpm;
1303 LEAVE;
a0d0e21e 1304 }
54310121 1305 JMPENV_POP;
a0d0e21e 1306 }
1e422769 1307 else
54310121 1308 CATCH_SET(oldcatch);
1e422769 1309
a0d0e21e
LW
1310 if (flags & G_DISCARD) {
1311 stack_sp = stack_base + oldmark;
1312 retval = 0;
1313 FREETMPS;
1314 LEAVE;
1315 }
d6602a8c 1316 op = oldop;
a0d0e21e
LW
1317 return retval;
1318}
1319
6e72f9df 1320/* Eval a string. The G_EVAL flag is always assumed. */
8990e307 1321
a0d0e21e 1322I32
8ac85365
NIS
1323perl_eval_sv(SV *sv, I32 flags)
1324
1325 /* See G_* flags in cop.h */
a0d0e21e 1326{
924508f0 1327 dSP;
a0d0e21e 1328 UNOP myop; /* fake syntax tree node */
924508f0 1329 I32 oldmark = SP - stack_base;
4633a7c4 1330 I32 retval;
4633a7c4 1331 I32 oldscope;
54310121 1332 dJMPENV;
22921e25 1333 int ret;
84902520
TB
1334 OP* oldop = op;
1335
4633a7c4
LW
1336 if (flags & G_DISCARD) {
1337 ENTER;
1338 SAVETMPS;
1339 }
1340
462e5cf6 1341 SAVEOP();
79072805 1342 op = (OP*)&myop;
a0d0e21e 1343 Zero(op, 1, UNOP);
4633a7c4
LW
1344 EXTEND(stack_sp, 1);
1345 *++stack_sp = sv;
1346 oldscope = scopestack_ix;
79072805 1347
4633a7c4
LW
1348 if (!(flags & G_NOARGS))
1349 myop.op_flags = OPf_STACKED;
79072805 1350 myop.op_next = Nullop;
6e72f9df 1351 myop.op_type = OP_ENTEREVAL;
54310121 1352 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1353 (flags & G_ARRAY) ? OPf_WANT_LIST :
1354 OPf_WANT_SCALAR);
6e72f9df 1355 if (flags & G_KEEPERR)
1356 myop.op_flags |= OPf_SPECIAL;
4633a7c4 1357
22921e25
CS
1358 JMPENV_PUSH(ret);
1359 switch (ret) {
4633a7c4
LW
1360 case 0:
1361 break;
1362 case 1:
f86702cc 1363 STATUS_ALL_FAILURE;
4633a7c4
LW
1364 /* FALL THROUGH */
1365 case 2:
1366 /* my_exit() was called */
1367 curstash = defstash;
1368 FREETMPS;
54310121 1369 JMPENV_POP;
4633a7c4
LW
1370 if (statusvalue)
1371 croak("Callback called exit");
f86702cc 1372 my_exit_jump();
4633a7c4
LW
1373 /* NOTREACHED */
1374 case 3:
1375 if (restartop) {
1376 op = restartop;
1377 restartop = 0;
54310121 1378 break;
4633a7c4
LW
1379 }
1380 stack_sp = stack_base + oldmark;
1381 if (flags & G_ARRAY)
1382 retval = 0;
1383 else {
1384 retval = 1;
1385 *++stack_sp = &sv_undef;
1386 }
1387 goto cleanup;
1388 }
1389
1390 if (op == (OP*)&myop)
11343788 1391 op = pp_entereval(ARGS);
4633a7c4 1392 if (op)
ab821d7f 1393 runops();
4633a7c4 1394 retval = stack_sp - (stack_base + oldmark);
6e72f9df 1395 if (!(flags & G_KEEPERR))
38a03e6e 1396 sv_setpv(ERRSV,"");
4633a7c4
LW
1397
1398 cleanup:
54310121 1399 JMPENV_POP;
4633a7c4
LW
1400 if (flags & G_DISCARD) {
1401 stack_sp = stack_base + oldmark;
1402 retval = 0;
1403 FREETMPS;
1404 LEAVE;
1405 }
84902520 1406 op = oldop;
4633a7c4
LW
1407 return retval;
1408}
1409
137443ea 1410SV*
8ac85365 1411perl_eval_pv(char *p, I32 croak_on_error)
137443ea 1412{
1413 dSP;
1414 SV* sv = newSVpv(p, 0);
1415
924508f0 1416 PUSHMARK(SP);
137443ea 1417 perl_eval_sv(sv, G_SCALAR);
1418 SvREFCNT_dec(sv);
1419
1420 SPAGAIN;
1421 sv = POPs;
1422 PUTBACK;
1423
38a03e6e
MB
1424 if (croak_on_error && SvTRUE(ERRSV))
1425 croak(SvPVx(ERRSV, na));
137443ea 1426
1427 return sv;
1428}
1429
4633a7c4
LW
1430/* Require a module. */
1431
1432void
8ac85365 1433perl_require_pv(char *pv)
4633a7c4
LW
1434{
1435 SV* sv = sv_newmortal();
1436 sv_setpv(sv, "require '");
1437 sv_catpv(sv, pv);
1438 sv_catpv(sv, "'");
1439 perl_eval_sv(sv, G_DISCARD);
79072805
LW
1440}
1441
79072805 1442void
8ac85365 1443magicname(char *sym, char *name, I32 namlen)
79072805
LW
1444{
1445 register GV *gv;
1446
85e6fe83 1447 if (gv = gv_fetchpv(sym,TRUE, SVt_PV))
79072805
LW
1448 sv_magic(GvSV(gv), (SV*)gv, 0, name, namlen);
1449}
1450
ab821d7f 1451static void
8ac85365
NIS
1452usage(char *name) /* XXX move this out into a module ? */
1453
4633a7c4 1454{
ab821d7f 1455 /* This message really ought to be max 23 lines.
1456 * Removed -h because the user already knows that opton. Others? */
fb73857a 1457
1458 static char *usage[] = {
1459"-0[octal] specify record separator (\\0, if no argument)",
1460"-a autosplit mode with -n or -p (splits $_ into @F)",
1461"-c check syntax only (runs BEGIN and END blocks)",
1462"-d[:debugger] run scripts under debugger",
1463"-D[number/list] set debugging flags (argument is a bit mask or flags)",
1464"-e 'command' one line of script. Several -e's allowed. Omit [programfile].",
1465"-F/pattern/ split() pattern for autosplit (-a). The //'s are optional.",
1466"-i[extension] edit <> files in place (make backup if extension supplied)",
1467"-Idirectory specify @INC/#include directory (may be used more than once)",
1468"-l[octal] enable line ending processing, specifies line terminator",
1469"-[mM][-]module.. executes `use/no module...' before executing your script.",
1470"-n assume 'while (<>) { ... }' loop around your script",
1471"-p assume loop like -n but print line also like sed",
1472"-P run script through C preprocessor before compilation",
1473"-s enable some switch parsing for switches after script name",
1474"-S look for the script using PATH environment variable",
1475"-T turn on tainting checks",
1476"-u dump core after parsing script",
1477"-U allow unsafe operations",
95103687 1478"-v print version number, patchlevel plus VERY IMPORTANT perl info",
fb73857a 1479"-V[:variable] print perl configuration information",
1480"-w TURN WARNINGS ON FOR COMPILATION OF YOUR SCRIPT. Recommended.",
1481"-x[directory] strip off text before #!perl line and perhaps cd to directory",
1482"\n",
1483NULL
1484};
1485 char **p = usage;
1486
ab821d7f 1487 printf("\nUsage: %s [switches] [--] [programfile] [arguments]", name);
fb73857a 1488 while (*p)
1489 printf("\n %s", *p++);
4633a7c4
LW
1490}
1491
79072805
LW
1492/* This routine handles any switches that can be given during run */
1493
1494char *
8ac85365 1495moreswitches(char *s)
79072805
LW
1496{
1497 I32 numlen;
c07a80fd 1498 U32 rschar;
79072805
LW
1499
1500 switch (*s) {
1501 case '0':
a863c7d1
MB
1502 {
1503 dTHR;
c07a80fd 1504 rschar = scan_oct(s, 4, &numlen);
1505 SvREFCNT_dec(nrs);
1506 if (rschar & ~((U8)~0))
1507 nrs = &sv_undef;
1508 else if (!rschar && numlen >= 2)
1509 nrs = newSVpv("", 0);
1510 else {
1511 char ch = rschar;
1512 nrs = newSVpv(&ch, 1);
79072805
LW
1513 }
1514 return s + numlen;
a863c7d1 1515 }
2304df62
AD
1516 case 'F':
1517 minus_F = TRUE;
a0d0e21e 1518 splitstr = savepv(s + 1);
2304df62
AD
1519 s += strlen(s);
1520 return s;
79072805
LW
1521 case 'a':
1522 minus_a = TRUE;
1523 s++;
1524 return s;
1525 case 'c':
1526 minus_c = TRUE;
1527 s++;
1528 return s;
1529 case 'd':
bbce6d69 1530 forbid_setid("-d");
4633a7c4 1531 s++;
c07a80fd 1532 if (*s == ':' || *s == '=') {
46fc3d4c 1533 my_setenv("PERL5DB", form("use Devel::%s;", ++s));
4633a7c4 1534 s += strlen(s);
4633a7c4 1535 }
a0d0e21e 1536 if (!perldb) {
84902520 1537 perldb = PERLDB_ALL;
a0d0e21e
LW
1538 init_debugger();
1539 }
79072805
LW
1540 return s;
1541 case 'D':
1542#ifdef DEBUGGING
bbce6d69 1543 forbid_setid("-D");
79072805 1544 if (isALPHA(s[1])) {
8990e307 1545 static char debopts[] = "psltocPmfrxuLHXD";
79072805
LW
1546 char *d;
1547
93a17b20 1548 for (s++; *s && (d = strchr(debopts,*s)); s++)
79072805
LW
1549 debug |= 1 << (d - debopts);
1550 }
1551 else {
1552 debug = atoi(s+1);
1553 for (s++; isDIGIT(*s); s++) ;
1554 }
8990e307 1555 debug |= 0x80000000;
79072805
LW
1556#else
1557 warn("Recompile perl with -DDEBUGGING to use -D switch\n");
a0d0e21e 1558 for (s++; isALNUM(*s); s++) ;
79072805
LW
1559#endif
1560 /*SUPPRESS 530*/
1561 return s;
4633a7c4
LW
1562 case 'h':
1563 usage(origargv[0]);
3028581b 1564 PerlProc_exit(0);
79072805
LW
1565 case 'i':
1566 if (inplace)
1567 Safefree(inplace);
a0d0e21e 1568 inplace = savepv(s+1);
79072805
LW
1569 /*SUPPRESS 530*/
1570 for (s = inplace; *s && !isSPACE(*s); s++) ;
7b8d334a 1571 if (*s) {
fb73857a 1572 *s++ = '\0';
7b8d334a
GS
1573 if (*s == '-') /* Additional switches on #! line. */
1574 s++;
1575 }
fb73857a 1576 return s;
1577 case 'I': /* -I handled both here and in parse_perl() */
bbce6d69 1578 forbid_setid("-I");
fb73857a 1579 ++s;
1580 while (*s && isSPACE(*s))
1581 ++s;
1582 if (*s) {
774d564b 1583 char *e, *p;
748a9306 1584 for (e = s; *e && !isSPACE(*e); e++) ;
774d564b 1585 p = savepvn(s, e-s);
1586 incpush(p, TRUE);
1587 Safefree(p);
fb73857a 1588 s = e;
79072805
LW
1589 }
1590 else
463ee0b2 1591 croak("No space allowed after -I");
fb73857a 1592 return s;
79072805
LW
1593 case 'l':
1594 minus_l = TRUE;
1595 s++;
a0d0e21e
LW
1596 if (ors)
1597 Safefree(ors);
79072805 1598 if (isDIGIT(*s)) {
a0d0e21e 1599 ors = savepv("\n");
79072805
LW
1600 orslen = 1;
1601 *ors = scan_oct(s, 3 + (*s == '0'), &numlen);
1602 s += numlen;
1603 }
1604 else {
a863c7d1 1605 dTHR;
c07a80fd 1606 if (RsPARA(nrs)) {
6e72f9df 1607 ors = "\n\n";
c07a80fd 1608 orslen = 2;
1609 }
1610 else
1611 ors = SvPV(nrs, orslen);
6e72f9df 1612 ors = savepvn(ors, orslen);
79072805
LW
1613 }
1614 return s;
1a30305b 1615 case 'M':
bbce6d69 1616 forbid_setid("-M"); /* XXX ? */
1a30305b 1617 /* FALL THROUGH */
1618 case 'm':
bbce6d69 1619 forbid_setid("-m"); /* XXX ? */
1a30305b 1620 if (*++s) {
a5f75d66 1621 char *start;
11343788 1622 SV *sv;
a5f75d66
AD
1623 char *use = "use ";
1624 /* -M-foo == 'no foo' */
1625 if (*s == '-') { use = "no "; ++s; }
11343788 1626 sv = newSVpv(use,0);
a5f75d66 1627 start = s;
1a30305b 1628 /* We allow -M'Module qw(Foo Bar)' */
c07a80fd 1629 while(isALNUM(*s) || *s==':') ++s;
1630 if (*s != '=') {
11343788 1631 sv_catpv(sv, start);
c07a80fd 1632 if (*(start-1) == 'm') {
1633 if (*s != '\0')
1634 croak("Can't use '%c' after -mname", *s);
11343788 1635 sv_catpv( sv, " ()");
c07a80fd 1636 }
1637 } else {
11343788
MB
1638 sv_catpvn(sv, start, s-start);
1639 sv_catpv(sv, " split(/,/,q{");
1640 sv_catpv(sv, ++s);
1641 sv_catpv(sv, "})");
c07a80fd 1642 }
1a30305b 1643 s += strlen(s);
c07a80fd 1644 if (preambleav == NULL)
1645 preambleav = newAV();
11343788 1646 av_push(preambleav, sv);
1a30305b 1647 }
1648 else
1649 croak("No space allowed after -%c", *(s-1));
1650 return s;
79072805
LW
1651 case 'n':
1652 minus_n = TRUE;
1653 s++;
1654 return s;
1655 case 'p':
1656 minus_p = TRUE;
1657 s++;
1658 return s;
1659 case 's':
bbce6d69 1660 forbid_setid("-s");
79072805
LW
1661 doswitches = TRUE;
1662 s++;
1663 return s;
463ee0b2 1664 case 'T':
f86702cc 1665 if (!tainting)
9607fc9c 1666 croak("Too late for \"-T\" option");
463ee0b2
LW
1667 s++;
1668 return s;
79072805
LW
1669 case 'u':
1670 do_undump = TRUE;
1671 s++;
1672 return s;
1673 case 'U':
1674 unsafe = TRUE;
1675 s++;
1676 return s;
1677 case 'v':
a5f75d66 1678#if defined(SUBVERSION) && SUBVERSION > 0
fb73857a 1679 printf("\nThis is perl, version 5.%03d_%02d built for %s",
1680 PATCHLEVEL, SUBVERSION, ARCHNAME);
a5f75d66 1681#else
fb73857a 1682 printf("\nThis is perl, version %s built for %s",
1683 patchlevel, ARCHNAME);
1684#endif
1685#if defined(LOCAL_PATCH_COUNT)
1686 if (LOCAL_PATCH_COUNT > 0)
1687 printf("\n(with %d registered patch%s, see perl -V for more detail)",
1688 LOCAL_PATCH_COUNT, (LOCAL_PATCH_COUNT!=1) ? "es" : "");
a5f75d66 1689#endif
1a30305b 1690
a411490c 1691 printf("\n\nCopyright 1987-1998, Larry Wall\n");
79072805 1692#ifdef MSDOS
fb73857a 1693 printf("\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
55497cff 1694#endif
1695#ifdef DJGPP
1696 printf("djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n");
9731c6ca 1697 printf("djgpp v2 port (perl5004+) by Laszlo Molnar, 1997-1998\n");
4633a7c4 1698#endif
79072805 1699#ifdef OS2
5dd60ef7 1700 printf("\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
a411490c 1701 "Version 5 port Copyright (c) 1994-1998, Andreas Kaiser, Ilya Zakharevich\n");
79072805 1702#endif
79072805 1703#ifdef atarist
760ac839 1704 printf("atariST series port, ++jrb bammi@cadence.com\n");
79072805 1705#endif
760ac839 1706 printf("\n\
79072805 1707Perl may be copied only under the terms of either the Artistic License or the\n\
95103687
GS
1708GNU General Public License, which may be found in the Perl 5.0 source kit.\n\n\
1709Complete documentation for Perl, including FAQ lists, should be found on\n\
1710this system using `man perl' or `perldoc perl'. If you have access to the\n\
1711Internet, point your browser at http://www.perl.com/, the Perl Home Page.\n\n");
3028581b 1712 PerlProc_exit(0);
79072805
LW
1713 case 'w':
1714 dowarn = TRUE;
1715 s++;
1716 return s;
a0d0e21e 1717 case '*':
79072805
LW
1718 case ' ':
1719 if (s[1] == '-') /* Additional switches on #! line. */
1720 return s+2;
1721 break;
a0d0e21e 1722 case '-':
79072805 1723 case 0:
a868473f
NIS
1724#ifdef WIN32
1725 case '\r':
1726#endif
79072805
LW
1727 case '\n':
1728 case '\t':
1729 break;
aa689395 1730#ifdef ALTERNATE_SHEBANG
1731 case 'S': /* OS/2 needs -S on "extproc" line. */
1732 break;
1733#endif
a0d0e21e
LW
1734 case 'P':
1735 if (preprocess)
1736 return s+1;
1737 /* FALL THROUGH */
79072805 1738 default:
a0d0e21e 1739 croak("Can't emulate -%.1s on #! line",s);
79072805
LW
1740 }
1741 return Nullch;
1742}
1743
1744/* compliments of Tom Christiansen */
1745
1746/* unexec() can be found in the Gnu emacs distribution */
ee580363 1747/* Known to work with -DUNEXEC and using unexelf.c from GNU emacs-20.2 */
79072805
LW
1748
1749void
8ac85365 1750my_unexec(void)
79072805
LW
1751{
1752#ifdef UNEXEC
46fc3d4c 1753 SV* prog;
1754 SV* file;
ee580363 1755 int status = 1;
79072805
LW
1756 extern int etext;
1757
ee580363 1758 prog = newSVpv(BIN_EXP, 0);
46fc3d4c 1759 sv_catpv(prog, "/perl");
ee580363 1760 file = newSVpv(origfilename, 0);
46fc3d4c 1761 sv_catpv(file, ".perldump");
79072805 1762
ee580363
GS
1763 unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
1764 /* unexec prints msg to stderr in case of failure */
3028581b 1765 PerlProc_exit(status);
79072805 1766#else
a5f75d66
AD
1767# ifdef VMS
1768# include <lib$routines.h>
1769 lib$signal(SS$_DEBUG); /* ssdef.h #included from vmsish.h */
aa689395 1770# else
79072805 1771 ABORT(); /* for use with undump */
aa689395 1772# endif
a5f75d66 1773#endif
79072805
LW
1774}
1775
1776static void
8ac85365 1777init_main_stash(void)
79072805 1778{
11343788 1779 dTHR;
463ee0b2 1780 GV *gv;
6e72f9df 1781
1782 /* Note that strtab is a rather special HV. Assumptions are made
1783 about not iterating on it, and not adding tie magic to it.
1784 It is properly deallocated in perl_destruct() */
1785 strtab = newHV();
1786 HvSHAREKEYS_off(strtab); /* mandatory */
1787 Newz(506,((XPVHV*)SvANY(strtab))->xhv_array,
1788 sizeof(HE*) * (((XPVHV*)SvANY(strtab))->xhv_max + 1), char);
1789
463ee0b2 1790 curstash = defstash = newHV();
79072805 1791 curstname = newSVpv("main",4);
adbc6bb1
LW
1792 gv = gv_fetchpv("main::",TRUE, SVt_PVHV);
1793 SvREFCNT_dec(GvHV(gv));
1794 GvHV(gv) = (HV*)SvREFCNT_inc(defstash);
463ee0b2 1795 SvREADONLY_on(gv);
a0d0e21e 1796 HvNAME(defstash) = savepv("main");
85e6fe83 1797 incgv = gv_HVadd(gv_AVadd(gv_fetchpv("INC",TRUE, SVt_PVAV)));
a5f75d66 1798 GvMULTI_on(incgv);
a0d0e21e 1799 defgv = gv_fetchpv("_",TRUE, SVt_PVAV);
12f917ad
MB
1800 errgv = gv_HVadd(gv_fetchpv("@", TRUE, SVt_PV));
1801 GvMULTI_on(errgv);
84902520 1802 (void)form("%240s",""); /* Preallocate temp - for immediate signals. */
38a03e6e
MB
1803 sv_grow(ERRSV, 240); /* Preallocate - for immediate signals. */
1804 sv_setpvn(ERRSV, "", 0);
8990e307
LW
1805 curstash = defstash;
1806 compiling.cop_stash = defstash;
adbc6bb1 1807 debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
49dc05e3 1808 globalstash = GvHV(gv_fetchpv("CORE::GLOBAL::", GV_ADDMULTI, SVt_PVHV));
4633a7c4
LW
1809 /* We must init $/ before switches are processed. */
1810 sv_setpvn(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), "\n", 1);
79072805
LW
1811}
1812
a0d0e21e
LW
1813static void
1814open_script(char *scriptname, bool dosearch, SV *sv)
79072805 1815{
0f15f207 1816 dTHR;
79072805 1817 register char *s;
2a92aaa0 1818
491527d0 1819 scriptname = find_script(scriptname, dosearch, NULL, 0);
79072805 1820
96436eeb 1821 if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
1822 char *s = scriptname + 8;
1823 fdscript = atoi(s);
1824 while (isDIGIT(*s))
1825 s++;
1826 if (*s)
1827 scriptname = s + 1;
1828 }
1829 else
1830 fdscript = -1;
ab821d7f 1831 origfilename = savepv(e_tmpname ? "-e" : scriptname);
79072805
LW
1832 curcop->cop_filegv = gv_fetchfile(origfilename);
1833 if (strEQ(origfilename,"-"))
1834 scriptname = "";
96436eeb 1835 if (fdscript >= 0) {
a868473f 1836 rsfp = PerlIO_fdopen(fdscript,PERL_SCRIPT_MODE);
96436eeb 1837#if defined(HAS_FCNTL) && defined(F_SETFD)
7aa04957
CS
1838 if (rsfp)
1839 fcntl(PerlIO_fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
96436eeb 1840#endif
1841 }
1842 else if (preprocess) {
46fc3d4c 1843 char *cpp_cfg = CPPSTDIN;
1844 SV *cpp = NEWSV(0,0);
1845 SV *cmd = NEWSV(0,0);
1846
1847 if (strEQ(cpp_cfg, "cppstdin"))
1848 sv_catpvf(cpp, "%s/", BIN_EXP);
1849 sv_catpv(cpp, cpp_cfg);
79072805 1850
79072805 1851 sv_catpv(sv,"-I");
fed7345c 1852 sv_catpv(sv,PRIVLIB_EXP);
46fc3d4c 1853
79072805 1854#ifdef MSDOS
46fc3d4c 1855 sv_setpvf(cmd, "\
79072805
LW
1856sed %s -e \"/^[^#]/b\" \
1857 -e \"/^#[ ]*include[ ]/b\" \
1858 -e \"/^#[ ]*define[ ]/b\" \
1859 -e \"/^#[ ]*if[ ]/b\" \
1860 -e \"/^#[ ]*ifdef[ ]/b\" \
1861 -e \"/^#[ ]*ifndef[ ]/b\" \
1862 -e \"/^#[ ]*else/b\" \
1863 -e \"/^#[ ]*elif[ ]/b\" \
1864 -e \"/^#[ ]*undef[ ]/b\" \
1865 -e \"/^#[ ]*endif/b\" \
1866 -e \"s/^#.*//\" \
fc36a67e 1867 %s | %_ -C %_ %s",
79072805
LW
1868 (doextract ? "-e \"1,/^#/d\n\"" : ""),
1869#else
46fc3d4c 1870 sv_setpvf(cmd, "\
79072805
LW
1871%s %s -e '/^[^#]/b' \
1872 -e '/^#[ ]*include[ ]/b' \
1873 -e '/^#[ ]*define[ ]/b' \
1874 -e '/^#[ ]*if[ ]/b' \
1875 -e '/^#[ ]*ifdef[ ]/b' \
1876 -e '/^#[ ]*ifndef[ ]/b' \
1877 -e '/^#[ ]*else/b' \
1878 -e '/^#[ ]*elif[ ]/b' \
1879 -e '/^#[ ]*undef[ ]/b' \
1880 -e '/^#[ ]*endif/b' \
1881 -e 's/^[ ]*#.*//' \
fc36a67e 1882 %s | %_ -C %_ %s",
79072805
LW
1883#ifdef LOC_SED
1884 LOC_SED,
1885#else
1886 "sed",
1887#endif
1888 (doextract ? "-e '1,/^#/d\n'" : ""),
1889#endif
46fc3d4c 1890 scriptname, cpp, sv, CPPMINUS);
79072805
LW
1891 doextract = FALSE;
1892#ifdef IAMSUID /* actually, this is caught earlier */
1893 if (euid != uid && !euid) { /* if running suidperl */
1894#ifdef HAS_SETEUID
1895 (void)seteuid(uid); /* musn't stay setuid root */
1896#else
1897#ifdef HAS_SETREUID
85e6fe83
LW
1898 (void)setreuid((Uid_t)-1, uid);
1899#else
1900#ifdef HAS_SETRESUID
1901 (void)setresuid((Uid_t)-1, uid, (Uid_t)-1);
79072805
LW
1902#else
1903 setuid(uid);
1904#endif
1905#endif
85e6fe83 1906#endif
79072805 1907 if (geteuid() != uid)
463ee0b2 1908 croak("Can't do seteuid!\n");
79072805
LW
1909 }
1910#endif /* IAMSUID */
3028581b 1911 rsfp = PerlProc_popen(SvPVX(cmd), "r");
46fc3d4c 1912 SvREFCNT_dec(cmd);
1913 SvREFCNT_dec(cpp);
79072805
LW
1914 }
1915 else if (!*scriptname) {
bbce6d69 1916 forbid_setid("program input from stdin");
760ac839 1917 rsfp = PerlIO_stdin();
79072805 1918 }
96436eeb 1919 else {
a868473f 1920 rsfp = PerlIO_open(scriptname,PERL_SCRIPT_MODE);
96436eeb 1921#if defined(HAS_FCNTL) && defined(F_SETFD)
7aa04957
CS
1922 if (rsfp)
1923 fcntl(PerlIO_fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
96436eeb 1924#endif
1925 }
5dd60ef7 1926 if (e_tmpname) {
1927 e_fp = rsfp;
1928 }
7aa04957 1929 if (!rsfp) {
13281fa4 1930#ifdef DOSUID
a687059c 1931#ifndef IAMSUID /* in case script is not readable before setuid */
c6ed36e1 1932 if (euid && PerlLIO_stat(SvPVX(GvSV(curcop->cop_filegv)),&statbuf) >= 0 &&
13281fa4 1933 statbuf.st_mode & (S_ISUID|S_ISGID)) {
46fc3d4c 1934 /* try again */
3028581b 1935 PerlProc_execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
463ee0b2 1936 croak("Can't do setuid\n");
13281fa4
LW
1937 }
1938#endif
1939#endif
463ee0b2 1940 croak("Can't open perl script \"%s\": %s\n",
2304df62 1941 SvPVX(GvSV(curcop->cop_filegv)), Strerror(errno));
13281fa4 1942 }
79072805 1943}
8d063cd8 1944
79072805 1945static void
8ac85365 1946validate_suid(char *validarg, char *scriptname)
79072805 1947{
96436eeb 1948 int which;
1949
13281fa4
LW
1950 /* do we need to emulate setuid on scripts? */
1951
1952 /* This code is for those BSD systems that have setuid #! scripts disabled
1953 * in the kernel because of a security problem. Merely defining DOSUID
1954 * in perl will not fix that problem, but if you have disabled setuid
1955 * scripts in the kernel, this will attempt to emulate setuid and setgid
1956 * on scripts that have those now-otherwise-useless bits set. The setuid
27e2fb84
LW
1957 * root version must be called suidperl or sperlN.NNN. If regular perl
1958 * discovers that it has opened a setuid script, it calls suidperl with
1959 * the same argv that it had. If suidperl finds that the script it has
1960 * just opened is NOT setuid root, it sets the effective uid back to the
1961 * uid. We don't just make perl setuid root because that loses the
1962 * effective uid we had before invoking perl, if it was different from the
1963 * uid.
13281fa4
LW
1964 *
1965 * DOSUID must be defined in both perl and suidperl, and IAMSUID must
1966 * be defined in suidperl only. suidperl must be setuid root. The
1967 * Configure script will set this up for you if you want it.
1968 */
a687059c 1969
13281fa4 1970#ifdef DOSUID
ea0efc06 1971 dTHR;
6e72f9df 1972 char *s, *s2;
a0d0e21e 1973
3028581b 1974 if (PerlLIO_fstat(PerlIO_fileno(rsfp),&statbuf) < 0) /* normal stat is insecure */
463ee0b2 1975 croak("Can't stat script \"%s\"",origfilename);
96436eeb 1976 if (fdscript < 0 && statbuf.st_mode & (S_ISUID|S_ISGID)) {
79072805 1977 I32 len;
13281fa4 1978
a687059c 1979#ifdef IAMSUID
fe14fcc3 1980#ifndef HAS_SETREUID
a687059c
LW
1981 /* On this access check to make sure the directories are readable,
1982 * there is actually a small window that the user could use to make
1983 * filename point to an accessible directory. So there is a faint
1984 * chance that someone could execute a setuid script down in a
1985 * non-accessible directory. I don't know what to do about that.
1986 * But I don't think it's too important. The manual lies when
1987 * it says access() is useful in setuid programs.
1988 */
3028581b 1989 if (PerlLIO_access(SvPVX(GvSV(curcop->cop_filegv)),1)) /*double check*/
463ee0b2 1990 croak("Permission denied");
a687059c
LW
1991#else
1992 /* If we can swap euid and uid, then we can determine access rights
1993 * with a simple stat of the file, and then compare device and
1994 * inode to make sure we did stat() on the same file we opened.
1995 * Then we just have to make sure he or she can execute it.
1996 */
1997 {
1998 struct stat tmpstatbuf;
1999
85e6fe83
LW
2000 if (
2001#ifdef HAS_SETREUID
2002 setreuid(euid,uid) < 0
a0d0e21e
LW
2003#else
2004# if HAS_SETRESUID
85e6fe83 2005 setresuid(euid,uid,(Uid_t)-1) < 0
a0d0e21e 2006# endif
85e6fe83
LW
2007#endif
2008 || getuid() != euid || geteuid() != uid)
463ee0b2 2009 croak("Can't swap uid and euid"); /* really paranoid */
c6ed36e1 2010 if (PerlLIO_stat(SvPVX(GvSV(curcop->cop_filegv)),&tmpstatbuf) < 0)
463ee0b2 2011 croak("Permission denied"); /* testing full pathname here */
a687059c
LW
2012 if (tmpstatbuf.st_dev != statbuf.st_dev ||
2013 tmpstatbuf.st_ino != statbuf.st_ino) {
760ac839 2014 (void)PerlIO_close(rsfp);
3028581b 2015 if (rsfp = PerlProc_popen("/bin/mail root","w")) { /* heh, heh */
760ac839 2016 PerlIO_printf(rsfp,
ff0cee69 2017"User %ld tried to run dev %ld ino %ld in place of dev %ld ino %ld!\n\
2018(Filename of set-id script was %s, uid %ld gid %ld.)\n\nSincerely,\nperl\n",
2019 (long)uid,(long)tmpstatbuf.st_dev, (long)tmpstatbuf.st_ino,
2020 (long)statbuf.st_dev, (long)statbuf.st_ino,
463ee0b2 2021 SvPVX(GvSV(curcop->cop_filegv)),
ff0cee69 2022 (long)statbuf.st_uid, (long)statbuf.st_gid);
3028581b 2023 (void)PerlProc_pclose(rsfp);
a687059c 2024 }
463ee0b2 2025 croak("Permission denied\n");
a687059c 2026 }
85e6fe83
LW
2027 if (
2028#ifdef HAS_SETREUID
2029 setreuid(uid,euid) < 0
a0d0e21e
LW
2030#else
2031# if defined(HAS_SETRESUID)
85e6fe83 2032 setresuid(uid,euid,(Uid_t)-1) < 0
a0d0e21e 2033# endif
85e6fe83
LW
2034#endif
2035 || getuid() != uid || geteuid() != euid)
463ee0b2 2036 croak("Can't reswap uid and euid");
27e2fb84 2037 if (!cando(S_IXUSR,FALSE,&statbuf)) /* can real uid exec? */
463ee0b2 2038 croak("Permission denied\n");
a687059c 2039 }
fe14fcc3 2040#endif /* HAS_SETREUID */
a687059c
LW
2041#endif /* IAMSUID */
2042
27e2fb84 2043 if (!S_ISREG(statbuf.st_mode))
463ee0b2 2044 croak("Permission denied");
27e2fb84 2045 if (statbuf.st_mode & S_IWOTH)
463ee0b2 2046 croak("Setuid/gid script is writable by world");
13281fa4 2047 doswitches = FALSE; /* -s is insecure in suid */
79072805 2048 curcop->cop_line++;
760ac839
LW
2049 if (sv_gets(linestr, rsfp, 0) == Nullch ||
2050 strnNE(SvPV(linestr,na),"#!",2) ) /* required even on Sys V */
463ee0b2 2051 croak("No #! line");
760ac839 2052 s = SvPV(linestr,na)+2;
663a0e37 2053 if (*s == ' ') s++;
45d8adaa 2054 while (!isSPACE(*s)) s++;
760ac839 2055 for (s2 = s; (s2 > SvPV(linestr,na)+2 &&
6e72f9df 2056 (isDIGIT(s2[-1]) || strchr("._-", s2[-1]))); s2--) ;
2057 if (strnNE(s2-4,"perl",4) && strnNE(s-9,"perl",4)) /* sanity check */
463ee0b2 2058 croak("Not a perl script");
a687059c 2059 while (*s == ' ' || *s == '\t') s++;
13281fa4
LW
2060 /*
2061 * #! arg must be what we saw above. They can invoke it by
2062 * mentioning suidperl explicitly, but they may not add any strange
2063 * arguments beyond what #! says if they do invoke suidperl that way.
2064 */
2065 len = strlen(validarg);
2066 if (strEQ(validarg," PHOOEY ") ||
45d8adaa 2067 strnNE(s,validarg,len) || !isSPACE(s[len]))
463ee0b2 2068 croak("Args must match #! line");
a687059c
LW
2069
2070#ifndef IAMSUID
2071 if (euid != uid && (statbuf.st_mode & S_ISUID) &&
2072 euid == statbuf.st_uid)
2073 if (!do_undump)
463ee0b2 2074 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
a687059c
LW
2075FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2076#endif /* IAMSUID */
13281fa4
LW
2077
2078 if (euid) { /* oops, we're not the setuid root perl */
760ac839 2079 (void)PerlIO_close(rsfp);
13281fa4 2080#ifndef IAMSUID
46fc3d4c 2081 /* try again */
3028581b 2082 PerlProc_execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
13281fa4 2083#endif
463ee0b2 2084 croak("Can't do setuid\n");
13281fa4
LW
2085 }
2086
83025b21 2087 if (statbuf.st_mode & S_ISGID && statbuf.st_gid != egid) {
fe14fcc3 2088#ifdef HAS_SETEGID
a687059c
LW
2089 (void)setegid(statbuf.st_gid);
2090#else
fe14fcc3 2091#ifdef HAS_SETREGID
85e6fe83
LW
2092 (void)setregid((Gid_t)-1,statbuf.st_gid);
2093#else
2094#ifdef HAS_SETRESGID
2095 (void)setresgid((Gid_t)-1,statbuf.st_gid,(Gid_t)-1);
a687059c
LW
2096#else
2097 setgid(statbuf.st_gid);
2098#endif
2099#endif
85e6fe83 2100#endif
83025b21 2101 if (getegid() != statbuf.st_gid)
463ee0b2 2102 croak("Can't do setegid!\n");
83025b21 2103 }
a687059c
LW
2104 if (statbuf.st_mode & S_ISUID) {
2105 if (statbuf.st_uid != euid)
fe14fcc3 2106#ifdef HAS_SETEUID
a687059c
LW
2107 (void)seteuid(statbuf.st_uid); /* all that for this */
2108#else
fe14fcc3 2109#ifdef HAS_SETREUID
85e6fe83
LW
2110 (void)setreuid((Uid_t)-1,statbuf.st_uid);
2111#else
2112#ifdef HAS_SETRESUID
2113 (void)setresuid((Uid_t)-1,statbuf.st_uid,(Uid_t)-1);
a687059c
LW
2114#else
2115 setuid(statbuf.st_uid);
2116#endif
2117#endif
85e6fe83 2118#endif
83025b21 2119 if (geteuid() != statbuf.st_uid)
463ee0b2 2120 croak("Can't do seteuid!\n");
a687059c 2121 }
83025b21 2122 else if (uid) { /* oops, mustn't run as root */
fe14fcc3 2123#ifdef HAS_SETEUID
85e6fe83 2124 (void)seteuid((Uid_t)uid);
a687059c 2125#else
fe14fcc3 2126#ifdef HAS_SETREUID
85e6fe83 2127 (void)setreuid((Uid_t)-1,(Uid_t)uid);
a687059c 2128#else
85e6fe83
LW
2129#ifdef HAS_SETRESUID
2130 (void)setresuid((Uid_t)-1,(Uid_t)uid,(Uid_t)-1);
2131#else
2132 setuid((Uid_t)uid);
2133#endif
a687059c
LW
2134#endif
2135#endif
83025b21 2136 if (geteuid() != uid)
463ee0b2 2137 croak("Can't do seteuid!\n");
83025b21 2138 }
748a9306 2139 init_ids();
27e2fb84 2140 if (!cando(S_IXUSR,TRUE,&statbuf))
463ee0b2 2141 croak("Permission denied\n"); /* they can't do this */
13281fa4
LW
2142 }
2143#ifdef IAMSUID
2144 else if (preprocess)
463ee0b2 2145 croak("-P not allowed for setuid/setgid script\n");
96436eeb 2146 else if (fdscript >= 0)
2147 croak("fd script not allowed in suidperl\n");
13281fa4 2148 else
463ee0b2 2149 croak("Script is not setuid/setgid in suidperl\n");
96436eeb 2150
2151 /* We absolutely must clear out any saved ids here, so we */
2152 /* exec the real perl, substituting fd script for scriptname. */
2153 /* (We pass script name as "subdir" of fd, which perl will grok.) */
760ac839 2154 PerlIO_rewind(rsfp);
3028581b 2155 PerlLIO_lseek(PerlIO_fileno(rsfp),(Off_t)0,0); /* just in case rewind didn't */
96436eeb 2156 for (which = 1; origargv[which] && origargv[which] != scriptname; which++) ;
2157 if (!origargv[which])
2158 croak("Permission denied");
46fc3d4c 2159 origargv[which] = savepv(form("/dev/fd/%d/%s",
2160 PerlIO_fileno(rsfp), origargv[which]));
96436eeb 2161#if defined(HAS_FCNTL) && defined(F_SETFD)
760ac839 2162 fcntl(PerlIO_fileno(rsfp),F_SETFD,0); /* ensure no close-on-exec */
96436eeb 2163#endif
3028581b 2164 PerlProc_execv(form("%s/perl%s", BIN_EXP, patchlevel), origargv); /* try again */
96436eeb 2165 croak("Can't do setuid\n");
13281fa4 2166#endif /* IAMSUID */
a687059c 2167#else /* !DOSUID */
a687059c
LW
2168 if (euid != uid || egid != gid) { /* (suidperl doesn't exist, in fact) */
2169#ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
96827780 2170 dTHR;
3028581b 2171 PerlLIO_fstat(PerlIO_fileno(rsfp),&statbuf); /* may be either wrapped or real suid */
a687059c
LW
2172 if ((euid != uid && euid == statbuf.st_uid && statbuf.st_mode & S_ISUID)
2173 ||
2174 (egid != gid && egid == statbuf.st_gid && statbuf.st_mode & S_ISGID)
2175 )
2176 if (!do_undump)
463ee0b2 2177 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
a687059c
LW
2178FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2179#endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
2180 /* not set-id, must be wrapped */
a687059c 2181 }
13281fa4 2182#endif /* DOSUID */
79072805 2183}
13281fa4 2184
79072805 2185static void
8ac85365 2186find_beginning(void)
79072805 2187{
6e72f9df 2188 register char *s, *s2;
33b78306
LW
2189
2190 /* skip forward in input to the real script? */
2191
bbce6d69 2192 forbid_setid("-x");
33b78306 2193 while (doextract) {
79072805 2194 if ((s = sv_gets(linestr, rsfp, 0)) == Nullch)
463ee0b2 2195 croak("No Perl script found in input\n");
6e72f9df 2196 if (*s == '#' && s[1] == '!' && (s = instr(s,"perl"))) {
760ac839 2197 PerlIO_ungetc(rsfp, '\n'); /* to keep line count right */
33b78306 2198 doextract = FALSE;
6e72f9df 2199 while (*s && !(isSPACE (*s) || *s == '#')) s++;
2200 s2 = s;
2201 while (*s == ' ' || *s == '\t') s++;
2202 if (*s++ == '-') {
2203 while (isDIGIT(s2[-1]) || strchr("-._", s2[-1])) s2--;
2204 if (strnEQ(s2-4,"perl",4))
2205 /*SUPPRESS 530*/
2206 while (s = moreswitches(s)) ;
33b78306 2207 }
3028581b 2208 if (cddir && PerlDir_chdir(cddir) < 0)
463ee0b2 2209 croak("Can't chdir to %s",cddir);
83025b21
LW
2210 }
2211 }
2212}
2213
79072805 2214static void
8ac85365 2215init_ids(void)
352d5a3a 2216{
748a9306
LW
2217 uid = (int)getuid();
2218 euid = (int)geteuid();
2219 gid = (int)getgid();
2220 egid = (int)getegid();
2221#ifdef VMS
2222 uid |= gid << 16;
2223 euid |= egid << 16;
2224#endif
4633a7c4 2225 tainting |= (uid && (euid != uid || egid != gid));
748a9306 2226}
79072805 2227
748a9306 2228static void
8ac85365 2229forbid_setid(char *s)
bbce6d69 2230{
2231 if (euid != uid)
2232 croak("No %s allowed while running setuid", s);
2233 if (egid != gid)
2234 croak("No %s allowed while running setgid", s);
2235}
2236
2237static void
8ac85365 2238init_debugger(void)
748a9306 2239{
11343788 2240 dTHR;
79072805 2241 curstash = debstash;
748a9306 2242 dbargs = GvAV(gv_AVadd((gv_fetchpv("args", GV_ADDMULTI, SVt_PVAV))));
79072805 2243 AvREAL_off(dbargs);
a0d0e21e
LW
2244 DBgv = gv_fetchpv("DB", GV_ADDMULTI, SVt_PVGV);
2245 DBline = gv_fetchpv("dbline", GV_ADDMULTI, SVt_PVAV);
748a9306
LW
2246 DBsub = gv_HVadd(gv_fetchpv("sub", GV_ADDMULTI, SVt_PVHV));
2247 DBsingle = GvSV((gv_fetchpv("single", GV_ADDMULTI, SVt_PV)));
c07a80fd 2248 sv_setiv(DBsingle, 0);
748a9306 2249 DBtrace = GvSV((gv_fetchpv("trace", GV_ADDMULTI, SVt_PV)));
c07a80fd 2250 sv_setiv(DBtrace, 0);
748a9306 2251 DBsignal = GvSV((gv_fetchpv("signal", GV_ADDMULTI, SVt_PV)));
c07a80fd 2252 sv_setiv(DBsignal, 0);
79072805 2253 curstash = defstash;
352d5a3a
LW
2254}
2255
2ce36478
SM
2256#ifndef STRESS_REALLOC
2257#define REASONABLE(size) (size)
2258#else
2259#define REASONABLE(size) (1) /* unreasonable */
2260#endif
2261
11343788 2262void
8ac85365 2263init_stacks(ARGSproto)
79072805 2264{
e336de0d
GS
2265 /* start with 128-item stack and 8K cxstack */
2266 curstackinfo = new_stackinfo(REASONABLE(128),
2267 REASONABLE(8192/sizeof(PERL_CONTEXT) - 1));
2268 curstackinfo->si_type = SI_MAIN;
2269 curstack = curstackinfo->si_stack;
5f05dabc 2270 mainstack = curstack; /* remember in case we switch stacks */
79072805 2271
6e72f9df 2272 stack_base = AvARRAY(curstack);
79072805 2273 stack_sp = stack_base;
e336de0d 2274 stack_max = stack_base + AvMAX(curstack);
8990e307 2275
2ce36478 2276 New(50,tmps_stack,REASONABLE(128),SV*);
6d4ff0d2 2277 tmps_floor = -1;
8990e307 2278 tmps_ix = -1;
2ce36478 2279 tmps_max = REASONABLE(128);
8990e307 2280
5f05dabc 2281 /*
2282 * The following stacks almost certainly should be per-interpreter,
2283 * but for now they're not. XXX
2284 */
2285
6e72f9df 2286 if (markstack) {
2287 markstack_ptr = markstack;
2288 } else {
2ce36478 2289 New(54,markstack,REASONABLE(32),I32);
6e72f9df 2290 markstack_ptr = markstack;
2ce36478 2291 markstack_max = markstack + REASONABLE(32);
6e72f9df 2292 }
79072805 2293
e336de0d
GS
2294 SET_MARKBASE;
2295
6e72f9df 2296 if (scopestack) {
2297 scopestack_ix = 0;
2298 } else {
2ce36478 2299 New(54,scopestack,REASONABLE(32),I32);
6e72f9df 2300 scopestack_ix = 0;
2ce36478 2301 scopestack_max = REASONABLE(32);
6e72f9df 2302 }
79072805 2303
6e72f9df 2304 if (savestack) {
2305 savestack_ix = 0;
2306 } else {
2ce36478 2307 New(54,savestack,REASONABLE(128),ANY);
6e72f9df 2308 savestack_ix = 0;
2ce36478 2309 savestack_max = REASONABLE(128);
6e72f9df 2310 }
79072805 2311
6e72f9df 2312 if (retstack) {
2313 retstack_ix = 0;
2314 } else {
2ce36478 2315 New(54,retstack,REASONABLE(16),OP*);
6e72f9df 2316 retstack_ix = 0;
2ce36478 2317 retstack_max = REASONABLE(16);
5f05dabc 2318 }
378cc40b 2319}
33b78306 2320
2ce36478
SM
2321#undef REASONABLE
2322
6e72f9df 2323static void
8ac85365 2324nuke_stacks(void)
6e72f9df 2325{
e858de61 2326 dTHR;
e336de0d
GS
2327 while (curstackinfo->si_next)
2328 curstackinfo = curstackinfo->si_next;
2329 while (curstackinfo) {
2330 PERL_SI *p = curstackinfo->si_prev;
bac4b2ad 2331 /* curstackinfo->si_stack got nuked by sv_free_arenas() */
e336de0d
GS
2332 Safefree(curstackinfo->si_cxstack);
2333 Safefree(curstackinfo);
2334 curstackinfo = p;
2335 }
6e72f9df 2336 Safefree(tmps_stack);
5f05dabc 2337 DEBUG( {
2338 Safefree(debname);
2339 Safefree(debdelim);
2340 } )
378cc40b 2341}
33b78306 2342
760ac839 2343static PerlIO *tmpfp; /* moved outside init_lexer() because of UNICOS bug */
7aa04957 2344
79072805 2345static void
8ac85365 2346init_lexer(void)
8990e307 2347{
a0d0e21e 2348 tmpfp = rsfp;
90248788 2349 rsfp = Nullfp;
8990e307
LW
2350 lex_start(linestr);
2351 rsfp = tmpfp;
2352 subname = newSVpv("main",4);
2353}
2354
2355static void
8ac85365 2356init_predump_symbols(void)
45d8adaa 2357{
11343788 2358 dTHR;
93a17b20 2359 GV *tmpgv;
a0d0e21e 2360 GV *othergv;
79072805 2361
e1c148c2 2362 sv_setpvn(perl_get_sv("\"", TRUE), " ", 1);
85e6fe83 2363 stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
a5f75d66 2364 GvMULTI_on(stdingv);
760ac839 2365 IoIFP(GvIOp(stdingv)) = PerlIO_stdin();
adbc6bb1 2366 tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
a5f75d66 2367 GvMULTI_on(tmpgv);
a0d0e21e 2368 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(stdingv));
79072805 2369
85e6fe83 2370 tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
a5f75d66 2371 GvMULTI_on(tmpgv);
760ac839 2372 IoOFP(GvIOp(tmpgv)) = IoIFP(GvIOp(tmpgv)) = PerlIO_stdout();
4633a7c4 2373 setdefout(tmpgv);
adbc6bb1 2374 tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
a5f75d66 2375 GvMULTI_on(tmpgv);
a0d0e21e 2376 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(defoutgv));
79072805 2377
a0d0e21e 2378 othergv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
a5f75d66 2379 GvMULTI_on(othergv);
760ac839 2380 IoOFP(GvIOp(othergv)) = IoIFP(GvIOp(othergv)) = PerlIO_stderr();
adbc6bb1 2381 tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
a5f75d66 2382 GvMULTI_on(tmpgv);
a0d0e21e 2383 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(othergv));
79072805
LW
2384
2385 statname = NEWSV(66,0); /* last filename we did stat on */
ab821d7f 2386
6e72f9df 2387 if (!osname)
2388 osname = savepv(OSNAME);
79072805 2389}
33b78306 2390
79072805 2391static void
8ac85365 2392init_postdump_symbols(register int argc, register char **argv, register char **env)
33b78306 2393{
a863c7d1 2394 dTHR;
79072805
LW
2395 char *s;
2396 SV *sv;
2397 GV* tmpgv;
fe14fcc3 2398
79072805
LW
2399 argc--,argv++; /* skip name of script */
2400 if (doswitches) {
2401 for (; argc > 0 && **argv == '-'; argc--,argv++) {
2402 if (!argv[0][1])
2403 break;
2404 if (argv[0][1] == '-') {
2405 argc--,argv++;
2406 break;
2407 }
93a17b20 2408 if (s = strchr(argv[0], '=')) {
79072805 2409 *s++ = '\0';
85e6fe83 2410 sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),s);
79072805
LW
2411 }
2412 else
85e6fe83 2413 sv_setiv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),1);
fe14fcc3 2414 }
79072805
LW
2415 }
2416 toptarget = NEWSV(0,0);
2417 sv_upgrade(toptarget, SVt_PVFM);
2418 sv_setpvn(toptarget, "", 0);
748a9306 2419 bodytarget = NEWSV(0,0);
79072805
LW
2420 sv_upgrade(bodytarget, SVt_PVFM);
2421 sv_setpvn(bodytarget, "", 0);
2422 formtarget = bodytarget;
2423
bbce6d69 2424 TAINT;
85e6fe83 2425 if (tmpgv = gv_fetchpv("0",TRUE, SVt_PV)) {
79072805
LW
2426 sv_setpv(GvSV(tmpgv),origfilename);
2427 magicname("0", "0", 1);
2428 }
85e6fe83 2429 if (tmpgv = gv_fetchpv("\030",TRUE, SVt_PV))
79072805 2430 sv_setpv(GvSV(tmpgv),origargv[0]);
85e6fe83 2431 if (argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV)) {
a5f75d66 2432 GvMULTI_on(argvgv);
79072805
LW
2433 (void)gv_AVadd(argvgv);
2434 av_clear(GvAVn(argvgv));
2435 for (; argc > 0; argc--,argv++) {
a0d0e21e 2436 av_push(GvAVn(argvgv),newSVpv(argv[0],0));
79072805
LW
2437 }
2438 }
85e6fe83 2439 if (envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV)) {
79072805 2440 HV *hv;
a5f75d66 2441 GvMULTI_on(envgv);
79072805 2442 hv = GvHVn(envgv);
5aabfad6 2443 hv_magic(hv, envgv, 'E');
a0d0e21e 2444#ifndef VMS /* VMS doesn't have environ array */
4633a7c4
LW
2445 /* Note that if the supplied env parameter is actually a copy
2446 of the global environ then it may now point to free'd memory
2447 if the environment has been modified since. To avoid this
2448 problem we treat env==NULL as meaning 'use the default'
2449 */
2450 if (!env)
2451 env = environ;
5aabfad6 2452 if (env != environ)
79072805
LW
2453 environ[0] = Nullch;
2454 for (; *env; env++) {
93a17b20 2455 if (!(s = strchr(*env,'=')))
79072805
LW
2456 continue;
2457 *s++ = '\0';
39e571d4 2458#if defined(WIN32) || defined(MSDOS)
137443ea 2459 (void)strupr(*env);
2460#endif
79072805
LW
2461 sv = newSVpv(s--,0);
2462 (void)hv_store(hv, *env, s - *env, sv, 0);
2463 *s = '=';
3e3baf6d
TB
2464#if defined(__BORLANDC__) && defined(USE_WIN32_RTL_ENV)
2465 /* Sins of the RTL. See note in my_setenv(). */
5fd9e9a4 2466 (void)PerlEnv_putenv(savepv(*env));
3e3baf6d 2467#endif
fe14fcc3 2468 }
4550b24a 2469#endif
2470#ifdef DYNAMIC_ENV_FETCH
2471 HvNAME(hv) = savepv(ENV_HV_NAME);
2472#endif
79072805 2473 }
bbce6d69 2474 TAINT_NOT;
85e6fe83 2475 if (tmpgv = gv_fetchpv("$",TRUE, SVt_PV))
1e422769 2476 sv_setiv(GvSV(tmpgv), (IV)getpid());
33b78306 2477}
34de22dd 2478
79072805 2479static void
8ac85365 2480init_perllib(void)
34de22dd 2481{
85e6fe83
LW
2482 char *s;
2483 if (!tainting) {
552a7a9b 2484#ifndef VMS
5fd9e9a4 2485 s = PerlEnv_getenv("PERL5LIB");
85e6fe83 2486 if (s)
774d564b 2487 incpush(s, TRUE);
85e6fe83 2488 else
5fd9e9a4 2489 incpush(PerlEnv_getenv("PERLLIB"), FALSE);
552a7a9b 2490#else /* VMS */
2491 /* Treat PERL5?LIB as a possible search list logical name -- the
2492 * "natural" VMS idiom for a Unix path string. We allow each
2493 * element to be a set of |-separated directories for compatibility.
2494 */
2495 char buf[256];
2496 int idx = 0;
2497 if (my_trnlnm("PERL5LIB",buf,0))
774d564b 2498 do { incpush(buf,TRUE); } while (my_trnlnm("PERL5LIB",buf,++idx));
552a7a9b 2499 else
774d564b 2500 while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE);
552a7a9b 2501#endif /* VMS */
85e6fe83 2502 }
34de22dd 2503
c90c0ff4 2504/* Use the ~-expanded versions of APPLLIB (undocumented),
dfe9444c 2505 ARCHLIB PRIVLIB SITEARCH and SITELIB
df5cef82 2506*/
4633a7c4 2507#ifdef APPLLIB_EXP
43051805 2508 incpush(APPLLIB_EXP, TRUE);
16d20bd9 2509#endif
4633a7c4 2510
fed7345c 2511#ifdef ARCHLIB_EXP
774d564b 2512 incpush(ARCHLIB_EXP, FALSE);
a0d0e21e 2513#endif
fed7345c
AD
2514#ifndef PRIVLIB_EXP
2515#define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
34de22dd 2516#endif
774d564b 2517 incpush(PRIVLIB_EXP, FALSE);
4633a7c4
LW
2518
2519#ifdef SITEARCH_EXP
774d564b 2520 incpush(SITEARCH_EXP, FALSE);
4633a7c4
LW
2521#endif
2522#ifdef SITELIB_EXP
774d564b 2523 incpush(SITELIB_EXP, FALSE);
4633a7c4 2524#endif
4633a7c4 2525 if (!tainting)
774d564b 2526 incpush(".", FALSE);
2527}
2528
2529#if defined(DOSISH)
2530# define PERLLIB_SEP ';'
2531#else
2532# if defined(VMS)
2533# define PERLLIB_SEP '|'
2534# else
2535# define PERLLIB_SEP ':'
2536# endif
2537#endif
2538#ifndef PERLLIB_MANGLE
2539# define PERLLIB_MANGLE(s,n) (s)
2540#endif
2541
2542static void
8ac85365 2543incpush(char *p, int addsubdirs)
774d564b 2544{
2545 SV *subdir = Nullsv;
2546 static char *archpat_auto;
2547
2548 if (!p)
2549 return;
2550
2551 if (addsubdirs) {
8c52afec 2552 subdir = NEWSV(55,0);
774d564b 2553 if (!archpat_auto) {
2554 STRLEN len = (sizeof(ARCHNAME) + strlen(patchlevel)
2555 + sizeof("//auto"));
2556 New(55, archpat_auto, len, char);
2557 sprintf(archpat_auto, "/%s/%s/auto", ARCHNAME, patchlevel);
aa689395 2558#ifdef VMS
2559 for (len = sizeof(ARCHNAME) + 2;
2560 archpat_auto[len] != '\0' && archpat_auto[len] != '/'; len++)
2561 if (archpat_auto[len] == '.') archpat_auto[len] = '_';
2562#endif
774d564b 2563 }
2564 }
2565
2566 /* Break at all separators */
2567 while (p && *p) {
8c52afec 2568 SV *libdir = NEWSV(55,0);
774d564b 2569 char *s;
2570
2571 /* skip any consecutive separators */
2572 while ( *p == PERLLIB_SEP ) {
2573 /* Uncomment the next line for PATH semantics */
2574 /* av_push(GvAVn(incgv), newSVpv(".", 1)); */
2575 p++;
2576 }
2577
2578 if ( (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
2579 sv_setpvn(libdir, PERLLIB_MANGLE(p, (STRLEN)(s - p)),
2580 (STRLEN)(s - p));
2581 p = s + 1;
2582 }
2583 else {
2584 sv_setpv(libdir, PERLLIB_MANGLE(p, 0));
2585 p = Nullch; /* break out */
2586 }
2587
2588 /*
2589 * BEFORE pushing libdir onto @INC we may first push version- and
2590 * archname-specific sub-directories.
2591 */
2592 if (addsubdirs) {
2593 struct stat tmpstatbuf;
aa689395 2594#ifdef VMS
2595 char *unix;
2596 STRLEN len;
774d564b 2597
aa689395 2598 if ((unix = tounixspec_ts(SvPV(libdir,na),Nullch)) != Nullch) {
2599 len = strlen(unix);
2600 while (unix[len-1] == '/') len--; /* Cosmetic */
2601 sv_usepvn(libdir,unix,len);
2602 }
2603 else
2604 PerlIO_printf(PerlIO_stderr(),
2605 "Failed to unixify @INC element \"%s\"\n",
2606 SvPV(libdir,na));
2607#endif
4fdae800 2608 /* .../archname/version if -d .../archname/version/auto */
774d564b 2609 sv_setsv(subdir, libdir);
2610 sv_catpv(subdir, archpat_auto);
c6ed36e1 2611 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
774d564b 2612 S_ISDIR(tmpstatbuf.st_mode))
2613 av_push(GvAVn(incgv),
2614 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2615
4fdae800 2616 /* .../archname if -d .../archname/auto */
774d564b 2617 sv_insert(subdir, SvCUR(libdir) + sizeof(ARCHNAME),
2618 strlen(patchlevel) + 1, "", 0);
c6ed36e1 2619 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
774d564b 2620 S_ISDIR(tmpstatbuf.st_mode))
2621 av_push(GvAVn(incgv),
2622 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2623 }
2624
2625 /* finally push this lib directory on the end of @INC */
2626 av_push(GvAVn(incgv), libdir);
2627 }
2628
2629 SvREFCNT_dec(subdir);
34de22dd 2630}
93a17b20 2631
199100c8 2632#ifdef USE_THREADS
52e1cb5e 2633static struct perl_thread *
199100c8
MB
2634init_main_thread()
2635{
52e1cb5e 2636 struct perl_thread *thr;
199100c8
MB
2637 XPV *xpv;
2638
52e1cb5e 2639 Newz(53, thr, 1, struct perl_thread);
199100c8
MB
2640 curcop = &compiling;
2641 thr->cvcache = newHV();
54b9620d 2642 thr->threadsv = newAV();
940cb80d 2643 /* thr->threadsvp is set when find_threadsv is called */
199100c8 2644 thr->specific = newAV();
38a03e6e 2645 thr->errhv = newHV();
199100c8
MB
2646 thr->flags = THRf_R_JOINABLE;
2647 MUTEX_INIT(&thr->mutex);
2648 /* Handcraft thrsv similarly to mess_sv */
2649 New(53, thrsv, 1, SV);
2650 Newz(53, xpv, 1, XPV);
2651 SvFLAGS(thrsv) = SVt_PV;
2652 SvANY(thrsv) = (void*)xpv;
2653 SvREFCNT(thrsv) = 1 << 30; /* practically infinite */
2654 SvPVX(thrsv) = (char*)thr;
2655 SvCUR_set(thrsv, sizeof(thr));
2656 SvLEN_set(thrsv, sizeof(thr));
2657 *SvEND(thrsv) = '\0'; /* in the trailing_nul field */
2658 thr->oursv = thrsv;
199100c8
MB
2659 chopset = " \n-";
2660
2661 MUTEX_LOCK(&threads_mutex);
2662 nthreads++;
2663 thr->tid = 0;
2664 thr->next = thr;
2665 thr->prev = thr;
2666 MUTEX_UNLOCK(&threads_mutex);
2667
4b026b9e
GS
2668#ifdef HAVE_THREAD_INTERN
2669 init_thread_intern(thr);
235db74f
GS
2670#endif
2671
2672#ifdef SET_THREAD_SELF
2673 SET_THREAD_SELF(thr);
199100c8
MB
2674#else
2675 thr->self = pthread_self();
235db74f 2676#endif /* SET_THREAD_SELF */
199100c8
MB
2677 SET_THR(thr);
2678
2679 /*
2680 * These must come after the SET_THR because sv_setpvn does
2681 * SvTAINT and the taint fields require dTHR.
2682 */
2683 toptarget = NEWSV(0,0);
2684 sv_upgrade(toptarget, SVt_PVFM);
2685 sv_setpvn(toptarget, "", 0);
2686 bodytarget = NEWSV(0,0);
2687 sv_upgrade(bodytarget, SVt_PVFM);
2688 sv_setpvn(bodytarget, "", 0);
2689 formtarget = bodytarget;
2faa37cc 2690 thr->errsv = newSVpv("", 0);
78857c3c 2691 (void) find_threadsv("@"); /* Ensure $@ is initialised early */
199100c8
MB
2692 return thr;
2693}
2694#endif /* USE_THREADS */
2695
93a17b20 2696void
8ac85365 2697call_list(I32 oldscope, AV *list)
93a17b20 2698{
11343788 2699 dTHR;
a0d0e21e 2700 line_t oldline = curcop->cop_line;
22921e25
CS
2701 STRLEN len;
2702 dJMPENV;
2703 int ret;
93a17b20 2704
93965878 2705 while (AvFILL(list) >= 0) {
8990e307 2706 CV *cv = (CV*)av_shift(list);
93a17b20 2707
8990e307 2708 SAVEFREESV(cv);
a0d0e21e 2709
22921e25
CS
2710 JMPENV_PUSH(ret);
2711 switch (ret) {
748a9306 2712 case 0: {
38a03e6e 2713 SV* atsv = ERRSV;
748a9306
LW
2714 PUSHMARK(stack_sp);
2715 perl_call_sv((SV*)cv, G_EVAL|G_DISCARD);
12f917ad 2716 (void)SvPV(atsv, len);
748a9306 2717 if (len) {
54310121 2718 JMPENV_POP;
748a9306
LW
2719 curcop = &compiling;
2720 curcop->cop_line = oldline;
2721 if (list == beginav)
12f917ad 2722 sv_catpv(atsv, "BEGIN failed--compilation aborted");
748a9306 2723 else
12f917ad 2724 sv_catpv(atsv, "END failed--cleanup aborted");
2ae324a7 2725 while (scopestack_ix > oldscope)
2726 LEAVE;
12f917ad 2727 croak("%s", SvPVX(atsv));
748a9306 2728 }
a0d0e21e 2729 }
85e6fe83
LW
2730 break;
2731 case 1:
f86702cc 2732 STATUS_ALL_FAILURE;
85e6fe83
LW
2733 /* FALL THROUGH */
2734 case 2:
2735 /* my_exit() was called */
2ae324a7 2736 while (scopestack_ix > oldscope)
2737 LEAVE;
84902520 2738 FREETMPS;
85e6fe83
LW
2739 curstash = defstash;
2740 if (endav)
68dc0745 2741 call_list(oldscope, endav);
54310121 2742 JMPENV_POP;
a0d0e21e
LW
2743 curcop = &compiling;
2744 curcop->cop_line = oldline;
85e6fe83
LW
2745 if (statusvalue) {
2746 if (list == beginav)
a0d0e21e 2747 croak("BEGIN failed--compilation aborted");
85e6fe83 2748 else
a0d0e21e 2749 croak("END failed--cleanup aborted");
85e6fe83 2750 }
f86702cc 2751 my_exit_jump();
85e6fe83 2752 /* NOTREACHED */
85e6fe83
LW
2753 case 3:
2754 if (!restartop) {
760ac839 2755 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
a0d0e21e 2756 FREETMPS;
85e6fe83
LW
2757 break;
2758 }
54310121 2759 JMPENV_POP;
a0d0e21e
LW
2760 curcop = &compiling;
2761 curcop->cop_line = oldline;
54310121 2762 JMPENV_JUMP(3);
8990e307 2763 }
54310121 2764 JMPENV_POP;
93a17b20 2765 }
93a17b20 2766}
93a17b20 2767
f86702cc 2768void
8ac85365 2769my_exit(U32 status)
f86702cc 2770{
5dc0d613
MB
2771 dTHR;
2772
2773#ifdef USE_THREADS
a863c7d1
MB
2774 DEBUG_L(PerlIO_printf(Perl_debug_log, "my_exit: thread %p, status %lu\n",
2775 thr, (unsigned long) status));
5dc0d613 2776#endif /* USE_THREADS */
f86702cc 2777 switch (status) {
2778 case 0:
2779 STATUS_ALL_SUCCESS;
2780 break;
2781 case 1:
2782 STATUS_ALL_FAILURE;
2783 break;
2784 default:
2785 STATUS_NATIVE_SET(status);
2786 break;
2787 }
2788 my_exit_jump();
2789}
2790
2791void
8ac85365 2792my_failure_exit(void)
f86702cc 2793{
2794#ifdef VMS
2795 if (vaxc$errno & 1) {
4fdae800 2796 if (STATUS_NATIVE & 1) /* fortuitiously includes "-1" */
2797 STATUS_NATIVE_SET(44);
f86702cc 2798 }
2799 else {
ff0cee69 2800 if (!vaxc$errno && errno) /* unlikely */
4fdae800 2801 STATUS_NATIVE_SET(44);
f86702cc 2802 else
4fdae800 2803 STATUS_NATIVE_SET(vaxc$errno);
f86702cc 2804 }
2805#else
9b599b2a 2806 int exitstatus;
f86702cc 2807 if (errno & 255)
2808 STATUS_POSIX_SET(errno);
9b599b2a
GS
2809 else {
2810 exitstatus = STATUS_POSIX >> 8;
2811 if (exitstatus & 255)
2812 STATUS_POSIX_SET(exitstatus);
2813 else
2814 STATUS_POSIX_SET(255);
2815 }
f86702cc 2816#endif
2817 my_exit_jump();
93a17b20
LW
2818}
2819
f86702cc 2820static void
8ac85365 2821my_exit_jump(void)
f86702cc 2822{
bac4b2ad 2823 dSP;
c09156bb 2824 register PERL_CONTEXT *cx;
f86702cc 2825 I32 gimme;
2826 SV **newsp;
2827
2828 if (e_tmpname) {
2829 if (e_fp) {
2830 PerlIO_close(e_fp);
2831 e_fp = Nullfp;
2832 }
2833 (void)UNLINK(e_tmpname);
2834 Safefree(e_tmpname);
2835 e_tmpname = Nullch;
2836 }
2837
bac4b2ad 2838 POPSTACK_TO(mainstack);
f86702cc 2839 if (cxstack_ix >= 0) {
2840 if (cxstack_ix > 0)
2841 dounwind(0);
2842 POPBLOCK(cx,curpm);
2843 LEAVE;
2844 }
ff0cee69 2845
54310121 2846 JMPENV_JUMP(2);
f86702cc 2847}
4e35701f 2848
aeea060c 2849
22239a37 2850