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