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