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