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