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