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