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