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