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