This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
fix some spurious PERL_UNUSED_ARG/VAR() usage
[perl5.git] / perl.c
1 #line 2 "perl.c"
2 /*    perl.c
3  *
4  *    Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
5  *    2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
6  *     by Larry Wall and others
7  *
8  *    You may distribute under the terms of either the GNU General Public
9  *    License or the Artistic License, as specified in the README file.
10  *
11  */
12
13 /*
14  *      A ship then new they built for him
15  *      of mithril and of elven-glass
16  *              --from Bilbo's song of EƤrendil
17  *
18  *     [p.236 of _The Lord of the Rings_, II/i: "Many Meetings"]
19  */
20
21 /* This file contains the top-level functions that are used to create, use
22  * and destroy a perl interpreter, plus the functions used by XS code to
23  * call back into perl. Note that it does not contain the actual main()
24  * function of the interpreter; that can be found in perlmain.c
25  */
26
27 #if defined(PERL_IS_MINIPERL) && !defined(USE_SITECUSTOMIZE)
28 #  define USE_SITECUSTOMIZE
29 #endif
30
31 #include "EXTERN.h"
32 #define PERL_IN_PERL_C
33 #include "perl.h"
34 #include "patchlevel.h"                 /* for local_patches */
35 #include "XSUB.h"
36
37 #ifdef NETWARE
38 #include "nwutil.h"     
39 #endif
40
41 #ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
42 #  ifdef I_SYSUIO
43 #    include <sys/uio.h>
44 #  endif
45
46 union control_un {
47   struct cmsghdr cm;
48   char control[CMSG_SPACE(sizeof(int))];
49 };
50
51 #endif
52
53 #ifndef HZ
54 #  ifdef CLK_TCK
55 #    define HZ CLK_TCK
56 #  else
57 #    define HZ 60
58 #  endif
59 #endif
60
61 #if !defined(STANDARD_C) && !defined(HAS_GETENV_PROTOTYPE) && !defined(PERL_MICRO)
62 char *getenv (char *); /* Usually in <stdlib.h> */
63 #endif
64
65 static I32 read_e_script(pTHX_ int idx, SV *buf_sv, int maxlen);
66
67 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
68 #  define validate_suid(rsfp) NOOP
69 #else
70 #  define validate_suid(rsfp) S_validate_suid(aTHX_ rsfp)
71 #endif
72
73 #define CALL_BODY_SUB(myop) \
74     if (PL_op == (myop)) \
75         PL_op = PL_ppaddr[OP_ENTERSUB](aTHX); \
76     if (PL_op) \
77         CALLRUNOPS(aTHX);
78
79 #define CALL_LIST_BODY(cv) \
80     PUSHMARK(PL_stack_sp); \
81     call_sv(MUTABLE_SV((cv)), G_EVAL|G_DISCARD|G_VOID);
82
83 static void
84 S_init_tls_and_interp(PerlInterpreter *my_perl)
85 {
86     dVAR;
87     if (!PL_curinterp) {                        
88         PERL_SET_INTERP(my_perl);
89 #if defined(USE_ITHREADS)
90         INIT_THREADS;
91         ALLOC_THREAD_KEY;
92         PERL_SET_THX(my_perl);
93         OP_REFCNT_INIT;
94         OP_CHECK_MUTEX_INIT;
95         HINTS_REFCNT_INIT;
96         MUTEX_INIT(&PL_dollarzero_mutex);
97         MUTEX_INIT(&PL_my_ctx_mutex);
98 #  endif
99     }
100 #if defined(USE_ITHREADS)
101     else
102 #else
103     /* This always happens for non-ithreads  */
104 #endif
105     {
106         PERL_SET_THX(my_perl);
107     }
108 }
109
110
111 /* these implement the PERL_SYS_INIT, PERL_SYS_INIT3, PERL_SYS_TERM macros */
112
113 void
114 Perl_sys_init(int* argc, char*** argv)
115 {
116     dVAR;
117
118     PERL_ARGS_ASSERT_SYS_INIT;
119
120     PERL_UNUSED_ARG(argc); /* may not be used depending on _BODY macro */
121     PERL_UNUSED_ARG(argv);
122     PERL_SYS_INIT_BODY(argc, argv);
123 }
124
125 void
126 Perl_sys_init3(int* argc, char*** argv, char*** env)
127 {
128     dVAR;
129
130     PERL_ARGS_ASSERT_SYS_INIT3;
131
132     PERL_UNUSED_ARG(argc); /* may not be used depending on _BODY macro */
133     PERL_UNUSED_ARG(argv);
134     PERL_UNUSED_ARG(env);
135     PERL_SYS_INIT3_BODY(argc, argv, env);
136 }
137
138 void
139 Perl_sys_term(void)
140 {
141     dVAR;
142     if (!PL_veto_cleanup) {
143         PERL_SYS_TERM_BODY();
144     }
145 }
146
147
148 #ifdef PERL_IMPLICIT_SYS
149 PerlInterpreter *
150 perl_alloc_using(struct IPerlMem* ipM, struct IPerlMem* ipMS,
151                  struct IPerlMem* ipMP, struct IPerlEnv* ipE,
152                  struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
153                  struct IPerlDir* ipD, struct IPerlSock* ipS,
154                  struct IPerlProc* ipP)
155 {
156     PerlInterpreter *my_perl;
157
158     PERL_ARGS_ASSERT_PERL_ALLOC_USING;
159
160     /* Newx() needs interpreter, so call malloc() instead */
161     my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
162     S_init_tls_and_interp(my_perl);
163     Zero(my_perl, 1, PerlInterpreter);
164     PL_Mem = ipM;
165     PL_MemShared = ipMS;
166     PL_MemParse = ipMP;
167     PL_Env = ipE;
168     PL_StdIO = ipStd;
169     PL_LIO = ipLIO;
170     PL_Dir = ipD;
171     PL_Sock = ipS;
172     PL_Proc = ipP;
173     INIT_TRACK_MEMPOOL(PL_memory_debug_header, my_perl);
174
175     return my_perl;
176 }
177 #else
178
179 /*
180 =head1 Embedding Functions
181
182 =for apidoc perl_alloc
183
184 Allocates a new Perl interpreter.  See L<perlembed>.
185
186 =cut
187 */
188
189 PerlInterpreter *
190 perl_alloc(void)
191 {
192     PerlInterpreter *my_perl;
193
194     /* Newx() needs interpreter, so call malloc() instead */
195     my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
196
197     S_init_tls_and_interp(my_perl);
198 #ifndef PERL_TRACK_MEMPOOL
199     return (PerlInterpreter *) ZeroD(my_perl, 1, PerlInterpreter);
200 #else
201     Zero(my_perl, 1, PerlInterpreter);
202     INIT_TRACK_MEMPOOL(PL_memory_debug_header, my_perl);
203     return my_perl;
204 #endif
205 }
206 #endif /* PERL_IMPLICIT_SYS */
207
208 /*
209 =for apidoc perl_construct
210
211 Initializes a new Perl interpreter.  See L<perlembed>.
212
213 =cut
214 */
215
216 void
217 perl_construct(pTHXx)
218 {
219     dVAR;
220
221     PERL_ARGS_ASSERT_PERL_CONSTRUCT;
222
223 #ifdef MULTIPLICITY
224     init_interp();
225     PL_perl_destruct_level = 1;
226 #else
227     PERL_UNUSED_ARG(my_perl);
228    if (PL_perl_destruct_level > 0)
229        init_interp();
230 #endif
231     PL_curcop = &PL_compiling;  /* needed by ckWARN, right away */
232
233 #ifdef PERL_TRACE_OPS
234     Zero(PL_op_exec_cnt, OP_max+2, UV);
235 #endif
236
237     init_constants();
238
239     SvREADONLY_on(&PL_sv_placeholder);
240     SvREFCNT(&PL_sv_placeholder) = SvREFCNT_IMMORTAL;
241
242     PL_sighandlerp = (Sighandler_t) Perl_sighandler;
243 #ifdef PERL_USES_PL_PIDSTATUS
244     PL_pidstatus = newHV();
245 #endif
246
247     PL_rs = newSVpvs("\n");
248
249     init_stacks();
250
251     init_ids();
252
253     JMPENV_BOOTSTRAP;
254     STATUS_ALL_SUCCESS;
255
256     init_i18nl10n(1);
257
258 #if defined(LOCAL_PATCH_COUNT)
259     PL_localpatches = local_patches;    /* For possible -v */
260 #endif
261
262 #ifdef HAVE_INTERP_INTERN
263     sys_intern_init();
264 #endif
265
266     PerlIO_init(aTHX);                  /* Hook to IO system */
267
268     PL_fdpid = newAV();                 /* for remembering popen pids by fd */
269     PL_modglobal = newHV();             /* pointers to per-interpreter module globals */
270     PL_errors = newSVpvs("");
271     sv_setpvs(PERL_DEBUG_PAD(0), "");   /* For regex debugging. */
272     sv_setpvs(PERL_DEBUG_PAD(1), "");   /* ext/re needs these */
273     sv_setpvs(PERL_DEBUG_PAD(2), "");   /* even without DEBUGGING. */
274 #ifdef USE_ITHREADS
275     /* First entry is a list of empty elements. It needs to be initialised
276        else all hell breaks loose in S_find_uninit_var().  */
277     Perl_av_create_and_push(aTHX_ &PL_regex_padav, newSVpvs(""));
278     PL_regex_pad = AvARRAY(PL_regex_padav);
279     Newxz(PL_stashpad, PL_stashpadmax, HV *);
280 #endif
281 #ifdef USE_REENTRANT_API
282     Perl_reentrant_init(aTHX);
283 #endif
284 #if defined(USE_HASH_SEED) || defined(USE_HASH_SEED_EXPLICIT)
285         /* [perl #22371] Algorimic Complexity Attack on Perl 5.6.1, 5.8.0
286          * This MUST be done before any hash stores or fetches take place.
287          * If you set PL_hash_seed (and presumably also PL_hash_seed_set)
288          * yourself, it is your responsibility to provide a good random seed!
289          * You can also define PERL_HASH_SEED in compile time, see hv.h.
290          *
291          * XXX: fix this comment */
292     if (PL_hash_seed_set == FALSE) {
293         Perl_get_hash_seed(aTHX_ PL_hash_seed);
294         PL_hash_seed_set= TRUE;
295     }
296 #endif /* #if defined(USE_HASH_SEED) || defined(USE_HASH_SEED_EXPLICIT) */
297
298     /* Note that strtab is a rather special HV.  Assumptions are made
299        about not iterating on it, and not adding tie magic to it.
300        It is properly deallocated in perl_destruct() */
301     PL_strtab = newHV();
302
303     HvSHAREKEYS_off(PL_strtab);                 /* mandatory */
304     hv_ksplit(PL_strtab, 512);
305
306     Zero(PL_sv_consts, SV_CONSTS_COUNT, SV*);
307
308 #ifndef PERL_MICRO
309 #   ifdef  USE_ENVIRON_ARRAY
310     PL_origenviron = environ;
311 #   endif
312 #endif
313
314     /* Use sysconf(_SC_CLK_TCK) if available, if not
315      * available or if the sysconf() fails, use the HZ.
316      * The HZ if not originally defined has been by now
317      * been defined as CLK_TCK, if available. */
318 #if defined(HAS_SYSCONF) && defined(_SC_CLK_TCK)
319     PL_clocktick = sysconf(_SC_CLK_TCK);
320     if (PL_clocktick <= 0)
321 #endif
322          PL_clocktick = HZ;
323
324     PL_stashcache = newHV();
325
326     PL_patchlevel = newSVpvs("v" PERL_VERSION_STRING);
327
328 #ifdef HAS_MMAP
329     if (!PL_mmap_page_size) {
330 #if defined(HAS_SYSCONF) && (defined(_SC_PAGESIZE) || defined(_SC_MMAP_PAGE_SIZE))
331       {
332         SETERRNO(0, SS_NORMAL);
333 #   ifdef _SC_PAGESIZE
334         PL_mmap_page_size = sysconf(_SC_PAGESIZE);
335 #   else
336         PL_mmap_page_size = sysconf(_SC_MMAP_PAGE_SIZE);
337 #   endif
338         if ((long) PL_mmap_page_size < 0) {
339           if (errno) {
340             SV * const error = ERRSV;
341             SvUPGRADE(error, SVt_PV);
342             Perl_croak(aTHX_ "panic: sysconf: %s", SvPV_nolen_const(error));
343           }
344           else
345             Perl_croak(aTHX_ "panic: sysconf: pagesize unknown");
346         }
347       }
348 #else
349 #   ifdef HAS_GETPAGESIZE
350       PL_mmap_page_size = getpagesize();
351 #   else
352 #       if defined(I_SYS_PARAM) && defined(PAGESIZE)
353       PL_mmap_page_size = PAGESIZE;       /* compiletime, bad */
354 #       endif
355 #   endif
356 #endif
357       if (PL_mmap_page_size <= 0)
358         Perl_croak(aTHX_ "panic: bad pagesize %" IVdf,
359                    (IV) PL_mmap_page_size);
360     }
361 #endif /* HAS_MMAP */
362
363 #if defined(HAS_TIMES) && defined(PERL_NEED_TIMESBASE)
364     PL_timesbase.tms_utime  = 0;
365     PL_timesbase.tms_stime  = 0;
366     PL_timesbase.tms_cutime = 0;
367     PL_timesbase.tms_cstime = 0;
368 #endif
369
370     PL_osname = Perl_savepvn(aTHX_ STR_WITH_LEN(OSNAME));
371
372     PL_registered_mros = newHV();
373     /* Start with 1 bucket, for DFS.  It's unlikely we'll need more.  */
374     HvMAX(PL_registered_mros) = 0;
375
376     PL_XPosix_ptrs[_CC_ASCII] = _new_invlist_C_array(ASCII_invlist);
377     PL_XPosix_ptrs[_CC_ALPHANUMERIC] = _new_invlist_C_array(XPosixAlnum_invlist);
378     PL_XPosix_ptrs[_CC_ALPHA] = _new_invlist_C_array(XPosixAlpha_invlist);
379     PL_XPosix_ptrs[_CC_BLANK] = _new_invlist_C_array(XPosixBlank_invlist);
380     PL_XPosix_ptrs[_CC_CASED] =  _new_invlist_C_array(Cased_invlist);
381     PL_XPosix_ptrs[_CC_CNTRL] = _new_invlist_C_array(XPosixCntrl_invlist);
382     PL_XPosix_ptrs[_CC_DIGIT] = _new_invlist_C_array(XPosixDigit_invlist);
383     PL_XPosix_ptrs[_CC_GRAPH] = _new_invlist_C_array(XPosixGraph_invlist);
384     PL_XPosix_ptrs[_CC_LOWER] = _new_invlist_C_array(XPosixLower_invlist);
385     PL_XPosix_ptrs[_CC_PRINT] = _new_invlist_C_array(XPosixPrint_invlist);
386     PL_XPosix_ptrs[_CC_PUNCT] = _new_invlist_C_array(XPosixPunct_invlist);
387     PL_XPosix_ptrs[_CC_SPACE] = _new_invlist_C_array(XPerlSpace_invlist);
388     PL_XPosix_ptrs[_CC_UPPER] = _new_invlist_C_array(XPosixUpper_invlist);
389     PL_XPosix_ptrs[_CC_VERTSPACE] = _new_invlist_C_array(VertSpace_invlist);
390     PL_XPosix_ptrs[_CC_WORDCHAR] = _new_invlist_C_array(XPosixWord_invlist);
391     PL_XPosix_ptrs[_CC_XDIGIT] = _new_invlist_C_array(XPosixXDigit_invlist);
392     PL_GCB_invlist = _new_invlist_C_array(Grapheme_Cluster_Break_invlist);
393     PL_SB_invlist = _new_invlist_C_array(Sentence_Break_invlist);
394     PL_WB_invlist = _new_invlist_C_array(Word_Break_invlist);
395
396     ENTER;
397 }
398
399 /*
400 =for apidoc nothreadhook
401
402 Stub that provides thread hook for perl_destruct when there are
403 no threads.
404
405 =cut
406 */
407
408 int
409 Perl_nothreadhook(pTHX)
410 {
411     PERL_UNUSED_CONTEXT;
412     return 0;
413 }
414
415 #ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
416 void
417 Perl_dump_sv_child(pTHX_ SV *sv)
418 {
419     ssize_t got;
420     const int sock = PL_dumper_fd;
421     const int debug_fd = PerlIO_fileno(Perl_debug_log);
422     union control_un control;
423     struct msghdr msg;
424     struct iovec vec[2];
425     struct cmsghdr *cmptr;
426     int returned_errno;
427     unsigned char buffer[256];
428
429     PERL_ARGS_ASSERT_DUMP_SV_CHILD;
430
431     if(sock == -1 || debug_fd == -1)
432         return;
433
434     PerlIO_flush(Perl_debug_log);
435
436     /* All these shenanigans are to pass a file descriptor over to our child for
437        it to dump out to.  We can't let it hold open the file descriptor when it
438        forks, as the file descriptor it will dump to can turn out to be one end
439        of pipe that some other process will wait on for EOF. (So as it would
440        be open, the wait would be forever.)  */
441
442     msg.msg_control = control.control;
443     msg.msg_controllen = sizeof(control.control);
444     /* We're a connected socket so we don't need a destination  */
445     msg.msg_name = NULL;
446     msg.msg_namelen = 0;
447     msg.msg_iov = vec;
448     msg.msg_iovlen = 1;
449
450     cmptr = CMSG_FIRSTHDR(&msg);
451     cmptr->cmsg_len = CMSG_LEN(sizeof(int));
452     cmptr->cmsg_level = SOL_SOCKET;
453     cmptr->cmsg_type = SCM_RIGHTS;
454     *((int *)CMSG_DATA(cmptr)) = 1;
455
456     vec[0].iov_base = (void*)&sv;
457     vec[0].iov_len = sizeof(sv);
458     got = sendmsg(sock, &msg, 0);
459
460     if(got < 0) {
461         perror("Debug leaking scalars parent sendmsg failed");
462         abort();
463     }
464     if(got < sizeof(sv)) {
465         perror("Debug leaking scalars parent short sendmsg");
466         abort();
467     }
468
469     /* Return protocol is
470        int:             errno value
471        unsigned char:   length of location string (0 for empty)
472        unsigned char*:  string (not terminated)
473     */
474     vec[0].iov_base = (void*)&returned_errno;
475     vec[0].iov_len = sizeof(returned_errno);
476     vec[1].iov_base = buffer;
477     vec[1].iov_len = 1;
478
479     got = readv(sock, vec, 2);
480
481     if(got < 0) {
482         perror("Debug leaking scalars parent read failed");
483         PerlIO_flush(PerlIO_stderr());
484         abort();
485     }
486     if(got < sizeof(returned_errno) + 1) {
487         perror("Debug leaking scalars parent short read");
488         PerlIO_flush(PerlIO_stderr());
489         abort();
490     }
491
492     if (*buffer) {
493         got = read(sock, buffer + 1, *buffer);
494         if(got < 0) {
495             perror("Debug leaking scalars parent read 2 failed");
496             PerlIO_flush(PerlIO_stderr());
497             abort();
498         }
499
500         if(got < *buffer) {
501             perror("Debug leaking scalars parent short read 2");
502             PerlIO_flush(PerlIO_stderr());
503             abort();
504         }
505     }
506
507     if (returned_errno || *buffer) {
508         Perl_warn(aTHX_ "Debug leaking scalars child failed%s%.*s with errno"
509                   " %d: %s", (*buffer ? " at " : ""), (int) *buffer, buffer + 1,
510                   returned_errno, Strerror(returned_errno));
511     }
512 }
513 #endif
514
515 /*
516 =for apidoc perl_destruct
517
518 Shuts down a Perl interpreter.  See L<perlembed>.
519
520 =cut
521 */
522
523 int
524 perl_destruct(pTHXx)
525 {
526     dVAR;
527     VOL signed char destruct_level;  /* see possible values in intrpvar.h */
528     HV *hv;
529 #ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
530     pid_t child;
531 #endif
532     int i;
533
534     PERL_ARGS_ASSERT_PERL_DESTRUCT;
535 #ifndef MULTIPLICITY
536     PERL_UNUSED_ARG(my_perl);
537 #endif
538
539     assert(PL_scopestack_ix == 1);
540
541     /* wait for all pseudo-forked children to finish */
542     PERL_WAIT_FOR_CHILDREN;
543
544     destruct_level = PL_perl_destruct_level;
545 #if defined(DEBUGGING) || defined(PERL_TRACK_MEMPOOL)
546     {
547         const char * const s = PerlEnv_getenv("PERL_DESTRUCT_LEVEL");
548         if (s) {
549             int i;
550             if (strEQ(s, "-1")) { /* Special case: modperl folklore. */
551                 i = -1;
552             } else {
553                 i = grok_atou(s, NULL);
554             }
555 #ifdef DEBUGGING
556             if (destruct_level < i) destruct_level = i;
557 #endif
558 #ifdef PERL_TRACK_MEMPOOL
559             /* RT #114496, for perl_free */
560             PL_perl_destruct_level = i;
561 #endif
562         }
563     }
564 #endif
565
566     if (PL_exit_flags & PERL_EXIT_DESTRUCT_END) {
567         dJMPENV;
568         int x = 0;
569
570         JMPENV_PUSH(x);
571         PERL_UNUSED_VAR(x);
572         if (PL_endav && !PL_minus_c) {
573             PERL_SET_PHASE(PERL_PHASE_END);
574             call_list(PL_scopestack_ix, PL_endav);
575         }
576         JMPENV_POP;
577     }
578     LEAVE;
579     FREETMPS;
580     assert(PL_scopestack_ix == 0);
581
582     /* Need to flush since END blocks can produce output */
583     my_fflush_all();
584
585 #ifdef PERL_TRACE_OPS
586     /* If we traced all Perl OP usage, report and clean up */
587     PerlIO_printf(Perl_debug_log, "Trace of all OPs executed:\n");
588     for (i = 0; i <= OP_max; ++i) {
589         PerlIO_printf(Perl_debug_log, "  %s: %"UVuf"\n", PL_op_name[i], PL_op_exec_cnt[i]);
590         PL_op_exec_cnt[i] = 0;
591     }
592     /* Utility slot for easily doing little tracing experiments in the runloop: */
593     if (PL_op_exec_cnt[OP_max+1] != 0)
594         PerlIO_printf(Perl_debug_log, "  SPECIAL: %"UVuf"\n", PL_op_exec_cnt[OP_max+1]);
595     PerlIO_printf(Perl_debug_log, "\n");
596 #endif
597
598
599     if (PL_threadhook(aTHX)) {
600         /* Threads hook has vetoed further cleanup */
601         PL_veto_cleanup = TRUE;
602         return STATUS_EXIT;
603     }
604
605 #ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
606     if (destruct_level != 0) {
607         /* Fork here to create a child. Our child's job is to preserve the
608            state of scalars prior to destruction, so that we can instruct it
609            to dump any scalars that we later find have leaked.
610            There's no subtlety in this code - it assumes POSIX, and it doesn't
611            fail gracefully  */
612         int fd[2];
613
614         if(socketpair(AF_UNIX, SOCK_STREAM, 0, fd)) {
615             perror("Debug leaking scalars socketpair failed");
616             abort();
617         }
618
619         child = fork();
620         if(child == -1) {
621             perror("Debug leaking scalars fork failed");
622             abort();
623         }
624         if (!child) {
625             /* We are the child */
626             const int sock = fd[1];
627             const int debug_fd = PerlIO_fileno(Perl_debug_log);
628             int f;
629             const char *where;
630             /* Our success message is an integer 0, and a char 0  */
631             static const char success[sizeof(int) + 1] = {0};
632
633             close(fd[0]);
634
635             /* We need to close all other file descriptors otherwise we end up
636                with interesting hangs, where the parent closes its end of a
637                pipe, and sits waiting for (another) child to terminate. Only
638                that child never terminates, because it never gets EOF, because
639                we also have the far end of the pipe open.  We even need to
640                close the debugging fd, because sometimes it happens to be one
641                end of a pipe, and a process is waiting on the other end for
642                EOF. Normally it would be closed at some point earlier in
643                destruction, but if we happen to cause the pipe to remain open,
644                EOF never occurs, and we get an infinite hang. Hence all the
645                games to pass in a file descriptor if it's actually needed.  */
646
647             f = sysconf(_SC_OPEN_MAX);
648             if(f < 0) {
649                 where = "sysconf failed";
650                 goto abort;
651             }
652             while (f--) {
653                 if (f == sock)
654                     continue;
655                 close(f);
656             }
657
658             while (1) {
659                 SV *target;
660                 union control_un control;
661                 struct msghdr msg;
662                 struct iovec vec[1];
663                 struct cmsghdr *cmptr;
664                 ssize_t got;
665                 int got_fd;
666
667                 msg.msg_control = control.control;
668                 msg.msg_controllen = sizeof(control.control);
669                 /* We're a connected socket so we don't need a source  */
670                 msg.msg_name = NULL;
671                 msg.msg_namelen = 0;
672                 msg.msg_iov = vec;
673                 msg.msg_iovlen = C_ARRAY_LENGTH(vec);
674
675                 vec[0].iov_base = (void*)&target;
676                 vec[0].iov_len = sizeof(target);
677       
678                 got = recvmsg(sock, &msg, 0);
679
680                 if(got == 0)
681                     break;
682                 if(got < 0) {
683                     where = "recv failed";
684                     goto abort;
685                 }
686                 if(got < sizeof(target)) {
687                     where = "short recv";
688                     goto abort;
689                 }
690
691                 if(!(cmptr = CMSG_FIRSTHDR(&msg))) {
692                     where = "no cmsg";
693                     goto abort;
694                 }
695                 if(cmptr->cmsg_len != CMSG_LEN(sizeof(int))) {
696                     where = "wrong cmsg_len";
697                     goto abort;
698                 }
699                 if(cmptr->cmsg_level != SOL_SOCKET) {
700                     where = "wrong cmsg_level";
701                     goto abort;
702                 }
703                 if(cmptr->cmsg_type != SCM_RIGHTS) {
704                     where = "wrong cmsg_type";
705                     goto abort;
706                 }
707
708                 got_fd = *(int*)CMSG_DATA(cmptr);
709                 /* For our last little bit of trickery, put the file descriptor
710                    back into Perl_debug_log, as if we never actually closed it
711                 */
712                 if(got_fd != debug_fd) {
713                     if (dup2(got_fd, debug_fd) == -1) {
714                         where = "dup2";
715                         goto abort;
716                     }
717                 }
718                 sv_dump(target);
719
720                 PerlIO_flush(Perl_debug_log);
721
722                 got = write(sock, &success, sizeof(success));
723
724                 if(got < 0) {
725                     where = "write failed";
726                     goto abort;
727                 }
728                 if(got < sizeof(success)) {
729                     where = "short write";
730                     goto abort;
731                 }
732             }
733             _exit(0);
734         abort:
735             {
736                 int send_errno = errno;
737                 unsigned char length = (unsigned char) strlen(where);
738                 struct iovec failure[3] = {
739                     {(void*)&send_errno, sizeof(send_errno)},
740                     {&length, 1},
741                     {(void*)where, length}
742                 };
743                 int got = writev(sock, failure, 3);
744                 /* Bad news travels fast. Faster than data. We'll get a SIGPIPE
745                    in the parent if we try to read from the socketpair after the
746                    child has exited, even if there was data to read.
747                    So sleep a bit to give the parent a fighting chance of
748                    reading the data.  */
749                 sleep(2);
750                 _exit((got == -1) ? errno : 0);
751             }
752             /* End of child.  */
753         }
754         PL_dumper_fd = fd[0];
755         close(fd[1]);
756     }
757 #endif
758     
759     /* We must account for everything.  */
760
761     /* Destroy the main CV and syntax tree */
762     /* Set PL_curcop now, because destroying ops can cause new SVs
763        to be generated in Perl_pad_swipe, and when running with
764       -DDEBUG_LEAKING_SCALARS they expect PL_curcop to point to a valid
765        op from which the filename structure member is copied.  */
766     PL_curcop = &PL_compiling;
767     if (PL_main_root) {
768         /* ensure comppad/curpad to refer to main's pad */
769         if (CvPADLIST(PL_main_cv)) {
770             PAD_SET_CUR_NOSAVE(CvPADLIST(PL_main_cv), 1);
771             PL_comppad_name = PadlistNAMES(CvPADLIST(PL_main_cv));
772         }
773         op_free(PL_main_root);
774         PL_main_root = NULL;
775     }
776     PL_main_start = NULL;
777     /* note that  PL_main_cv isn't usually actually freed at this point,
778      * due to the CvOUTSIDE refs from subs compiled within it. It will
779      * get freed once all the subs are freed in sv_clean_all(), for
780      * destruct_level > 0 */
781     SvREFCNT_dec(PL_main_cv);
782     PL_main_cv = NULL;
783     PERL_SET_PHASE(PERL_PHASE_DESTRUCT);
784
785     /* Tell PerlIO we are about to tear things apart in case
786        we have layers which are using resources that should
787        be cleaned up now.
788      */
789
790     PerlIO_destruct(aTHX);
791
792     /*
793      * Try to destruct global references.  We do this first so that the
794      * destructors and destructees still exist.  Some sv's might remain.
795      * Non-referenced objects are on their own.
796      */
797     sv_clean_objs();
798
799     /* unhook hooks which will soon be, or use, destroyed data */
800     SvREFCNT_dec(PL_warnhook);
801     PL_warnhook = NULL;
802     SvREFCNT_dec(PL_diehook);
803     PL_diehook = NULL;
804
805     /* call exit list functions */
806     while (PL_exitlistlen-- > 0)
807         PL_exitlist[PL_exitlistlen].fn(aTHX_ PL_exitlist[PL_exitlistlen].ptr);
808
809     Safefree(PL_exitlist);
810
811     PL_exitlist = NULL;
812     PL_exitlistlen = 0;
813
814     SvREFCNT_dec(PL_registered_mros);
815
816     /* jettison our possibly duplicated environment */
817     /* if PERL_USE_SAFE_PUTENV is defined environ will not have been copied
818      * so we certainly shouldn't free it here
819      */
820 #ifndef PERL_MICRO
821 #if defined(USE_ENVIRON_ARRAY) && !defined(PERL_USE_SAFE_PUTENV)
822     if (environ != PL_origenviron && !PL_use_safe_putenv
823 #ifdef USE_ITHREADS
824         /* only main thread can free environ[0] contents */
825         && PL_curinterp == aTHX
826 #endif
827         )
828     {
829         I32 i;
830
831         for (i = 0; environ[i]; i++)
832             safesysfree(environ[i]);
833
834         /* Must use safesysfree() when working with environ. */
835         safesysfree(environ);           
836
837         environ = PL_origenviron;
838     }
839 #endif
840 #endif /* !PERL_MICRO */
841
842     if (destruct_level == 0) {
843
844         DEBUG_P(debprofdump());
845
846 #if defined(PERLIO_LAYERS)
847         /* No more IO - including error messages ! */
848         PerlIO_cleanup(aTHX);
849 #endif
850
851         CopFILE_free(&PL_compiling);
852
853         /* The exit() function will do everything that needs doing. */
854         return STATUS_EXIT;
855     }
856
857     /* Below, do clean up for when PERL_DESTRUCT_LEVEL is not 0 */
858
859 #ifdef USE_ITHREADS
860     /* the syntax tree is shared between clones
861      * so op_free(PL_main_root) only ReREFCNT_dec's
862      * REGEXPs in the parent interpreter
863      * we need to manually ReREFCNT_dec for the clones
864      */
865     {
866         I32 i = AvFILLp(PL_regex_padav);
867         SV **ary = AvARRAY(PL_regex_padav);
868
869         for (; i; i--) {
870             SvREFCNT_dec(ary[i]);
871             ary[i] = &PL_sv_undef;
872         }
873     }
874 #endif
875
876
877     SvREFCNT_dec(MUTABLE_SV(PL_stashcache));
878     PL_stashcache = NULL;
879
880     /* loosen bonds of global variables */
881
882     /* XXX can PL_parser still be non-null here? */
883     if(PL_parser && PL_parser->rsfp) {
884         (void)PerlIO_close(PL_parser->rsfp);
885         PL_parser->rsfp = NULL;
886     }
887
888     if (PL_minus_F) {
889         Safefree(PL_splitstr);
890         PL_splitstr = NULL;
891     }
892
893     /* switches */
894     PL_minus_n      = FALSE;
895     PL_minus_p      = FALSE;
896     PL_minus_l      = FALSE;
897     PL_minus_a      = FALSE;
898     PL_minus_F      = FALSE;
899     PL_doswitches   = FALSE;
900     PL_dowarn       = G_WARN_OFF;
901 #ifdef PERL_SAWAMPERSAND
902     PL_sawampersand = 0;        /* must save all match strings */
903 #endif
904     PL_unsafe       = FALSE;
905
906     Safefree(PL_inplace);
907     PL_inplace = NULL;
908     SvREFCNT_dec(PL_patchlevel);
909
910     if (PL_e_script) {
911         SvREFCNT_dec(PL_e_script);
912         PL_e_script = NULL;
913     }
914
915     PL_perldb = 0;
916
917     /* magical thingies */
918
919     SvREFCNT_dec(PL_ofsgv);     /* *, */
920     PL_ofsgv = NULL;
921
922     SvREFCNT_dec(PL_ors_sv);    /* $\ */
923     PL_ors_sv = NULL;
924
925     SvREFCNT_dec(PL_rs);        /* $/ */
926     PL_rs = NULL;
927
928     Safefree(PL_osname);        /* $^O */
929     PL_osname = NULL;
930
931     SvREFCNT_dec(PL_statname);
932     PL_statname = NULL;
933     PL_statgv = NULL;
934
935     /* defgv, aka *_ should be taken care of elsewhere */
936
937     /* float buffer */
938     Safefree(PL_efloatbuf);
939     PL_efloatbuf = NULL;
940     PL_efloatsize = 0;
941
942     /* startup and shutdown function lists */
943     SvREFCNT_dec(PL_beginav);
944     SvREFCNT_dec(PL_beginav_save);
945     SvREFCNT_dec(PL_endav);
946     SvREFCNT_dec(PL_checkav);
947     SvREFCNT_dec(PL_checkav_save);
948     SvREFCNT_dec(PL_unitcheckav);
949     SvREFCNT_dec(PL_unitcheckav_save);
950     SvREFCNT_dec(PL_initav);
951     PL_beginav = NULL;
952     PL_beginav_save = NULL;
953     PL_endav = NULL;
954     PL_checkav = NULL;
955     PL_checkav_save = NULL;
956     PL_unitcheckav = NULL;
957     PL_unitcheckav_save = NULL;
958     PL_initav = NULL;
959
960     /* shortcuts just get cleared */
961     PL_hintgv = NULL;
962     PL_errgv = NULL;
963     PL_argvoutgv = NULL;
964     PL_stdingv = NULL;
965     PL_stderrgv = NULL;
966     PL_last_in_gv = NULL;
967     PL_DBsingle = NULL;
968     PL_DBtrace = NULL;
969     PL_DBsignal = NULL;
970     PL_DBsingle_iv = 0;
971     PL_DBtrace_iv = 0;
972     PL_DBsignal_iv = 0;
973     PL_DBcv = NULL;
974     PL_dbargs = NULL;
975     PL_debstash = NULL;
976
977     SvREFCNT_dec(PL_envgv);
978     SvREFCNT_dec(PL_incgv);
979     SvREFCNT_dec(PL_argvgv);
980     SvREFCNT_dec(PL_replgv);
981     SvREFCNT_dec(PL_DBgv);
982     SvREFCNT_dec(PL_DBline);
983     SvREFCNT_dec(PL_DBsub);
984     PL_envgv = NULL;
985     PL_incgv = NULL;
986     PL_argvgv = NULL;
987     PL_replgv = NULL;
988     PL_DBgv = NULL;
989     PL_DBline = NULL;
990     PL_DBsub = NULL;
991
992     SvREFCNT_dec(PL_argvout_stack);
993     PL_argvout_stack = NULL;
994
995     SvREFCNT_dec(PL_modglobal);
996     PL_modglobal = NULL;
997     SvREFCNT_dec(PL_preambleav);
998     PL_preambleav = NULL;
999     SvREFCNT_dec(PL_subname);
1000     PL_subname = NULL;
1001 #ifdef PERL_USES_PL_PIDSTATUS
1002     SvREFCNT_dec(PL_pidstatus);
1003     PL_pidstatus = NULL;
1004 #endif
1005     SvREFCNT_dec(PL_toptarget);
1006     PL_toptarget = NULL;
1007     SvREFCNT_dec(PL_bodytarget);
1008     PL_bodytarget = NULL;
1009     PL_formtarget = NULL;
1010
1011     /* free locale stuff */
1012 #ifdef USE_LOCALE_COLLATE
1013     Safefree(PL_collation_name);
1014     PL_collation_name = NULL;
1015 #endif
1016
1017 #ifdef USE_LOCALE_NUMERIC
1018     Safefree(PL_numeric_name);
1019     PL_numeric_name = NULL;
1020     SvREFCNT_dec(PL_numeric_radix_sv);
1021     PL_numeric_radix_sv = NULL;
1022 #endif
1023
1024     /* clear character classes  */
1025     for (i = 0; i < POSIX_SWASH_COUNT; i++) {
1026         SvREFCNT_dec(PL_utf8_swash_ptrs[i]);
1027         PL_utf8_swash_ptrs[i] = NULL;
1028     }
1029     SvREFCNT_dec(PL_utf8_mark);
1030     SvREFCNT_dec(PL_utf8_toupper);
1031     SvREFCNT_dec(PL_utf8_totitle);
1032     SvREFCNT_dec(PL_utf8_tolower);
1033     SvREFCNT_dec(PL_utf8_tofold);
1034     SvREFCNT_dec(PL_utf8_idstart);
1035     SvREFCNT_dec(PL_utf8_idcont);
1036     SvREFCNT_dec(PL_utf8_foldable);
1037     SvREFCNT_dec(PL_utf8_foldclosures);
1038     SvREFCNT_dec(PL_AboveLatin1);
1039     SvREFCNT_dec(PL_InBitmap);
1040     SvREFCNT_dec(PL_UpperLatin1);
1041     SvREFCNT_dec(PL_Latin1);
1042     SvREFCNT_dec(PL_NonL1NonFinalFold);
1043     SvREFCNT_dec(PL_HasMultiCharFold);
1044     SvREFCNT_dec(PL_warn_locale);
1045     PL_utf8_mark        = NULL;
1046     PL_utf8_toupper     = NULL;
1047     PL_utf8_totitle     = NULL;
1048     PL_utf8_tolower     = NULL;
1049     PL_utf8_tofold      = NULL;
1050     PL_utf8_idstart     = NULL;
1051     PL_utf8_idcont      = NULL;
1052     PL_utf8_foldclosures = NULL;
1053     PL_AboveLatin1       = NULL;
1054     PL_InBitmap          = NULL;
1055     PL_HasMultiCharFold  = NULL;
1056     PL_warn_locale       = NULL;
1057     PL_Latin1            = NULL;
1058     PL_NonL1NonFinalFold = NULL;
1059     PL_UpperLatin1       = NULL;
1060     for (i = 0; i < POSIX_CC_COUNT; i++) {
1061         SvREFCNT_dec(PL_XPosix_ptrs[i]);
1062         PL_XPosix_ptrs[i] = NULL;
1063     }
1064     PL_GCB_invlist = NULL;
1065     PL_SB_invlist = NULL;
1066     PL_WB_invlist = NULL;
1067
1068     if (!specialWARN(PL_compiling.cop_warnings))
1069         PerlMemShared_free(PL_compiling.cop_warnings);
1070     PL_compiling.cop_warnings = NULL;
1071     cophh_free(CopHINTHASH_get(&PL_compiling));
1072     CopHINTHASH_set(&PL_compiling, cophh_new_empty());
1073     CopFILE_free(&PL_compiling);
1074
1075     /* Prepare to destruct main symbol table.  */
1076
1077     hv = PL_defstash;
1078     /* break ref loop  *:: <=> %:: */
1079     (void)hv_delete(hv, "main::", 6, G_DISCARD);
1080     PL_defstash = 0;
1081     SvREFCNT_dec(hv);
1082     SvREFCNT_dec(PL_curstname);
1083     PL_curstname = NULL;
1084
1085     /* clear queued errors */
1086     SvREFCNT_dec(PL_errors);
1087     PL_errors = NULL;
1088
1089     SvREFCNT_dec(PL_isarev);
1090
1091     FREETMPS;
1092     if (destruct_level >= 2) {
1093         if (PL_scopestack_ix != 0)
1094             Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL),
1095                              "Unbalanced scopes: %ld more ENTERs than LEAVEs\n",
1096                              (long)PL_scopestack_ix);
1097         if (PL_savestack_ix != 0)
1098             Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL),
1099                              "Unbalanced saves: %ld more saves than restores\n",
1100                              (long)PL_savestack_ix);
1101         if (PL_tmps_floor != -1)
1102             Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL),"Unbalanced tmps: %ld more allocs than frees\n",
1103                              (long)PL_tmps_floor + 1);
1104         if (cxstack_ix != -1)
1105             Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL),"Unbalanced context: %ld more PUSHes than POPs\n",
1106                              (long)cxstack_ix + 1);
1107     }
1108
1109 #ifdef USE_ITHREADS
1110     SvREFCNT_dec(PL_regex_padav);
1111     PL_regex_padav = NULL;
1112     PL_regex_pad = NULL;
1113 #endif
1114
1115 #ifdef PERL_IMPLICIT_CONTEXT
1116     /* the entries in this list are allocated via SV PVX's, so get freed
1117      * in sv_clean_all */
1118     Safefree(PL_my_cxt_list);
1119 #endif
1120
1121     /* Now absolutely destruct everything, somehow or other, loops or no. */
1122
1123     /* the 2 is for PL_fdpid and PL_strtab */
1124     while (sv_clean_all() > 2)
1125         ;
1126
1127 #ifdef USE_ITHREADS
1128     Safefree(PL_stashpad); /* must come after sv_clean_all */
1129 #endif
1130
1131     AvREAL_off(PL_fdpid);               /* no surviving entries */
1132     SvREFCNT_dec(PL_fdpid);             /* needed in io_close() */
1133     PL_fdpid = NULL;
1134
1135 #ifdef HAVE_INTERP_INTERN
1136     sys_intern_clear();
1137 #endif
1138
1139     /* constant strings */
1140     for (i = 0; i < SV_CONSTS_COUNT; i++) {
1141         SvREFCNT_dec(PL_sv_consts[i]);
1142         PL_sv_consts[i] = NULL;
1143     }
1144
1145     /* Destruct the global string table. */
1146     {
1147         /* Yell and reset the HeVAL() slots that are still holding refcounts,
1148          * so that sv_free() won't fail on them.
1149          * Now that the global string table is using a single hunk of memory
1150          * for both HE and HEK, we either need to explicitly unshare it the
1151          * correct way, or actually free things here.
1152          */
1153         I32 riter = 0;
1154         const I32 max = HvMAX(PL_strtab);
1155         HE * const * const array = HvARRAY(PL_strtab);
1156         HE *hent = array[0];
1157
1158         for (;;) {
1159             if (hent && ckWARN_d(WARN_INTERNAL)) {
1160                 HE * const next = HeNEXT(hent);
1161                 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
1162                      "Unbalanced string table refcount: (%ld) for \"%s\"",
1163                      (long)hent->he_valu.hent_refcount, HeKEY(hent));
1164                 Safefree(hent);
1165                 hent = next;
1166             }
1167             if (!hent) {
1168                 if (++riter > max)
1169                     break;
1170                 hent = array[riter];
1171             }
1172         }
1173
1174         Safefree(array);
1175         HvARRAY(PL_strtab) = 0;
1176         HvTOTALKEYS(PL_strtab) = 0;
1177     }
1178     SvREFCNT_dec(PL_strtab);
1179
1180 #ifdef USE_ITHREADS
1181     /* free the pointer tables used for cloning */
1182     ptr_table_free(PL_ptr_table);
1183     PL_ptr_table = (PTR_TBL_t*)NULL;
1184 #endif
1185
1186     /* free special SVs */
1187
1188     SvREFCNT(&PL_sv_yes) = 0;
1189     sv_clear(&PL_sv_yes);
1190     SvANY(&PL_sv_yes) = NULL;
1191     SvFLAGS(&PL_sv_yes) = 0;
1192
1193     SvREFCNT(&PL_sv_no) = 0;
1194     sv_clear(&PL_sv_no);
1195     SvANY(&PL_sv_no) = NULL;
1196     SvFLAGS(&PL_sv_no) = 0;
1197
1198     {
1199         int i;
1200         for (i=0; i<=2; i++) {
1201             SvREFCNT(PERL_DEBUG_PAD(i)) = 0;
1202             sv_clear(PERL_DEBUG_PAD(i));
1203             SvANY(PERL_DEBUG_PAD(i)) = NULL;
1204             SvFLAGS(PERL_DEBUG_PAD(i)) = 0;
1205         }
1206     }
1207
1208     if (PL_sv_count != 0 && ckWARN_d(WARN_INTERNAL))
1209         Perl_warner(aTHX_ packWARN(WARN_INTERNAL),"Scalars leaked: %ld\n", (long)PL_sv_count);
1210
1211 #ifdef DEBUG_LEAKING_SCALARS
1212     if (PL_sv_count != 0) {
1213         SV* sva;
1214         SV* sv;
1215         SV* svend;
1216
1217         for (sva = PL_sv_arenaroot; sva; sva = MUTABLE_SV(SvANY(sva))) {
1218             svend = &sva[SvREFCNT(sva)];
1219             for (sv = sva + 1; sv < svend; ++sv) {
1220                 if (SvTYPE(sv) != (svtype)SVTYPEMASK) {
1221                     PerlIO_printf(Perl_debug_log, "leaked: sv=0x%p"
1222                         " flags=0x%"UVxf
1223                         " refcnt=%"UVuf pTHX__FORMAT "\n"
1224                         "\tallocated at %s:%d %s %s (parent 0x%"UVxf");"
1225                         "serial %"UVuf"\n",
1226                         (void*)sv, (UV)sv->sv_flags, (UV)sv->sv_refcnt
1227                         pTHX__VALUE,
1228                         sv->sv_debug_file ? sv->sv_debug_file : "(unknown)",
1229                         sv->sv_debug_line,
1230                         sv->sv_debug_inpad ? "for" : "by",
1231                         sv->sv_debug_optype ?
1232                             PL_op_name[sv->sv_debug_optype]: "(none)",
1233                         PTR2UV(sv->sv_debug_parent),
1234                         sv->sv_debug_serial
1235                     );
1236 #ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
1237                     Perl_dump_sv_child(aTHX_ sv);
1238 #endif
1239                 }
1240             }
1241         }
1242     }
1243 #ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
1244     {
1245         int status;
1246         fd_set rset;
1247         /* Wait for up to 4 seconds for child to terminate.
1248            This seems to be the least effort way of timing out on reaping
1249            its exit status.  */
1250         struct timeval waitfor = {4, 0};
1251         int sock = PL_dumper_fd;
1252
1253         shutdown(sock, 1);
1254         FD_ZERO(&rset);
1255         FD_SET(sock, &rset);
1256         select(sock + 1, &rset, NULL, NULL, &waitfor);
1257         waitpid(child, &status, WNOHANG);
1258         close(sock);
1259     }
1260 #endif
1261 #endif
1262 #ifdef DEBUG_LEAKING_SCALARS_ABORT
1263     if (PL_sv_count)
1264         abort();
1265 #endif
1266     PL_sv_count = 0;
1267
1268 #if defined(PERLIO_LAYERS)
1269     /* No more IO - including error messages ! */
1270     PerlIO_cleanup(aTHX);
1271 #endif
1272
1273     /* sv_undef needs to stay immortal until after PerlIO_cleanup
1274        as currently layers use it rather than NULL as a marker
1275        for no arg - and will try and SvREFCNT_dec it.
1276      */
1277     SvREFCNT(&PL_sv_undef) = 0;
1278     SvREADONLY_off(&PL_sv_undef);
1279
1280     Safefree(PL_origfilename);
1281     PL_origfilename = NULL;
1282     Safefree(PL_reg_curpm);
1283     free_tied_hv_pool();
1284     Safefree(PL_op_mask);
1285     Safefree(PL_psig_name);
1286     PL_psig_name = (SV**)NULL;
1287     PL_psig_ptr = (SV**)NULL;
1288     {
1289         /* We need to NULL PL_psig_pend first, so that
1290            signal handlers know not to use it */
1291         int *psig_save = PL_psig_pend;
1292         PL_psig_pend = (int*)NULL;
1293         Safefree(psig_save);
1294     }
1295     nuke_stacks();
1296     TAINTING_set(FALSE);
1297     TAINT_WARN_set(FALSE);
1298     PL_hints = 0;               /* Reset hints. Should hints be per-interpreter ? */
1299
1300     DEBUG_P(debprofdump());
1301
1302     PL_debug = 0;
1303
1304 #ifdef USE_REENTRANT_API
1305     Perl_reentrant_free(aTHX);
1306 #endif
1307
1308     sv_free_arenas();
1309
1310     while (PL_regmatch_slab) {
1311         regmatch_slab  *s = PL_regmatch_slab;
1312         PL_regmatch_slab = PL_regmatch_slab->next;
1313         Safefree(s);
1314     }
1315
1316     /* As the absolutely last thing, free the non-arena SV for mess() */
1317
1318     if (PL_mess_sv) {
1319         /* we know that type == SVt_PVMG */
1320
1321         /* it could have accumulated taint magic */
1322         MAGIC* mg;
1323         MAGIC* moremagic;
1324         for (mg = SvMAGIC(PL_mess_sv); mg; mg = moremagic) {
1325             moremagic = mg->mg_moremagic;
1326             if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global
1327                 && mg->mg_len >= 0)
1328                 Safefree(mg->mg_ptr);
1329             Safefree(mg);
1330         }
1331
1332         /* we know that type >= SVt_PV */
1333         SvPV_free(PL_mess_sv);
1334         Safefree(SvANY(PL_mess_sv));
1335         Safefree(PL_mess_sv);
1336         PL_mess_sv = NULL;
1337     }
1338     return STATUS_EXIT;
1339 }
1340
1341 /*
1342 =for apidoc perl_free
1343
1344 Releases a Perl interpreter.  See L<perlembed>.
1345
1346 =cut
1347 */
1348
1349 void
1350 perl_free(pTHXx)
1351 {
1352     dVAR;
1353
1354     PERL_ARGS_ASSERT_PERL_FREE;
1355
1356     if (PL_veto_cleanup)
1357         return;
1358
1359 #ifdef PERL_TRACK_MEMPOOL
1360     {
1361         /*
1362          * Don't free thread memory if PERL_DESTRUCT_LEVEL is set to a non-zero
1363          * value as we're probably hunting memory leaks then
1364          */
1365         if (PL_perl_destruct_level == 0) {
1366             const U32 old_debug = PL_debug;
1367             /* Emulate the PerlHost behaviour of free()ing all memory allocated in this
1368                thread at thread exit.  */
1369             if (DEBUG_m_TEST) {
1370                 PerlIO_puts(Perl_debug_log, "Disabling memory debugging as we "
1371                             "free this thread's memory\n");
1372                 PL_debug &= ~ DEBUG_m_FLAG;
1373             }
1374             while(aTHXx->Imemory_debug_header.next != &(aTHXx->Imemory_debug_header)){
1375                 char * next = (char *)(aTHXx->Imemory_debug_header.next);
1376                 Malloc_t ptr = PERL_MEMORY_DEBUG_HEADER_SIZE + next;
1377                 safesysfree(ptr);
1378             }
1379             PL_debug = old_debug;
1380         }
1381     }
1382 #endif
1383
1384 #if defined(WIN32) || defined(NETWARE)
1385 #  if defined(PERL_IMPLICIT_SYS)
1386     {
1387 #    ifdef NETWARE
1388         void *host = nw_internal_host;
1389         PerlMem_free(aTHXx);
1390         nw_delete_internal_host(host);
1391 #    else
1392         void *host = w32_internal_host;
1393         PerlMem_free(aTHXx);
1394         win32_delete_internal_host(host);
1395 #    endif
1396     }
1397 #  else
1398     PerlMem_free(aTHXx);
1399 #  endif
1400 #else
1401     PerlMem_free(aTHXx);
1402 #endif
1403 }
1404
1405 #if defined(USE_ITHREADS)
1406 /* provide destructors to clean up the thread key when libperl is unloaded */
1407 #ifndef WIN32 /* handled during DLL_PROCESS_DETACH in win32/perllib.c */
1408
1409 #if defined(__hpux) && !(defined(__ux_version) && __ux_version <= 1020) && !defined(__GNUC__)
1410 #pragma fini "perl_fini"
1411 #elif defined(__sun) && !defined(__GNUC__)
1412 #pragma fini (perl_fini)
1413 #endif
1414
1415 static void
1416 #if defined(__GNUC__)
1417 __attribute__((destructor))
1418 #endif
1419 perl_fini(void)
1420 {
1421     dVAR;
1422     if (
1423 #ifdef PERL_GLOBAL_STRUCT_PRIVATE
1424         my_vars &&
1425 #endif
1426         PL_curinterp && !PL_veto_cleanup)
1427         FREE_THREAD_KEY;
1428 }
1429
1430 #endif /* WIN32 */
1431 #endif /* THREADS */
1432
1433 void
1434 Perl_call_atexit(pTHX_ ATEXIT_t fn, void *ptr)
1435 {
1436     Renew(PL_exitlist, PL_exitlistlen+1, PerlExitListEntry);
1437     PL_exitlist[PL_exitlistlen].fn = fn;
1438     PL_exitlist[PL_exitlistlen].ptr = ptr;
1439     ++PL_exitlistlen;
1440 }
1441
1442 /*
1443 =for apidoc perl_parse
1444
1445 Tells a Perl interpreter to parse a Perl script.  See L<perlembed>.
1446
1447 =cut
1448 */
1449
1450 #define SET_CURSTASH(newstash)                       \
1451         if (PL_curstash != newstash) {                \
1452             SvREFCNT_dec(PL_curstash);                 \
1453             PL_curstash = (HV *)SvREFCNT_inc(newstash); \
1454         }
1455
1456 int
1457 perl_parse(pTHXx_ XSINIT_t xsinit, int argc, char **argv, char **env)
1458 {
1459     dVAR;
1460     I32 oldscope;
1461     int ret;
1462     dJMPENV;
1463
1464     PERL_ARGS_ASSERT_PERL_PARSE;
1465 #ifndef MULTIPLICITY
1466     PERL_UNUSED_ARG(my_perl);
1467 #endif
1468 #if defined(USE_HASH_SEED) || defined(USE_HASH_SEED_EXPLICIT) || defined(USE_HASH_SEED_DEBUG)
1469     {
1470         const char * const s = PerlEnv_getenv("PERL_HASH_SEED_DEBUG");
1471
1472         if (s && (grok_atou(s, NULL) == 1)) {
1473             unsigned char *seed= PERL_HASH_SEED;
1474             unsigned char *seed_end= PERL_HASH_SEED + PERL_HASH_SEED_BYTES;
1475             PerlIO_printf(Perl_debug_log, "HASH_FUNCTION = %s HASH_SEED = 0x", PERL_HASH_FUNC);
1476             while (seed < seed_end) {
1477                 PerlIO_printf(Perl_debug_log, "%02x", *seed++);
1478             }
1479 #ifdef PERL_HASH_RANDOMIZE_KEYS
1480             PerlIO_printf(Perl_debug_log, " PERTURB_KEYS = %d (%s)",
1481                     PL_HASH_RAND_BITS_ENABLED,
1482                     PL_HASH_RAND_BITS_ENABLED == 0 ? "NO" : PL_HASH_RAND_BITS_ENABLED == 1 ? "RANDOM" : "DETERMINISTIC");
1483 #endif
1484             PerlIO_printf(Perl_debug_log, "\n");
1485         }
1486     }
1487 #endif /* #if defined(USE_HASH_SEED) || defined(USE_HASH_SEED_EXPLICIT) */
1488     PL_origargc = argc;
1489     PL_origargv = argv;
1490
1491     if (PL_origalen != 0) {
1492         PL_origalen = 1; /* don't use old PL_origalen if perl_parse() is called again */
1493     }
1494     else {
1495         /* Set PL_origalen be the sum of the contiguous argv[]
1496          * elements plus the size of the env in case that it is
1497          * contiguous with the argv[].  This is used in mg.c:Perl_magic_set()
1498          * as the maximum modifiable length of $0.  In the worst case
1499          * the area we are able to modify is limited to the size of
1500          * the original argv[0].  (See below for 'contiguous', though.)
1501          * --jhi */
1502          const char *s = NULL;
1503          int i;
1504          const UV mask = ~(UV)(PTRSIZE-1);
1505          /* Do the mask check only if the args seem like aligned. */
1506          const UV aligned =
1507            (mask < ~(UV)0) && ((PTR2UV(argv[0]) & mask) == PTR2UV(argv[0]));
1508
1509          /* See if all the arguments are contiguous in memory.  Note
1510           * that 'contiguous' is a loose term because some platforms
1511           * align the argv[] and the envp[].  If the arguments look
1512           * like non-aligned, assume that they are 'strictly' or
1513           * 'traditionally' contiguous.  If the arguments look like
1514           * aligned, we just check that they are within aligned
1515           * PTRSIZE bytes.  As long as no system has something bizarre
1516           * like the argv[] interleaved with some other data, we are
1517           * fine.  (Did I just evoke Murphy's Law?)  --jhi */
1518          if (PL_origargv && PL_origargc >= 1 && (s = PL_origargv[0])) {
1519               while (*s) s++;
1520               for (i = 1; i < PL_origargc; i++) {
1521                    if ((PL_origargv[i] == s + 1
1522 #ifdef OS2
1523                         || PL_origargv[i] == s + 2
1524 #endif 
1525                             )
1526                        ||
1527                        (aligned &&
1528                         (PL_origargv[i] >  s &&
1529                          PL_origargv[i] <=
1530                          INT2PTR(char *, PTR2UV(s + PTRSIZE) & mask)))
1531                         )
1532                    {
1533                         s = PL_origargv[i];
1534                         while (*s) s++;
1535                    }
1536                    else
1537                         break;
1538               }
1539          }
1540
1541 #ifndef PERL_USE_SAFE_PUTENV
1542          /* Can we grab env area too to be used as the area for $0? */
1543          if (s && PL_origenviron && !PL_use_safe_putenv) {
1544               if ((PL_origenviron[0] == s + 1)
1545                   ||
1546                   (aligned &&
1547                    (PL_origenviron[0] >  s &&
1548                     PL_origenviron[0] <=
1549                     INT2PTR(char *, PTR2UV(s + PTRSIZE) & mask)))
1550                  )
1551               {
1552 #ifndef OS2             /* ENVIRON is read by the kernel too. */
1553                    s = PL_origenviron[0];
1554                    while (*s) s++;
1555 #endif
1556                    my_setenv("NoNe  SuCh", NULL);
1557                    /* Force copy of environment. */
1558                    for (i = 1; PL_origenviron[i]; i++) {
1559                         if (PL_origenviron[i] == s + 1
1560                             ||
1561                             (aligned &&
1562                              (PL_origenviron[i] >  s &&
1563                               PL_origenviron[i] <=
1564                               INT2PTR(char *, PTR2UV(s + PTRSIZE) & mask)))
1565                            )
1566                         {
1567                              s = PL_origenviron[i];
1568                              while (*s) s++;
1569                         }
1570                         else
1571                              break;
1572                    }
1573               }
1574          }
1575 #endif /* !defined(PERL_USE_SAFE_PUTENV) */
1576
1577          PL_origalen = s ? s - PL_origargv[0] + 1 : 0;
1578     }
1579
1580     if (PL_do_undump) {
1581
1582         /* Come here if running an undumped a.out. */
1583
1584         PL_origfilename = savepv(argv[0]);
1585         PL_do_undump = FALSE;
1586         cxstack_ix = -1;                /* start label stack again */
1587         init_ids();
1588         assert (!TAINT_get);
1589         TAINT;
1590         set_caret_X();
1591         TAINT_NOT;
1592         init_postdump_symbols(argc,argv,env);
1593         return 0;
1594     }
1595
1596     if (PL_main_root) {
1597         op_free(PL_main_root);
1598         PL_main_root = NULL;
1599     }
1600     PL_main_start = NULL;
1601     SvREFCNT_dec(PL_main_cv);
1602     PL_main_cv = NULL;
1603
1604     time(&PL_basetime);
1605     oldscope = PL_scopestack_ix;
1606     PL_dowarn = G_WARN_OFF;
1607
1608     JMPENV_PUSH(ret);
1609     switch (ret) {
1610     case 0:
1611         parse_body(env,xsinit);
1612         if (PL_unitcheckav) {
1613             call_list(oldscope, PL_unitcheckav);
1614         }
1615         if (PL_checkav) {
1616             PERL_SET_PHASE(PERL_PHASE_CHECK);
1617             call_list(oldscope, PL_checkav);
1618         }
1619         ret = 0;
1620         break;
1621     case 1:
1622         STATUS_ALL_FAILURE;
1623         /* FALLTHROUGH */
1624     case 2:
1625         /* my_exit() was called */
1626         while (PL_scopestack_ix > oldscope)
1627             LEAVE;
1628         FREETMPS;
1629         SET_CURSTASH(PL_defstash);
1630         if (PL_unitcheckav) {
1631             call_list(oldscope, PL_unitcheckav);
1632         }
1633         if (PL_checkav) {
1634             PERL_SET_PHASE(PERL_PHASE_CHECK);
1635             call_list(oldscope, PL_checkav);
1636         }
1637         ret = STATUS_EXIT;
1638         break;
1639     case 3:
1640         PerlIO_printf(Perl_error_log, "panic: top_env\n");
1641         ret = 1;
1642         break;
1643     }
1644     JMPENV_POP;
1645     return ret;
1646 }
1647
1648 /* This needs to stay in perl.c, as perl.c is compiled with different flags for
1649    miniperl, and we need to see those flags reflected in the values here.  */
1650
1651 /* What this returns is subject to change.  Use the public interface in Config.
1652  */
1653 static void
1654 S_Internals_V(pTHX_ CV *cv)
1655 {
1656     dXSARGS;
1657 #ifdef LOCAL_PATCH_COUNT
1658     const int local_patch_count = LOCAL_PATCH_COUNT;
1659 #else
1660     const int local_patch_count = 0;
1661 #endif
1662     const int entries = 3 + local_patch_count;
1663     int i;
1664     static const char non_bincompat_options[] = 
1665 #  ifdef DEBUGGING
1666                              " DEBUGGING"
1667 #  endif
1668 #  ifdef NO_MATHOMS
1669                              " NO_MATHOMS"
1670 #  endif
1671 #  ifdef NO_HASH_SEED
1672                              " NO_HASH_SEED"
1673 #  endif
1674 #  ifdef NO_TAINT_SUPPORT
1675                              " NO_TAINT_SUPPORT"
1676 #  endif
1677 #  ifdef PERL_BOOL_AS_CHAR
1678                              " PERL_BOOL_AS_CHAR"
1679 #  endif
1680 #  ifdef PERL_DISABLE_PMC
1681                              " PERL_DISABLE_PMC"
1682 #  endif
1683 #  ifdef PERL_DONT_CREATE_GVSV
1684                              " PERL_DONT_CREATE_GVSV"
1685 #  endif
1686 #  ifdef PERL_EXTERNAL_GLOB
1687                              " PERL_EXTERNAL_GLOB"
1688 #  endif
1689 #  ifdef PERL_HASH_FUNC_SIPHASH
1690                              " PERL_HASH_FUNC_SIPHASH"
1691 #  endif
1692 #  ifdef PERL_HASH_FUNC_SDBM
1693                              " PERL_HASH_FUNC_SDBM"
1694 #  endif
1695 #  ifdef PERL_HASH_FUNC_DJB2
1696                              " PERL_HASH_FUNC_DJB2"
1697 #  endif
1698 #  ifdef PERL_HASH_FUNC_SUPERFAST
1699                              " PERL_HASH_FUNC_SUPERFAST"
1700 #  endif
1701 #  ifdef PERL_HASH_FUNC_MURMUR3
1702                              " PERL_HASH_FUNC_MURMUR3"
1703 #  endif
1704 #  ifdef PERL_HASH_FUNC_ONE_AT_A_TIME
1705                              " PERL_HASH_FUNC_ONE_AT_A_TIME"
1706 #  endif
1707 #  ifdef PERL_HASH_FUNC_ONE_AT_A_TIME_HARD
1708                              " PERL_HASH_FUNC_ONE_AT_A_TIME_HARD"
1709 #  endif
1710 #  ifdef PERL_HASH_FUNC_ONE_AT_A_TIME_OLD
1711                              " PERL_HASH_FUNC_ONE_AT_A_TIME_OLD"
1712 #  endif
1713 #  ifdef PERL_IS_MINIPERL
1714                              " PERL_IS_MINIPERL"
1715 #  endif
1716 #  ifdef PERL_MALLOC_WRAP
1717                              " PERL_MALLOC_WRAP"
1718 #  endif
1719 #  ifdef PERL_MEM_LOG
1720                              " PERL_MEM_LOG"
1721 #  endif
1722 #  ifdef PERL_MEM_LOG_NOIMPL
1723                              " PERL_MEM_LOG_NOIMPL"
1724 #  endif
1725 #  ifdef PERL_NEW_COPY_ON_WRITE
1726                              " PERL_NEW_COPY_ON_WRITE"
1727 #  endif
1728 #  ifdef PERL_PERTURB_KEYS_DETERMINISTIC
1729                              " PERL_PERTURB_KEYS_DETERMINISTIC"
1730 #  endif
1731 #  ifdef PERL_PERTURB_KEYS_DISABLED
1732                              " PERL_PERTURB_KEYS_DISABLED"
1733 #  endif
1734 #  ifdef PERL_PERTURB_KEYS_RANDOM
1735                              " PERL_PERTURB_KEYS_RANDOM"
1736 #  endif
1737 #  ifdef PERL_PRESERVE_IVUV
1738                              " PERL_PRESERVE_IVUV"
1739 #  endif
1740 #  ifdef PERL_RELOCATABLE_INCPUSH
1741                              " PERL_RELOCATABLE_INCPUSH"
1742 #  endif
1743 #  ifdef PERL_USE_DEVEL
1744                              " PERL_USE_DEVEL"
1745 #  endif
1746 #  ifdef PERL_USE_SAFE_PUTENV
1747                              " PERL_USE_SAFE_PUTENV"
1748 #  endif
1749 #  ifdef UNLINK_ALL_VERSIONS
1750                              " UNLINK_ALL_VERSIONS"
1751 #  endif
1752 #  ifdef USE_ATTRIBUTES_FOR_PERLIO
1753                              " USE_ATTRIBUTES_FOR_PERLIO"
1754 #  endif
1755 #  ifdef USE_FAST_STDIO
1756                              " USE_FAST_STDIO"
1757 #  endif               
1758 #  ifdef USE_HASH_SEED_EXPLICIT
1759                              " USE_HASH_SEED_EXPLICIT"
1760 #  endif
1761 #  ifdef USE_LOCALE
1762                              " USE_LOCALE"
1763 #  endif
1764 #  ifdef USE_LOCALE_CTYPE
1765                              " USE_LOCALE_CTYPE"
1766 #  endif
1767 #  ifdef USE_PERL_ATOF
1768                              " USE_PERL_ATOF"
1769 #  endif               
1770 #  ifdef USE_SITECUSTOMIZE
1771                              " USE_SITECUSTOMIZE"
1772 #  endif               
1773         ;
1774     PERL_UNUSED_ARG(cv);
1775     PERL_UNUSED_VAR(items);
1776
1777     EXTEND(SP, entries);
1778
1779     PUSHs(sv_2mortal(newSVpv(PL_bincompat_options, 0)));
1780     PUSHs(Perl_newSVpvn_flags(aTHX_ non_bincompat_options,
1781                               sizeof(non_bincompat_options) - 1, SVs_TEMP));
1782
1783 #ifdef __DATE__
1784 #  ifdef __TIME__
1785     PUSHs(Perl_newSVpvn_flags(aTHX_
1786                               STR_WITH_LEN("Compiled at " __DATE__ " " __TIME__),
1787                               SVs_TEMP));
1788 #  else
1789     PUSHs(Perl_newSVpvn_flags(aTHX_ STR_WITH_LEN("Compiled on " __DATE__),
1790                               SVs_TEMP));
1791 #  endif
1792 #else
1793     PUSHs(&PL_sv_undef);
1794 #endif
1795
1796     for (i = 1; i <= local_patch_count; i++) {
1797         /* This will be an undef, if PL_localpatches[i] is NULL.  */
1798         PUSHs(sv_2mortal(newSVpv(PL_localpatches[i], 0)));
1799     }
1800
1801     XSRETURN(entries);
1802 }
1803
1804 #define INCPUSH_UNSHIFT                 0x01
1805 #define INCPUSH_ADD_OLD_VERS            0x02
1806 #define INCPUSH_ADD_VERSIONED_SUB_DIRS  0x04
1807 #define INCPUSH_ADD_ARCHONLY_SUB_DIRS   0x08
1808 #define INCPUSH_NOT_BASEDIR             0x10
1809 #define INCPUSH_CAN_RELOCATE            0x20
1810 #define INCPUSH_ADD_SUB_DIRS    \
1811     (INCPUSH_ADD_VERSIONED_SUB_DIRS|INCPUSH_ADD_ARCHONLY_SUB_DIRS)
1812
1813 STATIC void *
1814 S_parse_body(pTHX_ char **env, XSINIT_t xsinit)
1815 {
1816     dVAR;
1817     PerlIO *rsfp;
1818     int argc = PL_origargc;
1819     char **argv = PL_origargv;
1820     const char *scriptname = NULL;
1821     VOL bool dosearch = FALSE;
1822     char c;
1823     bool doextract = FALSE;
1824     const char *cddir = NULL;
1825 #ifdef USE_SITECUSTOMIZE
1826     bool minus_f = FALSE;
1827 #endif
1828     SV *linestr_sv = NULL;
1829     bool add_read_e_script = FALSE;
1830     U32 lex_start_flags = 0;
1831
1832     PERL_SET_PHASE(PERL_PHASE_START);
1833
1834     init_main_stash();
1835
1836     {
1837         const char *s;
1838     for (argc--,argv++; argc > 0; argc--,argv++) {
1839         if (argv[0][0] != '-' || !argv[0][1])
1840             break;
1841         s = argv[0]+1;
1842       reswitch:
1843         switch ((c = *s)) {
1844         case 'C':
1845 #ifndef PERL_STRICT_CR
1846         case '\r':
1847 #endif
1848         case ' ':
1849         case '0':
1850         case 'F':
1851         case 'a':
1852         case 'c':
1853         case 'd':
1854         case 'D':
1855         case 'h':
1856         case 'i':
1857         case 'l':
1858         case 'M':
1859         case 'm':
1860         case 'n':
1861         case 'p':
1862         case 's':
1863         case 'u':
1864         case 'U':
1865         case 'v':
1866         case 'W':
1867         case 'X':
1868         case 'w':
1869             if ((s = moreswitches(s)))
1870                 goto reswitch;
1871             break;
1872
1873         case 't':
1874 #if defined(SILENT_NO_TAINT_SUPPORT)
1875             /* silently ignore */
1876 #elif defined(NO_TAINT_SUPPORT)
1877             Perl_croak_nocontext("This perl was compiled without taint support. "
1878                        "Cowardly refusing to run with -t or -T flags");
1879 #else
1880             CHECK_MALLOC_TOO_LATE_FOR('t');
1881             if( !TAINTING_get ) {
1882                  TAINT_WARN_set(TRUE);
1883                  TAINTING_set(TRUE);
1884             }
1885 #endif
1886             s++;
1887             goto reswitch;
1888         case 'T':
1889 #if defined(SILENT_NO_TAINT_SUPPORT)
1890             /* silently ignore */
1891 #elif defined(NO_TAINT_SUPPORT)
1892             Perl_croak_nocontext("This perl was compiled without taint support. "
1893                        "Cowardly refusing to run with -t or -T flags");
1894 #else
1895             CHECK_MALLOC_TOO_LATE_FOR('T');
1896             TAINTING_set(TRUE);
1897             TAINT_WARN_set(FALSE);
1898 #endif
1899             s++;
1900             goto reswitch;
1901
1902         case 'E':
1903             PL_minus_E = TRUE;
1904             /* FALLTHROUGH */
1905         case 'e':
1906             forbid_setid('e', FALSE);
1907             if (!PL_e_script) {
1908                 PL_e_script = newSVpvs("");
1909                 add_read_e_script = TRUE;
1910             }
1911             if (*++s)
1912                 sv_catpv(PL_e_script, s);
1913             else if (argv[1]) {
1914                 sv_catpv(PL_e_script, argv[1]);
1915                 argc--,argv++;
1916             }
1917             else
1918                 Perl_croak(aTHX_ "No code specified for -%c", c);
1919             sv_catpvs(PL_e_script, "\n");
1920             break;
1921
1922         case 'f':
1923 #ifdef USE_SITECUSTOMIZE
1924             minus_f = TRUE;
1925 #endif
1926             s++;
1927             goto reswitch;
1928
1929         case 'I':       /* -I handled both here and in moreswitches() */
1930             forbid_setid('I', FALSE);
1931             if (!*++s && (s=argv[1]) != NULL) {
1932                 argc--,argv++;
1933             }
1934             if (s && *s) {
1935                 STRLEN len = strlen(s);
1936                 incpush(s, len, INCPUSH_ADD_SUB_DIRS|INCPUSH_ADD_OLD_VERS);
1937             }
1938             else
1939                 Perl_croak(aTHX_ "No directory specified for -I");
1940             break;
1941         case 'S':
1942             forbid_setid('S', FALSE);
1943             dosearch = TRUE;
1944             s++;
1945             goto reswitch;
1946         case 'V':
1947             {
1948                 SV *opts_prog;
1949
1950                 if (*++s != ':')  {
1951                     opts_prog = newSVpvs("use Config; Config::_V()");
1952                 }
1953                 else {
1954                     ++s;
1955                     opts_prog = Perl_newSVpvf(aTHX_
1956                                               "use Config; Config::config_vars(qw%c%s%c)",
1957                                               0, s, 0);
1958                     s += strlen(s);
1959                 }
1960                 Perl_av_create_and_push(aTHX_ &PL_preambleav, opts_prog);
1961                 /* don't look for script or read stdin */
1962                 scriptname = BIT_BUCKET;
1963                 goto reswitch;
1964             }
1965         case 'x':
1966             doextract = TRUE;
1967             s++;
1968             if (*s)
1969                 cddir = s;
1970             break;
1971         case 0:
1972             break;
1973         case '-':
1974             if (!*++s || isSPACE(*s)) {
1975                 argc--,argv++;
1976                 goto switch_end;
1977             }
1978             /* catch use of gnu style long options.
1979                Both of these exit immediately.  */
1980             if (strEQ(s, "version"))
1981                 minus_v();
1982             if (strEQ(s, "help"))
1983                 usage();
1984             s--;
1985             /* FALLTHROUGH */
1986         default:
1987             Perl_croak(aTHX_ "Unrecognized switch: -%s  (-h will show valid options)",s);
1988         }
1989     }
1990     }
1991
1992   switch_end:
1993
1994     {
1995         char *s;
1996
1997     if (
1998 #ifndef SECURE_INTERNAL_GETENV
1999         !TAINTING_get &&
2000 #endif
2001         (s = PerlEnv_getenv("PERL5OPT")))
2002     {
2003         while (isSPACE(*s))
2004             s++;
2005         if (*s == '-' && *(s+1) == 'T') {
2006 #if defined(SILENT_NO_TAINT_SUPPORT)
2007             /* silently ignore */
2008 #elif defined(NO_TAINT_SUPPORT)
2009             Perl_croak_nocontext("This perl was compiled without taint support. "
2010                        "Cowardly refusing to run with -t or -T flags");
2011 #else
2012             CHECK_MALLOC_TOO_LATE_FOR('T');
2013             TAINTING_set(TRUE);
2014             TAINT_WARN_set(FALSE);
2015 #endif
2016         }
2017         else {
2018             char *popt_copy = NULL;
2019             while (s && *s) {
2020                 const char *d;
2021                 while (isSPACE(*s))
2022                     s++;
2023                 if (*s == '-') {
2024                     s++;
2025                     if (isSPACE(*s))
2026                         continue;
2027                 }
2028                 d = s;
2029                 if (!*s)
2030                     break;
2031                 if (!strchr("CDIMUdmtwW", *s))
2032                     Perl_croak(aTHX_ "Illegal switch in PERL5OPT: -%c", *s);
2033                 while (++s && *s) {
2034                     if (isSPACE(*s)) {
2035                         if (!popt_copy) {
2036                             popt_copy = SvPVX(sv_2mortal(newSVpv(d,0)));
2037                             s = popt_copy + (s - d);
2038                             d = popt_copy;
2039                         }
2040                         *s++ = '\0';
2041                         break;
2042                     }
2043                 }
2044                 if (*d == 't') {
2045 #if defined(SILENT_NO_TAINT_SUPPORT)
2046             /* silently ignore */
2047 #elif defined(NO_TAINT_SUPPORT)
2048                     Perl_croak_nocontext("This perl was compiled without taint support. "
2049                                "Cowardly refusing to run with -t or -T flags");
2050 #else
2051                     if( !TAINTING_get) {
2052                         TAINT_WARN_set(TRUE);
2053                         TAINTING_set(TRUE);
2054                     }
2055 #endif
2056                 } else {
2057                     moreswitches(d);
2058                 }
2059             }
2060         }
2061     }
2062     }
2063
2064     /* Set $^X early so that it can be used for relocatable paths in @INC  */
2065     /* and for SITELIB_EXP in USE_SITECUSTOMIZE                            */
2066     assert (!TAINT_get);
2067     TAINT;
2068     set_caret_X();
2069     TAINT_NOT;
2070
2071 #if defined(USE_SITECUSTOMIZE)
2072     if (!minus_f) {
2073         /* The games with local $! are to avoid setting errno if there is no
2074            sitecustomize script.  "q%c...%c", 0, ..., 0 becomes "q\0...\0",
2075            ie a q() operator with a NUL byte as a the delimiter. This avoids
2076            problems with pathnames containing (say) '  */
2077 #  ifdef PERL_IS_MINIPERL
2078         AV *const inc = GvAV(PL_incgv);
2079         SV **const inc0 = inc ? av_fetch(inc, 0, FALSE) : NULL;
2080
2081         if (inc0) {
2082             /* if lib/buildcustomize.pl exists, it should not fail. If it does,
2083                it should be reported immediately as a build failure.  */
2084             (void)Perl_av_create_and_unshift_one(aTHX_ &PL_preambleav,
2085                                                  Perl_newSVpvf(aTHX_
2086                 "BEGIN { my $f = q%c%s%"SVf"/buildcustomize.pl%c; "
2087                         "do {local $!; -f $f }"
2088                         " and do $f || die $@ || qq '$f: $!' }",
2089                                 0, (TAINTING_get ? "./" : ""), SVfARG(*inc0), 0));
2090         }
2091 #  else
2092         /* SITELIB_EXP is a function call on Win32.  */
2093         const char *const raw_sitelib = SITELIB_EXP;
2094         if (raw_sitelib) {
2095             /* process .../.. if PERL_RELOCATABLE_INC is defined */
2096             SV *sitelib_sv = mayberelocate(raw_sitelib, strlen(raw_sitelib),
2097                                            INCPUSH_CAN_RELOCATE);
2098             const char *const sitelib = SvPVX(sitelib_sv);
2099             (void)Perl_av_create_and_unshift_one(aTHX_ &PL_preambleav,
2100                                                  Perl_newSVpvf(aTHX_
2101                                                                "BEGIN { do {local $!; -f q%c%s/sitecustomize.pl%c} && do q%c%s/sitecustomize.pl%c }",
2102                                                                0, SVfARG(sitelib), 0,
2103                                                                0, SVfARG(sitelib), 0));
2104             assert (SvREFCNT(sitelib_sv) == 1);
2105             SvREFCNT_dec(sitelib_sv);
2106         }
2107 #  endif
2108     }
2109 #endif
2110
2111     if (!scriptname)
2112         scriptname = argv[0];
2113     if (PL_e_script) {
2114         argc++,argv--;
2115         scriptname = BIT_BUCKET;        /* don't look for script or read stdin */
2116     }
2117     else if (scriptname == NULL) {
2118 #ifdef MSDOS
2119         if ( PerlLIO_isatty(PerlIO_fileno(PerlIO_stdin())) )
2120             moreswitches("h");
2121 #endif
2122         scriptname = "-";
2123     }
2124
2125     assert (!TAINT_get);
2126     init_perllib();
2127
2128     {
2129         bool suidscript = FALSE;
2130
2131         rsfp = open_script(scriptname, dosearch, &suidscript);
2132         if (!rsfp) {
2133             rsfp = PerlIO_stdin();
2134             lex_start_flags = LEX_DONT_CLOSE_RSFP;
2135         }
2136
2137         validate_suid(rsfp);
2138
2139 #ifndef PERL_MICRO
2140 #  if defined(SIGCHLD) || defined(SIGCLD)
2141         {
2142 #  ifndef SIGCHLD
2143 #    define SIGCHLD SIGCLD
2144 #  endif
2145             Sighandler_t sigstate = rsignal_state(SIGCHLD);
2146             if (sigstate == (Sighandler_t) SIG_IGN) {
2147                 Perl_ck_warner(aTHX_ packWARN(WARN_SIGNAL),
2148                                "Can't ignore signal CHLD, forcing to default");
2149                 (void)rsignal(SIGCHLD, (Sighandler_t)SIG_DFL);
2150             }
2151         }
2152 #  endif
2153 #endif
2154
2155         if (doextract) {
2156
2157             /* This will croak if suidscript is true, as -x cannot be used with
2158                setuid scripts.  */
2159             forbid_setid('x', suidscript);
2160             /* Hence you can't get here if suidscript is true */
2161
2162             linestr_sv = newSV_type(SVt_PV);
2163             lex_start_flags |= LEX_START_COPIED;
2164             find_beginning(linestr_sv, rsfp);
2165             if (cddir && PerlDir_chdir( (char *)cddir ) < 0)
2166                 Perl_croak(aTHX_ "Can't chdir to %s",cddir);
2167         }
2168     }
2169
2170     PL_main_cv = PL_compcv = MUTABLE_CV(newSV_type(SVt_PVCV));
2171     CvUNIQUE_on(PL_compcv);
2172
2173     CvPADLIST_set(PL_compcv, pad_new(0));
2174
2175     PL_isarev = newHV();
2176
2177     boot_core_PerlIO();
2178     boot_core_UNIVERSAL();
2179     boot_core_mro();
2180     newXS("Internals::V", S_Internals_V, __FILE__);
2181
2182     if (xsinit)
2183         (*xsinit)(aTHX);        /* in case linked C routines want magical variables */
2184 #ifndef PERL_MICRO
2185 #if defined(VMS) || defined(WIN32) || defined(DJGPP) || defined(__CYGWIN__) || defined(SYMBIAN)
2186     init_os_extras();
2187 #endif
2188 #endif
2189
2190 #ifdef USE_SOCKS
2191 #   ifdef HAS_SOCKS5_INIT
2192     socks5_init(argv[0]);
2193 #   else
2194     SOCKSinit(argv[0]);
2195 #   endif
2196 #endif
2197
2198     init_predump_symbols();
2199     /* init_postdump_symbols not currently designed to be called */
2200     /* more than once (ENV isn't cleared first, for example)     */
2201     /* But running with -u leaves %ENV & @ARGV undefined!    XXX */
2202     if (!PL_do_undump)
2203         init_postdump_symbols(argc,argv,env);
2204
2205     /* PL_unicode is turned on by -C, or by $ENV{PERL_UNICODE},
2206      * or explicitly in some platforms.
2207      * locale.c:Perl_init_i18nl10n() if the environment
2208      * look like the user wants to use UTF-8. */
2209 #if defined(__SYMBIAN32__)
2210     PL_unicode = PERL_UNICODE_STD_FLAG; /* See PERL_SYMBIAN_CONSOLE_UTF8. */
2211 #endif
2212 #  ifndef PERL_IS_MINIPERL
2213     if (PL_unicode) {
2214          /* Requires init_predump_symbols(). */
2215          if (!(PL_unicode & PERL_UNICODE_LOCALE_FLAG) || PL_utf8locale) {
2216               IO* io;
2217               PerlIO* fp;
2218               SV* sv;
2219
2220               /* Turn on UTF-8-ness on STDIN, STDOUT, STDERR
2221                * and the default open disciplines. */
2222               if ((PL_unicode & PERL_UNICODE_STDIN_FLAG) &&
2223                   PL_stdingv  && (io = GvIO(PL_stdingv)) &&
2224                   (fp = IoIFP(io)))
2225                    PerlIO_binmode(aTHX_ fp, IoTYPE(io), 0, ":utf8");
2226               if ((PL_unicode & PERL_UNICODE_STDOUT_FLAG) &&
2227                   PL_defoutgv && (io = GvIO(PL_defoutgv)) &&
2228                   (fp = IoOFP(io)))
2229                    PerlIO_binmode(aTHX_ fp, IoTYPE(io), 0, ":utf8");
2230               if ((PL_unicode & PERL_UNICODE_STDERR_FLAG) &&
2231                   PL_stderrgv && (io = GvIO(PL_stderrgv)) &&
2232                   (fp = IoOFP(io)))
2233                    PerlIO_binmode(aTHX_ fp, IoTYPE(io), 0, ":utf8");
2234               if ((PL_unicode & PERL_UNICODE_INOUT_FLAG) &&
2235                   (sv = GvSV(gv_fetchpvs("\017PEN", GV_ADD|GV_NOTQUAL,
2236                                          SVt_PV)))) {
2237                    U32 in  = PL_unicode & PERL_UNICODE_IN_FLAG;
2238                    U32 out = PL_unicode & PERL_UNICODE_OUT_FLAG;
2239                    if (in) {
2240                         if (out)
2241                              sv_setpvs(sv, ":utf8\0:utf8");
2242                         else
2243                              sv_setpvs(sv, ":utf8\0");
2244                    }
2245                    else if (out)
2246                         sv_setpvs(sv, "\0:utf8");
2247                    SvSETMAGIC(sv);
2248               }
2249          }
2250     }
2251 #endif
2252
2253     {
2254         const char *s;
2255     if ((s = PerlEnv_getenv("PERL_SIGNALS"))) {
2256          if (strEQ(s, "unsafe"))
2257               PL_signals |=  PERL_SIGNALS_UNSAFE_FLAG;
2258          else if (strEQ(s, "safe"))
2259               PL_signals &= ~PERL_SIGNALS_UNSAFE_FLAG;
2260          else
2261               Perl_croak(aTHX_ "PERL_SIGNALS illegal: \"%s\"", s);
2262     }
2263     }
2264
2265
2266     lex_start(linestr_sv, rsfp, lex_start_flags);
2267     SvREFCNT_dec(linestr_sv);
2268
2269     PL_subname = newSVpvs("main");
2270
2271     if (add_read_e_script)
2272         filter_add(read_e_script, NULL);
2273
2274     /* now parse the script */
2275
2276     SETERRNO(0,SS_NORMAL);
2277     if (yyparse(GRAMPROG) || PL_parser->error_count) {
2278         if (PL_minus_c)
2279             Perl_croak(aTHX_ "%s had compilation errors.\n", PL_origfilename);
2280         else {
2281             Perl_croak(aTHX_ "Execution of %s aborted due to compilation errors.\n",
2282                        PL_origfilename);
2283         }
2284     }
2285     CopLINE_set(PL_curcop, 0);
2286     SET_CURSTASH(PL_defstash);
2287     if (PL_e_script) {
2288         SvREFCNT_dec(PL_e_script);
2289         PL_e_script = NULL;
2290     }
2291
2292     if (PL_do_undump)
2293         my_unexec();
2294
2295     if (isWARN_ONCE) {
2296         SAVECOPFILE(PL_curcop);
2297         SAVECOPLINE(PL_curcop);
2298         gv_check(PL_defstash);
2299     }
2300
2301     LEAVE;
2302     FREETMPS;
2303
2304 #ifdef MYMALLOC
2305     {
2306         const char *s;
2307         if ((s=PerlEnv_getenv("PERL_DEBUG_MSTATS")) && grok_atou(s, NULL) >= 2)
2308             dump_mstats("after compilation:");
2309     }
2310 #endif
2311
2312     ENTER;
2313     PL_restartjmpenv = NULL;
2314     PL_restartop = 0;
2315     return NULL;
2316 }
2317
2318 /*
2319 =for apidoc perl_run
2320
2321 Tells a Perl interpreter to run.  See L<perlembed>.
2322
2323 =cut
2324 */
2325
2326 int
2327 perl_run(pTHXx)
2328 {
2329     I32 oldscope;
2330     int ret = 0;
2331     dJMPENV;
2332
2333     PERL_ARGS_ASSERT_PERL_RUN;
2334 #ifndef MULTIPLICITY
2335     PERL_UNUSED_ARG(my_perl);
2336 #endif
2337
2338     oldscope = PL_scopestack_ix;
2339 #ifdef VMS
2340     VMSISH_HUSHED = 0;
2341 #endif
2342
2343     JMPENV_PUSH(ret);
2344     switch (ret) {
2345     case 1:
2346         cxstack_ix = -1;                /* start context stack again */
2347         goto redo_body;
2348     case 0:                             /* normal completion */
2349  redo_body:
2350         run_body(oldscope);
2351         /* FALLTHROUGH */
2352     case 2:                             /* my_exit() */
2353         while (PL_scopestack_ix > oldscope)
2354             LEAVE;
2355         FREETMPS;
2356         SET_CURSTASH(PL_defstash);
2357         if (!(PL_exit_flags & PERL_EXIT_DESTRUCT_END) &&
2358             PL_endav && !PL_minus_c) {
2359             PERL_SET_PHASE(PERL_PHASE_END);
2360             call_list(oldscope, PL_endav);
2361         }
2362 #ifdef MYMALLOC
2363         if (PerlEnv_getenv("PERL_DEBUG_MSTATS"))
2364             dump_mstats("after execution:  ");
2365 #endif
2366         ret = STATUS_EXIT;
2367         break;
2368     case 3:
2369         if (PL_restartop) {
2370             POPSTACK_TO(PL_mainstack);
2371             goto redo_body;
2372         }
2373         PerlIO_printf(Perl_error_log, "panic: restartop in perl_run\n");
2374         FREETMPS;
2375         ret = 1;
2376         break;
2377     }
2378
2379     JMPENV_POP;
2380     return ret;
2381 }
2382
2383 STATIC void
2384 S_run_body(pTHX_ I32 oldscope)
2385 {
2386     DEBUG_r(PerlIO_printf(Perl_debug_log, "%s $` $& $' support (0x%x).\n",
2387                     PL_sawampersand ? "Enabling" : "Omitting",
2388                     (unsigned int)(PL_sawampersand)));
2389
2390     if (!PL_restartop) {
2391 #ifdef DEBUGGING
2392         if (DEBUG_x_TEST || DEBUG_B_TEST)
2393             dump_all_perl(!DEBUG_B_TEST);
2394         if (!DEBUG_q_TEST)
2395           PERL_DEBUG(PerlIO_printf(Perl_debug_log, "\nEXECUTING...\n\n"));
2396 #endif
2397
2398         if (PL_minus_c) {
2399             PerlIO_printf(Perl_error_log, "%s syntax OK\n", PL_origfilename);
2400             my_exit(0);
2401         }
2402         if (PERLDB_SINGLE && PL_DBsingle)
2403             PL_DBsingle_iv = 1;
2404         if (PL_initav) {
2405             PERL_SET_PHASE(PERL_PHASE_INIT);
2406             call_list(oldscope, PL_initav);
2407         }
2408 #ifdef PERL_DEBUG_READONLY_OPS
2409         if (PL_main_root && PL_main_root->op_slabbed)
2410             Slab_to_ro(OpSLAB(PL_main_root));
2411 #endif
2412     }
2413
2414     /* do it */
2415
2416     PERL_SET_PHASE(PERL_PHASE_RUN);
2417
2418     if (PL_restartop) {
2419         PL_restartjmpenv = NULL;
2420         PL_op = PL_restartop;
2421         PL_restartop = 0;
2422         CALLRUNOPS(aTHX);
2423     }
2424     else if (PL_main_start) {
2425         CvDEPTH(PL_main_cv) = 1;
2426         PL_op = PL_main_start;
2427         CALLRUNOPS(aTHX);
2428     }
2429     my_exit(0);
2430     NOT_REACHED; /* NOTREACHED */
2431 }
2432
2433 /*
2434 =head1 SV Manipulation Functions
2435
2436 =for apidoc p||get_sv
2437
2438 Returns the SV of the specified Perl scalar.  C<flags> are passed to
2439 C<gv_fetchpv>.  If C<GV_ADD> is set and the
2440 Perl variable does not exist then it will be created.  If C<flags> is zero
2441 and the variable does not exist then NULL is returned.
2442
2443 =cut
2444 */
2445
2446 SV*
2447 Perl_get_sv(pTHX_ const char *name, I32 flags)
2448 {
2449     GV *gv;
2450
2451     PERL_ARGS_ASSERT_GET_SV;
2452
2453     gv = gv_fetchpv(name, flags, SVt_PV);
2454     if (gv)
2455         return GvSV(gv);
2456     return NULL;
2457 }
2458
2459 /*
2460 =head1 Array Manipulation Functions
2461
2462 =for apidoc p||get_av
2463
2464 Returns the AV of the specified Perl global or package array with the given
2465 name (so it won't work on lexical variables).  C<flags> are passed 
2466 to C<gv_fetchpv>.  If C<GV_ADD> is set and the
2467 Perl variable does not exist then it will be created.  If C<flags> is zero
2468 and the variable does not exist then NULL is returned.
2469
2470 Perl equivalent: C<@{"$name"}>.
2471
2472 =cut
2473 */
2474
2475 AV*
2476 Perl_get_av(pTHX_ const char *name, I32 flags)
2477 {
2478     GV* const gv = gv_fetchpv(name, flags, SVt_PVAV);
2479
2480     PERL_ARGS_ASSERT_GET_AV;
2481
2482     if (flags)
2483         return GvAVn(gv);
2484     if (gv)
2485         return GvAV(gv);
2486     return NULL;
2487 }
2488
2489 /*
2490 =head1 Hash Manipulation Functions
2491
2492 =for apidoc p||get_hv
2493
2494 Returns the HV of the specified Perl hash.  C<flags> are passed to
2495 C<gv_fetchpv>.  If C<GV_ADD> is set and the
2496 Perl variable does not exist then it will be created.  If C<flags> is zero
2497 and the variable does not exist then NULL is returned.
2498
2499 =cut
2500 */
2501
2502 HV*
2503 Perl_get_hv(pTHX_ const char *name, I32 flags)
2504 {
2505     GV* const gv = gv_fetchpv(name, flags, SVt_PVHV);
2506
2507     PERL_ARGS_ASSERT_GET_HV;
2508
2509     if (flags)
2510         return GvHVn(gv);
2511     if (gv)
2512         return GvHV(gv);
2513     return NULL;
2514 }
2515
2516 /*
2517 =head1 CV Manipulation Functions
2518
2519 =for apidoc p||get_cvn_flags
2520
2521 Returns the CV of the specified Perl subroutine.  C<flags> are passed to
2522 C<gv_fetchpvn_flags>.  If C<GV_ADD> is set and the Perl subroutine does not
2523 exist then it will be declared (which has the same effect as saying
2524 C<sub name;>).  If C<GV_ADD> is not set and the subroutine does not exist
2525 then NULL is returned.
2526
2527 =for apidoc p||get_cv
2528
2529 Uses C<strlen> to get the length of C<name>, then calls C<get_cvn_flags>.
2530
2531 =cut
2532 */
2533
2534 CV*
2535 Perl_get_cvn_flags(pTHX_ const char *name, STRLEN len, I32 flags)
2536 {
2537     GV* const gv = gv_fetchpvn_flags(name, len, flags, SVt_PVCV);
2538
2539     PERL_ARGS_ASSERT_GET_CVN_FLAGS;
2540
2541     /* XXX this is probably not what they think they're getting.
2542      * It has the same effect as "sub name;", i.e. just a forward
2543      * declaration! */
2544     if ((flags & ~GV_NOADD_MASK) && !GvCVu(gv)) {
2545         return newSTUB(gv,0);
2546     }
2547     if (gv)
2548         return GvCVu(gv);
2549     return NULL;
2550 }
2551
2552 /* Nothing in core calls this now, but we can't replace it with a macro and
2553    move it to mathoms.c as a macro would evaluate name twice.  */
2554 CV*
2555 Perl_get_cv(pTHX_ const char *name, I32 flags)
2556 {
2557     PERL_ARGS_ASSERT_GET_CV;
2558
2559     return get_cvn_flags(name, strlen(name), flags);
2560 }
2561
2562 /* Be sure to refetch the stack pointer after calling these routines. */
2563
2564 /*
2565
2566 =head1 Callback Functions
2567
2568 =for apidoc p||call_argv
2569
2570 Performs a callback to the specified named and package-scoped Perl subroutine 
2571 with C<argv> (a NULL-terminated array of strings) as arguments.  See
2572 L<perlcall>.
2573
2574 Approximate Perl equivalent: C<&{"$sub_name"}(@$argv)>.
2575
2576 =cut
2577 */
2578
2579 I32
2580 Perl_call_argv(pTHX_ const char *sub_name, I32 flags, char **argv)
2581
2582                         /* See G_* flags in cop.h */
2583                         /* null terminated arg list */
2584 {
2585     dSP;
2586
2587     PERL_ARGS_ASSERT_CALL_ARGV;
2588
2589     PUSHMARK(SP);
2590     if (argv) {
2591         while (*argv) {
2592             mXPUSHs(newSVpv(*argv,0));
2593             argv++;
2594         }
2595         PUTBACK;
2596     }
2597     return call_pv(sub_name, flags);
2598 }
2599
2600 /*
2601 =for apidoc p||call_pv
2602
2603 Performs a callback to the specified Perl sub.  See L<perlcall>.
2604
2605 =cut
2606 */
2607
2608 I32
2609 Perl_call_pv(pTHX_ const char *sub_name, I32 flags)
2610                         /* name of the subroutine */
2611                         /* See G_* flags in cop.h */
2612 {
2613     PERL_ARGS_ASSERT_CALL_PV;
2614
2615     return call_sv(MUTABLE_SV(get_cv(sub_name, GV_ADD)), flags);
2616 }
2617
2618 /*
2619 =for apidoc p||call_method
2620
2621 Performs a callback to the specified Perl method.  The blessed object must
2622 be on the stack.  See L<perlcall>.
2623
2624 =cut
2625 */
2626
2627 I32
2628 Perl_call_method(pTHX_ const char *methname, I32 flags)
2629                         /* name of the subroutine */
2630                         /* See G_* flags in cop.h */
2631 {
2632     STRLEN len;
2633     SV* sv;
2634     PERL_ARGS_ASSERT_CALL_METHOD;
2635
2636     len = strlen(methname);
2637     sv = flags & G_METHOD_NAMED
2638         ? sv_2mortal(newSVpvn_share(methname, len,0))
2639         : newSVpvn_flags(methname, len, SVs_TEMP);
2640
2641     return call_sv(sv, flags | G_METHOD);
2642 }
2643
2644 /* May be called with any of a CV, a GV, or an SV containing the name. */
2645 /*
2646 =for apidoc p||call_sv
2647
2648 Performs a callback to the Perl sub whose name is in the SV.  See
2649 L<perlcall>.
2650
2651 =cut
2652 */
2653
2654 I32
2655 Perl_call_sv(pTHX_ SV *sv, VOL I32 flags)
2656                         /* See G_* flags in cop.h */
2657 {
2658     dVAR; dSP;
2659     LOGOP myop;         /* fake syntax tree node */
2660     METHOP method_op;
2661     I32 oldmark;
2662     VOL I32 retval = 0;
2663     I32 oldscope;
2664     bool oldcatch = CATCH_GET;
2665     int ret;
2666     OP* const oldop = PL_op;
2667     dJMPENV;
2668
2669     PERL_ARGS_ASSERT_CALL_SV;
2670
2671     if (flags & G_DISCARD) {
2672         ENTER;
2673         SAVETMPS;
2674     }
2675     if (!(flags & G_WANT)) {
2676         /* Backwards compatibility - as G_SCALAR was 0, it could be omitted.
2677          */
2678         flags |= G_SCALAR;
2679     }
2680
2681     Zero(&myop, 1, LOGOP);
2682     if (!(flags & G_NOARGS))
2683         myop.op_flags |= OPf_STACKED;
2684     myop.op_flags |= OP_GIMME_REVERSE(flags);
2685     SAVEOP();
2686     PL_op = (OP*)&myop;
2687
2688     EXTEND(PL_stack_sp, 1);
2689     if (!(flags & G_METHOD_NAMED))
2690         *++PL_stack_sp = sv;
2691     oldmark = TOPMARK;
2692     oldscope = PL_scopestack_ix;
2693
2694     if (PERLDB_SUB && PL_curstash != PL_debstash
2695            /* Handle first BEGIN of -d. */
2696           && (PL_DBcv || (PL_DBcv = GvCV(PL_DBsub)))
2697            /* Try harder, since this may have been a sighandler, thus
2698             * curstash may be meaningless. */
2699           && (SvTYPE(sv) != SVt_PVCV || CvSTASH((const CV *)sv) != PL_debstash)
2700           && !(flags & G_NODEBUG))
2701         myop.op_private |= OPpENTERSUB_DB;
2702
2703     if (flags & (G_METHOD|G_METHOD_NAMED)) {
2704         Zero(&method_op, 1, METHOP);
2705         method_op.op_next = (OP*)&myop;
2706         PL_op = (OP*)&method_op;
2707         if ( flags & G_METHOD_NAMED ) {
2708             method_op.op_ppaddr = PL_ppaddr[OP_METHOD_NAMED];
2709             method_op.op_type = OP_METHOD_NAMED;
2710             method_op.op_u.op_meth_sv = sv;
2711         } else {
2712             method_op.op_ppaddr = PL_ppaddr[OP_METHOD];
2713             method_op.op_type = OP_METHOD;
2714         }
2715         myop.op_ppaddr = PL_ppaddr[OP_ENTERSUB];
2716         myop.op_type = OP_ENTERSUB;
2717     }
2718
2719     if (!(flags & G_EVAL)) {
2720         CATCH_SET(TRUE);
2721         CALL_BODY_SUB((OP*)&myop);
2722         retval = PL_stack_sp - (PL_stack_base + oldmark);
2723         CATCH_SET(oldcatch);
2724     }
2725     else {
2726         myop.op_other = (OP*)&myop;
2727         PL_markstack_ptr--;
2728         create_eval_scope(flags|G_FAKINGEVAL);
2729         PL_markstack_ptr++;
2730
2731         JMPENV_PUSH(ret);
2732
2733         switch (ret) {
2734         case 0:
2735  redo_body:
2736             CALL_BODY_SUB((OP*)&myop);
2737             retval = PL_stack_sp - (PL_stack_base + oldmark);
2738             if (!(flags & G_KEEPERR)) {
2739                 CLEAR_ERRSV();
2740             }
2741             break;
2742         case 1:
2743             STATUS_ALL_FAILURE;
2744             /* FALLTHROUGH */
2745         case 2:
2746             /* my_exit() was called */
2747             SET_CURSTASH(PL_defstash);
2748             FREETMPS;
2749             JMPENV_POP;
2750             my_exit_jump();
2751             NOT_REACHED; /* NOTREACHED */
2752         case 3:
2753             if (PL_restartop) {
2754                 PL_restartjmpenv = NULL;
2755                 PL_op = PL_restartop;
2756                 PL_restartop = 0;
2757                 goto redo_body;
2758             }
2759             PL_stack_sp = PL_stack_base + oldmark;
2760             if ((flags & G_WANT) == G_ARRAY)
2761                 retval = 0;
2762             else {
2763                 retval = 1;
2764                 *++PL_stack_sp = &PL_sv_undef;
2765             }
2766             break;
2767         }
2768
2769         if (PL_scopestack_ix > oldscope)
2770             delete_eval_scope();
2771         JMPENV_POP;
2772     }
2773
2774     if (flags & G_DISCARD) {
2775         PL_stack_sp = PL_stack_base + oldmark;
2776         retval = 0;
2777         FREETMPS;
2778         LEAVE;
2779     }
2780     PL_op = oldop;
2781     return retval;
2782 }
2783
2784 /* Eval a string. The G_EVAL flag is always assumed. */
2785
2786 /*
2787 =for apidoc p||eval_sv
2788
2789 Tells Perl to C<eval> the string in the SV.  It supports the same flags
2790 as C<call_sv>, with the obvious exception of G_EVAL.  See L<perlcall>.
2791
2792 =cut
2793 */
2794
2795 I32
2796 Perl_eval_sv(pTHX_ SV *sv, I32 flags)
2797
2798                         /* See G_* flags in cop.h */
2799 {
2800     dVAR;
2801     dSP;
2802     UNOP myop;          /* fake syntax tree node */
2803     VOL I32 oldmark = SP - PL_stack_base;
2804     VOL I32 retval = 0;
2805     int ret;
2806     OP* const oldop = PL_op;
2807     dJMPENV;
2808
2809     PERL_ARGS_ASSERT_EVAL_SV;
2810
2811     if (flags & G_DISCARD) {
2812         ENTER;
2813         SAVETMPS;
2814     }
2815
2816     SAVEOP();
2817     PL_op = (OP*)&myop;
2818     Zero(&myop, 1, UNOP);
2819     EXTEND(PL_stack_sp, 1);
2820     *++PL_stack_sp = sv;
2821
2822     if (!(flags & G_NOARGS))
2823         myop.op_flags = OPf_STACKED;
2824     myop.op_type = OP_ENTEREVAL;
2825     myop.op_flags |= OP_GIMME_REVERSE(flags);
2826     if (flags & G_KEEPERR)
2827         myop.op_flags |= OPf_SPECIAL;
2828
2829     if (flags & G_RE_REPARSING)
2830         myop.op_private = (OPpEVAL_COPHH | OPpEVAL_RE_REPARSING);
2831
2832     /* fail now; otherwise we could fail after the JMPENV_PUSH but
2833      * before a PUSHEVAL, which corrupts the stack after a croak */
2834     TAINT_PROPER("eval_sv()");
2835
2836     JMPENV_PUSH(ret);
2837     switch (ret) {
2838     case 0:
2839  redo_body:
2840         if (PL_op == (OP*)(&myop)) {
2841             PL_op = PL_ppaddr[OP_ENTEREVAL](aTHX);
2842             if (!PL_op)
2843                 goto fail; /* failed in compilation */
2844         }
2845         CALLRUNOPS(aTHX);
2846         retval = PL_stack_sp - (PL_stack_base + oldmark);
2847         if (!(flags & G_KEEPERR)) {
2848             CLEAR_ERRSV();
2849         }
2850         break;
2851     case 1:
2852         STATUS_ALL_FAILURE;
2853         /* FALLTHROUGH */
2854     case 2:
2855         /* my_exit() was called */
2856         SET_CURSTASH(PL_defstash);
2857         FREETMPS;
2858         JMPENV_POP;
2859         my_exit_jump();
2860         NOT_REACHED; /* NOTREACHED */
2861     case 3:
2862         if (PL_restartop) {
2863             PL_restartjmpenv = NULL;
2864             PL_op = PL_restartop;
2865             PL_restartop = 0;
2866             goto redo_body;
2867         }
2868       fail:
2869         PL_stack_sp = PL_stack_base + oldmark;
2870         if ((flags & G_WANT) == G_ARRAY)
2871             retval = 0;
2872         else {
2873             retval = 1;
2874             *++PL_stack_sp = &PL_sv_undef;
2875         }
2876         break;
2877     }
2878
2879     JMPENV_POP;
2880     if (flags & G_DISCARD) {
2881         PL_stack_sp = PL_stack_base + oldmark;
2882         retval = 0;
2883         FREETMPS;
2884         LEAVE;
2885     }
2886     PL_op = oldop;
2887     return retval;
2888 }
2889
2890 /*
2891 =for apidoc p||eval_pv
2892
2893 Tells Perl to C<eval> the given string in scalar context and return an SV* result.
2894
2895 =cut
2896 */
2897
2898 SV*
2899 Perl_eval_pv(pTHX_ const char *p, I32 croak_on_error)
2900 {
2901     SV* sv = newSVpv(p, 0);
2902
2903     PERL_ARGS_ASSERT_EVAL_PV;
2904
2905     eval_sv(sv, G_SCALAR);
2906     SvREFCNT_dec(sv);
2907
2908     {
2909         dSP;
2910         sv = POPs;
2911         PUTBACK;
2912     }
2913
2914     /* just check empty string or undef? */
2915     if (croak_on_error) {
2916         SV * const errsv = ERRSV;
2917         if(SvTRUE_NN(errsv))
2918             /* replace with croak_sv? */
2919             Perl_croak_nocontext("%s", SvPV_nolen_const(errsv));
2920     }
2921
2922     return sv;
2923 }
2924
2925 /* Require a module. */
2926
2927 /*
2928 =head1 Embedding Functions
2929
2930 =for apidoc p||require_pv
2931
2932 Tells Perl to C<require> the file named by the string argument.  It is
2933 analogous to the Perl code C<eval "require '$file'">.  It's even
2934 implemented that way; consider using load_module instead.
2935
2936 =cut */
2937
2938 void
2939 Perl_require_pv(pTHX_ const char *pv)
2940 {
2941     dSP;
2942     SV* sv;
2943
2944     PERL_ARGS_ASSERT_REQUIRE_PV;
2945
2946     PUSHSTACKi(PERLSI_REQUIRE);
2947     sv = Perl_newSVpvf(aTHX_ "require q%c%s%c", 0, pv, 0);
2948     eval_sv(sv_2mortal(sv), G_DISCARD);
2949     POPSTACK;
2950 }
2951
2952 STATIC void
2953 S_usage(pTHX)           /* XXX move this out into a module ? */
2954 {
2955     /* This message really ought to be max 23 lines.
2956      * Removed -h because the user already knows that option. Others? */
2957
2958     /* Grouped as 6 lines per C string literal, to keep under the ANSI C 89
2959        minimum of 509 character string literals.  */
2960     static const char * const usage_msg[] = {
2961 "  -0[octal]         specify record separator (\\0, if no argument)\n"
2962 "  -a                autosplit mode with -n or -p (splits $_ into @F)\n"
2963 "  -C[number/list]   enables the listed Unicode features\n"
2964 "  -c                check syntax only (runs BEGIN and CHECK blocks)\n"
2965 "  -d[:debugger]     run program under debugger\n"
2966 "  -D[number/list]   set debugging flags (argument is a bit mask or alphabets)\n",
2967 "  -e program        one line of program (several -e's allowed, omit programfile)\n"
2968 "  -E program        like -e, but enables all optional features\n"
2969 "  -f                don't do $sitelib/sitecustomize.pl at startup\n"
2970 "  -F/pattern/       split() pattern for -a switch (//'s are optional)\n"
2971 "  -i[extension]     edit <> files in place (makes backup if extension supplied)\n"
2972 "  -Idirectory       specify @INC/#include directory (several -I's allowed)\n",
2973 "  -l[octal]         enable line ending processing, specifies line terminator\n"
2974 "  -[mM][-]module    execute \"use/no module...\" before executing program\n"
2975 "  -n                assume \"while (<>) { ... }\" loop around program\n"
2976 "  -p                assume loop like -n but print line also, like sed\n"
2977 "  -s                enable rudimentary parsing for switches after programfile\n"
2978 "  -S                look for programfile using PATH environment variable\n",
2979 "  -t                enable tainting warnings\n"
2980 "  -T                enable tainting checks\n"
2981 "  -u                dump core after parsing program\n"
2982 "  -U                allow unsafe operations\n"
2983 "  -v                print version, patchlevel and license\n"
2984 "  -V[:variable]     print configuration summary (or a single Config.pm variable)\n",
2985 "  -w                enable many useful warnings\n"
2986 "  -W                enable all warnings\n"
2987 "  -x[directory]     ignore text before #!perl line (optionally cd to directory)\n"
2988 "  -X                disable all warnings\n"
2989 "  \n"
2990 "Run 'perldoc perl' for more help with Perl.\n\n",
2991 NULL
2992 };
2993     const char * const *p = usage_msg;
2994     PerlIO *out = PerlIO_stdout();
2995
2996     PerlIO_printf(out,
2997                   "\nUsage: %s [switches] [--] [programfile] [arguments]\n",
2998                   PL_origargv[0]);
2999     while (*p)
3000         PerlIO_puts(out, *p++);
3001     my_exit(0);
3002 }
3003
3004 /* convert a string of -D options (or digits) into an int.
3005  * sets *s to point to the char after the options */
3006
3007 #ifdef DEBUGGING
3008 int
3009 Perl_get_debug_opts(pTHX_ const char **s, bool givehelp)
3010 {
3011     static const char * const usage_msgd[] = {
3012       " Debugging flag values: (see also -d)\n"
3013       "  p  Tokenizing and parsing (with v, displays parse stack)\n"
3014       "  s  Stack snapshots (with v, displays all stacks)\n"
3015       "  l  Context (loop) stack processing\n"
3016       "  t  Trace execution\n"
3017       "  o  Method and overloading resolution\n",
3018       "  c  String/numeric conversions\n"
3019       "  P  Print profiling info, source file input state\n"
3020       "  m  Memory and SV allocation\n"
3021       "  f  Format processing\n"
3022       "  r  Regular expression parsing and execution\n"
3023       "  x  Syntax tree dump\n",
3024       "  u  Tainting checks\n"
3025       "  H  Hash dump -- usurps values()\n"
3026       "  X  Scratchpad allocation\n"
3027       "  D  Cleaning up\n"
3028       "  S  Op slab allocation\n"
3029       "  T  Tokenising\n"
3030       "  R  Include reference counts of dumped variables (eg when using -Ds)\n",
3031       "  J  Do not s,t,P-debug (Jump over) opcodes within package DB\n"
3032       "  v  Verbose: use in conjunction with other flags\n"
3033       "  C  Copy On Write\n"
3034       "  A  Consistency checks on internal structures\n"
3035       "  q  quiet - currently only suppresses the 'EXECUTING' message\n"
3036       "  M  trace smart match resolution\n"
3037       "  B  dump suBroutine definitions, including special Blocks like BEGIN\n",
3038       "  L  trace some locale setting information--for Perl core development\n",
3039       NULL
3040     };
3041     int i = 0;
3042
3043     PERL_ARGS_ASSERT_GET_DEBUG_OPTS;
3044
3045     if (isALPHA(**s)) {
3046         /* if adding extra options, remember to update DEBUG_MASK */
3047         static const char debopts[] = "psltocPmfrxuUHXDSTRJvCAqMBL";
3048
3049         for (; isWORDCHAR(**s); (*s)++) {
3050             const char * const d = strchr(debopts,**s);
3051             if (d)
3052                 i |= 1 << (d - debopts);
3053             else if (ckWARN_d(WARN_DEBUGGING))
3054                 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
3055                     "invalid option -D%c, use -D'' to see choices\n", **s);
3056         }
3057     }
3058     else if (isDIGIT(**s)) {
3059         const char* e;
3060         i = grok_atou(*s, &e);
3061         if (e)
3062             *s = e;
3063         for (; isWORDCHAR(**s); (*s)++) ;
3064     }
3065     else if (givehelp) {
3066       const char *const *p = usage_msgd;
3067       while (*p) PerlIO_puts(PerlIO_stdout(), *p++);
3068     }
3069     return i;
3070 }
3071 #endif
3072
3073 /* This routine handles any switches that can be given during run */
3074
3075 const char *
3076 Perl_moreswitches(pTHX_ const char *s)
3077 {
3078     dVAR;
3079     UV rschar;
3080     const char option = *s; /* used to remember option in -m/-M code */
3081
3082     PERL_ARGS_ASSERT_MORESWITCHES;
3083
3084     switch (*s) {
3085     case '0':
3086     {
3087          I32 flags = 0;
3088          STRLEN numlen;
3089
3090          SvREFCNT_dec(PL_rs);
3091          if (s[1] == 'x' && s[2]) {
3092               const char *e = s+=2;
3093               U8 *tmps;
3094
3095               while (*e)
3096                 e++;
3097               numlen = e - s;
3098               flags = PERL_SCAN_SILENT_ILLDIGIT;
3099               rschar = (U32)grok_hex(s, &numlen, &flags, NULL);
3100               if (s + numlen < e) {
3101                    rschar = 0; /* Grandfather -0xFOO as -0 -xFOO. */
3102                    numlen = 0;
3103                    s--;
3104               }
3105               PL_rs = newSVpvs("");
3106               SvGROW(PL_rs, (STRLEN)(UNISKIP(rschar) + 1));
3107               tmps = (U8*)SvPVX(PL_rs);
3108               uvchr_to_utf8(tmps, rschar);
3109               SvCUR_set(PL_rs, UNISKIP(rschar));
3110               SvUTF8_on(PL_rs);
3111          }
3112          else {
3113               numlen = 4;
3114               rschar = (U32)grok_oct(s, &numlen, &flags, NULL);
3115               if (rschar & ~((U8)~0))
3116                    PL_rs = &PL_sv_undef;
3117               else if (!rschar && numlen >= 2)
3118                    PL_rs = newSVpvs("");
3119               else {
3120                    char ch = (char)rschar;
3121                    PL_rs = newSVpvn(&ch, 1);
3122               }
3123          }
3124          sv_setsv(get_sv("/", GV_ADD), PL_rs);
3125          return s + numlen;
3126     }
3127     case 'C':
3128         s++;
3129         PL_unicode = parse_unicode_opts( (const char **)&s );
3130         if (PL_unicode & PERL_UNICODE_UTF8CACHEASSERT_FLAG)
3131             PL_utf8cache = -1;
3132         return s;
3133     case 'F':
3134         PL_minus_a = TRUE;
3135         PL_minus_F = TRUE;
3136         PL_minus_n = TRUE;
3137         PL_splitstr = ++s;
3138         while (*s && !isSPACE(*s)) ++s;
3139         PL_splitstr = savepvn(PL_splitstr, s - PL_splitstr);
3140         return s;
3141     case 'a':
3142         PL_minus_a = TRUE;
3143         PL_minus_n = TRUE;
3144         s++;
3145         return s;
3146     case 'c':
3147         PL_minus_c = TRUE;
3148         s++;
3149         return s;
3150     case 'd':
3151         forbid_setid('d', FALSE);
3152         s++;
3153
3154         /* -dt indicates to the debugger that threads will be used */
3155         if (*s == 't' && !isWORDCHAR(s[1])) {
3156             ++s;
3157             my_setenv("PERL5DB_THREADED", "1");
3158         }
3159
3160         /* The following permits -d:Mod to accepts arguments following an =
3161            in the fashion that -MSome::Mod does. */
3162         if (*s == ':' || *s == '=') {
3163             const char *start;
3164             const char *end;
3165             SV *sv;
3166
3167             if (*++s == '-') {
3168                 ++s;
3169                 sv = newSVpvs("no Devel::");
3170             } else {
3171                 sv = newSVpvs("use Devel::");
3172             }
3173
3174             start = s;
3175             end = s + strlen(s);
3176
3177             /* We now allow -d:Module=Foo,Bar and -d:-Module */
3178             while(isWORDCHAR(*s) || *s==':') ++s;
3179             if (*s != '=')
3180                 sv_catpvn(sv, start, end - start);
3181             else {
3182                 sv_catpvn(sv, start, s-start);
3183                 /* Don't use NUL as q// delimiter here, this string goes in the
3184                  * environment. */
3185                 Perl_sv_catpvf(aTHX_ sv, " split(/,/,q{%s});", ++s);
3186             }
3187             s = end;
3188             my_setenv("PERL5DB", SvPV_nolen_const(sv));
3189             SvREFCNT_dec(sv);
3190         }
3191         if (!PL_perldb) {
3192             PL_perldb = PERLDB_ALL;
3193             init_debugger();
3194         }
3195         return s;
3196     case 'D':
3197     {   
3198 #ifdef DEBUGGING
3199         forbid_setid('D', FALSE);
3200         s++;
3201         PL_debug = get_debug_opts( (const char **)&s, 1) | DEBUG_TOP_FLAG;
3202 #else /* !DEBUGGING */
3203         if (ckWARN_d(WARN_DEBUGGING))
3204             Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
3205                    "Recompile perl with -DDEBUGGING to use -D switch (did you mean -d ?)\n");
3206         for (s++; isWORDCHAR(*s); s++) ;
3207 #endif
3208         return s;
3209     }   
3210     case 'h':
3211         usage();
3212     case 'i':
3213         Safefree(PL_inplace);
3214 #if defined(__CYGWIN__) /* do backup extension automagically */
3215         if (*(s+1) == '\0') {
3216         PL_inplace = savepvs(".bak");
3217         return s+1;
3218         }
3219 #endif /* __CYGWIN__ */
3220         {
3221             const char * const start = ++s;
3222             while (*s && !isSPACE(*s))
3223                 ++s;
3224
3225             PL_inplace = savepvn(start, s - start);
3226         }
3227         if (*s) {
3228             ++s;
3229             if (*s == '-')      /* Additional switches on #! line. */
3230                 s++;
3231         }
3232         return s;
3233     case 'I':   /* -I handled both here and in parse_body() */
3234         forbid_setid('I', FALSE);
3235         ++s;
3236         while (*s && isSPACE(*s))
3237             ++s;
3238         if (*s) {
3239             const char *e, *p;
3240             p = s;
3241             /* ignore trailing spaces (possibly followed by other switches) */
3242             do {
3243                 for (e = p; *e && !isSPACE(*e); e++) ;
3244                 p = e;
3245                 while (isSPACE(*p))
3246                     p++;
3247             } while (*p && *p != '-');
3248             incpush(s, e-s,
3249                     INCPUSH_ADD_SUB_DIRS|INCPUSH_ADD_OLD_VERS|INCPUSH_UNSHIFT);
3250             s = p;
3251             if (*s == '-')
3252                 s++;
3253         }
3254         else
3255             Perl_croak(aTHX_ "No directory specified for -I");
3256         return s;
3257     case 'l':
3258         PL_minus_l = TRUE;
3259         s++;
3260         if (PL_ors_sv) {
3261             SvREFCNT_dec(PL_ors_sv);
3262             PL_ors_sv = NULL;
3263         }
3264         if (isDIGIT(*s)) {
3265             I32 flags = 0;
3266             STRLEN numlen;
3267             PL_ors_sv = newSVpvs("\n");
3268             numlen = 3 + (*s == '0');
3269             *SvPVX(PL_ors_sv) = (char)grok_oct(s, &numlen, &flags, NULL);
3270             s += numlen;
3271         }
3272         else {
3273             if (RsPARA(PL_rs)) {
3274                 PL_ors_sv = newSVpvs("\n\n");
3275             }
3276             else {
3277                 PL_ors_sv = newSVsv(PL_rs);
3278             }
3279         }
3280         return s;
3281     case 'M':
3282         forbid_setid('M', FALSE);       /* XXX ? */
3283         /* FALLTHROUGH */
3284     case 'm':
3285         forbid_setid('m', FALSE);       /* XXX ? */
3286         if (*++s) {
3287             const char *start;
3288             const char *end;
3289             SV *sv;
3290             const char *use = "use ";
3291             bool colon = FALSE;
3292             /* -M-foo == 'no foo'       */
3293             /* Leading space on " no " is deliberate, to make both
3294                possibilities the same length.  */
3295             if (*s == '-') { use = " no "; ++s; }
3296             sv = newSVpvn(use,4);
3297             start = s;
3298             /* We allow -M'Module qw(Foo Bar)'  */
3299             while(isWORDCHAR(*s) || *s==':') {
3300                 if( *s++ == ':' ) {
3301                     if( *s == ':' ) 
3302                         s++;
3303                     else
3304                         colon = TRUE;
3305                 }
3306             }
3307             if (s == start)
3308                 Perl_croak(aTHX_ "Module name required with -%c option",
3309                                     option);
3310             if (colon) 
3311                 Perl_croak(aTHX_ "Invalid module name %.*s with -%c option: "
3312                                     "contains single ':'",
3313                                     (int)(s - start), start, option);
3314             end = s + strlen(s);
3315             if (*s != '=') {
3316                 sv_catpvn(sv, start, end - start);
3317                 if (option == 'm') {
3318                     if (*s != '\0')
3319                         Perl_croak(aTHX_ "Can't use '%c' after -mname", *s);
3320                     sv_catpvs( sv, " ()");
3321                 }
3322             } else {
3323                 sv_catpvn(sv, start, s-start);
3324                 /* Use NUL as q''-delimiter.  */
3325                 sv_catpvs(sv, " split(/,/,q\0");
3326                 ++s;
3327                 sv_catpvn(sv, s, end - s);
3328                 sv_catpvs(sv,  "\0)");
3329             }
3330             s = end;
3331             Perl_av_create_and_push(aTHX_ &PL_preambleav, sv);
3332         }
3333         else
3334             Perl_croak(aTHX_ "Missing argument to -%c", option);
3335         return s;
3336     case 'n':
3337         PL_minus_n = TRUE;
3338         s++;
3339         return s;
3340     case 'p':
3341         PL_minus_p = TRUE;
3342         s++;
3343         return s;
3344     case 's':
3345         forbid_setid('s', FALSE);
3346         PL_doswitches = TRUE;
3347         s++;
3348         return s;
3349     case 't':
3350     case 'T':
3351 #if defined(SILENT_NO_TAINT_SUPPORT)
3352             /* silently ignore */
3353 #elif defined(NO_TAINT_SUPPORT)
3354         Perl_croak_nocontext("This perl was compiled without taint support. "
3355                    "Cowardly refusing to run with -t or -T flags");
3356 #else
3357         if (!TAINTING_get)
3358             TOO_LATE_FOR(*s);
3359 #endif
3360         s++;
3361         return s;
3362     case 'u':
3363         PL_do_undump = TRUE;
3364         s++;
3365         return s;
3366     case 'U':
3367         PL_unsafe = TRUE;
3368         s++;
3369         return s;
3370     case 'v':
3371         minus_v();
3372     case 'w':
3373         if (! (PL_dowarn & G_WARN_ALL_MASK)) {
3374             PL_dowarn |= G_WARN_ON;
3375         }
3376         s++;
3377         return s;
3378     case 'W':
3379         PL_dowarn = G_WARN_ALL_ON|G_WARN_ON;
3380         if (!specialWARN(PL_compiling.cop_warnings))
3381             PerlMemShared_free(PL_compiling.cop_warnings);
3382         PL_compiling.cop_warnings = pWARN_ALL ;
3383         s++;
3384         return s;
3385     case 'X':
3386         PL_dowarn = G_WARN_ALL_OFF;
3387         if (!specialWARN(PL_compiling.cop_warnings))
3388             PerlMemShared_free(PL_compiling.cop_warnings);
3389         PL_compiling.cop_warnings = pWARN_NONE ;
3390         s++;
3391         return s;
3392     case '*':
3393     case ' ':
3394         while( *s == ' ' )
3395           ++s;
3396         if (s[0] == '-')        /* Additional switches on #! line. */
3397             return s+1;
3398         break;
3399     case '-':
3400     case 0:
3401 #if defined(WIN32) || !defined(PERL_STRICT_CR)
3402     case '\r':
3403 #endif
3404     case '\n':
3405     case '\t':
3406         break;
3407 #ifdef ALTERNATE_SHEBANG
3408     case 'S':                   /* OS/2 needs -S on "extproc" line. */
3409         break;
3410 #endif
3411     case 'e': case 'f': case 'x': case 'E':
3412 #ifndef ALTERNATE_SHEBANG
3413     case 'S':
3414 #endif
3415     case 'V':
3416         Perl_croak(aTHX_ "Can't emulate -%.1s on #! line",s);
3417     default:
3418         Perl_croak(aTHX_
3419             "Unrecognized switch: -%.1s  (-h will show valid options)",s
3420         );
3421     }
3422     return NULL;
3423 }
3424
3425
3426 STATIC void
3427 S_minus_v(pTHX)
3428 {
3429         PerlIO * PIO_stdout;
3430         {
3431             const char * const level_str = "v" PERL_VERSION_STRING;
3432             const STRLEN level_len = sizeof("v" PERL_VERSION_STRING)-1;
3433 #ifdef PERL_PATCHNUM
3434             SV* level;
3435 #  ifdef PERL_GIT_UNCOMMITTED_CHANGES
3436             static const char num [] = PERL_PATCHNUM "*";
3437 #  else
3438             static const char num [] = PERL_PATCHNUM;
3439 #  endif
3440             {
3441                 const STRLEN num_len = sizeof(num)-1;
3442                 /* A very advanced compiler would fold away the strnEQ
3443                    and this whole conditional, but most (all?) won't do it.
3444                    SV level could also be replaced by with preprocessor
3445                    catenation.
3446                 */
3447                 if (num_len >= level_len && strnEQ(num,level_str,level_len)) {
3448                     /* per 46807d8e80, PERL_PATCHNUM is outside of the control
3449                        of the interp so it might contain format characters
3450                     */
3451                     level = newSVpvn(num, num_len);
3452                 } else {
3453                     level = Perl_newSVpvf_nocontext("%s (%s)", level_str, num);
3454                 }
3455             }
3456 #else
3457         SV* level = newSVpvn(level_str, level_len);
3458 #endif /* #ifdef PERL_PATCHNUM */
3459         PIO_stdout =  PerlIO_stdout();
3460             PerlIO_printf(PIO_stdout,
3461                 "\nThis is perl "       STRINGIFY(PERL_REVISION)
3462                 ", version "            STRINGIFY(PERL_VERSION)
3463                 ", subversion "         STRINGIFY(PERL_SUBVERSION)
3464                 " (%"SVf") built for "  ARCHNAME, SVfARG(level)
3465                 );
3466             SvREFCNT_dec_NN(level);
3467         }
3468 #if defined(LOCAL_PATCH_COUNT)
3469         if (LOCAL_PATCH_COUNT > 0)
3470             PerlIO_printf(PIO_stdout,
3471                           "\n(with %d registered patch%s, "
3472                           "see perl -V for more detail)",
3473                           LOCAL_PATCH_COUNT,
3474                           (LOCAL_PATCH_COUNT!=1) ? "es" : "");
3475 #endif
3476
3477         PerlIO_printf(PIO_stdout,
3478                       "\n\nCopyright 1987-2015, Larry Wall\n");
3479 #ifdef MSDOS
3480         PerlIO_printf(PIO_stdout,
3481                       "\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
3482 #endif
3483 #ifdef DJGPP
3484         PerlIO_printf(PIO_stdout,
3485                       "djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n"
3486                       "djgpp v2 port (perl5004+) by Laszlo Molnar, 1997-1999\n");
3487 #endif
3488 #ifdef OS2
3489         PerlIO_printf(PIO_stdout,
3490                       "\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
3491                       "Version 5 port Copyright (c) 1994-2002, Andreas Kaiser, Ilya Zakharevich\n");
3492 #endif
3493 #ifdef OEMVS
3494         PerlIO_printf(PIO_stdout,
3495                       "MVS (OS390) port by Mortice Kern Systems, 1997-1999\n");
3496 #endif
3497 #ifdef __VOS__
3498         PerlIO_printf(PIO_stdout,
3499                       "Stratus OpenVOS port by Paul.Green@stratus.com, 1997-2013\n");
3500 #endif
3501 #ifdef POSIX_BC
3502         PerlIO_printf(PIO_stdout,
3503                       "BS2000 (POSIX) port by Start Amadeus GmbH, 1998-1999\n");
3504 #endif
3505 #ifdef UNDER_CE
3506         PerlIO_printf(PIO_stdout,
3507                         "WINCE port by Rainer Keuchel, 2001-2002\n"
3508                         "Built on " __DATE__ " " __TIME__ "\n\n");
3509         wce_hitreturn();
3510 #endif
3511 #ifdef __SYMBIAN32__
3512         PerlIO_printf(PIO_stdout,
3513                       "Symbian port by Nokia, 2004-2005\n");
3514 #endif
3515 #ifdef BINARY_BUILD_NOTICE
3516         BINARY_BUILD_NOTICE;
3517 #endif
3518         PerlIO_printf(PIO_stdout,
3519                       "\n\
3520 Perl may be copied only under the terms of either the Artistic License or the\n\
3521 GNU General Public License, which may be found in the Perl 5 source kit.\n\n\
3522 Complete documentation for Perl, including FAQ lists, should be found on\n\
3523 this system using \"man perl\" or \"perldoc perl\".  If you have access to the\n\
3524 Internet, point your browser at http://www.perl.org/, the Perl Home Page.\n\n");
3525         my_exit(0);
3526 }
3527
3528 /* compliments of Tom Christiansen */
3529
3530 /* unexec() can be found in the Gnu emacs distribution */
3531 /* Known to work with -DUNEXEC and using unexelf.c from GNU emacs-20.2 */
3532
3533 #ifdef VMS
3534 #include <lib$routines.h>
3535 #endif
3536
3537 void
3538 Perl_my_unexec(pTHX)
3539 {
3540 #ifdef UNEXEC
3541     SV *    prog = newSVpv(BIN_EXP, 0);
3542     SV *    file = newSVpv(PL_origfilename, 0);
3543     int    status = 1;
3544     extern int etext;
3545
3546     sv_catpvs(prog, "/perl");
3547     sv_catpvs(file, ".perldump");
3548
3549     unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
3550     /* unexec prints msg to stderr in case of failure */
3551     PerlProc_exit(status);
3552 #else
3553     PERL_UNUSED_CONTEXT;
3554 #  ifdef VMS
3555      lib$signal(SS$_DEBUG);  /* ssdef.h #included from vmsish.h */
3556 #  elif defined(WIN32) || defined(__CYGWIN__)
3557     Perl_croak_nocontext("dump is not supported");
3558 #  else
3559     ABORT();            /* for use with undump */
3560 #  endif
3561 #endif
3562 }
3563
3564 /* initialize curinterp */
3565 STATIC void
3566 S_init_interp(pTHX)
3567 {
3568 #ifdef MULTIPLICITY
3569 #  define PERLVAR(prefix,var,type)
3570 #  define PERLVARA(prefix,var,n,type)
3571 #  if defined(PERL_IMPLICIT_CONTEXT)
3572 #    define PERLVARI(prefix,var,type,init)      aTHX->prefix##var = init;
3573 #    define PERLVARIC(prefix,var,type,init)     aTHX->prefix##var = init;
3574 #  else
3575 #    define PERLVARI(prefix,var,type,init)      PERL_GET_INTERP->var = init;
3576 #    define PERLVARIC(prefix,var,type,init)     PERL_GET_INTERP->var = init;
3577 #  endif
3578 #  include "intrpvar.h"
3579 #  undef PERLVAR
3580 #  undef PERLVARA
3581 #  undef PERLVARI
3582 #  undef PERLVARIC
3583 #else
3584 #  define PERLVAR(prefix,var,type)
3585 #  define PERLVARA(prefix,var,n,type)
3586 #  define PERLVARI(prefix,var,type,init)        PL_##var = init;
3587 #  define PERLVARIC(prefix,var,type,init)       PL_##var = init;
3588 #  include "intrpvar.h"
3589 #  undef PERLVAR
3590 #  undef PERLVARA
3591 #  undef PERLVARI
3592 #  undef PERLVARIC
3593 #endif
3594
3595 }
3596
3597 STATIC void
3598 S_init_main_stash(pTHX)
3599 {
3600     GV *gv;
3601
3602     PL_curstash = PL_defstash = (HV *)SvREFCNT_inc_simple_NN(newHV());
3603     /* We know that the string "main" will be in the global shared string
3604        table, so it's a small saving to use it rather than allocate another
3605        8 bytes.  */
3606     PL_curstname = newSVpvs_share("main");
3607     gv = gv_fetchpvs("main::", GV_ADD|GV_NOTQUAL, SVt_PVHV);
3608     /* If we hadn't caused another reference to "main" to be in the shared
3609        string table above, then it would be worth reordering these two,
3610        because otherwise all we do is delete "main" from it as a consequence
3611        of the SvREFCNT_dec, only to add it again with hv_name_set */
3612     SvREFCNT_dec(GvHV(gv));
3613     hv_name_set(PL_defstash, "main", 4, 0);
3614     GvHV(gv) = MUTABLE_HV(SvREFCNT_inc_simple(PL_defstash));
3615     SvREADONLY_on(gv);
3616     PL_incgv = gv_HVadd(gv_AVadd(gv_fetchpvs("INC", GV_ADD|GV_NOTQUAL,
3617                                              SVt_PVAV)));
3618     SvREFCNT_inc_simple_void(PL_incgv); /* Don't allow it to be freed */
3619     GvMULTI_on(PL_incgv);
3620     PL_hintgv = gv_fetchpvs("\010", GV_ADD|GV_NOTQUAL, SVt_PV); /* ^H */
3621     SvREFCNT_inc_simple_void(PL_hintgv);
3622     GvMULTI_on(PL_hintgv);
3623     PL_defgv = gv_fetchpvs("_", GV_ADD|GV_NOTQUAL, SVt_PVAV);
3624     SvREFCNT_inc_simple_void(PL_defgv);
3625     PL_errgv = gv_fetchpvs("@", GV_ADD|GV_NOTQUAL, SVt_PV);
3626     SvREFCNT_inc_simple_void(PL_errgv);
3627     GvMULTI_on(PL_errgv);
3628     PL_replgv = gv_fetchpvs("\022", GV_ADD|GV_NOTQUAL, SVt_PV); /* ^R */
3629     SvREFCNT_inc_simple_void(PL_replgv);
3630     GvMULTI_on(PL_replgv);
3631     (void)Perl_form(aTHX_ "%240s","");  /* Preallocate temp - for immediate signals. */
3632 #ifdef PERL_DONT_CREATE_GVSV
3633     (void)gv_SVadd(PL_errgv);
3634 #endif
3635     sv_grow(ERRSV, 240);        /* Preallocate - for immediate signals. */
3636     CLEAR_ERRSV();
3637     SET_CURSTASH(PL_defstash);
3638     CopSTASH_set(&PL_compiling, PL_defstash);
3639     PL_debstash = GvHV(gv_fetchpvs("DB::", GV_ADDMULTI, SVt_PVHV));
3640     PL_globalstash = GvHV(gv_fetchpvs("CORE::GLOBAL::", GV_ADDMULTI,
3641                                       SVt_PVHV));
3642     /* We must init $/ before switches are processed. */
3643     sv_setpvs(get_sv("/", GV_ADD), "\n");
3644 }
3645
3646 STATIC PerlIO *
3647 S_open_script(pTHX_ const char *scriptname, bool dosearch, bool *suidscript)
3648 {
3649     int fdscript = -1;
3650     PerlIO *rsfp = NULL;
3651     Stat_t tmpstatbuf;
3652     int fd;
3653
3654     PERL_ARGS_ASSERT_OPEN_SCRIPT;
3655
3656     if (PL_e_script) {
3657         PL_origfilename = savepvs("-e");
3658     }
3659     else {
3660         /* if find_script() returns, it returns a malloc()-ed value */
3661         scriptname = PL_origfilename = find_script(scriptname, dosearch, NULL, 1);
3662
3663         if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
3664             const char *s = scriptname + 8;
3665             const char* e;
3666             fdscript = grok_atou(s, &e);
3667             s = e;
3668             if (*s) {
3669                 /* PSz 18 Feb 04
3670                  * Tell apart "normal" usage of fdscript, e.g.
3671                  * with bash on FreeBSD:
3672                  *   perl <( echo '#!perl -DA'; echo 'print "$0\n"')
3673                  * from usage in suidperl.
3674                  * Does any "normal" usage leave garbage after the number???
3675                  * Is it a mistake to use a similar /dev/fd/ construct for
3676                  * suidperl?
3677                  */
3678                 *suidscript = TRUE;
3679                 /* PSz 20 Feb 04  
3680                  * Be supersafe and do some sanity-checks.
3681                  * Still, can we be sure we got the right thing?
3682                  */
3683                 if (*s != '/') {
3684                     Perl_croak(aTHX_ "Wrong syntax (suid) fd script name \"%s\"\n", s);
3685                 }
3686                 if (! *(s+1)) {
3687                     Perl_croak(aTHX_ "Missing (suid) fd script name\n");
3688                 }
3689                 scriptname = savepv(s + 1);
3690                 Safefree(PL_origfilename);
3691                 PL_origfilename = (char *)scriptname;
3692             }
3693         }
3694     }
3695
3696     CopFILE_free(PL_curcop);
3697     CopFILE_set(PL_curcop, PL_origfilename);
3698     if (*PL_origfilename == '-' && PL_origfilename[1] == '\0')
3699         scriptname = (char *)"";
3700     if (fdscript >= 0) {
3701         rsfp = PerlIO_fdopen(fdscript,PERL_SCRIPT_MODE);
3702     }
3703     else if (!*scriptname) {
3704         forbid_setid(0, *suidscript);
3705         return NULL;
3706     }
3707     else {
3708 #ifdef FAKE_BIT_BUCKET
3709         /* This hack allows one not to have /dev/null (or BIT_BUCKET as it
3710          * is called) and still have the "-e" work.  (Believe it or not,
3711          * a /dev/null is required for the "-e" to work because source
3712          * filter magic is used to implement it. ) This is *not* a general
3713          * replacement for a /dev/null.  What we do here is create a temp
3714          * file (an empty file), open up that as the script, and then
3715          * immediately close and unlink it.  Close enough for jazz. */ 
3716 #define FAKE_BIT_BUCKET_PREFIX "/tmp/perlnull-"
3717 #define FAKE_BIT_BUCKET_SUFFIX "XXXXXXXX"
3718 #define FAKE_BIT_BUCKET_TEMPLATE FAKE_BIT_BUCKET_PREFIX FAKE_BIT_BUCKET_SUFFIX
3719         char tmpname[sizeof(FAKE_BIT_BUCKET_TEMPLATE)] = {
3720             FAKE_BIT_BUCKET_TEMPLATE
3721         };
3722         const char * const err = "Failed to create a fake bit bucket";
3723         if (strEQ(scriptname, BIT_BUCKET)) {
3724 #ifdef HAS_MKSTEMP /* Hopefully mkstemp() is safe here. */
3725             int old_umask = umask(0600);
3726             int tmpfd = mkstemp(tmpname);
3727             umask(old_umask);
3728             if (tmpfd > -1) {
3729                 scriptname = tmpname;
3730                 close(tmpfd);
3731             } else
3732                 Perl_croak(aTHX_ err);
3733 #else
3734 #  ifdef HAS_MKTEMP
3735             scriptname = mktemp(tmpname);
3736             if (!scriptname)
3737                 Perl_croak(aTHX_ err);
3738 #  endif
3739 #endif
3740         }
3741 #endif
3742         rsfp = PerlIO_open(scriptname,PERL_SCRIPT_MODE);
3743 #ifdef FAKE_BIT_BUCKET
3744         if (memEQ(scriptname, FAKE_BIT_BUCKET_PREFIX,
3745                   sizeof(FAKE_BIT_BUCKET_PREFIX) - 1)
3746             && strlen(scriptname) == sizeof(tmpname) - 1) {
3747             unlink(scriptname);
3748         }
3749         scriptname = BIT_BUCKET;
3750 #endif
3751     }
3752     if (!rsfp) {
3753         /* PSz 16 Sep 03  Keep neat error message */
3754         if (PL_e_script)
3755             Perl_croak(aTHX_ "Can't open "BIT_BUCKET": %s\n", Strerror(errno));
3756         else
3757             Perl_croak(aTHX_ "Can't open perl script \"%s\": %s\n",
3758                     CopFILE(PL_curcop), Strerror(errno));
3759     }
3760     fd = PerlIO_fileno(rsfp);
3761 #if defined(HAS_FCNTL) && defined(F_SETFD)
3762     if (fd >= 0) {
3763         /* ensure close-on-exec */
3764         if (fcntl(fd, F_SETFD, 1) < 0) {
3765             Perl_croak(aTHX_ "Can't open perl script \"%s\": %s\n",
3766                        CopFILE(PL_curcop), Strerror(errno));
3767         }
3768     }
3769 #endif
3770
3771     if (fd < 0 ||
3772         (PerlLIO_fstat(fd, &tmpstatbuf) >= 0
3773          && S_ISDIR(tmpstatbuf.st_mode)))
3774         Perl_croak(aTHX_ "Can't open perl script \"%s\": %s\n",
3775             CopFILE(PL_curcop),
3776             Strerror(EISDIR));
3777
3778     return rsfp;
3779 }
3780
3781 /* Mention
3782  * I_SYSSTATVFS HAS_FSTATVFS
3783  * I_SYSMOUNT
3784  * I_STATFS     HAS_FSTATFS     HAS_GETFSSTAT
3785  * I_MNTENT     HAS_GETMNTENT   HAS_HASMNTOPT
3786  * here so that metaconfig picks them up. */
3787
3788
3789 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
3790 /* Don't even need this function.  */
3791 #else
3792 STATIC void
3793 S_validate_suid(pTHX_ PerlIO *rsfp)
3794 {
3795     const Uid_t  my_uid = PerlProc_getuid();
3796     const Uid_t my_euid = PerlProc_geteuid();
3797     const Gid_t  my_gid = PerlProc_getgid();
3798     const Gid_t my_egid = PerlProc_getegid();
3799
3800     PERL_ARGS_ASSERT_VALIDATE_SUID;
3801
3802     if (my_euid != my_uid || my_egid != my_gid) {       /* (suidperl doesn't exist, in fact) */
3803         dVAR;
3804         int fd = PerlIO_fileno(rsfp);
3805         if (fd < 0) {
3806             Perl_croak(aTHX_ "Illegal suidscript");
3807         } else {
3808             if (PerlLIO_fstat(fd, &PL_statbuf) < 0) {   /* may be either wrapped or real suid */
3809                 Perl_croak(aTHX_ "Illegal suidscript");
3810             }
3811         }
3812         if ((my_euid != my_uid && my_euid == PL_statbuf.st_uid && PL_statbuf.st_mode & S_ISUID)
3813             ||
3814             (my_egid != my_gid && my_egid == PL_statbuf.st_gid && PL_statbuf.st_mode & S_ISGID)
3815             )
3816             if (!PL_do_undump)
3817                 Perl_croak(aTHX_ "YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
3818 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
3819         /* not set-id, must be wrapped */
3820     }
3821 }
3822 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
3823
3824 STATIC void
3825 S_find_beginning(pTHX_ SV* linestr_sv, PerlIO *rsfp)
3826 {
3827     const char *s;
3828     const char *s2;
3829
3830     PERL_ARGS_ASSERT_FIND_BEGINNING;
3831
3832     /* skip forward in input to the real script? */
3833
3834     do {
3835         if ((s = sv_gets(linestr_sv, rsfp, 0)) == NULL)
3836             Perl_croak(aTHX_ "No Perl script found in input\n");
3837         s2 = s;
3838     } while (!(*s == '#' && s[1] == '!' && ((s = instr(s,"perl")) || (s = instr(s2,"PERL")))));
3839     PerlIO_ungetc(rsfp, '\n');          /* to keep line count right */
3840     while (*s && !(isSPACE (*s) || *s == '#')) s++;
3841     s2 = s;
3842     while (*s == ' ' || *s == '\t') s++;
3843     if (*s++ == '-') {
3844         while (isDIGIT(s2[-1]) || s2[-1] == '-' || s2[-1] == '.'
3845                || s2[-1] == '_') s2--;
3846         if (strnEQ(s2-4,"perl",4))
3847             while ((s = moreswitches(s)))
3848                 ;
3849     }
3850 }
3851
3852
3853 STATIC void
3854 S_init_ids(pTHX)
3855 {
3856     /* no need to do anything here any more if we don't
3857      * do tainting. */
3858 #ifndef NO_TAINT_SUPPORT
3859     const Uid_t my_uid = PerlProc_getuid();
3860     const Uid_t my_euid = PerlProc_geteuid();
3861     const Gid_t my_gid = PerlProc_getgid();
3862     const Gid_t my_egid = PerlProc_getegid();
3863
3864     PERL_UNUSED_CONTEXT;
3865
3866     /* Should not happen: */
3867     CHECK_MALLOC_TAINT(my_uid && (my_euid != my_uid || my_egid != my_gid));
3868     TAINTING_set( TAINTING_get | (my_uid && (my_euid != my_uid || my_egid != my_gid)) );
3869 #endif
3870     /* BUG */
3871     /* PSz 27 Feb 04
3872      * Should go by suidscript, not uid!=euid: why disallow
3873      * system("ls") in scripts run from setuid things?
3874      * Or, is this run before we check arguments and set suidscript?
3875      * What about SETUID_SCRIPTS_ARE_SECURE_NOW: could we use fdscript then?
3876      * (We never have suidscript, can we be sure to have fdscript?)
3877      * Or must then go by UID checks? See comments in forbid_setid also.
3878      */
3879 }
3880
3881 /* This is used very early in the lifetime of the program,
3882  * before even the options are parsed, so PL_tainting has
3883  * not been initialized properly.  */
3884 bool
3885 Perl_doing_taint(int argc, char *argv[], char *envp[])
3886 {
3887 #ifndef PERL_IMPLICIT_SYS
3888     /* If we have PERL_IMPLICIT_SYS we can't call getuid() et alia
3889      * before we have an interpreter-- and the whole point of this
3890      * function is to be called at such an early stage.  If you are on
3891      * a system with PERL_IMPLICIT_SYS but you do have a concept of
3892      * "tainted because running with altered effective ids', you'll
3893      * have to add your own checks somewhere in here.  The two most
3894      * known samples of 'implicitness' are Win32 and NetWare, neither
3895      * of which has much of concept of 'uids'. */
3896     Uid_t uid  = PerlProc_getuid();
3897     Uid_t euid = PerlProc_geteuid();
3898     Gid_t gid  = PerlProc_getgid();
3899     Gid_t egid = PerlProc_getegid();
3900     (void)envp;
3901
3902 #ifdef VMS
3903     uid  |=  gid << 16;
3904     euid |= egid << 16;
3905 #endif
3906     if (uid && (euid != uid || egid != gid))
3907         return 1;
3908 #endif /* !PERL_IMPLICIT_SYS */
3909     /* This is a really primitive check; environment gets ignored only
3910      * if -T are the first chars together; otherwise one gets
3911      *  "Too late" message. */
3912     if ( argc > 1 && argv[1][0] == '-'
3913          && isALPHA_FOLD_EQ(argv[1][1], 't'))
3914         return 1;
3915     return 0;
3916 }
3917
3918 /* Passing the flag as a single char rather than a string is a slight space
3919    optimisation.  The only message that isn't /^-.$/ is
3920    "program input from stdin", which is substituted in place of '\0', which
3921    could never be a command line flag.  */
3922 STATIC void
3923 S_forbid_setid(pTHX_ const char flag, const bool suidscript) /* g */
3924 {
3925     char string[3] = "-x";
3926     const char *message = "program input from stdin";
3927
3928     PERL_UNUSED_CONTEXT;
3929     if (flag) {
3930         string[1] = flag;
3931         message = string;
3932     }
3933
3934 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
3935     if (PerlProc_getuid() != PerlProc_geteuid())
3936         Perl_croak(aTHX_ "No %s allowed while running setuid", message);
3937     if (PerlProc_getgid() != PerlProc_getegid())
3938         Perl_croak(aTHX_ "No %s allowed while running setgid", message);
3939 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
3940     if (suidscript)
3941         Perl_croak(aTHX_ "No %s allowed with (suid) fdscript", message);
3942 }
3943
3944 void
3945 Perl_init_dbargs(pTHX)
3946 {
3947     AV *const args = PL_dbargs = GvAV(gv_AVadd((gv_fetchpvs("DB::args",
3948                                                             GV_ADDMULTI,
3949                                                             SVt_PVAV))));
3950
3951     if (AvREAL(args)) {
3952         /* Someone has already created it.
3953            It might have entries, and if we just turn off AvREAL(), they will
3954            "leak" until global destruction.  */
3955         av_clear(args);
3956         if (SvTIED_mg((const SV *)args, PERL_MAGIC_tied))
3957             Perl_croak(aTHX_ "Cannot set tied @DB::args");
3958     }
3959     AvREIFY_only(PL_dbargs);
3960 }
3961
3962 void
3963 Perl_init_debugger(pTHX)
3964 {
3965     HV * const ostash = PL_curstash;
3966     MAGIC *mg;
3967
3968     PL_curstash = (HV *)SvREFCNT_inc_simple(PL_debstash);
3969
3970     Perl_init_dbargs(aTHX);
3971     PL_DBgv = MUTABLE_GV(
3972         SvREFCNT_inc(gv_fetchpvs("DB::DB", GV_ADDMULTI, SVt_PVGV))
3973     );
3974     PL_DBline = MUTABLE_GV(
3975         SvREFCNT_inc(gv_fetchpvs("DB::dbline", GV_ADDMULTI, SVt_PVAV))
3976     );
3977     PL_DBsub = MUTABLE_GV(SvREFCNT_inc(
3978         gv_HVadd(gv_fetchpvs("DB::sub", GV_ADDMULTI, SVt_PVHV))
3979     ));
3980     PL_DBsingle = GvSV((gv_fetchpvs("DB::single", GV_ADDMULTI, SVt_PV)));
3981     if (!SvIOK(PL_DBsingle))
3982         sv_setiv(PL_DBsingle, 0);
3983     mg = sv_magicext(PL_DBsingle, NULL, PERL_MAGIC_debugvar, &PL_vtbl_debugvar, 0, 0);
3984     mg->mg_private = DBVARMG_SINGLE;
3985     SvSETMAGIC(PL_DBsingle);
3986
3987     PL_DBtrace = GvSV((gv_fetchpvs("DB::trace", GV_ADDMULTI, SVt_PV)));
3988     if (!SvIOK(PL_DBtrace))
3989         sv_setiv(PL_DBtrace, 0);
3990     mg = sv_magicext(PL_DBtrace, NULL, PERL_MAGIC_debugvar, &PL_vtbl_debugvar, 0, 0);
3991     mg->mg_private = DBVARMG_TRACE;
3992     SvSETMAGIC(PL_DBtrace);
3993
3994     PL_DBsignal = GvSV((gv_fetchpvs("DB::signal", GV_ADDMULTI, SVt_PV)));
3995     if (!SvIOK(PL_DBsignal))
3996         sv_setiv(PL_DBsignal, 0);
3997     mg = sv_magicext(PL_DBsignal, NULL, PERL_MAGIC_debugvar, &PL_vtbl_debugvar, 0, 0);
3998     mg->mg_private = DBVARMG_SIGNAL;
3999     SvSETMAGIC(PL_DBsignal);
4000
4001     SvREFCNT_dec(PL_curstash);
4002     PL_curstash = ostash;
4003 }
4004
4005 #ifndef STRESS_REALLOC
4006 #define REASONABLE(size) (size)
4007 #define REASONABLE_but_at_least(size,min) (size)
4008 #else
4009 #define REASONABLE(size) (1) /* unreasonable */
4010 #define REASONABLE_but_at_least(size,min) (min)
4011 #endif
4012
4013 void
4014 Perl_init_stacks(pTHX)
4015 {
4016     /* start with 128-item stack and 8K cxstack */
4017     PL_curstackinfo = new_stackinfo(REASONABLE(128),
4018                                  REASONABLE(8192/sizeof(PERL_CONTEXT) - 1));
4019     PL_curstackinfo->si_type = PERLSI_MAIN;
4020     PL_curstack = PL_curstackinfo->si_stack;
4021     PL_mainstack = PL_curstack;         /* remember in case we switch stacks */
4022
4023     PL_stack_base = AvARRAY(PL_curstack);
4024     PL_stack_sp = PL_stack_base;
4025     PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
4026
4027     Newx(PL_tmps_stack,REASONABLE(128),SV*);
4028     PL_tmps_floor = -1;
4029     PL_tmps_ix = -1;
4030     PL_tmps_max = REASONABLE(128);
4031
4032     Newx(PL_markstack,REASONABLE(32),I32);
4033     PL_markstack_ptr = PL_markstack;
4034     PL_markstack_max = PL_markstack + REASONABLE(32);
4035
4036     SET_MARK_OFFSET;
4037
4038     Newx(PL_scopestack,REASONABLE(32),I32);
4039 #ifdef DEBUGGING
4040     Newx(PL_scopestack_name,REASONABLE(32),const char*);
4041 #endif
4042     PL_scopestack_ix = 0;
4043     PL_scopestack_max = REASONABLE(32);
4044
4045     Newx(PL_savestack,REASONABLE_but_at_least(128,SS_MAXPUSH),ANY);
4046     PL_savestack_ix = 0;
4047     PL_savestack_max = REASONABLE_but_at_least(128,SS_MAXPUSH);
4048 }
4049
4050 #undef REASONABLE
4051
4052 STATIC void
4053 S_nuke_stacks(pTHX)
4054 {
4055     while (PL_curstackinfo->si_next)
4056         PL_curstackinfo = PL_curstackinfo->si_next;
4057     while (PL_curstackinfo) {
4058         PERL_SI *p = PL_curstackinfo->si_prev;
4059         /* curstackinfo->si_stack got nuked by sv_free_arenas() */
4060         Safefree(PL_curstackinfo->si_cxstack);
4061         Safefree(PL_curstackinfo);
4062         PL_curstackinfo = p;
4063     }
4064     Safefree(PL_tmps_stack);
4065     Safefree(PL_markstack);
4066     Safefree(PL_scopestack);
4067 #ifdef DEBUGGING
4068     Safefree(PL_scopestack_name);
4069 #endif
4070     Safefree(PL_savestack);
4071 }
4072
4073 void
4074 Perl_populate_isa(pTHX_ const char *name, STRLEN len, ...)
4075 {
4076     GV *const gv = gv_fetchpvn(name, len, GV_ADD | GV_ADDMULTI, SVt_PVAV);
4077     AV *const isa = GvAVn(gv);
4078     va_list args;
4079
4080     PERL_ARGS_ASSERT_POPULATE_ISA;
4081
4082     if(AvFILLp(isa) != -1)
4083         return;
4084
4085     /* NOTE: No support for tied ISA */
4086
4087     va_start(args, len);
4088     do {
4089         const char *const parent = va_arg(args, const char*);
4090         size_t parent_len;
4091
4092         if (!parent)
4093             break;
4094         parent_len = va_arg(args, size_t);
4095
4096         /* Arguments are supplied with a trailing ::  */
4097         assert(parent_len > 2);
4098         assert(parent[parent_len - 1] == ':');
4099         assert(parent[parent_len - 2] == ':');
4100         av_push(isa, newSVpvn(parent, parent_len - 2));
4101         (void) gv_fetchpvn(parent, parent_len, GV_ADD, SVt_PVGV);
4102     } while (1);
4103     va_end(args);
4104 }
4105
4106
4107 STATIC void
4108 S_init_predump_symbols(pTHX)
4109 {
4110     GV *tmpgv;
4111     IO *io;
4112
4113     sv_setpvs(get_sv("\"", GV_ADD), " ");
4114     PL_ofsgv = (GV*)SvREFCNT_inc(gv_fetchpvs(",", GV_ADD|GV_NOTQUAL, SVt_PV));
4115
4116
4117     /* Historically, PVIOs were blessed into IO::Handle, unless
4118        FileHandle was loaded, in which case they were blessed into
4119        that. Action at a distance.
4120        However, if we simply bless into IO::Handle, we break code
4121        that assumes that PVIOs will have (among others) a seek
4122        method. IO::File inherits from IO::Handle and IO::Seekable,
4123        and provides the needed methods. But if we simply bless into
4124        it, then we break code that assumed that by loading
4125        IO::Handle, *it* would work.
4126        So a compromise is to set up the correct @IO::File::ISA,
4127        so that code that does C<use IO::Handle>; will still work.
4128     */
4129                    
4130     Perl_populate_isa(aTHX_ STR_WITH_LEN("IO::File::ISA"),
4131                       STR_WITH_LEN("IO::Handle::"),
4132                       STR_WITH_LEN("IO::Seekable::"),
4133                       STR_WITH_LEN("Exporter::"),
4134                       NULL);
4135
4136     PL_stdingv = gv_fetchpvs("STDIN", GV_ADD|GV_NOTQUAL, SVt_PVIO);
4137     GvMULTI_on(PL_stdingv);
4138     io = GvIOp(PL_stdingv);
4139     IoTYPE(io) = IoTYPE_RDONLY;
4140     IoIFP(io) = PerlIO_stdin();
4141     tmpgv = gv_fetchpvs("stdin", GV_ADD|GV_NOTQUAL, SVt_PV);
4142     GvMULTI_on(tmpgv);
4143     GvIOp(tmpgv) = MUTABLE_IO(SvREFCNT_inc_simple(io));
4144
4145     tmpgv = gv_fetchpvs("STDOUT", GV_ADD|GV_NOTQUAL, SVt_PVIO);
4146     GvMULTI_on(tmpgv);
4147     io = GvIOp(tmpgv);
4148     IoTYPE(io) = IoTYPE_WRONLY;
4149     IoOFP(io) = IoIFP(io) = PerlIO_stdout();
4150     setdefout(tmpgv);
4151     tmpgv = gv_fetchpvs("stdout", GV_ADD|GV_NOTQUAL, SVt_PV);
4152     GvMULTI_on(tmpgv);
4153     GvIOp(tmpgv) = MUTABLE_IO(SvREFCNT_inc_simple(io));
4154
4155     PL_stderrgv = gv_fetchpvs("STDERR", GV_ADD|GV_NOTQUAL, SVt_PVIO);
4156     GvMULTI_on(PL_stderrgv);
4157     io = GvIOp(PL_stderrgv);
4158     IoTYPE(io) = IoTYPE_WRONLY;
4159     IoOFP(io) = IoIFP(io) = PerlIO_stderr();
4160     tmpgv = gv_fetchpvs("stderr", GV_ADD|GV_NOTQUAL, SVt_PV);
4161     GvMULTI_on(tmpgv);
4162     GvIOp(tmpgv) = MUTABLE_IO(SvREFCNT_inc_simple(io));
4163
4164     PL_statname = newSVpvs("");         /* last filename we did stat on */
4165 }
4166
4167 void
4168 Perl_init_argv_symbols(pTHX_ int argc, char **argv)
4169 {
4170     PERL_ARGS_ASSERT_INIT_ARGV_SYMBOLS;
4171
4172     argc--,argv++;      /* skip name of script */
4173     if (PL_doswitches) {
4174         for (; argc > 0 && **argv == '-'; argc--,argv++) {
4175             char *s;
4176             if (!argv[0][1])
4177                 break;
4178             if (argv[0][1] == '-' && !argv[0][2]) {
4179                 argc--,argv++;
4180                 break;
4181             }
4182             if ((s = strchr(argv[0], '='))) {
4183                 const char *const start_name = argv[0] + 1;
4184                 sv_setpv(GvSV(gv_fetchpvn_flags(start_name, s - start_name,
4185                                                 TRUE, SVt_PV)), s + 1);
4186             }
4187             else
4188                 sv_setiv(GvSV(gv_fetchpv(argv[0]+1, GV_ADD, SVt_PV)),1);
4189         }
4190     }
4191     if ((PL_argvgv = gv_fetchpvs("ARGV", GV_ADD|GV_NOTQUAL, SVt_PVAV))) {
4192         SvREFCNT_inc_simple_void_NN(PL_argvgv);
4193         GvMULTI_on(PL_argvgv);
4194         av_clear(GvAVn(PL_argvgv));
4195         for (; argc > 0; argc--,argv++) {
4196             SV * const sv = newSVpv(argv[0],0);
4197             av_push(GvAV(PL_argvgv),sv);
4198             if (!(PL_unicode & PERL_UNICODE_LOCALE_FLAG) || PL_utf8locale) {
4199                  if (PL_unicode & PERL_UNICODE_ARGV_FLAG)
4200                       SvUTF8_on(sv);
4201             }
4202             if (PL_unicode & PERL_UNICODE_WIDESYSCALLS_FLAG) /* Sarathy? */
4203                  (void)sv_utf8_decode(sv);
4204         }
4205     }
4206
4207     if (PL_inplace && (!PL_argvgv || AvFILL(GvAV(PL_argvgv)) == -1))
4208         Perl_ck_warner_d(aTHX_ packWARN(WARN_INPLACE),
4209                          "-i used with no filenames on the command line, "
4210                          "reading from STDIN");
4211 }
4212
4213 STATIC void
4214 S_init_postdump_symbols(pTHX_ int argc, char **argv, char **env)
4215 {
4216 #ifdef USE_ITHREADS
4217     dVAR;
4218 #endif
4219     GV* tmpgv;
4220
4221     PERL_ARGS_ASSERT_INIT_POSTDUMP_SYMBOLS;
4222
4223     PL_toptarget = newSV_type(SVt_PVIV);
4224     sv_setpvs(PL_toptarget, "");
4225     PL_bodytarget = newSV_type(SVt_PVIV);
4226     sv_setpvs(PL_bodytarget, "");
4227     PL_formtarget = PL_bodytarget;
4228
4229     TAINT;
4230
4231     init_argv_symbols(argc,argv);
4232
4233     if ((tmpgv = gv_fetchpvs("0", GV_ADD|GV_NOTQUAL, SVt_PV))) {
4234         sv_setpv(GvSV(tmpgv),PL_origfilename);
4235     }
4236     if ((PL_envgv = gv_fetchpvs("ENV", GV_ADD|GV_NOTQUAL, SVt_PVHV))) {
4237         HV *hv;
4238         bool env_is_not_environ;
4239         SvREFCNT_inc_simple_void_NN(PL_envgv);
4240         GvMULTI_on(PL_envgv);
4241         hv = GvHVn(PL_envgv);
4242         hv_magic(hv, NULL, PERL_MAGIC_env);
4243 #ifndef PERL_MICRO
4244 #ifdef USE_ENVIRON_ARRAY
4245         /* Note that if the supplied env parameter is actually a copy
4246            of the global environ then it may now point to free'd memory
4247            if the environment has been modified since. To avoid this
4248            problem we treat env==NULL as meaning 'use the default'
4249         */
4250         if (!env)
4251             env = environ;
4252         env_is_not_environ = env != environ;
4253         if (env_is_not_environ
4254 #  ifdef USE_ITHREADS
4255             && PL_curinterp == aTHX
4256 #  endif
4257            )
4258         {
4259             environ[0] = NULL;
4260         }
4261         if (env) {
4262           char *s, *old_var;
4263           SV *sv;
4264           for (; *env; env++) {
4265             old_var = *env;
4266
4267             if (!(s = strchr(old_var,'=')) || s == old_var)
4268                 continue;
4269
4270 #if defined(MSDOS) && !defined(DJGPP)
4271             *s = '\0';
4272             (void)strupr(old_var);
4273             *s = '=';
4274 #endif
4275             sv = newSVpv(s+1, 0);
4276             (void)hv_store(hv, old_var, s - old_var, sv, 0);
4277             if (env_is_not_environ)
4278                 mg_set(sv);
4279           }
4280       }
4281 #endif /* USE_ENVIRON_ARRAY */
4282 #endif /* !PERL_MICRO */
4283     }
4284     TAINT_NOT;
4285
4286     /* touch @F array to prevent spurious warnings 20020415 MJD */
4287     if (PL_minus_a) {
4288       (void) get_av("main::F", GV_ADD | GV_ADDMULTI);
4289     }
4290 }
4291
4292 STATIC void
4293 S_init_perllib(pTHX)
4294 {
4295 #ifndef VMS
4296     const char *perl5lib = NULL;
4297 #endif
4298     const char *s;
4299 #if defined(WIN32) && !defined(PERL_IS_MINIPERL)
4300     STRLEN len;
4301 #endif
4302
4303     if (!TAINTING_get) {
4304 #ifndef VMS
4305         perl5lib = PerlEnv_getenv("PERL5LIB");
4306 /*
4307  * It isn't possible to delete an environment variable with
4308  * PERL_USE_SAFE_PUTENV set unless unsetenv() is also available, so in that
4309  * case we treat PERL5LIB as undefined if it has a zero-length value.
4310  */
4311 #if defined(PERL_USE_SAFE_PUTENV) && ! defined(HAS_UNSETENV)
4312         if (perl5lib && *perl5lib != '\0')
4313 #else
4314         if (perl5lib)
4315 #endif
4316             incpush_use_sep(perl5lib, 0, INCPUSH_ADD_SUB_DIRS);
4317         else {
4318             s = PerlEnv_getenv("PERLLIB");
4319             if (s)
4320                 incpush_use_sep(s, 0, 0);
4321         }
4322 #else /* VMS */
4323         /* Treat PERL5?LIB as a possible search list logical name -- the
4324          * "natural" VMS idiom for a Unix path string.  We allow each
4325          * element to be a set of |-separated directories for compatibility.
4326          */
4327         char buf[256];
4328         int idx = 0;
4329         if (my_trnlnm("PERL5LIB",buf,0))
4330             do {
4331                 incpush_use_sep(buf, 0, INCPUSH_ADD_SUB_DIRS);
4332             } while (my_trnlnm("PERL5LIB",buf,++idx));
4333         else {
4334             while (my_trnlnm("PERLLIB",buf,idx++))
4335                 incpush_use_sep(buf, 0, 0);
4336         }
4337 #endif /* VMS */
4338     }
4339
4340 #ifndef PERL_IS_MINIPERL
4341     /* miniperl gets just -I..., the split of $ENV{PERL5LIB}, and "." in @INC
4342        (and not the architecture specific directories from $ENV{PERL5LIB}) */
4343
4344 /* Use the ~-expanded versions of APPLLIB (undocumented),
4345     SITEARCH, SITELIB, VENDORARCH, VENDORLIB, ARCHLIB and PRIVLIB
4346 */
4347 #ifdef APPLLIB_EXP
4348     S_incpush_use_sep(aTHX_ STR_WITH_LEN(APPLLIB_EXP),
4349                       INCPUSH_ADD_SUB_DIRS|INCPUSH_CAN_RELOCATE);
4350 #endif
4351
4352 #ifdef SITEARCH_EXP
4353     /* sitearch is always relative to sitelib on Windows for
4354      * DLL-based path intuition to work correctly */
4355 #  if !defined(WIN32)
4356         S_incpush_use_sep(aTHX_ STR_WITH_LEN(SITEARCH_EXP),
4357                           INCPUSH_CAN_RELOCATE);
4358 #  endif
4359 #endif
4360
4361 #ifdef SITELIB_EXP
4362 #  if defined(WIN32)
4363     /* this picks up sitearch as well */
4364         s = win32_get_sitelib(PERL_FS_VERSION, &len);
4365         if (s)
4366             incpush_use_sep(s, len, INCPUSH_ADD_SUB_DIRS|INCPUSH_CAN_RELOCATE);
4367 #  else
4368         S_incpush_use_sep(aTHX_ STR_WITH_LEN(SITELIB_EXP), INCPUSH_CAN_RELOCATE);
4369 #  endif
4370 #endif
4371
4372 #ifdef PERL_VENDORARCH_EXP
4373     /* vendorarch is always relative to vendorlib on Windows for
4374      * DLL-based path intuition to work correctly */
4375 #  if !defined(WIN32)
4376     S_incpush_use_sep(aTHX_ STR_WITH_LEN(PERL_VENDORARCH_EXP),
4377                       INCPUSH_CAN_RELOCATE);
4378 #  endif
4379 #endif
4380
4381 #ifdef PERL_VENDORLIB_EXP
4382 #  if defined(WIN32)
4383     /* this picks up vendorarch as well */
4384         s = win32_get_vendorlib(PERL_FS_VERSION, &len);
4385         if (s)
4386             incpush_use_sep(s, len, INCPUSH_ADD_SUB_DIRS|INCPUSH_CAN_RELOCATE);
4387 #  else
4388         S_incpush_use_sep(aTHX_ STR_WITH_LEN(PERL_VENDORLIB_EXP),
4389                           INCPUSH_CAN_RELOCATE);
4390 #  endif
4391 #endif
4392
4393 #ifdef ARCHLIB_EXP
4394     S_incpush_use_sep(aTHX_ STR_WITH_LEN(ARCHLIB_EXP), INCPUSH_CAN_RELOCATE);
4395 #endif
4396
4397 #ifndef PRIVLIB_EXP
4398 #  define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
4399 #endif
4400
4401 #if defined(WIN32)
4402     s = win32_get_privlib(PERL_FS_VERSION, &len);
4403     if (s)
4404         incpush_use_sep(s, len, INCPUSH_ADD_SUB_DIRS|INCPUSH_CAN_RELOCATE);
4405 #else
4406 #  ifdef NETWARE
4407     S_incpush_use_sep(aTHX_ PRIVLIB_EXP, 0, INCPUSH_CAN_RELOCATE);
4408 #  else
4409     S_incpush_use_sep(aTHX_ STR_WITH_LEN(PRIVLIB_EXP), INCPUSH_CAN_RELOCATE);
4410 #  endif
4411 #endif
4412
4413 #ifdef PERL_OTHERLIBDIRS
4414     S_incpush_use_sep(aTHX_ STR_WITH_LEN(PERL_OTHERLIBDIRS),
4415                       INCPUSH_ADD_VERSIONED_SUB_DIRS|INCPUSH_NOT_BASEDIR
4416                       |INCPUSH_CAN_RELOCATE);
4417 #endif
4418
4419     if (!TAINTING_get) {
4420 #ifndef VMS
4421 /*
4422  * It isn't possible to delete an environment variable with
4423  * PERL_USE_SAFE_PUTENV set unless unsetenv() is also available, so in that
4424  * case we treat PERL5LIB as undefined if it has a zero-length value.
4425  */
4426 #if defined(PERL_USE_SAFE_PUTENV) && ! defined(HAS_UNSETENV)
4427         if (perl5lib && *perl5lib != '\0')
4428 #else
4429         if (perl5lib)
4430 #endif
4431             incpush_use_sep(perl5lib, 0,
4432                             INCPUSH_ADD_OLD_VERS|INCPUSH_NOT_BASEDIR);
4433 #else /* VMS */
4434         /* Treat PERL5?LIB as a possible search list logical name -- the
4435          * "natural" VMS idiom for a Unix path string.  We allow each
4436          * element to be a set of |-separated directories for compatibility.
4437          */
4438         char buf[256];
4439         int idx = 0;
4440         if (my_trnlnm("PERL5LIB",buf,0))
4441             do {
4442                 incpush_use_sep(buf, 0,
4443                                 INCPUSH_ADD_OLD_VERS|INCPUSH_NOT_BASEDIR);
4444             } while (my_trnlnm("PERL5LIB",buf,++idx));
4445 #endif /* VMS */
4446     }
4447
4448 /* Use the ~-expanded versions of APPLLIB (undocumented),
4449     SITELIB and VENDORLIB for older versions
4450 */
4451 #ifdef APPLLIB_EXP
4452     S_incpush_use_sep(aTHX_ STR_WITH_LEN(APPLLIB_EXP), INCPUSH_ADD_OLD_VERS
4453                       |INCPUSH_NOT_BASEDIR|INCPUSH_CAN_RELOCATE);
4454 #endif
4455
4456 #if defined(SITELIB_STEM) && defined(PERL_INC_VERSION_LIST)
4457     /* Search for version-specific dirs below here */
4458     S_incpush_use_sep(aTHX_ STR_WITH_LEN(SITELIB_STEM),
4459                       INCPUSH_ADD_OLD_VERS|INCPUSH_CAN_RELOCATE);
4460 #endif
4461
4462
4463 #if defined(PERL_VENDORLIB_STEM) && defined(PERL_INC_VERSION_LIST)
4464     /* Search for version-specific dirs below here */
4465     S_incpush_use_sep(aTHX_ STR_WITH_LEN(PERL_VENDORLIB_STEM),
4466                       INCPUSH_ADD_OLD_VERS|INCPUSH_CAN_RELOCATE);
4467 #endif
4468
4469 #ifdef PERL_OTHERLIBDIRS
4470     S_incpush_use_sep(aTHX_ STR_WITH_LEN(PERL_OTHERLIBDIRS),
4471                       INCPUSH_ADD_OLD_VERS|INCPUSH_ADD_ARCHONLY_SUB_DIRS
4472                       |INCPUSH_CAN_RELOCATE);
4473 #endif
4474 #endif /* !PERL_IS_MINIPERL */
4475
4476     if (!TAINTING_get)
4477         S_incpush(aTHX_ STR_WITH_LEN("."), 0);
4478 }
4479
4480 #if defined(DOSISH) || defined(__SYMBIAN32__)
4481 #    define PERLLIB_SEP ';'
4482 #else
4483 #  if defined(VMS)
4484 #    define PERLLIB_SEP '|'
4485 #  else
4486 #    define PERLLIB_SEP ':'
4487 #  endif
4488 #endif
4489 #ifndef PERLLIB_MANGLE
4490 #  define PERLLIB_MANGLE(s,n) (s)
4491 #endif
4492
4493 #ifndef PERL_IS_MINIPERL
4494 /* Push a directory onto @INC if it exists.
4495    Generate a new SV if we do this, to save needing to copy the SV we push
4496    onto @INC  */
4497 STATIC SV *
4498 S_incpush_if_exists(pTHX_ AV *const av, SV *dir, SV *const stem)
4499 {
4500     Stat_t tmpstatbuf;
4501
4502     PERL_ARGS_ASSERT_INCPUSH_IF_EXISTS;
4503
4504     if (PerlLIO_stat(SvPVX_const(dir), &tmpstatbuf) >= 0 &&
4505         S_ISDIR(tmpstatbuf.st_mode)) {
4506         av_push(av, dir);
4507         dir = newSVsv(stem);
4508     } else {
4509         /* Truncate dir back to stem.  */
4510         SvCUR_set(dir, SvCUR(stem));
4511     }
4512     return dir;
4513 }
4514 #endif
4515
4516 STATIC SV *
4517 S_mayberelocate(pTHX_ const char *const dir, STRLEN len, U32 flags)
4518 {
4519     const U8 canrelocate = (U8)flags & INCPUSH_CAN_RELOCATE;
4520     SV *libdir;
4521
4522     PERL_ARGS_ASSERT_MAYBERELOCATE;
4523     assert(len > 0);
4524
4525     /* I am not convinced that this is valid when PERLLIB_MANGLE is
4526        defined to so something (in os2/os2.c), but the code has been
4527        this way, ignoring any possible changed of length, since
4528        760ac839baf413929cd31cc32ffd6dba6b781a81 (5.003_02) so I'll leave
4529        it be.  */
4530     libdir = newSVpvn(PERLLIB_MANGLE(dir, len), len);
4531
4532 #ifdef VMS
4533     {
4534         char *unix;
4535
4536         if ((unix = tounixspec_ts(SvPV(libdir,len),NULL)) != NULL) {
4537             len = strlen(unix);
4538             while (len > 1 && unix[len-1] == '/') len--;  /* Cosmetic */
4539             sv_usepvn(libdir,unix,len);
4540         }
4541         else
4542             PerlIO_printf(Perl_error_log,
4543                           "Failed to unixify @INC element \"%s\"\n",
4544                           SvPV_nolen_const(libdir));
4545     }
4546 #endif
4547
4548         /* Do the if() outside the #ifdef to avoid warnings about an unused
4549            parameter.  */
4550         if (canrelocate) {
4551 #ifdef PERL_RELOCATABLE_INC
4552         /*
4553          * Relocatable include entries are marked with a leading .../
4554          *
4555          * The algorithm is
4556          * 0: Remove that leading ".../"
4557          * 1: Remove trailing executable name (anything after the last '/')
4558          *    from the perl path to give a perl prefix
4559          * Then
4560          * While the @INC element starts "../" and the prefix ends with a real
4561          * directory (ie not . or ..) chop that real directory off the prefix
4562          * and the leading "../" from the @INC element. ie a logical "../"
4563          * cleanup
4564          * Finally concatenate the prefix and the remainder of the @INC element
4565          * The intent is that /usr/local/bin/perl and .../../lib/perl5
4566          * generates /usr/local/lib/perl5
4567          */
4568             const char *libpath = SvPVX(libdir);
4569             STRLEN libpath_len = SvCUR(libdir);
4570             if (libpath_len >= 4 && memEQ (libpath, ".../", 4)) {
4571                 /* Game on!  */
4572                 SV * const caret_X = get_sv("\030", 0);
4573                 /* Going to use the SV just as a scratch buffer holding a C
4574                    string:  */
4575                 SV *prefix_sv;
4576                 char *prefix;
4577                 char *lastslash;
4578
4579                 /* $^X is *the* source of taint if tainting is on, hence
4580                    SvPOK() won't be true.  */
4581                 assert(caret_X);
4582                 assert(SvPOKp(caret_X));
4583                 prefix_sv = newSVpvn_flags(SvPVX(caret_X), SvCUR(caret_X),
4584                                            SvUTF8(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 (TAINTING_get &&
4638                         (PerlProc_getuid() != PerlProc_geteuid() ||
4639                          PerlProc_getgid() != PerlProc_getegid())) {
4640                         /* Need to taint relocated paths if running set ID  */
4641                         SvTAINTED_on(libdir);
4642                     }
4643                 }
4644                 SvREFCNT_dec(prefix_sv);
4645             }
4646 #endif
4647         }
4648     return libdir;
4649 }
4650
4651 STATIC void
4652 S_incpush(pTHX_ const char *const dir, STRLEN len, U32 flags)
4653 {
4654 #ifndef PERL_IS_MINIPERL
4655     const U8 using_sub_dirs
4656         = (U8)flags & (INCPUSH_ADD_VERSIONED_SUB_DIRS
4657                        |INCPUSH_ADD_ARCHONLY_SUB_DIRS|INCPUSH_ADD_OLD_VERS);
4658     const U8 add_versioned_sub_dirs
4659         = (U8)flags & INCPUSH_ADD_VERSIONED_SUB_DIRS;
4660     const U8 add_archonly_sub_dirs
4661         = (U8)flags & INCPUSH_ADD_ARCHONLY_SUB_DIRS;
4662 #ifdef PERL_INC_VERSION_LIST
4663     const U8 addoldvers  = (U8)flags & INCPUSH_ADD_OLD_VERS;
4664 #endif
4665 #endif
4666     const U8 unshift     = (U8)flags & INCPUSH_UNSHIFT;
4667     const U8 push_basedir = (flags & INCPUSH_NOT_BASEDIR) ? 0 : 1;
4668     AV *const inc = GvAVn(PL_incgv);
4669
4670     PERL_ARGS_ASSERT_INCPUSH;
4671     assert(len > 0);
4672
4673     /* Could remove this vestigial extra block, if we don't mind a lot of
4674        re-indenting diff noise.  */
4675     {
4676         SV *const libdir = mayberelocate(dir, len, flags);
4677         /* Change 20189146be79a0596543441fa369c6bf7f85103f, to fix RT#6665,
4678            arranged to unshift #! line -I onto the front of @INC. However,
4679            -I can add version and architecture specific libraries, and they
4680            need to go first. The old code assumed that it was always
4681            pushing. Hence to make it work, need to push the architecture
4682            (etc) libraries onto a temporary array, then "unshift" that onto
4683            the front of @INC.  */
4684 #ifndef PERL_IS_MINIPERL
4685         AV *const av = (using_sub_dirs) ? (unshift ? newAV() : inc) : NULL;
4686
4687         /*
4688          * BEFORE pushing libdir onto @INC we may first push version- and
4689          * archname-specific sub-directories.
4690          */
4691         if (using_sub_dirs) {
4692             SV *subdir = newSVsv(libdir);
4693 #ifdef PERL_INC_VERSION_LIST
4694             /* Configure terminates PERL_INC_VERSION_LIST with a NULL */
4695             const char * const incverlist[] = { PERL_INC_VERSION_LIST };
4696             const char * const *incver;
4697 #endif
4698
4699             if (add_versioned_sub_dirs) {
4700                 /* .../version/archname if -d .../version/archname */
4701                 sv_catpvs(subdir, "/" PERL_FS_VERSION "/" ARCHNAME);
4702                 subdir = S_incpush_if_exists(aTHX_ av, subdir, libdir);
4703
4704                 /* .../version if -d .../version */
4705                 sv_catpvs(subdir, "/" PERL_FS_VERSION);
4706                 subdir = S_incpush_if_exists(aTHX_ av, subdir, libdir);
4707             }
4708
4709 #ifdef PERL_INC_VERSION_LIST
4710             if (addoldvers) {
4711                 for (incver = incverlist; *incver; incver++) {
4712                     /* .../xxx if -d .../xxx */
4713                     Perl_sv_catpvf(aTHX_ subdir, "/%s", *incver);
4714                     subdir = S_incpush_if_exists(aTHX_ av, subdir, libdir);
4715                 }
4716             }
4717 #endif
4718
4719             if (add_archonly_sub_dirs) {
4720                 /* .../archname if -d .../archname */
4721                 sv_catpvs(subdir, "/" ARCHNAME);
4722                 subdir = S_incpush_if_exists(aTHX_ av, subdir, libdir);
4723
4724             }
4725
4726             assert (SvREFCNT(subdir) == 1);
4727             SvREFCNT_dec(subdir);
4728         }
4729 #endif /* !PERL_IS_MINIPERL */
4730         /* finally add this lib directory at the end of @INC */
4731         if (unshift) {
4732 #ifdef PERL_IS_MINIPERL
4733             const Size_t extra = 0;
4734 #else
4735             Size_t extra = av_tindex(av) + 1;
4736 #endif
4737             av_unshift(inc, extra + push_basedir);
4738             if (push_basedir)
4739                 av_store(inc, extra, libdir);
4740 #ifndef PERL_IS_MINIPERL
4741             while (extra--) {
4742                 /* av owns a reference, av_store() expects to be donated a
4743                    reference, and av expects to be sane when it's cleared.
4744                    If I wanted to be naughty and wrong, I could peek inside the
4745                    implementation of av_clear(), realise that it uses
4746                    SvREFCNT_dec() too, so av's array could be a run of NULLs,
4747                    and so directly steal from it (with a memcpy() to inc, and
4748                    then memset() to NULL them out. But people copy code from the
4749                    core expecting it to be best practise, so let's use the API.
4750                    Although studious readers will note that I'm not checking any
4751                    return codes.  */
4752                 av_store(inc, extra, SvREFCNT_inc(*av_fetch(av, extra, FALSE)));
4753             }
4754             SvREFCNT_dec(av);
4755 #endif
4756         }
4757         else if (push_basedir) {
4758             av_push(inc, libdir);
4759         }
4760
4761         if (!push_basedir) {
4762             assert (SvREFCNT(libdir) == 1);
4763             SvREFCNT_dec(libdir);
4764         }
4765     }
4766 }
4767
4768 STATIC void
4769 S_incpush_use_sep(pTHX_ const char *p, STRLEN len, U32 flags)
4770 {
4771     const char *s;
4772     const char *end;
4773     /* This logic has been broken out from S_incpush(). It may be possible to
4774        simplify it.  */
4775
4776     PERL_ARGS_ASSERT_INCPUSH_USE_SEP;
4777
4778     /* perl compiled with -DPERL_RELOCATABLE_INCPUSH will ignore the len
4779      * argument to incpush_use_sep.  This allows creation of relocatable
4780      * Perl distributions that patch the binary at install time.  Those
4781      * distributions will have to provide their own relocation tools; this
4782      * is not a feature otherwise supported by core Perl.
4783      */
4784 #ifndef PERL_RELOCATABLE_INCPUSH
4785     if (!len)
4786 #endif
4787         len = strlen(p);
4788
4789     end = p + len;
4790
4791     /* Break at all separators */
4792     while ((s = (const char*)memchr(p, PERLLIB_SEP, end - p))) {
4793         if (s == p) {
4794             /* skip any consecutive separators */
4795
4796             /* Uncomment the next line for PATH semantics */
4797             /* But you'll need to write tests */
4798             /* av_push(GvAVn(PL_incgv), newSVpvs(".")); */
4799         } else {
4800             incpush(p, (STRLEN)(s - p), flags);
4801         }
4802         p = s + 1;
4803     }
4804     if (p != end)
4805         incpush(p, (STRLEN)(end - p), flags);
4806
4807 }
4808
4809 void
4810 Perl_call_list(pTHX_ I32 oldscope, AV *paramList)
4811 {
4812     SV *atsv;
4813     volatile const line_t oldline = PL_curcop ? CopLINE(PL_curcop) : 0;
4814     CV *cv;
4815     STRLEN len;
4816     int ret;
4817     dJMPENV;
4818
4819     PERL_ARGS_ASSERT_CALL_LIST;
4820
4821     while (av_tindex(paramList) >= 0) {
4822         cv = MUTABLE_CV(av_shift(paramList));
4823         if (PL_savebegin) {
4824             if (paramList == PL_beginav) {
4825                 /* save PL_beginav for compiler */
4826                 Perl_av_create_and_push(aTHX_ &PL_beginav_save, MUTABLE_SV(cv));
4827             }
4828             else if (paramList == PL_checkav) {
4829                 /* save PL_checkav for compiler */
4830                 Perl_av_create_and_push(aTHX_ &PL_checkav_save, MUTABLE_SV(cv));
4831             }
4832             else if (paramList == PL_unitcheckav) {
4833                 /* save PL_unitcheckav for compiler */
4834                 Perl_av_create_and_push(aTHX_ &PL_unitcheckav_save, MUTABLE_SV(cv));
4835             }
4836         } else {
4837             SAVEFREESV(cv);
4838         }
4839         JMPENV_PUSH(ret);
4840         switch (ret) {
4841         case 0:
4842             CALL_LIST_BODY(cv);
4843             atsv = ERRSV;
4844             (void)SvPV_const(atsv, len);
4845             if (len) {
4846                 PL_curcop = &PL_compiling;
4847                 CopLINE_set(PL_curcop, oldline);
4848                 if (paramList == PL_beginav)
4849                     sv_catpvs(atsv, "BEGIN failed--compilation aborted");
4850                 else
4851                     Perl_sv_catpvf(aTHX_ atsv,
4852                                    "%s failed--call queue aborted",
4853                                    paramList == PL_checkav ? "CHECK"
4854                                    : paramList == PL_initav ? "INIT"
4855                                    : paramList == PL_unitcheckav ? "UNITCHECK"
4856                                    : "END");
4857                 while (PL_scopestack_ix > oldscope)
4858                     LEAVE;
4859                 JMPENV_POP;
4860                 Perl_croak(aTHX_ "%"SVf"", SVfARG(atsv));
4861             }
4862             break;
4863         case 1:
4864             STATUS_ALL_FAILURE;
4865             /* FALLTHROUGH */
4866         case 2:
4867             /* my_exit() was called */
4868             while (PL_scopestack_ix > oldscope)
4869                 LEAVE;
4870             FREETMPS;
4871             SET_CURSTASH(PL_defstash);
4872             PL_curcop = &PL_compiling;
4873             CopLINE_set(PL_curcop, oldline);
4874             JMPENV_POP;
4875             my_exit_jump();
4876             NOT_REACHED; /* NOTREACHED */
4877         case 3:
4878             if (PL_restartop) {
4879                 PL_curcop = &PL_compiling;
4880                 CopLINE_set(PL_curcop, oldline);
4881                 JMPENV_JUMP(3);
4882             }
4883             PerlIO_printf(Perl_error_log, "panic: restartop in call_list\n");
4884             FREETMPS;
4885             break;
4886         }
4887         JMPENV_POP;
4888     }
4889 }
4890
4891 void
4892 Perl_my_exit(pTHX_ U32 status)
4893 {
4894     if (PL_exit_flags & PERL_EXIT_ABORT) {
4895         abort();
4896     }
4897     if (PL_exit_flags & PERL_EXIT_WARN) {
4898         PL_exit_flags |= PERL_EXIT_ABORT; /* Protect against reentrant calls */
4899         Perl_warn(aTHX_ "Unexpected exit %lu", (unsigned long)status);
4900         PL_exit_flags &= ~PERL_EXIT_ABORT;
4901     }
4902     switch (status) {
4903     case 0:
4904         STATUS_ALL_SUCCESS;
4905         break;
4906     case 1:
4907         STATUS_ALL_FAILURE;
4908         break;
4909     default:
4910         STATUS_EXIT_SET(status);
4911         break;
4912     }
4913     my_exit_jump();
4914 }
4915
4916 void
4917 Perl_my_failure_exit(pTHX)
4918 {
4919 #ifdef VMS
4920      /* We have been called to fall on our sword.  The desired exit code
4921       * should be already set in STATUS_UNIX, but could be shifted over
4922       * by 8 bits.  STATUS_UNIX_EXIT_SET will handle the cases where a
4923       * that code is set.
4924       *
4925       * If an error code has not been set, then force the issue.
4926       */
4927     if (MY_POSIX_EXIT) {
4928
4929         /* According to the die_exit.t tests, if errno is non-zero */
4930         /* It should be used for the error status. */
4931
4932         if (errno == EVMSERR) {
4933             STATUS_NATIVE = vaxc$errno;
4934         } else {
4935
4936             /* According to die_exit.t tests, if the child_exit code is */
4937             /* also zero, then we need to exit with a code of 255 */
4938             if ((errno != 0) && (errno < 256))
4939                 STATUS_UNIX_EXIT_SET(errno);
4940             else if (STATUS_UNIX < 255) {
4941                 STATUS_UNIX_EXIT_SET(255);
4942             }
4943
4944         }
4945
4946         /* The exit code could have been set by $? or vmsish which
4947          * means that it may not have fatal set.  So convert
4948          * success/warning codes to fatal with out changing
4949          * the POSIX status code.  The severity makes VMS native
4950          * status handling work, while UNIX mode programs use the
4951          * the POSIX exit codes.
4952          */
4953          if ((STATUS_NATIVE & (STS$K_SEVERE|STS$K_ERROR)) == 0) {
4954             STATUS_NATIVE &= STS$M_COND_ID;
4955             STATUS_NATIVE |= STS$K_ERROR | STS$M_INHIB_MSG;
4956          }
4957     }
4958     else {
4959         /* Traditionally Perl on VMS always expects a Fatal Error. */
4960         if (vaxc$errno & 1) {
4961
4962             /* So force success status to failure */
4963             if (STATUS_NATIVE & 1)
4964                 STATUS_ALL_FAILURE;
4965         }
4966         else {
4967             if (!vaxc$errno) {
4968                 STATUS_UNIX = EINTR; /* In case something cares */
4969                 STATUS_ALL_FAILURE;
4970             }
4971             else {
4972                 int severity;
4973                 STATUS_NATIVE = vaxc$errno; /* Should already be this */
4974
4975                 /* Encode the severity code */
4976                 severity = STATUS_NATIVE & STS$M_SEVERITY;
4977                 STATUS_UNIX = (severity ? severity : 1) << 8;
4978
4979                 /* Perl expects this to be a fatal error */
4980                 if (severity != STS$K_SEVERE)
4981                     STATUS_ALL_FAILURE;
4982             }
4983         }
4984     }
4985
4986 #else
4987     int exitstatus;
4988     if (errno & 255)
4989         STATUS_UNIX_SET(errno);
4990     else {
4991         exitstatus = STATUS_UNIX >> 8;
4992         if (exitstatus & 255)
4993             STATUS_UNIX_SET(exitstatus);
4994         else
4995             STATUS_UNIX_SET(255);
4996     }
4997 #endif
4998     if (PL_exit_flags & PERL_EXIT_ABORT) {
4999         abort();
5000     }
5001     if (PL_exit_flags & PERL_EXIT_WARN) {
5002         PL_exit_flags |= PERL_EXIT_ABORT; /* Protect against reentrant calls */
5003         Perl_warn(aTHX_ "Unexpected exit failure %ld", (long)PL_statusvalue);
5004         PL_exit_flags &= ~PERL_EXIT_ABORT;
5005     }
5006     my_exit_jump();
5007 }
5008
5009 STATIC void
5010 S_my_exit_jump(pTHX)
5011 {
5012     if (PL_e_script) {
5013         SvREFCNT_dec(PL_e_script);
5014         PL_e_script = NULL;
5015     }
5016
5017     POPSTACK_TO(PL_mainstack);
5018     dounwind(-1);
5019     LEAVE_SCOPE(0);
5020
5021     JMPENV_JUMP(2);
5022 }
5023
5024 static I32
5025 read_e_script(pTHX_ int idx, SV *buf_sv, int maxlen)
5026 {
5027     const char * const p  = SvPVX_const(PL_e_script);
5028     const char *nl = strchr(p, '\n');
5029
5030     PERL_UNUSED_ARG(idx);
5031     PERL_UNUSED_ARG(maxlen);
5032
5033     nl = (nl) ? nl+1 : SvEND(PL_e_script);
5034     if (nl-p == 0) {
5035         filter_del(read_e_script);
5036         return 0;
5037     }
5038     sv_catpvn(buf_sv, p, nl-p);
5039     sv_chop(PL_e_script, nl);
5040     return 1;
5041 }
5042
5043 /* removes boilerplate code at the end of each boot_Module xsub */
5044 void
5045 Perl_xs_boot_epilog(pTHX_ const U32 ax)
5046 {
5047   if (PL_unitcheckav)
5048         call_list(PL_scopestack_ix, PL_unitcheckav);
5049     XSRETURN_YES;
5050 }
5051
5052 /*
5053  * Local variables:
5054  * c-indentation-style: bsd
5055  * c-basic-offset: 4
5056  * indent-tabs-mode: nil
5057  * End:
5058  *
5059  * ex: set ts=8 sts=4 sw=4 et:
5060  */