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