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