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