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