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