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