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