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