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