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