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