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