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