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