This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Add byteorder to the myconfig output.
[perl5.git] / perl.c
CommitLineData
a0d0e21e
LW
1/* perl.c
2 *
3818b22b 3 * Copyright (c) 1987-2000 Larry Wall
a687059c 4 *
352d5a3a
LW
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
a687059c 7 *
8d063cd8
LW
8 */
9
a0d0e21e
LW
10/*
11 * "A ship then new they built for him/of mithril and of elven glass" --Bilbo
12 */
45d8adaa 13
378cc40b 14#include "EXTERN.h"
864dbfa3 15#define PERL_IN_PERL_C
378cc40b 16#include "perl.h"
e3321bb0 17#include "patchlevel.h" /* for local_patches */
378cc40b 18
df5cef82 19/* XXX If this causes problems, set i_unistd=undef in the hint file. */
a0d0e21e
LW
20#ifdef I_UNISTD
21#include <unistd.h>
22#endif
a0d0e21e 23
54310121 24#if !defined(STANDARD_C) && !defined(HAS_GETENV_PROTOTYPE)
20ce7b12 25char *getenv (char *); /* Usually in <stdlib.h> */
54310121 26#endif
27
0cb96387
GS
28static I32 read_e_script(pTHXo_ int idx, SV *buf_sv, int maxlen);
29
a687059c
LW
30#ifdef IAMSUID
31#ifndef DOSUID
32#define DOSUID
33#endif
34#endif
378cc40b 35
a687059c
LW
36#ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
37#ifdef DOSUID
38#undef DOSUID
39#endif
40#endif
8d063cd8 41
873ef191 42#ifdef PERL_OBJECT
7766f137
GS
43#define perl_construct Perl_construct
44#define perl_parse Perl_parse
45#define perl_run Perl_run
46#define perl_destruct Perl_destruct
47#define perl_free Perl_free
48#endif
32e30700 49
06d86050
GS
50#if defined(USE_THREADS)
51# define INIT_TLS_AND_INTERP \
52 STMT_START { \
53 if (!PL_curinterp) { \
54 PERL_SET_INTERP(my_perl); \
55 INIT_THREADS; \
56 ALLOC_THREAD_KEY; \
57 } \
58 } STMT_END
59#else
60# if defined(USE_ITHREADS)
61# define INIT_TLS_AND_INTERP \
62 STMT_START { \
63 if (!PL_curinterp) { \
64 PERL_SET_INTERP(my_perl); \
65 INIT_THREADS; \
66 ALLOC_THREAD_KEY; \
534825c4
GS
67 PERL_SET_THX(my_perl); \
68 OP_REFCNT_INIT; \
69 } \
70 else { \
71 PERL_SET_THX(my_perl); \
06d86050 72 } \
06d86050
GS
73 } STMT_END
74# else
75# define INIT_TLS_AND_INTERP \
76 STMT_START { \
77 if (!PL_curinterp) { \
78 PERL_SET_INTERP(my_perl); \
79 } \
80 PERL_SET_THX(my_perl); \
81 } STMT_END
82# endif
83#endif
84
32e30700
GS
85#ifdef PERL_IMPLICIT_SYS
86PerlInterpreter *
7766f137
GS
87perl_alloc_using(struct IPerlMem* ipM, struct IPerlMem* ipMS,
88 struct IPerlMem* ipMP, struct IPerlEnv* ipE,
32e30700
GS
89 struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
90 struct IPerlDir* ipD, struct IPerlSock* ipS,
91 struct IPerlProc* ipP)
92{
93 PerlInterpreter *my_perl;
7766f137
GS
94#ifdef PERL_OBJECT
95 my_perl = (PerlInterpreter*)new(ipM) CPerlObj(ipM, ipMS, ipMP, ipE, ipStd,
96 ipLIO, ipD, ipS, ipP);
06d86050 97 INIT_TLS_AND_INTERP;
7766f137 98#else
32e30700
GS
99 /* New() needs interpreter, so call malloc() instead */
100 my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
06d86050 101 INIT_TLS_AND_INTERP;
32e30700
GS
102 Zero(my_perl, 1, PerlInterpreter);
103 PL_Mem = ipM;
7766f137
GS
104 PL_MemShared = ipMS;
105 PL_MemParse = ipMP;
32e30700
GS
106 PL_Env = ipE;
107 PL_StdIO = ipStd;
108 PL_LIO = ipLIO;
109 PL_Dir = ipD;
110 PL_Sock = ipS;
111 PL_Proc = ipP;
7766f137
GS
112#endif
113
32e30700
GS
114 return my_perl;
115}
116#else
954c1994
GS
117
118/*
119=for apidoc perl_alloc
120
121Allocates a new Perl interpreter. See L<perlembed>.
122
123=cut
124*/
125
93a17b20 126PerlInterpreter *
cea2e8a9 127perl_alloc(void)
79072805 128{
cea2e8a9 129 PerlInterpreter *my_perl;
79072805 130
54aff467 131 /* New() needs interpreter, so call malloc() instead */
e8ee3774 132 my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
ba869deb 133
06d86050 134 INIT_TLS_AND_INTERP;
dedcbb81 135 Zero(my_perl, 1, PerlInterpreter);
cea2e8a9 136 return my_perl;
79072805 137}
32e30700 138#endif /* PERL_IMPLICIT_SYS */
79072805 139
954c1994
GS
140/*
141=for apidoc perl_construct
142
143Initializes a new Perl interpreter. See L<perlembed>.
144
145=cut
146*/
147
79072805 148void
0cb96387 149perl_construct(pTHXx)
79072805 150{
a863c7d1
MB
151#ifdef USE_THREADS
152 int i;
153#ifndef FAKE_THREADS
e1f15930 154 struct perl_thread *thr = NULL;
a863c7d1
MB
155#endif /* FAKE_THREADS */
156#endif /* USE_THREADS */
ba869deb 157
8990e307 158#ifdef MULTIPLICITY
54aff467
GS
159 init_interp();
160 PL_perl_destruct_level = 1;
161#else
162 if (PL_perl_destruct_level > 0)
163 init_interp();
164#endif
165
33f46ff6 166 /* Init the real globals (and main thread)? */
3280af22 167 if (!PL_linestr) {
1feb2720 168#ifdef USE_THREADS
533c011a 169 MUTEX_INIT(&PL_sv_mutex);
a863c7d1
MB
170 /*
171 * Safe to use basic SV functions from now on (though
172 * not things like mortals or tainting yet).
173 */
533c011a
NIS
174 MUTEX_INIT(&PL_eval_mutex);
175 COND_INIT(&PL_eval_cond);
176 MUTEX_INIT(&PL_threads_mutex);
177 COND_INIT(&PL_nthreads_cond);
ba869deb 178# ifdef EMULATE_ATOMIC_REFCOUNTS
533c011a 179 MUTEX_INIT(&PL_svref_mutex);
ba869deb 180# endif /* EMULATE_ATOMIC_REFCOUNTS */
a863c7d1 181
5ff3f7a4 182 MUTEX_INIT(&PL_cred_mutex);
3d35f11b
GS
183 MUTEX_INIT(&PL_sv_lock_mutex);
184 MUTEX_INIT(&PL_fdpid_mutex);
5ff3f7a4 185
199100c8 186 thr = init_main_thread();
11343788
MB
187#endif /* USE_THREADS */
188
14dd3ad8 189#ifdef PERL_FLEXIBLE_EXCEPTIONS
0b94c7bb 190 PL_protect = MEMBER_TO_FPTR(Perl_default_protect); /* for exceptions */
14dd3ad8 191#endif
312caa8e 192
2aea9f8a
GS
193 PL_curcop = &PL_compiling; /* needed by ckWARN, right away */
194
3280af22
NIS
195 PL_linestr = NEWSV(65,79);
196 sv_upgrade(PL_linestr,SVt_PVIV);
79072805 197
3280af22 198 if (!SvREADONLY(&PL_sv_undef)) {
d689ffdd
JP
199 /* set read-only and try to insure than we wont see REFCNT==0
200 very often */
201
3280af22
NIS
202 SvREADONLY_on(&PL_sv_undef);
203 SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
79072805 204
3280af22
NIS
205 sv_setpv(&PL_sv_no,PL_No);
206 SvNV(&PL_sv_no);
207 SvREADONLY_on(&PL_sv_no);
208 SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
79072805 209
3280af22
NIS
210 sv_setpv(&PL_sv_yes,PL_Yes);
211 SvNV(&PL_sv_yes);
212 SvREADONLY_on(&PL_sv_yes);
213 SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
6e72f9df 214 }
79072805 215
76e3520e
GS
216#ifdef PERL_OBJECT
217 /* TODO: */
6b88bc9c 218 /* PL_sighandlerp = sighandler; */
76e3520e 219#else
cea2e8a9 220 PL_sighandlerp = Perl_sighandler;
76e3520e 221#endif
3280af22 222 PL_pidstatus = newHV();
44a8e56a 223
79072805
LW
224#ifdef MSDOS
225 /*
226 * There is no way we can refer to them from Perl so close them to save
227 * space. The other alternative would be to provide STDAUX and STDPRN
228 * filehandles.
229 */
230 (void)fclose(stdaux);
231 (void)fclose(stdprn);
232#endif
233 }
234
79cb57f6 235 PL_nrs = newSVpvn("\n", 1);
3280af22 236 PL_rs = SvREFCNT_inc(PL_nrs);
dc92893f 237
cea2e8a9 238 init_stacks();
79072805 239
748a9306 240 init_ids();
3280af22 241 PL_lex_state = LEX_NOTPARSING;
a5f75d66 242
312caa8e 243 JMPENV_BOOTSTRAP;
f86702cc 244 STATUS_ALL_SUCCESS;
245
0672f40e 246 init_i18nl10n(1);
36477c24 247 SET_NUMERIC_STANDARD();
0b5b802d 248
a7cb1f99
GS
249 {
250 U8 *s;
251 PL_patchlevel = NEWSV(0,4);
155aba94 252 (void)SvUPGRADE(PL_patchlevel, SVt_PVNV);
a7cb1f99 253 if (PERL_REVISION > 127 || PERL_VERSION > 127 || PERL_SUBVERSION > 127)
806e7201 254 SvGROW(PL_patchlevel, UTF8_MAXLEN*3+1);
a7cb1f99
GS
255 s = (U8*)SvPVX(PL_patchlevel);
256 s = uv_to_utf8(s, (UV)PERL_REVISION);
257 s = uv_to_utf8(s, (UV)PERL_VERSION);
258 s = uv_to_utf8(s, (UV)PERL_SUBVERSION);
259 *s = '\0';
260 SvCUR_set(PL_patchlevel, s - (U8*)SvPVX(PL_patchlevel));
261 SvPOK_on(PL_patchlevel);
262 SvNVX(PL_patchlevel) = (NV)PERL_REVISION
263 + ((NV)PERL_VERSION / (NV)1000)
cceca5ed 264#if defined(PERL_SUBVERSION) && PERL_SUBVERSION > 0
a7cb1f99 265 + ((NV)PERL_SUBVERSION / (NV)1000000)
a5f75d66 266#endif
a7cb1f99
GS
267 ;
268 SvNOK_on(PL_patchlevel); /* dual valued */
269 SvUTF8_on(PL_patchlevel);
270 SvREADONLY_on(PL_patchlevel);
271 }
79072805 272
ab821d7f 273#if defined(LOCAL_PATCH_COUNT)
3280af22 274 PL_localpatches = local_patches; /* For possible -v */
ab821d7f 275#endif
276
52853b95
GS
277#ifdef HAVE_INTERP_INTERN
278 sys_intern_init();
279#endif
280
4b556e6c 281 PerlIO_init(); /* Hook to IO system */
760ac839 282
3280af22
NIS
283 PL_fdpid = newAV(); /* for remembering popen pids by fd */
284 PL_modglobal = newHV(); /* pointers to per-interpreter module globals */
24944567 285 PL_errors = newSVpvn("",0);
8990e307 286
8990e307 287 ENTER;
79072805
LW
288}
289
954c1994
GS
290/*
291=for apidoc perl_destruct
292
293Shuts down a Perl interpreter. See L<perlembed>.
294
295=cut
296*/
297
79072805 298void
0cb96387 299perl_destruct(pTHXx)
79072805 300{
11343788 301 dTHR;
748a9306 302 int destruct_level; /* 0=none, 1=full, 2=full with checks */
8990e307 303 I32 last_sv_count;
a0d0e21e 304 HV *hv;
1f2bfc8a 305#ifdef USE_THREADS
33f46ff6 306 Thread t;
cea2e8a9 307 dTHX;
1f2bfc8a 308#endif /* USE_THREADS */
8990e307 309
7766f137
GS
310 /* wait for all pseudo-forked children to finish */
311 PERL_WAIT_FOR_CHILDREN;
312
11343788 313#ifdef USE_THREADS
0f15f207 314#ifndef FAKE_THREADS
8023c3ce
MB
315 /* Pass 1 on any remaining threads: detach joinables, join zombies */
316 retry_cleanup:
533c011a 317 MUTEX_LOCK(&PL_threads_mutex);
bf49b057 318 DEBUG_S(PerlIO_printf(Perl_debug_log,
c7848ba1 319 "perl_destruct: waiting for %d threads...\n",
533c011a 320 PL_nthreads - 1));
33f46ff6 321 for (t = thr->next; t != thr; t = t->next) {
605e5515
MB
322 MUTEX_LOCK(&t->mutex);
323 switch (ThrSTATE(t)) {
324 AV *av;
c7848ba1 325 case THRf_ZOMBIE:
bf49b057 326 DEBUG_S(PerlIO_printf(Perl_debug_log,
c7848ba1 327 "perl_destruct: joining zombie %p\n", t));
605e5515
MB
328 ThrSETSTATE(t, THRf_DEAD);
329 MUTEX_UNLOCK(&t->mutex);
533c011a 330 PL_nthreads--;
8023c3ce
MB
331 /*
332 * The SvREFCNT_dec below may take a long time (e.g. av
333 * may contain an object scalar whose destructor gets
334 * called) so we have to unlock threads_mutex and start
335 * all over again.
336 */
533c011a 337 MUTEX_UNLOCK(&PL_threads_mutex);
ea0efc06 338 JOIN(t, &av);
605e5515 339 SvREFCNT_dec((SV*)av);
bf49b057 340 DEBUG_S(PerlIO_printf(Perl_debug_log,
c7848ba1 341 "perl_destruct: joined zombie %p OK\n", t));
8023c3ce 342 goto retry_cleanup;
c7848ba1 343 case THRf_R_JOINABLE:
bf49b057 344 DEBUG_S(PerlIO_printf(Perl_debug_log,
c7848ba1
MB
345 "perl_destruct: detaching thread %p\n", t));
346 ThrSETSTATE(t, THRf_R_DETACHED);
347 /*
348 * We unlock threads_mutex and t->mutex in the opposite order
349 * from which we locked them just so that DETACH won't
350 * deadlock if it panics. It's only a breach of good style
351 * not a bug since they are unlocks not locks.
352 */
533c011a 353 MUTEX_UNLOCK(&PL_threads_mutex);
c7848ba1
MB
354 DETACH(t);
355 MUTEX_UNLOCK(&t->mutex);
8023c3ce 356 goto retry_cleanup;
c7848ba1 357 default:
bf49b057 358 DEBUG_S(PerlIO_printf(Perl_debug_log,
c7848ba1
MB
359 "perl_destruct: ignoring %p (state %u)\n",
360 t, ThrSTATE(t)));
361 MUTEX_UNLOCK(&t->mutex);
c7848ba1 362 /* fall through and out */
33f46ff6
MB
363 }
364 }
8023c3ce
MB
365 /* We leave the above "Pass 1" loop with threads_mutex still locked */
366
367 /* Pass 2 on remaining threads: wait for the thread count to drop to one */
533c011a 368 while (PL_nthreads > 1)
11343788 369 {
bf49b057 370 DEBUG_S(PerlIO_printf(Perl_debug_log,
c7848ba1 371 "perl_destruct: final wait for %d threads\n",
533c011a
NIS
372 PL_nthreads - 1));
373 COND_WAIT(&PL_nthreads_cond, &PL_threads_mutex);
11343788
MB
374 }
375 /* At this point, we're the last thread */
533c011a 376 MUTEX_UNLOCK(&PL_threads_mutex);
bf49b057 377 DEBUG_S(PerlIO_printf(Perl_debug_log, "perl_destruct: armageddon has arrived\n"));
533c011a
NIS
378 MUTEX_DESTROY(&PL_threads_mutex);
379 COND_DESTROY(&PL_nthreads_cond);
0f15f207 380#endif /* !defined(FAKE_THREADS) */
11343788
MB
381#endif /* USE_THREADS */
382
3280af22 383 destruct_level = PL_perl_destruct_level;
4633a7c4
LW
384#ifdef DEBUGGING
385 {
386 char *s;
155aba94 387 if ((s = PerlEnv_getenv("PERL_DESTRUCT_LEVEL"))) {
5f05dabc 388 int i = atoi(s);
389 if (destruct_level < i)
390 destruct_level = i;
391 }
4633a7c4
LW
392 }
393#endif
394
8990e307 395 LEAVE;
a0d0e21e
LW
396 FREETMPS;
397
ff0cee69 398 /* We must account for everything. */
399
400 /* Destroy the main CV and syntax tree */
3280af22
NIS
401 if (PL_main_root) {
402 PL_curpad = AvARRAY(PL_comppad);
403 op_free(PL_main_root);
404 PL_main_root = Nullop;
a0d0e21e 405 }
3280af22
NIS
406 PL_curcop = &PL_compiling;
407 PL_main_start = Nullop;
408 SvREFCNT_dec(PL_main_cv);
409 PL_main_cv = Nullcv;
24d3c518 410 PL_dirty = TRUE;
ff0cee69 411
3280af22 412 if (PL_sv_objcount) {
a0d0e21e
LW
413 /*
414 * Try to destruct global references. We do this first so that the
415 * destructors and destructees still exist. Some sv's might remain.
416 * Non-referenced objects are on their own.
417 */
a0d0e21e 418 sv_clean_objs();
8990e307
LW
419 }
420
5cd24f17 421 /* unhook hooks which will soon be, or use, destroyed data */
3280af22
NIS
422 SvREFCNT_dec(PL_warnhook);
423 PL_warnhook = Nullsv;
424 SvREFCNT_dec(PL_diehook);
425 PL_diehook = Nullsv;
5cd24f17 426
4b556e6c 427 /* call exit list functions */
3280af22 428 while (PL_exitlistlen-- > 0)
0cb96387 429 PL_exitlist[PL_exitlistlen].fn(aTHXo_ PL_exitlist[PL_exitlistlen].ptr);
4b556e6c 430
3280af22 431 Safefree(PL_exitlist);
4b556e6c 432
a0d0e21e 433 if (destruct_level == 0){
8990e307 434
a0d0e21e
LW
435 DEBUG_P(debprofdump());
436
437 /* The exit() function will do everything that needs doing. */
438 return;
439 }
5dd60ef7 440
5f05dabc 441 /* loosen bonds of global variables */
442
3280af22
NIS
443 if(PL_rsfp) {
444 (void)PerlIO_close(PL_rsfp);
445 PL_rsfp = Nullfp;
8ebc5c01 446 }
447
448 /* Filters for program text */
3280af22
NIS
449 SvREFCNT_dec(PL_rsfp_filters);
450 PL_rsfp_filters = Nullav;
8ebc5c01 451
452 /* switches */
3280af22
NIS
453 PL_preprocess = FALSE;
454 PL_minus_n = FALSE;
455 PL_minus_p = FALSE;
456 PL_minus_l = FALSE;
457 PL_minus_a = FALSE;
458 PL_minus_F = FALSE;
459 PL_doswitches = FALSE;
599cee73 460 PL_dowarn = G_WARN_OFF;
3280af22
NIS
461 PL_doextract = FALSE;
462 PL_sawampersand = FALSE; /* must save all match strings */
3280af22
NIS
463 PL_unsafe = FALSE;
464
465 Safefree(PL_inplace);
466 PL_inplace = Nullch;
a7cb1f99 467 SvREFCNT_dec(PL_patchlevel);
3280af22
NIS
468
469 if (PL_e_script) {
470 SvREFCNT_dec(PL_e_script);
471 PL_e_script = Nullsv;
8ebc5c01 472 }
473
474 /* magical thingies */
475
d33b2eba 476 Safefree(PL_ofs); /* $, */
3280af22 477 PL_ofs = Nullch;
5f05dabc 478
d33b2eba 479 Safefree(PL_ors); /* $\ */
3280af22 480 PL_ors = Nullch;
8ebc5c01 481
3280af22
NIS
482 SvREFCNT_dec(PL_rs); /* $/ */
483 PL_rs = Nullsv;
dc92893f 484
3280af22
NIS
485 SvREFCNT_dec(PL_nrs); /* $/ helper */
486 PL_nrs = Nullsv;
5f05dabc 487
d33b2eba
GS
488 PL_multiline = 0; /* $* */
489 Safefree(PL_osname); /* $^O */
490 PL_osname = Nullch;
5f05dabc 491
3280af22
NIS
492 SvREFCNT_dec(PL_statname);
493 PL_statname = Nullsv;
494 PL_statgv = Nullgv;
5f05dabc 495
8ebc5c01 496 /* defgv, aka *_ should be taken care of elsewhere */
497
8ebc5c01 498 /* clean up after study() */
3280af22
NIS
499 SvREFCNT_dec(PL_lastscream);
500 PL_lastscream = Nullsv;
501 Safefree(PL_screamfirst);
502 PL_screamfirst = 0;
503 Safefree(PL_screamnext);
504 PL_screamnext = 0;
8ebc5c01 505
7d5ea4e7
GS
506 /* float buffer */
507 Safefree(PL_efloatbuf);
508 PL_efloatbuf = Nullch;
509 PL_efloatsize = 0;
510
8ebc5c01 511 /* startup and shutdown function lists */
3280af22
NIS
512 SvREFCNT_dec(PL_beginav);
513 SvREFCNT_dec(PL_endav);
7d30b5c4 514 SvREFCNT_dec(PL_checkav);
3280af22
NIS
515 SvREFCNT_dec(PL_initav);
516 PL_beginav = Nullav;
517 PL_endav = Nullav;
7d30b5c4 518 PL_checkav = Nullav;
3280af22 519 PL_initav = Nullav;
5618dfe8 520
8ebc5c01 521 /* shortcuts just get cleared */
3280af22 522 PL_envgv = Nullgv;
3280af22
NIS
523 PL_incgv = Nullgv;
524 PL_hintgv = Nullgv;
525 PL_errgv = Nullgv;
526 PL_argvgv = Nullgv;
527 PL_argvoutgv = Nullgv;
528 PL_stdingv = Nullgv;
bf49b057 529 PL_stderrgv = Nullgv;
3280af22
NIS
530 PL_last_in_gv = Nullgv;
531 PL_replgv = Nullgv;
5c831c24 532 PL_debstash = Nullhv;
8ebc5c01 533
534 /* reset so print() ends up where we expect */
535 setdefout(Nullgv);
5c831c24 536
7a1c5554
GS
537 SvREFCNT_dec(PL_argvout_stack);
538 PL_argvout_stack = Nullav;
8ebc5c01 539
5c831c24
GS
540 SvREFCNT_dec(PL_modglobal);
541 PL_modglobal = Nullhv;
542 SvREFCNT_dec(PL_preambleav);
543 PL_preambleav = Nullav;
544 SvREFCNT_dec(PL_subname);
545 PL_subname = Nullsv;
546 SvREFCNT_dec(PL_linestr);
547 PL_linestr = Nullsv;
548 SvREFCNT_dec(PL_pidstatus);
549 PL_pidstatus = Nullhv;
550 SvREFCNT_dec(PL_toptarget);
551 PL_toptarget = Nullsv;
552 SvREFCNT_dec(PL_bodytarget);
553 PL_bodytarget = Nullsv;
554 PL_formtarget = Nullsv;
555
d33b2eba 556 /* free locale stuff */
b9582b6a 557#ifdef USE_LOCALE_COLLATE
d33b2eba
GS
558 Safefree(PL_collation_name);
559 PL_collation_name = Nullch;
b9582b6a 560#endif
d33b2eba 561
b9582b6a 562#ifdef USE_LOCALE_NUMERIC
d33b2eba
GS
563 Safefree(PL_numeric_name);
564 PL_numeric_name = Nullch;
b9582b6a 565#endif
d33b2eba 566
5c831c24
GS
567 /* clear utf8 character classes */
568 SvREFCNT_dec(PL_utf8_alnum);
569 SvREFCNT_dec(PL_utf8_alnumc);
570 SvREFCNT_dec(PL_utf8_ascii);
571 SvREFCNT_dec(PL_utf8_alpha);
572 SvREFCNT_dec(PL_utf8_space);
573 SvREFCNT_dec(PL_utf8_cntrl);
574 SvREFCNT_dec(PL_utf8_graph);
575 SvREFCNT_dec(PL_utf8_digit);
576 SvREFCNT_dec(PL_utf8_upper);
577 SvREFCNT_dec(PL_utf8_lower);
578 SvREFCNT_dec(PL_utf8_print);
579 SvREFCNT_dec(PL_utf8_punct);
580 SvREFCNT_dec(PL_utf8_xdigit);
581 SvREFCNT_dec(PL_utf8_mark);
582 SvREFCNT_dec(PL_utf8_toupper);
583 SvREFCNT_dec(PL_utf8_tolower);
584 PL_utf8_alnum = Nullsv;
585 PL_utf8_alnumc = Nullsv;
586 PL_utf8_ascii = Nullsv;
587 PL_utf8_alpha = Nullsv;
588 PL_utf8_space = Nullsv;
589 PL_utf8_cntrl = Nullsv;
590 PL_utf8_graph = Nullsv;
591 PL_utf8_digit = Nullsv;
592 PL_utf8_upper = Nullsv;
593 PL_utf8_lower = Nullsv;
594 PL_utf8_print = Nullsv;
595 PL_utf8_punct = Nullsv;
596 PL_utf8_xdigit = Nullsv;
597 PL_utf8_mark = Nullsv;
598 PL_utf8_toupper = Nullsv;
599 PL_utf8_totitle = Nullsv;
600 PL_utf8_tolower = Nullsv;
601
971a9dd3
GS
602 if (!specialWARN(PL_compiling.cop_warnings))
603 SvREFCNT_dec(PL_compiling.cop_warnings);
5c831c24 604 PL_compiling.cop_warnings = Nullsv;
f4dd75d9
GS
605#ifdef USE_ITHREADS
606 Safefree(CopFILE(&PL_compiling));
607 CopFILE(&PL_compiling) = Nullch;
608 Safefree(CopSTASHPV(&PL_compiling));
609#else
01724ea0 610 SvREFCNT_dec(CopFILEGV(&PL_compiling));
f4dd75d9
GS
611 CopFILEGV(&PL_compiling) = Nullgv;
612 /* cop_stash is not refcounted */
01724ea0 613#endif
5c831c24 614
a0d0e21e 615 /* Prepare to destruct main symbol table. */
5f05dabc 616
3280af22
NIS
617 hv = PL_defstash;
618 PL_defstash = 0;
a0d0e21e 619 SvREFCNT_dec(hv);
5c831c24
GS
620 SvREFCNT_dec(PL_curstname);
621 PL_curstname = Nullsv;
a0d0e21e 622
5a844595
GS
623 /* clear queued errors */
624 SvREFCNT_dec(PL_errors);
625 PL_errors = Nullsv;
626
a0d0e21e 627 FREETMPS;
0453d815 628 if (destruct_level >= 2 && ckWARN_d(WARN_INTERNAL)) {
3280af22 629 if (PL_scopestack_ix != 0)
0453d815
PM
630 Perl_warner(aTHX_ WARN_INTERNAL,
631 "Unbalanced scopes: %ld more ENTERs than LEAVEs\n",
3280af22
NIS
632 (long)PL_scopestack_ix);
633 if (PL_savestack_ix != 0)
0453d815
PM
634 Perl_warner(aTHX_ WARN_INTERNAL,
635 "Unbalanced saves: %ld more saves than restores\n",
3280af22
NIS
636 (long)PL_savestack_ix);
637 if (PL_tmps_floor != -1)
0453d815 638 Perl_warner(aTHX_ WARN_INTERNAL,"Unbalanced tmps: %ld more allocs than frees\n",
3280af22 639 (long)PL_tmps_floor + 1);
a0d0e21e 640 if (cxstack_ix != -1)
0453d815 641 Perl_warner(aTHX_ WARN_INTERNAL,"Unbalanced context: %ld more PUSHes than POPs\n",
ff0cee69 642 (long)cxstack_ix + 1);
a0d0e21e 643 }
8990e307
LW
644
645 /* Now absolutely destruct everything, somehow or other, loops or no. */
8990e307 646 last_sv_count = 0;
d33b2eba 647 SvFLAGS(PL_fdpid) |= SVTYPEMASK; /* don't clean out pid table now */
3280af22
NIS
648 SvFLAGS(PL_strtab) |= SVTYPEMASK; /* don't clean out strtab now */
649 while (PL_sv_count != 0 && PL_sv_count != last_sv_count) {
650 last_sv_count = PL_sv_count;
8990e307
LW
651 sv_clean_all();
652 }
d33b2eba
GS
653 SvFLAGS(PL_fdpid) &= ~SVTYPEMASK;
654 SvFLAGS(PL_fdpid) |= SVt_PVAV;
3280af22
NIS
655 SvFLAGS(PL_strtab) &= ~SVTYPEMASK;
656 SvFLAGS(PL_strtab) |= SVt_PVHV;
d33b2eba 657
d4777f27
GS
658 AvREAL_off(PL_fdpid); /* no surviving entries */
659 SvREFCNT_dec(PL_fdpid); /* needed in io_close() */
d33b2eba
GS
660 PL_fdpid = Nullav;
661
6c644e78
GS
662#ifdef HAVE_INTERP_INTERN
663 sys_intern_clear();
664#endif
665
6e72f9df 666 /* Destruct the global string table. */
667 {
668 /* Yell and reset the HeVAL() slots that are still holding refcounts,
669 * so that sv_free() won't fail on them.
670 */
671 I32 riter;
672 I32 max;
673 HE *hent;
674 HE **array;
675
676 riter = 0;
3280af22
NIS
677 max = HvMAX(PL_strtab);
678 array = HvARRAY(PL_strtab);
6e72f9df 679 hent = array[0];
680 for (;;) {
0453d815
PM
681 if (hent && ckWARN_d(WARN_INTERNAL)) {
682 Perl_warner(aTHX_ WARN_INTERNAL,
683 "Unbalanced string table refcount: (%d) for \"%s\"",
6e72f9df 684 HeVAL(hent) - Nullsv, HeKEY(hent));
685 HeVAL(hent) = Nullsv;
686 hent = HeNEXT(hent);
687 }
688 if (!hent) {
689 if (++riter > max)
690 break;
691 hent = array[riter];
692 }
693 }
694 }
3280af22 695 SvREFCNT_dec(PL_strtab);
6e72f9df 696
d33b2eba
GS
697 /* free special SVs */
698
699 SvREFCNT(&PL_sv_yes) = 0;
700 sv_clear(&PL_sv_yes);
701 SvANY(&PL_sv_yes) = NULL;
4c5e2b0d 702 SvFLAGS(&PL_sv_yes) = 0;
d33b2eba
GS
703
704 SvREFCNT(&PL_sv_no) = 0;
705 sv_clear(&PL_sv_no);
706 SvANY(&PL_sv_no) = NULL;
4c5e2b0d 707 SvFLAGS(&PL_sv_no) = 0;
01724ea0
GS
708
709 SvREFCNT(&PL_sv_undef) = 0;
710 SvREADONLY_off(&PL_sv_undef);
d33b2eba 711
0453d815
PM
712 if (PL_sv_count != 0 && ckWARN_d(WARN_INTERNAL))
713 Perl_warner(aTHX_ WARN_INTERNAL,"Scalars leaked: %ld\n", (long)PL_sv_count);
6e72f9df 714
3280af22 715 Safefree(PL_origfilename);
3280af22 716 Safefree(PL_reg_start_tmp);
5c5e4c24
IZ
717 if (PL_reg_curpm)
718 Safefree(PL_reg_curpm);
82ba1be6 719 Safefree(PL_reg_poscache);
3280af22
NIS
720 Safefree(HeKEY_hek(&PL_hv_fetch_ent_mh));
721 Safefree(PL_op_mask);
cf36064f
GS
722 Safefree(PL_psig_ptr);
723 Safefree(PL_psig_name);
6e72f9df 724 nuke_stacks();
3280af22 725 PL_hints = 0; /* Reset hints. Should hints be per-interpreter ? */
a0d0e21e
LW
726
727 DEBUG_P(debprofdump());
11343788 728#ifdef USE_THREADS
5f08fbcd 729 MUTEX_DESTROY(&PL_strtab_mutex);
533c011a
NIS
730 MUTEX_DESTROY(&PL_sv_mutex);
731 MUTEX_DESTROY(&PL_eval_mutex);
5ff3f7a4 732 MUTEX_DESTROY(&PL_cred_mutex);
3d35f11b 733 MUTEX_DESTROY(&PL_fdpid_mutex);
533c011a 734 COND_DESTROY(&PL_eval_cond);
11d617a5
GS
735#ifdef EMULATE_ATOMIC_REFCOUNTS
736 MUTEX_DESTROY(&PL_svref_mutex);
737#endif /* EMULATE_ATOMIC_REFCOUNTS */
fc36a67e 738
8023c3ce 739 /* As the penultimate thing, free the non-arena SV for thrsv */
533c011a
NIS
740 Safefree(SvPVX(PL_thrsv));
741 Safefree(SvANY(PL_thrsv));
742 Safefree(PL_thrsv);
743 PL_thrsv = Nullsv;
8023c3ce 744#endif /* USE_THREADS */
d33b2eba 745
612f20c3
GS
746 sv_free_arenas();
747
fc36a67e 748 /* As the absolutely last thing, free the non-arena SV for mess() */
749
3280af22 750 if (PL_mess_sv) {
9c63abab
GS
751 /* it could have accumulated taint magic */
752 if (SvTYPE(PL_mess_sv) >= SVt_PVMG) {
753 MAGIC* mg;
754 MAGIC* moremagic;
755 for (mg = SvMAGIC(PL_mess_sv); mg; mg = moremagic) {
756 moremagic = mg->mg_moremagic;
757 if (mg->mg_ptr && mg->mg_type != 'g' && mg->mg_len >= 0)
758 Safefree(mg->mg_ptr);
759 Safefree(mg);
760 }
761 }
fc36a67e 762 /* we know that type >= SVt_PV */
155aba94 763 (void)SvOOK_off(PL_mess_sv);
3280af22
NIS
764 Safefree(SvPVX(PL_mess_sv));
765 Safefree(SvANY(PL_mess_sv));
766 Safefree(PL_mess_sv);
767 PL_mess_sv = Nullsv;
fc36a67e 768 }
79072805
LW
769}
770
954c1994
GS
771/*
772=for apidoc perl_free
773
774Releases a Perl interpreter. See L<perlembed>.
775
776=cut
777*/
778
79072805 779void
0cb96387 780perl_free(pTHXx)
79072805 781{
c5be433b 782#if defined(PERL_OBJECT)
7f0d82f7 783 PerlMem_free(this);
76e3520e 784#else
1c0ca838
GS
785# if defined(PERL_IMPLICIT_SYS) && defined(WIN32)
786 void *host = w32_internal_host;
7f0d82f7 787 PerlMem_free(aTHXx);
1c0ca838
GS
788 win32_delete_internal_host(host);
789# else
790 PerlMem_free(aTHXx);
791# endif
76e3520e 792#endif
79072805
LW
793}
794
4b556e6c 795void
864dbfa3 796Perl_call_atexit(pTHX_ ATEXIT_t fn, void *ptr)
4b556e6c 797{
3280af22
NIS
798 Renew(PL_exitlist, PL_exitlistlen+1, PerlExitListEntry);
799 PL_exitlist[PL_exitlistlen].fn = fn;
800 PL_exitlist[PL_exitlistlen].ptr = ptr;
801 ++PL_exitlistlen;
4b556e6c
JD
802}
803
954c1994
GS
804/*
805=for apidoc perl_parse
806
807Tells a Perl interpreter to parse a Perl script. See L<perlembed>.
808
809=cut
810*/
811
79072805 812int
0cb96387 813perl_parse(pTHXx_ XSINIT_t xsinit, int argc, char **argv, char **env)
8d063cd8 814{
11343788 815 dTHR;
6224f72b 816 I32 oldscope;
6224f72b 817 int ret;
db36c5a1 818 dJMPENV;
cea2e8a9
GS
819#ifdef USE_THREADS
820 dTHX;
821#endif
8d063cd8 822
a687059c
LW
823#ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
824#ifdef IAMSUID
825#undef IAMSUID
cea2e8a9 826 Perl_croak(aTHX_ "suidperl is no longer needed since the kernel can now execute\n\
a687059c
LW
827setuid perl scripts securely.\n");
828#endif
829#endif
830
8f1f23e8 831#if defined(__DYNAMIC__) && (defined(NeXT) || defined(__NeXT__))
6e72f9df 832 _dyld_lookup_and_bind
833 ("__environ", (unsigned long *) &environ_pointer, NULL);
834#endif /* environ */
835
3280af22
NIS
836 PL_origargv = argv;
837 PL_origargc = argc;
a0d0e21e 838#ifndef VMS /* VMS doesn't have environ array */
3280af22 839 PL_origenviron = environ;
a0d0e21e
LW
840#endif
841
3280af22 842 if (PL_do_undump) {
a0d0e21e
LW
843
844 /* Come here if running an undumped a.out. */
845
3280af22
NIS
846 PL_origfilename = savepv(argv[0]);
847 PL_do_undump = FALSE;
a0d0e21e 848 cxstack_ix = -1; /* start label stack again */
748a9306 849 init_ids();
a0d0e21e
LW
850 init_postdump_symbols(argc,argv,env);
851 return 0;
852 }
853
3280af22
NIS
854 if (PL_main_root) {
855 PL_curpad = AvARRAY(PL_comppad);
856 op_free(PL_main_root);
857 PL_main_root = Nullop;
ff0cee69 858 }
3280af22
NIS
859 PL_main_start = Nullop;
860 SvREFCNT_dec(PL_main_cv);
861 PL_main_cv = Nullcv;
79072805 862
3280af22
NIS
863 time(&PL_basetime);
864 oldscope = PL_scopestack_ix;
599cee73 865 PL_dowarn = G_WARN_OFF;
f86702cc 866
14dd3ad8
GS
867#ifdef PERL_FLEXIBLE_EXCEPTIONS
868 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vparse_body), env, xsinit);
869#else
870 JMPENV_PUSH(ret);
871#endif
6224f72b 872 switch (ret) {
312caa8e 873 case 0:
14dd3ad8
GS
874#ifndef PERL_FLEXIBLE_EXCEPTIONS
875 parse_body(env,xsinit);
876#endif
7d30b5c4
GS
877 if (PL_checkav)
878 call_list(oldscope, PL_checkav);
14dd3ad8
GS
879 ret = 0;
880 break;
6224f72b
GS
881 case 1:
882 STATUS_ALL_FAILURE;
883 /* FALL THROUGH */
884 case 2:
885 /* my_exit() was called */
3280af22 886 while (PL_scopestack_ix > oldscope)
6224f72b
GS
887 LEAVE;
888 FREETMPS;
3280af22 889 PL_curstash = PL_defstash;
7d30b5c4
GS
890 if (PL_checkav)
891 call_list(oldscope, PL_checkav);
14dd3ad8
GS
892 ret = STATUS_NATIVE_EXPORT;
893 break;
6224f72b 894 case 3:
bf49b057 895 PerlIO_printf(Perl_error_log, "panic: top_env\n");
14dd3ad8
GS
896 ret = 1;
897 break;
6224f72b 898 }
14dd3ad8
GS
899 JMPENV_POP;
900 return ret;
901}
902
903#ifdef PERL_FLEXIBLE_EXCEPTIONS
904STATIC void *
905S_vparse_body(pTHX_ va_list args)
906{
907 char **env = va_arg(args, char**);
908 XSINIT_t xsinit = va_arg(args, XSINIT_t);
909
910 return parse_body(env, xsinit);
312caa8e 911}
14dd3ad8 912#endif
312caa8e
CS
913
914STATIC void *
14dd3ad8 915S_parse_body(pTHX_ char **env, XSINIT_t xsinit)
312caa8e
CS
916{
917 dTHR;
918 int argc = PL_origargc;
919 char **argv = PL_origargv;
312caa8e
CS
920 char *scriptname = NULL;
921 int fdscript = -1;
922 VOL bool dosearch = FALSE;
923 char *validarg = "";
924 AV* comppadlist;
925 register SV *sv;
926 register char *s;
f4c556ac 927 char *cddir = Nullch;
312caa8e 928
3280af22 929 sv_setpvn(PL_linestr,"",0);
79cb57f6 930 sv = newSVpvn("",0); /* first used for -I flags */
6224f72b
GS
931 SAVEFREESV(sv);
932 init_main_stash();
54310121 933
6224f72b
GS
934 for (argc--,argv++; argc > 0; argc--,argv++) {
935 if (argv[0][0] != '-' || !argv[0][1])
936 break;
937#ifdef DOSUID
938 if (*validarg)
939 validarg = " PHOOEY ";
940 else
941 validarg = argv[0];
13281fa4 942#endif
6224f72b
GS
943 s = argv[0]+1;
944 reswitch:
945 switch (*s) {
729a02f2
GS
946 case 'C':
947#ifdef WIN32
c0932edc 948 win32_argv2utf8(argc-1, argv+1);
729a02f2
GS
949 /* FALL THROUGH */
950#endif
1d5472a9
GS
951#ifndef PERL_STRICT_CR
952 case '\r':
953#endif
6224f72b
GS
954 case ' ':
955 case '0':
956 case 'F':
957 case 'a':
958 case 'c':
959 case 'd':
960 case 'D':
961 case 'h':
962 case 'i':
963 case 'l':
964 case 'M':
965 case 'm':
966 case 'n':
967 case 'p':
968 case 's':
969 case 'u':
970 case 'U':
971 case 'v':
599cee73
PM
972 case 'W':
973 case 'X':
6224f72b 974 case 'w':
155aba94 975 if ((s = moreswitches(s)))
6224f72b
GS
976 goto reswitch;
977 break;
33b78306 978
6224f72b 979 case 'T':
3280af22 980 PL_tainting = TRUE;
6224f72b
GS
981 s++;
982 goto reswitch;
f86702cc 983
6224f72b 984 case 'e':
bf4acbe4
GS
985#ifdef MACOS_TRADITIONAL
986 /* ignore -e for Dev:Pseudo argument */
987 if (argv[1] && !strcmp(argv[1], "Dev:Pseudo"))
988 break;
989#endif
3280af22 990 if (PL_euid != PL_uid || PL_egid != PL_gid)
cea2e8a9 991 Perl_croak(aTHX_ "No -e allowed in setuid scripts");
3280af22 992 if (!PL_e_script) {
79cb57f6 993 PL_e_script = newSVpvn("",0);
0cb96387 994 filter_add(read_e_script, NULL);
6224f72b
GS
995 }
996 if (*++s)
3280af22 997 sv_catpv(PL_e_script, s);
6224f72b 998 else if (argv[1]) {
3280af22 999 sv_catpv(PL_e_script, argv[1]);
6224f72b
GS
1000 argc--,argv++;
1001 }
1002 else
cea2e8a9 1003 Perl_croak(aTHX_ "No code specified for -e");
3280af22 1004 sv_catpv(PL_e_script, "\n");
6224f72b 1005 break;
afe37c7d 1006
6224f72b
GS
1007 case 'I': /* -I handled both here and in moreswitches() */
1008 forbid_setid("-I");
1009 if (!*++s && (s=argv[1]) != Nullch) {
1010 argc--,argv++;
1011 }
6224f72b 1012 if (s && *s) {
0df16ed7
GS
1013 char *p;
1014 STRLEN len = strlen(s);
1015 p = savepvn(s, len);
9c8a64f0 1016 incpush(p, TRUE, TRUE);
0df16ed7
GS
1017 sv_catpvn(sv, "-I", 2);
1018 sv_catpvn(sv, p, len);
1019 sv_catpvn(sv, " ", 1);
6224f72b 1020 Safefree(p);
0df16ed7
GS
1021 }
1022 else
a67e862a 1023 Perl_croak(aTHX_ "No directory specified for -I");
6224f72b
GS
1024 break;
1025 case 'P':
1026 forbid_setid("-P");
3280af22 1027 PL_preprocess = TRUE;
6224f72b
GS
1028 s++;
1029 goto reswitch;
1030 case 'S':
1031 forbid_setid("-S");
1032 dosearch = TRUE;
1033 s++;
1034 goto reswitch;
1035 case 'V':
3280af22
NIS
1036 if (!PL_preambleav)
1037 PL_preambleav = newAV();
1038 av_push(PL_preambleav, newSVpv("use Config qw(myconfig config_vars)",0));
6224f72b 1039 if (*++s != ':') {
3280af22 1040 PL_Sv = newSVpv("print myconfig();",0);
6224f72b 1041#ifdef VMS
6b88bc9c 1042 sv_catpv(PL_Sv,"print \"\\nCharacteristics of this PERLSHR image: \\n\",");
6224f72b 1043#else
3280af22 1044 sv_catpv(PL_Sv,"print \"\\nCharacteristics of this binary (from libperl): \\n\",");
6224f72b 1045#endif
3280af22 1046 sv_catpv(PL_Sv,"\" Compile-time options:");
6224f72b 1047# ifdef DEBUGGING
3280af22 1048 sv_catpv(PL_Sv," DEBUGGING");
6224f72b 1049# endif
6224f72b 1050# ifdef MULTIPLICITY
8f872242 1051 sv_catpv(PL_Sv," MULTIPLICITY");
6224f72b 1052# endif
b363f7ed
GS
1053# ifdef USE_THREADS
1054 sv_catpv(PL_Sv," USE_THREADS");
1055# endif
ac5e8965
JH
1056# ifdef USE_ITHREADS
1057 sv_catpv(PL_Sv," USE_ITHREADS");
1058# endif
10cc9d2a
JH
1059# ifdef USE_64_BIT_INT
1060 sv_catpv(PL_Sv," USE_64_BIT_INT");
1061# endif
1062# ifdef USE_64_BIT_ALL
1063 sv_catpv(PL_Sv," USE_64_BIT_ALL");
ac5e8965
JH
1064# endif
1065# ifdef USE_LONG_DOUBLE
1066 sv_catpv(PL_Sv," USE_LONG_DOUBLE");
1067# endif
53430762
JH
1068# ifdef USE_LARGE_FILES
1069 sv_catpv(PL_Sv," USE_LARGE_FILES");
1070# endif
ac5e8965
JH
1071# ifdef USE_SOCKS
1072 sv_catpv(PL_Sv," USE_SOCKS");
1073# endif
b363f7ed
GS
1074# ifdef PERL_OBJECT
1075 sv_catpv(PL_Sv," PERL_OBJECT");
1076# endif
1077# ifdef PERL_IMPLICIT_CONTEXT
1078 sv_catpv(PL_Sv," PERL_IMPLICIT_CONTEXT");
1079# endif
1080# ifdef PERL_IMPLICIT_SYS
1081 sv_catpv(PL_Sv," PERL_IMPLICIT_SYS");
1082# endif
3280af22 1083 sv_catpv(PL_Sv,"\\n\",");
b363f7ed 1084
6224f72b
GS
1085#if defined(LOCAL_PATCH_COUNT)
1086 if (LOCAL_PATCH_COUNT > 0) {
1087 int i;
3280af22 1088 sv_catpv(PL_Sv,"\" Locally applied patches:\\n\",");
6224f72b 1089 for (i = 1; i <= LOCAL_PATCH_COUNT; i++) {
3280af22 1090 if (PL_localpatches[i])
cea2e8a9 1091 Perl_sv_catpvf(aTHX_ PL_Sv,"q\" \t%s\n\",",PL_localpatches[i]);
6224f72b
GS
1092 }
1093 }
1094#endif
cea2e8a9 1095 Perl_sv_catpvf(aTHX_ PL_Sv,"\" Built under %s\\n\"",OSNAME);
6224f72b
GS
1096#ifdef __DATE__
1097# ifdef __TIME__
cea2e8a9 1098 Perl_sv_catpvf(aTHX_ PL_Sv,",\" Compiled at %s %s\\n\"",__DATE__,__TIME__);
6224f72b 1099# else
cea2e8a9 1100 Perl_sv_catpvf(aTHX_ PL_Sv,",\" Compiled on %s\\n\"",__DATE__);
6224f72b
GS
1101# endif
1102#endif
3280af22 1103 sv_catpv(PL_Sv, "; \
6224f72b
GS
1104$\"=\"\\n \"; \
1105@env = map { \"$_=\\\"$ENV{$_}\\\"\" } sort grep {/^PERL/} keys %ENV; \
1106print \" \\%ENV:\\n @env\\n\" if @env; \
1107print \" \\@INC:\\n @INC\\n\";");
1108 }
1109 else {
3280af22
NIS
1110 PL_Sv = newSVpv("config_vars(qw(",0);
1111 sv_catpv(PL_Sv, ++s);
1112 sv_catpv(PL_Sv, "))");
6224f72b
GS
1113 s += strlen(s);
1114 }
3280af22 1115 av_push(PL_preambleav, PL_Sv);
6224f72b
GS
1116 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
1117 goto reswitch;
1118 case 'x':
3280af22 1119 PL_doextract = TRUE;
6224f72b
GS
1120 s++;
1121 if (*s)
f4c556ac 1122 cddir = s;
6224f72b
GS
1123 break;
1124 case 0:
1125 break;
1126 case '-':
1127 if (!*++s || isSPACE(*s)) {
1128 argc--,argv++;
1129 goto switch_end;
1130 }
1131 /* catch use of gnu style long options */
1132 if (strEQ(s, "version")) {
1133 s = "v";
1134 goto reswitch;
1135 }
1136 if (strEQ(s, "help")) {
1137 s = "h";
1138 goto reswitch;
1139 }
1140 s--;
1141 /* FALL THROUGH */
1142 default:
cea2e8a9 1143 Perl_croak(aTHX_ "Unrecognized switch: -%s (-h will show valid options)",s);
8d063cd8
LW
1144 }
1145 }
6224f72b 1146 switch_end:
54310121 1147
f675dbe5
CB
1148 if (
1149#ifndef SECURE_INTERNAL_GETENV
1150 !PL_tainting &&
1151#endif
0df16ed7
GS
1152 (s = PerlEnv_getenv("PERL5OPT")))
1153 {
74288ac8
GS
1154 while (isSPACE(*s))
1155 s++;
1156 if (*s == '-' && *(s+1) == 'T')
1157 PL_tainting = TRUE;
1158 else {
1159 while (s && *s) {
1160 while (isSPACE(*s))
1161 s++;
1162 if (*s == '-') {
1163 s++;
1164 if (isSPACE(*s))
1165 continue;
1166 }
1167 if (!*s)
1168 break;
1169 if (!strchr("DIMUdmw", *s))
cea2e8a9 1170 Perl_croak(aTHX_ "Illegal switch in PERL5OPT: -%c", *s);
74288ac8 1171 s = moreswitches(s);
6224f72b 1172 }
6224f72b
GS
1173 }
1174 }
a0d0e21e 1175
6224f72b
GS
1176 if (!scriptname)
1177 scriptname = argv[0];
3280af22 1178 if (PL_e_script) {
6224f72b
GS
1179 argc++,argv--;
1180 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
1181 }
1182 else if (scriptname == Nullch) {
1183#ifdef MSDOS
1184 if ( PerlLIO_isatty(PerlIO_fileno(PerlIO_stdin())) )
1185 moreswitches("h");
1186#endif
1187 scriptname = "-";
1188 }
1189
1190 init_perllib();
1191
1192 open_script(scriptname,dosearch,sv,&fdscript);
1193
1194 validate_suid(validarg, scriptname,fdscript);
1195
64ca3a65 1196#ifndef PERL_MICRO
0b5b802d
GS
1197#if defined(SIGCHLD) || defined(SIGCLD)
1198 {
1199#ifndef SIGCHLD
1200# define SIGCHLD SIGCLD
1201#endif
1202 Sighandler_t sigstate = rsignal_state(SIGCHLD);
1203 if (sigstate == SIG_IGN) {
1204 if (ckWARN(WARN_SIGNAL))
1205 Perl_warner(aTHX_ WARN_SIGNAL,
1206 "Can't ignore signal CHLD, forcing to default");
1207 (void)rsignal(SIGCHLD, (Sighandler_t)SIG_DFL);
1208 }
1209 }
1210#endif
64ca3a65 1211#endif
0b5b802d 1212
bf4acbe4
GS
1213#ifdef MACOS_TRADITIONAL
1214 if (PL_doextract || gMacPerl_AlwaysExtract) {
1215#else
f4c556ac 1216 if (PL_doextract) {
bf4acbe4 1217#endif
6224f72b 1218 find_beginning();
f4c556ac
GS
1219 if (cddir && PerlDir_chdir(cddir) < 0)
1220 Perl_croak(aTHX_ "Can't chdir to %s",cddir);
1221
1222 }
6224f72b 1223
3280af22
NIS
1224 PL_main_cv = PL_compcv = (CV*)NEWSV(1104,0);
1225 sv_upgrade((SV *)PL_compcv, SVt_PVCV);
1226 CvUNIQUE_on(PL_compcv);
1227
1228 PL_comppad = newAV();
1229 av_push(PL_comppad, Nullsv);
1230 PL_curpad = AvARRAY(PL_comppad);
1231 PL_comppad_name = newAV();
1232 PL_comppad_name_fill = 0;
1233 PL_min_intro_pending = 0;
1234 PL_padix = 0;
6224f72b 1235#ifdef USE_THREADS
79cb57f6 1236 av_store(PL_comppad_name, 0, newSVpvn("@_", 2));
533c011a
NIS
1237 PL_curpad[0] = (SV*)newAV();
1238 SvPADMY_on(PL_curpad[0]); /* XXX Needed? */
1239 CvOWNER(PL_compcv) = 0;
1240 New(666, CvMUTEXP(PL_compcv), 1, perl_mutex);
1241 MUTEX_INIT(CvMUTEXP(PL_compcv));
6224f72b
GS
1242#endif /* USE_THREADS */
1243
1244 comppadlist = newAV();
1245 AvREAL_off(comppadlist);
3280af22
NIS
1246 av_store(comppadlist, 0, (SV*)PL_comppad_name);
1247 av_store(comppadlist, 1, (SV*)PL_comppad);
1248 CvPADLIST(PL_compcv) = comppadlist;
6224f72b
GS
1249
1250 boot_core_UNIVERSAL();
9a34ef1d 1251#ifndef PERL_MICRO
09bef843 1252 boot_core_xsutils();
9a34ef1d 1253#endif
6224f72b
GS
1254
1255 if (xsinit)
0cb96387 1256 (*xsinit)(aTHXo); /* in case linked C routines want magical variables */
64ca3a65 1257#ifndef PERL_MICRO
5db16f6a 1258#if defined(VMS) || defined(WIN32) || defined(DJGPP) || defined(__CYGWIN__)
c5be433b 1259 init_os_extras();
6224f72b 1260#endif
64ca3a65 1261#endif
6224f72b 1262
29209bc5
JH
1263#ifdef USE_SOCKS
1264 SOCKSinit(argv[0]);
1265#endif
1266
6224f72b
GS
1267 init_predump_symbols();
1268 /* init_postdump_symbols not currently designed to be called */
1269 /* more than once (ENV isn't cleared first, for example) */
1270 /* But running with -u leaves %ENV & @ARGV undefined! XXX */
3280af22 1271 if (!PL_do_undump)
6224f72b
GS
1272 init_postdump_symbols(argc,argv,env);
1273
1274 init_lexer();
1275
1276 /* now parse the script */
1277
1278 SETERRNO(0,SS$_NORMAL);
3280af22 1279 PL_error_count = 0;
bf4acbe4
GS
1280#ifdef MACOS_TRADITIONAL
1281 if (gMacPerl_SyntaxError = (yyparse() || PL_error_count)) {
1282 if (PL_minus_c)
1283 Perl_croak(aTHX_ "%s had compilation errors.\n", MacPerl_MPWFileName(PL_origfilename));
1284 else {
1285 Perl_croak(aTHX_ "Execution of %s aborted due to compilation errors.\n",
1286 MacPerl_MPWFileName(PL_origfilename));
1287 }
1288 }
1289#else
3280af22
NIS
1290 if (yyparse() || PL_error_count) {
1291 if (PL_minus_c)
cea2e8a9 1292 Perl_croak(aTHX_ "%s had compilation errors.\n", PL_origfilename);
6224f72b 1293 else {
cea2e8a9 1294 Perl_croak(aTHX_ "Execution of %s aborted due to compilation errors.\n",
097ee67d 1295 PL_origfilename);
6224f72b
GS
1296 }
1297 }
bf4acbe4 1298#endif
57843af0 1299 CopLINE_set(PL_curcop, 0);
3280af22
NIS
1300 PL_curstash = PL_defstash;
1301 PL_preprocess = FALSE;
1302 if (PL_e_script) {
1303 SvREFCNT_dec(PL_e_script);
1304 PL_e_script = Nullsv;
6224f72b
GS
1305 }
1306
1307 /* now that script is parsed, we can modify record separator */
3280af22
NIS
1308 SvREFCNT_dec(PL_rs);
1309 PL_rs = SvREFCNT_inc(PL_nrs);
864dbfa3 1310 sv_setsv(get_sv("/", TRUE), PL_rs);
3280af22 1311 if (PL_do_undump)
6224f72b
GS
1312 my_unexec();
1313
57843af0
GS
1314 if (isWARN_ONCE) {
1315 SAVECOPFILE(PL_curcop);
1316 SAVECOPLINE(PL_curcop);
3280af22 1317 gv_check(PL_defstash);
57843af0 1318 }
6224f72b
GS
1319
1320 LEAVE;
1321 FREETMPS;
1322
1323#ifdef MYMALLOC
1324 if ((s=PerlEnv_getenv("PERL_DEBUG_MSTATS")) && atoi(s) >= 2)
1325 dump_mstats("after compilation:");
1326#endif
1327
1328 ENTER;
3280af22 1329 PL_restartop = 0;
312caa8e 1330 return NULL;
6224f72b
GS
1331}
1332
954c1994
GS
1333/*
1334=for apidoc perl_run
1335
1336Tells a Perl interpreter to run. See L<perlembed>.
1337
1338=cut
1339*/
1340
6224f72b 1341int
0cb96387 1342perl_run(pTHXx)
6224f72b 1343{
de616352 1344 dTHR;
6224f72b 1345 I32 oldscope;
14dd3ad8 1346 int ret = 0;
db36c5a1 1347 dJMPENV;
cea2e8a9
GS
1348#ifdef USE_THREADS
1349 dTHX;
1350#endif
6224f72b 1351
3280af22 1352 oldscope = PL_scopestack_ix;
6224f72b 1353
14dd3ad8 1354#ifdef PERL_FLEXIBLE_EXCEPTIONS
312caa8e 1355 redo_body:
14dd3ad8
GS
1356 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vrun_body), oldscope);
1357#else
1358 JMPENV_PUSH(ret);
1359#endif
6224f72b
GS
1360 switch (ret) {
1361 case 1:
1362 cxstack_ix = -1; /* start context stack again */
312caa8e 1363 goto redo_body;
14dd3ad8
GS
1364 case 0: /* normal completion */
1365#ifndef PERL_FLEXIBLE_EXCEPTIONS
1366 redo_body:
1367 run_body(oldscope);
1368#endif
1369 /* FALL THROUGH */
1370 case 2: /* my_exit() */
3280af22 1371 while (PL_scopestack_ix > oldscope)
6224f72b
GS
1372 LEAVE;
1373 FREETMPS;
3280af22 1374 PL_curstash = PL_defstash;
865be832 1375 if (PL_endav && !PL_minus_c)
3280af22 1376 call_list(oldscope, PL_endav);
6224f72b
GS
1377#ifdef MYMALLOC
1378 if (PerlEnv_getenv("PERL_DEBUG_MSTATS"))
1379 dump_mstats("after execution: ");
1380#endif
14dd3ad8
GS
1381 ret = STATUS_NATIVE_EXPORT;
1382 break;
6224f72b 1383 case 3:
312caa8e
CS
1384 if (PL_restartop) {
1385 POPSTACK_TO(PL_mainstack);
1386 goto redo_body;
6224f72b 1387 }
bf49b057 1388 PerlIO_printf(Perl_error_log, "panic: restartop\n");
312caa8e 1389 FREETMPS;
14dd3ad8
GS
1390 ret = 1;
1391 break;
6224f72b
GS
1392 }
1393
14dd3ad8
GS
1394 JMPENV_POP;
1395 return ret;
312caa8e
CS
1396}
1397
14dd3ad8 1398#ifdef PERL_FLEXIBLE_EXCEPTIONS
312caa8e 1399STATIC void *
14dd3ad8 1400S_vrun_body(pTHX_ va_list args)
312caa8e 1401{
312caa8e
CS
1402 I32 oldscope = va_arg(args, I32);
1403
14dd3ad8
GS
1404 return run_body(oldscope);
1405}
1406#endif
1407
1408
1409STATIC void *
1410S_run_body(pTHX_ I32 oldscope)
1411{
1412 dTHR;
1413
6224f72b 1414 DEBUG_r(PerlIO_printf(Perl_debug_log, "%s $` $& $' support.\n",
3280af22 1415 PL_sawampersand ? "Enabling" : "Omitting"));
6224f72b 1416
3280af22 1417 if (!PL_restartop) {
6224f72b
GS
1418 DEBUG_x(dump_all());
1419 DEBUG(PerlIO_printf(Perl_debug_log, "\nEXECUTING...\n\n"));
b900a521
JH
1420 DEBUG_S(PerlIO_printf(Perl_debug_log, "main thread is 0x%"UVxf"\n",
1421 PTR2UV(thr)));
6224f72b 1422
3280af22 1423 if (PL_minus_c) {
bf4acbe4
GS
1424#ifdef MACOS_TRADITIONAL
1425 PerlIO_printf(Perl_error_log, "%s syntax OK\n", MacPerl_MPWFileName(PL_origfilename));
1426#else
bf49b057 1427 PerlIO_printf(Perl_error_log, "%s syntax OK\n", PL_origfilename);
bf4acbe4 1428#endif
6224f72b
GS
1429 my_exit(0);
1430 }
3280af22 1431 if (PERLDB_SINGLE && PL_DBsingle)
312caa8e 1432 sv_setiv(PL_DBsingle, 1);
3280af22
NIS
1433 if (PL_initav)
1434 call_list(oldscope, PL_initav);
6224f72b
GS
1435 }
1436
1437 /* do it */
1438
3280af22 1439 if (PL_restartop) {
533c011a 1440 PL_op = PL_restartop;
3280af22 1441 PL_restartop = 0;
cea2e8a9 1442 CALLRUNOPS(aTHX);
6224f72b 1443 }
3280af22
NIS
1444 else if (PL_main_start) {
1445 CvDEPTH(PL_main_cv) = 1;
533c011a 1446 PL_op = PL_main_start;
cea2e8a9 1447 CALLRUNOPS(aTHX);
6224f72b
GS
1448 }
1449
f6b3007c
JH
1450 my_exit(0);
1451 /* NOTREACHED */
312caa8e 1452 return NULL;
6224f72b
GS
1453}
1454
954c1994
GS
1455/*
1456=for apidoc p||get_sv
1457
1458Returns the SV of the specified Perl scalar. If C<create> is set and the
1459Perl variable does not exist then it will be created. If C<create> is not
1460set and the variable does not exist then NULL is returned.
1461
1462=cut
1463*/
1464
6224f72b 1465SV*
864dbfa3 1466Perl_get_sv(pTHX_ const char *name, I32 create)
6224f72b
GS
1467{
1468 GV *gv;
1469#ifdef USE_THREADS
1470 if (name[1] == '\0' && !isALPHA(name[0])) {
1471 PADOFFSET tmp = find_threadsv(name);
1472 if (tmp != NOT_IN_PAD) {
1473 dTHR;
1474 return THREADSV(tmp);
1475 }
1476 }
1477#endif /* USE_THREADS */
1478 gv = gv_fetchpv(name, create, SVt_PV);
1479 if (gv)
1480 return GvSV(gv);
1481 return Nullsv;
1482}
1483
954c1994
GS
1484/*
1485=for apidoc p||get_av
1486
1487Returns the AV of the specified Perl array. If C<create> is set and the
1488Perl variable does not exist then it will be created. If C<create> is not
1489set and the variable does not exist then NULL is returned.
1490
1491=cut
1492*/
1493
6224f72b 1494AV*
864dbfa3 1495Perl_get_av(pTHX_ const char *name, I32 create)
6224f72b
GS
1496{
1497 GV* gv = gv_fetchpv(name, create, SVt_PVAV);
1498 if (create)
1499 return GvAVn(gv);
1500 if (gv)
1501 return GvAV(gv);
1502 return Nullav;
1503}
1504
954c1994
GS
1505/*
1506=for apidoc p||get_hv
1507
1508Returns the HV of the specified Perl hash. If C<create> is set and the
1509Perl variable does not exist then it will be created. If C<create> is not
1510set and the variable does not exist then NULL is returned.
1511
1512=cut
1513*/
1514
6224f72b 1515HV*
864dbfa3 1516Perl_get_hv(pTHX_ const char *name, I32 create)
6224f72b 1517{
a0d0e21e
LW
1518 GV* gv = gv_fetchpv(name, create, SVt_PVHV);
1519 if (create)
1520 return GvHVn(gv);
1521 if (gv)
1522 return GvHV(gv);
1523 return Nullhv;
1524}
1525
954c1994
GS
1526/*
1527=for apidoc p||get_cv
1528
1529Returns the CV of the specified Perl subroutine. If C<create> is set and
1530the Perl subroutine does not exist then it will be declared (which has the
1531same effect as saying C<sub name;>). If C<create> is not set and the
1532subroutine does not exist then NULL is returned.
1533
1534=cut
1535*/
1536
a0d0e21e 1537CV*
864dbfa3 1538Perl_get_cv(pTHX_ const char *name, I32 create)
a0d0e21e
LW
1539{
1540 GV* gv = gv_fetchpv(name, create, SVt_PVCV);
b099ddc0 1541 /* XXX unsafe for threads if eval_owner isn't held */
f6ec51f7
GS
1542 /* XXX this is probably not what they think they're getting.
1543 * It has the same effect as "sub name;", i.e. just a forward
1544 * declaration! */
8ebc5c01 1545 if (create && !GvCVu(gv))
774d564b 1546 return newSUB(start_subparse(FALSE, 0),
a0d0e21e 1547 newSVOP(OP_CONST, 0, newSVpv(name,0)),
4633a7c4 1548 Nullop,
a0d0e21e
LW
1549 Nullop);
1550 if (gv)
8ebc5c01 1551 return GvCVu(gv);
a0d0e21e
LW
1552 return Nullcv;
1553}
1554
79072805
LW
1555/* Be sure to refetch the stack pointer after calling these routines. */
1556
954c1994
GS
1557/*
1558=for apidoc p||call_argv
1559
1560Performs a callback to the specified Perl sub. See L<perlcall>.
1561
1562=cut
1563*/
1564
a0d0e21e 1565I32
864dbfa3 1566Perl_call_argv(pTHX_ const char *sub_name, I32 flags, register char **argv)
8ac85365
NIS
1567
1568 /* See G_* flags in cop.h */
1569 /* null terminated arg list */
8990e307 1570{
a0d0e21e 1571 dSP;
8990e307 1572
924508f0 1573 PUSHMARK(SP);
a0d0e21e 1574 if (argv) {
8990e307 1575 while (*argv) {
a0d0e21e 1576 XPUSHs(sv_2mortal(newSVpv(*argv,0)));
8990e307
LW
1577 argv++;
1578 }
a0d0e21e 1579 PUTBACK;
8990e307 1580 }
864dbfa3 1581 return call_pv(sub_name, flags);
8990e307
LW
1582}
1583
954c1994
GS
1584/*
1585=for apidoc p||call_pv
1586
1587Performs a callback to the specified Perl sub. See L<perlcall>.
1588
1589=cut
1590*/
1591
a0d0e21e 1592I32
864dbfa3 1593Perl_call_pv(pTHX_ const char *sub_name, I32 flags)
8ac85365
NIS
1594 /* name of the subroutine */
1595 /* See G_* flags in cop.h */
a0d0e21e 1596{
864dbfa3 1597 return call_sv((SV*)get_cv(sub_name, TRUE), flags);
a0d0e21e
LW
1598}
1599
954c1994
GS
1600/*
1601=for apidoc p||call_method
1602
1603Performs a callback to the specified Perl method. The blessed object must
1604be on the stack. See L<perlcall>.
1605
1606=cut
1607*/
1608
a0d0e21e 1609I32
864dbfa3 1610Perl_call_method(pTHX_ const char *methname, I32 flags)
8ac85365
NIS
1611 /* name of the subroutine */
1612 /* See G_* flags in cop.h */
a0d0e21e 1613{
968b3946 1614 return call_sv(sv_2mortal(newSVpv(methname,0)), flags | G_METHOD);
a0d0e21e
LW
1615}
1616
1617/* May be called with any of a CV, a GV, or an SV containing the name. */
954c1994
GS
1618/*
1619=for apidoc p||call_sv
1620
1621Performs a callback to the Perl sub whose name is in the SV. See
1622L<perlcall>.
1623
1624=cut
1625*/
1626
a0d0e21e 1627I32
864dbfa3 1628Perl_call_sv(pTHX_ SV *sv, I32 flags)
8ac85365 1629 /* See G_* flags in cop.h */
a0d0e21e 1630{
924508f0 1631 dSP;
a0d0e21e 1632 LOGOP myop; /* fake syntax tree node */
968b3946 1633 UNOP method_op;
aa689395 1634 I32 oldmark;
a0d0e21e 1635 I32 retval;
a0d0e21e 1636 I32 oldscope;
54310121 1637 bool oldcatch = CATCH_GET;
6224f72b 1638 int ret;
533c011a 1639 OP* oldop = PL_op;
db36c5a1 1640 dJMPENV;
1e422769 1641
a0d0e21e
LW
1642 if (flags & G_DISCARD) {
1643 ENTER;
1644 SAVETMPS;
1645 }
1646
aa689395 1647 Zero(&myop, 1, LOGOP);
54310121 1648 myop.op_next = Nullop;
f51d4af5 1649 if (!(flags & G_NOARGS))
aa689395 1650 myop.op_flags |= OPf_STACKED;
54310121 1651 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1652 (flags & G_ARRAY) ? OPf_WANT_LIST :
1653 OPf_WANT_SCALAR);
462e5cf6 1654 SAVEOP();
533c011a 1655 PL_op = (OP*)&myop;
aa689395 1656
3280af22
NIS
1657 EXTEND(PL_stack_sp, 1);
1658 *++PL_stack_sp = sv;
aa689395 1659 oldmark = TOPMARK;
3280af22 1660 oldscope = PL_scopestack_ix;
a0d0e21e 1661
3280af22 1662 if (PERLDB_SUB && PL_curstash != PL_debstash
36477c24 1663 /* Handle first BEGIN of -d. */
3280af22 1664 && (PL_DBcv || (PL_DBcv = GvCV(PL_DBsub)))
36477c24 1665 /* Try harder, since this may have been a sighandler, thus
1666 * curstash may be meaningless. */
3280af22 1667 && (SvTYPE(sv) != SVt_PVCV || CvSTASH((CV*)sv) != PL_debstash)
491527d0 1668 && !(flags & G_NODEBUG))
533c011a 1669 PL_op->op_private |= OPpENTERSUB_DB;
a0d0e21e 1670
968b3946
GS
1671 if (flags & G_METHOD) {
1672 Zero(&method_op, 1, UNOP);
1673 method_op.op_next = PL_op;
1674 method_op.op_ppaddr = PL_ppaddr[OP_METHOD];
1675 myop.op_ppaddr = PL_ppaddr[OP_ENTERSUB];
f39d0b86 1676 PL_op = (OP*)&method_op;
968b3946
GS
1677 }
1678
312caa8e 1679 if (!(flags & G_EVAL)) {
0cdb2077 1680 CATCH_SET(TRUE);
14dd3ad8 1681 call_body((OP*)&myop, FALSE);
312caa8e 1682 retval = PL_stack_sp - (PL_stack_base + oldmark);
0253cb41 1683 CATCH_SET(oldcatch);
312caa8e
CS
1684 }
1685 else {
d78bda3d 1686 myop.op_other = (OP*)&myop;
3280af22 1687 PL_markstack_ptr--;
4633a7c4
LW
1688 /* we're trying to emulate pp_entertry() here */
1689 {
c09156bb 1690 register PERL_CONTEXT *cx;
54310121 1691 I32 gimme = GIMME_V;
4633a7c4
LW
1692
1693 ENTER;
1694 SAVETMPS;
1695
968b3946 1696 push_return(Nullop);
1d76a5c3 1697 PUSHBLOCK(cx, (CXt_EVAL|CXp_TRYBLOCK), PL_stack_sp);
4633a7c4 1698 PUSHEVAL(cx, 0, 0);
533c011a 1699 PL_eval_root = PL_op; /* Only needed so that goto works right. */
4633a7c4 1700
faef0170 1701 PL_in_eval = EVAL_INEVAL;
4633a7c4 1702 if (flags & G_KEEPERR)
faef0170 1703 PL_in_eval |= EVAL_KEEPERR;
4633a7c4 1704 else
38a03e6e 1705 sv_setpv(ERRSV,"");
4633a7c4 1706 }
3280af22 1707 PL_markstack_ptr++;
a0d0e21e 1708
14dd3ad8
GS
1709#ifdef PERL_FLEXIBLE_EXCEPTIONS
1710 redo_body:
1711 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vcall_body),
db36c5a1 1712 (OP*)&myop, FALSE);
14dd3ad8
GS
1713#else
1714 JMPENV_PUSH(ret);
1715#endif
6224f72b
GS
1716 switch (ret) {
1717 case 0:
14dd3ad8
GS
1718#ifndef PERL_FLEXIBLE_EXCEPTIONS
1719 redo_body:
1720 call_body((OP*)&myop, FALSE);
1721#endif
312caa8e
CS
1722 retval = PL_stack_sp - (PL_stack_base + oldmark);
1723 if (!(flags & G_KEEPERR))
1724 sv_setpv(ERRSV,"");
a0d0e21e 1725 break;
6224f72b 1726 case 1:
f86702cc 1727 STATUS_ALL_FAILURE;
a0d0e21e 1728 /* FALL THROUGH */
6224f72b 1729 case 2:
a0d0e21e 1730 /* my_exit() was called */
3280af22 1731 PL_curstash = PL_defstash;
a0d0e21e 1732 FREETMPS;
14dd3ad8 1733 JMPENV_POP;
cc3604b1 1734 if (PL_statusvalue && !(PL_exit_flags & PERL_EXIT_EXPECTED))
cea2e8a9 1735 Perl_croak(aTHX_ "Callback called exit");
f86702cc 1736 my_exit_jump();
a0d0e21e 1737 /* NOTREACHED */
6224f72b 1738 case 3:
3280af22 1739 if (PL_restartop) {
533c011a 1740 PL_op = PL_restartop;
3280af22 1741 PL_restartop = 0;
312caa8e 1742 goto redo_body;
a0d0e21e 1743 }
3280af22 1744 PL_stack_sp = PL_stack_base + oldmark;
a0d0e21e
LW
1745 if (flags & G_ARRAY)
1746 retval = 0;
1747 else {
1748 retval = 1;
3280af22 1749 *++PL_stack_sp = &PL_sv_undef;
a0d0e21e 1750 }
312caa8e 1751 break;
a0d0e21e 1752 }
a0d0e21e 1753
3280af22 1754 if (PL_scopestack_ix > oldscope) {
a0a2876f
LW
1755 SV **newsp;
1756 PMOP *newpm;
1757 I32 gimme;
c09156bb 1758 register PERL_CONTEXT *cx;
a0a2876f
LW
1759 I32 optype;
1760
1761 POPBLOCK(cx,newpm);
1762 POPEVAL(cx);
1763 pop_return();
3280af22 1764 PL_curpm = newpm;
a0a2876f 1765 LEAVE;
a0d0e21e 1766 }
14dd3ad8 1767 JMPENV_POP;
a0d0e21e 1768 }
1e422769 1769
a0d0e21e 1770 if (flags & G_DISCARD) {
3280af22 1771 PL_stack_sp = PL_stack_base + oldmark;
a0d0e21e
LW
1772 retval = 0;
1773 FREETMPS;
1774 LEAVE;
1775 }
533c011a 1776 PL_op = oldop;
a0d0e21e
LW
1777 return retval;
1778}
1779
14dd3ad8 1780#ifdef PERL_FLEXIBLE_EXCEPTIONS
312caa8e 1781STATIC void *
14dd3ad8 1782S_vcall_body(pTHX_ va_list args)
312caa8e
CS
1783{
1784 OP *myop = va_arg(args, OP*);
1785 int is_eval = va_arg(args, int);
1786
14dd3ad8 1787 call_body(myop, is_eval);
312caa8e
CS
1788 return NULL;
1789}
14dd3ad8 1790#endif
312caa8e
CS
1791
1792STATIC void
14dd3ad8 1793S_call_body(pTHX_ OP *myop, int is_eval)
312caa8e
CS
1794{
1795 dTHR;
1796
1797 if (PL_op == myop) {
1798 if (is_eval)
f807eda9 1799 PL_op = Perl_pp_entereval(aTHX); /* this doesn't do a POPMARK */
312caa8e 1800 else
f807eda9 1801 PL_op = Perl_pp_entersub(aTHX); /* this does */
312caa8e
CS
1802 }
1803 if (PL_op)
cea2e8a9 1804 CALLRUNOPS(aTHX);
312caa8e
CS
1805}
1806
6e72f9df 1807/* Eval a string. The G_EVAL flag is always assumed. */
8990e307 1808
954c1994
GS
1809/*
1810=for apidoc p||eval_sv
1811
1812Tells Perl to C<eval> the string in the SV.
1813
1814=cut
1815*/
1816
a0d0e21e 1817I32
864dbfa3 1818Perl_eval_sv(pTHX_ SV *sv, I32 flags)
8ac85365
NIS
1819
1820 /* See G_* flags in cop.h */
a0d0e21e 1821{
924508f0 1822 dSP;
a0d0e21e 1823 UNOP myop; /* fake syntax tree node */
3280af22 1824 I32 oldmark = SP - PL_stack_base;
4633a7c4 1825 I32 retval;
4633a7c4 1826 I32 oldscope;
6224f72b 1827 int ret;
533c011a 1828 OP* oldop = PL_op;
db36c5a1 1829 dJMPENV;
84902520 1830
4633a7c4
LW
1831 if (flags & G_DISCARD) {
1832 ENTER;
1833 SAVETMPS;
1834 }
1835
462e5cf6 1836 SAVEOP();
533c011a
NIS
1837 PL_op = (OP*)&myop;
1838 Zero(PL_op, 1, UNOP);
3280af22
NIS
1839 EXTEND(PL_stack_sp, 1);
1840 *++PL_stack_sp = sv;
1841 oldscope = PL_scopestack_ix;
79072805 1842
4633a7c4
LW
1843 if (!(flags & G_NOARGS))
1844 myop.op_flags = OPf_STACKED;
79072805 1845 myop.op_next = Nullop;
6e72f9df 1846 myop.op_type = OP_ENTEREVAL;
54310121 1847 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1848 (flags & G_ARRAY) ? OPf_WANT_LIST :
1849 OPf_WANT_SCALAR);
6e72f9df 1850 if (flags & G_KEEPERR)
1851 myop.op_flags |= OPf_SPECIAL;
4633a7c4 1852
14dd3ad8 1853#ifdef PERL_FLEXIBLE_EXCEPTIONS
312caa8e 1854 redo_body:
14dd3ad8 1855 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vcall_body),
db36c5a1 1856 (OP*)&myop, TRUE);
14dd3ad8
GS
1857#else
1858 JMPENV_PUSH(ret);
1859#endif
6224f72b
GS
1860 switch (ret) {
1861 case 0:
14dd3ad8
GS
1862#ifndef PERL_FLEXIBLE_EXCEPTIONS
1863 redo_body:
1864 call_body((OP*)&myop,TRUE);
1865#endif
312caa8e
CS
1866 retval = PL_stack_sp - (PL_stack_base + oldmark);
1867 if (!(flags & G_KEEPERR))
1868 sv_setpv(ERRSV,"");
4633a7c4 1869 break;
6224f72b 1870 case 1:
f86702cc 1871 STATUS_ALL_FAILURE;
4633a7c4 1872 /* FALL THROUGH */
6224f72b 1873 case 2:
4633a7c4 1874 /* my_exit() was called */
3280af22 1875 PL_curstash = PL_defstash;
4633a7c4 1876 FREETMPS;
14dd3ad8 1877 JMPENV_POP;
cc3604b1 1878 if (PL_statusvalue && !(PL_exit_flags & PERL_EXIT_EXPECTED))
cea2e8a9 1879 Perl_croak(aTHX_ "Callback called exit");
f86702cc 1880 my_exit_jump();
4633a7c4 1881 /* NOTREACHED */
6224f72b 1882 case 3:
3280af22 1883 if (PL_restartop) {
533c011a 1884 PL_op = PL_restartop;
3280af22 1885 PL_restartop = 0;
312caa8e 1886 goto redo_body;
4633a7c4 1887 }
3280af22 1888 PL_stack_sp = PL_stack_base + oldmark;
4633a7c4
LW
1889 if (flags & G_ARRAY)
1890 retval = 0;
1891 else {
1892 retval = 1;
3280af22 1893 *++PL_stack_sp = &PL_sv_undef;
4633a7c4 1894 }
312caa8e 1895 break;
4633a7c4
LW
1896 }
1897
14dd3ad8 1898 JMPENV_POP;
4633a7c4 1899 if (flags & G_DISCARD) {
3280af22 1900 PL_stack_sp = PL_stack_base + oldmark;
4633a7c4
LW
1901 retval = 0;
1902 FREETMPS;
1903 LEAVE;
1904 }
533c011a 1905 PL_op = oldop;
4633a7c4
LW
1906 return retval;
1907}
1908
954c1994
GS
1909/*
1910=for apidoc p||eval_pv
1911
1912Tells Perl to C<eval> the given string and return an SV* result.
1913
1914=cut
1915*/
1916
137443ea 1917SV*
864dbfa3 1918Perl_eval_pv(pTHX_ const char *p, I32 croak_on_error)
137443ea 1919{
1920 dSP;
1921 SV* sv = newSVpv(p, 0);
1922
864dbfa3 1923 eval_sv(sv, G_SCALAR);
137443ea 1924 SvREFCNT_dec(sv);
1925
1926 SPAGAIN;
1927 sv = POPs;
1928 PUTBACK;
1929
2d8e6c8d
GS
1930 if (croak_on_error && SvTRUE(ERRSV)) {
1931 STRLEN n_a;
cea2e8a9 1932 Perl_croak(aTHX_ SvPVx(ERRSV, n_a));
2d8e6c8d 1933 }
137443ea 1934
1935 return sv;
1936}
1937
4633a7c4
LW
1938/* Require a module. */
1939
954c1994
GS
1940/*
1941=for apidoc p||require_pv
1942
1943Tells Perl to C<require> a module.
1944
1945=cut
1946*/
1947
4633a7c4 1948void
864dbfa3 1949Perl_require_pv(pTHX_ const char *pv)
4633a7c4 1950{
d3acc0f7
JP
1951 SV* sv;
1952 dSP;
e788e7d3 1953 PUSHSTACKi(PERLSI_REQUIRE);
d3acc0f7
JP
1954 PUTBACK;
1955 sv = sv_newmortal();
4633a7c4
LW
1956 sv_setpv(sv, "require '");
1957 sv_catpv(sv, pv);
1958 sv_catpv(sv, "'");
864dbfa3 1959 eval_sv(sv, G_DISCARD);
d3acc0f7
JP
1960 SPAGAIN;
1961 POPSTACK;
79072805
LW
1962}
1963
79072805 1964void
864dbfa3 1965Perl_magicname(pTHX_ char *sym, char *name, I32 namlen)
79072805
LW
1966{
1967 register GV *gv;
1968
155aba94 1969 if ((gv = gv_fetchpv(sym,TRUE, SVt_PV)))
79072805
LW
1970 sv_magic(GvSV(gv), (SV*)gv, 0, name, namlen);
1971}
1972
76e3520e 1973STATIC void
cea2e8a9 1974S_usage(pTHX_ char *name) /* XXX move this out into a module ? */
4633a7c4 1975{
ab821d7f 1976 /* This message really ought to be max 23 lines.
1977 * Removed -h because the user already knows that opton. Others? */
fb73857a 1978
76e3520e 1979 static char *usage_msg[] = {
fb73857a 1980"-0[octal] specify record separator (\\0, if no argument)",
1981"-a autosplit mode with -n or -p (splits $_ into @F)",
46487f74 1982"-C enable native wide character system interfaces",
1950ee41 1983"-c check syntax only (runs BEGIN and CHECK blocks)",
aac3bd0d
GS
1984"-d[:debugger] run program under debugger",
1985"-D[number/list] set debugging flags (argument is a bit mask or alphabets)",
1986"-e 'command' one line of program (several -e's allowed, omit programfile)",
1987"-F/pattern/ split() pattern for -a switch (//'s are optional)",
1988"-i[extension] edit <> files in place (makes backup if extension supplied)",
1989"-Idirectory specify @INC/#include directory (several -I's allowed)",
fb73857a 1990"-l[octal] enable line ending processing, specifies line terminator",
aac3bd0d
GS
1991"-[mM][-]module execute `use/no module...' before executing program",
1992"-n assume 'while (<>) { ... }' loop around program",
1993"-p assume loop like -n but print line also, like sed",
1994"-P run program through C preprocessor before compilation",
1995"-s enable rudimentary parsing for switches after programfile",
1996"-S look for programfile using PATH environment variable",
1997"-T enable tainting checks",
1998"-u dump core after parsing program",
fb73857a 1999"-U allow unsafe operations",
aac3bd0d
GS
2000"-v print version, subversion (includes VERY IMPORTANT perl info)",
2001"-V[:variable] print configuration summary (or a single Config.pm variable)",
2002"-w enable many useful warnings (RECOMMENDED)",
3c0facb2
GS
2003"-W enable all warnings",
2004"-X disable all warnings",
fb73857a 2005"-x[directory] strip off text before #!perl line and perhaps cd to directory",
2006"\n",
2007NULL
2008};
76e3520e 2009 char **p = usage_msg;
fb73857a 2010
b0e47665
GS
2011 PerlIO_printf(PerlIO_stdout(),
2012 "\nUsage: %s [switches] [--] [programfile] [arguments]",
2013 name);
fb73857a 2014 while (*p)
b0e47665 2015 PerlIO_printf(PerlIO_stdout(), "\n %s", *p++);
4633a7c4
LW
2016}
2017
79072805
LW
2018/* This routine handles any switches that can be given during run */
2019
2020char *
864dbfa3 2021Perl_moreswitches(pTHX_ char *s)
79072805
LW
2022{
2023 I32 numlen;
c07a80fd 2024 U32 rschar;
79072805
LW
2025
2026 switch (*s) {
2027 case '0':
a863c7d1
MB
2028 {
2029 dTHR;
b21ed0a9 2030 numlen = 0; /* disallow underscores */
dff6d3cd 2031 rschar = (U32)scan_oct(s, 4, &numlen);
3280af22 2032 SvREFCNT_dec(PL_nrs);
c07a80fd 2033 if (rschar & ~((U8)~0))
3280af22 2034 PL_nrs = &PL_sv_undef;
c07a80fd 2035 else if (!rschar && numlen >= 2)
79cb57f6 2036 PL_nrs = newSVpvn("", 0);
c07a80fd 2037 else {
2038 char ch = rschar;
79cb57f6 2039 PL_nrs = newSVpvn(&ch, 1);
79072805
LW
2040 }
2041 return s + numlen;
a863c7d1 2042 }
46487f74
GS
2043 case 'C':
2044 PL_widesyscalls = TRUE;
2045 s++;
2046 return s;
2304df62 2047 case 'F':
3280af22
NIS
2048 PL_minus_F = TRUE;
2049 PL_splitstr = savepv(s + 1);
2304df62
AD
2050 s += strlen(s);
2051 return s;
79072805 2052 case 'a':
3280af22 2053 PL_minus_a = TRUE;
79072805
LW
2054 s++;
2055 return s;
2056 case 'c':
3280af22 2057 PL_minus_c = TRUE;
79072805
LW
2058 s++;
2059 return s;
2060 case 'd':
bbce6d69 2061 forbid_setid("-d");
4633a7c4 2062 s++;
70c94a19
RR
2063 /* The following permits -d:Mod to accepts arguments following an =
2064 in the fashion that -MSome::Mod does. */
2065 if (*s == ':' || *s == '=') {
2066 char *start;
2067 SV *sv;
2068 sv = newSVpv("use Devel::", 0);
2069 start = ++s;
2070 /* We now allow -d:Module=Foo,Bar */
2071 while(isALNUM(*s) || *s==':') ++s;
2072 if (*s != '=')
2073 sv_catpv(sv, start);
2074 else {
2075 sv_catpvn(sv, start, s-start);
2076 sv_catpv(sv, " split(/,/,q{");
2077 sv_catpv(sv, ++s);
2078 sv_catpv(sv, "})");
2079 }
4633a7c4 2080 s += strlen(s);
70c94a19 2081 my_setenv("PERL5DB", SvPV(sv, PL_na));
4633a7c4 2082 }
ed094faf 2083 if (!PL_perldb) {
3280af22 2084 PL_perldb = PERLDB_ALL;
a0d0e21e 2085 init_debugger();
ed094faf 2086 }
79072805
LW
2087 return s;
2088 case 'D':
0453d815 2089 {
79072805 2090#ifdef DEBUGGING
bbce6d69 2091 forbid_setid("-D");
79072805 2092 if (isALPHA(s[1])) {
8b73bbec 2093 static char debopts[] = "psltocPmfrxuLHXDS";
79072805
LW
2094 char *d;
2095
93a17b20 2096 for (s++; *s && (d = strchr(debopts,*s)); s++)
3280af22 2097 PL_debug |= 1 << (d - debopts);
79072805
LW
2098 }
2099 else {
3280af22 2100 PL_debug = atoi(s+1);
79072805
LW
2101 for (s++; isDIGIT(*s); s++) ;
2102 }
3280af22 2103 PL_debug |= 0x80000000;
79072805 2104#else
0453d815
PM
2105 dTHR;
2106 if (ckWARN_d(WARN_DEBUGGING))
2107 Perl_warner(aTHX_ WARN_DEBUGGING,
2108 "Recompile perl with -DDEBUGGING to use -D switch\n");
a0d0e21e 2109 for (s++; isALNUM(*s); s++) ;
79072805
LW
2110#endif
2111 /*SUPPRESS 530*/
2112 return s;
0453d815 2113 }
4633a7c4 2114 case 'h':
3280af22 2115 usage(PL_origargv[0]);
6ad3d225 2116 PerlProc_exit(0);
79072805 2117 case 'i':
3280af22
NIS
2118 if (PL_inplace)
2119 Safefree(PL_inplace);
2120 PL_inplace = savepv(s+1);
79072805 2121 /*SUPPRESS 530*/
3280af22 2122 for (s = PL_inplace; *s && !isSPACE(*s); s++) ;
7b8d334a 2123 if (*s) {
fb73857a 2124 *s++ = '\0';
7b8d334a
GS
2125 if (*s == '-') /* Additional switches on #! line. */
2126 s++;
2127 }
fb73857a 2128 return s;
2129 case 'I': /* -I handled both here and in parse_perl() */
bbce6d69 2130 forbid_setid("-I");
fb73857a 2131 ++s;
2132 while (*s && isSPACE(*s))
2133 ++s;
2134 if (*s) {
774d564b 2135 char *e, *p;
0df16ed7
GS
2136 p = s;
2137 /* ignore trailing spaces (possibly followed by other switches) */
2138 do {
2139 for (e = p; *e && !isSPACE(*e); e++) ;
2140 p = e;
2141 while (isSPACE(*p))
2142 p++;
2143 } while (*p && *p != '-');
2144 e = savepvn(s, e-s);
9c8a64f0 2145 incpush(e, TRUE, TRUE);
0df16ed7
GS
2146 Safefree(e);
2147 s = p;
2148 if (*s == '-')
2149 s++;
79072805
LW
2150 }
2151 else
a67e862a 2152 Perl_croak(aTHX_ "No directory specified for -I");
fb73857a 2153 return s;
79072805 2154 case 'l':
3280af22 2155 PL_minus_l = TRUE;
79072805 2156 s++;
3280af22
NIS
2157 if (PL_ors)
2158 Safefree(PL_ors);
79072805 2159 if (isDIGIT(*s)) {
3280af22
NIS
2160 PL_ors = savepv("\n");
2161 PL_orslen = 1;
b21ed0a9 2162 numlen = 0; /* disallow underscores */
dff6d3cd 2163 *PL_ors = (char)scan_oct(s, 3 + (*s == '0'), &numlen);
79072805
LW
2164 s += numlen;
2165 }
2166 else {
a863c7d1 2167 dTHR;
3280af22
NIS
2168 if (RsPARA(PL_nrs)) {
2169 PL_ors = "\n\n";
2170 PL_orslen = 2;
c07a80fd 2171 }
2172 else
3280af22
NIS
2173 PL_ors = SvPV(PL_nrs, PL_orslen);
2174 PL_ors = savepvn(PL_ors, PL_orslen);
79072805
LW
2175 }
2176 return s;
1a30305b 2177 case 'M':
bbce6d69 2178 forbid_setid("-M"); /* XXX ? */
1a30305b 2179 /* FALL THROUGH */
2180 case 'm':
bbce6d69 2181 forbid_setid("-m"); /* XXX ? */
1a30305b 2182 if (*++s) {
a5f75d66 2183 char *start;
11343788 2184 SV *sv;
a5f75d66
AD
2185 char *use = "use ";
2186 /* -M-foo == 'no foo' */
2187 if (*s == '-') { use = "no "; ++s; }
11343788 2188 sv = newSVpv(use,0);
a5f75d66 2189 start = s;
1a30305b 2190 /* We allow -M'Module qw(Foo Bar)' */
c07a80fd 2191 while(isALNUM(*s) || *s==':') ++s;
2192 if (*s != '=') {
11343788 2193 sv_catpv(sv, start);
c07a80fd 2194 if (*(start-1) == 'm') {
2195 if (*s != '\0')
cea2e8a9 2196 Perl_croak(aTHX_ "Can't use '%c' after -mname", *s);
11343788 2197 sv_catpv( sv, " ()");
c07a80fd 2198 }
2199 } else {
6df41af2 2200 if (s == start)
be98fb35
GS
2201 Perl_croak(aTHX_ "Module name required with -%c option",
2202 s[-1]);
11343788
MB
2203 sv_catpvn(sv, start, s-start);
2204 sv_catpv(sv, " split(/,/,q{");
2205 sv_catpv(sv, ++s);
2206 sv_catpv(sv, "})");
c07a80fd 2207 }
1a30305b 2208 s += strlen(s);
5c831c24 2209 if (!PL_preambleav)
3280af22
NIS
2210 PL_preambleav = newAV();
2211 av_push(PL_preambleav, sv);
1a30305b 2212 }
2213 else
cea2e8a9 2214 Perl_croak(aTHX_ "No space allowed after -%c", *(s-1));
1a30305b 2215 return s;
79072805 2216 case 'n':
3280af22 2217 PL_minus_n = TRUE;
79072805
LW
2218 s++;
2219 return s;
2220 case 'p':
3280af22 2221 PL_minus_p = TRUE;
79072805
LW
2222 s++;
2223 return s;
2224 case 's':
bbce6d69 2225 forbid_setid("-s");
3280af22 2226 PL_doswitches = TRUE;
79072805
LW
2227 s++;
2228 return s;
463ee0b2 2229 case 'T':
3280af22 2230 if (!PL_tainting)
cea2e8a9 2231 Perl_croak(aTHX_ "Too late for \"-T\" option");
463ee0b2
LW
2232 s++;
2233 return s;
79072805 2234 case 'u':
bf4acbe4
GS
2235#ifdef MACOS_TRADITIONAL
2236 Perl_croak(aTHX_ "Believe me, you don't want to use \"-u\" on a Macintosh");
2237#endif
3280af22 2238 PL_do_undump = TRUE;
79072805
LW
2239 s++;
2240 return s;
2241 case 'U':
3280af22 2242 PL_unsafe = TRUE;
79072805
LW
2243 s++;
2244 return s;
2245 case 'v':
b0e47665
GS
2246 PerlIO_printf(PerlIO_stdout(),
2247 Perl_form(aTHX_ "\nThis is perl, v%vd built for %s",
2248 PL_patchlevel, ARCHNAME));
fb73857a 2249#if defined(LOCAL_PATCH_COUNT)
2250 if (LOCAL_PATCH_COUNT > 0)
b0e47665
GS
2251 PerlIO_printf(PerlIO_stdout(),
2252 "\n(with %d registered patch%s, "
2253 "see perl -V for more detail)",
2254 (int)LOCAL_PATCH_COUNT,
2255 (LOCAL_PATCH_COUNT!=1) ? "es" : "");
a5f75d66 2256#endif
1a30305b 2257
b0e47665
GS
2258 PerlIO_printf(PerlIO_stdout(),
2259 "\n\nCopyright 1987-2000, Larry Wall\n");
eae9c151
JH
2260#ifdef MACOS_TRADITIONAL
2261 PerlIO_printf(PerlIO_stdout(),
2262 "\nMacOS port Copyright (c) 1991-2000, Matthias Neeracher\n");
2263#endif
79072805 2264#ifdef MSDOS
b0e47665
GS
2265 PerlIO_printf(PerlIO_stdout(),
2266 "\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
55497cff 2267#endif
2268#ifdef DJGPP
b0e47665
GS
2269 PerlIO_printf(PerlIO_stdout(),
2270 "djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n"
2271 "djgpp v2 port (perl5004+) by Laszlo Molnar, 1997-1999\n");
4633a7c4 2272#endif
79072805 2273#ifdef OS2
b0e47665
GS
2274 PerlIO_printf(PerlIO_stdout(),
2275 "\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
2276 "Version 5 port Copyright (c) 1994-1999, Andreas Kaiser, Ilya Zakharevich\n");
79072805 2277#endif
79072805 2278#ifdef atarist
b0e47665
GS
2279 PerlIO_printf(PerlIO_stdout(),
2280 "atariST series port, ++jrb bammi@cadence.com\n");
79072805 2281#endif
a3f9223b 2282#ifdef __BEOS__
b0e47665
GS
2283 PerlIO_printf(PerlIO_stdout(),
2284 "BeOS port Copyright Tom Spindler, 1997-1999\n");
a3f9223b 2285#endif
1d84e8df 2286#ifdef MPE
b0e47665
GS
2287 PerlIO_printf(PerlIO_stdout(),
2288 "MPE/iX port Copyright by Mark Klein and Mark Bixby, 1996-1999\n");
1d84e8df 2289#endif
9d116dd7 2290#ifdef OEMVS
b0e47665
GS
2291 PerlIO_printf(PerlIO_stdout(),
2292 "MVS (OS390) port by Mortice Kern Systems, 1997-1999\n");
9d116dd7 2293#endif
495c5fdc 2294#ifdef __VOS__
b0e47665
GS
2295 PerlIO_printf(PerlIO_stdout(),
2296 "Stratus VOS port by Paul_Green@stratus.com, 1997-1999\n");
495c5fdc 2297#endif
092bebab 2298#ifdef __OPEN_VM
b0e47665
GS
2299 PerlIO_printf(PerlIO_stdout(),
2300 "VM/ESA port by Neale Ferguson, 1998-1999\n");
092bebab 2301#endif
a1a0e61e 2302#ifdef POSIX_BC
b0e47665
GS
2303 PerlIO_printf(PerlIO_stdout(),
2304 "BS2000 (POSIX) port by Start Amadeus GmbH, 1998-1999\n");
a1a0e61e 2305#endif
61ae2fbf 2306#ifdef __MINT__
b0e47665
GS
2307 PerlIO_printf(PerlIO_stdout(),
2308 "MiNT port by Guido Flohr, 1997-1999\n");
61ae2fbf 2309#endif
f83d2536 2310#ifdef EPOC
b0e47665
GS
2311 PerlIO_printf(PerlIO_stdout(),
2312 "EPOC port by Olaf Flebbe, 1999-2000\n");
f83d2536 2313#endif
baed7233
DL
2314#ifdef BINARY_BUILD_NOTICE
2315 BINARY_BUILD_NOTICE;
2316#endif
b0e47665
GS
2317 PerlIO_printf(PerlIO_stdout(),
2318 "\n\
79072805 2319Perl may be copied only under the terms of either the Artistic License or the\n\
95103687
GS
2320GNU General Public License, which may be found in the Perl 5.0 source kit.\n\n\
2321Complete documentation for Perl, including FAQ lists, should be found on\n\
2322this system using `man perl' or `perldoc perl'. If you have access to the\n\
2323Internet, point your browser at http://www.perl.com/, the Perl Home Page.\n\n");
6ad3d225 2324 PerlProc_exit(0);
79072805 2325 case 'w':
599cee73
PM
2326 if (! (PL_dowarn & G_WARN_ALL_MASK))
2327 PL_dowarn |= G_WARN_ON;
2328 s++;
2329 return s;
2330 case 'W':
2331 PL_dowarn = G_WARN_ALL_ON|G_WARN_ON;
d3a7d8c7 2332 PL_compiling.cop_warnings = pWARN_ALL ;
599cee73
PM
2333 s++;
2334 return s;
2335 case 'X':
2336 PL_dowarn = G_WARN_ALL_OFF;
d3a7d8c7 2337 PL_compiling.cop_warnings = pWARN_NONE ;
79072805
LW
2338 s++;
2339 return s;
a0d0e21e 2340 case '*':
79072805
LW
2341 case ' ':
2342 if (s[1] == '-') /* Additional switches on #! line. */
2343 return s+2;
2344 break;
a0d0e21e 2345 case '-':
79072805 2346 case 0:
51882d45 2347#if defined(WIN32) || !defined(PERL_STRICT_CR)
a868473f
NIS
2348 case '\r':
2349#endif
79072805
LW
2350 case '\n':
2351 case '\t':
2352 break;
aa689395 2353#ifdef ALTERNATE_SHEBANG
2354 case 'S': /* OS/2 needs -S on "extproc" line. */
2355 break;
2356#endif
a0d0e21e 2357 case 'P':
3280af22 2358 if (PL_preprocess)
a0d0e21e
LW
2359 return s+1;
2360 /* FALL THROUGH */
79072805 2361 default:
cea2e8a9 2362 Perl_croak(aTHX_ "Can't emulate -%.1s on #! line",s);
79072805
LW
2363 }
2364 return Nullch;
2365}
2366
2367/* compliments of Tom Christiansen */
2368
2369/* unexec() can be found in the Gnu emacs distribution */
ee580363 2370/* Known to work with -DUNEXEC and using unexelf.c from GNU emacs-20.2 */
79072805
LW
2371
2372void
864dbfa3 2373Perl_my_unexec(pTHX)
79072805
LW
2374{
2375#ifdef UNEXEC
46fc3d4c 2376 SV* prog;
2377 SV* file;
ee580363 2378 int status = 1;
79072805
LW
2379 extern int etext;
2380
ee580363 2381 prog = newSVpv(BIN_EXP, 0);
46fc3d4c 2382 sv_catpv(prog, "/perl");
6b88bc9c 2383 file = newSVpv(PL_origfilename, 0);
46fc3d4c 2384 sv_catpv(file, ".perldump");
79072805 2385
ee580363
GS
2386 unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
2387 /* unexec prints msg to stderr in case of failure */
6ad3d225 2388 PerlProc_exit(status);
79072805 2389#else
a5f75d66
AD
2390# ifdef VMS
2391# include <lib$routines.h>
2392 lib$signal(SS$_DEBUG); /* ssdef.h #included from vmsish.h */
aa689395 2393# else
79072805 2394 ABORT(); /* for use with undump */
aa689395 2395# endif
a5f75d66 2396#endif
79072805
LW
2397}
2398
cb68f92d
GS
2399/* initialize curinterp */
2400STATIC void
cea2e8a9 2401S_init_interp(pTHX)
cb68f92d
GS
2402{
2403
066ef5b5 2404#ifdef PERL_OBJECT /* XXX kludge */
cb68f92d 2405#define I_REINIT \
6b88bc9c
GS
2406 STMT_START { \
2407 PL_chopset = " \n-"; \
2408 PL_copline = NOLINE; \
2409 PL_curcop = &PL_compiling;\
2410 PL_curcopdb = NULL; \
2411 PL_dbargs = 0; \
3967c732 2412 PL_dumpindent = 4; \
6b88bc9c
GS
2413 PL_laststatval = -1; \
2414 PL_laststype = OP_STAT; \
2415 PL_maxscream = -1; \
2416 PL_maxsysfd = MAXSYSFD; \
2417 PL_statname = Nullsv; \
2418 PL_tmps_floor = -1; \
2419 PL_tmps_ix = -1; \
2420 PL_op_mask = NULL; \
6b88bc9c
GS
2421 PL_laststatval = -1; \
2422 PL_laststype = OP_STAT; \
2423 PL_mess_sv = Nullsv; \
2424 PL_splitstr = " "; \
2425 PL_generation = 100; \
2426 PL_exitlist = NULL; \
2427 PL_exitlistlen = 0; \
2428 PL_regindent = 0; \
2429 PL_in_clean_objs = FALSE; \
2430 PL_in_clean_all = FALSE; \
2431 PL_profiledata = NULL; \
2432 PL_rsfp = Nullfp; \
2433 PL_rsfp_filters = Nullav; \
24d3c518 2434 PL_dirty = FALSE; \
cb68f92d 2435 } STMT_END
9666903d 2436 I_REINIT;
066ef5b5
GS
2437#else
2438# ifdef MULTIPLICITY
2439# define PERLVAR(var,type)
51371543 2440# define PERLVARA(var,n,type)
cea2e8a9 2441# if defined(PERL_IMPLICIT_CONTEXT)
54aff467
GS
2442# if defined(USE_THREADS)
2443# define PERLVARI(var,type,init) PERL_GET_INTERP->var = init;
2444# define PERLVARIC(var,type,init) PERL_GET_INTERP->var = init;
2445# else /* !USE_THREADS */
2446# define PERLVARI(var,type,init) aTHX->var = init;
2447# define PERLVARIC(var,type,init) aTHX->var = init;
2448# endif /* USE_THREADS */
cea2e8a9 2449# else
c5be433b
GS
2450# define PERLVARI(var,type,init) PERL_GET_INTERP->var = init;
2451# define PERLVARIC(var,type,init) PERL_GET_INTERP->var = init;
cea2e8a9 2452# endif
066ef5b5
GS
2453# include "intrpvar.h"
2454# ifndef USE_THREADS
2455# include "thrdvar.h"
2456# endif
2457# undef PERLVAR
51371543 2458# undef PERLVARA
066ef5b5
GS
2459# undef PERLVARI
2460# undef PERLVARIC
3967c732 2461# else
066ef5b5 2462# define PERLVAR(var,type)
51371543 2463# define PERLVARA(var,n,type)
533c011a
NIS
2464# define PERLVARI(var,type,init) PL_##var = init;
2465# define PERLVARIC(var,type,init) PL_##var = init;
066ef5b5
GS
2466# include "intrpvar.h"
2467# ifndef USE_THREADS
2468# include "thrdvar.h"
2469# endif
2470# undef PERLVAR
51371543 2471# undef PERLVARA
066ef5b5
GS
2472# undef PERLVARI
2473# undef PERLVARIC
2474# endif
cb68f92d
GS
2475#endif
2476
cb68f92d
GS
2477}
2478
76e3520e 2479STATIC void
cea2e8a9 2480S_init_main_stash(pTHX)
79072805 2481{
11343788 2482 dTHR;
463ee0b2 2483 GV *gv;
6e72f9df 2484
2485 /* Note that strtab is a rather special HV. Assumptions are made
2486 about not iterating on it, and not adding tie magic to it.
2487 It is properly deallocated in perl_destruct() */
3280af22 2488 PL_strtab = newHV();
5f08fbcd
GS
2489#ifdef USE_THREADS
2490 MUTEX_INIT(&PL_strtab_mutex);
2491#endif
3280af22
NIS
2492 HvSHAREKEYS_off(PL_strtab); /* mandatory */
2493 hv_ksplit(PL_strtab, 512);
6e72f9df 2494
3280af22 2495 PL_curstash = PL_defstash = newHV();
79cb57f6 2496 PL_curstname = newSVpvn("main",4);
adbc6bb1
LW
2497 gv = gv_fetchpv("main::",TRUE, SVt_PVHV);
2498 SvREFCNT_dec(GvHV(gv));
3280af22 2499 GvHV(gv) = (HV*)SvREFCNT_inc(PL_defstash);
463ee0b2 2500 SvREADONLY_on(gv);
3280af22
NIS
2501 HvNAME(PL_defstash) = savepv("main");
2502 PL_incgv = gv_HVadd(gv_AVadd(gv_fetchpv("INC",TRUE, SVt_PVAV)));
2503 GvMULTI_on(PL_incgv);
2504 PL_hintgv = gv_fetchpv("\010",TRUE, SVt_PV); /* ^H */
2505 GvMULTI_on(PL_hintgv);
2506 PL_defgv = gv_fetchpv("_",TRUE, SVt_PVAV);
2507 PL_errgv = gv_HVadd(gv_fetchpv("@", TRUE, SVt_PV));
2508 GvMULTI_on(PL_errgv);
2509 PL_replgv = gv_fetchpv("\022", TRUE, SVt_PV); /* ^R */
2510 GvMULTI_on(PL_replgv);
cea2e8a9 2511 (void)Perl_form(aTHX_ "%240s",""); /* Preallocate temp - for immediate signals. */
38a03e6e
MB
2512 sv_grow(ERRSV, 240); /* Preallocate - for immediate signals. */
2513 sv_setpvn(ERRSV, "", 0);
3280af22 2514 PL_curstash = PL_defstash;
11faa288 2515 CopSTASH_set(&PL_compiling, PL_defstash);
ed094faf 2516 PL_debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
3280af22 2517 PL_globalstash = GvHV(gv_fetchpv("CORE::GLOBAL::", GV_ADDMULTI, SVt_PVHV));
92d29cee 2518 PL_nullstash = GvHV(gv_fetchpv("<none>::", GV_ADDMULTI, SVt_PVHV));
4633a7c4 2519 /* We must init $/ before switches are processed. */
864dbfa3 2520 sv_setpvn(get_sv("/", TRUE), "\n", 1);
79072805
LW
2521}
2522
76e3520e 2523STATIC void
cea2e8a9 2524S_open_script(pTHX_ char *scriptname, bool dosearch, SV *sv, int *fdscript)
79072805 2525{
0f15f207 2526 dTHR;
2a92aaa0 2527
6c4ab083 2528 *fdscript = -1;
79072805 2529
3280af22
NIS
2530 if (PL_e_script) {
2531 PL_origfilename = savepv("-e");
96436eeb 2532 }
6c4ab083
GS
2533 else {
2534 /* if find_script() returns, it returns a malloc()-ed value */
3280af22 2535 PL_origfilename = scriptname = find_script(scriptname, dosearch, NULL, 1);
6c4ab083
GS
2536
2537 if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
2538 char *s = scriptname + 8;
2539 *fdscript = atoi(s);
2540 while (isDIGIT(*s))
2541 s++;
2542 if (*s) {
2543 scriptname = savepv(s + 1);
3280af22
NIS
2544 Safefree(PL_origfilename);
2545 PL_origfilename = scriptname;
6c4ab083
GS
2546 }
2547 }
2548 }
2549
f4dd75d9
GS
2550#ifdef USE_ITHREADS
2551 Safefree(CopFILE(PL_curcop));
2552#else
2553 SvREFCNT_dec(CopFILEGV(PL_curcop));
2554#endif
57843af0 2555 CopFILE_set(PL_curcop, PL_origfilename);
3280af22 2556 if (strEQ(PL_origfilename,"-"))
79072805 2557 scriptname = "";
01f988be 2558 if (*fdscript >= 0) {
3280af22 2559 PL_rsfp = PerlIO_fdopen(*fdscript,PERL_SCRIPT_MODE);
96436eeb 2560#if defined(HAS_FCNTL) && defined(F_SETFD)
3280af22
NIS
2561 if (PL_rsfp)
2562 fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,1); /* ensure close-on-exec */
96436eeb 2563#endif
2564 }
3280af22 2565 else if (PL_preprocess) {
46fc3d4c 2566 char *cpp_cfg = CPPSTDIN;
79cb57f6 2567 SV *cpp = newSVpvn("",0);
46fc3d4c 2568 SV *cmd = NEWSV(0,0);
2569
2570 if (strEQ(cpp_cfg, "cppstdin"))
cea2e8a9 2571 Perl_sv_catpvf(aTHX_ cpp, "%s/", BIN_EXP);
46fc3d4c 2572 sv_catpv(cpp, cpp_cfg);
79072805 2573
0df16ed7 2574 sv_catpvn(sv, "-I", 2);
fed7345c 2575 sv_catpv(sv,PRIVLIB_EXP);
46fc3d4c 2576
52853b95 2577#if defined(MSDOS) || defined(WIN32)
cea2e8a9 2578 Perl_sv_setpvf(aTHX_ cmd, "\
79072805
LW
2579sed %s -e \"/^[^#]/b\" \
2580 -e \"/^#[ ]*include[ ]/b\" \
2581 -e \"/^#[ ]*define[ ]/b\" \
2582 -e \"/^#[ ]*if[ ]/b\" \
2583 -e \"/^#[ ]*ifdef[ ]/b\" \
2584 -e \"/^#[ ]*ifndef[ ]/b\" \
2585 -e \"/^#[ ]*else/b\" \
2586 -e \"/^#[ ]*elif[ ]/b\" \
2587 -e \"/^#[ ]*undef[ ]/b\" \
2588 -e \"/^#[ ]*endif/b\" \
2589 -e \"s/^#.*//\" \
894356b3 2590 %s | %"SVf" -C %"SVf" %s",
6b88bc9c 2591 (PL_doextract ? "-e \"1,/^#/d\n\"" : ""),
79072805 2592#else
092bebab 2593# ifdef __OPEN_VM
cea2e8a9 2594 Perl_sv_setpvf(aTHX_ cmd, "\
092bebab
JH
2595%s %s -e '/^[^#]/b' \
2596 -e '/^#[ ]*include[ ]/b' \
2597 -e '/^#[ ]*define[ ]/b' \
2598 -e '/^#[ ]*if[ ]/b' \
2599 -e '/^#[ ]*ifdef[ ]/b' \
2600 -e '/^#[ ]*ifndef[ ]/b' \
2601 -e '/^#[ ]*else/b' \
2602 -e '/^#[ ]*elif[ ]/b' \
2603 -e '/^#[ ]*undef[ ]/b' \
2604 -e '/^#[ ]*endif/b' \
2605 -e 's/^[ ]*#.*//' \
894356b3 2606 %s | %"SVf" %"SVf" %s",
092bebab 2607# else
cea2e8a9 2608 Perl_sv_setpvf(aTHX_ cmd, "\
79072805
LW
2609%s %s -e '/^[^#]/b' \
2610 -e '/^#[ ]*include[ ]/b' \
2611 -e '/^#[ ]*define[ ]/b' \
2612 -e '/^#[ ]*if[ ]/b' \
2613 -e '/^#[ ]*ifdef[ ]/b' \
2614 -e '/^#[ ]*ifndef[ ]/b' \
2615 -e '/^#[ ]*else/b' \
2616 -e '/^#[ ]*elif[ ]/b' \
2617 -e '/^#[ ]*undef[ ]/b' \
2618 -e '/^#[ ]*endif/b' \
2619 -e 's/^[ ]*#.*//' \
894356b3 2620 %s | %"SVf" -C %"SVf" %s",
092bebab 2621# endif
79072805
LW
2622#ifdef LOC_SED
2623 LOC_SED,
2624#else
2625 "sed",
2626#endif
3280af22 2627 (PL_doextract ? "-e '1,/^#/d\n'" : ""),
79072805 2628#endif
46fc3d4c 2629 scriptname, cpp, sv, CPPMINUS);
3280af22 2630 PL_doextract = FALSE;
79072805 2631#ifdef IAMSUID /* actually, this is caught earlier */
b28d0864 2632 if (PL_euid != PL_uid && !PL_euid) { /* if running suidperl */
79072805 2633#ifdef HAS_SETEUID
b28d0864 2634 (void)seteuid(PL_uid); /* musn't stay setuid root */
79072805
LW
2635#else
2636#ifdef HAS_SETREUID
b28d0864 2637 (void)setreuid((Uid_t)-1, PL_uid);
85e6fe83
LW
2638#else
2639#ifdef HAS_SETRESUID
b28d0864 2640 (void)setresuid((Uid_t)-1, PL_uid, (Uid_t)-1);
79072805 2641#else
b28d0864 2642 PerlProc_setuid(PL_uid);
79072805
LW
2643#endif
2644#endif
85e6fe83 2645#endif
b28d0864 2646 if (PerlProc_geteuid() != PL_uid)
cea2e8a9 2647 Perl_croak(aTHX_ "Can't do seteuid!\n");
79072805
LW
2648 }
2649#endif /* IAMSUID */
3280af22 2650 PL_rsfp = PerlProc_popen(SvPVX(cmd), "r");
46fc3d4c 2651 SvREFCNT_dec(cmd);
2652 SvREFCNT_dec(cpp);
79072805
LW
2653 }
2654 else if (!*scriptname) {
bbce6d69 2655 forbid_setid("program input from stdin");
3280af22 2656 PL_rsfp = PerlIO_stdin();
79072805 2657 }
96436eeb 2658 else {
3280af22 2659 PL_rsfp = PerlIO_open(scriptname,PERL_SCRIPT_MODE);
96436eeb 2660#if defined(HAS_FCNTL) && defined(F_SETFD)
3280af22
NIS
2661 if (PL_rsfp)
2662 fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,1); /* ensure close-on-exec */
96436eeb 2663#endif
2664 }
3280af22 2665 if (!PL_rsfp) {
13281fa4 2666#ifdef DOSUID
a687059c 2667#ifndef IAMSUID /* in case script is not readable before setuid */
6b88bc9c 2668 if (PL_euid &&
cc49e20b 2669 PerlLIO_stat(CopFILE(PL_curcop),&PL_statbuf) >= 0 &&
6b88bc9c
GS
2670 PL_statbuf.st_mode & (S_ISUID|S_ISGID))
2671 {
46fc3d4c 2672 /* try again */
a7cb1f99 2673 PerlProc_execv(Perl_form(aTHX_ "%s/sperl"PERL_FS_VER_FMT, BIN_EXP,
273cf8d1
GS
2674 (int)PERL_REVISION, (int)PERL_VERSION,
2675 (int)PERL_SUBVERSION), PL_origargv);
cea2e8a9 2676 Perl_croak(aTHX_ "Can't do setuid\n");
13281fa4
LW
2677 }
2678#endif
2679#endif
cea2e8a9 2680 Perl_croak(aTHX_ "Can't open perl script \"%s\": %s\n",
cc49e20b 2681 CopFILE(PL_curcop), Strerror(errno));
13281fa4 2682 }
79072805 2683}
8d063cd8 2684
7b89560d
JH
2685/* Mention
2686 * I_SYSSTATVFS HAS_FSTATVFS
2687 * I_SYSMOUNT
c890dc6c 2688 * I_STATFS HAS_FSTATFS HAS_GETFSSTAT
7b89560d
JH
2689 * I_MNTENT HAS_GETMNTENT HAS_HASMNTOPT
2690 * here so that metaconfig picks them up. */
2691
104d25b7 2692#ifdef IAMSUID
864dbfa3 2693STATIC int
e688b231 2694S_fd_on_nosuid_fs(pTHX_ int fd)
104d25b7 2695{
0545a864
JH
2696 int check_okay = 0; /* able to do all the required sys/libcalls */
2697 int on_nosuid = 0; /* the fd is on a nosuid fs */
104d25b7 2698/*
ad27e871 2699 * Preferred order: fstatvfs(), fstatfs(), ustat()+getmnt(), getmntent().
e688b231 2700 * fstatvfs() is UNIX98.
0545a864 2701 * fstatfs() is 4.3 BSD.
ad27e871 2702 * ustat()+getmnt() is pre-4.3 BSD.
0545a864
JH
2703 * getmntent() is O(number-of-mounted-filesystems) and can hang on
2704 * an irrelevant filesystem while trying to reach the right one.
104d25b7
JH
2705 */
2706
6439433f
JH
2707#undef FD_ON_NOSUID_CHECK_OKAY /* found the syscalls to do the check? */
2708
2709# if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
2710 defined(HAS_FSTATVFS)
2711# define FD_ON_NOSUID_CHECK_OKAY
104d25b7 2712 struct statvfs stfs;
6439433f 2713
104d25b7
JH
2714 check_okay = fstatvfs(fd, &stfs) == 0;
2715 on_nosuid = check_okay && (stfs.f_flag & ST_NOSUID);
6439433f
JH
2716# endif /* fstatvfs */
2717
2718# if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
2719 defined(PERL_MOUNT_NOSUID) && \
2720 defined(HAS_FSTATFS) && \
2721 defined(HAS_STRUCT_STATFS) && \
2722 defined(HAS_STRUCT_STATFS_F_FLAGS)
2723# define FD_ON_NOSUID_CHECK_OKAY
e688b231 2724 struct statfs stfs;
6439433f 2725
104d25b7 2726 check_okay = fstatfs(fd, &stfs) == 0;
104d25b7 2727 on_nosuid = check_okay && (stfs.f_flags & PERL_MOUNT_NOSUID);
6439433f
JH
2728# endif /* fstatfs */
2729
2730# if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
2731 defined(PERL_MOUNT_NOSUID) && \
2732 defined(HAS_FSTAT) && \
2733 defined(HAS_USTAT) && \
2734 defined(HAS_GETMNT) && \
2735 defined(HAS_STRUCT_FS_DATA) && \
2736 defined(NOSTAT_ONE)
2737# define FD_ON_NOSUID_CHECK_OKAY
0545a864 2738 struct stat fdst;
6439433f 2739
0545a864 2740 if (fstat(fd, &fdst) == 0) {
6439433f
JH
2741 struct ustat us;
2742 if (ustat(fdst.st_dev, &us) == 0) {
2743 struct fs_data fsd;
2744 /* NOSTAT_ONE here because we're not examining fields which
2745 * vary between that case and STAT_ONE. */
ad27e871 2746 if (getmnt((int*)0, &fsd, (int)0, NOSTAT_ONE, us.f_fname) == 0) {
6439433f
JH
2747 size_t cmplen = sizeof(us.f_fname);
2748 if (sizeof(fsd.fd_req.path) < cmplen)
2749 cmplen = sizeof(fsd.fd_req.path);
2750 if (strnEQ(fsd.fd_req.path, us.f_fname, cmplen) &&
2751 fdst.st_dev == fsd.fd_req.dev) {
2752 check_okay = 1;
2753 on_nosuid = fsd.fd_req.flags & PERL_MOUNT_NOSUID;
2754 }
2755 }
2756 }
2757 }
0545a864 2758 }
6439433f
JH
2759# endif /* fstat+ustat+getmnt */
2760
2761# if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
2762 defined(HAS_GETMNTENT) && \
2763 defined(HAS_HASMNTOPT) && \
2764 defined(MNTOPT_NOSUID)
2765# define FD_ON_NOSUID_CHECK_OKAY
2766 FILE *mtab = fopen("/etc/mtab", "r");
2767 struct mntent *entry;
2768 struct stat stb, fsb;
104d25b7
JH
2769
2770 if (mtab && (fstat(fd, &stb) == 0)) {
6439433f
JH
2771 while (entry = getmntent(mtab)) {
2772 if (stat(entry->mnt_dir, &fsb) == 0
2773 && fsb.st_dev == stb.st_dev)
2774 {
2775 /* found the filesystem */
2776 check_okay = 1;
2777 if (hasmntopt(entry, MNTOPT_NOSUID))
2778 on_nosuid = 1;
2779 break;
2780 } /* A single fs may well fail its stat(). */
2781 }
104d25b7
JH
2782 }
2783 if (mtab)
6439433f
JH
2784 fclose(mtab);
2785# endif /* getmntent+hasmntopt */
0545a864 2786
104d25b7 2787 if (!check_okay)
0545a864 2788 Perl_croak(aTHX_ "Can't check filesystem of script \"%s\" for nosuid", PL_origfilename);
104d25b7
JH
2789 return on_nosuid;
2790}
2791#endif /* IAMSUID */
2792
76e3520e 2793STATIC void
cea2e8a9 2794S_validate_suid(pTHX_ char *validarg, char *scriptname, int fdscript)
79072805 2795{
155aba94 2796#ifdef IAMSUID
96436eeb 2797 int which;
155aba94 2798#endif
96436eeb 2799
13281fa4
LW
2800 /* do we need to emulate setuid on scripts? */
2801
2802 /* This code is for those BSD systems that have setuid #! scripts disabled
2803 * in the kernel because of a security problem. Merely defining DOSUID
2804 * in perl will not fix that problem, but if you have disabled setuid
2805 * scripts in the kernel, this will attempt to emulate setuid and setgid
2806 * on scripts that have those now-otherwise-useless bits set. The setuid
27e2fb84
LW
2807 * root version must be called suidperl or sperlN.NNN. If regular perl
2808 * discovers that it has opened a setuid script, it calls suidperl with
2809 * the same argv that it had. If suidperl finds that the script it has
2810 * just opened is NOT setuid root, it sets the effective uid back to the
2811 * uid. We don't just make perl setuid root because that loses the
2812 * effective uid we had before invoking perl, if it was different from the
2813 * uid.
13281fa4
LW
2814 *
2815 * DOSUID must be defined in both perl and suidperl, and IAMSUID must
2816 * be defined in suidperl only. suidperl must be setuid root. The
2817 * Configure script will set this up for you if you want it.
2818 */
a687059c 2819
13281fa4 2820#ifdef DOSUID
ea0efc06 2821 dTHR;
6e72f9df 2822 char *s, *s2;
a0d0e21e 2823
b28d0864 2824 if (PerlLIO_fstat(PerlIO_fileno(PL_rsfp),&PL_statbuf) < 0) /* normal stat is insecure */
cea2e8a9 2825 Perl_croak(aTHX_ "Can't stat script \"%s\"",PL_origfilename);
b28d0864 2826 if (fdscript < 0 && PL_statbuf.st_mode & (S_ISUID|S_ISGID)) {
79072805 2827 I32 len;
2d8e6c8d 2828 STRLEN n_a;
13281fa4 2829
a687059c 2830#ifdef IAMSUID
fe14fcc3 2831#ifndef HAS_SETREUID
a687059c
LW
2832 /* On this access check to make sure the directories are readable,
2833 * there is actually a small window that the user could use to make
2834 * filename point to an accessible directory. So there is a faint
2835 * chance that someone could execute a setuid script down in a
2836 * non-accessible directory. I don't know what to do about that.
2837 * But I don't think it's too important. The manual lies when
2838 * it says access() is useful in setuid programs.
2839 */
cc49e20b 2840 if (PerlLIO_access(CopFILE(PL_curcop),1)) /*double check*/
cea2e8a9 2841 Perl_croak(aTHX_ "Permission denied");
a687059c
LW
2842#else
2843 /* If we can swap euid and uid, then we can determine access rights
2844 * with a simple stat of the file, and then compare device and
2845 * inode to make sure we did stat() on the same file we opened.
2846 * Then we just have to make sure he or she can execute it.
2847 */
2848 {
2849 struct stat tmpstatbuf;
2850
85e6fe83
LW
2851 if (
2852#ifdef HAS_SETREUID
b28d0864 2853 setreuid(PL_euid,PL_uid) < 0
a0d0e21e
LW
2854#else
2855# if HAS_SETRESUID
b28d0864 2856 setresuid(PL_euid,PL_uid,(Uid_t)-1) < 0
a0d0e21e 2857# endif
85e6fe83 2858#endif
b28d0864 2859 || PerlProc_getuid() != PL_euid || PerlProc_geteuid() != PL_uid)
cea2e8a9 2860 Perl_croak(aTHX_ "Can't swap uid and euid"); /* really paranoid */
cc49e20b 2861 if (PerlLIO_stat(CopFILE(PL_curcop),&tmpstatbuf) < 0)
cea2e8a9 2862 Perl_croak(aTHX_ "Permission denied"); /* testing full pathname here */
2bb3463c 2863#if defined(IAMSUID) && !defined(NO_NOSUID_CHECK)
e688b231 2864 if (fd_on_nosuid_fs(PerlIO_fileno(PL_rsfp)))
cea2e8a9 2865 Perl_croak(aTHX_ "Permission denied");
104d25b7 2866#endif
b28d0864
NIS
2867 if (tmpstatbuf.st_dev != PL_statbuf.st_dev ||
2868 tmpstatbuf.st_ino != PL_statbuf.st_ino) {
2869 (void)PerlIO_close(PL_rsfp);
cea2e8a9 2870 Perl_croak(aTHX_ "Permission denied\n");
a687059c 2871 }
85e6fe83
LW
2872 if (
2873#ifdef HAS_SETREUID
b28d0864 2874 setreuid(PL_uid,PL_euid) < 0
a0d0e21e
LW
2875#else
2876# if defined(HAS_SETRESUID)
b28d0864 2877 setresuid(PL_uid,PL_euid,(Uid_t)-1) < 0
a0d0e21e 2878# endif
85e6fe83 2879#endif
b28d0864 2880 || PerlProc_getuid() != PL_uid || PerlProc_geteuid() != PL_euid)
cea2e8a9 2881 Perl_croak(aTHX_ "Can't reswap uid and euid");
b28d0864 2882 if (!cando(S_IXUSR,FALSE,&PL_statbuf)) /* can real uid exec? */
cea2e8a9 2883 Perl_croak(aTHX_ "Permission denied\n");
a687059c 2884 }
fe14fcc3 2885#endif /* HAS_SETREUID */
a687059c
LW
2886#endif /* IAMSUID */
2887
b28d0864 2888 if (!S_ISREG(PL_statbuf.st_mode))
cea2e8a9 2889 Perl_croak(aTHX_ "Permission denied");
b28d0864 2890 if (PL_statbuf.st_mode & S_IWOTH)
cea2e8a9 2891 Perl_croak(aTHX_ "Setuid/gid script is writable by world");
6b88bc9c 2892 PL_doswitches = FALSE; /* -s is insecure in suid */
57843af0 2893 CopLINE_inc(PL_curcop);
6b88bc9c 2894 if (sv_gets(PL_linestr, PL_rsfp, 0) == Nullch ||
2d8e6c8d 2895 strnNE(SvPV(PL_linestr,n_a),"#!",2) ) /* required even on Sys V */
cea2e8a9 2896 Perl_croak(aTHX_ "No #! line");
2d8e6c8d 2897 s = SvPV(PL_linestr,n_a)+2;
663a0e37 2898 if (*s == ' ') s++;
45d8adaa 2899 while (!isSPACE(*s)) s++;
2d8e6c8d 2900 for (s2 = s; (s2 > SvPV(PL_linestr,n_a)+2 &&
6e72f9df 2901 (isDIGIT(s2[-1]) || strchr("._-", s2[-1]))); s2--) ;
2902 if (strnNE(s2-4,"perl",4) && strnNE(s-9,"perl",4)) /* sanity check */
cea2e8a9 2903 Perl_croak(aTHX_ "Not a perl script");
a687059c 2904 while (*s == ' ' || *s == '\t') s++;
13281fa4
LW
2905 /*
2906 * #! arg must be what we saw above. They can invoke it by
2907 * mentioning suidperl explicitly, but they may not add any strange
2908 * arguments beyond what #! says if they do invoke suidperl that way.
2909 */
2910 len = strlen(validarg);
2911 if (strEQ(validarg," PHOOEY ") ||
45d8adaa 2912 strnNE(s,validarg,len) || !isSPACE(s[len]))
cea2e8a9 2913 Perl_croak(aTHX_ "Args must match #! line");
a687059c
LW
2914
2915#ifndef IAMSUID
b28d0864
NIS
2916 if (PL_euid != PL_uid && (PL_statbuf.st_mode & S_ISUID) &&
2917 PL_euid == PL_statbuf.st_uid)
2918 if (!PL_do_undump)
cea2e8a9 2919 Perl_croak(aTHX_ "YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
a687059c
LW
2920FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2921#endif /* IAMSUID */
13281fa4 2922
b28d0864
NIS
2923 if (PL_euid) { /* oops, we're not the setuid root perl */
2924 (void)PerlIO_close(PL_rsfp);
13281fa4 2925#ifndef IAMSUID
46fc3d4c 2926 /* try again */
a7cb1f99 2927 PerlProc_execv(Perl_form(aTHX_ "%s/sperl"PERL_FS_VER_FMT, BIN_EXP,
273cf8d1
GS
2928 (int)PERL_REVISION, (int)PERL_VERSION,
2929 (int)PERL_SUBVERSION), PL_origargv);
13281fa4 2930#endif
cea2e8a9 2931 Perl_croak(aTHX_ "Can't do setuid\n");
13281fa4
LW
2932 }
2933
b28d0864 2934 if (PL_statbuf.st_mode & S_ISGID && PL_statbuf.st_gid != PL_egid) {
fe14fcc3 2935#ifdef HAS_SETEGID
b28d0864 2936 (void)setegid(PL_statbuf.st_gid);
a687059c 2937#else
fe14fcc3 2938#ifdef HAS_SETREGID
b28d0864 2939 (void)setregid((Gid_t)-1,PL_statbuf.st_gid);
85e6fe83
LW
2940#else
2941#ifdef HAS_SETRESGID
b28d0864 2942 (void)setresgid((Gid_t)-1,PL_statbuf.st_gid,(Gid_t)-1);
a687059c 2943#else
b28d0864 2944 PerlProc_setgid(PL_statbuf.st_gid);
a687059c
LW
2945#endif
2946#endif
85e6fe83 2947#endif
b28d0864 2948 if (PerlProc_getegid() != PL_statbuf.st_gid)
cea2e8a9 2949 Perl_croak(aTHX_ "Can't do setegid!\n");
83025b21 2950 }
b28d0864
NIS
2951 if (PL_statbuf.st_mode & S_ISUID) {
2952 if (PL_statbuf.st_uid != PL_euid)
fe14fcc3 2953#ifdef HAS_SETEUID
b28d0864 2954 (void)seteuid(PL_statbuf.st_uid); /* all that for this */
a687059c 2955#else
fe14fcc3 2956#ifdef HAS_SETREUID
b28d0864 2957 (void)setreuid((Uid_t)-1,PL_statbuf.st_uid);
85e6fe83
LW
2958#else
2959#ifdef HAS_SETRESUID
b28d0864 2960 (void)setresuid((Uid_t)-1,PL_statbuf.st_uid,(Uid_t)-1);
a687059c 2961#else
b28d0864 2962 PerlProc_setuid(PL_statbuf.st_uid);
a687059c
LW
2963#endif
2964#endif
85e6fe83 2965#endif
b28d0864 2966 if (PerlProc_geteuid() != PL_statbuf.st_uid)
cea2e8a9 2967 Perl_croak(aTHX_ "Can't do seteuid!\n");
a687059c 2968 }
b28d0864 2969 else if (PL_uid) { /* oops, mustn't run as root */
fe14fcc3 2970#ifdef HAS_SETEUID
b28d0864 2971 (void)seteuid((Uid_t)PL_uid);
a687059c 2972#else
fe14fcc3 2973#ifdef HAS_SETREUID
b28d0864 2974 (void)setreuid((Uid_t)-1,(Uid_t)PL_uid);
a687059c 2975#else
85e6fe83 2976#ifdef HAS_SETRESUID
b28d0864 2977 (void)setresuid((Uid_t)-1,(Uid_t)PL_uid,(Uid_t)-1);
85e6fe83 2978#else
b28d0864 2979 PerlProc_setuid((Uid_t)PL_uid);
85e6fe83 2980#endif
a687059c
LW
2981#endif
2982#endif
b28d0864 2983 if (PerlProc_geteuid() != PL_uid)
cea2e8a9 2984 Perl_croak(aTHX_ "Can't do seteuid!\n");
83025b21 2985 }
748a9306 2986 init_ids();
b28d0864 2987 if (!cando(S_IXUSR,TRUE,&PL_statbuf))
cea2e8a9 2988 Perl_croak(aTHX_ "Permission denied\n"); /* they can't do this */
13281fa4
LW
2989 }
2990#ifdef IAMSUID
6b88bc9c 2991 else if (PL_preprocess)
cea2e8a9 2992 Perl_croak(aTHX_ "-P not allowed for setuid/setgid script\n");
96436eeb 2993 else if (fdscript >= 0)
cea2e8a9 2994 Perl_croak(aTHX_ "fd script not allowed in suidperl\n");
13281fa4 2995 else
cea2e8a9 2996 Perl_croak(aTHX_ "Script is not setuid/setgid in suidperl\n");
96436eeb 2997
2998 /* We absolutely must clear out any saved ids here, so we */
2999 /* exec the real perl, substituting fd script for scriptname. */
3000 /* (We pass script name as "subdir" of fd, which perl will grok.) */
b28d0864
NIS
3001 PerlIO_rewind(PL_rsfp);
3002 PerlLIO_lseek(PerlIO_fileno(PL_rsfp),(Off_t)0,0); /* just in case rewind didn't */
6b88bc9c
GS
3003 for (which = 1; PL_origargv[which] && PL_origargv[which] != scriptname; which++) ;
3004 if (!PL_origargv[which])
cea2e8a9
GS
3005 Perl_croak(aTHX_ "Permission denied");
3006 PL_origargv[which] = savepv(Perl_form(aTHX_ "/dev/fd/%d/%s",
6b88bc9c 3007 PerlIO_fileno(PL_rsfp), PL_origargv[which]));
96436eeb 3008#if defined(HAS_FCNTL) && defined(F_SETFD)
b28d0864 3009 fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,0); /* ensure no close-on-exec */
96436eeb 3010#endif
a7cb1f99 3011 PerlProc_execv(Perl_form(aTHX_ "%s/perl"PERL_FS_VER_FMT, BIN_EXP,
273cf8d1
GS
3012 (int)PERL_REVISION, (int)PERL_VERSION,
3013 (int)PERL_SUBVERSION), PL_origargv);/* try again */
cea2e8a9 3014 Perl_croak(aTHX_ "Can't do setuid\n");
13281fa4 3015#endif /* IAMSUID */
a687059c 3016#else /* !DOSUID */
3280af22 3017 if (PL_euid != PL_uid || PL_egid != PL_gid) { /* (suidperl doesn't exist, in fact) */
a687059c 3018#ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
96827780 3019 dTHR;
b28d0864
NIS
3020 PerlLIO_fstat(PerlIO_fileno(PL_rsfp),&PL_statbuf); /* may be either wrapped or real suid */
3021 if ((PL_euid != PL_uid && PL_euid == PL_statbuf.st_uid && PL_statbuf.st_mode & S_ISUID)
a687059c 3022 ||
b28d0864 3023 (PL_egid != PL_gid && PL_egid == PL_statbuf.st_gid && PL_statbuf.st_mode & S_ISGID)
a687059c 3024 )
b28d0864 3025 if (!PL_do_undump)
cea2e8a9 3026 Perl_croak(aTHX_ "YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
a687059c
LW
3027FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
3028#endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
3029 /* not set-id, must be wrapped */
a687059c 3030 }
13281fa4 3031#endif /* DOSUID */
79072805 3032}
13281fa4 3033
76e3520e 3034STATIC void
cea2e8a9 3035S_find_beginning(pTHX)
79072805 3036{
6e72f9df 3037 register char *s, *s2;
33b78306
LW
3038
3039 /* skip forward in input to the real script? */
3040
bbce6d69 3041 forbid_setid("-x");
bf4acbe4
GS
3042#ifdef MACOS_TRADITIONAL
3043 /* Since the Mac OS does not honor !# arguments for us, we do it ourselves */
3044
3045 while (PL_doextract || gMacPerl_AlwaysExtract) {
3046 if ((s = sv_gets(PL_linestr, PL_rsfp, 0)) == Nullch) {
3047 if (!gMacPerl_AlwaysExtract)
3048 Perl_croak(aTHX_ "No Perl script found in input\n");
3049
3050 if (PL_doextract) /* require explicit override ? */
3051 if (!OverrideExtract(PL_origfilename))
3052 Perl_croak(aTHX_ "User aborted script\n");
3053 else
3054 PL_doextract = FALSE;
3055
3056 /* Pater peccavi, file does not have #! */
3057 PerlIO_rewind(PL_rsfp);
3058
3059 break;
3060 }
3061#else
3280af22
NIS
3062 while (PL_doextract) {
3063 if ((s = sv_gets(PL_linestr, PL_rsfp, 0)) == Nullch)
cea2e8a9 3064 Perl_croak(aTHX_ "No Perl script found in input\n");
bf4acbe4 3065#endif
6e72f9df 3066 if (*s == '#' && s[1] == '!' && (s = instr(s,"perl"))) {
3280af22
NIS
3067 PerlIO_ungetc(PL_rsfp, '\n'); /* to keep line count right */
3068 PL_doextract = FALSE;
6e72f9df 3069 while (*s && !(isSPACE (*s) || *s == '#')) s++;
3070 s2 = s;
3071 while (*s == ' ' || *s == '\t') s++;
3072 if (*s++ == '-') {
3073 while (isDIGIT(s2[-1]) || strchr("-._", s2[-1])) s2--;
3074 if (strnEQ(s2-4,"perl",4))
3075 /*SUPPRESS 530*/
155aba94
GS
3076 while ((s = moreswitches(s)))
3077 ;
33b78306 3078 }
83025b21
LW
3079 }
3080 }
3081}
3082
afe37c7d 3083
76e3520e 3084STATIC void
cea2e8a9 3085S_init_ids(pTHX)
352d5a3a 3086{
d8eceb89
JH
3087 PL_uid = PerlProc_getuid();
3088 PL_euid = PerlProc_geteuid();
3089 PL_gid = PerlProc_getgid();
3090 PL_egid = PerlProc_getegid();
748a9306 3091#ifdef VMS
b28d0864
NIS
3092 PL_uid |= PL_gid << 16;
3093 PL_euid |= PL_egid << 16;
748a9306 3094#endif
3280af22 3095 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
748a9306 3096}
79072805 3097
76e3520e 3098STATIC void
cea2e8a9 3099S_forbid_setid(pTHX_ char *s)
bbce6d69 3100{
3280af22 3101 if (PL_euid != PL_uid)
cea2e8a9 3102 Perl_croak(aTHX_ "No %s allowed while running setuid", s);
3280af22 3103 if (PL_egid != PL_gid)
cea2e8a9 3104 Perl_croak(aTHX_ "No %s allowed while running setgid", s);
bbce6d69 3105}
3106
1ee4443e
IZ
3107void
3108Perl_init_debugger(pTHX)
748a9306 3109{
11343788 3110 dTHR;
1ee4443e
IZ
3111 HV *ostash = PL_curstash;
3112
3280af22
NIS
3113 PL_curstash = PL_debstash;
3114 PL_dbargs = GvAV(gv_AVadd((gv_fetchpv("args", GV_ADDMULTI, SVt_PVAV))));
3115 AvREAL_off(PL_dbargs);
3116 PL_DBgv = gv_fetchpv("DB", GV_ADDMULTI, SVt_PVGV);
3117 PL_DBline = gv_fetchpv("dbline", GV_ADDMULTI, SVt_PVAV);
3118 PL_DBsub = gv_HVadd(gv_fetchpv("sub", GV_ADDMULTI, SVt_PVHV));
1ee4443e 3119 sv_upgrade(GvSV(PL_DBsub), SVt_IV); /* IVX accessed if PERLDB_SUB_NN */
3280af22
NIS
3120 PL_DBsingle = GvSV((gv_fetchpv("single", GV_ADDMULTI, SVt_PV)));
3121 sv_setiv(PL_DBsingle, 0);
3122 PL_DBtrace = GvSV((gv_fetchpv("trace", GV_ADDMULTI, SVt_PV)));
3123 sv_setiv(PL_DBtrace, 0);
3124 PL_DBsignal = GvSV((gv_fetchpv("signal", GV_ADDMULTI, SVt_PV)));
3125 sv_setiv(PL_DBsignal, 0);
1ee4443e 3126 PL_curstash = ostash;
352d5a3a
LW
3127}
3128
2ce36478
SM
3129#ifndef STRESS_REALLOC
3130#define REASONABLE(size) (size)
3131#else
3132#define REASONABLE(size) (1) /* unreasonable */
3133#endif
3134
11343788 3135void
cea2e8a9 3136Perl_init_stacks(pTHX)
79072805 3137{
e336de0d 3138 /* start with 128-item stack and 8K cxstack */
3280af22 3139 PL_curstackinfo = new_stackinfo(REASONABLE(128),
e336de0d 3140 REASONABLE(8192/sizeof(PERL_CONTEXT) - 1));
3280af22
NIS
3141 PL_curstackinfo->si_type = PERLSI_MAIN;
3142 PL_curstack = PL_curstackinfo->si_stack;
3143 PL_mainstack = PL_curstack; /* remember in case we switch stacks */
79072805 3144
3280af22
NIS
3145 PL_stack_base = AvARRAY(PL_curstack);
3146 PL_stack_sp = PL_stack_base;
3147 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
8990e307 3148
3280af22
NIS
3149 New(50,PL_tmps_stack,REASONABLE(128),SV*);
3150 PL_tmps_floor = -1;
3151 PL_tmps_ix = -1;
3152 PL_tmps_max = REASONABLE(128);
8990e307 3153
3280af22
NIS
3154 New(54,PL_markstack,REASONABLE(32),I32);
3155 PL_markstack_ptr = PL_markstack;
3156 PL_markstack_max = PL_markstack + REASONABLE(32);
79072805 3157
ce2f7c3b 3158 SET_MARK_OFFSET;
e336de0d 3159
3280af22
NIS
3160 New(54,PL_scopestack,REASONABLE(32),I32);
3161 PL_scopestack_ix = 0;
3162 PL_scopestack_max = REASONABLE(32);
79072805 3163
3280af22
NIS
3164 New(54,PL_savestack,REASONABLE(128),ANY);
3165 PL_savestack_ix = 0;
3166 PL_savestack_max = REASONABLE(128);
79072805 3167
3280af22
NIS
3168 New(54,PL_retstack,REASONABLE(16),OP*);
3169 PL_retstack_ix = 0;
3170 PL_retstack_max = REASONABLE(16);
378cc40b 3171}
33b78306 3172
2ce36478
SM
3173#undef REASONABLE
3174
76e3520e 3175STATIC void
cea2e8a9 3176S_nuke_stacks(pTHX)
6e72f9df 3177{
e858de61 3178 dTHR;
3280af22
NIS
3179 while (PL_curstackinfo->si_next)
3180 PL_curstackinfo = PL_curstackinfo->si_next;
3181 while (PL_curstackinfo) {
3182 PERL_SI *p = PL_curstackinfo->si_prev;
bac4b2ad 3183 /* curstackinfo->si_stack got nuked by sv_free_arenas() */
3280af22
NIS
3184 Safefree(PL_curstackinfo->si_cxstack);
3185 Safefree(PL_curstackinfo);
3186 PL_curstackinfo = p;
e336de0d 3187 }
3280af22
NIS
3188 Safefree(PL_tmps_stack);
3189 Safefree(PL_markstack);
3190 Safefree(PL_scopestack);
3191 Safefree(PL_savestack);
3192 Safefree(PL_retstack);
378cc40b 3193}
33b78306 3194
76e3520e 3195#ifndef PERL_OBJECT
760ac839 3196static PerlIO *tmpfp; /* moved outside init_lexer() because of UNICOS bug */
76e3520e 3197#endif
7aa04957 3198
76e3520e 3199STATIC void
cea2e8a9 3200S_init_lexer(pTHX)
8990e307 3201{
76e3520e
GS
3202#ifdef PERL_OBJECT
3203 PerlIO *tmpfp;
3204#endif
3280af22
NIS
3205 tmpfp = PL_rsfp;
3206 PL_rsfp = Nullfp;
3207 lex_start(PL_linestr);
3208 PL_rsfp = tmpfp;
79cb57f6 3209 PL_subname = newSVpvn("main",4);
8990e307
LW
3210}
3211
76e3520e 3212STATIC void
cea2e8a9 3213S_init_predump_symbols(pTHX)
45d8adaa 3214{
11343788 3215 dTHR;
93a17b20 3216 GV *tmpgv;
af8c498a 3217 IO *io;
79072805 3218
864dbfa3 3219 sv_setpvn(get_sv("\"", TRUE), " ", 1);
3280af22
NIS
3220 PL_stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
3221 GvMULTI_on(PL_stdingv);
af8c498a
GS
3222 io = GvIOp(PL_stdingv);
3223 IoIFP(io) = PerlIO_stdin();
adbc6bb1 3224 tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
a5f75d66 3225 GvMULTI_on(tmpgv);
af8c498a 3226 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
79072805 3227
85e6fe83 3228 tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
a5f75d66 3229 GvMULTI_on(tmpgv);
af8c498a
GS
3230 io = GvIOp(tmpgv);
3231 IoOFP(io) = IoIFP(io) = PerlIO_stdout();
4633a7c4 3232 setdefout(tmpgv);
adbc6bb1 3233 tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
a5f75d66 3234 GvMULTI_on(tmpgv);
af8c498a 3235 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
79072805 3236
bf49b057
GS
3237 PL_stderrgv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
3238 GvMULTI_on(PL_stderrgv);
3239 io = GvIOp(PL_stderrgv);
af8c498a 3240 IoOFP(io) = IoIFP(io) = PerlIO_stderr();
adbc6bb1 3241 tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
a5f75d66 3242 GvMULTI_on(tmpgv);
af8c498a 3243 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
79072805 3244
3280af22 3245 PL_statname = NEWSV(66,0); /* last filename we did stat on */
ab821d7f 3246
bf4acbe4
GS
3247 if (PL_osname)
3248 Safefree(PL_osname);
3249 PL_osname = savepv(OSNAME);
79072805 3250}
33b78306 3251
76e3520e 3252STATIC void
cea2e8a9 3253S_init_postdump_symbols(pTHX_ register int argc, register char **argv, register char **env)
33b78306 3254{
a863c7d1 3255 dTHR;
79072805
LW
3256 char *s;
3257 SV *sv;
3258 GV* tmpgv;
fe14fcc3 3259
79072805 3260 argc--,argv++; /* skip name of script */
3280af22 3261 if (PL_doswitches) {
79072805
LW
3262 for (; argc > 0 && **argv == '-'; argc--,argv++) {
3263 if (!argv[0][1])
3264 break;
379d538a 3265 if (argv[0][1] == '-' && !argv[0][2]) {
79072805
LW
3266 argc--,argv++;
3267 break;
3268 }
155aba94 3269 if ((s = strchr(argv[0], '='))) {
79072805 3270 *s++ = '\0';
85e6fe83 3271 sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),s);
79072805
LW
3272 }
3273 else
85e6fe83 3274 sv_setiv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),1);
fe14fcc3 3275 }
79072805 3276 }
3280af22
NIS
3277 PL_toptarget = NEWSV(0,0);
3278 sv_upgrade(PL_toptarget, SVt_PVFM);
3279 sv_setpvn(PL_toptarget, "", 0);
3280 PL_bodytarget = NEWSV(0,0);
3281 sv_upgrade(PL_bodytarget, SVt_PVFM);
3282 sv_setpvn(PL_bodytarget, "", 0);
3283 PL_formtarget = PL_bodytarget;
79072805 3284
bbce6d69 3285 TAINT;
155aba94 3286 if ((tmpgv = gv_fetchpv("0",TRUE, SVt_PV))) {
bf4acbe4
GS
3287#ifdef MACOS_TRADITIONAL
3288 /* $0 is not majick on a Mac */
3289 sv_setpv(GvSV(tmpgv),MacPerl_MPWFileName(PL_origfilename));
3290#else
3280af22 3291 sv_setpv(GvSV(tmpgv),PL_origfilename);
79072805 3292 magicname("0", "0", 1);
bf4acbe4 3293#endif
79072805 3294 }
155aba94 3295 if ((tmpgv = gv_fetchpv("\030",TRUE, SVt_PV)))
ed344e4f 3296#ifdef OS2
23da6c43 3297 sv_setpv(GvSV(tmpgv), os2_execname(aTHX));
ed344e4f 3298#else
3280af22 3299 sv_setpv(GvSV(tmpgv),PL_origargv[0]);
ed344e4f 3300#endif
155aba94 3301 if ((PL_argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV))) {
3280af22
NIS
3302 GvMULTI_on(PL_argvgv);
3303 (void)gv_AVadd(PL_argvgv);
3304 av_clear(GvAVn(PL_argvgv));
79072805 3305 for (; argc > 0; argc--,argv++) {
729a02f2
GS
3306 SV *sv = newSVpv(argv[0],0);
3307 av_push(GvAVn(PL_argvgv),sv);
3308 if (PL_widesyscalls)
e84ff256 3309 (void)sv_utf8_decode(sv);
79072805
LW
3310 }
3311 }
155aba94 3312 if ((PL_envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV))) {
79072805 3313 HV *hv;
3280af22
NIS
3314 GvMULTI_on(PL_envgv);
3315 hv = GvHVn(PL_envgv);
3316 hv_magic(hv, PL_envgv, 'E');
bf4acbe4 3317#if !defined( VMS) && !defined(EPOC) && !defined(MACOS_TRADITIONAL) /* VMS doesn't have environ array */
4633a7c4
LW
3318 /* Note that if the supplied env parameter is actually a copy
3319 of the global environ then it may now point to free'd memory
3320 if the environment has been modified since. To avoid this
3321 problem we treat env==NULL as meaning 'use the default'
3322 */
3323 if (!env)
3324 env = environ;
5aabfad6 3325 if (env != environ)
79072805
LW
3326 environ[0] = Nullch;
3327 for (; *env; env++) {
93a17b20 3328 if (!(s = strchr(*env,'=')))
79072805
LW
3329 continue;
3330 *s++ = '\0';
60ce6247 3331#if defined(MSDOS)
137443ea 3332 (void)strupr(*env);
3333#endif
79072805
LW
3334 sv = newSVpv(s--,0);
3335 (void)hv_store(hv, *env, s - *env, sv, 0);
3336 *s = '=';
3e3baf6d
TB
3337#if defined(__BORLANDC__) && defined(USE_WIN32_RTL_ENV)
3338 /* Sins of the RTL. See note in my_setenv(). */
76e3520e 3339 (void)PerlEnv_putenv(savepv(*env));
3e3baf6d 3340#endif
fe14fcc3 3341 }
4550b24a 3342#endif
3343#ifdef DYNAMIC_ENV_FETCH
3344 HvNAME(hv) = savepv(ENV_HV_NAME);
3345#endif
79072805 3346 }
bbce6d69 3347 TAINT_NOT;
155aba94 3348 if ((tmpgv = gv_fetchpv("$",TRUE, SVt_PV)))
7766f137 3349 sv_setiv(GvSV(tmpgv), (IV)PerlProc_getpid());
33b78306 3350}
34de22dd 3351
76e3520e 3352STATIC void
cea2e8a9 3353S_init_perllib(pTHX)
34de22dd 3354{
85e6fe83 3355 char *s;
3280af22 3356 if (!PL_tainting) {
552a7a9b 3357#ifndef VMS
76e3520e 3358 s = PerlEnv_getenv("PERL5LIB");
85e6fe83 3359 if (s)
9c8a64f0 3360 incpush(s, TRUE, TRUE);
85e6fe83 3361 else
9c8a64f0 3362 incpush(PerlEnv_getenv("PERLLIB"), FALSE, FALSE);
552a7a9b 3363#else /* VMS */
3364 /* Treat PERL5?LIB as a possible search list logical name -- the
3365 * "natural" VMS idiom for a Unix path string. We allow each
3366 * element to be a set of |-separated directories for compatibility.
3367 */
3368 char buf[256];
3369 int idx = 0;
3370 if (my_trnlnm("PERL5LIB",buf,0))
9c8a64f0 3371 do { incpush(buf,TRUE,TRUE); } while (my_trnlnm("PERL5LIB",buf,++idx));
552a7a9b 3372 else
9c8a64f0 3373 while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE,FALSE);
552a7a9b 3374#endif /* VMS */
85e6fe83 3375 }
34de22dd 3376
c90c0ff4 3377/* Use the ~-expanded versions of APPLLIB (undocumented),
65f19062 3378 ARCHLIB PRIVLIB SITEARCH SITELIB VENDORARCH and VENDORLIB
df5cef82 3379*/
4633a7c4 3380#ifdef APPLLIB_EXP
9c8a64f0 3381 incpush(APPLLIB_EXP, TRUE, TRUE);
16d20bd9 3382#endif
4633a7c4 3383
fed7345c 3384#ifdef ARCHLIB_EXP
9c8a64f0 3385 incpush(ARCHLIB_EXP, FALSE, FALSE);
a0d0e21e 3386#endif
bf4acbe4
GS
3387#ifdef MACOS_TRADITIONAL
3388 {
3389 struct stat tmpstatbuf;
3390 SV * privdir = NEWSV(55, 0);
3391 char * macperl = PerlEnv_getenv("MACPERL");
3392
3393 if (!macperl)
3394 macperl = "";
3395
3396 Perl_sv_setpvf(aTHX_ privdir, "%slib:", macperl);
3397 if (PerlLIO_stat(SvPVX(privdir), &tmpstatbuf) >= 0 && S_ISDIR(tmpstatbuf.st_mode))
3398 incpush(SvPVX(privdir), TRUE, FALSE);
3399 Perl_sv_setpvf(aTHX_ privdir, "%ssite_perl:", macperl);
3400 if (PerlLIO_stat(SvPVX(privdir), &tmpstatbuf) >= 0 && S_ISDIR(tmpstatbuf.st_mode))
3401 incpush(SvPVX(privdir), TRUE, FALSE);
3402
3403 SvREFCNT_dec(privdir);
3404 }
3405 if (!PL_tainting)
3406 incpush(":", FALSE, FALSE);
3407#else
fed7345c 3408#ifndef PRIVLIB_EXP
65f19062 3409# define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
34de22dd 3410#endif
00dc2f4f 3411#if defined(WIN32)
9c8a64f0 3412 incpush(PRIVLIB_EXP, TRUE, FALSE);
00dc2f4f 3413#else
9c8a64f0 3414 incpush(PRIVLIB_EXP, FALSE, FALSE);
00dc2f4f 3415#endif
4633a7c4 3416
65f19062 3417#ifdef SITEARCH_EXP
3b290362
GS
3418 /* sitearch is always relative to sitelib on Windows for
3419 * DLL-based path intuition to work correctly */
3420# if !defined(WIN32)
9c8a64f0 3421 incpush(SITEARCH_EXP, FALSE, FALSE);
65f19062
GS
3422# endif
3423#endif
3424
4633a7c4 3425#ifdef SITELIB_EXP
65f19062 3426# if defined(WIN32)
9c8a64f0 3427 incpush(SITELIB_EXP, TRUE, FALSE); /* this picks up sitearch as well */
65f19062 3428# else
9c8a64f0 3429 incpush(SITELIB_EXP, FALSE, FALSE);
65f19062
GS
3430# endif
3431#endif
189d1e8d 3432
65f19062 3433#ifdef SITELIB_STEM /* Search for version-specific dirs below here */
9c8a64f0 3434 incpush(SITELIB_STEM, FALSE, TRUE);
81c6dfba 3435#endif
65f19062
GS
3436
3437#ifdef PERL_VENDORARCH_EXP
4ea817c6 3438 /* vendorarch is always relative to vendorlib on Windows for
3b290362
GS
3439 * DLL-based path intuition to work correctly */
3440# if !defined(WIN32)
9c8a64f0 3441 incpush(PERL_VENDORARCH_EXP, FALSE, FALSE);
65f19062 3442# endif
4b03c463 3443#endif
65f19062
GS
3444
3445#ifdef PERL_VENDORLIB_EXP
3446# if defined(WIN32)
9c8a64f0 3447 incpush(PERL_VENDORLIB_EXP, TRUE, FALSE); /* this picks up vendorarch as well */
65f19062 3448# else
9c8a64f0 3449 incpush(PERL_VENDORLIB_EXP, FALSE, FALSE);
65f19062 3450# endif
a3635516 3451#endif
65f19062
GS
3452
3453#ifdef PERL_VENDORLIB_STEM /* Search for version-specific dirs below here */
9c8a64f0 3454 incpush(PERL_VENDORLIB_STEM, FALSE, TRUE);
00dc2f4f 3455#endif
65f19062 3456
3b777bb4
GS
3457#ifdef PERL_OTHERLIBDIRS
3458 incpush(PERL_OTHERLIBDIRS, TRUE, TRUE);
3459#endif
3460
3280af22 3461 if (!PL_tainting)
9c8a64f0 3462 incpush(".", FALSE, FALSE);
bf4acbe4 3463#endif /* MACOS_TRADITIONAL */
774d564b 3464}
3465
3466#if defined(DOSISH)
3467# define PERLLIB_SEP ';'
3468#else
3469# if defined(VMS)
3470# define PERLLIB_SEP '|'
3471# else
bf4acbe4
GS
3472# if defined(MACOS_TRADITIONAL)
3473# define PERLLIB_SEP ','
3474# else
3475# define PERLLIB_SEP ':'
3476# endif
774d564b 3477# endif
3478#endif
3479#ifndef PERLLIB_MANGLE
3480# define PERLLIB_MANGLE(s,n) (s)
3481#endif
3482
76e3520e 3483STATIC void
9c8a64f0 3484S_incpush(pTHX_ char *p, int addsubdirs, int addoldvers)
774d564b 3485{
3486 SV *subdir = Nullsv;
774d564b 3487
3b290362 3488 if (!p || !*p)
774d564b 3489 return;
3490
9c8a64f0 3491 if (addsubdirs || addoldvers) {
00db4c45 3492 subdir = sv_newmortal();
774d564b 3493 }
3494
3495 /* Break at all separators */
3496 while (p && *p) {
8c52afec 3497 SV *libdir = NEWSV(55,0);
774d564b 3498 char *s;
3499
3500 /* skip any consecutive separators */
3501 while ( *p == PERLLIB_SEP ) {
3502 /* Uncomment the next line for PATH semantics */
79cb57f6 3503 /* av_push(GvAVn(PL_incgv), newSVpvn(".", 1)); */
774d564b 3504 p++;
3505 }
3506
3507 if ( (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
3508 sv_setpvn(libdir, PERLLIB_MANGLE(p, (STRLEN)(s - p)),
3509 (STRLEN)(s - p));
3510 p = s + 1;
3511 }
3512 else {
3513 sv_setpv(libdir, PERLLIB_MANGLE(p, 0));
3514 p = Nullch; /* break out */
3515 }
bf4acbe4
GS
3516#ifdef MACOS_TRADITIONAL
3517 if (!strchr(SvPVX(libdir), ':'))
3518 sv_insert(libdir, 0, 0, ":", 1);
3519 if (SvPVX(libdir)[SvCUR(libdir)-1] != ':')
3520 sv_catpv(libdir, ":");
3521#endif
774d564b 3522
3523 /*
3524 * BEFORE pushing libdir onto @INC we may first push version- and
3525 * archname-specific sub-directories.
3526 */
9c8a64f0 3527 if (addsubdirs || addoldvers) {
29d82f8d 3528#ifdef PERL_INC_VERSION_LIST
8353b874
GS
3529 /* Configure terminates PERL_INC_VERSION_LIST with a NULL */
3530 const char *incverlist[] = { PERL_INC_VERSION_LIST };
29d82f8d
GS
3531 const char **incver;
3532#endif
774d564b 3533 struct stat tmpstatbuf;
aa689395 3534#ifdef VMS
3535 char *unix;
3536 STRLEN len;
774d564b 3537
2d8e6c8d 3538 if ((unix = tounixspec_ts(SvPV(libdir,len),Nullch)) != Nullch) {
aa689395 3539 len = strlen(unix);
3540 while (unix[len-1] == '/') len--; /* Cosmetic */
3541 sv_usepvn(libdir,unix,len);
3542 }
3543 else
bf49b057 3544 PerlIO_printf(Perl_error_log,
aa689395 3545 "Failed to unixify @INC element \"%s\"\n",
2d8e6c8d 3546 SvPV(libdir,len));
aa689395 3547#endif
9c8a64f0 3548 if (addsubdirs) {
bf4acbe4
GS
3549#ifdef MACOS_TRADITIONAL
3550#define PERL_AV_SUFFIX_FMT ""
3551#define PERL_ARCH_FMT ":%s"
3552#else
3553#define PERL_AV_SUFFIX_FMT "/"
3554#define PERL_ARCH_FMT "/%s"
3555#endif
9c8a64f0 3556 /* .../version/archname if -d .../version/archname */
bf4acbe4 3557 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_AV_SUFFIX_FMT PERL_FS_VER_FMT PERL_ARCH_FMT,
9c8a64f0
GS
3558 libdir,
3559 (int)PERL_REVISION, (int)PERL_VERSION,
3560 (int)PERL_SUBVERSION, ARCHNAME);
3561 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
3562 S_ISDIR(tmpstatbuf.st_mode))
3563 av_push(GvAVn(PL_incgv), newSVsv(subdir));
4b03c463 3564
9c8a64f0 3565 /* .../version if -d .../version */
bf4acbe4 3566 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_AV_SUFFIX_FMT PERL_FS_VER_FMT, libdir,
9c8a64f0
GS
3567 (int)PERL_REVISION, (int)PERL_VERSION,
3568 (int)PERL_SUBVERSION);
3569 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
3570 S_ISDIR(tmpstatbuf.st_mode))
3571 av_push(GvAVn(PL_incgv), newSVsv(subdir));
3572
3573 /* .../archname if -d .../archname */
bf4acbe4 3574 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT, libdir, ARCHNAME);
29d82f8d
GS
3575 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
3576 S_ISDIR(tmpstatbuf.st_mode))
3577 av_push(GvAVn(PL_incgv), newSVsv(subdir));
29d82f8d 3578 }
9c8a64f0 3579
9c8a64f0 3580#ifdef PERL_INC_VERSION_LIST
ccc2aad8 3581 if (addoldvers) {
9c8a64f0
GS
3582 for (incver = incverlist; *incver; incver++) {
3583 /* .../xxx if -d .../xxx */
bf4acbe4 3584 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT, libdir, *incver);
9c8a64f0
GS
3585 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
3586 S_ISDIR(tmpstatbuf.st_mode))
3587 av_push(GvAVn(PL_incgv), newSVsv(subdir));
3588 }
3589 }
29d82f8d 3590#endif
774d564b 3591 }
3592
3593 /* finally push this lib directory on the end of @INC */
3280af22 3594 av_push(GvAVn(PL_incgv), libdir);
774d564b 3595 }
34de22dd 3596}
93a17b20 3597
199100c8 3598#ifdef USE_THREADS
76e3520e 3599STATIC struct perl_thread *
cea2e8a9 3600S_init_main_thread(pTHX)
199100c8 3601{
c5be433b 3602#if !defined(PERL_IMPLICIT_CONTEXT)
52e1cb5e 3603 struct perl_thread *thr;
cea2e8a9 3604#endif
199100c8
MB
3605 XPV *xpv;
3606
52e1cb5e 3607 Newz(53, thr, 1, struct perl_thread);
533c011a 3608 PL_curcop = &PL_compiling;
c5be433b 3609 thr->interp = PERL_GET_INTERP;
199100c8 3610 thr->cvcache = newHV();
54b9620d 3611 thr->threadsv = newAV();
940cb80d 3612 /* thr->threadsvp is set when find_threadsv is called */
199100c8
MB
3613 thr->specific = newAV();
3614 thr->flags = THRf_R_JOINABLE;
3615 MUTEX_INIT(&thr->mutex);
3616 /* Handcraft thrsv similarly to mess_sv */
533c011a 3617 New(53, PL_thrsv, 1, SV);
199100c8 3618 Newz(53, xpv, 1, XPV);
533c011a
NIS
3619 SvFLAGS(PL_thrsv) = SVt_PV;
3620 SvANY(PL_thrsv) = (void*)xpv;
3621 SvREFCNT(PL_thrsv) = 1 << 30; /* practically infinite */
3622 SvPVX(PL_thrsv) = (char*)thr;
3623 SvCUR_set(PL_thrsv, sizeof(thr));
3624 SvLEN_set(PL_thrsv, sizeof(thr));
3625 *SvEND(PL_thrsv) = '\0'; /* in the trailing_nul field */
3626 thr->oursv = PL_thrsv;
3627 PL_chopset = " \n-";
3967c732 3628 PL_dumpindent = 4;
533c011a
NIS
3629
3630 MUTEX_LOCK(&PL_threads_mutex);
3631 PL_nthreads++;
199100c8
MB
3632 thr->tid = 0;
3633 thr->next = thr;
3634 thr->prev = thr;
533c011a 3635 MUTEX_UNLOCK(&PL_threads_mutex);
199100c8 3636
4b026b9e 3637#ifdef HAVE_THREAD_INTERN
4f63d024 3638 Perl_init_thread_intern(thr);
235db74f
GS
3639#endif
3640
3641#ifdef SET_THREAD_SELF
3642 SET_THREAD_SELF(thr);
199100c8
MB
3643#else
3644 thr->self = pthread_self();
235db74f 3645#endif /* SET_THREAD_SELF */
06d86050 3646 PERL_SET_THX(thr);
199100c8
MB
3647
3648 /*
3649 * These must come after the SET_THR because sv_setpvn does
3650 * SvTAINT and the taint fields require dTHR.
3651 */
533c011a
NIS
3652 PL_toptarget = NEWSV(0,0);
3653 sv_upgrade(PL_toptarget, SVt_PVFM);
3654 sv_setpvn(PL_toptarget, "", 0);
3655 PL_bodytarget = NEWSV(0,0);
3656 sv_upgrade(PL_bodytarget, SVt_PVFM);
3657 sv_setpvn(PL_bodytarget, "", 0);
3658 PL_formtarget = PL_bodytarget;
79cb57f6 3659 thr->errsv = newSVpvn("", 0);
78857c3c 3660 (void) find_threadsv("@"); /* Ensure $@ is initialised early */
5c0ca799 3661
533c011a 3662 PL_maxscream = -1;
0b94c7bb
GS
3663 PL_regcompp = MEMBER_TO_FPTR(Perl_pregcomp);
3664 PL_regexecp = MEMBER_TO_FPTR(Perl_regexec_flags);
3665 PL_regint_start = MEMBER_TO_FPTR(Perl_re_intuit_start);
3666 PL_regint_string = MEMBER_TO_FPTR(Perl_re_intuit_string);
3667 PL_regfree = MEMBER_TO_FPTR(Perl_pregfree);
533c011a
NIS
3668 PL_regindent = 0;
3669 PL_reginterp_cnt = 0;
5c0ca799 3670
199100c8
MB
3671 return thr;
3672}
3673#endif /* USE_THREADS */
3674
93a17b20 3675void
864dbfa3 3676Perl_call_list(pTHX_ I32 oldscope, AV *paramList)
93a17b20 3677{
11343788 3678 dTHR;
971a9dd3 3679 SV *atsv;
57843af0 3680 line_t oldline = CopLINE(PL_curcop);
312caa8e 3681 CV *cv;
22921e25 3682 STRLEN len;
6224f72b 3683 int ret;
db36c5a1 3684 dJMPENV;
93a17b20 3685
76e3520e 3686 while (AvFILL(paramList) >= 0) {
312caa8e 3687 cv = (CV*)av_shift(paramList);
8990e307 3688 SAVEFREESV(cv);
14dd3ad8
GS
3689#ifdef PERL_FLEXIBLE_EXCEPTIONS
3690 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vcall_list_body), cv);
3691#else
3692 JMPENV_PUSH(ret);
3693#endif
6224f72b 3694 switch (ret) {
312caa8e 3695 case 0:
14dd3ad8
GS
3696#ifndef PERL_FLEXIBLE_EXCEPTIONS
3697 call_list_body(cv);
3698#endif
971a9dd3 3699 atsv = ERRSV;
312caa8e
CS
3700 (void)SvPV(atsv, len);
3701 if (len) {
971a9dd3 3702 STRLEN n_a;
312caa8e 3703 PL_curcop = &PL_compiling;
57843af0 3704 CopLINE_set(PL_curcop, oldline);
312caa8e
CS
3705 if (paramList == PL_beginav)
3706 sv_catpv(atsv, "BEGIN failed--compilation aborted");
3707 else
4f25aa18
GS
3708 Perl_sv_catpvf(aTHX_ atsv,
3709 "%s failed--call queue aborted",
7d30b5c4 3710 paramList == PL_checkav ? "CHECK"
4f25aa18
GS
3711 : paramList == PL_initav ? "INIT"
3712 : "END");
312caa8e
CS
3713 while (PL_scopestack_ix > oldscope)
3714 LEAVE;
14dd3ad8 3715 JMPENV_POP;
971a9dd3 3716 Perl_croak(aTHX_ "%s", SvPVx(atsv, n_a));
a0d0e21e 3717 }
85e6fe83 3718 break;
6224f72b 3719 case 1:
f86702cc 3720 STATUS_ALL_FAILURE;
85e6fe83 3721 /* FALL THROUGH */
6224f72b 3722 case 2:
85e6fe83 3723 /* my_exit() was called */
3280af22 3724 while (PL_scopestack_ix > oldscope)
2ae324a7 3725 LEAVE;
84902520 3726 FREETMPS;
3280af22 3727 PL_curstash = PL_defstash;
3280af22 3728 PL_curcop = &PL_compiling;
57843af0 3729 CopLINE_set(PL_curcop, oldline);
14dd3ad8 3730 JMPENV_POP;
cc3604b1 3731 if (PL_statusvalue && !(PL_exit_flags & PERL_EXIT_EXPECTED)) {
3280af22 3732 if (paramList == PL_beginav)
cea2e8a9 3733 Perl_croak(aTHX_ "BEGIN failed--compilation aborted");
85e6fe83 3734 else
4f25aa18 3735 Perl_croak(aTHX_ "%s failed--call queue aborted",
7d30b5c4 3736 paramList == PL_checkav ? "CHECK"
4f25aa18
GS
3737 : paramList == PL_initav ? "INIT"
3738 : "END");
85e6fe83 3739 }
f86702cc 3740 my_exit_jump();
85e6fe83 3741 /* NOTREACHED */
6224f72b 3742 case 3:
312caa8e
CS
3743 if (PL_restartop) {
3744 PL_curcop = &PL_compiling;
57843af0 3745 CopLINE_set(PL_curcop, oldline);
312caa8e 3746 JMPENV_JUMP(3);
85e6fe83 3747 }
bf49b057 3748 PerlIO_printf(Perl_error_log, "panic: restartop\n");
312caa8e
CS
3749 FREETMPS;
3750 break;
8990e307 3751 }
14dd3ad8 3752 JMPENV_POP;
93a17b20 3753 }
93a17b20 3754}
93a17b20 3755
14dd3ad8 3756#ifdef PERL_FLEXIBLE_EXCEPTIONS
312caa8e 3757STATIC void *
14dd3ad8 3758S_vcall_list_body(pTHX_ va_list args)
312caa8e 3759{
312caa8e 3760 CV *cv = va_arg(args, CV*);
14dd3ad8
GS
3761 return call_list_body(cv);
3762}
3763#endif
312caa8e 3764
14dd3ad8
GS
3765STATIC void *
3766S_call_list_body(pTHX_ CV *cv)
3767{
312caa8e 3768 PUSHMARK(PL_stack_sp);
864dbfa3 3769 call_sv((SV*)cv, G_EVAL|G_DISCARD);
312caa8e
CS
3770 return NULL;
3771}
3772
f86702cc 3773void
864dbfa3 3774Perl_my_exit(pTHX_ U32 status)
f86702cc 3775{
5dc0d613
MB
3776 dTHR;
3777
8b73bbec 3778 DEBUG_S(PerlIO_printf(Perl_debug_log, "my_exit: thread %p, status %lu\n",
a863c7d1 3779 thr, (unsigned long) status));
f86702cc 3780 switch (status) {
3781 case 0:
3782 STATUS_ALL_SUCCESS;
3783 break;
3784 case 1:
3785 STATUS_ALL_FAILURE;
3786 break;
3787 default:
3788 STATUS_NATIVE_SET(status);
3789 break;
3790 }
3791 my_exit_jump();
3792}
3793
3794void
864dbfa3 3795Perl_my_failure_exit(pTHX)
f86702cc 3796{
3797#ifdef VMS
3798 if (vaxc$errno & 1) {
4fdae800 3799 if (STATUS_NATIVE & 1) /* fortuitiously includes "-1" */
3800 STATUS_NATIVE_SET(44);
f86702cc 3801 }
3802 else {
ff0cee69 3803 if (!vaxc$errno && errno) /* unlikely */
4fdae800 3804 STATUS_NATIVE_SET(44);
f86702cc 3805 else
4fdae800 3806 STATUS_NATIVE_SET(vaxc$errno);
f86702cc 3807 }
3808#else
9b599b2a 3809 int exitstatus;
f86702cc 3810 if (errno & 255)
3811 STATUS_POSIX_SET(errno);
9b599b2a
GS
3812 else {
3813 exitstatus = STATUS_POSIX >> 8;
3814 if (exitstatus & 255)
3815 STATUS_POSIX_SET(exitstatus);
3816 else
3817 STATUS_POSIX_SET(255);
3818 }
f86702cc 3819#endif
3820 my_exit_jump();
93a17b20
LW
3821}
3822
76e3520e 3823STATIC void
cea2e8a9 3824S_my_exit_jump(pTHX)
f86702cc 3825{
de616352 3826 dTHR;
c09156bb 3827 register PERL_CONTEXT *cx;
f86702cc 3828 I32 gimme;
3829 SV **newsp;
3830
3280af22
NIS
3831 if (PL_e_script) {
3832 SvREFCNT_dec(PL_e_script);
3833 PL_e_script = Nullsv;
f86702cc 3834 }
3835
3280af22 3836 POPSTACK_TO(PL_mainstack);
f86702cc 3837 if (cxstack_ix >= 0) {
3838 if (cxstack_ix > 0)
3839 dounwind(0);
3280af22 3840 POPBLOCK(cx,PL_curpm);
f86702cc 3841 LEAVE;
3842 }
ff0cee69 3843
6224f72b 3844 JMPENV_JUMP(2);
f86702cc 3845}
873ef191 3846
7a5f8e82 3847#ifdef PERL_OBJECT
873ef191 3848#include "XSUB.h"
51371543 3849#endif
873ef191 3850
0cb96387
GS
3851static I32
3852read_e_script(pTHXo_ int idx, SV *buf_sv, int maxlen)
873ef191
GS
3853{
3854 char *p, *nl;
3280af22 3855 p = SvPVX(PL_e_script);
873ef191 3856 nl = strchr(p, '\n');
3280af22 3857 nl = (nl) ? nl+1 : SvEND(PL_e_script);
7dfe3f66 3858 if (nl-p == 0) {
0cb96387 3859 filter_del(read_e_script);
873ef191 3860 return 0;
7dfe3f66 3861 }
873ef191 3862 sv_catpvn(buf_sv, p, nl-p);
3280af22 3863 sv_chop(PL_e_script, nl);
873ef191
GS
3864 return 1;
3865}