This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Update Pod-Escapes to CPAN version 1.06
[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 = sizeof(vec)/sizeof(vec[0]);
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 =
1493            ~(UV)(PTRSIZE == 4 ? 3 : PTRSIZE == 8 ? 7 : PTRSIZE == 16 ? 15 : 0);
1494          /* Do the mask check only if the args seem like aligned. */
1495          const UV aligned =
1496            (mask < ~(UV)0) && ((PTR2UV(argv[0]) & mask) == PTR2UV(argv[0]));
1497
1498          /* See if all the arguments are contiguous in memory.  Note
1499           * that 'contiguous' is a loose term because some platforms
1500           * align the argv[] and the envp[].  If the arguments look
1501           * like non-aligned, assume that they are 'strictly' or
1502           * 'traditionally' contiguous.  If the arguments look like
1503           * aligned, we just check that they are within aligned
1504           * PTRSIZE bytes.  As long as no system has something bizarre
1505           * like the argv[] interleaved with some other data, we are
1506           * fine.  (Did I just evoke Murphy's Law?)  --jhi */
1507          if (PL_origargv && PL_origargc >= 1 && (s = PL_origargv[0])) {
1508               while (*s) s++;
1509               for (i = 1; i < PL_origargc; i++) {
1510                    if ((PL_origargv[i] == s + 1
1511 #ifdef OS2
1512                         || PL_origargv[i] == s + 2
1513 #endif 
1514                             )
1515                        ||
1516                        (aligned &&
1517                         (PL_origargv[i] >  s &&
1518                          PL_origargv[i] <=
1519                          INT2PTR(char *, PTR2UV(s + PTRSIZE) & mask)))
1520                         )
1521                    {
1522                         s = PL_origargv[i];
1523                         while (*s) s++;
1524                    }
1525                    else
1526                         break;
1527               }
1528          }
1529
1530 #ifndef PERL_USE_SAFE_PUTENV
1531          /* Can we grab env area too to be used as the area for $0? */
1532          if (s && PL_origenviron && !PL_use_safe_putenv) {
1533               if ((PL_origenviron[0] == s + 1)
1534                   ||
1535                   (aligned &&
1536                    (PL_origenviron[0] >  s &&
1537                     PL_origenviron[0] <=
1538                     INT2PTR(char *, PTR2UV(s + PTRSIZE) & mask)))
1539                  )
1540               {
1541 #ifndef OS2             /* ENVIRON is read by the kernel too. */
1542                    s = PL_origenviron[0];
1543                    while (*s) s++;
1544 #endif
1545                    my_setenv("NoNe  SuCh", NULL);
1546                    /* Force copy of environment. */
1547                    for (i = 1; PL_origenviron[i]; i++) {
1548                         if (PL_origenviron[i] == s + 1
1549                             ||
1550                             (aligned &&
1551                              (PL_origenviron[i] >  s &&
1552                               PL_origenviron[i] <=
1553                               INT2PTR(char *, PTR2UV(s + PTRSIZE) & mask)))
1554                            )
1555                         {
1556                              s = PL_origenviron[i];
1557                              while (*s) s++;
1558                         }
1559                         else
1560                              break;
1561                    }
1562               }
1563          }
1564 #endif /* !defined(PERL_USE_SAFE_PUTENV) */
1565
1566          PL_origalen = s ? s - PL_origargv[0] + 1 : 0;
1567     }
1568
1569     if (PL_do_undump) {
1570
1571         /* Come here if running an undumped a.out. */
1572
1573         PL_origfilename = savepv(argv[0]);
1574         PL_do_undump = FALSE;
1575         cxstack_ix = -1;                /* start label stack again */
1576         init_ids();
1577         assert (!TAINT_get);
1578         TAINT;
1579         set_caret_X();
1580         TAINT_NOT;
1581         init_postdump_symbols(argc,argv,env);
1582         return 0;
1583     }
1584
1585     if (PL_main_root) {
1586         op_free(PL_main_root);
1587         PL_main_root = NULL;
1588     }
1589     PL_main_start = NULL;
1590     SvREFCNT_dec(PL_main_cv);
1591     PL_main_cv = NULL;
1592
1593     time(&PL_basetime);
1594     oldscope = PL_scopestack_ix;
1595     PL_dowarn = G_WARN_OFF;
1596
1597     JMPENV_PUSH(ret);
1598     switch (ret) {
1599     case 0:
1600         parse_body(env,xsinit);
1601         if (PL_unitcheckav) {
1602             call_list(oldscope, PL_unitcheckav);
1603         }
1604         if (PL_checkav) {
1605             PERL_SET_PHASE(PERL_PHASE_CHECK);
1606             call_list(oldscope, PL_checkav);
1607         }
1608         ret = 0;
1609         break;
1610     case 1:
1611         STATUS_ALL_FAILURE;
1612         /* FALL THROUGH */
1613     case 2:
1614         /* my_exit() was called */
1615         while (PL_scopestack_ix > oldscope)
1616             LEAVE;
1617         FREETMPS;
1618         SET_CURSTASH(PL_defstash);
1619         if (PL_unitcheckav) {
1620             call_list(oldscope, PL_unitcheckav);
1621         }
1622         if (PL_checkav) {
1623             PERL_SET_PHASE(PERL_PHASE_CHECK);
1624             call_list(oldscope, PL_checkav);
1625         }
1626         ret = STATUS_EXIT;
1627         break;
1628     case 3:
1629         PerlIO_printf(Perl_error_log, "panic: top_env\n");
1630         ret = 1;
1631         break;
1632     }
1633     JMPENV_POP;
1634     return ret;
1635 }
1636
1637 /* This needs to stay in perl.c, as perl.c is compiled with different flags for
1638    miniperl, and we need to see those flags reflected in the values here.  */
1639
1640 /* What this returns is subject to change.  Use the public interface in Config.
1641  */
1642 static void
1643 S_Internals_V(pTHX_ CV *cv)
1644 {
1645     dXSARGS;
1646 #ifdef LOCAL_PATCH_COUNT
1647     const int local_patch_count = LOCAL_PATCH_COUNT;
1648 #else
1649     const int local_patch_count = 0;
1650 #endif
1651     const int entries = 3 + local_patch_count;
1652     int i;
1653     static const char non_bincompat_options[] = 
1654 #  ifdef DEBUGGING
1655                              " DEBUGGING"
1656 #  endif
1657 #  ifdef NO_MATHOMS
1658                              " NO_MATHOMS"
1659 #  endif
1660 #  ifdef NO_HASH_SEED
1661                              " NO_HASH_SEED"
1662 #  endif
1663 #  ifdef NO_TAINT_SUPPORT
1664                              " NO_TAINT_SUPPORT"
1665 #  endif
1666 #  ifdef PERL_DISABLE_PMC
1667                              " PERL_DISABLE_PMC"
1668 #  endif
1669 #  ifdef PERL_DONT_CREATE_GVSV
1670                              " PERL_DONT_CREATE_GVSV"
1671 #  endif
1672 #  ifdef PERL_EXTERNAL_GLOB
1673                              " PERL_EXTERNAL_GLOB"
1674 #  endif
1675 #  ifdef PERL_HASH_FUNC_SIPHASH
1676                              " PERL_HASH_FUNC_SIPHASH"
1677 #  endif
1678 #  ifdef PERL_HASH_FUNC_SDBM
1679                              " PERL_HASH_FUNC_SDBM"
1680 #  endif
1681 #  ifdef PERL_HASH_FUNC_DJB2
1682                              " PERL_HASH_FUNC_DJB2"
1683 #  endif
1684 #  ifdef PERL_HASH_FUNC_SUPERFAST
1685                              " PERL_HASH_FUNC_SUPERFAST"
1686 #  endif
1687 #  ifdef PERL_HASH_FUNC_MURMUR3
1688                              " PERL_HASH_FUNC_MURMUR3"
1689 #  endif
1690 #  ifdef PERL_HASH_FUNC_ONE_AT_A_TIME
1691                              " PERL_HASH_FUNC_ONE_AT_A_TIME"
1692 #  endif
1693 #  ifdef PERL_HASH_FUNC_ONE_AT_A_TIME_HARD
1694                              " PERL_HASH_FUNC_ONE_AT_A_TIME_HARD"
1695 #  endif
1696 #  ifdef PERL_HASH_FUNC_ONE_AT_A_TIME_OLD
1697                              " PERL_HASH_FUNC_ONE_AT_A_TIME_OLD"
1698 #  endif
1699 #  ifdef PERL_IS_MINIPERL
1700                              " PERL_IS_MINIPERL"
1701 #  endif
1702 #  ifdef PERL_MALLOC_WRAP
1703                              " PERL_MALLOC_WRAP"
1704 #  endif
1705 #  ifdef PERL_MEM_LOG
1706                              " PERL_MEM_LOG"
1707 #  endif
1708 #  ifdef PERL_MEM_LOG_NOIMPL
1709                              " PERL_MEM_LOG_NOIMPL"
1710 #  endif
1711 #  ifdef PERL_NEW_COPY_ON_WRITE
1712                              " PERL_NEW_COPY_ON_WRITE"
1713 #  endif
1714 #  ifdef PERL_PERTURB_KEYS_DETERMINISTIC
1715                              " PERL_PERTURB_KEYS_DETERMINISTIC"
1716 #  endif
1717 #  ifdef PERL_PERTURB_KEYS_DISABLED
1718                              " PERL_PERTURB_KEYS_DISABLED"
1719 #  endif
1720 #  ifdef PERL_PERTURB_KEYS_RANDOM
1721                              " PERL_PERTURB_KEYS_RANDOM"
1722 #  endif
1723 #  ifdef PERL_PRESERVE_IVUV
1724                              " PERL_PRESERVE_IVUV"
1725 #  endif
1726 #  ifdef PERL_RELOCATABLE_INCPUSH
1727                              " PERL_RELOCATABLE_INCPUSH"
1728 #  endif
1729 #  ifdef PERL_USE_DEVEL
1730                              " PERL_USE_DEVEL"
1731 #  endif
1732 #  ifdef PERL_USE_SAFE_PUTENV
1733                              " PERL_USE_SAFE_PUTENV"
1734 #  endif
1735 #  ifdef UNLINK_ALL_VERSIONS
1736                              " UNLINK_ALL_VERSIONS"
1737 #  endif
1738 #  ifdef USE_ATTRIBUTES_FOR_PERLIO
1739                              " USE_ATTRIBUTES_FOR_PERLIO"
1740 #  endif
1741 #  ifdef USE_FAST_STDIO
1742                              " USE_FAST_STDIO"
1743 #  endif               
1744 #  ifdef USE_HASH_SEED_EXPLICIT
1745                              " USE_HASH_SEED_EXPLICIT"
1746 #  endif
1747 #  ifdef USE_LOCALE
1748                              " USE_LOCALE"
1749 #  endif
1750 #  ifdef USE_LOCALE_CTYPE
1751                              " USE_LOCALE_CTYPE"
1752 #  endif
1753 #  ifdef USE_PERL_ATOF
1754                              " USE_PERL_ATOF"
1755 #  endif               
1756 #  ifdef USE_SITECUSTOMIZE
1757                              " USE_SITECUSTOMIZE"
1758 #  endif               
1759         ;
1760     PERL_UNUSED_ARG(cv);
1761     PERL_UNUSED_ARG(items);
1762
1763     EXTEND(SP, entries);
1764
1765     PUSHs(sv_2mortal(newSVpv(PL_bincompat_options, 0)));
1766     PUSHs(Perl_newSVpvn_flags(aTHX_ non_bincompat_options,
1767                               sizeof(non_bincompat_options) - 1, SVs_TEMP));
1768
1769 #ifdef __DATE__
1770 #  ifdef __TIME__
1771     PUSHs(Perl_newSVpvn_flags(aTHX_
1772                               STR_WITH_LEN("Compiled at " __DATE__ " " __TIME__),
1773                               SVs_TEMP));
1774 #  else
1775     PUSHs(Perl_newSVpvn_flags(aTHX_ STR_WITH_LEN("Compiled on " __DATE__),
1776                               SVs_TEMP));
1777 #  endif
1778 #else
1779     PUSHs(&PL_sv_undef);
1780 #endif
1781
1782     for (i = 1; i <= local_patch_count; i++) {
1783         /* This will be an undef, if PL_localpatches[i] is NULL.  */
1784         PUSHs(sv_2mortal(newSVpv(PL_localpatches[i], 0)));
1785     }
1786
1787     XSRETURN(entries);
1788 }
1789
1790 #define INCPUSH_UNSHIFT                 0x01
1791 #define INCPUSH_ADD_OLD_VERS            0x02
1792 #define INCPUSH_ADD_VERSIONED_SUB_DIRS  0x04
1793 #define INCPUSH_ADD_ARCHONLY_SUB_DIRS   0x08
1794 #define INCPUSH_NOT_BASEDIR             0x10
1795 #define INCPUSH_CAN_RELOCATE            0x20
1796 #define INCPUSH_ADD_SUB_DIRS    \
1797     (INCPUSH_ADD_VERSIONED_SUB_DIRS|INCPUSH_ADD_ARCHONLY_SUB_DIRS)
1798
1799 STATIC void *
1800 S_parse_body(pTHX_ char **env, XSINIT_t xsinit)
1801 {
1802     dVAR;
1803     PerlIO *rsfp;
1804     int argc = PL_origargc;
1805     char **argv = PL_origargv;
1806     const char *scriptname = NULL;
1807     VOL bool dosearch = FALSE;
1808     char c;
1809     bool doextract = FALSE;
1810     const char *cddir = NULL;
1811 #ifdef USE_SITECUSTOMIZE
1812     bool minus_f = FALSE;
1813 #endif
1814     SV *linestr_sv = NULL;
1815     bool add_read_e_script = FALSE;
1816     U32 lex_start_flags = 0;
1817
1818     PERL_SET_PHASE(PERL_PHASE_START);
1819
1820     init_main_stash();
1821
1822     {
1823         const char *s;
1824     for (argc--,argv++; argc > 0; argc--,argv++) {
1825         if (argv[0][0] != '-' || !argv[0][1])
1826             break;
1827         s = argv[0]+1;
1828       reswitch:
1829         switch ((c = *s)) {
1830         case 'C':
1831 #ifndef PERL_STRICT_CR
1832         case '\r':
1833 #endif
1834         case ' ':
1835         case '0':
1836         case 'F':
1837         case 'a':
1838         case 'c':
1839         case 'd':
1840         case 'D':
1841         case 'h':
1842         case 'i':
1843         case 'l':
1844         case 'M':
1845         case 'm':
1846         case 'n':
1847         case 'p':
1848         case 's':
1849         case 'u':
1850         case 'U':
1851         case 'v':
1852         case 'W':
1853         case 'X':
1854         case 'w':
1855             if ((s = moreswitches(s)))
1856                 goto reswitch;
1857             break;
1858
1859         case 't':
1860 #if defined(SILENT_NO_TAINT_SUPPORT)
1861             /* silently ignore */
1862 #elif defined(NO_TAINT_SUPPORT)
1863             Perl_croak_nocontext("This perl was compiled without taint support. "
1864                        "Cowardly refusing to run with -t or -T flags");
1865 #else
1866             CHECK_MALLOC_TOO_LATE_FOR('t');
1867             if( !TAINTING_get ) {
1868                  TAINT_WARN_set(TRUE);
1869                  TAINTING_set(TRUE);
1870             }
1871 #endif
1872             s++;
1873             goto reswitch;
1874         case 'T':
1875 #if defined(SILENT_NO_TAINT_SUPPORT)
1876             /* silently ignore */
1877 #elif defined(NO_TAINT_SUPPORT)
1878             Perl_croak_nocontext("This perl was compiled without taint support. "
1879                        "Cowardly refusing to run with -t or -T flags");
1880 #else
1881             CHECK_MALLOC_TOO_LATE_FOR('T');
1882             TAINTING_set(TRUE);
1883             TAINT_WARN_set(FALSE);
1884 #endif
1885             s++;
1886             goto reswitch;
1887
1888         case 'E':
1889             PL_minus_E = TRUE;
1890             /* FALL THROUGH */
1891         case 'e':
1892             forbid_setid('e', FALSE);
1893             if (!PL_e_script) {
1894                 PL_e_script = newSVpvs("");
1895                 add_read_e_script = TRUE;
1896             }
1897             if (*++s)
1898                 sv_catpv(PL_e_script, s);
1899             else if (argv[1]) {
1900                 sv_catpv(PL_e_script, argv[1]);
1901                 argc--,argv++;
1902             }
1903             else
1904                 Perl_croak(aTHX_ "No code specified for -%c", c);
1905             sv_catpvs(PL_e_script, "\n");
1906             break;
1907
1908         case 'f':
1909 #ifdef USE_SITECUSTOMIZE
1910             minus_f = TRUE;
1911 #endif
1912             s++;
1913             goto reswitch;
1914
1915         case 'I':       /* -I handled both here and in moreswitches() */
1916             forbid_setid('I', FALSE);
1917             if (!*++s && (s=argv[1]) != NULL) {
1918                 argc--,argv++;
1919             }
1920             if (s && *s) {
1921                 STRLEN len = strlen(s);
1922                 incpush(s, len, INCPUSH_ADD_SUB_DIRS|INCPUSH_ADD_OLD_VERS);
1923             }
1924             else
1925                 Perl_croak(aTHX_ "No directory specified for -I");
1926             break;
1927         case 'S':
1928             forbid_setid('S', FALSE);
1929             dosearch = TRUE;
1930             s++;
1931             goto reswitch;
1932         case 'V':
1933             {
1934                 SV *opts_prog;
1935
1936                 if (*++s != ':')  {
1937                     opts_prog = newSVpvs("use Config; Config::_V()");
1938                 }
1939                 else {
1940                     ++s;
1941                     opts_prog = Perl_newSVpvf(aTHX_
1942                                               "use Config; Config::config_vars(qw%c%s%c)",
1943                                               0, s, 0);
1944                     s += strlen(s);
1945                 }
1946                 Perl_av_create_and_push(aTHX_ &PL_preambleav, opts_prog);
1947                 /* don't look for script or read stdin */
1948                 scriptname = BIT_BUCKET;
1949                 goto reswitch;
1950             }
1951         case 'x':
1952             doextract = TRUE;
1953             s++;
1954             if (*s)
1955                 cddir = s;
1956             break;
1957         case 0:
1958             break;
1959         case '-':
1960             if (!*++s || isSPACE(*s)) {
1961                 argc--,argv++;
1962                 goto switch_end;
1963             }
1964             /* catch use of gnu style long options.
1965                Both of these exit immediately.  */
1966             if (strEQ(s, "version"))
1967                 minus_v();
1968             if (strEQ(s, "help"))
1969                 usage();
1970             s--;
1971             /* FALL THROUGH */
1972         default:
1973             Perl_croak(aTHX_ "Unrecognized switch: -%s  (-h will show valid options)",s);
1974         }
1975     }
1976     }
1977
1978   switch_end:
1979
1980     {
1981         char *s;
1982
1983     if (
1984 #ifndef SECURE_INTERNAL_GETENV
1985         !TAINTING_get &&
1986 #endif
1987         (s = PerlEnv_getenv("PERL5OPT")))
1988     {
1989         while (isSPACE(*s))
1990             s++;
1991         if (*s == '-' && *(s+1) == 'T') {
1992 #if defined(SILENT_NO_TAINT_SUPPORT)
1993             /* silently ignore */
1994 #elif defined(NO_TAINT_SUPPORT)
1995             Perl_croak_nocontext("This perl was compiled without taint support. "
1996                        "Cowardly refusing to run with -t or -T flags");
1997 #else
1998             CHECK_MALLOC_TOO_LATE_FOR('T');
1999             TAINTING_set(TRUE);
2000             TAINT_WARN_set(FALSE);
2001 #endif
2002         }
2003         else {
2004             char *popt_copy = NULL;
2005             while (s && *s) {
2006                 const char *d;
2007                 while (isSPACE(*s))
2008                     s++;
2009                 if (*s == '-') {
2010                     s++;
2011                     if (isSPACE(*s))
2012                         continue;
2013                 }
2014                 d = s;
2015                 if (!*s)
2016                     break;
2017                 if (!strchr("CDIMUdmtwW", *s))
2018                     Perl_croak(aTHX_ "Illegal switch in PERL5OPT: -%c", *s);
2019                 while (++s && *s) {
2020                     if (isSPACE(*s)) {
2021                         if (!popt_copy) {
2022                             popt_copy = SvPVX(sv_2mortal(newSVpv(d,0)));
2023                             s = popt_copy + (s - d);
2024                             d = popt_copy;
2025                         }
2026                         *s++ = '\0';
2027                         break;
2028                     }
2029                 }
2030                 if (*d == 't') {
2031 #if defined(SILENT_NO_TAINT_SUPPORT)
2032             /* silently ignore */
2033 #elif defined(NO_TAINT_SUPPORT)
2034                     Perl_croak_nocontext("This perl was compiled without taint support. "
2035                                "Cowardly refusing to run with -t or -T flags");
2036 #else
2037                     if( !TAINTING_get) {
2038                         TAINT_WARN_set(TRUE);
2039                         TAINTING_set(TRUE);
2040                     }
2041 #endif
2042                 } else {
2043                     moreswitches(d);
2044                 }
2045             }
2046         }
2047     }
2048     }
2049
2050     /* Set $^X early so that it can be used for relocatable paths in @INC  */
2051     /* and for SITELIB_EXP in USE_SITECUSTOMIZE                            */
2052     assert (!TAINT_get);
2053     TAINT;
2054     set_caret_X();
2055     TAINT_NOT;
2056
2057 #if defined(USE_SITECUSTOMIZE)
2058     if (!minus_f) {
2059         /* The games with local $! are to avoid setting errno if there is no
2060            sitecustomize script.  "q%c...%c", 0, ..., 0 becomes "q\0...\0",
2061            ie a q() operator with a NUL byte as a the delimiter. This avoids
2062            problems with pathnames containing (say) '  */
2063 #  ifdef PERL_IS_MINIPERL
2064         AV *const inc = GvAV(PL_incgv);
2065         SV **const inc0 = inc ? av_fetch(inc, 0, FALSE) : NULL;
2066
2067         if (inc0) {
2068             /* if lib/buildcustomize.pl exists, it should not fail. If it does,
2069                it should be reported immediately as a build failure.  */
2070             (void)Perl_av_create_and_unshift_one(aTHX_ &PL_preambleav,
2071                                                  Perl_newSVpvf(aTHX_
2072         "BEGIN { do {local $!; -f q%c%"SVf"/buildcustomize.pl%c} and do q%c%"SVf"/buildcustomize.pl%c || die $@ }",
2073                                                                0, *inc0, 0,
2074                                                                0, *inc0, 0));
2075         }
2076 #  else
2077         /* SITELIB_EXP is a function call on Win32.  */
2078         const char *const raw_sitelib = SITELIB_EXP;
2079         if (raw_sitelib) {
2080             /* process .../.. if PERL_RELOCATABLE_INC is defined */
2081             SV *sitelib_sv = mayberelocate(raw_sitelib, strlen(raw_sitelib),
2082                                            INCPUSH_CAN_RELOCATE);
2083             const char *const sitelib = SvPVX(sitelib_sv);
2084             (void)Perl_av_create_and_unshift_one(aTHX_ &PL_preambleav,
2085                                                  Perl_newSVpvf(aTHX_
2086                                                                "BEGIN { do {local $!; -f q%c%s/sitecustomize.pl%c} && do q%c%s/sitecustomize.pl%c }",
2087                                                                0, sitelib, 0,
2088                                                                0, sitelib, 0));
2089             assert (SvREFCNT(sitelib_sv) == 1);
2090             SvREFCNT_dec(sitelib_sv);
2091         }
2092 #  endif
2093     }
2094 #endif
2095
2096     if (!scriptname)
2097         scriptname = argv[0];
2098     if (PL_e_script) {
2099         argc++,argv--;
2100         scriptname = BIT_BUCKET;        /* don't look for script or read stdin */
2101     }
2102     else if (scriptname == NULL) {
2103 #ifdef MSDOS
2104         if ( PerlLIO_isatty(PerlIO_fileno(PerlIO_stdin())) )
2105             moreswitches("h");
2106 #endif
2107         scriptname = "-";
2108     }
2109
2110     assert (!TAINT_get);
2111     init_perllib();
2112
2113     {
2114         bool suidscript = FALSE;
2115
2116         rsfp = open_script(scriptname, dosearch, &suidscript);
2117         if (!rsfp) {
2118             rsfp = PerlIO_stdin();
2119             lex_start_flags = LEX_DONT_CLOSE_RSFP;
2120         }
2121
2122         validate_suid(rsfp);
2123
2124 #ifndef PERL_MICRO
2125 #  if defined(SIGCHLD) || defined(SIGCLD)
2126         {
2127 #  ifndef SIGCHLD
2128 #    define SIGCHLD SIGCLD
2129 #  endif
2130             Sighandler_t sigstate = rsignal_state(SIGCHLD);
2131             if (sigstate == (Sighandler_t) SIG_IGN) {
2132                 Perl_ck_warner(aTHX_ packWARN(WARN_SIGNAL),
2133                                "Can't ignore signal CHLD, forcing to default");
2134                 (void)rsignal(SIGCHLD, (Sighandler_t)SIG_DFL);
2135             }
2136         }
2137 #  endif
2138 #endif
2139
2140         if (doextract) {
2141
2142             /* This will croak if suidscript is true, as -x cannot be used with
2143                setuid scripts.  */
2144             forbid_setid('x', suidscript);
2145             /* Hence you can't get here if suidscript is true */
2146
2147             linestr_sv = newSV_type(SVt_PV);
2148             lex_start_flags |= LEX_START_COPIED;
2149             find_beginning(linestr_sv, rsfp);
2150             if (cddir && PerlDir_chdir( (char *)cddir ) < 0)
2151                 Perl_croak(aTHX_ "Can't chdir to %s",cddir);
2152         }
2153     }
2154
2155     PL_main_cv = PL_compcv = MUTABLE_CV(newSV_type(SVt_PVCV));
2156     CvUNIQUE_on(PL_compcv);
2157
2158     CvPADLIST(PL_compcv) = pad_new(0);
2159
2160     PL_isarev = newHV();
2161
2162     boot_core_PerlIO();
2163     boot_core_UNIVERSAL();
2164     boot_core_mro();
2165     newXS("Internals::V", S_Internals_V, __FILE__);
2166
2167     if (xsinit)
2168         (*xsinit)(aTHX);        /* in case linked C routines want magical variables */
2169 #ifndef PERL_MICRO
2170 #if defined(VMS) || defined(WIN32) || defined(DJGPP) || defined(__CYGWIN__) || defined(SYMBIAN)
2171     init_os_extras();
2172 #endif
2173 #endif
2174
2175 #ifdef USE_SOCKS
2176 #   ifdef HAS_SOCKS5_INIT
2177     socks5_init(argv[0]);
2178 #   else
2179     SOCKSinit(argv[0]);
2180 #   endif
2181 #endif
2182
2183     init_predump_symbols();
2184     /* init_postdump_symbols not currently designed to be called */
2185     /* more than once (ENV isn't cleared first, for example)     */
2186     /* But running with -u leaves %ENV & @ARGV undefined!    XXX */
2187     if (!PL_do_undump)
2188         init_postdump_symbols(argc,argv,env);
2189
2190     /* PL_unicode is turned on by -C, or by $ENV{PERL_UNICODE},
2191      * or explicitly in some platforms.
2192      * locale.c:Perl_init_i18nl10n() if the environment
2193      * look like the user wants to use UTF-8. */
2194 #if defined(__SYMBIAN32__)
2195     PL_unicode = PERL_UNICODE_STD_FLAG; /* See PERL_SYMBIAN_CONSOLE_UTF8. */
2196 #endif
2197 #  ifndef PERL_IS_MINIPERL
2198     if (PL_unicode) {
2199          /* Requires init_predump_symbols(). */
2200          if (!(PL_unicode & PERL_UNICODE_LOCALE_FLAG) || PL_utf8locale) {
2201               IO* io;
2202               PerlIO* fp;
2203               SV* sv;
2204
2205               /* Turn on UTF-8-ness on STDIN, STDOUT, STDERR
2206                * and the default open disciplines. */
2207               if ((PL_unicode & PERL_UNICODE_STDIN_FLAG) &&
2208                   PL_stdingv  && (io = GvIO(PL_stdingv)) &&
2209                   (fp = IoIFP(io)))
2210                    PerlIO_binmode(aTHX_ fp, IoTYPE(io), 0, ":utf8");
2211               if ((PL_unicode & PERL_UNICODE_STDOUT_FLAG) &&
2212                   PL_defoutgv && (io = GvIO(PL_defoutgv)) &&
2213                   (fp = IoOFP(io)))
2214                    PerlIO_binmode(aTHX_ fp, IoTYPE(io), 0, ":utf8");
2215               if ((PL_unicode & PERL_UNICODE_STDERR_FLAG) &&
2216                   PL_stderrgv && (io = GvIO(PL_stderrgv)) &&
2217                   (fp = IoOFP(io)))
2218                    PerlIO_binmode(aTHX_ fp, IoTYPE(io), 0, ":utf8");
2219               if ((PL_unicode & PERL_UNICODE_INOUT_FLAG) &&
2220                   (sv = GvSV(gv_fetchpvs("\017PEN", GV_ADD|GV_NOTQUAL,
2221                                          SVt_PV)))) {
2222                    U32 in  = PL_unicode & PERL_UNICODE_IN_FLAG;
2223                    U32 out = PL_unicode & PERL_UNICODE_OUT_FLAG;
2224                    if (in) {
2225                         if (out)
2226                              sv_setpvs(sv, ":utf8\0:utf8");
2227                         else
2228                              sv_setpvs(sv, ":utf8\0");
2229                    }
2230                    else if (out)
2231                         sv_setpvs(sv, "\0:utf8");
2232                    SvSETMAGIC(sv);
2233               }
2234          }
2235     }
2236 #endif
2237
2238     {
2239         const char *s;
2240     if ((s = PerlEnv_getenv("PERL_SIGNALS"))) {
2241          if (strEQ(s, "unsafe"))
2242               PL_signals |=  PERL_SIGNALS_UNSAFE_FLAG;
2243          else if (strEQ(s, "safe"))
2244               PL_signals &= ~PERL_SIGNALS_UNSAFE_FLAG;
2245          else
2246               Perl_croak(aTHX_ "PERL_SIGNALS illegal: \"%s\"", s);
2247     }
2248     }
2249
2250 #ifdef PERL_MAD
2251     {
2252         const char *s;
2253     if (!TAINTING_get &&
2254         (s = PerlEnv_getenv("PERL_XMLDUMP"))) {
2255         PL_madskills = 1;
2256         PL_minus_c = 1;
2257         if (!s || !s[0])
2258             PL_xmlfp = PerlIO_stdout();
2259         else {
2260             PL_xmlfp = PerlIO_open(s, "w");
2261             if (!PL_xmlfp)
2262                 Perl_croak(aTHX_ "Can't open %s", s);
2263         }
2264         my_setenv("PERL_XMLDUMP", NULL);        /* hide from subprocs */
2265     }
2266     }
2267
2268     {
2269         const char *s;
2270     if ((s = PerlEnv_getenv("PERL_MADSKILLS"))) {
2271         PL_madskills = atoi(s);
2272         my_setenv("PERL_MADSKILLS", NULL);      /* hide from subprocs */
2273     }
2274     }
2275 #endif
2276
2277     lex_start(linestr_sv, rsfp, lex_start_flags);
2278     SvREFCNT_dec(linestr_sv);
2279
2280     PL_subname = newSVpvs("main");
2281
2282     if (add_read_e_script)
2283         filter_add(read_e_script, NULL);
2284
2285     /* now parse the script */
2286
2287     SETERRNO(0,SS_NORMAL);
2288     if (yyparse(GRAMPROG) || PL_parser->error_count) {
2289         if (PL_minus_c)
2290             Perl_croak(aTHX_ "%s had compilation errors.\n", PL_origfilename);
2291         else {
2292             Perl_croak(aTHX_ "Execution of %s aborted due to compilation errors.\n",
2293                        PL_origfilename);
2294         }
2295     }
2296     CopLINE_set(PL_curcop, 0);
2297     SET_CURSTASH(PL_defstash);
2298     if (PL_e_script) {
2299         SvREFCNT_dec(PL_e_script);
2300         PL_e_script = NULL;
2301     }
2302
2303     if (PL_do_undump)
2304         my_unexec();
2305
2306     if (isWARN_ONCE) {
2307         SAVECOPFILE(PL_curcop);
2308         SAVECOPLINE(PL_curcop);
2309         gv_check(PL_defstash);
2310     }
2311
2312     LEAVE;
2313     FREETMPS;
2314
2315 #ifdef MYMALLOC
2316     {
2317         const char *s;
2318     if ((s=PerlEnv_getenv("PERL_DEBUG_MSTATS")) && atoi(s) >= 2)
2319         dump_mstats("after compilation:");
2320     }
2321 #endif
2322
2323     ENTER;
2324     PL_restartjmpenv = NULL;
2325     PL_restartop = 0;
2326     return NULL;
2327 }
2328
2329 /*
2330 =for apidoc perl_run
2331
2332 Tells a Perl interpreter to run.  See L<perlembed>.
2333
2334 =cut
2335 */
2336
2337 int
2338 perl_run(pTHXx)
2339 {
2340     dVAR;
2341     I32 oldscope;
2342     int ret = 0;
2343     dJMPENV;
2344
2345     PERL_ARGS_ASSERT_PERL_RUN;
2346 #ifndef MULTIPLICITY
2347     PERL_UNUSED_ARG(my_perl);
2348 #endif
2349
2350     oldscope = PL_scopestack_ix;
2351 #ifdef VMS
2352     VMSISH_HUSHED = 0;
2353 #endif
2354
2355     JMPENV_PUSH(ret);
2356     switch (ret) {
2357     case 1:
2358         cxstack_ix = -1;                /* start context stack again */
2359         goto redo_body;
2360     case 0:                             /* normal completion */
2361  redo_body:
2362         run_body(oldscope);
2363         /* FALL THROUGH */
2364     case 2:                             /* my_exit() */
2365         while (PL_scopestack_ix > oldscope)
2366             LEAVE;
2367         FREETMPS;
2368         SET_CURSTASH(PL_defstash);
2369         if (!(PL_exit_flags & PERL_EXIT_DESTRUCT_END) &&
2370             PL_endav && !PL_minus_c) {
2371             PERL_SET_PHASE(PERL_PHASE_END);
2372             call_list(oldscope, PL_endav);
2373         }
2374 #ifdef MYMALLOC
2375         if (PerlEnv_getenv("PERL_DEBUG_MSTATS"))
2376             dump_mstats("after execution:  ");
2377 #endif
2378         ret = STATUS_EXIT;
2379         break;
2380     case 3:
2381         if (PL_restartop) {
2382             POPSTACK_TO(PL_mainstack);
2383             goto redo_body;
2384         }
2385         PerlIO_printf(Perl_error_log, "panic: restartop in perl_run\n");
2386         FREETMPS;
2387         ret = 1;
2388         break;
2389     }
2390
2391     JMPENV_POP;
2392     return ret;
2393 }
2394
2395 STATIC void
2396 S_run_body(pTHX_ I32 oldscope)
2397 {
2398     dVAR;
2399     DEBUG_r(PerlIO_printf(Perl_debug_log, "%s $` $& $' support (0x%x).\n",
2400                     PL_sawampersand ? "Enabling" : "Omitting",
2401                     (unsigned int)(PL_sawampersand)));
2402
2403     if (!PL_restartop) {
2404 #ifdef PERL_MAD
2405         if (PL_xmlfp) {
2406             xmldump_all();
2407             exit(0);    /* less likely to core dump than my_exit(0) */
2408         }
2409 #endif
2410 #ifdef DEBUGGING
2411         if (DEBUG_x_TEST || DEBUG_B_TEST)
2412             dump_all_perl(!DEBUG_B_TEST);
2413         if (!DEBUG_q_TEST)
2414           PERL_DEBUG(PerlIO_printf(Perl_debug_log, "\nEXECUTING...\n\n"));
2415 #endif
2416
2417         if (PL_minus_c) {
2418             PerlIO_printf(Perl_error_log, "%s syntax OK\n", PL_origfilename);
2419             my_exit(0);
2420         }
2421         if (PERLDB_SINGLE && PL_DBsingle)
2422             sv_setiv(PL_DBsingle, 1);
2423         if (PL_initav) {
2424             PERL_SET_PHASE(PERL_PHASE_INIT);
2425             call_list(oldscope, PL_initav);
2426         }
2427 #ifdef PERL_DEBUG_READONLY_OPS
2428         if (PL_main_root && PL_main_root->op_slabbed)
2429             Slab_to_ro(OpSLAB(PL_main_root));
2430 #endif
2431     }
2432
2433     /* do it */
2434
2435     PERL_SET_PHASE(PERL_PHASE_RUN);
2436
2437     if (PL_restartop) {
2438         PL_restartjmpenv = NULL;
2439         PL_op = PL_restartop;
2440         PL_restartop = 0;
2441         CALLRUNOPS(aTHX);
2442     }
2443     else if (PL_main_start) {
2444         CvDEPTH(PL_main_cv) = 1;
2445         PL_op = PL_main_start;
2446         CALLRUNOPS(aTHX);
2447     }
2448     my_exit(0);
2449     assert(0); /* NOTREACHED */
2450 }
2451
2452 /*
2453 =head1 SV Manipulation Functions
2454
2455 =for apidoc p||get_sv
2456
2457 Returns the SV of the specified Perl scalar.  C<flags> are passed to
2458 C<gv_fetchpv>.  If C<GV_ADD> is set and the
2459 Perl variable does not exist then it will be created.  If C<flags> is zero
2460 and the variable does not exist then NULL is returned.
2461
2462 =cut
2463 */
2464
2465 SV*
2466 Perl_get_sv(pTHX_ const char *name, I32 flags)
2467 {
2468     GV *gv;
2469
2470     PERL_ARGS_ASSERT_GET_SV;
2471
2472     gv = gv_fetchpv(name, flags, SVt_PV);
2473     if (gv)
2474         return GvSV(gv);
2475     return NULL;
2476 }
2477
2478 /*
2479 =head1 Array Manipulation Functions
2480
2481 =for apidoc p||get_av
2482
2483 Returns the AV of the specified Perl global or package array with the given
2484 name (so it won't work on lexical variables).  C<flags> are passed 
2485 to C<gv_fetchpv>.  If C<GV_ADD> is set and the
2486 Perl variable does not exist then it will be created.  If C<flags> is zero
2487 and the variable does not exist then NULL is returned.
2488
2489 Perl equivalent: C<@{"$name"}>.
2490
2491 =cut
2492 */
2493
2494 AV*
2495 Perl_get_av(pTHX_ const char *name, I32 flags)
2496 {
2497     GV* const gv = gv_fetchpv(name, flags, SVt_PVAV);
2498
2499     PERL_ARGS_ASSERT_GET_AV;
2500
2501     if (flags)
2502         return GvAVn(gv);
2503     if (gv)
2504         return GvAV(gv);
2505     return NULL;
2506 }
2507
2508 /*
2509 =head1 Hash Manipulation Functions
2510
2511 =for apidoc p||get_hv
2512
2513 Returns the HV of the specified Perl hash.  C<flags> are passed to
2514 C<gv_fetchpv>.  If C<GV_ADD> is set and the
2515 Perl variable does not exist then it will be created.  If C<flags> is zero
2516 and the variable does not exist then NULL is returned.
2517
2518 =cut
2519 */
2520
2521 HV*
2522 Perl_get_hv(pTHX_ const char *name, I32 flags)
2523 {
2524     GV* const gv = gv_fetchpv(name, flags, SVt_PVHV);
2525
2526     PERL_ARGS_ASSERT_GET_HV;
2527
2528     if (flags)
2529         return GvHVn(gv);
2530     if (gv)
2531         return GvHV(gv);
2532     return NULL;
2533 }
2534
2535 /*
2536 =head1 CV Manipulation Functions
2537
2538 =for apidoc p||get_cvn_flags
2539
2540 Returns the CV of the specified Perl subroutine.  C<flags> are passed to
2541 C<gv_fetchpvn_flags>.  If C<GV_ADD> is set and the Perl subroutine does not
2542 exist then it will be declared (which has the same effect as saying
2543 C<sub name;>).  If C<GV_ADD> is not set and the subroutine does not exist
2544 then NULL is returned.
2545
2546 =for apidoc p||get_cv
2547
2548 Uses C<strlen> to get the length of C<name>, then calls C<get_cvn_flags>.
2549
2550 =cut
2551 */
2552
2553 CV*
2554 Perl_get_cvn_flags(pTHX_ const char *name, STRLEN len, I32 flags)
2555 {
2556     GV* const gv = gv_fetchpvn_flags(name, len, flags, SVt_PVCV);
2557
2558     PERL_ARGS_ASSERT_GET_CVN_FLAGS;
2559
2560     /* XXX this is probably not what they think they're getting.
2561      * It has the same effect as "sub name;", i.e. just a forward
2562      * declaration! */
2563     if ((flags & ~GV_NOADD_MASK) && !GvCVu(gv)) {
2564         return newSTUB(gv,0);
2565     }
2566     if (gv)
2567         return GvCVu(gv);
2568     return NULL;
2569 }
2570
2571 /* Nothing in core calls this now, but we can't replace it with a macro and
2572    move it to mathoms.c as a macro would evaluate name twice.  */
2573 CV*
2574 Perl_get_cv(pTHX_ const char *name, I32 flags)
2575 {
2576     PERL_ARGS_ASSERT_GET_CV;
2577
2578     return get_cvn_flags(name, strlen(name), flags);
2579 }
2580
2581 /* Be sure to refetch the stack pointer after calling these routines. */
2582
2583 /*
2584
2585 =head1 Callback Functions
2586
2587 =for apidoc p||call_argv
2588
2589 Performs a callback to the specified named and package-scoped Perl subroutine 
2590 with C<argv> (a NULL-terminated array of strings) as arguments.  See
2591 L<perlcall>.
2592
2593 Approximate Perl equivalent: C<&{"$sub_name"}(@$argv)>.
2594
2595 =cut
2596 */
2597
2598 I32
2599 Perl_call_argv(pTHX_ const char *sub_name, I32 flags, char **argv)
2600
2601                         /* See G_* flags in cop.h */
2602                         /* null terminated arg list */
2603 {
2604     dVAR;
2605     dSP;
2606
2607     PERL_ARGS_ASSERT_CALL_ARGV;
2608
2609     PUSHMARK(SP);
2610     if (argv) {
2611         while (*argv) {
2612             mXPUSHs(newSVpv(*argv,0));
2613             argv++;
2614         }
2615         PUTBACK;
2616     }
2617     return call_pv(sub_name, flags);
2618 }
2619
2620 /*
2621 =for apidoc p||call_pv
2622
2623 Performs a callback to the specified Perl sub.  See L<perlcall>.
2624
2625 =cut
2626 */
2627
2628 I32
2629 Perl_call_pv(pTHX_ const char *sub_name, I32 flags)
2630                         /* name of the subroutine */
2631                         /* See G_* flags in cop.h */
2632 {
2633     PERL_ARGS_ASSERT_CALL_PV;
2634
2635     return call_sv(MUTABLE_SV(get_cv(sub_name, GV_ADD)), flags);
2636 }
2637
2638 /*
2639 =for apidoc p||call_method
2640
2641 Performs a callback to the specified Perl method.  The blessed object must
2642 be on the stack.  See L<perlcall>.
2643
2644 =cut
2645 */
2646
2647 I32
2648 Perl_call_method(pTHX_ const char *methname, I32 flags)
2649                         /* name of the subroutine */
2650                         /* See G_* flags in cop.h */
2651 {
2652     STRLEN len;
2653     SV* sv;
2654     PERL_ARGS_ASSERT_CALL_METHOD;
2655
2656     len = strlen(methname);
2657     sv = flags & G_METHOD_NAMED
2658         ? sv_2mortal(newSVpvn_share(methname, len,0))
2659         : newSVpvn_flags(methname, len, SVs_TEMP);
2660
2661     return call_sv(sv, flags | G_METHOD);
2662 }
2663
2664 /* May be called with any of a CV, a GV, or an SV containing the name. */
2665 /*
2666 =for apidoc p||call_sv
2667
2668 Performs a callback to the Perl sub whose name is in the SV.  See
2669 L<perlcall>.
2670
2671 =cut
2672 */
2673
2674 I32
2675 Perl_call_sv(pTHX_ SV *sv, VOL I32 flags)
2676                         /* See G_* flags in cop.h */
2677 {
2678     dVAR; dSP;
2679     LOGOP myop;         /* fake syntax tree node */
2680     UNOP method_unop;
2681     SVOP method_svop;
2682     I32 oldmark;
2683     VOL I32 retval = 0;
2684     I32 oldscope;
2685     bool oldcatch = CATCH_GET;
2686     int ret;
2687     OP* const oldop = PL_op;
2688     dJMPENV;
2689
2690     PERL_ARGS_ASSERT_CALL_SV;
2691
2692     if (flags & G_DISCARD) {
2693         ENTER;
2694         SAVETMPS;
2695     }
2696     if (!(flags & G_WANT)) {
2697         /* Backwards compatibility - as G_SCALAR was 0, it could be omitted.
2698          */
2699         flags |= G_SCALAR;
2700     }
2701
2702     Zero(&myop, 1, LOGOP);
2703     if (!(flags & G_NOARGS))
2704         myop.op_flags |= OPf_STACKED;
2705     myop.op_flags |= OP_GIMME_REVERSE(flags);
2706     SAVEOP();
2707     PL_op = (OP*)&myop;
2708
2709     EXTEND(PL_stack_sp, 1);
2710     if (!(flags & G_METHOD_NAMED))
2711         *++PL_stack_sp = sv;
2712     oldmark = TOPMARK;
2713     oldscope = PL_scopestack_ix;
2714
2715     if (PERLDB_SUB && PL_curstash != PL_debstash
2716            /* Handle first BEGIN of -d. */
2717           && (PL_DBcv || (PL_DBcv = GvCV(PL_DBsub)))
2718            /* Try harder, since this may have been a sighandler, thus
2719             * curstash may be meaningless. */
2720           && (SvTYPE(sv) != SVt_PVCV || CvSTASH((const CV *)sv) != PL_debstash)
2721           && !(flags & G_NODEBUG))
2722         myop.op_private |= OPpENTERSUB_DB;
2723
2724     if (flags & (G_METHOD|G_METHOD_NAMED)) {
2725         if ( flags & G_METHOD_NAMED ) {
2726             Zero(&method_svop, 1, SVOP);
2727             method_svop.op_next = (OP*)&myop;
2728             method_svop.op_ppaddr = PL_ppaddr[OP_METHOD_NAMED];
2729             method_svop.op_type = OP_METHOD_NAMED;
2730             method_svop.op_sv = sv;
2731             PL_op = (OP*)&method_svop;
2732         } else {
2733             Zero(&method_unop, 1, UNOP);
2734             method_unop.op_next = (OP*)&myop;
2735             method_unop.op_ppaddr = PL_ppaddr[OP_METHOD];
2736             method_unop.op_type = OP_METHOD;
2737             PL_op = (OP*)&method_unop;
2738         }
2739         myop.op_ppaddr = PL_ppaddr[OP_ENTERSUB];
2740         myop.op_type = OP_ENTERSUB;
2741
2742     }
2743
2744     if (!(flags & G_EVAL)) {
2745         CATCH_SET(TRUE);
2746         CALL_BODY_SUB((OP*)&myop);
2747         retval = PL_stack_sp - (PL_stack_base + oldmark);
2748         CATCH_SET(oldcatch);
2749     }
2750     else {
2751         myop.op_other = (OP*)&myop;
2752         PL_markstack_ptr--;
2753         create_eval_scope(flags|G_FAKINGEVAL);
2754         PL_markstack_ptr++;
2755
2756         JMPENV_PUSH(ret);
2757
2758         switch (ret) {
2759         case 0:
2760  redo_body:
2761             CALL_BODY_SUB((OP*)&myop);
2762             retval = PL_stack_sp - (PL_stack_base + oldmark);
2763             if (!(flags & G_KEEPERR)) {
2764                 CLEAR_ERRSV();
2765             }
2766             break;
2767         case 1:
2768             STATUS_ALL_FAILURE;
2769             /* FALL THROUGH */
2770         case 2:
2771             /* my_exit() was called */
2772             SET_CURSTASH(PL_defstash);
2773             FREETMPS;
2774             JMPENV_POP;
2775             my_exit_jump();
2776             assert(0); /* NOTREACHED */
2777         case 3:
2778             if (PL_restartop) {
2779                 PL_restartjmpenv = NULL;
2780                 PL_op = PL_restartop;
2781                 PL_restartop = 0;
2782                 goto redo_body;
2783             }
2784             PL_stack_sp = PL_stack_base + oldmark;
2785             if ((flags & G_WANT) == G_ARRAY)
2786                 retval = 0;
2787             else {
2788                 retval = 1;
2789                 *++PL_stack_sp = &PL_sv_undef;
2790             }
2791             break;
2792         }
2793
2794         if (PL_scopestack_ix > oldscope)
2795             delete_eval_scope();
2796         JMPENV_POP;
2797     }
2798
2799     if (flags & G_DISCARD) {
2800         PL_stack_sp = PL_stack_base + oldmark;
2801         retval = 0;
2802         FREETMPS;
2803         LEAVE;
2804     }
2805     PL_op = oldop;
2806     return retval;
2807 }
2808
2809 /* Eval a string. The G_EVAL flag is always assumed. */
2810
2811 /*
2812 =for apidoc p||eval_sv
2813
2814 Tells Perl to C<eval> the string in the SV.  It supports the same flags
2815 as C<call_sv>, with the obvious exception of G_EVAL.  See L<perlcall>.
2816
2817 =cut
2818 */
2819
2820 I32
2821 Perl_eval_sv(pTHX_ SV *sv, I32 flags)
2822
2823                         /* See G_* flags in cop.h */
2824 {
2825     dVAR;
2826     dSP;
2827     UNOP myop;          /* fake syntax tree node */
2828     VOL I32 oldmark = SP - PL_stack_base;
2829     VOL I32 retval = 0;
2830     int ret;
2831     OP* const oldop = PL_op;
2832     dJMPENV;
2833
2834     PERL_ARGS_ASSERT_EVAL_SV;
2835
2836     if (flags & G_DISCARD) {
2837         ENTER;
2838         SAVETMPS;
2839     }
2840
2841     SAVEOP();
2842     PL_op = (OP*)&myop;
2843     Zero(&myop, 1, UNOP);
2844     EXTEND(PL_stack_sp, 1);
2845     *++PL_stack_sp = sv;
2846
2847     if (!(flags & G_NOARGS))
2848         myop.op_flags = OPf_STACKED;
2849     myop.op_type = OP_ENTEREVAL;
2850     myop.op_flags |= OP_GIMME_REVERSE(flags);
2851     if (flags & G_KEEPERR)
2852         myop.op_flags |= OPf_SPECIAL;
2853
2854     if (flags & G_RE_REPARSING)
2855         myop.op_private = (OPpEVAL_COPHH | OPpEVAL_RE_REPARSING);
2856
2857     /* fail now; otherwise we could fail after the JMPENV_PUSH but
2858      * before a PUSHEVAL, which corrupts the stack after a croak */
2859     TAINT_PROPER("eval_sv()");
2860
2861     JMPENV_PUSH(ret);
2862     switch (ret) {
2863     case 0:
2864  redo_body:
2865         if (PL_op == (OP*)(&myop)) {
2866             PL_op = PL_ppaddr[OP_ENTEREVAL](aTHX);
2867             if (!PL_op)
2868                 goto fail; /* failed in compilation */
2869         }
2870         CALLRUNOPS(aTHX);
2871         retval = PL_stack_sp - (PL_stack_base + oldmark);
2872         if (!(flags & G_KEEPERR)) {
2873             CLEAR_ERRSV();
2874         }
2875         break;
2876     case 1:
2877         STATUS_ALL_FAILURE;
2878         /* FALL THROUGH */
2879     case 2:
2880         /* my_exit() was called */
2881         SET_CURSTASH(PL_defstash);
2882         FREETMPS;
2883         JMPENV_POP;
2884         my_exit_jump();
2885         assert(0); /* NOTREACHED */
2886     case 3:
2887         if (PL_restartop) {
2888             PL_restartjmpenv = NULL;
2889             PL_op = PL_restartop;
2890             PL_restartop = 0;
2891             goto redo_body;
2892         }
2893       fail:
2894         PL_stack_sp = PL_stack_base + oldmark;
2895         if ((flags & G_WANT) == G_ARRAY)
2896             retval = 0;
2897         else {
2898             retval = 1;
2899             *++PL_stack_sp = &PL_sv_undef;
2900         }
2901         break;
2902     }
2903
2904     JMPENV_POP;
2905     if (flags & G_DISCARD) {
2906         PL_stack_sp = PL_stack_base + oldmark;
2907         retval = 0;
2908         FREETMPS;
2909         LEAVE;
2910     }
2911     PL_op = oldop;
2912     return retval;
2913 }
2914
2915 /*
2916 =for apidoc p||eval_pv
2917
2918 Tells Perl to C<eval> the given string and return an SV* result.
2919
2920 =cut
2921 */
2922
2923 SV*
2924 Perl_eval_pv(pTHX_ const char *p, I32 croak_on_error)
2925 {
2926     dVAR;
2927     SV* sv = newSVpv(p, 0);
2928
2929     PERL_ARGS_ASSERT_EVAL_PV;
2930
2931     eval_sv(sv, G_SCALAR);
2932     SvREFCNT_dec(sv);
2933
2934     {
2935         dSP;
2936         sv = POPs;
2937         PUTBACK;
2938     }
2939
2940     /* just check empty string or undef? */
2941     if (croak_on_error) {
2942         SV * const errsv = ERRSV;
2943         if(SvTRUE_NN(errsv))
2944             /* replace with croak_sv? */
2945             Perl_croak_nocontext("%s", SvPV_nolen_const(errsv));
2946     }
2947
2948     return sv;
2949 }
2950
2951 /* Require a module. */
2952
2953 /*
2954 =head1 Embedding Functions
2955
2956 =for apidoc p||require_pv
2957
2958 Tells Perl to C<require> the file named by the string argument.  It is
2959 analogous to the Perl code C<eval "require '$file'">.  It's even
2960 implemented that way; consider using load_module instead.
2961
2962 =cut */
2963
2964 void
2965 Perl_require_pv(pTHX_ const char *pv)
2966 {
2967     dVAR;
2968     dSP;
2969     SV* sv;
2970
2971     PERL_ARGS_ASSERT_REQUIRE_PV;
2972
2973     PUSHSTACKi(PERLSI_REQUIRE);
2974     sv = Perl_newSVpvf(aTHX_ "require q%c%s%c", 0, pv, 0);
2975     eval_sv(sv_2mortal(sv), G_DISCARD);
2976     POPSTACK;
2977 }
2978
2979 STATIC void
2980 S_usage(pTHX)           /* XXX move this out into a module ? */
2981 {
2982     /* This message really ought to be max 23 lines.
2983      * Removed -h because the user already knows that option. Others? */
2984
2985     /* Grouped as 6 lines per C string literal, to keep under the ANSI C 89
2986        minimum of 509 character string literals.  */
2987     static const char * const usage_msg[] = {
2988 "  -0[octal]         specify record separator (\\0, if no argument)\n"
2989 "  -a                autosplit mode with -n or -p (splits $_ into @F)\n"
2990 "  -C[number/list]   enables the listed Unicode features\n"
2991 "  -c                check syntax only (runs BEGIN and CHECK blocks)\n"
2992 "  -d[:debugger]     run program under debugger\n"
2993 "  -D[number/list]   set debugging flags (argument is a bit mask or alphabets)\n",
2994 "  -e program        one line of program (several -e's allowed, omit programfile)\n"
2995 "  -E program        like -e, but enables all optional features\n"
2996 "  -f                don't do $sitelib/sitecustomize.pl at startup\n"
2997 "  -F/pattern/       split() pattern for -a switch (//'s are optional)\n"
2998 "  -i[extension]     edit <> files in place (makes backup if extension supplied)\n"
2999 "  -Idirectory       specify @INC/#include directory (several -I's allowed)\n",
3000 "  -l[octal]         enable line ending processing, specifies line terminator\n"
3001 "  -[mM][-]module    execute \"use/no module...\" before executing program\n"
3002 "  -n                assume \"while (<>) { ... }\" loop around program\n"
3003 "  -p                assume loop like -n but print line also, like sed\n"
3004 "  -s                enable rudimentary parsing for switches after programfile\n"
3005 "  -S                look for programfile using PATH environment variable\n",
3006 "  -t                enable tainting warnings\n"
3007 "  -T                enable tainting checks\n"
3008 "  -u                dump core after parsing program\n"
3009 "  -U                allow unsafe operations\n"
3010 "  -v                print version, patchlevel and license\n"
3011 "  -V[:variable]     print configuration summary (or a single Config.pm variable)\n",
3012 "  -w                enable many useful warnings\n"
3013 "  -W                enable all warnings\n"
3014 "  -x[directory]     ignore text before #!perl line (optionally cd to directory)\n"
3015 "  -X                disable all warnings\n"
3016 "  \n"
3017 "Run 'perldoc perl' for more help with Perl.\n\n",
3018 NULL
3019 };
3020     const char * const *p = usage_msg;
3021     PerlIO *out = PerlIO_stdout();
3022
3023     PerlIO_printf(out,
3024                   "\nUsage: %s [switches] [--] [programfile] [arguments]\n",
3025                   PL_origargv[0]);
3026     while (*p)
3027         PerlIO_puts(out, *p++);
3028     my_exit(0);
3029 }
3030
3031 /* convert a string of -D options (or digits) into an int.
3032  * sets *s to point to the char after the options */
3033
3034 #ifdef DEBUGGING
3035 int
3036 Perl_get_debug_opts(pTHX_ const char **s, bool givehelp)
3037 {
3038     static const char * const usage_msgd[] = {
3039       " Debugging flag values: (see also -d)\n"
3040       "  p  Tokenizing and parsing (with v, displays parse stack)\n"
3041       "  s  Stack snapshots (with v, displays all stacks)\n"
3042       "  l  Context (loop) stack processing\n"
3043       "  t  Trace execution\n"
3044       "  o  Method and overloading resolution\n",
3045       "  c  String/numeric conversions\n"
3046       "  P  Print profiling info, source file input state\n"
3047       "  m  Memory and SV allocation\n"
3048       "  f  Format processing\n"
3049       "  r  Regular expression parsing and execution\n"
3050       "  x  Syntax tree dump\n",
3051       "  u  Tainting checks\n"
3052       "  H  Hash dump -- usurps values()\n"
3053       "  X  Scratchpad allocation\n"
3054       "  D  Cleaning up\n"
3055       "  S  Op slab allocation\n"
3056       "  T  Tokenising\n"
3057       "  R  Include reference counts of dumped variables (eg when using -Ds)\n",
3058       "  J  Do not s,t,P-debug (Jump over) opcodes within package DB\n"
3059       "  v  Verbose: use in conjunction with other flags\n"
3060       "  C  Copy On Write\n"
3061       "  A  Consistency checks on internal structures\n"
3062       "  q  quiet - currently only suppresses the 'EXECUTING' message\n"
3063       "  M  trace smart match resolution\n"
3064       "  B  dump suBroutine definitions, including special Blocks like BEGIN\n",
3065       "  L  trace some locale setting information--for Perl core development\n",
3066       NULL
3067     };
3068     int i = 0;
3069
3070     PERL_ARGS_ASSERT_GET_DEBUG_OPTS;
3071
3072     if (isALPHA(**s)) {
3073         /* if adding extra options, remember to update DEBUG_MASK */
3074         static const char debopts[] = "psltocPmfrxuUHXDSTRJvCAqMBL";
3075
3076         for (; isWORDCHAR(**s); (*s)++) {
3077             const char * const d = strchr(debopts,**s);
3078             if (d)
3079                 i |= 1 << (d - debopts);
3080             else if (ckWARN_d(WARN_DEBUGGING))
3081                 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
3082                     "invalid option -D%c, use -D'' to see choices\n", **s);
3083         }
3084     }
3085     else if (isDIGIT(**s)) {
3086         i = atoi(*s);
3087         for (; isWORDCHAR(**s); (*s)++) ;
3088     }
3089     else if (givehelp) {
3090       const char *const *p = usage_msgd;
3091       while (*p) PerlIO_puts(PerlIO_stdout(), *p++);
3092     }
3093 #  ifdef EBCDIC
3094     if ((i & DEBUG_p_FLAG) && ckWARN_d(WARN_DEBUGGING))
3095         Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
3096                 "-Dp not implemented on this platform\n");
3097 #  endif
3098     return i;
3099 }
3100 #endif
3101
3102 /* This routine handles any switches that can be given during run */
3103
3104 const char *
3105 Perl_moreswitches(pTHX_ const char *s)
3106 {
3107     dVAR;
3108     UV rschar;
3109     const char option = *s; /* used to remember option in -m/-M code */
3110
3111     PERL_ARGS_ASSERT_MORESWITCHES;
3112
3113     switch (*s) {
3114     case '0':
3115     {
3116          I32 flags = 0;
3117          STRLEN numlen;
3118
3119          SvREFCNT_dec(PL_rs);
3120          if (s[1] == 'x' && s[2]) {
3121               const char *e = s+=2;
3122               U8 *tmps;
3123
3124               while (*e)
3125                 e++;
3126               numlen = e - s;
3127               flags = PERL_SCAN_SILENT_ILLDIGIT;
3128               rschar = (U32)grok_hex(s, &numlen, &flags, NULL);
3129               if (s + numlen < e) {
3130                    rschar = 0; /* Grandfather -0xFOO as -0 -xFOO. */
3131                    numlen = 0;
3132                    s--;
3133               }
3134               PL_rs = newSVpvs("");
3135               SvGROW(PL_rs, (STRLEN)(UNISKIP(rschar) + 1));
3136               tmps = (U8*)SvPVX(PL_rs);
3137               uvchr_to_utf8(tmps, rschar);
3138               SvCUR_set(PL_rs, UNISKIP(rschar));
3139               SvUTF8_on(PL_rs);
3140          }
3141          else {
3142               numlen = 4;
3143               rschar = (U32)grok_oct(s, &numlen, &flags, NULL);
3144               if (rschar & ~((U8)~0))
3145                    PL_rs = &PL_sv_undef;
3146               else if (!rschar && numlen >= 2)
3147                    PL_rs = newSVpvs("");
3148               else {
3149                    char ch = (char)rschar;
3150                    PL_rs = newSVpvn(&ch, 1);
3151               }
3152          }
3153          sv_setsv(get_sv("/", GV_ADD), PL_rs);
3154          return s + numlen;
3155     }
3156     case 'C':
3157         s++;
3158         PL_unicode = parse_unicode_opts( (const char **)&s );
3159         if (PL_unicode & PERL_UNICODE_UTF8CACHEASSERT_FLAG)
3160             PL_utf8cache = -1;
3161         return s;
3162     case 'F':
3163         PL_minus_a = TRUE;
3164         PL_minus_F = TRUE;
3165         PL_minus_n = TRUE;
3166         PL_splitstr = ++s;
3167         while (*s && !isSPACE(*s)) ++s;
3168         PL_splitstr = savepvn(PL_splitstr, s - PL_splitstr);
3169         return s;
3170     case 'a':
3171         PL_minus_a = TRUE;
3172         PL_minus_n = TRUE;
3173         s++;
3174         return s;
3175     case 'c':
3176         PL_minus_c = TRUE;
3177         s++;
3178         return s;
3179     case 'd':
3180         forbid_setid('d', FALSE);
3181         s++;
3182
3183         /* -dt indicates to the debugger that threads will be used */
3184         if (*s == 't' && !isWORDCHAR(s[1])) {
3185             ++s;
3186             my_setenv("PERL5DB_THREADED", "1");
3187         }
3188
3189         /* The following permits -d:Mod to accepts arguments following an =
3190            in the fashion that -MSome::Mod does. */
3191         if (*s == ':' || *s == '=') {
3192             const char *start;
3193             const char *end;
3194             SV *sv;
3195
3196             if (*++s == '-') {
3197                 ++s;
3198                 sv = newSVpvs("no Devel::");
3199             } else {
3200                 sv = newSVpvs("use Devel::");
3201             }
3202
3203             start = s;
3204             end = s + strlen(s);
3205
3206             /* We now allow -d:Module=Foo,Bar and -d:-Module */
3207             while(isWORDCHAR(*s) || *s==':') ++s;
3208             if (*s != '=')
3209                 sv_catpvn(sv, start, end - start);
3210             else {
3211                 sv_catpvn(sv, start, s-start);
3212                 /* Don't use NUL as q// delimiter here, this string goes in the
3213                  * environment. */
3214                 Perl_sv_catpvf(aTHX_ sv, " split(/,/,q{%s});", ++s);
3215             }
3216             s = end;
3217             my_setenv("PERL5DB", SvPV_nolen_const(sv));
3218             SvREFCNT_dec(sv);
3219         }
3220         if (!PL_perldb) {
3221             PL_perldb = PERLDB_ALL;
3222             init_debugger();
3223         }
3224         return s;
3225     case 'D':
3226     {   
3227 #ifdef DEBUGGING
3228         forbid_setid('D', FALSE);
3229         s++;
3230         PL_debug = get_debug_opts( (const char **)&s, 1) | DEBUG_TOP_FLAG;
3231 #else /* !DEBUGGING */
3232         if (ckWARN_d(WARN_DEBUGGING))
3233             Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
3234                    "Recompile perl with -DDEBUGGING to use -D switch (did you mean -d ?)\n");
3235         for (s++; isWORDCHAR(*s); s++) ;
3236 #endif
3237         return s;
3238     }   
3239     case 'h':
3240         usage();
3241     case 'i':
3242         Safefree(PL_inplace);
3243 #if defined(__CYGWIN__) /* do backup extension automagically */
3244         if (*(s+1) == '\0') {
3245         PL_inplace = savepvs(".bak");
3246         return s+1;
3247         }
3248 #endif /* __CYGWIN__ */
3249         {
3250             const char * const start = ++s;
3251             while (*s && !isSPACE(*s))
3252                 ++s;
3253
3254             PL_inplace = savepvn(start, s - start);
3255         }
3256         if (*s) {
3257             ++s;
3258             if (*s == '-')      /* Additional switches on #! line. */
3259                 s++;
3260         }
3261         return s;
3262     case 'I':   /* -I handled both here and in parse_body() */
3263         forbid_setid('I', FALSE);
3264         ++s;
3265         while (*s && isSPACE(*s))
3266             ++s;
3267         if (*s) {
3268             const char *e, *p;
3269             p = s;
3270             /* ignore trailing spaces (possibly followed by other switches) */
3271             do {
3272                 for (e = p; *e && !isSPACE(*e); e++) ;
3273                 p = e;
3274                 while (isSPACE(*p))
3275                     p++;
3276             } while (*p && *p != '-');
3277             incpush(s, e-s,
3278                     INCPUSH_ADD_SUB_DIRS|INCPUSH_ADD_OLD_VERS|INCPUSH_UNSHIFT);
3279             s = p;
3280             if (*s == '-')
3281                 s++;
3282         }
3283         else
3284             Perl_croak(aTHX_ "No directory specified for -I");
3285         return s;
3286     case 'l':
3287         PL_minus_l = TRUE;
3288         s++;
3289         if (PL_ors_sv) {
3290             SvREFCNT_dec(PL_ors_sv);
3291             PL_ors_sv = NULL;
3292         }
3293         if (isDIGIT(*s)) {
3294             I32 flags = 0;
3295             STRLEN numlen;
3296             PL_ors_sv = newSVpvs("\n");
3297             numlen = 3 + (*s == '0');
3298             *SvPVX(PL_ors_sv) = (char)grok_oct(s, &numlen, &flags, NULL);
3299             s += numlen;
3300         }
3301         else {
3302             if (RsPARA(PL_rs)) {
3303                 PL_ors_sv = newSVpvs("\n\n");
3304             }
3305             else {
3306                 PL_ors_sv = newSVsv(PL_rs);
3307             }
3308         }
3309         return s;
3310     case 'M':
3311         forbid_setid('M', FALSE);       /* XXX ? */
3312         /* FALL THROUGH */
3313     case 'm':
3314         forbid_setid('m', FALSE);       /* XXX ? */
3315         if (*++s) {
3316             const char *start;
3317             const char *end;
3318             SV *sv;
3319             const char *use = "use ";
3320             bool colon = FALSE;
3321             /* -M-foo == 'no foo'       */
3322             /* Leading space on " no " is deliberate, to make both
3323                possibilities the same length.  */
3324             if (*s == '-') { use = " no "; ++s; }
3325             sv = newSVpvn(use,4);
3326             start = s;
3327             /* We allow -M'Module qw(Foo Bar)'  */
3328             while(isWORDCHAR(*s) || *s==':') {
3329                 if( *s++ == ':' ) {
3330                     if( *s == ':' ) 
3331                         s++;
3332                     else
3333                         colon = TRUE;
3334                 }
3335             }
3336             if (s == start)
3337                 Perl_croak(aTHX_ "Module name required with -%c option",
3338                                     option);
3339             if (colon) 
3340                 Perl_croak(aTHX_ "Invalid module name %.*s with -%c option: "
3341                                     "contains single ':'",
3342                                     (int)(s - start), start, option);
3343             end = s + strlen(s);
3344             if (*s != '=') {
3345                 sv_catpvn(sv, start, end - start);
3346                 if (option == 'm') {
3347                     if (*s != '\0')
3348                         Perl_croak(aTHX_ "Can't use '%c' after -mname", *s);
3349                     sv_catpvs( sv, " ()");
3350                 }
3351             } else {
3352                 sv_catpvn(sv, start, s-start);
3353                 /* Use NUL as q''-delimiter.  */
3354                 sv_catpvs(sv, " split(/,/,q\0");
3355                 ++s;
3356                 sv_catpvn(sv, s, end - s);
3357                 sv_catpvs(sv,  "\0)");
3358             }
3359             s = end;
3360             Perl_av_create_and_push(aTHX_ &PL_preambleav, sv);
3361         }
3362         else
3363             Perl_croak(aTHX_ "Missing argument to -%c", option);
3364         return s;
3365     case 'n':
3366         PL_minus_n = TRUE;
3367         s++;
3368         return s;
3369     case 'p':
3370         PL_minus_p = TRUE;
3371         s++;
3372         return s;
3373     case 's':
3374         forbid_setid('s', FALSE);
3375         PL_doswitches = TRUE;
3376         s++;
3377         return s;
3378     case 't':
3379     case 'T':
3380 #if defined(SILENT_NO_TAINT_SUPPORT)
3381             /* silently ignore */
3382 #elif defined(NO_TAINT_SUPPORT)
3383         Perl_croak_nocontext("This perl was compiled without taint support. "
3384                    "Cowardly refusing to run with -t or -T flags");
3385 #else
3386         if (!TAINTING_get)
3387             TOO_LATE_FOR(*s);
3388 #endif
3389         s++;
3390         return s;
3391     case 'u':
3392         PL_do_undump = TRUE;
3393         s++;
3394         return s;
3395     case 'U':
3396         PL_unsafe = TRUE;
3397         s++;
3398         return s;
3399     case 'v':
3400         minus_v();
3401     case 'w':
3402         if (! (PL_dowarn & G_WARN_ALL_MASK)) {
3403             PL_dowarn |= G_WARN_ON;
3404         }
3405         s++;
3406         return s;
3407     case 'W':
3408         PL_dowarn = G_WARN_ALL_ON|G_WARN_ON;
3409         if (!specialWARN(PL_compiling.cop_warnings))
3410             PerlMemShared_free(PL_compiling.cop_warnings);
3411         PL_compiling.cop_warnings = pWARN_ALL ;
3412         s++;
3413         return s;
3414     case 'X':
3415         PL_dowarn = G_WARN_ALL_OFF;
3416         if (!specialWARN(PL_compiling.cop_warnings))
3417             PerlMemShared_free(PL_compiling.cop_warnings);
3418         PL_compiling.cop_warnings = pWARN_NONE ;
3419         s++;
3420         return s;
3421     case '*':
3422     case ' ':
3423         while( *s == ' ' )
3424           ++s;
3425         if (s[0] == '-')        /* Additional switches on #! line. */
3426             return s+1;
3427         break;
3428     case '-':
3429     case 0:
3430 #if defined(WIN32) || !defined(PERL_STRICT_CR)
3431     case '\r':
3432 #endif
3433     case '\n':
3434     case '\t':
3435         break;
3436 #ifdef ALTERNATE_SHEBANG
3437     case 'S':                   /* OS/2 needs -S on "extproc" line. */
3438         break;
3439 #endif
3440     case 'e': case 'f': case 'x': case 'E':
3441 #ifndef ALTERNATE_SHEBANG
3442     case 'S':
3443 #endif
3444     case 'V':
3445         Perl_croak(aTHX_ "Can't emulate -%.1s on #! line",s);
3446     default:
3447         Perl_croak(aTHX_
3448             "Unrecognized switch: -%.1s  (-h will show valid options)",s
3449         );
3450     }
3451     return NULL;
3452 }
3453
3454
3455 STATIC void
3456 S_minus_v(pTHX)
3457 {
3458         PerlIO * PIO_stdout;
3459         {
3460             const char * const level_str = "v" PERL_VERSION_STRING;
3461             const STRLEN level_len = sizeof("v" PERL_VERSION_STRING)-1;
3462 #ifdef PERL_PATCHNUM
3463             SV* level;
3464 #  ifdef PERL_GIT_UNCOMMITTED_CHANGES
3465             static const char num [] = PERL_PATCHNUM "*";
3466 #  else
3467             static const char num [] = PERL_PATCHNUM;
3468 #  endif
3469             {
3470                 const STRLEN num_len = sizeof(num)-1;
3471                 /* A very advanced compiler would fold away the strnEQ
3472                    and this whole conditional, but most (all?) won't do it.
3473                    SV level could also be replaced by with preprocessor
3474                    catenation.
3475                 */
3476                 if (num_len >= level_len && strnEQ(num,level_str,level_len)) {
3477                     /* per 46807d8e80, PERL_PATCHNUM is outside of the control
3478                        of the interp so it might contain format characters
3479                     */
3480                     level = newSVpvn(num, num_len);
3481                 } else {
3482                     level = Perl_newSVpvf_nocontext("%s (%s)", level_str, num);
3483                 }
3484             }
3485 #else
3486         SV* level = newSVpvn(level_str, level_len);
3487 #endif /* #ifdef PERL_PATCHNUM */
3488         PIO_stdout =  PerlIO_stdout();
3489             PerlIO_printf(PIO_stdout,
3490                 "\nThis is perl "       STRINGIFY(PERL_REVISION)
3491                 ", version "            STRINGIFY(PERL_VERSION)
3492                 ", subversion "         STRINGIFY(PERL_SUBVERSION)
3493                 " (%"SVf") built for "  ARCHNAME, level
3494                 );
3495             SvREFCNT_dec_NN(level);
3496         }
3497 #if defined(LOCAL_PATCH_COUNT)
3498         if (LOCAL_PATCH_COUNT > 0)
3499             PerlIO_printf(PIO_stdout,
3500                           "\n(with %d registered patch%s, "
3501                           "see perl -V for more detail)",
3502                           LOCAL_PATCH_COUNT,
3503                           (LOCAL_PATCH_COUNT!=1) ? "es" : "");
3504 #endif
3505
3506         PerlIO_printf(PIO_stdout,
3507                       "\n\nCopyright 1987-2014, Larry Wall\n");
3508 #ifdef MSDOS
3509         PerlIO_printf(PIO_stdout,
3510                       "\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
3511 #endif
3512 #ifdef DJGPP
3513         PerlIO_printf(PIO_stdout,
3514                       "djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n"
3515                       "djgpp v2 port (perl5004+) by Laszlo Molnar, 1997-1999\n");
3516 #endif
3517 #ifdef OS2
3518         PerlIO_printf(PIO_stdout,
3519                       "\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
3520                       "Version 5 port Copyright (c) 1994-2002, Andreas Kaiser, Ilya Zakharevich\n");
3521 #endif
3522 #ifdef OEMVS
3523         PerlIO_printf(PIO_stdout,
3524                       "MVS (OS390) port by Mortice Kern Systems, 1997-1999\n");
3525 #endif
3526 #ifdef __VOS__
3527         PerlIO_printf(PIO_stdout,
3528                       "Stratus OpenVOS port by Paul.Green@stratus.com, 1997-2013\n");
3529 #endif
3530 #ifdef POSIX_BC
3531         PerlIO_printf(PIO_stdout,
3532                       "BS2000 (POSIX) port by Start Amadeus GmbH, 1998-1999\n");
3533 #endif
3534 #ifdef UNDER_CE
3535         PerlIO_printf(PIO_stdout,
3536                         "WINCE port by Rainer Keuchel, 2001-2002\n"
3537                         "Built on " __DATE__ " " __TIME__ "\n\n");
3538         wce_hitreturn();
3539 #endif
3540 #ifdef __SYMBIAN32__
3541         PerlIO_printf(PIO_stdout,
3542                       "Symbian port by Nokia, 2004-2005\n");
3543 #endif
3544 #ifdef BINARY_BUILD_NOTICE
3545         BINARY_BUILD_NOTICE;
3546 #endif
3547         PerlIO_printf(PIO_stdout,
3548                       "\n\
3549 Perl may be copied only under the terms of either the Artistic License or the\n\
3550 GNU General Public License, which may be found in the Perl 5 source kit.\n\n\
3551 Complete documentation for Perl, including FAQ lists, should be found on\n\
3552 this system using \"man perl\" or \"perldoc perl\".  If you have access to the\n\
3553 Internet, point your browser at http://www.perl.org/, the Perl Home Page.\n\n");
3554         my_exit(0);
3555 }
3556
3557 /* compliments of Tom Christiansen */
3558
3559 /* unexec() can be found in the Gnu emacs distribution */
3560 /* Known to work with -DUNEXEC and using unexelf.c from GNU emacs-20.2 */
3561
3562 #ifdef VMS
3563 #include <lib$routines.h>
3564 #endif
3565
3566 void
3567 Perl_my_unexec(pTHX)
3568 {
3569     PERL_UNUSED_CONTEXT;
3570 #ifdef UNEXEC
3571     SV *    prog = newSVpv(BIN_EXP, 0);
3572     SV *    file = newSVpv(PL_origfilename, 0);
3573     int    status = 1;
3574     extern int etext;
3575
3576     sv_catpvs(prog, "/perl");
3577     sv_catpvs(file, ".perldump");
3578
3579     unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
3580     /* unexec prints msg to stderr in case of failure */
3581     PerlProc_exit(status);
3582 #else
3583 #  ifdef VMS
3584      lib$signal(SS$_DEBUG);  /* ssdef.h #included from vmsish.h */
3585 #  elif defined(WIN32) || defined(__CYGWIN__)
3586     Perl_croak(aTHX_ "dump is not supported");
3587 #  else
3588     ABORT();            /* for use with undump */
3589 #  endif
3590 #endif
3591 }
3592
3593 /* initialize curinterp */
3594 STATIC void
3595 S_init_interp(pTHX)
3596 {
3597     dVAR;
3598 #ifdef MULTIPLICITY
3599 #  define PERLVAR(prefix,var,type)
3600 #  define PERLVARA(prefix,var,n,type)
3601 #  if defined(PERL_IMPLICIT_CONTEXT)
3602 #    define PERLVARI(prefix,var,type,init)      aTHX->prefix##var = init;
3603 #    define PERLVARIC(prefix,var,type,init)     aTHX->prefix##var = init;
3604 #  else
3605 #    define PERLVARI(prefix,var,type,init)      PERL_GET_INTERP->var = init;
3606 #    define PERLVARIC(prefix,var,type,init)     PERL_GET_INTERP->var = init;
3607 #  endif
3608 #  include "intrpvar.h"
3609 #  undef PERLVAR
3610 #  undef PERLVARA
3611 #  undef PERLVARI
3612 #  undef PERLVARIC
3613 #else
3614 #  define PERLVAR(prefix,var,type)
3615 #  define PERLVARA(prefix,var,n,type)
3616 #  define PERLVARI(prefix,var,type,init)        PL_##var = init;
3617 #  define PERLVARIC(prefix,var,type,init)       PL_##var = init;
3618 #  include "intrpvar.h"
3619 #  undef PERLVAR
3620 #  undef PERLVARA
3621 #  undef PERLVARI
3622 #  undef PERLVARIC
3623 #endif
3624
3625 }
3626
3627 STATIC void
3628 S_init_main_stash(pTHX)
3629 {
3630     dVAR;
3631     GV *gv;
3632
3633     PL_curstash = PL_defstash = (HV *)SvREFCNT_inc_simple_NN(newHV());
3634     /* We know that the string "main" will be in the global shared string
3635        table, so it's a small saving to use it rather than allocate another
3636        8 bytes.  */
3637     PL_curstname = newSVpvs_share("main");
3638     gv = gv_fetchpvs("main::", GV_ADD|GV_NOTQUAL, SVt_PVHV);
3639     /* If we hadn't caused another reference to "main" to be in the shared
3640        string table above, then it would be worth reordering these two,
3641        because otherwise all we do is delete "main" from it as a consequence
3642        of the SvREFCNT_dec, only to add it again with hv_name_set */
3643     SvREFCNT_dec(GvHV(gv));
3644     hv_name_set(PL_defstash, "main", 4, 0);
3645     GvHV(gv) = MUTABLE_HV(SvREFCNT_inc_simple(PL_defstash));
3646     SvREADONLY_on(gv);
3647     PL_incgv = gv_HVadd(gv_AVadd(gv_fetchpvs("INC", GV_ADD|GV_NOTQUAL,
3648                                              SVt_PVAV)));
3649     SvREFCNT_inc_simple_void(PL_incgv); /* Don't allow it to be freed */
3650     GvMULTI_on(PL_incgv);
3651     PL_hintgv = gv_fetchpvs("\010", GV_ADD|GV_NOTQUAL, SVt_PV); /* ^H */
3652     SvREFCNT_inc_simple_void(PL_hintgv);
3653     GvMULTI_on(PL_hintgv);
3654     PL_defgv = gv_fetchpvs("_", GV_ADD|GV_NOTQUAL, SVt_PVAV);
3655     SvREFCNT_inc_simple_void(PL_defgv);
3656     PL_errgv = gv_fetchpvs("@", GV_ADD|GV_NOTQUAL, SVt_PV);
3657     SvREFCNT_inc_simple_void(PL_errgv);
3658     GvMULTI_on(PL_errgv);
3659     PL_replgv = gv_fetchpvs("\022", GV_ADD|GV_NOTQUAL, SVt_PV); /* ^R */
3660     SvREFCNT_inc_simple_void(PL_replgv);
3661     GvMULTI_on(PL_replgv);
3662     (void)Perl_form(aTHX_ "%240s","");  /* Preallocate temp - for immediate signals. */
3663 #ifdef PERL_DONT_CREATE_GVSV
3664     gv_SVadd(PL_errgv);
3665 #endif
3666     sv_grow(ERRSV, 240);        /* Preallocate - for immediate signals. */
3667     CLEAR_ERRSV();
3668     SET_CURSTASH(PL_defstash);
3669     CopSTASH_set(&PL_compiling, PL_defstash);
3670     PL_debstash = GvHV(gv_fetchpvs("DB::", GV_ADDMULTI, SVt_PVHV));
3671     PL_globalstash = GvHV(gv_fetchpvs("CORE::GLOBAL::", GV_ADDMULTI,
3672                                       SVt_PVHV));
3673     /* We must init $/ before switches are processed. */
3674     sv_setpvs(get_sv("/", GV_ADD), "\n");
3675 }
3676
3677 STATIC PerlIO *
3678 S_open_script(pTHX_ const char *scriptname, bool dosearch, bool *suidscript)
3679 {
3680     int fdscript = -1;
3681     PerlIO *rsfp = NULL;
3682     dVAR;
3683     Stat_t tmpstatbuf;
3684
3685     PERL_ARGS_ASSERT_OPEN_SCRIPT;
3686
3687     if (PL_e_script) {
3688         PL_origfilename = savepvs("-e");
3689     }
3690     else {
3691         /* if find_script() returns, it returns a malloc()-ed value */
3692         scriptname = PL_origfilename = find_script(scriptname, dosearch, NULL, 1);
3693
3694         if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
3695             const char *s = scriptname + 8;
3696             fdscript = atoi(s);
3697             while (isDIGIT(*s))
3698                 s++;
3699             if (*s) {
3700                 /* PSz 18 Feb 04
3701                  * Tell apart "normal" usage of fdscript, e.g.
3702                  * with bash on FreeBSD:
3703                  *   perl <( echo '#!perl -DA'; echo 'print "$0\n"')
3704                  * from usage in suidperl.
3705                  * Does any "normal" usage leave garbage after the number???
3706                  * Is it a mistake to use a similar /dev/fd/ construct for
3707                  * suidperl?
3708                  */
3709                 *suidscript = TRUE;
3710                 /* PSz 20 Feb 04  
3711                  * Be supersafe and do some sanity-checks.
3712                  * Still, can we be sure we got the right thing?
3713                  */
3714                 if (*s != '/') {
3715                     Perl_croak(aTHX_ "Wrong syntax (suid) fd script name \"%s\"\n", s);
3716                 }
3717                 if (! *(s+1)) {
3718                     Perl_croak(aTHX_ "Missing (suid) fd script name\n");
3719                 }
3720                 scriptname = savepv(s + 1);
3721                 Safefree(PL_origfilename);
3722                 PL_origfilename = (char *)scriptname;
3723             }
3724         }
3725     }
3726
3727     CopFILE_free(PL_curcop);
3728     CopFILE_set(PL_curcop, PL_origfilename);
3729     if (*PL_origfilename == '-' && PL_origfilename[1] == '\0')
3730         scriptname = (char *)"";
3731     if (fdscript >= 0) {
3732         rsfp = PerlIO_fdopen(fdscript,PERL_SCRIPT_MODE);
3733     }
3734     else if (!*scriptname) {
3735         forbid_setid(0, *suidscript);
3736         return NULL;
3737     }
3738     else {
3739 #ifdef FAKE_BIT_BUCKET
3740         /* This hack allows one not to have /dev/null (or BIT_BUCKET as it
3741          * is called) and still have the "-e" work.  (Believe it or not,
3742          * a /dev/null is required for the "-e" to work because source
3743          * filter magic is used to implement it. ) This is *not* a general
3744          * replacement for a /dev/null.  What we do here is create a temp
3745          * file (an empty file), open up that as the script, and then
3746          * immediately close and unlink it.  Close enough for jazz. */ 
3747 #define FAKE_BIT_BUCKET_PREFIX "/tmp/perlnull-"
3748 #define FAKE_BIT_BUCKET_SUFFIX "XXXXXXXX"
3749 #define FAKE_BIT_BUCKET_TEMPLATE FAKE_BIT_BUCKET_PREFIX FAKE_BIT_BUCKET_SUFFIX
3750         char tmpname[sizeof(FAKE_BIT_BUCKET_TEMPLATE)] = {
3751             FAKE_BIT_BUCKET_TEMPLATE
3752         };
3753         const char * const err = "Failed to create a fake bit bucket";
3754         if (strEQ(scriptname, BIT_BUCKET)) {
3755 #ifdef HAS_MKSTEMP /* Hopefully mkstemp() is safe here. */
3756             int tmpfd = mkstemp(tmpname);
3757             if (tmpfd > -1) {
3758                 scriptname = tmpname;
3759                 close(tmpfd);
3760             } else
3761                 Perl_croak(aTHX_ err);
3762 #else
3763 #  ifdef HAS_MKTEMP
3764             scriptname = mktemp(tmpname);
3765             if (!scriptname)
3766                 Perl_croak(aTHX_ err);
3767 #  endif
3768 #endif
3769         }
3770 #endif
3771         rsfp = PerlIO_open(scriptname,PERL_SCRIPT_MODE);
3772 #ifdef FAKE_BIT_BUCKET
3773         if (memEQ(scriptname, FAKE_BIT_BUCKET_PREFIX,
3774                   sizeof(FAKE_BIT_BUCKET_PREFIX) - 1)
3775             && strlen(scriptname) == sizeof(tmpname) - 1) {
3776             unlink(scriptname);
3777         }
3778         scriptname = BIT_BUCKET;
3779 #endif
3780     }
3781     if (!rsfp) {
3782         /* PSz 16 Sep 03  Keep neat error message */
3783         if (PL_e_script)
3784             Perl_croak(aTHX_ "Can't open "BIT_BUCKET": %s\n", Strerror(errno));
3785         else
3786             Perl_croak(aTHX_ "Can't open perl script \"%s\": %s\n",
3787                     CopFILE(PL_curcop), Strerror(errno));
3788     }
3789 #if defined(HAS_FCNTL) && defined(F_SETFD)
3790     /* ensure close-on-exec */
3791     fcntl(PerlIO_fileno(rsfp), F_SETFD, 1);
3792 #endif
3793
3794     if (PerlLIO_fstat(PerlIO_fileno(rsfp), &tmpstatbuf) >= 0
3795         && S_ISDIR(tmpstatbuf.st_mode))
3796         Perl_croak(aTHX_ "Can't open perl script \"%s\": %s\n",
3797             CopFILE(PL_curcop),
3798             Strerror(EISDIR));
3799
3800     return rsfp;
3801 }
3802
3803 /* Mention
3804  * I_SYSSTATVFS HAS_FSTATVFS
3805  * I_SYSMOUNT
3806  * I_STATFS     HAS_FSTATFS     HAS_GETFSSTAT
3807  * I_MNTENT     HAS_GETMNTENT   HAS_HASMNTOPT
3808  * here so that metaconfig picks them up. */
3809
3810
3811 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
3812 /* Don't even need this function.  */
3813 #else
3814 STATIC void
3815 S_validate_suid(pTHX_ PerlIO *rsfp)
3816 {
3817     const Uid_t  my_uid = PerlProc_getuid();
3818     const Uid_t my_euid = PerlProc_geteuid();
3819     const Gid_t  my_gid = PerlProc_getgid();
3820     const Gid_t my_egid = PerlProc_getegid();
3821
3822     PERL_ARGS_ASSERT_VALIDATE_SUID;
3823
3824     if (my_euid != my_uid || my_egid != my_gid) {       /* (suidperl doesn't exist, in fact) */
3825         dVAR;
3826
3827         PerlLIO_fstat(PerlIO_fileno(rsfp),&PL_statbuf); /* may be either wrapped or real suid */
3828         if ((my_euid != my_uid && my_euid == PL_statbuf.st_uid && PL_statbuf.st_mode & S_ISUID)
3829             ||
3830             (my_egid != my_gid && my_egid == PL_statbuf.st_gid && PL_statbuf.st_mode & S_ISGID)
3831            )
3832             if (!PL_do_undump)
3833                 Perl_croak(aTHX_ "YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
3834 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
3835         /* not set-id, must be wrapped */
3836     }
3837 }
3838 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
3839
3840 STATIC void
3841 S_find_beginning(pTHX_ SV* linestr_sv, PerlIO *rsfp)
3842 {
3843     dVAR;
3844     const char *s;
3845     const char *s2;
3846
3847     PERL_ARGS_ASSERT_FIND_BEGINNING;
3848
3849     /* skip forward in input to the real script? */
3850
3851     do {
3852         if ((s = sv_gets(linestr_sv, rsfp, 0)) == NULL)
3853             Perl_croak(aTHX_ "No Perl script found in input\n");
3854         s2 = s;
3855     } while (!(*s == '#' && s[1] == '!' && ((s = instr(s,"perl")) || (s = instr(s2,"PERL")))));
3856     PerlIO_ungetc(rsfp, '\n');          /* to keep line count right */
3857     while (*s && !(isSPACE (*s) || *s == '#')) s++;
3858     s2 = s;
3859     while (*s == ' ' || *s == '\t') s++;
3860     if (*s++ == '-') {
3861         while (isDIGIT(s2[-1]) || s2[-1] == '-' || s2[-1] == '.'
3862                || s2[-1] == '_') s2--;
3863         if (strnEQ(s2-4,"perl",4))
3864             while ((s = moreswitches(s)))
3865                 ;
3866     }
3867 }
3868
3869
3870 STATIC void
3871 S_init_ids(pTHX)
3872 {
3873     /* no need to do anything here any more if we don't
3874      * do tainting. */
3875 #ifndef NO_TAINT_SUPPORT
3876     dVAR;
3877     const Uid_t my_uid = PerlProc_getuid();
3878     const Uid_t my_euid = PerlProc_geteuid();
3879     const Gid_t my_gid = PerlProc_getgid();
3880     const Gid_t my_egid = PerlProc_getegid();
3881
3882     /* Should not happen: */
3883     CHECK_MALLOC_TAINT(my_uid && (my_euid != my_uid || my_egid != my_gid));
3884     TAINTING_set( TAINTING_get | (my_uid && (my_euid != my_uid || my_egid != my_gid)) );
3885 #endif
3886     /* BUG */
3887     /* PSz 27 Feb 04
3888      * Should go by suidscript, not uid!=euid: why disallow
3889      * system("ls") in scripts run from setuid things?
3890      * Or, is this run before we check arguments and set suidscript?
3891      * What about SETUID_SCRIPTS_ARE_SECURE_NOW: could we use fdscript then?
3892      * (We never have suidscript, can we be sure to have fdscript?)
3893      * Or must then go by UID checks? See comments in forbid_setid also.
3894      */
3895 }
3896
3897 /* This is used very early in the lifetime of the program,
3898  * before even the options are parsed, so PL_tainting has
3899  * not been initialized properly.  */
3900 bool
3901 Perl_doing_taint(int argc, char *argv[], char *envp[])
3902 {
3903 #ifndef PERL_IMPLICIT_SYS
3904     /* If we have PERL_IMPLICIT_SYS we can't call getuid() et alia
3905      * before we have an interpreter-- and the whole point of this
3906      * function is to be called at such an early stage.  If you are on
3907      * a system with PERL_IMPLICIT_SYS but you do have a concept of
3908      * "tainted because running with altered effective ids', you'll
3909      * have to add your own checks somewhere in here.  The two most
3910      * known samples of 'implicitness' are Win32 and NetWare, neither
3911      * of which has much of concept of 'uids'. */
3912     Uid_t uid  = PerlProc_getuid();
3913     Uid_t euid = PerlProc_geteuid();
3914     Gid_t gid  = PerlProc_getgid();
3915     Gid_t egid = PerlProc_getegid();
3916     (void)envp;
3917
3918 #ifdef VMS
3919     uid  |=  gid << 16;
3920     euid |= egid << 16;
3921 #endif
3922     if (uid && (euid != uid || egid != gid))
3923         return 1;
3924 #endif /* !PERL_IMPLICIT_SYS */
3925     /* This is a really primitive check; environment gets ignored only
3926      * if -T are the first chars together; otherwise one gets
3927      *  "Too late" message. */
3928     if ( argc > 1 && argv[1][0] == '-'
3929          && (argv[1][1] == 't' || argv[1][1] == 'T') )
3930         return 1;
3931     return 0;
3932 }
3933
3934 /* Passing the flag as a single char rather than a string is a slight space
3935    optimisation.  The only message that isn't /^-.$/ is
3936    "program input from stdin", which is substituted in place of '\0', which
3937    could never be a command line flag.  */
3938 STATIC void
3939 S_forbid_setid(pTHX_ const char flag, const bool suidscript) /* g */
3940 {
3941     dVAR;
3942     char string[3] = "-x";
3943     const char *message = "program input from stdin";
3944
3945     if (flag) {
3946         string[1] = flag;
3947         message = string;
3948     }
3949
3950 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
3951     if (PerlProc_getuid() != PerlProc_geteuid())
3952         Perl_croak(aTHX_ "No %s allowed while running setuid", message);
3953     if (PerlProc_getgid() != PerlProc_getegid())
3954         Perl_croak(aTHX_ "No %s allowed while running setgid", message);
3955 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
3956     if (suidscript)
3957         Perl_croak(aTHX_ "No %s allowed with (suid) fdscript", message);
3958 }
3959
3960 void
3961 Perl_init_dbargs(pTHX)
3962 {
3963     AV *const args = PL_dbargs = GvAV(gv_AVadd((gv_fetchpvs("DB::args",
3964                                                             GV_ADDMULTI,
3965                                                             SVt_PVAV))));
3966
3967     if (AvREAL(args)) {
3968         /* Someone has already created it.
3969            It might have entries, and if we just turn off AvREAL(), they will
3970            "leak" until global destruction.  */
3971         av_clear(args);
3972         if (SvTIED_mg((const SV *)args, PERL_MAGIC_tied))
3973             Perl_croak(aTHX_ "Cannot set tied @DB::args");
3974     }
3975     AvREIFY_only(PL_dbargs);
3976 }
3977
3978 void
3979 Perl_init_debugger(pTHX)
3980 {
3981     dVAR;
3982     HV * const ostash = PL_curstash;
3983
3984     PL_curstash = (HV *)SvREFCNT_inc_simple(PL_debstash);
3985
3986     Perl_init_dbargs(aTHX);
3987     PL_DBgv = MUTABLE_GV(
3988         SvREFCNT_inc(gv_fetchpvs("DB::DB", GV_ADDMULTI, SVt_PVGV))
3989     );
3990     PL_DBline = MUTABLE_GV(
3991         SvREFCNT_inc(gv_fetchpvs("DB::dbline", GV_ADDMULTI, SVt_PVAV))
3992     );
3993     PL_DBsub = MUTABLE_GV(SvREFCNT_inc(
3994         gv_HVadd(gv_fetchpvs("DB::sub", GV_ADDMULTI, SVt_PVHV))
3995     ));
3996     PL_DBsingle = GvSV((gv_fetchpvs("DB::single", GV_ADDMULTI, SVt_PV)));
3997     if (!SvIOK(PL_DBsingle))
3998         sv_setiv(PL_DBsingle, 0);
3999     PL_DBtrace = GvSV((gv_fetchpvs("DB::trace", GV_ADDMULTI, SVt_PV)));
4000     if (!SvIOK(PL_DBtrace))
4001         sv_setiv(PL_DBtrace, 0);
4002     PL_DBsignal = GvSV((gv_fetchpvs("DB::signal", GV_ADDMULTI, SVt_PV)));
4003     if (!SvIOK(PL_DBsignal))
4004         sv_setiv(PL_DBsignal, 0);
4005     SvREFCNT_dec(PL_curstash);
4006     PL_curstash = ostash;
4007 }
4008
4009 #ifndef STRESS_REALLOC
4010 #define REASONABLE(size) (size)
4011 #define REASONABLE_but_at_least(size,min) (size)
4012 #else
4013 #define REASONABLE(size) (1) /* unreasonable */
4014 #define REASONABLE_but_at_least(size,min) (min)
4015 #endif
4016
4017 void
4018 Perl_init_stacks(pTHX)
4019 {
4020     dVAR;
4021     /* start with 128-item stack and 8K cxstack */
4022     PL_curstackinfo = new_stackinfo(REASONABLE(128),
4023                                  REASONABLE(8192/sizeof(PERL_CONTEXT) - 1));
4024     PL_curstackinfo->si_type = PERLSI_MAIN;
4025     PL_curstack = PL_curstackinfo->si_stack;
4026     PL_mainstack = PL_curstack;         /* remember in case we switch stacks */
4027
4028     PL_stack_base = AvARRAY(PL_curstack);
4029     PL_stack_sp = PL_stack_base;
4030     PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
4031
4032     Newx(PL_tmps_stack,REASONABLE(128),SV*);
4033     PL_tmps_floor = -1;
4034     PL_tmps_ix = -1;
4035     PL_tmps_max = REASONABLE(128);
4036
4037     Newx(PL_markstack,REASONABLE(32),I32);
4038     PL_markstack_ptr = PL_markstack;
4039     PL_markstack_max = PL_markstack + REASONABLE(32);
4040
4041     SET_MARK_OFFSET;
4042
4043     Newx(PL_scopestack,REASONABLE(32),I32);
4044 #ifdef DEBUGGING
4045     Newx(PL_scopestack_name,REASONABLE(32),const char*);
4046 #endif
4047     PL_scopestack_ix = 0;
4048     PL_scopestack_max = REASONABLE(32);
4049
4050     Newx(PL_savestack,REASONABLE_but_at_least(128,SS_MAXPUSH),ANY);
4051     PL_savestack_ix = 0;
4052     PL_savestack_max = REASONABLE_but_at_least(128,SS_MAXPUSH);
4053 }
4054
4055 #undef REASONABLE
4056
4057 STATIC void
4058 S_nuke_stacks(pTHX)
4059 {
4060     dVAR;
4061     while (PL_curstackinfo->si_next)
4062         PL_curstackinfo = PL_curstackinfo->si_next;
4063     while (PL_curstackinfo) {
4064         PERL_SI *p = PL_curstackinfo->si_prev;
4065         /* curstackinfo->si_stack got nuked by sv_free_arenas() */
4066         Safefree(PL_curstackinfo->si_cxstack);
4067         Safefree(PL_curstackinfo);
4068         PL_curstackinfo = p;
4069     }
4070     Safefree(PL_tmps_stack);
4071     Safefree(PL_markstack);
4072     Safefree(PL_scopestack);
4073 #ifdef DEBUGGING
4074     Safefree(PL_scopestack_name);
4075 #endif
4076     Safefree(PL_savestack);
4077 }
4078
4079 void
4080 Perl_populate_isa(pTHX_ const char *name, STRLEN len, ...)
4081 {
4082     GV *const gv = gv_fetchpvn(name, len, GV_ADD | GV_ADDMULTI, SVt_PVAV);
4083     AV *const isa = GvAVn(gv);
4084     va_list args;
4085
4086     PERL_ARGS_ASSERT_POPULATE_ISA;
4087
4088     if(AvFILLp(isa) != -1)
4089         return;
4090
4091     /* NOTE: No support for tied ISA */
4092
4093     va_start(args, len);
4094     do {
4095         const char *const parent = va_arg(args, const char*);
4096         size_t parent_len;
4097
4098         if (!parent)
4099             break;
4100         parent_len = va_arg(args, size_t);
4101
4102         /* Arguments are supplied with a trailing ::  */
4103         assert(parent_len > 2);
4104         assert(parent[parent_len - 1] == ':');
4105         assert(parent[parent_len - 2] == ':');
4106         av_push(isa, newSVpvn(parent, parent_len - 2));
4107         (void) gv_fetchpvn(parent, parent_len, GV_ADD, SVt_PVGV);
4108     } while (1);
4109     va_end(args);
4110 }
4111
4112
4113 STATIC void
4114 S_init_predump_symbols(pTHX)
4115 {
4116     dVAR;
4117     GV *tmpgv;
4118     IO *io;
4119
4120     sv_setpvs(get_sv("\"", GV_ADD), " ");
4121     PL_ofsgv = (GV*)SvREFCNT_inc(gv_fetchpvs(",", GV_ADD|GV_NOTQUAL, SVt_PV));
4122
4123
4124     /* Historically, PVIOs were blessed into IO::Handle, unless
4125        FileHandle was loaded, in which case they were blessed into
4126        that. Action at a distance.
4127        However, if we simply bless into IO::Handle, we break code
4128        that assumes that PVIOs will have (among others) a seek
4129        method. IO::File inherits from IO::Handle and IO::Seekable,
4130        and provides the needed methods. But if we simply bless into
4131        it, then we break code that assumed that by loading
4132        IO::Handle, *it* would work.
4133        So a compromise is to set up the correct @IO::File::ISA,
4134        so that code that does C<use IO::Handle>; will still work.
4135     */
4136                    
4137     Perl_populate_isa(aTHX_ STR_WITH_LEN("IO::File::ISA"),
4138                       STR_WITH_LEN("IO::Handle::"),
4139                       STR_WITH_LEN("IO::Seekable::"),
4140                       STR_WITH_LEN("Exporter::"),
4141                       NULL);
4142
4143     PL_stdingv = gv_fetchpvs("STDIN", GV_ADD|GV_NOTQUAL, SVt_PVIO);
4144     GvMULTI_on(PL_stdingv);
4145     io = GvIOp(PL_stdingv);
4146     IoTYPE(io) = IoTYPE_RDONLY;
4147     IoIFP(io) = PerlIO_stdin();
4148     tmpgv = gv_fetchpvs("stdin", GV_ADD|GV_NOTQUAL, SVt_PV);
4149     GvMULTI_on(tmpgv);
4150     GvIOp(tmpgv) = MUTABLE_IO(SvREFCNT_inc_simple(io));
4151
4152     tmpgv = gv_fetchpvs("STDOUT", GV_ADD|GV_NOTQUAL, SVt_PVIO);
4153     GvMULTI_on(tmpgv);
4154     io = GvIOp(tmpgv);
4155     IoTYPE(io) = IoTYPE_WRONLY;
4156     IoOFP(io) = IoIFP(io) = PerlIO_stdout();
4157     setdefout(tmpgv);
4158     tmpgv = gv_fetchpvs("stdout", GV_ADD|GV_NOTQUAL, SVt_PV);
4159     GvMULTI_on(tmpgv);
4160     GvIOp(tmpgv) = MUTABLE_IO(SvREFCNT_inc_simple(io));
4161
4162     PL_stderrgv = gv_fetchpvs("STDERR", GV_ADD|GV_NOTQUAL, SVt_PVIO);
4163     GvMULTI_on(PL_stderrgv);
4164     io = GvIOp(PL_stderrgv);
4165     IoTYPE(io) = IoTYPE_WRONLY;
4166     IoOFP(io) = IoIFP(io) = PerlIO_stderr();
4167     tmpgv = gv_fetchpvs("stderr", GV_ADD|GV_NOTQUAL, SVt_PV);
4168     GvMULTI_on(tmpgv);
4169     GvIOp(tmpgv) = MUTABLE_IO(SvREFCNT_inc_simple(io));
4170
4171     PL_statname = newSVpvs("");         /* last filename we did stat on */
4172 }
4173
4174 void
4175 Perl_init_argv_symbols(pTHX_ int argc, char **argv)
4176 {
4177     dVAR;
4178
4179     PERL_ARGS_ASSERT_INIT_ARGV_SYMBOLS;
4180
4181     argc--,argv++;      /* skip name of script */
4182     if (PL_doswitches) {
4183         for (; argc > 0 && **argv == '-'; argc--,argv++) {
4184             char *s;
4185             if (!argv[0][1])
4186                 break;
4187             if (argv[0][1] == '-' && !argv[0][2]) {
4188                 argc--,argv++;
4189                 break;
4190             }
4191             if ((s = strchr(argv[0], '='))) {
4192                 const char *const start_name = argv[0] + 1;
4193                 sv_setpv(GvSV(gv_fetchpvn_flags(start_name, s - start_name,
4194                                                 TRUE, SVt_PV)), s + 1);
4195             }
4196             else
4197                 sv_setiv(GvSV(gv_fetchpv(argv[0]+1, GV_ADD, SVt_PV)),1);
4198         }
4199     }
4200     if ((PL_argvgv = gv_fetchpvs("ARGV", GV_ADD|GV_NOTQUAL, SVt_PVAV))) {
4201         SvREFCNT_inc_simple_void_NN(PL_argvgv);
4202         GvMULTI_on(PL_argvgv);
4203         av_clear(GvAVn(PL_argvgv));
4204         for (; argc > 0; argc--,argv++) {
4205             SV * const sv = newSVpv(argv[0],0);
4206             av_push(GvAV(PL_argvgv),sv);
4207             if (!(PL_unicode & PERL_UNICODE_LOCALE_FLAG) || PL_utf8locale) {
4208                  if (PL_unicode & PERL_UNICODE_ARGV_FLAG)
4209                       SvUTF8_on(sv);
4210             }
4211             if (PL_unicode & PERL_UNICODE_WIDESYSCALLS_FLAG) /* Sarathy? */
4212                  (void)sv_utf8_decode(sv);
4213         }
4214     }
4215
4216     if (PL_inplace && (!PL_argvgv || AvFILL(GvAV(PL_argvgv)) == -1))
4217         Perl_ck_warner_d(aTHX_ packWARN(WARN_INPLACE),
4218                          "-i used with no filenames on the command line, "
4219                          "reading from STDIN");
4220 }
4221
4222 STATIC void
4223 S_init_postdump_symbols(pTHX_ int argc, char **argv, char **env)
4224 {
4225     dVAR;
4226     GV* tmpgv;
4227
4228     PERL_ARGS_ASSERT_INIT_POSTDUMP_SYMBOLS;
4229
4230     PL_toptarget = newSV_type(SVt_PVIV);
4231     sv_setpvs(PL_toptarget, "");
4232     PL_bodytarget = newSV_type(SVt_PVIV);
4233     sv_setpvs(PL_bodytarget, "");
4234     PL_formtarget = PL_bodytarget;
4235
4236     TAINT;
4237
4238     init_argv_symbols(argc,argv);
4239
4240     if ((tmpgv = gv_fetchpvs("0", GV_ADD|GV_NOTQUAL, SVt_PV))) {
4241         sv_setpv(GvSV(tmpgv),PL_origfilename);
4242     }
4243     if ((PL_envgv = gv_fetchpvs("ENV", GV_ADD|GV_NOTQUAL, SVt_PVHV))) {
4244         HV *hv;
4245         bool env_is_not_environ;
4246         SvREFCNT_inc_simple_void_NN(PL_envgv);
4247         GvMULTI_on(PL_envgv);
4248         hv = GvHVn(PL_envgv);
4249         hv_magic(hv, NULL, PERL_MAGIC_env);
4250 #ifndef PERL_MICRO
4251 #ifdef USE_ENVIRON_ARRAY
4252         /* Note that if the supplied env parameter is actually a copy
4253            of the global environ then it may now point to free'd memory
4254            if the environment has been modified since. To avoid this
4255            problem we treat env==NULL as meaning 'use the default'
4256         */
4257         if (!env)
4258             env = environ;
4259         env_is_not_environ = env != environ;
4260         if (env_is_not_environ
4261 #  ifdef USE_ITHREADS
4262             && PL_curinterp == aTHX
4263 #  endif
4264            )
4265         {
4266             environ[0] = NULL;
4267         }
4268         if (env) {
4269           char *s, *old_var;
4270           SV *sv;
4271           for (; *env; env++) {
4272             old_var = *env;
4273
4274             if (!(s = strchr(old_var,'=')) || s == old_var)
4275                 continue;
4276
4277 #if defined(MSDOS) && !defined(DJGPP)
4278             *s = '\0';
4279             (void)strupr(old_var);
4280             *s = '=';
4281 #endif
4282             sv = newSVpv(s+1, 0);
4283             (void)hv_store(hv, old_var, s - old_var, sv, 0);
4284             if (env_is_not_environ)
4285                 mg_set(sv);
4286           }
4287       }
4288 #endif /* USE_ENVIRON_ARRAY */
4289 #endif /* !PERL_MICRO */
4290     }
4291     TAINT_NOT;
4292
4293     /* touch @F array to prevent spurious warnings 20020415 MJD */
4294     if (PL_minus_a) {
4295       (void) get_av("main::F", GV_ADD | GV_ADDMULTI);
4296     }
4297 }
4298
4299 STATIC void
4300 S_init_perllib(pTHX)
4301 {
4302     dVAR;
4303 #ifndef VMS
4304     const char *perl5lib = NULL;
4305 #endif
4306     const char *s;
4307 #if defined(WIN32) && !defined(PERL_IS_MINIPERL)
4308     STRLEN len;
4309 #endif
4310
4311     if (!TAINTING_get) {
4312 #ifndef VMS
4313         perl5lib = PerlEnv_getenv("PERL5LIB");
4314 /*
4315  * It isn't possible to delete an environment variable with
4316  * PERL_USE_SAFE_PUTENV set unless unsetenv() is also available, so in that
4317  * case we treat PERL5LIB as undefined if it has a zero-length value.
4318  */
4319 #if defined(PERL_USE_SAFE_PUTENV) && ! defined(HAS_UNSETENV)
4320         if (perl5lib && *perl5lib != '\0')
4321 #else
4322         if (perl5lib)
4323 #endif
4324             incpush_use_sep(perl5lib, 0, INCPUSH_ADD_SUB_DIRS);
4325         else {
4326             s = PerlEnv_getenv("PERLLIB");
4327             if (s)
4328                 incpush_use_sep(s, 0, 0);
4329         }
4330 #else /* VMS */
4331         /* Treat PERL5?LIB as a possible search list logical name -- the
4332          * "natural" VMS idiom for a Unix path string.  We allow each
4333          * element to be a set of |-separated directories for compatibility.
4334          */
4335         char buf[256];
4336         int idx = 0;
4337         if (my_trnlnm("PERL5LIB",buf,0))
4338             do {
4339                 incpush_use_sep(buf, 0, INCPUSH_ADD_SUB_DIRS);
4340             } while (my_trnlnm("PERL5LIB",buf,++idx));
4341         else {
4342             while (my_trnlnm("PERLLIB",buf,idx++))
4343                 incpush_use_sep(buf, 0, 0);
4344         }
4345 #endif /* VMS */
4346     }
4347
4348 #ifndef PERL_IS_MINIPERL
4349     /* miniperl gets just -I..., the split of $ENV{PERL5LIB}, and "." in @INC
4350        (and not the architecture specific directories from $ENV{PERL5LIB}) */
4351
4352 /* Use the ~-expanded versions of APPLLIB (undocumented),
4353     SITEARCH, SITELIB, VENDORARCH, VENDORLIB, ARCHLIB and PRIVLIB
4354 */
4355 #ifdef APPLLIB_EXP
4356     S_incpush_use_sep(aTHX_ STR_WITH_LEN(APPLLIB_EXP),
4357                       INCPUSH_ADD_SUB_DIRS|INCPUSH_CAN_RELOCATE);
4358 #endif
4359
4360 #ifdef SITEARCH_EXP
4361     /* sitearch is always relative to sitelib on Windows for
4362      * DLL-based path intuition to work correctly */
4363 #  if !defined(WIN32)
4364         S_incpush_use_sep(aTHX_ STR_WITH_LEN(SITEARCH_EXP),
4365                           INCPUSH_CAN_RELOCATE);
4366 #  endif
4367 #endif
4368
4369 #ifdef SITELIB_EXP
4370 #  if defined(WIN32)
4371     /* this picks up sitearch as well */
4372         s = win32_get_sitelib(PERL_FS_VERSION, &len);
4373         if (s)
4374             incpush_use_sep(s, len, INCPUSH_ADD_SUB_DIRS|INCPUSH_CAN_RELOCATE);
4375 #  else
4376         S_incpush_use_sep(aTHX_ STR_WITH_LEN(SITELIB_EXP), INCPUSH_CAN_RELOCATE);
4377 #  endif
4378 #endif
4379
4380 #ifdef PERL_VENDORARCH_EXP
4381     /* vendorarch is always relative to vendorlib on Windows for
4382      * DLL-based path intuition to work correctly */
4383 #  if !defined(WIN32)
4384     S_incpush_use_sep(aTHX_ STR_WITH_LEN(PERL_VENDORARCH_EXP),
4385                       INCPUSH_CAN_RELOCATE);
4386 #  endif
4387 #endif
4388
4389 #ifdef PERL_VENDORLIB_EXP
4390 #  if defined(WIN32)
4391     /* this picks up vendorarch as well */
4392         s = win32_get_vendorlib(PERL_FS_VERSION, &len);
4393         if (s)
4394             incpush_use_sep(s, len, INCPUSH_ADD_SUB_DIRS|INCPUSH_CAN_RELOCATE);
4395 #  else
4396         S_incpush_use_sep(aTHX_ STR_WITH_LEN(PERL_VENDORLIB_EXP),
4397                           INCPUSH_CAN_RELOCATE);
4398 #  endif
4399 #endif
4400
4401 #ifdef ARCHLIB_EXP
4402     S_incpush_use_sep(aTHX_ STR_WITH_LEN(ARCHLIB_EXP), INCPUSH_CAN_RELOCATE);
4403 #endif
4404
4405 #ifndef PRIVLIB_EXP
4406 #  define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
4407 #endif
4408
4409 #if defined(WIN32)
4410     s = win32_get_privlib(PERL_FS_VERSION, &len);
4411     if (s)
4412         incpush_use_sep(s, len, INCPUSH_ADD_SUB_DIRS|INCPUSH_CAN_RELOCATE);
4413 #else
4414 #  ifdef NETWARE
4415     S_incpush_use_sep(aTHX_ PRIVLIB_EXP, 0, INCPUSH_CAN_RELOCATE);
4416 #  else
4417     S_incpush_use_sep(aTHX_ STR_WITH_LEN(PRIVLIB_EXP), INCPUSH_CAN_RELOCATE);
4418 #  endif
4419 #endif
4420
4421 #ifdef PERL_OTHERLIBDIRS
4422     S_incpush_use_sep(aTHX_ STR_WITH_LEN(PERL_OTHERLIBDIRS),
4423                       INCPUSH_ADD_VERSIONED_SUB_DIRS|INCPUSH_NOT_BASEDIR
4424                       |INCPUSH_CAN_RELOCATE);
4425 #endif
4426
4427     if (!TAINTING_get) {
4428 #ifndef VMS
4429 /*
4430  * It isn't possible to delete an environment variable with
4431  * PERL_USE_SAFE_PUTENV set unless unsetenv() is also available, so in that
4432  * case we treat PERL5LIB as undefined if it has a zero-length value.
4433  */
4434 #if defined(PERL_USE_SAFE_PUTENV) && ! defined(HAS_UNSETENV)
4435         if (perl5lib && *perl5lib != '\0')
4436 #else
4437         if (perl5lib)
4438 #endif
4439             incpush_use_sep(perl5lib, 0,
4440                             INCPUSH_ADD_OLD_VERS|INCPUSH_NOT_BASEDIR);
4441 #else /* VMS */
4442         /* Treat PERL5?LIB as a possible search list logical name -- the
4443          * "natural" VMS idiom for a Unix path string.  We allow each
4444          * element to be a set of |-separated directories for compatibility.
4445          */
4446         char buf[256];
4447         int idx = 0;
4448         if (my_trnlnm("PERL5LIB",buf,0))
4449             do {
4450                 incpush_use_sep(buf, 0,
4451                                 INCPUSH_ADD_OLD_VERS|INCPUSH_NOT_BASEDIR);
4452             } while (my_trnlnm("PERL5LIB",buf,++idx));
4453 #endif /* VMS */
4454     }
4455
4456 /* Use the ~-expanded versions of APPLLIB (undocumented),
4457     SITELIB and VENDORLIB for older versions
4458 */
4459 #ifdef APPLLIB_EXP
4460     S_incpush_use_sep(aTHX_ STR_WITH_LEN(APPLLIB_EXP), INCPUSH_ADD_OLD_VERS
4461                       |INCPUSH_NOT_BASEDIR|INCPUSH_CAN_RELOCATE);
4462 #endif
4463
4464 #if defined(SITELIB_STEM) && defined(PERL_INC_VERSION_LIST)
4465     /* Search for version-specific dirs below here */
4466     S_incpush_use_sep(aTHX_ STR_WITH_LEN(SITELIB_STEM),
4467                       INCPUSH_ADD_OLD_VERS|INCPUSH_CAN_RELOCATE);
4468 #endif
4469
4470
4471 #if defined(PERL_VENDORLIB_STEM) && defined(PERL_INC_VERSION_LIST)
4472     /* Search for version-specific dirs below here */
4473     S_incpush_use_sep(aTHX_ STR_WITH_LEN(PERL_VENDORLIB_STEM),
4474                       INCPUSH_ADD_OLD_VERS|INCPUSH_CAN_RELOCATE);
4475 #endif
4476
4477 #ifdef PERL_OTHERLIBDIRS
4478     S_incpush_use_sep(aTHX_ STR_WITH_LEN(PERL_OTHERLIBDIRS),
4479                       INCPUSH_ADD_OLD_VERS|INCPUSH_ADD_ARCHONLY_SUB_DIRS
4480                       |INCPUSH_CAN_RELOCATE);
4481 #endif
4482 #endif /* !PERL_IS_MINIPERL */
4483
4484     if (!TAINTING_get)
4485         S_incpush(aTHX_ STR_WITH_LEN("."), 0);
4486 }
4487
4488 #if defined(DOSISH) || defined(__SYMBIAN32__)
4489 #    define PERLLIB_SEP ';'
4490 #else
4491 #  if defined(VMS)
4492 #    define PERLLIB_SEP '|'
4493 #  else
4494 #    define PERLLIB_SEP ':'
4495 #  endif
4496 #endif
4497 #ifndef PERLLIB_MANGLE
4498 #  define PERLLIB_MANGLE(s,n) (s)
4499 #endif
4500
4501 #ifndef PERL_IS_MINIPERL
4502 /* Push a directory onto @INC if it exists.
4503    Generate a new SV if we do this, to save needing to copy the SV we push
4504    onto @INC  */
4505 STATIC SV *
4506 S_incpush_if_exists(pTHX_ AV *const av, SV *dir, SV *const stem)
4507 {
4508     dVAR;
4509     Stat_t tmpstatbuf;
4510
4511     PERL_ARGS_ASSERT_INCPUSH_IF_EXISTS;
4512
4513     if (PerlLIO_stat(SvPVX_const(dir), &tmpstatbuf) >= 0 &&
4514         S_ISDIR(tmpstatbuf.st_mode)) {
4515         av_push(av, dir);
4516         dir = newSVsv(stem);
4517     } else {
4518         /* Truncate dir back to stem.  */
4519         SvCUR_set(dir, SvCUR(stem));
4520     }
4521     return dir;
4522 }
4523 #endif
4524
4525 STATIC SV *
4526 S_mayberelocate(pTHX_ const char *const dir, STRLEN len, U32 flags)
4527 {
4528     const U8 canrelocate = (U8)flags & INCPUSH_CAN_RELOCATE;
4529     SV *libdir;
4530
4531     PERL_ARGS_ASSERT_MAYBERELOCATE;
4532     assert(len > 0);
4533
4534     /* I am not convinced that this is valid when PERLLIB_MANGLE is
4535        defined to so something (in os2/os2.c), but the code has been
4536        this way, ignoring any possible changed of length, since
4537        760ac839baf413929cd31cc32ffd6dba6b781a81 (5.003_02) so I'll leave
4538        it be.  */
4539     libdir = newSVpvn(PERLLIB_MANGLE(dir, len), len);
4540
4541 #ifdef VMS
4542     {
4543         char *unix;
4544
4545         if ((unix = tounixspec_ts(SvPV(libdir,len),NULL)) != NULL) {
4546             len = strlen(unix);
4547             while (len > 1 && unix[len-1] == '/') len--;  /* Cosmetic */
4548             sv_usepvn(libdir,unix,len);
4549         }
4550         else
4551             PerlIO_printf(Perl_error_log,
4552                           "Failed to unixify @INC element \"%s\"\n",
4553                           SvPV_nolen_const(libdir));
4554     }
4555 #endif
4556
4557         /* Do the if() outside the #ifdef to avoid warnings about an unused
4558            parameter.  */
4559         if (canrelocate) {
4560 #ifdef PERL_RELOCATABLE_INC
4561         /*
4562          * Relocatable include entries are marked with a leading .../
4563          *
4564          * The algorithm is
4565          * 0: Remove that leading ".../"
4566          * 1: Remove trailing executable name (anything after the last '/')
4567          *    from the perl path to give a perl prefix
4568          * Then
4569          * While the @INC element starts "../" and the prefix ends with a real
4570          * directory (ie not . or ..) chop that real directory off the prefix
4571          * and the leading "../" from the @INC element. ie a logical "../"
4572          * cleanup
4573          * Finally concatenate the prefix and the remainder of the @INC element
4574          * The intent is that /usr/local/bin/perl and .../../lib/perl5
4575          * generates /usr/local/lib/perl5
4576          */
4577             const char *libpath = SvPVX(libdir);
4578             STRLEN libpath_len = SvCUR(libdir);
4579             if (libpath_len >= 4 && memEQ (libpath, ".../", 4)) {
4580                 /* Game on!  */
4581                 SV * const caret_X = get_sv("\030", 0);
4582                 /* Going to use the SV just as a scratch buffer holding a C
4583                    string:  */
4584                 SV *prefix_sv;
4585                 char *prefix;
4586                 char *lastslash;
4587
4588                 /* $^X is *the* source of taint if tainting is on, hence
4589                    SvPOK() won't be true.  */
4590                 assert(caret_X);
4591                 assert(SvPOKp(caret_X));
4592                 prefix_sv = newSVpvn_flags(SvPVX(caret_X), SvCUR(caret_X),
4593                                            SvUTF8(caret_X));
4594                 /* Firstly take off the leading .../
4595                    If all else fail we'll do the paths relative to the current
4596                    directory.  */
4597                 sv_chop(libdir, libpath + 4);
4598                 /* Don't use SvPV as we're intentionally bypassing taining,
4599                    mortal copies that the mg_get of tainting creates, and
4600                    corruption that seems to come via the save stack.
4601                    I guess that the save stack isn't correctly set up yet.  */
4602                 libpath = SvPVX(libdir);
4603                 libpath_len = SvCUR(libdir);
4604
4605                 /* This would work more efficiently with memrchr, but as it's
4606                    only a GNU extension we'd need to probe for it and
4607                    implement our own. Not hard, but maybe not worth it?  */
4608
4609                 prefix = SvPVX(prefix_sv);
4610                 lastslash = strrchr(prefix, '/');
4611
4612                 /* First time in with the *lastslash = '\0' we just wipe off
4613                    the trailing /perl from (say) /usr/foo/bin/perl
4614                 */
4615                 if (lastslash) {
4616                     SV *tempsv;
4617                     while ((*lastslash = '\0'), /* Do that, come what may.  */
4618                            (libpath_len >= 3 && memEQ(libpath, "../", 3)
4619                             && (lastslash = strrchr(prefix, '/')))) {
4620                         if (lastslash[1] == '\0'
4621                             || (lastslash[1] == '.'
4622                                 && (lastslash[2] == '/' /* ends "/."  */
4623                                     || (lastslash[2] == '/'
4624                                         && lastslash[3] == '/' /* or "/.."  */
4625                                         )))) {
4626                             /* Prefix ends "/" or "/." or "/..", any of which
4627                                are fishy, so don't do any more logical cleanup.
4628                             */
4629                             break;
4630                         }
4631                         /* Remove leading "../" from path  */
4632                         libpath += 3;
4633                         libpath_len -= 3;
4634                         /* Next iteration round the loop removes the last
4635                            directory name from prefix by writing a '\0' in
4636                            the while clause.  */
4637                     }
4638                     /* prefix has been terminated with a '\0' to the correct
4639                        length. libpath points somewhere into the libdir SV.
4640                        We need to join the 2 with '/' and drop the result into
4641                        libdir.  */
4642                     tempsv = Perl_newSVpvf(aTHX_ "%s/%s", prefix, libpath);
4643                     SvREFCNT_dec(libdir);
4644                     /* And this is the new libdir.  */
4645                     libdir = tempsv;
4646                     if (TAINTING_get &&
4647                         (PerlProc_getuid() != PerlProc_geteuid() ||
4648                          PerlProc_getgid() != PerlProc_getegid())) {
4649                         /* Need to taint relocated paths if running set ID  */
4650                         SvTAINTED_on(libdir);
4651                     }
4652                 }
4653                 SvREFCNT_dec(prefix_sv);
4654             }
4655 #endif
4656         }
4657     return libdir;
4658 }
4659
4660 STATIC void
4661 S_incpush(pTHX_ const char *const dir, STRLEN len, U32 flags)
4662 {
4663     dVAR;
4664 #ifndef PERL_IS_MINIPERL
4665     const U8 using_sub_dirs
4666         = (U8)flags & (INCPUSH_ADD_VERSIONED_SUB_DIRS
4667                        |INCPUSH_ADD_ARCHONLY_SUB_DIRS|INCPUSH_ADD_OLD_VERS);
4668     const U8 add_versioned_sub_dirs
4669         = (U8)flags & INCPUSH_ADD_VERSIONED_SUB_DIRS;
4670     const U8 add_archonly_sub_dirs
4671         = (U8)flags & INCPUSH_ADD_ARCHONLY_SUB_DIRS;
4672 #ifdef PERL_INC_VERSION_LIST
4673     const U8 addoldvers  = (U8)flags & INCPUSH_ADD_OLD_VERS;
4674 #endif
4675 #endif
4676     const U8 unshift     = (U8)flags & INCPUSH_UNSHIFT;
4677     const U8 push_basedir = (flags & INCPUSH_NOT_BASEDIR) ? 0 : 1;
4678     AV *const inc = GvAVn(PL_incgv);
4679
4680     PERL_ARGS_ASSERT_INCPUSH;
4681     assert(len > 0);
4682
4683     /* Could remove this vestigial extra block, if we don't mind a lot of
4684        re-indenting diff noise.  */
4685     {
4686         SV *const libdir = mayberelocate(dir, len, flags);
4687         /* Change 20189146be79a0596543441fa369c6bf7f85103f, to fix RT#6665,
4688            arranged to unshift #! line -I onto the front of @INC. However,
4689            -I can add version and architecture specific libraries, and they
4690            need to go first. The old code assumed that it was always
4691            pushing. Hence to make it work, need to push the architecture
4692            (etc) libraries onto a temporary array, then "unshift" that onto
4693            the front of @INC.  */
4694 #ifndef PERL_IS_MINIPERL
4695         AV *const av = (using_sub_dirs) ? (unshift ? newAV() : inc) : NULL;
4696
4697         /*
4698          * BEFORE pushing libdir onto @INC we may first push version- and
4699          * archname-specific sub-directories.
4700          */
4701         if (using_sub_dirs) {
4702             SV *subdir = newSVsv(libdir);
4703 #ifdef PERL_INC_VERSION_LIST
4704             /* Configure terminates PERL_INC_VERSION_LIST with a NULL */
4705             const char * const incverlist[] = { PERL_INC_VERSION_LIST };
4706             const char * const *incver;
4707 #endif
4708
4709             if (add_versioned_sub_dirs) {
4710                 /* .../version/archname if -d .../version/archname */
4711                 sv_catpvs(subdir, "/" PERL_FS_VERSION "/" ARCHNAME);
4712                 subdir = S_incpush_if_exists(aTHX_ av, subdir, libdir);
4713
4714                 /* .../version if -d .../version */
4715                 sv_catpvs(subdir, "/" PERL_FS_VERSION);
4716                 subdir = S_incpush_if_exists(aTHX_ av, subdir, libdir);
4717             }
4718
4719 #ifdef PERL_INC_VERSION_LIST
4720             if (addoldvers) {
4721                 for (incver = incverlist; *incver; incver++) {
4722                     /* .../xxx if -d .../xxx */
4723                     Perl_sv_catpvf(aTHX_ subdir, "/%s", *incver);
4724                     subdir = S_incpush_if_exists(aTHX_ av, subdir, libdir);
4725                 }
4726             }
4727 #endif
4728
4729             if (add_archonly_sub_dirs) {
4730                 /* .../archname if -d .../archname */
4731                 sv_catpvs(subdir, "/" ARCHNAME);
4732                 subdir = S_incpush_if_exists(aTHX_ av, subdir, libdir);
4733
4734             }
4735
4736             assert (SvREFCNT(subdir) == 1);
4737             SvREFCNT_dec(subdir);
4738         }
4739 #endif /* !PERL_IS_MINIPERL */
4740         /* finally add this lib directory at the end of @INC */
4741         if (unshift) {
4742 #ifdef PERL_IS_MINIPERL
4743             const Size_t extra = 0;
4744 #else
4745             Size_t extra = av_len(av) + 1;
4746 #endif
4747             av_unshift(inc, extra + push_basedir);
4748             if (push_basedir)
4749                 av_store(inc, extra, libdir);
4750 #ifndef PERL_IS_MINIPERL
4751             while (extra--) {
4752                 /* av owns a reference, av_store() expects to be donated a
4753                    reference, and av expects to be sane when it's cleared.
4754                    If I wanted to be naughty and wrong, I could peek inside the
4755                    implementation of av_clear(), realise that it uses
4756                    SvREFCNT_dec() too, so av's array could be a run of NULLs,
4757                    and so directly steal from it (with a memcpy() to inc, and
4758                    then memset() to NULL them out. But people copy code from the
4759                    core expecting it to be best practise, so let's use the API.
4760                    Although studious readers will note that I'm not checking any
4761                    return codes.  */
4762                 av_store(inc, extra, SvREFCNT_inc(*av_fetch(av, extra, FALSE)));
4763             }
4764             SvREFCNT_dec(av);
4765 #endif
4766         }
4767         else if (push_basedir) {
4768             av_push(inc, libdir);
4769         }
4770
4771         if (!push_basedir) {
4772             assert (SvREFCNT(libdir) == 1);
4773             SvREFCNT_dec(libdir);
4774         }
4775     }
4776 }
4777
4778 STATIC void
4779 S_incpush_use_sep(pTHX_ const char *p, STRLEN len, U32 flags)
4780 {
4781     const char *s;
4782     const char *end;
4783     /* This logic has been broken out from S_incpush(). It may be possible to
4784        simplify it.  */
4785
4786     PERL_ARGS_ASSERT_INCPUSH_USE_SEP;
4787
4788     /* perl compiled with -DPERL_RELOCATABLE_INCPUSH will ignore the len
4789      * argument to incpush_use_sep.  This allows creation of relocatable
4790      * Perl distributions that patch the binary at install time.  Those
4791      * distributions will have to provide their own relocation tools; this
4792      * is not a feature otherwise supported by core Perl.
4793      */
4794 #ifndef PERL_RELOCATABLE_INCPUSH
4795     if (!len)
4796 #endif
4797         len = strlen(p);
4798
4799     end = p + len;
4800
4801     /* Break at all separators */
4802     while ((s = (const char*)memchr(p, PERLLIB_SEP, end - p))) {
4803         if (s == p) {
4804             /* skip any consecutive separators */
4805
4806             /* Uncomment the next line for PATH semantics */
4807             /* But you'll need to write tests */
4808             /* av_push(GvAVn(PL_incgv), newSVpvs(".")); */
4809         } else {
4810             incpush(p, (STRLEN)(s - p), flags);
4811         }
4812         p = s + 1;
4813     }
4814     if (p != end)
4815         incpush(p, (STRLEN)(end - p), flags);
4816
4817 }
4818
4819 void
4820 Perl_call_list(pTHX_ I32 oldscope, AV *paramList)
4821 {
4822     dVAR;
4823     SV *atsv;
4824     volatile const line_t oldline = PL_curcop ? CopLINE(PL_curcop) : 0;
4825     CV *cv;
4826     STRLEN len;
4827     int ret;
4828     dJMPENV;
4829
4830     PERL_ARGS_ASSERT_CALL_LIST;
4831
4832     while (av_len(paramList) >= 0) {
4833         cv = MUTABLE_CV(av_shift(paramList));
4834         if (PL_savebegin) {
4835             if (paramList == PL_beginav) {
4836                 /* save PL_beginav for compiler */
4837                 Perl_av_create_and_push(aTHX_ &PL_beginav_save, MUTABLE_SV(cv));
4838             }
4839             else if (paramList == PL_checkav) {
4840                 /* save PL_checkav for compiler */
4841                 Perl_av_create_and_push(aTHX_ &PL_checkav_save, MUTABLE_SV(cv));
4842             }
4843             else if (paramList == PL_unitcheckav) {
4844                 /* save PL_unitcheckav for compiler */
4845                 Perl_av_create_and_push(aTHX_ &PL_unitcheckav_save, MUTABLE_SV(cv));
4846             }
4847         } else {
4848             if (!PL_madskills)
4849                 SAVEFREESV(cv);
4850         }
4851         JMPENV_PUSH(ret);
4852         switch (ret) {
4853         case 0:
4854 #ifdef PERL_MAD
4855             if (PL_madskills)
4856                 PL_madskills |= 16384;
4857 #endif
4858             CALL_LIST_BODY(cv);
4859 #ifdef PERL_MAD
4860             if (PL_madskills)
4861                 PL_madskills &= ~16384;
4862 #endif
4863             atsv = ERRSV;
4864             (void)SvPV_const(atsv, len);
4865             if (len) {
4866                 PL_curcop = &PL_compiling;
4867                 CopLINE_set(PL_curcop, oldline);
4868                 if (paramList == PL_beginav)
4869                     sv_catpvs(atsv, "BEGIN failed--compilation aborted");
4870                 else
4871                     Perl_sv_catpvf(aTHX_ atsv,
4872                                    "%s failed--call queue aborted",
4873                                    paramList == PL_checkav ? "CHECK"
4874                                    : paramList == PL_initav ? "INIT"
4875                                    : paramList == PL_unitcheckav ? "UNITCHECK"
4876                                    : "END");
4877                 while (PL_scopestack_ix > oldscope)
4878                     LEAVE;
4879                 JMPENV_POP;
4880                 Perl_croak(aTHX_ "%"SVf"", SVfARG(atsv));
4881             }
4882             break;
4883         case 1:
4884             STATUS_ALL_FAILURE;
4885             /* FALL THROUGH */
4886         case 2:
4887             /* my_exit() was called */
4888             while (PL_scopestack_ix > oldscope)
4889                 LEAVE;
4890             FREETMPS;
4891             SET_CURSTASH(PL_defstash);
4892             PL_curcop = &PL_compiling;
4893             CopLINE_set(PL_curcop, oldline);
4894             JMPENV_POP;
4895             my_exit_jump();
4896             assert(0); /* NOTREACHED */
4897         case 3:
4898             if (PL_restartop) {
4899                 PL_curcop = &PL_compiling;
4900                 CopLINE_set(PL_curcop, oldline);
4901                 JMPENV_JUMP(3);
4902             }
4903             PerlIO_printf(Perl_error_log, "panic: restartop in call_list\n");
4904             FREETMPS;
4905             break;
4906         }
4907         JMPENV_POP;
4908     }
4909 }
4910
4911 void
4912 Perl_my_exit(pTHX_ U32 status)
4913 {
4914     dVAR;
4915     if (PL_exit_flags & PERL_EXIT_ABORT) {
4916         abort();
4917     }
4918     if (PL_exit_flags & PERL_EXIT_WARN) {
4919         PL_exit_flags |= PERL_EXIT_ABORT; /* Protect against reentrant calls */
4920         Perl_warn(aTHX_ "Unexpected exit %lu", (unsigned long)status);
4921         PL_exit_flags &= ~PERL_EXIT_ABORT;
4922     }
4923     switch (status) {
4924     case 0:
4925         STATUS_ALL_SUCCESS;
4926         break;
4927     case 1:
4928         STATUS_ALL_FAILURE;
4929         break;
4930     default:
4931         STATUS_EXIT_SET(status);
4932         break;
4933     }
4934     my_exit_jump();
4935 }
4936
4937 void
4938 Perl_my_failure_exit(pTHX)
4939 {
4940     dVAR;
4941 #ifdef VMS
4942      /* We have been called to fall on our sword.  The desired exit code
4943       * should be already set in STATUS_UNIX, but could be shifted over
4944       * by 8 bits.  STATUS_UNIX_EXIT_SET will handle the cases where a
4945       * that code is set.
4946       *
4947       * If an error code has not been set, then force the issue.
4948       */
4949     if (MY_POSIX_EXIT) {
4950
4951         /* According to the die_exit.t tests, if errno is non-zero */
4952         /* It should be used for the error status. */
4953
4954         if (errno == EVMSERR) {
4955             STATUS_NATIVE = vaxc$errno;
4956         } else {
4957
4958             /* According to die_exit.t tests, if the child_exit code is */
4959             /* also zero, then we need to exit with a code of 255 */
4960             if ((errno != 0) && (errno < 256))
4961                 STATUS_UNIX_EXIT_SET(errno);
4962             else if (STATUS_UNIX < 255) {
4963                 STATUS_UNIX_EXIT_SET(255);
4964             }
4965
4966         }
4967
4968         /* The exit code could have been set by $? or vmsish which
4969          * means that it may not have fatal set.  So convert
4970          * success/warning codes to fatal with out changing
4971          * the POSIX status code.  The severity makes VMS native
4972          * status handling work, while UNIX mode programs use the
4973          * the POSIX exit codes.
4974          */
4975          if ((STATUS_NATIVE & (STS$K_SEVERE|STS$K_ERROR)) == 0) {
4976             STATUS_NATIVE &= STS$M_COND_ID;
4977             STATUS_NATIVE |= STS$K_ERROR | STS$M_INHIB_MSG;
4978          }
4979     }
4980     else {
4981         /* Traditionally Perl on VMS always expects a Fatal Error. */
4982         if (vaxc$errno & 1) {
4983
4984             /* So force success status to failure */
4985             if (STATUS_NATIVE & 1)
4986                 STATUS_ALL_FAILURE;
4987         }
4988         else {
4989             if (!vaxc$errno) {
4990                 STATUS_UNIX = EINTR; /* In case something cares */
4991                 STATUS_ALL_FAILURE;
4992             }
4993             else {
4994                 int severity;
4995                 STATUS_NATIVE = vaxc$errno; /* Should already be this */
4996
4997                 /* Encode the severity code */
4998                 severity = STATUS_NATIVE & STS$M_SEVERITY;
4999                 STATUS_UNIX = (severity ? severity : 1) << 8;
5000
5001                 /* Perl expects this to be a fatal error */
5002                 if (severity != STS$K_SEVERE)
5003                     STATUS_ALL_FAILURE;
5004             }
5005         }
5006     }
5007
5008 #else
5009     int exitstatus;
5010     if (errno & 255)
5011         STATUS_UNIX_SET(errno);
5012     else {
5013         exitstatus = STATUS_UNIX >> 8;
5014         if (exitstatus & 255)
5015             STATUS_UNIX_SET(exitstatus);
5016         else
5017             STATUS_UNIX_SET(255);
5018     }
5019 #endif
5020     if (PL_exit_flags & PERL_EXIT_ABORT) {
5021         abort();
5022     }
5023     if (PL_exit_flags & PERL_EXIT_WARN) {
5024         PL_exit_flags |= PERL_EXIT_ABORT; /* Protect against reentrant calls */
5025         Perl_warn(aTHX_ "Unexpected exit failure %ld", (long)PL_statusvalue);
5026         PL_exit_flags &= ~PERL_EXIT_ABORT;
5027     }
5028     my_exit_jump();
5029 }
5030
5031 STATIC void
5032 S_my_exit_jump(pTHX)
5033 {
5034     dVAR;
5035
5036     if (PL_e_script) {
5037         SvREFCNT_dec(PL_e_script);
5038         PL_e_script = NULL;
5039     }
5040
5041     POPSTACK_TO(PL_mainstack);
5042     dounwind(-1);
5043     LEAVE_SCOPE(0);
5044
5045     JMPENV_JUMP(2);
5046 }
5047
5048 static I32
5049 read_e_script(pTHX_ int idx, SV *buf_sv, int maxlen)
5050 {
5051     dVAR;
5052     const char * const p  = SvPVX_const(PL_e_script);
5053     const char *nl = strchr(p, '\n');
5054
5055     PERL_UNUSED_ARG(idx);
5056     PERL_UNUSED_ARG(maxlen);
5057
5058     nl = (nl) ? nl+1 : SvEND(PL_e_script);
5059     if (nl-p == 0) {
5060         filter_del(read_e_script);
5061         return 0;
5062     }
5063     sv_catpvn(buf_sv, p, nl-p);
5064     sv_chop(PL_e_script, nl);
5065     return 1;
5066 }
5067
5068 /*
5069  * Local variables:
5070  * c-indentation-style: bsd
5071  * c-basic-offset: 4
5072  * indent-tabs-mode: nil
5073  * End:
5074  *
5075  * ex: set ts=8 sts=4 sw=4 et:
5076  */