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