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