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