Clarify example of .. in perlop
[p5sagit/p5-mst-13.2.git] / perl.c
1 /*    perl.c
2  *
3  *    Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4  *    2000, 2001, 2002, 2003, 2004, 2005, by Larry Wall and others
5  *
6  *    You may distribute under the terms of either the GNU General Public
7  *    License or the Artistic License, as specified in the README file.
8  *
9  */
10
11 /*
12  * "A ship then new they built for him/of mithril and of elven glass" --Bilbo
13  */
14
15 /* This file contains the top-level functions that are used to create, use
16  * and destroy a perl interpreter, plus the functions used by XS code to
17  * call back into perl. Note that it does not contain the actual main()
18  * function of the interpreter; that can be found in perlmain.c
19  */
20
21 /* PSz 12 Nov 03
22  * 
23  * Be proud that perl(1) may proclaim:
24  *   Setuid Perl scripts are safer than C programs ...
25  * Do not abandon (deprecate) suidperl. Do not advocate C wrappers.
26  * 
27  * The flow was: perl starts, notices script is suid, execs suidperl with same
28  * arguments; suidperl opens script, checks many things, sets itself with
29  * right UID, execs perl with similar arguments but with script pre-opened on
30  * /dev/fd/xxx; perl checks script is as should be and does work. This was
31  * insecure: see perlsec(1) for many problems with this approach.
32  * 
33  * The "correct" flow should be: perl starts, opens script and notices it is
34  * suid, checks many things, execs suidperl with similar arguments but with
35  * script on /dev/fd/xxx; suidperl checks script and /dev/fd/xxx object are
36  * same, checks arguments match #! line, sets itself with right UID, execs
37  * perl with same arguments; perl checks many things and does work.
38  * 
39  * (Opening the script in perl instead of suidperl, we "lose" scripts that
40  * are readable to the target UID but not to the invoker. Where did
41  * unreadable scripts work anyway?)
42  * 
43  * For now, suidperl and perl are pretty much the same large and cumbersome
44  * program, so suidperl can check its argument list (see comments elsewhere).
45  * 
46  * References:
47  * Original bug report:
48  *   http://bugs.perl.org/index.html?req=bug_id&bug_id=20010322.218
49  *   http://rt.perl.org/rt2/Ticket/Display.html?id=6511
50  * Comments and discussion with Debian:
51  *   http://bugs.debian.org/203426
52  *   http://bugs.debian.org/220486
53  * Debian Security Advisory DSA 431-1 (does not fully fix problem):
54  *   http://www.debian.org/security/2004/dsa-431
55  * CVE candidate:
56  *   http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2003-0618
57  * Previous versions of this patch sent to perl5-porters:
58  *   http://www.mail-archive.com/perl5-porters@perl.org/msg71953.html
59  *   http://www.mail-archive.com/perl5-porters@perl.org/msg75245.html
60  *   http://www.mail-archive.com/perl5-porters@perl.org/msg75563.html
61  *   http://www.mail-archive.com/perl5-porters@perl.org/msg75635.html
62  * 
63 Paul Szabo - psz@maths.usyd.edu.au  http://www.maths.usyd.edu.au:8000/u/psz/
64 School of Mathematics and Statistics  University of Sydney   2006  Australia
65  * 
66  */
67 /* PSz 13 Nov 03
68  * Use truthful, neat, specific error messages.
69  * Cannot always hide the truth; security must not depend on doing so.
70  */
71
72 /* PSz 18 Feb 04
73  * Use global(?), thread-local fdscript for easier checks.
74  * (I do not understand how we could possibly get a thread race:
75  * do not all threads go through the same initialization? Or in
76  * fact, are not threads started only after we get the script and
77  * so know what to do? Oh well, make things super-safe...)
78  */
79
80 #include "EXTERN.h"
81 #define PERL_IN_PERL_C
82 #include "perl.h"
83 #include "patchlevel.h"                 /* for local_patches */
84
85 #ifdef NETWARE
86 #include "nwutil.h"     
87 char *nw_get_sitelib(const char *pl);
88 #endif
89
90 /* XXX If this causes problems, set i_unistd=undef in the hint file.  */
91 #ifdef I_UNISTD
92 #include <unistd.h>
93 #endif
94
95 #ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
96 #  ifdef I_SYS_WAIT
97 #   include <sys/wait.h>
98 #  endif
99 #  ifdef I_SYSUIO
100 #    include <sys/uio.h>
101 #  endif
102
103 union control_un {
104   struct cmsghdr cm;
105   char control[CMSG_SPACE(sizeof(int))];
106 };
107
108 #endif
109
110 #ifdef __BEOS__
111 #  define HZ 1000000
112 #endif
113
114 #ifndef HZ
115 #  ifdef CLK_TCK
116 #    define HZ CLK_TCK
117 #  else
118 #    define HZ 60
119 #  endif
120 #endif
121
122 #if !defined(STANDARD_C) && !defined(HAS_GETENV_PROTOTYPE) && !defined(PERL_MICRO)
123 char *getenv (char *); /* Usually in <stdlib.h> */
124 #endif
125
126 static I32 read_e_script(pTHX_ int idx, SV *buf_sv, int maxlen);
127
128 #ifdef IAMSUID
129 #ifndef DOSUID
130 #define DOSUID
131 #endif
132 #endif /* IAMSUID */
133
134 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
135 #ifdef DOSUID
136 #undef DOSUID
137 #endif
138 #endif
139
140 #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 = NULL;
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 = NULL;
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 = NULL;
927     PL_beginav_save = NULL;
928     PL_endav = NULL;
929     PL_checkav = NULL;
930     PL_checkav_save = NULL;
931     PL_initav = NULL;
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 = NULL;
953     PL_debstash = NULL;
954
955     SvREFCNT_dec(PL_argvout_stack);
956     PL_argvout_stack = NULL;
957
958     SvREFCNT_dec(PL_modglobal);
959     PL_modglobal = NULL;
960     SvREFCNT_dec(PL_preambleav);
961     PL_preambleav = NULL;
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 = NULL;
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 = NULL;
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             PL_minus_E = TRUE;
1670             /* FALL THROUGH */
1671         case 'e':
1672 #ifdef MACOS_TRADITIONAL
1673             /* ignore -e for Dev:Pseudo argument */
1674             if (argv[1] && !strcmp(argv[1], "Dev:Pseudo"))
1675                 break;
1676 #endif
1677             forbid_setid("-e");
1678             if (!PL_e_script) {
1679                 PL_e_script = newSVpvn("",0);
1680                 filter_add(read_e_script, NULL);
1681             }
1682             if (*++s)
1683                 sv_catpv(PL_e_script, s);
1684             else if (argv[1]) {
1685                 sv_catpv(PL_e_script, argv[1]);
1686                 argc--,argv++;
1687             }
1688             else
1689                 Perl_croak(aTHX_ "No code specified for -%c", *s);
1690             sv_catpv(PL_e_script, "\n");
1691             break;
1692
1693         case 'f':
1694 #ifdef USE_SITECUSTOMIZE
1695             minus_f = TRUE;
1696 #endif
1697             s++;
1698             goto reswitch;
1699
1700         case 'I':       /* -I handled both here and in moreswitches() */
1701             forbid_setid("-I");
1702             if (!*++s && (s=argv[1]) != Nullch) {
1703                 argc--,argv++;
1704             }
1705             if (s && *s) {
1706                 STRLEN len = strlen(s);
1707                 const char * const p = savepvn(s, len);
1708                 incpush(p, TRUE, TRUE, FALSE, FALSE);
1709                 sv_catpvn(sv, "-I", 2);
1710                 sv_catpvn(sv, p, len);
1711                 sv_catpvn(sv, " ", 1);
1712                 Safefree(p);
1713             }
1714             else
1715                 Perl_croak(aTHX_ "No directory specified for -I");
1716             break;
1717         case 'P':
1718             forbid_setid("-P");
1719             PL_preprocess = TRUE;
1720             s++;
1721             goto reswitch;
1722         case 'S':
1723             forbid_setid("-S");
1724             dosearch = TRUE;
1725             s++;
1726             goto reswitch;
1727         case 'V':
1728             {
1729                 SV *opts_prog;
1730
1731                 if (!PL_preambleav)
1732                     PL_preambleav = newAV();
1733                 av_push(PL_preambleav,
1734                         newSVpv("use Config;",0));
1735                 if (*++s != ':')  {
1736                     STRLEN opts;
1737                 
1738                     opts_prog = newSVpv("print Config::myconfig(),",0);
1739 #ifdef VMS
1740                     sv_catpv(opts_prog,"\"\\nCharacteristics of this PERLSHR image: \\n\",");
1741 #else
1742                     sv_catpv(opts_prog,"\"\\nCharacteristics of this binary (from libperl): \\n\",");
1743 #endif
1744                     opts = SvCUR(opts_prog);
1745
1746                     Perl_sv_catpv(aTHX_ opts_prog,"\"  Compile-time options:"
1747 #  ifdef DEBUGGING
1748                              " DEBUGGING"
1749 #  endif
1750 #  ifdef DEBUG_LEAKING_SCALARS
1751                              " DEBUG_LEAKING_SCALARS"
1752 #  endif
1753 #  ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
1754                              " DEBUG_LEAKING_SCALARS_FORK_DUMP"
1755 #  endif
1756 #  ifdef FAKE_THREADS
1757                              " FAKE_THREADS"
1758 #  endif
1759 #  ifdef MULTIPLICITY
1760                              " MULTIPLICITY"
1761 #  endif
1762 #  ifdef MYMALLOC
1763                              " MYMALLOC"
1764 #  endif
1765 #  ifdef NO_MATHOMS
1766                             " NO_MATHOMS"
1767 #  endif
1768 #  ifdef PERL_DONT_CREATE_GVSV
1769                              " PERL_DONT_CREATE_GVSV"
1770 #  endif
1771 #  ifdef PERL_GLOBAL_STRUCT
1772                              " PERL_GLOBAL_STRUCT"
1773 #  endif
1774 #  ifdef PERL_IMPLICIT_CONTEXT
1775                              " PERL_IMPLICIT_CONTEXT"
1776 #  endif
1777 #  ifdef PERL_IMPLICIT_SYS
1778                              " PERL_IMPLICIT_SYS"
1779 #  endif
1780 #  ifdef PERL_MALLOC_WRAP
1781                              " PERL_MALLOC_WRAP"
1782 #  endif
1783 #  ifdef PERL_NEED_APPCTX
1784                              " PERL_NEED_APPCTX"
1785 #  endif
1786 #  ifdef PERL_NEED_TIMESBASE
1787                              " PERL_NEED_TIMESBASE"
1788 #  endif
1789 #  ifdef PERL_OLD_COPY_ON_WRITE
1790                              " PERL_OLD_COPY_ON_WRITE"
1791 #  endif
1792 #  ifdef PERL_TRACK_MEMPOOL
1793                              " PERL_TRACK_MEMPOOL"
1794 #  endif
1795 #  ifdef PERL_USE_SAFE_PUTENV
1796                              " PERL_USE_SAFE_PUTENV"
1797 #  endif
1798 #ifdef PERL_USES_PL_PIDSTATUS
1799                              " PERL_USES_PL_PIDSTATUS"
1800 #endif
1801 #  ifdef PL_OP_SLAB_ALLOC
1802                              " PL_OP_SLAB_ALLOC"
1803 #  endif
1804 #  ifdef SPRINTF_RETURNS_STRLEN
1805                              " SPRINTF_RETURNS_STRLEN"
1806 #  endif
1807 #  ifdef THREADS_HAVE_PIDS
1808                              " THREADS_HAVE_PIDS"
1809 #  endif
1810 #  ifdef USE_5005THREADS
1811                              " USE_5005THREADS"
1812 #  endif
1813 #  ifdef USE_64_BIT_ALL
1814                              " USE_64_BIT_ALL"
1815 #  endif
1816 #  ifdef USE_64_BIT_INT
1817                              " USE_64_BIT_INT"
1818 #  endif
1819 #  ifdef USE_ITHREADS
1820                              " USE_ITHREADS"
1821 #  endif
1822 #  ifdef USE_LARGE_FILES
1823                              " USE_LARGE_FILES"
1824 #  endif
1825 #  ifdef USE_LONG_DOUBLE
1826                              " USE_LONG_DOUBLE"
1827 #  endif
1828 #  ifdef USE_PERLIO
1829                              " USE_PERLIO"
1830 #  endif
1831 #  ifdef USE_REENTRANT_API
1832                              " USE_REENTRANT_API"
1833 #  endif
1834 #  ifdef USE_SFIO
1835                              " USE_SFIO"
1836 #  endif
1837 #  ifdef USE_SITECUSTOMIZE
1838                              " USE_SITECUSTOMIZE"
1839 #  endif               
1840 #  ifdef USE_SOCKS
1841                              " USE_SOCKS"
1842 #  endif
1843                              );
1844
1845                     while (SvCUR(opts_prog) > opts+76) {
1846                         /* find last space after "options: " and before col 76
1847                          */
1848
1849                         const char *space;
1850                         char * const pv = SvPV_nolen(opts_prog);
1851                         const char c = pv[opts+76];
1852                         pv[opts+76] = '\0';
1853                         space = strrchr(pv+opts+26, ' ');
1854                         pv[opts+76] = c;
1855                         if (!space) break; /* "Can't happen" */
1856
1857                         /* break the line before that space */
1858
1859                         opts = space - pv;
1860                         sv_insert(opts_prog, opts, 0,
1861                                   "\\n                       ", 25);
1862                     }
1863
1864                     sv_catpv(opts_prog,"\\n\",");
1865
1866 #if defined(LOCAL_PATCH_COUNT)
1867                     if (LOCAL_PATCH_COUNT > 0) {
1868                         int i;
1869                         sv_catpv(opts_prog,
1870                                  "\"  Locally applied patches:\\n\",");
1871                         for (i = 1; i <= LOCAL_PATCH_COUNT; i++) {
1872                             if (PL_localpatches[i])
1873                                 Perl_sv_catpvf(aTHX_ opts_prog,"q%c\t%s\n%c,",
1874                                                0, PL_localpatches[i], 0);
1875                         }
1876                     }
1877 #endif
1878                     Perl_sv_catpvf(aTHX_ opts_prog,
1879                                    "\"  Built under %s\\n\"",OSNAME);
1880 #ifdef __DATE__
1881 #  ifdef __TIME__
1882                     Perl_sv_catpvf(aTHX_ opts_prog,
1883                                    ",\"  Compiled at %s %s\\n\"",__DATE__,
1884                                    __TIME__);
1885 #  else
1886                     Perl_sv_catpvf(aTHX_ opts_prog,",\"  Compiled on %s\\n\"",
1887                                    __DATE__);
1888 #  endif
1889 #endif
1890                     sv_catpv(opts_prog, "; $\"=\"\\n    \"; "
1891                              "@env = map { \"$_=\\\"$ENV{$_}\\\"\" } "
1892                              "sort grep {/^PERL/} keys %ENV; ");
1893 #ifdef __CYGWIN__
1894                     sv_catpv(opts_prog,
1895                              "push @env, \"CYGWIN=\\\"$ENV{CYGWIN}\\\"\";");
1896 #endif
1897                     sv_catpv(opts_prog, 
1898                              "print \"  \\%ENV:\\n    @env\\n\" if @env;"
1899                              "print \"  \\@INC:\\n    @INC\\n\";");
1900                 }
1901                 else {
1902                     ++s;
1903                     opts_prog = Perl_newSVpvf(aTHX_
1904                                               "Config::config_vars(qw%c%s%c)",
1905                                               0, s, 0);
1906                     s += strlen(s);
1907                 }
1908                 av_push(PL_preambleav, opts_prog);
1909                 /* don't look for script or read stdin */
1910                 scriptname = BIT_BUCKET;
1911                 goto reswitch;
1912             }
1913         case 'x':
1914             PL_doextract = TRUE;
1915             s++;
1916             if (*s)
1917                 cddir = s;
1918             break;
1919         case 0:
1920             break;
1921         case '-':
1922             if (!*++s || isSPACE(*s)) {
1923                 argc--,argv++;
1924                 goto switch_end;
1925             }
1926             /* catch use of gnu style long options */
1927             if (strEQ(s, "version")) {
1928                 s = (char *)"v";
1929                 goto reswitch;
1930             }
1931             if (strEQ(s, "help")) {
1932                 s = (char *)"h";
1933                 goto reswitch;
1934             }
1935             s--;
1936             /* FALL THROUGH */
1937         default:
1938             Perl_croak(aTHX_ "Unrecognized switch: -%s  (-h will show valid options)",s);
1939         }
1940     }
1941   switch_end:
1942
1943     if (
1944 #ifndef SECURE_INTERNAL_GETENV
1945         !PL_tainting &&
1946 #endif
1947         (s = PerlEnv_getenv("PERL5OPT")))
1948     {
1949         const char *popt = s;
1950         while (isSPACE(*s))
1951             s++;
1952         if (*s == '-' && *(s+1) == 'T') {
1953             CHECK_MALLOC_TOO_LATE_FOR('T');
1954             PL_tainting = TRUE;
1955             PL_taint_warn = FALSE;
1956         }
1957         else {
1958             char *popt_copy = Nullch;
1959             while (s && *s) {
1960                 char *d;
1961                 while (isSPACE(*s))
1962                     s++;
1963                 if (*s == '-') {
1964                     s++;
1965                     if (isSPACE(*s))
1966                         continue;
1967                 }
1968                 d = s;
1969                 if (!*s)
1970                     break;
1971                 if (!strchr("CDIMUdmtwA", *s))
1972                     Perl_croak(aTHX_ "Illegal switch in PERL5OPT: -%c", *s);
1973                 while (++s && *s) {
1974                     if (isSPACE(*s)) {
1975                         if (!popt_copy) {
1976                             popt_copy = SvPVX(sv_2mortal(newSVpv(popt,0)));
1977                             s = popt_copy + (s - popt);
1978                             d = popt_copy + (d - popt);
1979                         }
1980                         *s++ = '\0';
1981                         break;
1982                     }
1983                 }
1984                 if (*d == 't') {
1985                     if( !PL_tainting ) {
1986                         PL_taint_warn = TRUE;
1987                         PL_tainting = TRUE;
1988                     }
1989                 } else {
1990                     moreswitches(d);
1991                 }
1992             }
1993         }
1994     }
1995
1996 #ifdef USE_SITECUSTOMIZE
1997     if (!minus_f) {
1998         if (!PL_preambleav)
1999             PL_preambleav = newAV();
2000         av_unshift(PL_preambleav, 1);
2001         (void)av_store(PL_preambleav, 0, Perl_newSVpvf(aTHX_ "BEGIN { do '%s/sitecustomize.pl' }", SITELIB_EXP));
2002     }
2003 #endif
2004
2005     if (PL_taint_warn && PL_dowarn != G_WARN_ALL_OFF) {
2006        PL_compiling.cop_warnings = newSVpvn(WARN_TAINTstring, WARNsize);
2007     }
2008
2009     if (!scriptname)
2010         scriptname = argv[0];
2011     if (PL_e_script) {
2012         argc++,argv--;
2013         scriptname = BIT_BUCKET;        /* don't look for script or read stdin */
2014     }
2015     else if (scriptname == Nullch) {
2016 #ifdef MSDOS
2017         if ( PerlLIO_isatty(PerlIO_fileno(PerlIO_stdin())) )
2018             moreswitches("h");
2019 #endif
2020         scriptname = "-";
2021     }
2022
2023     /* Set $^X early so that it can be used for relocatable paths in @INC  */
2024     assert (!PL_tainted);
2025     TAINT;
2026     S_set_caret_X(aTHX);
2027     TAINT_NOT;
2028     init_perllib();
2029
2030     open_script(scriptname,dosearch,sv);
2031
2032     validate_suid(validarg, scriptname);
2033
2034 #ifndef PERL_MICRO
2035 #if defined(SIGCHLD) || defined(SIGCLD)
2036     {
2037 #ifndef SIGCHLD
2038 #  define SIGCHLD SIGCLD
2039 #endif
2040         Sighandler_t sigstate = rsignal_state(SIGCHLD);
2041         if (sigstate == (Sighandler_t) SIG_IGN) {
2042             if (ckWARN(WARN_SIGNAL))
2043                 Perl_warner(aTHX_ packWARN(WARN_SIGNAL),
2044                             "Can't ignore signal CHLD, forcing to default");
2045             (void)rsignal(SIGCHLD, (Sighandler_t)SIG_DFL);
2046         }
2047     }
2048 #endif
2049 #endif
2050
2051 #ifdef MACOS_TRADITIONAL
2052     if (PL_doextract || gMacPerl_AlwaysExtract) {
2053 #else
2054     if (PL_doextract) {
2055 #endif
2056         find_beginning();
2057         if (cddir && PerlDir_chdir( (char *)cddir ) < 0)
2058             Perl_croak(aTHX_ "Can't chdir to %s",cddir);
2059
2060     }
2061
2062     PL_main_cv = PL_compcv = (CV*)NEWSV(1104,0);
2063     sv_upgrade((SV *)PL_compcv, SVt_PVCV);
2064     CvUNIQUE_on(PL_compcv);
2065
2066     CvPADLIST(PL_compcv) = pad_new(0);
2067 #ifdef USE_5005THREADS
2068     CvOWNER(PL_compcv) = 0;
2069     Newx(CvMUTEXP(PL_compcv), 1, perl_mutex);
2070     MUTEX_INIT(CvMUTEXP(PL_compcv));
2071 #endif /* USE_5005THREADS */
2072
2073     boot_core_PerlIO();
2074     boot_core_UNIVERSAL();
2075     boot_core_xsutils();
2076
2077     if (xsinit)
2078         (*xsinit)(aTHX);        /* in case linked C routines want magical variables */
2079 #ifndef PERL_MICRO
2080 #if defined(VMS) || defined(WIN32) || defined(DJGPP) || defined(__CYGWIN__) || defined(EPOC) || defined(SYMBIAN)
2081     init_os_extras();
2082 #endif
2083 #endif
2084
2085 #ifdef USE_SOCKS
2086 #   ifdef HAS_SOCKS5_INIT
2087     socks5_init(argv[0]);
2088 #   else
2089     SOCKSinit(argv[0]);
2090 #   endif
2091 #endif
2092
2093     init_predump_symbols();
2094     /* init_postdump_symbols not currently designed to be called */
2095     /* more than once (ENV isn't cleared first, for example)     */
2096     /* But running with -u leaves %ENV & @ARGV undefined!    XXX */
2097     if (!PL_do_undump)
2098         init_postdump_symbols(argc,argv,env);
2099
2100     /* PL_unicode is turned on by -C, or by $ENV{PERL_UNICODE},
2101      * or explicitly in some platforms.
2102      * locale.c:Perl_init_i18nl10n() if the environment
2103      * look like the user wants to use UTF-8. */
2104 #if defined(__SYMBIAN32__)
2105     PL_unicode = PERL_UNICODE_STD_FLAG; /* See PERL_SYMBIAN_CONSOLE_UTF8. */
2106 #endif
2107     if (PL_unicode) {
2108          /* Requires init_predump_symbols(). */
2109          if (!(PL_unicode & PERL_UNICODE_LOCALE_FLAG) || PL_utf8locale) {
2110               IO* io;
2111               PerlIO* fp;
2112               SV* sv;
2113
2114               /* Turn on UTF-8-ness on STDIN, STDOUT, STDERR
2115                * and the default open disciplines. */
2116               if ((PL_unicode & PERL_UNICODE_STDIN_FLAG) &&
2117                   PL_stdingv  && (io = GvIO(PL_stdingv)) &&
2118                   (fp = IoIFP(io)))
2119                    PerlIO_binmode(aTHX_ fp, IoTYPE(io), 0, ":utf8");
2120               if ((PL_unicode & PERL_UNICODE_STDOUT_FLAG) &&
2121                   PL_defoutgv && (io = GvIO(PL_defoutgv)) &&
2122                   (fp = IoOFP(io)))
2123                    PerlIO_binmode(aTHX_ fp, IoTYPE(io), 0, ":utf8");
2124               if ((PL_unicode & PERL_UNICODE_STDERR_FLAG) &&
2125                   PL_stderrgv && (io = GvIO(PL_stderrgv)) &&
2126                   (fp = IoOFP(io)))
2127                    PerlIO_binmode(aTHX_ fp, IoTYPE(io), 0, ":utf8");
2128               if ((PL_unicode & PERL_UNICODE_INOUT_FLAG) &&
2129                   (sv = GvSV(gv_fetchpv("\017PEN", TRUE, SVt_PV)))) {
2130                    U32 in  = PL_unicode & PERL_UNICODE_IN_FLAG;
2131                    U32 out = PL_unicode & PERL_UNICODE_OUT_FLAG;
2132                    if (in) {
2133                         if (out)
2134                              sv_setpvn(sv, ":utf8\0:utf8", 11);
2135                         else
2136                              sv_setpvn(sv, ":utf8\0", 6);
2137                    }
2138                    else if (out)
2139                         sv_setpvn(sv, "\0:utf8", 6);
2140                    SvSETMAGIC(sv);
2141               }
2142          }
2143     }
2144
2145     if ((s = PerlEnv_getenv("PERL_SIGNALS"))) {
2146          if (strEQ(s, "unsafe"))
2147               PL_signals |=  PERL_SIGNALS_UNSAFE_FLAG;
2148          else if (strEQ(s, "safe"))
2149               PL_signals &= ~PERL_SIGNALS_UNSAFE_FLAG;
2150          else
2151               Perl_croak(aTHX_ "PERL_SIGNALS illegal: \"%s\"", s);
2152     }
2153
2154     init_lexer();
2155
2156     /* now parse the script */
2157
2158     SETERRNO(0,SS_NORMAL);
2159     PL_error_count = 0;
2160 #ifdef MACOS_TRADITIONAL
2161     if (gMacPerl_SyntaxError = (yyparse() || PL_error_count)) {
2162         if (PL_minus_c)
2163             Perl_croak(aTHX_ "%s had compilation errors.\n", MacPerl_MPWFileName(PL_origfilename));
2164         else {
2165             Perl_croak(aTHX_ "Execution of %s aborted due to compilation errors.\n",
2166                        MacPerl_MPWFileName(PL_origfilename));
2167         }
2168     }
2169 #else
2170     if (yyparse() || PL_error_count) {
2171         if (PL_minus_c)
2172             Perl_croak(aTHX_ "%s had compilation errors.\n", PL_origfilename);
2173         else {
2174             Perl_croak(aTHX_ "Execution of %s aborted due to compilation errors.\n",
2175                        PL_origfilename);
2176         }
2177     }
2178 #endif
2179     CopLINE_set(PL_curcop, 0);
2180     PL_curstash = PL_defstash;
2181     PL_preprocess = FALSE;
2182     if (PL_e_script) {
2183         SvREFCNT_dec(PL_e_script);
2184         PL_e_script = Nullsv;
2185     }
2186
2187     if (PL_do_undump)
2188         my_unexec();
2189
2190     if (isWARN_ONCE) {
2191         SAVECOPFILE(PL_curcop);
2192         SAVECOPLINE(PL_curcop);
2193         gv_check(PL_defstash);
2194     }
2195
2196     LEAVE;
2197     FREETMPS;
2198
2199 #ifdef MYMALLOC
2200     if ((s=PerlEnv_getenv("PERL_DEBUG_MSTATS")) && atoi(s) >= 2)
2201         dump_mstats("after compilation:");
2202 #endif
2203
2204     ENTER;
2205     PL_restartop = 0;
2206     return NULL;
2207 }
2208
2209 /*
2210 =for apidoc perl_run
2211
2212 Tells a Perl interpreter to run.  See L<perlembed>.
2213
2214 =cut
2215 */
2216
2217 int
2218 perl_run(pTHXx)
2219 {
2220     I32 oldscope;
2221     int ret = 0;
2222     dJMPENV;
2223
2224     PERL_UNUSED_ARG(my_perl);
2225
2226     oldscope = PL_scopestack_ix;
2227 #ifdef VMS
2228     VMSISH_HUSHED = 0;
2229 #endif
2230
2231     JMPENV_PUSH(ret);
2232     switch (ret) {
2233     case 1:
2234         cxstack_ix = -1;                /* start context stack again */
2235         goto redo_body;
2236     case 0:                             /* normal completion */
2237  redo_body:
2238         run_body(oldscope);
2239         /* FALL THROUGH */
2240     case 2:                             /* my_exit() */
2241         while (PL_scopestack_ix > oldscope)
2242             LEAVE;
2243         FREETMPS;
2244         PL_curstash = PL_defstash;
2245         if (!(PL_exit_flags & PERL_EXIT_DESTRUCT_END) &&
2246             PL_endav && !PL_minus_c)
2247             call_list(oldscope, PL_endav);
2248 #ifdef MYMALLOC
2249         if (PerlEnv_getenv("PERL_DEBUG_MSTATS"))
2250             dump_mstats("after execution:  ");
2251 #endif
2252         ret = STATUS_EXIT;
2253         break;
2254     case 3:
2255         if (PL_restartop) {
2256             POPSTACK_TO(PL_mainstack);
2257             goto redo_body;
2258         }
2259         PerlIO_printf(Perl_error_log, "panic: restartop\n");
2260         FREETMPS;
2261         ret = 1;
2262         break;
2263     }
2264
2265     JMPENV_POP;
2266     return ret;
2267 }
2268
2269
2270 STATIC void
2271 S_run_body(pTHX_ I32 oldscope)
2272 {
2273     DEBUG_r(PerlIO_printf(Perl_debug_log, "%s $` $& $' support.\n",
2274                     PL_sawampersand ? "Enabling" : "Omitting"));
2275
2276     if (!PL_restartop) {
2277         DEBUG_x(dump_all());
2278 #ifdef DEBUGGING
2279         if (!DEBUG_q_TEST)
2280           PERL_DEBUG(PerlIO_printf(Perl_debug_log, "\nEXECUTING...\n\n"));
2281 #endif
2282         DEBUG_S(PerlIO_printf(Perl_debug_log, "main thread is 0x%"UVxf"\n",
2283                               PTR2UV(thr)));
2284
2285         if (PL_minus_c) {
2286 #ifdef MACOS_TRADITIONAL
2287             PerlIO_printf(Perl_error_log, "%s%s syntax OK\n",
2288                 (gMacPerl_ErrorFormat ? "# " : ""),
2289                 MacPerl_MPWFileName(PL_origfilename));
2290 #else
2291             PerlIO_printf(Perl_error_log, "%s syntax OK\n", PL_origfilename);
2292 #endif
2293             my_exit(0);
2294         }
2295         if (PERLDB_SINGLE && PL_DBsingle)
2296             sv_setiv(PL_DBsingle, 1);
2297         if (PL_initav)
2298             call_list(oldscope, PL_initav);
2299     }
2300
2301     /* do it */
2302
2303     if (PL_restartop) {
2304         PL_op = PL_restartop;
2305         PL_restartop = 0;
2306         CALLRUNOPS(aTHX);
2307     }
2308     else if (PL_main_start) {
2309         CvDEPTH(PL_main_cv) = 1;
2310         PL_op = PL_main_start;
2311         CALLRUNOPS(aTHX);
2312     }
2313     my_exit(0);
2314     /* NOTREACHED */
2315 }
2316
2317 /*
2318 =head1 SV Manipulation Functions
2319
2320 =for apidoc p||get_sv
2321
2322 Returns the SV of the specified Perl scalar.  If C<create> is set and the
2323 Perl variable does not exist then it will be created.  If C<create> is not
2324 set and the variable does not exist then NULL is returned.
2325
2326 =cut
2327 */
2328
2329 SV*
2330 Perl_get_sv(pTHX_ const char *name, I32 create)
2331 {
2332     GV *gv;
2333 #ifdef USE_5005THREADS
2334     if (name[1] == '\0' && !isALPHA(name[0])) {
2335         PADOFFSET tmp = find_threadsv(name);
2336         if (tmp != NOT_IN_PAD)
2337             return THREADSV(tmp);
2338     }
2339 #endif /* USE_5005THREADS */
2340     gv = gv_fetchpv(name, create, SVt_PV);
2341     if (gv)
2342         return GvSV(gv);
2343     return Nullsv;
2344 }
2345
2346 /*
2347 =head1 Array Manipulation Functions
2348
2349 =for apidoc p||get_av
2350
2351 Returns the AV of the specified Perl array.  If C<create> is set and the
2352 Perl variable does not exist then it will be created.  If C<create> is not
2353 set and the variable does not exist then NULL is returned.
2354
2355 =cut
2356 */
2357
2358 AV*
2359 Perl_get_av(pTHX_ const char *name, I32 create)
2360 {
2361     GV* const gv = gv_fetchpv(name, create, SVt_PVAV);
2362     if (create)
2363         return GvAVn(gv);
2364     if (gv)
2365         return GvAV(gv);
2366     return NULL;
2367 }
2368
2369 /*
2370 =head1 Hash Manipulation Functions
2371
2372 =for apidoc p||get_hv
2373
2374 Returns the HV of the specified Perl hash.  If C<create> is set and the
2375 Perl variable does not exist then it will be created.  If C<create> is not
2376 set and the variable does not exist then NULL is returned.
2377
2378 =cut
2379 */
2380
2381 HV*
2382 Perl_get_hv(pTHX_ const char *name, I32 create)
2383 {
2384     GV* const gv = gv_fetchpv(name, create, SVt_PVHV);
2385     if (create)
2386         return GvHVn(gv);
2387     if (gv)
2388         return GvHV(gv);
2389     return NULL;
2390 }
2391
2392 /*
2393 =head1 CV Manipulation Functions
2394
2395 =for apidoc p||get_cv
2396
2397 Returns the CV of the specified Perl subroutine.  If C<create> is set and
2398 the Perl subroutine does not exist then it will be declared (which has the
2399 same effect as saying C<sub name;>).  If C<create> is not set and the
2400 subroutine does not exist then NULL is returned.
2401
2402 =cut
2403 */
2404
2405 CV*
2406 Perl_get_cv(pTHX_ const char *name, I32 create)
2407 {
2408     GV* const gv = gv_fetchpv(name, create, SVt_PVCV);
2409     /* XXX unsafe for threads if eval_owner isn't held */
2410     /* XXX this is probably not what they think they're getting.
2411      * It has the same effect as "sub name;", i.e. just a forward
2412      * declaration! */
2413     if (create && !GvCVu(gv))
2414         return newSUB(start_subparse(FALSE, 0),
2415                       newSVOP(OP_CONST, 0, newSVpv(name,0)),
2416                       Nullop,
2417                       Nullop);
2418     if (gv)
2419         return GvCVu(gv);
2420     return Nullcv;
2421 }
2422
2423 /* Be sure to refetch the stack pointer after calling these routines. */
2424
2425 /*
2426
2427 =head1 Callback Functions
2428
2429 =for apidoc p||call_argv
2430
2431 Performs a callback to the specified Perl sub.  See L<perlcall>.
2432
2433 =cut
2434 */
2435
2436 I32
2437 Perl_call_argv(pTHX_ const char *sub_name, I32 flags, register char **argv)
2438
2439                         /* See G_* flags in cop.h */
2440                         /* null terminated arg list */
2441 {
2442     dSP;
2443
2444     PUSHMARK(SP);
2445     if (argv) {
2446         while (*argv) {
2447             XPUSHs(sv_2mortal(newSVpv(*argv,0)));
2448             argv++;
2449         }
2450         PUTBACK;
2451     }
2452     return call_pv(sub_name, flags);
2453 }
2454
2455 /*
2456 =for apidoc p||call_pv
2457
2458 Performs a callback to the specified Perl sub.  See L<perlcall>.
2459
2460 =cut
2461 */
2462
2463 I32
2464 Perl_call_pv(pTHX_ const char *sub_name, I32 flags)
2465                         /* name of the subroutine */
2466                         /* See G_* flags in cop.h */
2467 {
2468     return call_sv((SV*)get_cv(sub_name, TRUE), flags);
2469 }
2470
2471 /*
2472 =for apidoc p||call_method
2473
2474 Performs a callback to the specified Perl method.  The blessed object must
2475 be on the stack.  See L<perlcall>.
2476
2477 =cut
2478 */
2479
2480 I32
2481 Perl_call_method(pTHX_ const char *methname, I32 flags)
2482                         /* name of the subroutine */
2483                         /* See G_* flags in cop.h */
2484 {
2485     return call_sv(sv_2mortal(newSVpv(methname,0)), flags | G_METHOD);
2486 }
2487
2488 /* May be called with any of a CV, a GV, or an SV containing the name. */
2489 /*
2490 =for apidoc p||call_sv
2491
2492 Performs a callback to the Perl sub whose name is in the SV.  See
2493 L<perlcall>.
2494
2495 =cut
2496 */
2497
2498 I32
2499 Perl_call_sv(pTHX_ SV *sv, I32 flags)
2500                         /* See G_* flags in cop.h */
2501 {
2502     dVAR; dSP;
2503     LOGOP myop;         /* fake syntax tree node */
2504     UNOP method_op;
2505     I32 oldmark;
2506     volatile I32 retval = 0;
2507     I32 oldscope;
2508     bool oldcatch = CATCH_GET;
2509     int ret;
2510     OP* const oldop = PL_op;
2511     dJMPENV;
2512
2513     if (flags & G_DISCARD) {
2514         ENTER;
2515         SAVETMPS;
2516     }
2517
2518     Zero(&myop, 1, LOGOP);
2519     myop.op_next = Nullop;
2520     if (!(flags & G_NOARGS))
2521         myop.op_flags |= OPf_STACKED;
2522     myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
2523                       (flags & G_ARRAY) ? OPf_WANT_LIST :
2524                       OPf_WANT_SCALAR);
2525     SAVEOP();
2526     PL_op = (OP*)&myop;
2527
2528     EXTEND(PL_stack_sp, 1);
2529     *++PL_stack_sp = sv;
2530     oldmark = TOPMARK;
2531     oldscope = PL_scopestack_ix;
2532
2533     if (PERLDB_SUB && PL_curstash != PL_debstash
2534            /* Handle first BEGIN of -d. */
2535           && (PL_DBcv || (PL_DBcv = GvCV(PL_DBsub)))
2536            /* Try harder, since this may have been a sighandler, thus
2537             * curstash may be meaningless. */
2538           && (SvTYPE(sv) != SVt_PVCV || CvSTASH((CV*)sv) != PL_debstash)
2539           && !(flags & G_NODEBUG))
2540         PL_op->op_private |= OPpENTERSUB_DB;
2541
2542     if (flags & G_METHOD) {
2543         Zero(&method_op, 1, UNOP);
2544         method_op.op_next = PL_op;
2545         method_op.op_ppaddr = PL_ppaddr[OP_METHOD];
2546         myop.op_ppaddr = PL_ppaddr[OP_ENTERSUB];
2547         PL_op = (OP*)&method_op;
2548     }
2549
2550     if (!(flags & G_EVAL)) {
2551         CATCH_SET(TRUE);
2552         call_body((OP*)&myop, FALSE);
2553         retval = PL_stack_sp - (PL_stack_base + oldmark);
2554         CATCH_SET(oldcatch);
2555     }
2556     else {
2557         myop.op_other = (OP*)&myop;
2558         PL_markstack_ptr--;
2559         /* we're trying to emulate pp_entertry() here */
2560         {
2561             register PERL_CONTEXT *cx;
2562             const I32 gimme = GIMME_V;
2563         
2564             ENTER;
2565             SAVETMPS;
2566         
2567             PUSHBLOCK(cx, (CXt_EVAL|CXp_TRYBLOCK), PL_stack_sp);
2568             PUSHEVAL(cx, 0, 0);
2569             PL_eval_root = PL_op;             /* Only needed so that goto works right. */
2570         
2571             PL_in_eval = EVAL_INEVAL;
2572             if (flags & G_KEEPERR)
2573                 PL_in_eval |= EVAL_KEEPERR;
2574             else
2575                 sv_setpvn(ERRSV,"",0);
2576         }
2577         PL_markstack_ptr++;
2578
2579         JMPENV_PUSH(ret);
2580         switch (ret) {
2581         case 0:
2582  redo_body:
2583             call_body((OP*)&myop, FALSE);
2584             retval = PL_stack_sp - (PL_stack_base + oldmark);
2585             if (!(flags & G_KEEPERR))
2586                 sv_setpvn(ERRSV,"",0);
2587             break;
2588         case 1:
2589             STATUS_ALL_FAILURE;
2590             /* FALL THROUGH */
2591         case 2:
2592             /* my_exit() was called */
2593             PL_curstash = PL_defstash;
2594             FREETMPS;
2595             JMPENV_POP;
2596             if (PL_statusvalue && !(PL_exit_flags & PERL_EXIT_EXPECTED))
2597                 Perl_croak(aTHX_ "Callback called exit");
2598             my_exit_jump();
2599             /* NOTREACHED */
2600         case 3:
2601             if (PL_restartop) {
2602                 PL_op = PL_restartop;
2603                 PL_restartop = 0;
2604                 goto redo_body;
2605             }
2606             PL_stack_sp = PL_stack_base + oldmark;
2607             if (flags & G_ARRAY)
2608                 retval = 0;
2609             else {
2610                 retval = 1;
2611                 *++PL_stack_sp = &PL_sv_undef;
2612             }
2613             break;
2614         }
2615
2616         if (PL_scopestack_ix > oldscope) {
2617             SV **newsp;
2618             PMOP *newpm;
2619             I32 gimme;
2620             register PERL_CONTEXT *cx;
2621             I32 optype;
2622
2623             POPBLOCK(cx,newpm);
2624             POPEVAL(cx);
2625             PL_curpm = newpm;
2626             LEAVE;
2627             PERL_UNUSED_VAR(newsp);
2628             PERL_UNUSED_VAR(gimme);
2629             PERL_UNUSED_VAR(optype);
2630         }
2631         JMPENV_POP;
2632     }
2633
2634     if (flags & G_DISCARD) {
2635         PL_stack_sp = PL_stack_base + oldmark;
2636         retval = 0;
2637         FREETMPS;
2638         LEAVE;
2639     }
2640     PL_op = oldop;
2641     return retval;
2642 }
2643
2644 STATIC void
2645 S_call_body(pTHX_ const OP *myop, bool is_eval)
2646 {
2647     if (PL_op == myop) {
2648         if (is_eval)
2649             PL_op = Perl_pp_entereval(aTHX);    /* this doesn't do a POPMARK */
2650         else
2651             PL_op = Perl_pp_entersub(aTHX);     /* this does */
2652     }
2653     if (PL_op)
2654         CALLRUNOPS(aTHX);
2655 }
2656
2657 /* Eval a string. The G_EVAL flag is always assumed. */
2658
2659 /*
2660 =for apidoc p||eval_sv
2661
2662 Tells Perl to C<eval> the string in the SV.
2663
2664 =cut
2665 */
2666
2667 I32
2668 Perl_eval_sv(pTHX_ SV *sv, I32 flags)
2669
2670                         /* See G_* flags in cop.h */
2671 {
2672     dSP;
2673     UNOP myop;          /* fake syntax tree node */
2674     volatile I32 oldmark = SP - PL_stack_base;
2675     volatile I32 retval = 0;
2676     int ret;
2677     OP* const oldop = PL_op;
2678     dJMPENV;
2679
2680     if (flags & G_DISCARD) {
2681         ENTER;
2682         SAVETMPS;
2683     }
2684
2685     SAVEOP();
2686     PL_op = (OP*)&myop;
2687     Zero(PL_op, 1, UNOP);
2688     EXTEND(PL_stack_sp, 1);
2689     *++PL_stack_sp = sv;
2690
2691     if (!(flags & G_NOARGS))
2692         myop.op_flags = OPf_STACKED;
2693     myop.op_next = Nullop;
2694     myop.op_type = OP_ENTEREVAL;
2695     myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
2696                       (flags & G_ARRAY) ? OPf_WANT_LIST :
2697                       OPf_WANT_SCALAR);
2698     if (flags & G_KEEPERR)
2699         myop.op_flags |= OPf_SPECIAL;
2700
2701     /* fail now; otherwise we could fail after the JMPENV_PUSH but
2702      * before a PUSHEVAL, which corrupts the stack after a croak */
2703     TAINT_PROPER("eval_sv()");
2704
2705     JMPENV_PUSH(ret);
2706     switch (ret) {
2707     case 0:
2708  redo_body:
2709         call_body((OP*)&myop,TRUE);
2710         retval = PL_stack_sp - (PL_stack_base + oldmark);
2711         if (!(flags & G_KEEPERR))
2712             sv_setpvn(ERRSV,"",0);
2713         break;
2714     case 1:
2715         STATUS_ALL_FAILURE;
2716         /* FALL THROUGH */
2717     case 2:
2718         /* my_exit() was called */
2719         PL_curstash = PL_defstash;
2720         FREETMPS;
2721         JMPENV_POP;
2722         if (PL_statusvalue && !(PL_exit_flags & PERL_EXIT_EXPECTED))
2723             Perl_croak(aTHX_ "Callback called exit");
2724         my_exit_jump();
2725         /* NOTREACHED */
2726     case 3:
2727         if (PL_restartop) {
2728             PL_op = PL_restartop;
2729             PL_restartop = 0;
2730             goto redo_body;
2731         }
2732         PL_stack_sp = PL_stack_base + oldmark;
2733         if (flags & G_ARRAY)
2734             retval = 0;
2735         else {
2736             retval = 1;
2737             *++PL_stack_sp = &PL_sv_undef;
2738         }
2739         break;
2740     }
2741
2742     JMPENV_POP;
2743     if (flags & G_DISCARD) {
2744         PL_stack_sp = PL_stack_base + oldmark;
2745         retval = 0;
2746         FREETMPS;
2747         LEAVE;
2748     }
2749     PL_op = oldop;
2750     return retval;
2751 }
2752
2753 /*
2754 =for apidoc p||eval_pv
2755
2756 Tells Perl to C<eval> the given string and return an SV* result.
2757
2758 =cut
2759 */
2760
2761 SV*
2762 Perl_eval_pv(pTHX_ const char *p, I32 croak_on_error)
2763 {
2764     dSP;
2765     SV* sv = newSVpv(p, 0);
2766
2767     eval_sv(sv, G_SCALAR);
2768     SvREFCNT_dec(sv);
2769
2770     SPAGAIN;
2771     sv = POPs;
2772     PUTBACK;
2773
2774     if (croak_on_error && SvTRUE(ERRSV)) {
2775         Perl_croak(aTHX_ SvPVx_nolen_const(ERRSV));
2776     }
2777
2778     return sv;
2779 }
2780
2781 /* Require a module. */
2782
2783 /*
2784 =head1 Embedding Functions
2785
2786 =for apidoc p||require_pv
2787
2788 Tells Perl to C<require> the file named by the string argument.  It is
2789 analogous to the Perl code C<eval "require '$file'">.  It's even
2790 implemented that way; consider using load_module instead.
2791
2792 =cut */
2793
2794 void
2795 Perl_require_pv(pTHX_ const char *pv)
2796 {
2797     SV* sv;
2798     dSP;
2799     PUSHSTACKi(PERLSI_REQUIRE);
2800     PUTBACK;
2801     sv = Perl_newSVpvf(aTHX_ "require q%c%s%c", 0, pv, 0);
2802     eval_sv(sv_2mortal(sv), G_DISCARD);
2803     SPAGAIN;
2804     POPSTACK;
2805 }
2806
2807 void
2808 Perl_magicname(pTHX_ const char *sym, const char *name, I32 namlen)
2809 {
2810     register GV * const gv = gv_fetchpv(sym,TRUE, SVt_PV);
2811
2812     if (gv)
2813         sv_magic(GvSV(gv), (SV*)gv, PERL_MAGIC_sv, name, namlen);
2814 }
2815
2816 STATIC void
2817 S_usage(pTHX_ const char *name)         /* XXX move this out into a module ? */
2818 {
2819     /* This message really ought to be max 23 lines.
2820      * Removed -h because the user already knows that option. Others? */
2821
2822     static const char * const usage_msg[] = {
2823 "-0[octal]         specify record separator (\\0, if no argument)",
2824 "-A[mod][=pattern] activate all/given assertions",
2825 "-a                autosplit mode with -n or -p (splits $_ into @F)",
2826 "-C[number/list]   enables the listed Unicode features",
2827 "-c                check syntax only (runs BEGIN and CHECK blocks)",
2828 "-d[:debugger]     run program under debugger",
2829 "-D[number/list]   set debugging flags (argument is a bit mask or alphabets)",
2830 "-e program        one line of program (several -e's allowed, omit programfile)",
2831 "-E program        like -e, but enables all optional features",
2832 "-f                don't do $sitelib/sitecustomize.pl at startup",
2833 "-F/pattern/       split() pattern for -a switch (//'s are optional)",
2834 "-i[extension]     edit <> files in place (makes backup if extension supplied)",
2835 "-Idirectory       specify @INC/#include directory (several -I's allowed)",
2836 "-l[octal]         enable line ending processing, specifies line terminator",
2837 "-[mM][-]module    execute \"use/no module...\" before executing program",
2838 "-n                assume \"while (<>) { ... }\" loop around program",
2839 "-p                assume loop like -n but print line also, like sed",
2840 "-P                run program through C preprocessor before compilation",
2841 "-s                enable rudimentary parsing for switches after programfile",
2842 "-S                look for programfile using PATH environment variable",
2843 "-t                enable tainting warnings",
2844 "-T                enable tainting checks",
2845 "-u                dump core after parsing program",
2846 "-U                allow unsafe operations",
2847 "-v                print version, subversion (includes VERY IMPORTANT perl info)",
2848 "-V[:variable]     print configuration summary (or a single Config.pm variable)",
2849 "-w                enable many useful warnings (RECOMMENDED)",
2850 "-W                enable all warnings",
2851 "-x[directory]     strip off text before #!perl line and perhaps cd to directory",
2852 "-X                disable all warnings",
2853 "\n",
2854 NULL
2855 };
2856     const char * const *p = usage_msg;
2857
2858     PerlIO_printf(PerlIO_stdout(),
2859                   "\nUsage: %s [switches] [--] [programfile] [arguments]",
2860                   name);
2861     while (*p)
2862         PerlIO_printf(PerlIO_stdout(), "\n  %s", *p++);
2863 }
2864
2865 /* convert a string of -D options (or digits) into an int.
2866  * sets *s to point to the char after the options */
2867
2868 #ifdef DEBUGGING
2869 int
2870 Perl_get_debug_opts(pTHX_ const char **s, bool givehelp)
2871 {
2872     static const char * const usage_msgd[] = {
2873       " Debugging flag values: (see also -d)",
2874       "  p  Tokenizing and parsing (with v, displays parse stack)",
2875       "  s  Stack snapshots (with v, displays all stacks)",
2876       "  l  Context (loop) stack processing",
2877       "  t  Trace execution",
2878       "  o  Method and overloading resolution",
2879       "  c  String/numeric conversions",
2880       "  P  Print profiling info, preprocessor command for -P, source file input state",
2881       "  m  Memory allocation",
2882       "  f  Format processing",
2883       "  r  Regular expression parsing and execution",
2884       "  x  Syntax tree dump",
2885       "  u  Tainting checks",
2886       "  H  Hash dump -- usurps values()",
2887       "  X  Scratchpad allocation",
2888       "  D  Cleaning up",
2889       "  S  Thread synchronization",
2890       "  T  Tokenising",
2891       "  R  Include reference counts of dumped variables (eg when using -Ds)",
2892       "  J  Do not s,t,P-debug (Jump over) opcodes within package DB",
2893       "  v  Verbose: use in conjunction with other flags",
2894       "  C  Copy On Write",
2895       "  A  Consistency checks on internal structures",
2896       "  q  quiet - currently only suppresses the 'EXECUTING' message",
2897       NULL
2898     };
2899     int i = 0;
2900     if (isALPHA(**s)) {
2901         /* if adding extra options, remember to update DEBUG_MASK */
2902         static const char debopts[] = "psltocPmfrxu HXDSTRJvCAq";
2903
2904         for (; isALNUM(**s); (*s)++) {
2905             const char * const d = strchr(debopts,**s);
2906             if (d)
2907                 i |= 1 << (d - debopts);
2908             else if (ckWARN_d(WARN_DEBUGGING))
2909                 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
2910                     "invalid option -D%c, use -D'' to see choices\n", **s);
2911         }
2912     }
2913     else if (isDIGIT(**s)) {
2914         i = atoi(*s);
2915         for (; isALNUM(**s); (*s)++) ;
2916     }
2917     else if (givehelp) {
2918       const char *const *p = usage_msgd;
2919       while (*p) PerlIO_printf(PerlIO_stdout(), "%s\n", *p++);
2920     }
2921 #  ifdef EBCDIC
2922     if ((i & DEBUG_p_FLAG) && ckWARN_d(WARN_DEBUGGING))
2923         Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
2924                 "-Dp not implemented on this platform\n");
2925 #  endif
2926     return i;
2927 }
2928 #endif
2929
2930 /* This routine handles any switches that can be given during run */
2931
2932 char *
2933 Perl_moreswitches(pTHX_ char *s)
2934 {
2935     dVAR;
2936     UV rschar;
2937
2938     switch (*s) {
2939     case '0':
2940     {
2941          I32 flags = 0;
2942          STRLEN numlen;
2943
2944          SvREFCNT_dec(PL_rs);
2945          if (s[1] == 'x' && s[2]) {
2946               const char *e = s+=2;
2947               U8 *tmps;
2948
2949               while (*e)
2950                 e++;
2951               numlen = e - s;
2952               flags = PERL_SCAN_SILENT_ILLDIGIT;
2953               rschar = (U32)grok_hex(s, &numlen, &flags, NULL);
2954               if (s + numlen < e) {
2955                    rschar = 0; /* Grandfather -0xFOO as -0 -xFOO. */
2956                    numlen = 0;
2957                    s--;
2958               }
2959               PL_rs = newSVpvn("", 0);
2960               SvGROW(PL_rs, (STRLEN)(UNISKIP(rschar) + 1));
2961               tmps = (U8*)SvPVX(PL_rs);
2962               uvchr_to_utf8(tmps, rschar);
2963               SvCUR_set(PL_rs, UNISKIP(rschar));
2964               SvUTF8_on(PL_rs);
2965          }
2966          else {
2967               numlen = 4;
2968               rschar = (U32)grok_oct(s, &numlen, &flags, NULL);
2969               if (rschar & ~((U8)~0))
2970                    PL_rs = &PL_sv_undef;
2971               else if (!rschar && numlen >= 2)
2972                    PL_rs = newSVpvn("", 0);
2973               else {
2974                    char ch = (char)rschar;
2975                    PL_rs = newSVpvn(&ch, 1);
2976               }
2977          }
2978          sv_setsv(get_sv("/", TRUE), PL_rs);
2979          return s + numlen;
2980     }
2981     case 'C':
2982         s++;
2983         PL_unicode = parse_unicode_opts( (const char **)&s );
2984         return s;
2985     case 'F':
2986         PL_minus_F = TRUE;
2987         PL_splitstr = ++s;
2988         while (*s && !isSPACE(*s)) ++s;
2989         *s = '\0';
2990         PL_splitstr = savepv(PL_splitstr);
2991         return s;
2992     case 'a':
2993         PL_minus_a = TRUE;
2994         s++;
2995         return s;
2996     case 'c':
2997         PL_minus_c = TRUE;
2998         s++;
2999         return s;
3000     case 'd':
3001         forbid_setid("-d");
3002         s++;
3003
3004         /* -dt indicates to the debugger that threads will be used */
3005         if (*s == 't' && !isALNUM(s[1])) {
3006             ++s;
3007             my_setenv("PERL5DB_THREADED", "1");
3008         }
3009
3010         /* The following permits -d:Mod to accepts arguments following an =
3011            in the fashion that -MSome::Mod does. */
3012         if (*s == ':' || *s == '=') {
3013             const char *start;
3014             SV * const sv = newSVpv("use Devel::", 0);
3015             start = ++s;
3016             /* We now allow -d:Module=Foo,Bar */
3017             while(isALNUM(*s) || *s==':') ++s;
3018             if (*s != '=')
3019                 sv_catpv(sv, start);
3020             else {
3021                 sv_catpvn(sv, start, s-start);
3022                 Perl_sv_catpvf(aTHX_ sv, " split(/,/,q%c%s%c)", 0, ++s, 0);
3023             }
3024             s += strlen(s);
3025             my_setenv("PERL5DB", SvPV_nolen_const(sv));
3026         }
3027         if (!PL_perldb) {
3028             PL_perldb = PERLDB_ALL;
3029             init_debugger();
3030         }
3031         return s;
3032     case 'D':
3033     {   
3034 #ifdef DEBUGGING
3035         forbid_setid("-D");
3036         s++;
3037         PL_debug = get_debug_opts( (const char **)&s, 1) | DEBUG_TOP_FLAG;
3038 #else /* !DEBUGGING */
3039         if (ckWARN_d(WARN_DEBUGGING))
3040             Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
3041                    "Recompile perl with -DDEBUGGING to use -D switch (did you mean -d ?)\n");
3042         for (s++; isALNUM(*s); s++) ;
3043 #endif
3044         return s;
3045     }   
3046     case 'h':
3047         usage(PL_origargv[0]);
3048         my_exit(0);
3049     case 'i':
3050         Safefree(PL_inplace);
3051 #if defined(__CYGWIN__) /* do backup extension automagically */
3052         if (*(s+1) == '\0') {
3053         PL_inplace = savepv(".bak");
3054         return s+1;
3055         }
3056 #endif /* __CYGWIN__ */
3057         PL_inplace = savepv(s+1);
3058         for (s = PL_inplace; *s && !isSPACE(*s); s++)
3059             ;
3060         if (*s) {
3061             *s++ = '\0';
3062             if (*s == '-')      /* Additional switches on #! line. */
3063                 s++;
3064         }
3065         return s;
3066     case 'I':   /* -I handled both here and in parse_body() */
3067         forbid_setid("-I");
3068         ++s;
3069         while (*s && isSPACE(*s))
3070             ++s;
3071         if (*s) {
3072             char *e, *p;
3073             p = s;
3074             /* ignore trailing spaces (possibly followed by other switches) */
3075             do {
3076                 for (e = p; *e && !isSPACE(*e); e++) ;
3077                 p = e;
3078                 while (isSPACE(*p))
3079                     p++;
3080             } while (*p && *p != '-');
3081             e = savepvn(s, e-s);
3082             incpush(e, TRUE, TRUE, FALSE, FALSE);
3083             Safefree(e);
3084             s = p;
3085             if (*s == '-')
3086                 s++;
3087         }
3088         else
3089             Perl_croak(aTHX_ "No directory specified for -I");
3090         return s;
3091     case 'l':
3092         PL_minus_l = TRUE;
3093         s++;
3094         if (PL_ors_sv) {
3095             SvREFCNT_dec(PL_ors_sv);
3096             PL_ors_sv = Nullsv;
3097         }
3098         if (isDIGIT(*s)) {
3099             I32 flags = 0;
3100             STRLEN numlen;
3101             PL_ors_sv = newSVpvn("\n",1);
3102             numlen = 3 + (*s == '0');
3103             *SvPVX(PL_ors_sv) = (char)grok_oct(s, &numlen, &flags, NULL);
3104             s += numlen;
3105         }
3106         else {
3107             if (RsPARA(PL_rs)) {
3108                 PL_ors_sv = newSVpvn("\n\n",2);
3109             }
3110             else {
3111                 PL_ors_sv = newSVsv(PL_rs);
3112             }
3113         }
3114         return s;
3115     case 'A':
3116         forbid_setid("-A");
3117         if (!PL_preambleav)
3118             PL_preambleav = newAV();
3119         s++;
3120         {
3121             char * const start = s;
3122             SV * const sv = newSVpv("use assertions::activate", 24);
3123             while(isALNUM(*s) || *s == ':') ++s;
3124             if (s != start) {
3125                 sv_catpvn(sv, "::", 2);
3126                 sv_catpvn(sv, start, s-start);
3127             }
3128             if (*s == '=') {
3129                 Perl_sv_catpvf(aTHX_ sv, " split(/,/,q%c%s%c)", 0, ++s, 0);
3130                 s+=strlen(s);
3131             }
3132             else if (*s != '\0') {
3133                 Perl_croak(aTHX_ "Can't use '%c' after -A%.*s", *s, (int)(s-start), start);
3134             }
3135             av_push(PL_preambleav, sv);
3136             return s;
3137         }
3138     case 'M':
3139         forbid_setid("-M");     /* XXX ? */
3140         /* FALL THROUGH */
3141     case 'm':
3142         forbid_setid("-m");     /* XXX ? */
3143         if (*++s) {
3144             char *start;
3145             SV *sv;
3146             const char *use = "use ";
3147             /* -M-foo == 'no foo'       */
3148             /* Leading space on " no " is deliberate, to make both
3149                possibilities the same length.  */
3150             if (*s == '-') { use = " no "; ++s; }
3151             sv = newSVpvn(use,4);
3152             start = s;
3153             /* We allow -M'Module qw(Foo Bar)'  */
3154             while(isALNUM(*s) || *s==':') ++s;
3155             if (*s != '=') {
3156                 sv_catpv(sv, start);
3157                 if (*(start-1) == 'm') {
3158                     if (*s != '\0')
3159                         Perl_croak(aTHX_ "Can't use '%c' after -mname", *s);
3160                     sv_catpv( sv, " ()");
3161                 }
3162             } else {
3163                 if (s == start)
3164                     Perl_croak(aTHX_ "Module name required with -%c option",
3165                                s[-1]);
3166                 sv_catpvn(sv, start, s-start);
3167                 sv_catpv(sv, " split(/,/,q");
3168                 sv_catpvn(sv, "\0)", 1);        /* Use NUL as q//-delimiter. */
3169                 sv_catpv(sv, ++s);
3170                 sv_catpvn(sv,  "\0)", 2);
3171             }
3172             s += strlen(s);
3173             if (!PL_preambleav)
3174                 PL_preambleav = newAV();
3175             av_push(PL_preambleav, sv);
3176         }
3177         else
3178             Perl_croak(aTHX_ "Missing argument to -%c", *(s-1));
3179         return s;
3180     case 'n':
3181         PL_minus_n = TRUE;
3182         s++;
3183         return s;
3184     case 'p':
3185         PL_minus_p = TRUE;
3186         s++;
3187         return s;
3188     case 's':
3189         forbid_setid("-s");
3190         PL_doswitches = TRUE;
3191         s++;
3192         return s;
3193     case 't':
3194         if (!PL_tainting)
3195             TOO_LATE_FOR('t');
3196         s++;
3197         return s;
3198     case 'T':
3199         if (!PL_tainting)
3200             TOO_LATE_FOR('T');
3201         s++;
3202         return s;
3203     case 'u':
3204 #ifdef MACOS_TRADITIONAL
3205         Perl_croak(aTHX_ "Believe me, you don't want to use \"-u\" on a Macintosh");
3206 #endif
3207         PL_do_undump = TRUE;
3208         s++;
3209         return s;
3210     case 'U':
3211         PL_unsafe = TRUE;
3212         s++;
3213         return s;
3214     case 'v':
3215         if (!sv_derived_from(PL_patchlevel, "version"))
3216                 (void *)upg_version(PL_patchlevel);
3217 #if !defined(DGUX)
3218         PerlIO_printf(PerlIO_stdout(),
3219                 Perl_form(aTHX_ "\nThis is perl, %"SVf" built for %s",
3220                     vstringify(PL_patchlevel),
3221                     ARCHNAME));
3222 #else /* DGUX */
3223 /* Adjust verbose output as in the perl that ships with the DG/UX OS from EMC */
3224         PerlIO_printf(PerlIO_stdout(),
3225                 Perl_form(aTHX_ "\nThis is perl, %"SVf"\n",
3226                     vstringify(PL_patchlevel)));
3227         PerlIO_printf(PerlIO_stdout(),
3228                         Perl_form(aTHX_ "        built under %s at %s %s\n",
3229                                         OSNAME, __DATE__, __TIME__));
3230         PerlIO_printf(PerlIO_stdout(),
3231                         Perl_form(aTHX_ "        OS Specific Release: %s\n",
3232                                         OSVERS));
3233 #endif /* !DGUX */
3234
3235 #if defined(LOCAL_PATCH_COUNT)
3236         if (LOCAL_PATCH_COUNT > 0)
3237             PerlIO_printf(PerlIO_stdout(),
3238                           "\n(with %d registered patch%s, "
3239                           "see perl -V for more detail)",
3240                           (int)LOCAL_PATCH_COUNT,
3241                           (LOCAL_PATCH_COUNT!=1) ? "es" : "");
3242 #endif
3243
3244         PerlIO_printf(PerlIO_stdout(),
3245                       "\n\nCopyright 1987-2005, Larry Wall\n");
3246 #ifdef MACOS_TRADITIONAL
3247         PerlIO_printf(PerlIO_stdout(),
3248                       "\nMac OS port Copyright 1991-2002, Matthias Neeracher;\n"
3249                       "maintained by Chris Nandor\n");
3250 #endif
3251 #ifdef MSDOS
3252         PerlIO_printf(PerlIO_stdout(),
3253                       "\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
3254 #endif
3255 #ifdef DJGPP
3256         PerlIO_printf(PerlIO_stdout(),
3257                       "djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n"
3258                       "djgpp v2 port (perl5004+) by Laszlo Molnar, 1997-1999\n");
3259 #endif
3260 #ifdef OS2
3261         PerlIO_printf(PerlIO_stdout(),
3262                       "\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
3263                       "Version 5 port Copyright (c) 1994-2002, Andreas Kaiser, Ilya Zakharevich\n");
3264 #endif
3265 #ifdef atarist
3266         PerlIO_printf(PerlIO_stdout(),
3267                       "atariST series port, ++jrb  bammi@cadence.com\n");
3268 #endif
3269 #ifdef __BEOS__
3270         PerlIO_printf(PerlIO_stdout(),
3271                       "BeOS port Copyright Tom Spindler, 1997-1999\n");
3272 #endif
3273 #ifdef MPE
3274         PerlIO_printf(PerlIO_stdout(),
3275                       "MPE/iX port Copyright by Mark Klein and Mark Bixby, 1996-2003\n");
3276 #endif
3277 #ifdef OEMVS
3278         PerlIO_printf(PerlIO_stdout(),
3279                       "MVS (OS390) port by Mortice Kern Systems, 1997-1999\n");
3280 #endif
3281 #ifdef __VOS__
3282         PerlIO_printf(PerlIO_stdout(),
3283                       "Stratus VOS port by Paul.Green@stratus.com, 1997-2002\n");
3284 #endif
3285 #ifdef __OPEN_VM
3286         PerlIO_printf(PerlIO_stdout(),
3287                       "VM/ESA port by Neale Ferguson, 1998-1999\n");
3288 #endif
3289 #ifdef POSIX_BC
3290         PerlIO_printf(PerlIO_stdout(),
3291                       "BS2000 (POSIX) port by Start Amadeus GmbH, 1998-1999\n");
3292 #endif
3293 #ifdef __MINT__
3294         PerlIO_printf(PerlIO_stdout(),
3295                       "MiNT port by Guido Flohr, 1997-1999\n");
3296 #endif
3297 #ifdef EPOC
3298         PerlIO_printf(PerlIO_stdout(),
3299                       "EPOC port by Olaf Flebbe, 1999-2002\n");
3300 #endif
3301 #ifdef UNDER_CE
3302         PerlIO_printf(PerlIO_stdout(),"WINCE port by Rainer Keuchel, 2001-2002\n");
3303         PerlIO_printf(PerlIO_stdout(),"Built on " __DATE__ " " __TIME__ "\n\n");
3304         wce_hitreturn();
3305 #endif
3306 #ifdef __SYMBIAN32__
3307         PerlIO_printf(PerlIO_stdout(),
3308                       "Symbian port by Nokia, 2004-2005\n");
3309 #endif
3310 #ifdef BINARY_BUILD_NOTICE
3311         BINARY_BUILD_NOTICE;
3312 #endif
3313         PerlIO_printf(PerlIO_stdout(),
3314                       "\n\
3315 Perl may be copied only under the terms of either the Artistic License or the\n\
3316 GNU General Public License, which may be found in the Perl 5 source kit.\n\n\
3317 Complete documentation for Perl, including FAQ lists, should be found on\n\
3318 this system using \"man perl\" or \"perldoc perl\".  If you have access to the\n\
3319 Internet, point your browser at http://www.perl.org/, the Perl Home Page.\n\n");
3320         my_exit(0);
3321     case 'w':
3322         if (! (PL_dowarn & G_WARN_ALL_MASK))
3323             PL_dowarn |= G_WARN_ON;
3324         s++;
3325         return s;
3326     case 'W':
3327         PL_dowarn = G_WARN_ALL_ON|G_WARN_ON;
3328         if (!specialWARN(PL_compiling.cop_warnings))
3329             SvREFCNT_dec(PL_compiling.cop_warnings);
3330         PL_compiling.cop_warnings = pWARN_ALL ;
3331         s++;
3332         return s;
3333     case 'X':
3334         PL_dowarn = G_WARN_ALL_OFF;
3335         if (!specialWARN(PL_compiling.cop_warnings))
3336             SvREFCNT_dec(PL_compiling.cop_warnings);
3337         PL_compiling.cop_warnings = pWARN_NONE ;
3338         s++;
3339         return s;
3340     case '*':
3341     case ' ':
3342         if (s[1] == '-')        /* Additional switches on #! line. */
3343             return s+2;
3344         break;
3345     case '-':
3346     case 0:
3347 #if defined(WIN32) || !defined(PERL_STRICT_CR)
3348     case '\r':
3349 #endif
3350     case '\n':
3351     case '\t':
3352         break;
3353 #ifdef ALTERNATE_SHEBANG
3354     case 'S':                   /* OS/2 needs -S on "extproc" line. */
3355         break;
3356 #endif
3357     case 'P':
3358         if (PL_preprocess)
3359             return s+1;
3360         /* FALL THROUGH */
3361     default:
3362         Perl_croak(aTHX_ "Can't emulate -%.1s on #! line",s);
3363     }
3364     return Nullch;
3365 }
3366
3367 /* compliments of Tom Christiansen */
3368
3369 /* unexec() can be found in the Gnu emacs distribution */
3370 /* Known to work with -DUNEXEC and using unexelf.c from GNU emacs-20.2 */
3371
3372 void
3373 Perl_my_unexec(pTHX)
3374 {
3375 #ifdef UNEXEC
3376     SV*    prog;
3377     SV*    file;
3378     int    status = 1;
3379     extern int etext;
3380
3381     prog = newSVpv(BIN_EXP, 0);
3382     sv_catpv(prog, "/perl");
3383     file = newSVpv(PL_origfilename, 0);
3384     sv_catpv(file, ".perldump");
3385
3386     unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
3387     /* unexec prints msg to stderr in case of failure */
3388     PerlProc_exit(status);
3389 #else
3390 #  ifdef VMS
3391 #    include <lib$routines.h>
3392      lib$signal(SS$_DEBUG);  /* ssdef.h #included from vmsish.h */
3393 #  else
3394     ABORT();            /* for use with undump */
3395 #  endif
3396 #endif
3397 }
3398
3399 /* initialize curinterp */
3400 STATIC void
3401 S_init_interp(pTHX)
3402 {
3403
3404 #ifdef MULTIPLICITY
3405 #  define PERLVAR(var,type)
3406 #  define PERLVARA(var,n,type)
3407 #  if defined(PERL_IMPLICIT_CONTEXT)
3408 #    if defined(USE_5005THREADS)
3409 #      define PERLVARI(var,type,init)           PERL_GET_INTERP->var = init;
3410 #      define PERLVARIC(var,type,init)          PERL_GET_INTERP->var = init;
3411 #    else /* !USE_5005THREADS */
3412 #      define PERLVARI(var,type,init)           aTHX->var = init;
3413 #      define PERLVARIC(var,type,init)  aTHX->var = init;
3414 #    endif /* USE_5005THREADS */
3415 #  else
3416 #    define PERLVARI(var,type,init)     PERL_GET_INTERP->var = init;
3417 #    define PERLVARIC(var,type,init)    PERL_GET_INTERP->var = init;
3418 #  endif
3419 #  include "intrpvar.h"
3420 #  ifndef USE_5005THREADS
3421 #    include "thrdvar.h"
3422 #  endif
3423 #  undef PERLVAR
3424 #  undef PERLVARA
3425 #  undef PERLVARI
3426 #  undef PERLVARIC
3427 #else
3428 #  define PERLVAR(var,type)
3429 #  define PERLVARA(var,n,type)
3430 #  define PERLVARI(var,type,init)       PL_##var = init;
3431 #  define PERLVARIC(var,type,init)      PL_##var = init;
3432 #  include "intrpvar.h"
3433 #  ifndef USE_5005THREADS
3434 #    include "thrdvar.h"
3435 #  endif
3436 #  undef PERLVAR
3437 #  undef PERLVARA
3438 #  undef PERLVARI
3439 #  undef PERLVARIC
3440 #endif
3441
3442 }
3443
3444 STATIC void
3445 S_init_main_stash(pTHX)
3446 {
3447     GV *gv;
3448
3449     PL_curstash = PL_defstash = newHV();
3450     PL_curstname = newSVpvn("main",4);
3451     gv = gv_fetchpv("main::",TRUE, SVt_PVHV);
3452     SvREFCNT_dec(GvHV(gv));
3453     GvHV(gv) = (HV*)SvREFCNT_inc(PL_defstash);
3454     SvREADONLY_on(gv);
3455     hv_name_set(PL_defstash, "main", 4, 0);
3456     PL_incgv = gv_HVadd(gv_AVadd(gv_fetchpv("INC",TRUE, SVt_PVAV)));
3457     SvREFCNT_inc(PL_incgv); /* Don't allow it to be freed */
3458     GvMULTI_on(PL_incgv);
3459     PL_hintgv = gv_fetchpv("\010",TRUE, SVt_PV); /* ^H */
3460     GvMULTI_on(PL_hintgv);
3461     PL_defgv = gv_fetchpv("_",TRUE, SVt_PVAV);
3462     SvREFCNT_inc(PL_defgv);
3463     PL_errgv = gv_HVadd(gv_fetchpv("@", TRUE, SVt_PV));
3464     SvREFCNT_inc(PL_errgv);
3465     GvMULTI_on(PL_errgv);
3466     PL_replgv = gv_fetchpv("\022", TRUE, SVt_PV); /* ^R */
3467     GvMULTI_on(PL_replgv);
3468     (void)Perl_form(aTHX_ "%240s","");  /* Preallocate temp - for immediate signals. */
3469 #ifdef PERL_DONT_CREATE_GVSV
3470     gv_SVadd(PL_errgv);
3471 #endif
3472     sv_grow(ERRSV, 240);        /* Preallocate - for immediate signals. */
3473     sv_setpvn(ERRSV, "", 0);
3474     PL_curstash = PL_defstash;
3475     CopSTASH_set(&PL_compiling, PL_defstash);
3476     PL_debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
3477     PL_globalstash = GvHV(gv_fetchpv("CORE::GLOBAL::", GV_ADDMULTI, SVt_PVHV));
3478     /* We must init $/ before switches are processed. */
3479     sv_setpvn(get_sv("/", TRUE), "\n", 1);
3480 }
3481
3482 /* PSz 18 Nov 03  fdscript now global but do not change prototype */
3483 STATIC void
3484 S_open_script(pTHX_ const char *scriptname, bool dosearch, SV *sv)
3485 {
3486 #ifndef IAMSUID
3487     const char *quote;
3488     const char *code;
3489     const char *cpp_discard_flag;
3490     const char *perl;
3491 #endif
3492     dVAR;
3493
3494     PL_fdscript = -1;
3495     PL_suidscript = -1;
3496
3497     if (PL_e_script) {
3498         PL_origfilename = savepvn("-e", 2);
3499     }
3500     else {
3501         /* if find_script() returns, it returns a malloc()-ed value */
3502         scriptname = PL_origfilename = find_script(scriptname, dosearch, NULL, 1);
3503
3504         if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
3505             const char *s = scriptname + 8;
3506             PL_fdscript = atoi(s);
3507             while (isDIGIT(*s))
3508                 s++;
3509             if (*s) {
3510                 /* PSz 18 Feb 04
3511                  * Tell apart "normal" usage of fdscript, e.g.
3512                  * with bash on FreeBSD:
3513                  *   perl <( echo '#!perl -DA'; echo 'print "$0\n"')
3514                  * from usage in suidperl.
3515                  * Does any "normal" usage leave garbage after the number???
3516                  * Is it a mistake to use a similar /dev/fd/ construct for
3517                  * suidperl?
3518                  */
3519                 PL_suidscript = 1;
3520                 /* PSz 20 Feb 04  
3521                  * Be supersafe and do some sanity-checks.
3522                  * Still, can we be sure we got the right thing?
3523                  */
3524                 if (*s != '/') {
3525                     Perl_croak(aTHX_ "Wrong syntax (suid) fd script name \"%s\"\n", s);
3526                 }
3527                 if (! *(s+1)) {
3528                     Perl_croak(aTHX_ "Missing (suid) fd script name\n");
3529                 }
3530                 scriptname = savepv(s + 1);
3531                 Safefree(PL_origfilename);
3532                 PL_origfilename = (char *)scriptname;
3533             }
3534         }
3535     }
3536
3537     CopFILE_free(PL_curcop);
3538     CopFILE_set(PL_curcop, PL_origfilename);
3539     if (*PL_origfilename == '-' && PL_origfilename[1] == '\0')
3540         scriptname = (char *)"";
3541     if (PL_fdscript >= 0) {
3542         PL_rsfp = PerlIO_fdopen(PL_fdscript,PERL_SCRIPT_MODE);
3543 #       if defined(HAS_FCNTL) && defined(F_SETFD)
3544             if (PL_rsfp)
3545                 /* ensure close-on-exec */
3546                 fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,1);
3547 #       endif
3548     }
3549 #ifdef IAMSUID
3550     else {
3551         Perl_croak(aTHX_ "sperl needs fd script\n"
3552                    "You should not call sperl directly; do you need to "
3553                    "change a #! line\nfrom sperl to perl?\n");
3554
3555 /* PSz 11 Nov 03
3556  * Do not open (or do other fancy stuff) while setuid.
3557  * Perl does the open, and hands script to suidperl on a fd;
3558  * suidperl only does some checks, sets up UIDs and re-execs
3559  * perl with that fd as it has always done.
3560  */
3561     }
3562     if (PL_suidscript != 1) {
3563         Perl_croak(aTHX_ "suidperl needs (suid) fd script\n");
3564     }
3565 #else /* IAMSUID */
3566     else if (PL_preprocess) {
3567         const char * const cpp_cfg = CPPSTDIN;
3568         SV * const cpp = newSVpvn("",0);
3569         SV * const cmd = NEWSV(0,0);
3570
3571         if (cpp_cfg[0] == 0) /* PERL_MICRO? */
3572              Perl_croak(aTHX_ "Can't run with cpp -P with CPPSTDIN undefined");
3573         if (strEQ(cpp_cfg, "cppstdin"))
3574             Perl_sv_catpvf(aTHX_ cpp, "%s/", BIN_EXP);
3575         sv_catpv(cpp, cpp_cfg);
3576
3577 #       ifndef VMS
3578             sv_catpvn(sv, "-I", 2);
3579             sv_catpv(sv,PRIVLIB_EXP);
3580 #       endif
3581
3582         DEBUG_P(PerlIO_printf(Perl_debug_log,
3583                               "PL_preprocess: scriptname=\"%s\", cpp=\"%s\", sv=\"%s\", CPPMINUS=\"%s\"\n",
3584                               scriptname, SvPVX_const (cpp), SvPVX_const (sv),
3585                               CPPMINUS));
3586
3587 #       if defined(MSDOS) || defined(WIN32) || defined(VMS)
3588             quote = "\"";
3589 #       else
3590             quote = "'";
3591 #       endif
3592
3593 #       ifdef VMS
3594             cpp_discard_flag = "";
3595 #       else
3596             cpp_discard_flag = "-C";
3597 #       endif
3598
3599 #       ifdef OS2
3600             perl = os2_execname(aTHX);
3601 #       else
3602             perl = PL_origargv[0];
3603 #       endif
3604
3605
3606         /* This strips off Perl comments which might interfere with
3607            the C pre-processor, including #!.  #line directives are
3608            deliberately stripped to avoid confusion with Perl's version
3609            of #line.  FWP played some golf with it so it will fit
3610            into VMS's 255 character buffer.
3611         */
3612         if( PL_doextract )
3613             code = "(1../^#!.*perl/i)|/^\\s*#(?!\\s*((ifn?|un)def|(el|end)?if|define|include|else|error|pragma)\\b)/||!($|=1)||print";
3614         else
3615             code = "/^\\s*#(?!\\s*((ifn?|un)def|(el|end)?if|define|include|else|error|pragma)\\b)/||!($|=1)||print";
3616
3617         Perl_sv_setpvf(aTHX_ cmd, "\
3618 %s -ne%s%s%s %s | %"SVf" %s %"SVf" %s",
3619                        perl, quote, code, quote, scriptname, cpp,
3620                        cpp_discard_flag, sv, CPPMINUS);
3621
3622         PL_doextract = FALSE;
3623
3624         DEBUG_P(PerlIO_printf(Perl_debug_log,
3625                               "PL_preprocess: cmd=\"%s\"\n",
3626                               SvPVX_const(cmd)));
3627
3628         PL_rsfp = PerlProc_popen((char *)SvPVX_const(cmd), (char *)"r");
3629         SvREFCNT_dec(cmd);
3630         SvREFCNT_dec(cpp);
3631     }
3632     else if (!*scriptname) {
3633         forbid_setid("program input from stdin");
3634         PL_rsfp = PerlIO_stdin();
3635     }
3636     else {
3637         PL_rsfp = PerlIO_open(scriptname,PERL_SCRIPT_MODE);
3638 #       if defined(HAS_FCNTL) && defined(F_SETFD)
3639             if (PL_rsfp)
3640                 /* ensure close-on-exec */
3641                 fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,1);
3642 #       endif
3643     }
3644 #endif /* IAMSUID */
3645     if (!PL_rsfp) {
3646         /* PSz 16 Sep 03  Keep neat error message */
3647         if (PL_e_script)
3648             Perl_croak(aTHX_ "Can't open "BIT_BUCKET": %s\n", Strerror(errno));
3649         else
3650             Perl_croak(aTHX_ "Can't open perl script \"%s\": %s\n",
3651                     CopFILE(PL_curcop), Strerror(errno));
3652     }
3653 }
3654
3655 /* Mention
3656  * I_SYSSTATVFS HAS_FSTATVFS
3657  * I_SYSMOUNT
3658  * I_STATFS     HAS_FSTATFS     HAS_GETFSSTAT
3659  * I_MNTENT     HAS_GETMNTENT   HAS_HASMNTOPT
3660  * here so that metaconfig picks them up. */
3661
3662 #ifdef IAMSUID
3663 STATIC int
3664 S_fd_on_nosuid_fs(pTHX_ int fd)
3665 {
3666 /* PSz 27 Feb 04
3667  * We used to do this as "plain" user (after swapping UIDs with setreuid);
3668  * but is needed also on machines without setreuid.
3669  * Seems safe enough to run as root.
3670  */
3671     int check_okay = 0; /* able to do all the required sys/libcalls */
3672     int on_nosuid  = 0; /* the fd is on a nosuid fs */
3673     /* PSz 12 Nov 03
3674      * Need to check noexec also: nosuid might not be set, the average
3675      * sysadmin would say that nosuid is irrelevant once he sets noexec.
3676      */
3677     int on_noexec  = 0; /* the fd is on a noexec fs */
3678
3679 /*
3680  * Preferred order: fstatvfs(), fstatfs(), ustat()+getmnt(), getmntent().
3681  * fstatvfs() is UNIX98.
3682  * fstatfs() is 4.3 BSD.
3683  * ustat()+getmnt() is pre-4.3 BSD.
3684  * getmntent() is O(number-of-mounted-filesystems) and can hang on
3685  * an irrelevant filesystem while trying to reach the right one.
3686  */
3687
3688 #undef FD_ON_NOSUID_CHECK_OKAY  /* found the syscalls to do the check? */
3689
3690 #   if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
3691         defined(HAS_FSTATVFS)
3692 #   define FD_ON_NOSUID_CHECK_OKAY
3693     struct statvfs stfs;
3694
3695     check_okay = fstatvfs(fd, &stfs) == 0;
3696     on_nosuid  = check_okay && (stfs.f_flag  & ST_NOSUID);
3697 #ifdef ST_NOEXEC
3698     /* ST_NOEXEC certainly absent on AIX 5.1, and doesn't seem to be documented
3699        on platforms where it is present.  */
3700     on_noexec  = check_okay && (stfs.f_flag  & ST_NOEXEC);
3701 #endif
3702 #   endif /* fstatvfs */
3703
3704 #   if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
3705         defined(PERL_MOUNT_NOSUID)      && \
3706         defined(PERL_MOUNT_NOEXEC)      && \
3707         defined(HAS_FSTATFS)            && \
3708         defined(HAS_STRUCT_STATFS)      && \
3709         defined(HAS_STRUCT_STATFS_F_FLAGS)
3710 #   define FD_ON_NOSUID_CHECK_OKAY
3711     struct statfs  stfs;
3712
3713     check_okay = fstatfs(fd, &stfs)  == 0;
3714     on_nosuid  = check_okay && (stfs.f_flags & PERL_MOUNT_NOSUID);
3715     on_noexec  = check_okay && (stfs.f_flags & PERL_MOUNT_NOEXEC);
3716 #   endif /* fstatfs */
3717
3718 #   if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
3719         defined(PERL_MOUNT_NOSUID)      && \
3720         defined(PERL_MOUNT_NOEXEC)      && \
3721         defined(HAS_FSTAT)              && \
3722         defined(HAS_USTAT)              && \
3723         defined(HAS_GETMNT)             && \
3724         defined(HAS_STRUCT_FS_DATA)     && \
3725         defined(NOSTAT_ONE)
3726 #   define FD_ON_NOSUID_CHECK_OKAY
3727     Stat_t fdst;
3728
3729     if (fstat(fd, &fdst) == 0) {
3730         struct ustat us;
3731         if (ustat(fdst.st_dev, &us) == 0) {
3732             struct fs_data fsd;
3733             /* NOSTAT_ONE here because we're not examining fields which
3734              * vary between that case and STAT_ONE. */
3735             if (getmnt((int*)0, &fsd, (int)0, NOSTAT_ONE, us.f_fname) == 0) {
3736                 size_t cmplen = sizeof(us.f_fname);
3737                 if (sizeof(fsd.fd_req.path) < cmplen)
3738                     cmplen = sizeof(fsd.fd_req.path);
3739                 if (strnEQ(fsd.fd_req.path, us.f_fname, cmplen) &&
3740                     fdst.st_dev == fsd.fd_req.dev) {
3741                     check_okay = 1;
3742                     on_nosuid = fsd.fd_req.flags & PERL_MOUNT_NOSUID;
3743                     on_noexec = fsd.fd_req.flags & PERL_MOUNT_NOEXEC;
3744                 }
3745             }
3746         }
3747     }
3748 #   endif /* fstat+ustat+getmnt */
3749
3750 #   if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
3751         defined(HAS_GETMNTENT)          && \
3752         defined(HAS_HASMNTOPT)          && \
3753         defined(MNTOPT_NOSUID)          && \
3754         defined(MNTOPT_NOEXEC)
3755 #   define FD_ON_NOSUID_CHECK_OKAY
3756     FILE                *mtab = fopen("/etc/mtab", "r");
3757     struct mntent       *entry;
3758     Stat_t              stb, fsb;
3759
3760     if (mtab && (fstat(fd, &stb) == 0)) {
3761         while (entry = getmntent(mtab)) {
3762             if (stat(entry->mnt_dir, &fsb) == 0
3763                 && fsb.st_dev == stb.st_dev)
3764             {
3765                 /* found the filesystem */
3766                 check_okay = 1;
3767                 if (hasmntopt(entry, MNTOPT_NOSUID))
3768                     on_nosuid = 1;
3769                 if (hasmntopt(entry, MNTOPT_NOEXEC))
3770                     on_noexec = 1;
3771                 break;
3772             } /* A single fs may well fail its stat(). */
3773         }
3774     }
3775     if (mtab)
3776         fclose(mtab);
3777 #   endif /* getmntent+hasmntopt */
3778
3779     if (!check_okay)
3780         Perl_croak(aTHX_ "Can't check filesystem of script \"%s\" for nosuid/noexec", PL_origfilename);
3781     if (on_nosuid)
3782         Perl_croak(aTHX_ "Setuid script \"%s\" on nosuid filesystem", PL_origfilename);
3783     if (on_noexec)
3784         Perl_croak(aTHX_ "Setuid script \"%s\" on noexec filesystem", PL_origfilename);
3785     return ((!check_okay) || on_nosuid || on_noexec);
3786 }
3787 #endif /* IAMSUID */
3788
3789 STATIC void
3790 S_validate_suid(pTHX_ const char *validarg, const char *scriptname)
3791 {
3792     dVAR;
3793 #ifdef IAMSUID
3794     /* int which; */
3795 #endif /* IAMSUID */
3796
3797     /* do we need to emulate setuid on scripts? */
3798
3799     /* This code is for those BSD systems that have setuid #! scripts disabled
3800      * in the kernel because of a security problem.  Merely defining DOSUID
3801      * in perl will not fix that problem, but if you have disabled setuid
3802      * scripts in the kernel, this will attempt to emulate setuid and setgid
3803      * on scripts that have those now-otherwise-useless bits set.  The setuid
3804      * root version must be called suidperl or sperlN.NNN.  If regular perl
3805      * discovers that it has opened a setuid script, it calls suidperl with
3806      * the same argv that it had.  If suidperl finds that the script it has
3807      * just opened is NOT setuid root, it sets the effective uid back to the
3808      * uid.  We don't just make perl setuid root because that loses the
3809      * effective uid we had before invoking perl, if it was different from the
3810      * uid.
3811      * PSz 27 Feb 04
3812      * Description/comments above do not match current workings:
3813      *   suidperl must be hardlinked to sperlN.NNN (that is what we exec);
3814      *   suidperl called with script open and name changed to /dev/fd/N/X;
3815      *   suidperl croaks if script is not setuid;
3816      *   making perl setuid would be a huge security risk (and yes, that
3817      *     would lose any euid we might have had).
3818      *
3819      * DOSUID must be defined in both perl and suidperl, and IAMSUID must
3820      * be defined in suidperl only.  suidperl must be setuid root.  The
3821      * Configure script will set this up for you if you want it.
3822      */
3823
3824 #ifdef DOSUID
3825     const char *s, *s2;
3826
3827     if (PerlLIO_fstat(PerlIO_fileno(PL_rsfp),&PL_statbuf) < 0)  /* normal stat is insecure */
3828         Perl_croak(aTHX_ "Can't stat script \"%s\"",PL_origfilename);
3829     if (PL_statbuf.st_mode & (S_ISUID|S_ISGID)) {
3830         I32 len;
3831         const char *linestr;
3832         const char *s_end;
3833
3834 #ifdef IAMSUID
3835         if (PL_fdscript < 0 || PL_suidscript != 1)
3836             Perl_croak(aTHX_ "Need (suid) fdscript in suidperl\n");     /* We already checked this */
3837         /* PSz 11 Nov 03
3838          * Since the script is opened by perl, not suidperl, some of these
3839          * checks are superfluous. Leaving them in probably does not lower
3840          * security(?!).
3841          */
3842         /* PSz 27 Feb 04
3843          * Do checks even for systems with no HAS_SETREUID.
3844          * We used to swap, then re-swap UIDs with
3845 #ifdef HAS_SETREUID
3846             if (setreuid(PL_euid,PL_uid) < 0
3847                 || PerlProc_getuid() != PL_euid || PerlProc_geteuid() != PL_uid)
3848                 Perl_croak(aTHX_ "Can't swap uid and euid");
3849 #endif
3850 #ifdef HAS_SETREUID
3851             if (setreuid(PL_uid,PL_euid) < 0
3852                 || PerlProc_getuid() != PL_uid || PerlProc_geteuid() != PL_euid)
3853                 Perl_croak(aTHX_ "Can't reswap uid and euid");
3854 #endif
3855          */
3856
3857         /* On this access check to make sure the directories are readable,
3858          * there is actually a small window that the user could use to make
3859          * filename point to an accessible directory.  So there is a faint
3860          * chance that someone could execute a setuid script down in a
3861          * non-accessible directory.  I don't know what to do about that.
3862          * But I don't think it's too important.  The manual lies when
3863          * it says access() is useful in setuid programs.
3864          * 
3865          * So, access() is pretty useless... but not harmful... do anyway.
3866          */
3867         if (PerlLIO_access(CopFILE(PL_curcop),1)) { /*double check*/
3868             Perl_croak(aTHX_ "Can't access() script\n");
3869         }
3870
3871         /* If we can swap euid and uid, then we can determine access rights
3872          * with a simple stat of the file, and then compare device and
3873          * inode to make sure we did stat() on the same file we opened.
3874          * Then we just have to make sure he or she can execute it.
3875          * 
3876          * PSz 24 Feb 04
3877          * As the script is opened by perl, not suidperl, we do not need to
3878          * care much about access rights.
3879          * 
3880          * The 'script changed' check is needed, or we can get lied to
3881          * about $0 with e.g.
3882          *  suidperl /dev/fd/4//bin/x 4<setuidscript
3883          * Without HAS_SETREUID, is it safe to stat() as root?
3884          * 
3885          * Are there any operating systems that pass /dev/fd/xxx for setuid
3886          * scripts, as suggested/described in perlsec(1)? Surely they do not
3887          * pass the script name as we do, so the "script changed" test would
3888          * fail for them... but we never get here with
3889          * SETUID_SCRIPTS_ARE_SECURE_NOW defined.
3890          * 
3891          * This is one place where we must "lie" about return status: not
3892          * say if the stat() failed. We are doing this as root, and could
3893          * be tricked into reporting existence or not of files that the
3894          * "plain" user cannot even see.
3895          */
3896         {
3897             Stat_t tmpstatbuf;
3898             if (PerlLIO_stat(CopFILE(PL_curcop),&tmpstatbuf) < 0 ||
3899                 tmpstatbuf.st_dev != PL_statbuf.st_dev ||
3900                 tmpstatbuf.st_ino != PL_statbuf.st_ino) {
3901                 Perl_croak(aTHX_ "Setuid script changed\n");
3902             }
3903
3904         }
3905         if (!cando(S_IXUSR,FALSE,&PL_statbuf))          /* can real uid exec? */
3906             Perl_croak(aTHX_ "Real UID cannot exec script\n");
3907
3908         /* PSz 27 Feb 04
3909          * We used to do this check as the "plain" user (after swapping
3910          * UIDs). But the check for nosuid and noexec filesystem is needed,
3911          * and should be done even without HAS_SETREUID. (Maybe those
3912          * operating systems do not have such mount options anyway...)
3913          * Seems safe enough to do as root.
3914          */
3915 #if !defined(NO_NOSUID_CHECK)
3916         if (fd_on_nosuid_fs(PerlIO_fileno(PL_rsfp))) {
3917             Perl_croak(aTHX_ "Setuid script on nosuid or noexec filesystem\n");
3918         }
3919 #endif
3920 #endif /* IAMSUID */
3921
3922         if (!S_ISREG(PL_statbuf.st_mode)) {
3923             Perl_croak(aTHX_ "Setuid script not plain file\n");
3924         }
3925         if (PL_statbuf.st_mode & S_IWOTH)
3926             Perl_croak(aTHX_ "Setuid/gid script is writable by world");
3927         PL_doswitches = FALSE;          /* -s is insecure in suid */
3928         /* PSz 13 Nov 03  But -s was caught elsewhere ... so unsetting it here is useless(?!) */
3929         CopLINE_inc(PL_curcop);
3930         linestr = SvPV_nolen_const(PL_linestr);
3931         if (sv_gets(PL_linestr, PL_rsfp, 0) == Nullch ||
3932           strnNE(linestr,"#!",2) )      /* required even on Sys V */
3933             Perl_croak(aTHX_ "No #! line");
3934         linestr+=2;
3935         s = linestr;
3936         /* PSz 27 Feb 04 */
3937         /* Sanity check on line length */
3938         s_end = s + strlen(s);
3939         if (s_end == s || (s_end - s) > 4000)
3940             Perl_croak(aTHX_ "Very long #! line");
3941         /* Allow more than a single space after #! */
3942         while (isSPACE(*s)) s++;
3943         /* Sanity check on buffer end */
3944         while ((*s) && !isSPACE(*s)) s++;
3945         for (s2 = s;  (s2 > linestr &&
3946                        (isDIGIT(s2[-1]) || s2[-1] == '.' || s2[-1] == '_'
3947                         || s2[-1] == '-'));  s2--) ;
3948         /* Sanity check on buffer start */
3949         if ( (s2-4 < linestr || strnNE(s2-4,"perl",4)) &&
3950               (s-9 < linestr || strnNE(s-9,"perl",4)) )
3951             Perl_croak(aTHX_ "Not a perl script");
3952         while (*s == ' ' || *s == '\t') s++;
3953         /*
3954          * #! arg must be what we saw above.  They can invoke it by
3955          * mentioning suidperl explicitly, but they may not add any strange
3956          * arguments beyond what #! says if they do invoke suidperl that way.
3957          */
3958         /*
3959          * The way validarg was set up, we rely on the kernel to start
3960          * scripts with argv[1] set to contain all #! line switches (the
3961          * whole line).
3962          */
3963         /*
3964          * Check that we got all the arguments listed in the #! line (not
3965          * just that there are no extraneous arguments). Might not matter
3966          * much, as switches from #! line seem to be acted upon (also), and
3967          * so may be checked and trapped in perl. But, security checks must
3968          * be done in suidperl and not deferred to perl. Note that suidperl
3969          * does not get around to parsing (and checking) the switches on
3970          * the #! line (but execs perl sooner).
3971          * Allow (require) a trailing newline (which may be of two
3972          * characters on some architectures?) (but no other trailing
3973          * whitespace).
3974          */
3975         len = strlen(validarg);
3976         if (strEQ(validarg," PHOOEY ") ||
3977             strnNE(s,validarg,len) || !isSPACE(s[len]) ||
3978             !((s_end - s) == len+1
3979               || ((s_end - s) == len+2 && isSPACE(s[len+1]))))
3980             Perl_croak(aTHX_ "Args must match #! line");
3981
3982 #ifndef IAMSUID
3983         if (PL_fdscript < 0 &&
3984             PL_euid != PL_uid && (PL_statbuf.st_mode & S_ISUID) &&
3985             PL_euid == PL_statbuf.st_uid)
3986             if (!PL_do_undump)
3987                 Perl_croak(aTHX_ "YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
3988 FIX YOUR KERNEL, OR PUT A C WRAPPER AROUND THIS SCRIPT!\n");
3989 #endif /* IAMSUID */
3990
3991         if (PL_fdscript < 0 &&
3992             PL_euid) {  /* oops, we're not the setuid root perl */
3993             /* PSz 18 Feb 04
3994              * When root runs a setuid script, we do not go through the same
3995              * steps of execing sperl and then perl with fd scripts, but
3996              * simply set up UIDs within the same perl invocation; so do
3997              * not have the same checks (on options, whatever) that we have
3998              * for plain users. No problem really: would have to be a script
3999              * that does not actually work for plain users; and if root is
4000              * foolish and can be persuaded to run such an unsafe script, he
4001              * might run also non-setuid ones, and deserves what he gets.
4002              * 
4003              * Or, we might drop the PL_euid check above (and rely just on
4004              * PL_fdscript to avoid loops), and do the execs
4005              * even for root.
4006              */
4007 #ifndef IAMSUID
4008             int which;
4009             /* PSz 11 Nov 03
4010              * Pass fd script to suidperl.
4011              * Exec suidperl, substituting fd script for scriptname.
4012              * Pass script name as "subdir" of fd, which perl will grok;
4013              * in fact will use that to distinguish this from "normal"
4014              * usage, see comments above.
4015              */
4016             PerlIO_rewind(PL_rsfp);
4017             PerlLIO_lseek(PerlIO_fileno(PL_rsfp),(Off_t)0,0);  /* just in case rewind didn't */
4018             /* PSz 27 Feb 04  Sanity checks on scriptname */
4019             if ((!scriptname) || (!*scriptname) ) {
4020                 Perl_croak(aTHX_ "No setuid script name\n");
4021             }
4022             if (*scriptname == '-') {
4023                 Perl_croak(aTHX_ "Setuid script name may not begin with dash\n");
4024                 /* Or we might confuse it with an option when replacing
4025                  * name in argument list, below (though we do pointer, not
4026                  * string, comparisons).
4027                  */
4028             }
4029             for (which = 1; PL_origargv[which] && PL_origargv[which] != scriptname; which++) ;
4030             if (!PL_origargv[which]) {
4031                 Perl_croak(aTHX_ "Can't change argv to have fd script\n");
4032             }
4033             PL_origargv[which] = savepv(Perl_form(aTHX_ "/dev/fd/%d/%s",
4034                                           PerlIO_fileno(PL_rsfp), PL_origargv[which]));
4035 #if defined(HAS_FCNTL) && defined(F_SETFD)
4036             fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,0);    /* ensure no close-on-exec */
4037 #endif
4038             PERL_FPU_PRE_EXEC
4039             PerlProc_execv(Perl_form(aTHX_ "%s/sperl"PERL_FS_VER_FMT, BIN_EXP,
4040                                      (int)PERL_REVISION, (int)PERL_VERSION,
4041                                      (int)PERL_SUBVERSION), PL_origargv);
4042             PERL_FPU_POST_EXEC
4043 #endif /* IAMSUID */
4044             Perl_croak(aTHX_ "Can't do setuid (cannot exec sperl)\n");
4045         }
4046
4047         if (PL_statbuf.st_mode & S_ISGID && PL_statbuf.st_gid != PL_egid) {
4048 /* PSz 26 Feb 04
4049  * This seems back to front: we try HAS_SETEGID first; if not available
4050  * then try HAS_SETREGID; as a last chance we try HAS_SETRESGID. May be OK
4051  * in the sense that we only want to set EGID; but are there any machines
4052  * with either of the latter, but not the former? Same with UID, later.
4053  */
4054 #ifdef HAS_SETEGID
4055             (void)setegid(PL_statbuf.st_gid);
4056 #else
4057 #ifdef HAS_SETREGID
4058            (void)setregid((Gid_t)-1,PL_statbuf.st_gid);
4059 #else
4060 #ifdef HAS_SETRESGID
4061            (void)setresgid((Gid_t)-1,PL_statbuf.st_gid,(Gid_t)-1);
4062 #else
4063             PerlProc_setgid(PL_statbuf.st_gid);
4064 #endif
4065 #endif
4066 #endif
4067             if (PerlProc_getegid() != PL_statbuf.st_gid)
4068                 Perl_croak(aTHX_ "Can't do setegid!\n");
4069         }
4070         if (PL_statbuf.st_mode & S_ISUID) {
4071             if (PL_statbuf.st_uid != PL_euid)
4072 #ifdef HAS_SETEUID
4073                 (void)seteuid(PL_statbuf.st_uid);       /* all that for this */
4074 #else
4075 #ifdef HAS_SETREUID
4076                 (void)setreuid((Uid_t)-1,PL_statbuf.st_uid);
4077 #else
4078 #ifdef HAS_SETRESUID
4079                 (void)setresuid((Uid_t)-1,PL_statbuf.st_uid,(Uid_t)-1);
4080 #else
4081                 PerlProc_setuid(PL_statbuf.st_uid);
4082 #endif
4083 #endif
4084 #endif
4085             if (PerlProc_geteuid() != PL_statbuf.st_uid)
4086                 Perl_croak(aTHX_ "Can't do seteuid!\n");
4087         }
4088         else if (PL_uid) {                      /* oops, mustn't run as root */
4089 #ifdef HAS_SETEUID
4090           (void)seteuid((Uid_t)PL_uid);
4091 #else
4092 #ifdef HAS_SETREUID
4093           (void)setreuid((Uid_t)-1,(Uid_t)PL_uid);
4094 #else
4095 #ifdef HAS_SETRESUID
4096           (void)setresuid((Uid_t)-1,(Uid_t)PL_uid,(Uid_t)-1);
4097 #else
4098           PerlProc_setuid((Uid_t)PL_uid);
4099 #endif
4100 #endif
4101 #endif
4102             if (PerlProc_geteuid() != PL_uid)
4103                 Perl_croak(aTHX_ "Can't do seteuid!\n");
4104         }
4105         init_ids();
4106         if (!cando(S_IXUSR,TRUE,&PL_statbuf))
4107             Perl_croak(aTHX_ "Effective UID cannot exec script\n");     /* they can't do this */
4108     }
4109 #ifdef IAMSUID
4110     else if (PL_preprocess)     /* PSz 13 Nov 03  Caught elsewhere, useless(?!) here */
4111         Perl_croak(aTHX_ "-P not allowed for setuid/setgid script\n");
4112     else if (PL_fdscript < 0 || PL_suidscript != 1)
4113         /* PSz 13 Nov 03  Caught elsewhere, useless(?!) here */
4114         Perl_croak(aTHX_ "(suid) fdscript needed in suidperl\n");
4115     else {
4116 /* PSz 16 Sep 03  Keep neat error message */
4117         Perl_croak(aTHX_ "Script is not setuid/setgid in suidperl\n");
4118     }
4119
4120     /* We absolutely must clear out any saved ids here, so we */
4121     /* exec the real perl, substituting fd script for scriptname. */
4122     /* (We pass script name as "subdir" of fd, which perl will grok.) */
4123     /* 
4124      * It might be thought that using setresgid and/or setresuid (changed to
4125      * set the saved IDs) above might obviate the need to exec, and we could
4126      * go on to "do the perl thing".
4127      * 
4128      * Is there such a thing as "saved GID", and is that set for setuid (but
4129      * not setgid) execution like suidperl? Without exec, it would not be
4130      * cleared for setuid (but not setgid) scripts (or might need a dummy
4131      * setresgid).
4132      * 
4133      * We need suidperl to do the exact same argument checking that perl
4134      * does. Thus it cannot be very small; while it could be significantly
4135      * smaller, it is safer (simpler?) to make it essentially the same
4136      * binary as perl (but they are not identical). - Maybe could defer that
4137      * check to the invoked perl, and suidperl be a tiny wrapper instead;
4138      * but prefer to do thorough checks in suidperl itself. Such deferral
4139      * would make suidperl security rely on perl, a design no-no.
4140      * 
4141      * Setuid things should be short and simple, thus easy to understand and
4142      * verify. They should do their "own thing", without influence by
4143      * attackers. It may help if their internal execution flow is fixed,
4144      * regardless of platform: it may be best to exec anyway.
4145      * 
4146      * Suidperl should at least be conceptually simple: a wrapper only,
4147      * never to do any real perl. Maybe we should put
4148      * #ifdef IAMSUID
4149      *         Perl_croak(aTHX_ "Suidperl should never do real perl\n");
4150      * #endif
4151      * into the perly bits.
4152      */
4153     PerlIO_rewind(PL_rsfp);
4154     PerlLIO_lseek(PerlIO_fileno(PL_rsfp),(Off_t)0,0);  /* just in case rewind didn't */
4155     /* PSz 11 Nov 03
4156      * Keep original arguments: suidperl already has fd script.
4157      */
4158 /*  for (which = 1; PL_origargv[which] && PL_origargv[which] != scriptname; which++) ;  */
4159 /*  if (!PL_origargv[which]) {                                          */
4160 /*      errno = EPERM;                                                  */
4161 /*      Perl_croak(aTHX_ "Permission denied\n");                        */
4162 /*  }                                                                   */
4163 /*  PL_origargv[which] = savepv(Perl_form(aTHX_ "/dev/fd/%d/%s",        */
4164 /*                                PerlIO_fileno(PL_rsfp), PL_origargv[which])); */
4165 #if defined(HAS_FCNTL) && defined(F_SETFD)
4166     fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,0);    /* ensure no close-on-exec */
4167 #endif
4168     PERL_FPU_PRE_EXEC
4169     PerlProc_execv(Perl_form(aTHX_ "%s/perl"PERL_FS_VER_FMT, BIN_EXP,
4170                              (int)PERL_REVISION, (int)PERL_VERSION,
4171                              (int)PERL_SUBVERSION), PL_origargv);/* try again */
4172     PERL_FPU_POST_EXEC
4173     Perl_croak(aTHX_ "Can't do setuid (suidperl cannot exec perl)\n");
4174 #endif /* IAMSUID */
4175 #else /* !DOSUID */
4176     if (PL_euid != PL_uid || PL_egid != PL_gid) {       /* (suidperl doesn't exist, in fact) */
4177 #ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
4178         PerlLIO_fstat(PerlIO_fileno(PL_rsfp),&PL_statbuf);      /* may be either wrapped or real suid */
4179         if ((PL_euid != PL_uid && PL_euid == PL_statbuf.st_uid && PL_statbuf.st_mode & S_ISUID)
4180             ||
4181             (PL_egid != PL_gid && PL_egid == PL_statbuf.st_gid && PL_statbuf.st_mode & S_ISGID)
4182            )
4183             if (!PL_do_undump)
4184                 Perl_croak(aTHX_ "YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
4185 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
4186 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
4187         /* not set-id, must be wrapped */
4188     }
4189 #endif /* DOSUID */
4190     (void)validarg;
4191     (void)scriptname;
4192 }
4193
4194 STATIC void
4195 S_find_beginning(pTHX)
4196 {
4197     register char *s;
4198     register const char *s2;
4199 #ifdef MACOS_TRADITIONAL
4200     int maclines = 0;
4201 #endif
4202
4203     /* skip forward in input to the real script? */
4204
4205     forbid_setid("-x");
4206 #ifdef MACOS_TRADITIONAL
4207     /* Since the Mac OS does not honor #! arguments for us, we do it ourselves */
4208
4209     while (PL_doextract || gMacPerl_AlwaysExtract) {
4210         if ((s = sv_gets(PL_linestr, PL_rsfp, 0)) == Nullch) {
4211             if (!gMacPerl_AlwaysExtract)
4212                 Perl_croak(aTHX_ "No Perl script found in input\n");
4213
4214             if (PL_doextract)                   /* require explicit override ? */
4215                 if (!OverrideExtract(PL_origfilename))
4216                     Perl_croak(aTHX_ "User aborted script\n");
4217                 else
4218                     PL_doextract = FALSE;
4219
4220             /* Pater peccavi, file does not have #! */
4221             PerlIO_rewind(PL_rsfp);
4222
4223             break;
4224         }
4225 #else
4226     while (PL_doextract) {
4227         if ((s = sv_gets(PL_linestr, PL_rsfp, 0)) == Nullch)
4228             Perl_croak(aTHX_ "No Perl script found in input\n");
4229 #endif
4230         s2 = s;
4231         if (*s == '#' && s[1] == '!' && ((s = instr(s,"perl")) || (s = instr(s2,"PERL")))) {
4232             PerlIO_ungetc(PL_rsfp, '\n');               /* to keep line count right */
4233             PL_doextract = FALSE;
4234             while (*s && !(isSPACE (*s) || *s == '#')) s++;
4235             s2 = s;
4236             while (*s == ' ' || *s == '\t') s++;
4237             if (*s++ == '-') {
4238                 while (isDIGIT(s2[-1]) || s2[-1] == '-' || s2[-1] == '.'
4239                        || s2[-1] == '_') s2--;
4240                 if (strnEQ(s2-4,"perl",4))
4241                     while ((s = moreswitches(s)))
4242                         ;
4243             }
4244 #ifdef MACOS_TRADITIONAL
4245             /* We are always searching for the #!perl line in MacPerl,
4246              * so if we find it, still keep the line count correct
4247              * by counting lines we already skipped over
4248              */
4249             for (; maclines > 0 ; maclines--)
4250                 PerlIO_ungetc(PL_rsfp, '\n');
4251
4252             break;
4253
4254         /* gMacPerl_AlwaysExtract is false in MPW tool */
4255         } else if (gMacPerl_AlwaysExtract) {
4256             ++maclines;
4257 #endif
4258         }
4259     }
4260 }
4261
4262
4263 STATIC void
4264 S_init_ids(pTHX)
4265 {
4266     PL_uid = PerlProc_getuid();
4267     PL_euid = PerlProc_geteuid();
4268     PL_gid = PerlProc_getgid();
4269     PL_egid = PerlProc_getegid();
4270 #ifdef VMS
4271     PL_uid |= PL_gid << 16;
4272     PL_euid |= PL_egid << 16;
4273 #endif
4274     /* Should not happen: */
4275     CHECK_MALLOC_TAINT(PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
4276     PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
4277     /* BUG */
4278     /* PSz 27 Feb 04
4279      * Should go by suidscript, not uid!=euid: why disallow
4280      * system("ls") in scripts run from setuid things?
4281      * Or, is this run before we check arguments and set suidscript?
4282      * What about SETUID_SCRIPTS_ARE_SECURE_NOW: could we use fdscript then?
4283      * (We never have suidscript, can we be sure to have fdscript?)
4284      * Or must then go by UID checks? See comments in forbid_setid also.
4285      */
4286 }
4287
4288 /* This is used very early in the lifetime of the program,
4289  * before even the options are parsed, so PL_tainting has
4290  * not been initialized properly.  */
4291 bool
4292 Perl_doing_taint(int argc, char *argv[], char *envp[])
4293 {
4294 #ifndef PERL_IMPLICIT_SYS
4295     /* If we have PERL_IMPLICIT_SYS we can't call getuid() et alia
4296      * before we have an interpreter-- and the whole point of this
4297      * function is to be called at such an early stage.  If you are on
4298      * a system with PERL_IMPLICIT_SYS but you do have a concept of
4299      * "tainted because running with altered effective ids', you'll
4300      * have to add your own checks somewhere in here.  The two most
4301      * known samples of 'implicitness' are Win32 and NetWare, neither
4302      * of which has much of concept of 'uids'. */
4303     int uid  = PerlProc_getuid();
4304     int euid = PerlProc_geteuid();
4305     int gid  = PerlProc_getgid();
4306     int egid = PerlProc_getegid();
4307     (void)envp;
4308
4309 #ifdef VMS
4310     uid  |=  gid << 16;
4311     euid |= egid << 16;
4312 #endif
4313     if (uid && (euid != uid || egid != gid))
4314         return 1;
4315 #endif /* !PERL_IMPLICIT_SYS */
4316     /* This is a really primitive check; environment gets ignored only
4317      * if -T are the first chars together; otherwise one gets
4318      *  "Too late" message. */
4319     if ( argc > 1 && argv[1][0] == '-'
4320          && (argv[1][1] == 't' || argv[1][1] == 'T') )
4321         return 1;
4322     return 0;
4323 }
4324
4325 STATIC void
4326 S_forbid_setid(pTHX_ const char *s)
4327 {
4328 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
4329     if (PL_euid != PL_uid)
4330         Perl_croak(aTHX_ "No %s allowed while running setuid", s);
4331     if (PL_egid != PL_gid)
4332         Perl_croak(aTHX_ "No %s allowed while running setgid", s);
4333 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
4334     /* PSz 29 Feb 04
4335      * Checks for UID/GID above "wrong": why disallow
4336      *   perl -e 'print "Hello\n"'
4337      * from within setuid things?? Simply drop them: replaced by
4338      * fdscript/suidscript and #ifdef IAMSUID checks below.
4339      * 
4340      * This may be too late for command-line switches. Will catch those on
4341      * the #! line, after finding the script name and setting up
4342      * fdscript/suidscript. Note that suidperl does not get around to
4343      * parsing (and checking) the switches on the #! line, but checks that
4344      * the two sets are identical.
4345      * 
4346      * With SETUID_SCRIPTS_ARE_SECURE_NOW, could we use fdscript, also or
4347      * instead, or would that be "too late"? (We never have suidscript, can
4348      * we be sure to have fdscript?)
4349      * 
4350      * Catch things with suidscript (in descendant of suidperl), even with
4351      * right UID/GID. Was already checked in suidperl, with #ifdef IAMSUID,
4352      * below; but I am paranoid.
4353      * 
4354      * Also see comments about root running a setuid script, elsewhere.
4355      */
4356     if (PL_suidscript >= 0)
4357         Perl_croak(aTHX_ "No %s allowed with (suid) fdscript", s);
4358 #ifdef IAMSUID
4359     /* PSz 11 Nov 03  Catch it in suidperl, always! */
4360     Perl_croak(aTHX_ "No %s allowed in suidperl", s);
4361 #endif /* IAMSUID */
4362 }
4363
4364 void
4365 Perl_init_debugger(pTHX)
4366 {
4367     HV * const ostash = PL_curstash;
4368
4369     PL_curstash = PL_debstash;
4370     PL_dbargs = GvAV(gv_AVadd((gv_fetchpv("DB::args", GV_ADDMULTI, SVt_PVAV))));
4371     AvREAL_off(PL_dbargs);
4372     PL_DBgv = gv_fetchpv("DB::DB", GV_ADDMULTI, SVt_PVGV);
4373     PL_DBline = gv_fetchpv("DB::dbline", GV_ADDMULTI, SVt_PVAV);
4374     PL_DBsub = gv_HVadd(gv_fetchpv("DB::sub", GV_ADDMULTI, SVt_PVHV));
4375     PL_DBsingle = GvSV((gv_fetchpv("DB::single", GV_ADDMULTI, SVt_PV)));
4376     sv_setiv(PL_DBsingle, 0);
4377     PL_DBtrace = GvSV((gv_fetchpv("DB::trace", GV_ADDMULTI, SVt_PV)));
4378     sv_setiv(PL_DBtrace, 0);
4379     PL_DBsignal = GvSV((gv_fetchpv("DB::signal", GV_ADDMULTI, SVt_PV)));
4380     sv_setiv(PL_DBsignal, 0);
4381     PL_DBassertion = GvSV((gv_fetchpv("DB::assertion", GV_ADDMULTI, SVt_PV)));
4382     sv_setiv(PL_DBassertion, 0);
4383     PL_curstash = ostash;
4384 }
4385
4386 #ifndef STRESS_REALLOC
4387 #define REASONABLE(size) (size)
4388 #else
4389 #define REASONABLE(size) (1) /* unreasonable */
4390 #endif
4391
4392 void
4393 Perl_init_stacks(pTHX)
4394 {
4395     /* start with 128-item stack and 8K cxstack */
4396     PL_curstackinfo = new_stackinfo(REASONABLE(128),
4397                                  REASONABLE(8192/sizeof(PERL_CONTEXT) - 1));
4398     PL_curstackinfo->si_type = PERLSI_MAIN;
4399     PL_curstack = PL_curstackinfo->si_stack;
4400     PL_mainstack = PL_curstack;         /* remember in case we switch stacks */
4401
4402     PL_stack_base = AvARRAY(PL_curstack);
4403     PL_stack_sp = PL_stack_base;
4404     PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
4405
4406     Newx(PL_tmps_stack,REASONABLE(128),SV*);
4407     PL_tmps_floor = -1;
4408     PL_tmps_ix = -1;
4409     PL_tmps_max = REASONABLE(128);
4410
4411     Newx(PL_markstack,REASONABLE(32),I32);
4412     PL_markstack_ptr = PL_markstack;
4413     PL_markstack_max = PL_markstack + REASONABLE(32);
4414
4415     SET_MARK_OFFSET;
4416
4417     Newx(PL_scopestack,REASONABLE(32),I32);
4418     PL_scopestack_ix = 0;
4419     PL_scopestack_max = REASONABLE(32);
4420
4421     Newx(PL_savestack,REASONABLE(128),ANY);
4422     PL_savestack_ix = 0;
4423     PL_savestack_max = REASONABLE(128);
4424 }
4425
4426 #undef REASONABLE
4427
4428 STATIC void
4429 S_nuke_stacks(pTHX)
4430 {
4431     while (PL_curstackinfo->si_next)
4432         PL_curstackinfo = PL_curstackinfo->si_next;
4433     while (PL_curstackinfo) {
4434         PERL_SI *p = PL_curstackinfo->si_prev;
4435         /* curstackinfo->si_stack got nuked by sv_free_arenas() */
4436         Safefree(PL_curstackinfo->si_cxstack);
4437         Safefree(PL_curstackinfo);
4438         PL_curstackinfo = p;
4439     }
4440     Safefree(PL_tmps_stack);
4441     Safefree(PL_markstack);
4442     Safefree(PL_scopestack);
4443     Safefree(PL_savestack);
4444 }
4445
4446 STATIC void
4447 S_init_lexer(pTHX)
4448 {
4449     PerlIO *tmpfp;
4450     tmpfp = PL_rsfp;
4451     PL_rsfp = Nullfp;
4452     lex_start(PL_linestr);
4453     PL_rsfp = tmpfp;
4454     PL_subname = newSVpvn("main",4);
4455 }
4456
4457 STATIC void
4458 S_init_predump_symbols(pTHX)
4459 {
4460     GV *tmpgv;
4461     IO *io;
4462
4463     sv_setpvn(get_sv("\"", TRUE), " ", 1);
4464     PL_stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
4465     GvMULTI_on(PL_stdingv);
4466     io = GvIOp(PL_stdingv);
4467     IoTYPE(io) = IoTYPE_RDONLY;
4468     IoIFP(io) = PerlIO_stdin();
4469     tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
4470     GvMULTI_on(tmpgv);
4471     GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
4472
4473     tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
4474     GvMULTI_on(tmpgv);
4475     io = GvIOp(tmpgv);
4476     IoTYPE(io) = IoTYPE_WRONLY;
4477     IoOFP(io) = IoIFP(io) = PerlIO_stdout();
4478     setdefout(tmpgv);
4479     tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
4480     GvMULTI_on(tmpgv);
4481     GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
4482
4483     PL_stderrgv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
4484     GvMULTI_on(PL_stderrgv);
4485     io = GvIOp(PL_stderrgv);
4486     IoTYPE(io) = IoTYPE_WRONLY;
4487     IoOFP(io) = IoIFP(io) = PerlIO_stderr();
4488     tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
4489     GvMULTI_on(tmpgv);
4490     GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
4491
4492     PL_statname = NEWSV(66,0);          /* last filename we did stat on */
4493
4494     Safefree(PL_osname);
4495     PL_osname = savepv(OSNAME);
4496 }
4497
4498 void
4499 Perl_init_argv_symbols(pTHX_ register int argc, register char **argv)
4500 {
4501     argc--,argv++;      /* skip name of script */
4502     if (PL_doswitches) {
4503         for (; argc > 0 && **argv == '-'; argc--,argv++) {
4504             char *s;
4505             if (!argv[0][1])
4506                 break;
4507             if (argv[0][1] == '-' && !argv[0][2]) {
4508                 argc--,argv++;
4509                 break;
4510             }
4511             if ((s = strchr(argv[0], '='))) {
4512                 *s++ = '\0';
4513                 sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),s);
4514             }
4515             else
4516                 sv_setiv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),1);
4517         }
4518     }
4519     if ((PL_argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV))) {
4520         GvMULTI_on(PL_argvgv);
4521         (void)gv_AVadd(PL_argvgv);
4522         av_clear(GvAVn(PL_argvgv));
4523         for (; argc > 0; argc--,argv++) {
4524             SV * const sv = newSVpv(argv[0],0);
4525             av_push(GvAVn(PL_argvgv),sv);
4526             if (!(PL_unicode & PERL_UNICODE_LOCALE_FLAG) || PL_utf8locale) {
4527                  if (PL_unicode & PERL_UNICODE_ARGV_FLAG)
4528                       SvUTF8_on(sv);
4529             }
4530             if (PL_unicode & PERL_UNICODE_WIDESYSCALLS_FLAG) /* Sarathy? */
4531                  (void)sv_utf8_decode(sv);
4532         }
4533     }
4534 }
4535
4536 STATIC void
4537 S_init_postdump_symbols(pTHX_ register int argc, register char **argv, register char **env)
4538 {
4539     dVAR;
4540     GV* tmpgv;
4541
4542     PL_toptarget = NEWSV(0,0);
4543     sv_upgrade(PL_toptarget, SVt_PVFM);
4544     sv_setpvn(PL_toptarget, "", 0);
4545     PL_bodytarget = NEWSV(0,0);
4546     sv_upgrade(PL_bodytarget, SVt_PVFM);
4547     sv_setpvn(PL_bodytarget, "", 0);
4548     PL_formtarget = PL_bodytarget;
4549
4550     TAINT;
4551
4552     init_argv_symbols(argc,argv);
4553
4554     if ((tmpgv = gv_fetchpv("0",TRUE, SVt_PV))) {
4555 #ifdef MACOS_TRADITIONAL
4556         /* $0 is not majick on a Mac */
4557         sv_setpv(GvSV(tmpgv),MacPerl_MPWFileName(PL_origfilename));
4558 #else
4559         sv_setpv(GvSV(tmpgv),PL_origfilename);
4560         magicname("0", "0", 1);
4561 #endif
4562     }
4563     if ((PL_envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV))) {
4564         HV *hv;
4565         GvMULTI_on(PL_envgv);
4566         hv = GvHVn(PL_envgv);
4567         hv_magic(hv, Nullgv, PERL_MAGIC_env);
4568 #ifndef PERL_MICRO
4569 #ifdef USE_ENVIRON_ARRAY
4570         /* Note that if the supplied env parameter is actually a copy
4571            of the global environ then it may now point to free'd memory
4572            if the environment has been modified since. To avoid this
4573            problem we treat env==NULL as meaning 'use the default'
4574         */
4575         if (!env)
4576             env = environ;
4577         if (env != environ
4578 #  ifdef USE_ITHREADS
4579             && PL_curinterp == aTHX
4580 #  endif
4581            )
4582         {
4583             environ[0] = Nullch;
4584         }
4585         if (env) {
4586           char** origenv = environ;
4587           char *s;
4588           SV *sv;
4589           for (; *env; env++) {
4590             if (!(s = strchr(*env,'=')) || s == *env)
4591                 continue;
4592 #if defined(MSDOS) && !defined(DJGPP)
4593             *s = '\0';
4594             (void)strupr(*env);
4595             *s = '=';
4596 #endif
4597             sv = newSVpv(s+1, 0);
4598             (void)hv_store(hv, *env, s - *env, sv, 0);
4599             if (env != environ)
4600                 mg_set(sv);
4601             if (origenv != environ) {
4602               /* realloc has shifted us */
4603               env = (env - origenv) + environ;
4604               origenv = environ;
4605             }
4606           }
4607       }
4608 #endif /* USE_ENVIRON_ARRAY */
4609 #endif /* !PERL_MICRO */
4610     }
4611     TAINT_NOT;
4612     if ((tmpgv = gv_fetchpv("$",TRUE, SVt_PV))) {
4613         SvREADONLY_off(GvSV(tmpgv));
4614         sv_setiv(GvSV(tmpgv), (IV)PerlProc_getpid());
4615         SvREADONLY_on(GvSV(tmpgv));
4616     }
4617 #ifdef THREADS_HAVE_PIDS
4618     PL_ppid = (IV)getppid();
4619 #endif
4620
4621     /* touch @F array to prevent spurious warnings 20020415 MJD */
4622     if (PL_minus_a) {
4623       (void) get_av("main::F", TRUE | GV_ADDMULTI);
4624     }
4625     /* touch @- and @+ arrays to prevent spurious warnings 20020415 MJD */
4626     (void) get_av("main::-", TRUE | GV_ADDMULTI);
4627     (void) get_av("main::+", TRUE | GV_ADDMULTI);
4628 }
4629
4630 STATIC void
4631 S_init_perllib(pTHX)
4632 {
4633     char *s;
4634     if (!PL_tainting) {
4635 #ifndef VMS
4636         s = PerlEnv_getenv("PERL5LIB");
4637 /*
4638  * It isn't possible to delete an environment variable with
4639  * PERL_USE_SAFE_PUTENV set unless unsetenv() is also available, so in that
4640  * case we treat PERL5LIB as undefined if it has a zero-length value.
4641  */
4642 #if defined(PERL_USE_SAFE_PUTENV) && ! defined(HAS_UNSETENV)
4643         if (s && *s != '\0')
4644 #else
4645         if (s)
4646 #endif
4647             incpush(s, TRUE, TRUE, TRUE, FALSE);
4648         else
4649             incpush(PerlEnv_getenv("PERLLIB"), FALSE, FALSE, TRUE, FALSE);
4650 #else /* VMS */
4651         /* Treat PERL5?LIB as a possible search list logical name -- the
4652          * "natural" VMS idiom for a Unix path string.  We allow each
4653          * element to be a set of |-separated directories for compatibility.
4654          */
4655         char buf[256];
4656         int idx = 0;
4657         if (my_trnlnm("PERL5LIB",buf,0))
4658             do { incpush(buf,TRUE,TRUE,TRUE,FALSE); } while (my_trnlnm("PERL5LIB",buf,++idx));
4659         else
4660             while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE,FALSE,TRUE,FALSE);
4661 #endif /* VMS */
4662     }
4663
4664 /* Use the ~-expanded versions of APPLLIB (undocumented),
4665     ARCHLIB PRIVLIB SITEARCH SITELIB VENDORARCH and VENDORLIB
4666 */
4667 #ifdef APPLLIB_EXP
4668     incpush(APPLLIB_EXP, TRUE, TRUE, TRUE, TRUE);
4669 #endif
4670
4671 #ifdef ARCHLIB_EXP
4672     incpush(ARCHLIB_EXP, FALSE, FALSE, TRUE, TRUE);
4673 #endif
4674 #ifdef MACOS_TRADITIONAL
4675     {
4676         Stat_t tmpstatbuf;
4677         SV * privdir = NEWSV(55, 0);
4678         char * macperl = PerlEnv_getenv("MACPERL");
4679         
4680         if (!macperl)
4681             macperl = "";
4682         
4683         Perl_sv_setpvf(aTHX_ privdir, "%slib:", macperl);
4684         if (PerlLIO_stat(SvPVX(privdir), &tmpstatbuf) >= 0 && S_ISDIR(tmpstatbuf.st_mode))
4685             incpush(SvPVX(privdir), TRUE, FALSE, TRUE, FALSE);
4686         Perl_sv_setpvf(aTHX_ privdir, "%ssite_perl:", macperl);
4687         if (PerlLIO_stat(SvPVX(privdir), &tmpstatbuf) >= 0 && S_ISDIR(tmpstatbuf.st_mode))
4688             incpush(SvPVX(privdir), TRUE, FALSE, TRUE, FALSE);
4689         
4690         SvREFCNT_dec(privdir);
4691     }
4692     if (!PL_tainting)
4693         incpush(":", FALSE, FALSE, TRUE, FALSE);
4694 #else
4695 #ifndef PRIVLIB_EXP
4696 #  define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
4697 #endif
4698 #if defined(WIN32)
4699     incpush(PRIVLIB_EXP, TRUE, FALSE, TRUE, TRUE);
4700 #else
4701     incpush(PRIVLIB_EXP, FALSE, FALSE, TRUE, TRUE);
4702 #endif
4703
4704 #ifdef SITEARCH_EXP
4705     /* sitearch is always relative to sitelib on Windows for
4706      * DLL-based path intuition to work correctly */
4707 #  if !defined(WIN32)
4708     incpush(SITEARCH_EXP, FALSE, FALSE, TRUE, TRUE);
4709 #  endif
4710 #endif
4711
4712 #ifdef SITELIB_EXP
4713 #  if defined(WIN32)
4714     /* this picks up sitearch as well */
4715     incpush(SITELIB_EXP, TRUE, FALSE, TRUE, TRUE);
4716 #  else
4717     incpush(SITELIB_EXP, FALSE, FALSE, TRUE, TRUE);
4718 #  endif
4719 #endif
4720
4721 #ifdef SITELIB_STEM /* Search for version-specific dirs below here */
4722     incpush(SITELIB_STEM, FALSE, TRUE, TRUE, TRUE);
4723 #endif
4724
4725 #ifdef PERL_VENDORARCH_EXP
4726     /* vendorarch is always relative to vendorlib on Windows for
4727      * DLL-based path intuition to work correctly */
4728 #  if !defined(WIN32)
4729     incpush(PERL_VENDORARCH_EXP, FALSE, FALSE, TRUE, TRUE);
4730 #  endif
4731 #endif
4732
4733 #ifdef PERL_VENDORLIB_EXP
4734 #  if defined(WIN32)
4735     incpush(PERL_VENDORLIB_EXP, TRUE, FALSE, TRUE, TRUE);       /* this picks up vendorarch as well */
4736 #  else
4737     incpush(PERL_VENDORLIB_EXP, FALSE, FALSE, TRUE, TRUE);
4738 #  endif
4739 #endif
4740
4741 #ifdef PERL_VENDORLIB_STEM /* Search for version-specific dirs below here */
4742     incpush(PERL_VENDORLIB_STEM, FALSE, TRUE, TRUE, TRUE);
4743 #endif
4744
4745 #ifdef PERL_OTHERLIBDIRS
4746     incpush(PERL_OTHERLIBDIRS, TRUE, TRUE, TRUE, TRUE);
4747 #endif
4748
4749     if (!PL_tainting)
4750         incpush(".", FALSE, FALSE, TRUE, FALSE);
4751 #endif /* MACOS_TRADITIONAL */
4752 }
4753
4754 #if defined(DOSISH) || defined(EPOC) || defined(__SYMBIAN32__)
4755 #    define PERLLIB_SEP ';'
4756 #else
4757 #  if defined(VMS)
4758 #    define PERLLIB_SEP '|'
4759 #  else
4760 #    if defined(MACOS_TRADITIONAL)
4761 #      define PERLLIB_SEP ','
4762 #    else
4763 #      define PERLLIB_SEP ':'
4764 #    endif
4765 #  endif
4766 #endif
4767 #ifndef PERLLIB_MANGLE
4768 #  define PERLLIB_MANGLE(s,n) (s)
4769 #endif
4770
4771 /* Push a directory onto @INC if it exists.
4772    Generate a new SV if we do this, to save needing to copy the SV we push
4773    onto @INC  */
4774 STATIC SV *
4775 S_incpush_if_exists(pTHX_ SV *dir)
4776 {
4777     Stat_t tmpstatbuf;
4778     if (PerlLIO_stat(SvPVX_const(dir), &tmpstatbuf) >= 0 &&
4779         S_ISDIR(tmpstatbuf.st_mode)) {
4780         av_push(GvAVn(PL_incgv), dir);
4781         dir = NEWSV(0,0);
4782     }
4783     return dir;
4784 }
4785
4786 STATIC void
4787 S_incpush(pTHX_ const char *dir, bool addsubdirs, bool addoldvers, bool usesep,
4788           bool canrelocate)
4789 {
4790     SV *subdir = Nullsv;
4791     const char *p = dir;
4792
4793     if (!p || !*p)
4794         return;
4795
4796     if (addsubdirs || addoldvers) {
4797         subdir = NEWSV(0,0);
4798     }
4799
4800     /* Break at all separators */
4801     while (p && *p) {
4802         SV *libdir = NEWSV(55,0);
4803         const char *s;
4804
4805         /* skip any consecutive separators */
4806         if (usesep) {
4807             while ( *p == PERLLIB_SEP ) {
4808                 /* Uncomment the next line for PATH semantics */
4809                 /* av_push(GvAVn(PL_incgv), newSVpvn(".", 1)); */
4810                 p++;
4811             }
4812         }
4813
4814         if ( usesep && (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
4815             sv_setpvn(libdir, PERLLIB_MANGLE(p, (STRLEN)(s - p)),
4816                       (STRLEN)(s - p));
4817             p = s + 1;
4818         }
4819         else {
4820             sv_setpv(libdir, PERLLIB_MANGLE(p, 0));
4821             p = Nullch; /* break out */
4822         }
4823 #ifdef MACOS_TRADITIONAL
4824         if (!strchr(SvPVX(libdir), ':')) {
4825             char buf[256];
4826
4827             sv_setpv(libdir, MacPerl_CanonDir(SvPVX(libdir), buf, 0));
4828         }
4829         if (SvPVX(libdir)[SvCUR(libdir)-1] != ':')
4830             sv_catpv(libdir, ":");
4831 #endif
4832
4833         /* Do the if() outside the #ifdef to avoid warnings about an unused
4834            parameter.  */
4835         if (canrelocate) {
4836 #ifdef PERL_RELOCATABLE_INC
4837         /*
4838          * Relocatable include entries are marked with a leading .../
4839          *
4840          * The algorithm is
4841          * 0: Remove that leading ".../"
4842          * 1: Remove trailing executable name (anything after the last '/')
4843          *    from the perl path to give a perl prefix
4844          * Then
4845          * While the @INC element starts "../" and the prefix ends with a real
4846          * directory (ie not . or ..) chop that real directory off the prefix
4847          * and the leading "../" from the @INC element. ie a logical "../"
4848          * cleanup
4849          * Finally concatenate the prefix and the remainder of the @INC element
4850          * The intent is that /usr/local/bin/perl and .../../lib/perl5
4851          * generates /usr/local/lib/perl5
4852          */
4853             const char *libpath = SvPVX(libdir);
4854             STRLEN libpath_len = SvCUR(libdir);
4855             if (libpath_len >= 4 && memEQ (libpath, ".../", 4)) {
4856                 /* Game on!  */
4857                 SV * const caret_X = get_sv("\030", 0);
4858                 /* Going to use the SV just as a scratch buffer holding a C
4859                    string:  */
4860                 SV *prefix_sv;
4861                 char *prefix;
4862                 char *lastslash;
4863
4864                 /* $^X is *the* source of taint if tainting is on, hence
4865                    SvPOK() won't be true.  */
4866                 assert(caret_X);
4867                 assert(SvPOKp(caret_X));
4868                 prefix_sv = newSVpvn(SvPVX(caret_X), SvCUR(caret_X));
4869                 /* Firstly take off the leading .../
4870                    If all else fail we'll do the paths relative to the current
4871                    directory.  */
4872                 sv_chop(libdir, libpath + 4);
4873                 /* Don't use SvPV as we're intentionally bypassing taining,
4874                    mortal copies that the mg_get of tainting creates, and
4875                    corruption that seems to come via the save stack.
4876                    I guess that the save stack isn't correctly set up yet.  */
4877                 libpath = SvPVX(libdir);
4878                 libpath_len = SvCUR(libdir);
4879
4880                 /* This would work more efficiently with memrchr, but as it's
4881                    only a GNU extension we'd need to probe for it and
4882                    implement our own. Not hard, but maybe not worth it?  */
4883
4884                 prefix = SvPVX(prefix_sv);
4885                 lastslash = strrchr(prefix, '/');
4886
4887                 /* First time in with the *lastslash = '\0' we just wipe off
4888                    the trailing /perl from (say) /usr/foo/bin/perl
4889                 */
4890                 if (lastslash) {
4891                     SV *tempsv;
4892                     while ((*lastslash = '\0'), /* Do that, come what may.  */
4893                            (libpath_len >= 3 && memEQ(libpath, "../", 3)
4894                             && (lastslash = strrchr(prefix, '/')))) {
4895                         if (lastslash[1] == '\0'
4896                             || (lastslash[1] == '.'
4897                                 && (lastslash[2] == '/' /* ends "/."  */
4898                                     || (lastslash[2] == '/'
4899                                         && lastslash[3] == '/' /* or "/.."  */
4900                                         )))) {
4901                             /* Prefix ends "/" or "/." or "/..", any of which
4902                                are fishy, so don't do any more logical cleanup.
4903                             */
4904                             break;
4905                         }
4906                         /* Remove leading "../" from path  */
4907                         libpath += 3;
4908                         libpath_len -= 3;
4909                         /* Next iteration round the loop removes the last
4910                            directory name from prefix by writing a '\0' in
4911                            the while clause.  */
4912                     }
4913                     /* prefix has been terminated with a '\0' to the correct
4914                        length. libpath points somewhere into the libdir SV.
4915                        We need to join the 2 with '/' and drop the result into
4916                        libdir.  */
4917                     tempsv = Perl_newSVpvf(aTHX_ "%s/%s", prefix, libpath);
4918                     SvREFCNT_dec(libdir);
4919                     /* And this is the new libdir.  */
4920                     libdir = tempsv;
4921                     if (PL_tainting &&
4922                         (PL_uid != PL_euid || PL_gid != PL_egid)) {
4923                         /* Need to taint reloccated paths if running set ID  */
4924                         SvTAINTED_on(libdir);
4925                     }
4926                 }
4927                 SvREFCNT_dec(prefix_sv);
4928             }
4929 #endif
4930         }
4931         /*
4932          * BEFORE pushing libdir onto @INC we may first push version- and
4933          * archname-specific sub-directories.
4934          */
4935         if (addsubdirs || addoldvers) {
4936 #ifdef PERL_INC_VERSION_LIST
4937             /* Configure terminates PERL_INC_VERSION_LIST with a NULL */
4938             const char * const incverlist[] = { PERL_INC_VERSION_LIST };
4939             const char * const *incver;
4940 #endif
4941 #ifdef VMS
4942             char *unix;
4943             STRLEN len;
4944
4945             if ((unix = tounixspec_ts(SvPV(libdir,len),Nullch)) != Nullch) {
4946                 len = strlen(unix);
4947                 while (unix[len-1] == '/') len--;  /* Cosmetic */
4948                 sv_usepvn(libdir,unix,len);
4949             }
4950             else
4951                 PerlIO_printf(Perl_error_log,
4952                               "Failed to unixify @INC element \"%s\"\n",
4953                               SvPV(libdir,len));
4954 #endif
4955             if (addsubdirs) {
4956 #ifdef MACOS_TRADITIONAL
4957 #define PERL_AV_SUFFIX_FMT      ""
4958 #define PERL_ARCH_FMT           "%s:"
4959 #define PERL_ARCH_FMT_PATH      PERL_FS_VER_FMT PERL_AV_SUFFIX_FMT
4960 #else
4961 #define PERL_AV_SUFFIX_FMT      "/"
4962 #define PERL_ARCH_FMT           "/%s"
4963 #define PERL_ARCH_FMT_PATH      PERL_AV_SUFFIX_FMT PERL_FS_VER_FMT
4964 #endif
4965                 /* .../version/archname if -d .../version/archname */
4966                 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT_PATH PERL_ARCH_FMT,
4967                                 libdir,
4968                                (int)PERL_REVISION, (int)PERL_VERSION,
4969                                (int)PERL_SUBVERSION, ARCHNAME);
4970                 subdir = S_incpush_if_exists(aTHX_ subdir);
4971
4972                 /* .../version if -d .../version */
4973                 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT_PATH, libdir,
4974                                (int)PERL_REVISION, (int)PERL_VERSION,
4975                                (int)PERL_SUBVERSION);
4976                 subdir = S_incpush_if_exists(aTHX_ subdir);
4977
4978                 /* .../archname if -d .../archname */
4979                 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT, libdir, ARCHNAME);
4980                 subdir = S_incpush_if_exists(aTHX_ subdir);
4981
4982             }
4983
4984 #ifdef PERL_INC_VERSION_LIST
4985             if (addoldvers) {
4986                 for (incver = incverlist; *incver; incver++) {
4987                     /* .../xxx if -d .../xxx */
4988                     Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT, libdir, *incver);
4989                     subdir = S_incpush_if_exists(aTHX_ subdir);
4990                 }
4991             }
4992 #endif
4993         }
4994
4995         /* finally push this lib directory on the end of @INC */
4996         av_push(GvAVn(PL_incgv), libdir);
4997     }
4998     if (subdir) {
4999         assert (SvREFCNT(subdir) == 1);
5000         SvREFCNT_dec(subdir);
5001     }
5002 }
5003
5004 #ifdef USE_5005THREADS
5005 STATIC struct perl_thread *
5006 S_init_main_thread(pTHX)
5007 {
5008 #if !defined(PERL_IMPLICIT_CONTEXT)
5009     struct perl_thread *thr;
5010 #endif
5011     XPV *xpv;
5012
5013     Newxz(thr, 1, struct perl_thread);
5014     PL_curcop = &PL_compiling;
5015     thr->interp = PERL_GET_INTERP;
5016     thr->cvcache = newHV();
5017     thr->threadsv = newAV();
5018     /* thr->threadsvp is set when find_threadsv is called */
5019     thr->specific = newAV();
5020     thr->flags = THRf_R_JOINABLE;
5021     MUTEX_INIT(&thr->mutex);
5022     /* Handcraft thrsv similarly to mess_sv */
5023     Newx(PL_thrsv, 1, SV);
5024     Newxz(xpv, 1, XPV);
5025     SvFLAGS(PL_thrsv) = SVt_PV;
5026     SvANY(PL_thrsv) = (void*)xpv;
5027     SvREFCNT(PL_thrsv) = 1 << 30;       /* practically infinite */
5028     SvPV_set(PL_thrsvr, (char*)thr);
5029     SvCUR_set(PL_thrsv, sizeof(thr));
5030     SvLEN_set(PL_thrsv, sizeof(thr));
5031     *SvEND(PL_thrsv) = '\0';    /* in the trailing_nul field */
5032     thr->oursv = PL_thrsv;
5033     PL_chopset = " \n-";
5034     PL_dumpindent = 4;
5035
5036     MUTEX_LOCK(&PL_threads_mutex);
5037     PL_nthreads++;
5038     thr->tid = 0;
5039     thr->next = thr;
5040     thr->prev = thr;
5041     thr->thr_done = 0;
5042     MUTEX_UNLOCK(&PL_threads_mutex);
5043
5044 #ifdef HAVE_THREAD_INTERN
5045     Perl_init_thread_intern(thr);
5046 #endif
5047
5048 #ifdef SET_THREAD_SELF
5049     SET_THREAD_SELF(thr);
5050 #else
5051     thr->self = pthread_self();
5052 #endif /* SET_THREAD_SELF */
5053     PERL_SET_THX(thr);
5054
5055     /*
5056      * These must come after the thread self setting
5057      * because sv_setpvn does SvTAINT and the taint
5058      * fields thread selfness being set.
5059      */
5060     PL_toptarget = NEWSV(0,0);
5061     sv_upgrade(PL_toptarget, SVt_PVFM);
5062     sv_setpvn(PL_toptarget, "", 0);
5063     PL_bodytarget = NEWSV(0,0);
5064     sv_upgrade(PL_bodytarget, SVt_PVFM);
5065     sv_setpvn(PL_bodytarget, "", 0);
5066     PL_formtarget = PL_bodytarget;
5067     thr->errsv = newSVpvn("", 0);
5068     (void) find_threadsv("@");  /* Ensure $@ is initialised early */
5069
5070     PL_maxscream = -1;
5071     PL_peepp = MEMBER_TO_FPTR(Perl_peep);
5072     PL_regcompp = MEMBER_TO_FPTR(Perl_pregcomp);
5073     PL_regexecp = MEMBER_TO_FPTR(Perl_regexec_flags);
5074     PL_regint_start = MEMBER_TO_FPTR(Perl_re_intuit_start);
5075     PL_regint_string = MEMBER_TO_FPTR(Perl_re_intuit_string);
5076     PL_regfree = MEMBER_TO_FPTR(Perl_pregfree);
5077     PL_regindent = 0;
5078     PL_reginterp_cnt = 0;
5079
5080     return thr;
5081 }
5082 #endif /* USE_5005THREADS */
5083
5084 void
5085 Perl_call_list(pTHX_ I32 oldscope, AV *paramList)
5086 {
5087     dVAR;
5088     SV *atsv;
5089     const line_t oldline = CopLINE(PL_curcop);
5090     CV *cv;
5091     STRLEN len;
5092     int ret;
5093     dJMPENV;
5094
5095     while (av_len(paramList) >= 0) {
5096         cv = (CV*)av_shift(paramList);
5097         if (PL_savebegin) {
5098             if (paramList == PL_beginav) {
5099                 /* save PL_beginav for compiler */
5100                 if (! PL_beginav_save)
5101                     PL_beginav_save = newAV();
5102                 av_push(PL_beginav_save, (SV*)cv);
5103             }
5104             else if (paramList == PL_checkav) {
5105                 /* save PL_checkav for compiler */
5106                 if (! PL_checkav_save)
5107                     PL_checkav_save = newAV();
5108                 av_push(PL_checkav_save, (SV*)cv);
5109             }
5110         } else {
5111             SAVEFREESV(cv);
5112         }
5113         JMPENV_PUSH(ret);
5114         switch (ret) {
5115         case 0:
5116             call_list_body(cv);
5117             atsv = ERRSV;
5118             (void)SvPV_const(atsv, len);
5119             if (len) {
5120                 PL_curcop = &PL_compiling;
5121                 CopLINE_set(PL_curcop, oldline);
5122                 if (paramList == PL_beginav)
5123                     sv_catpv(atsv, "BEGIN failed--compilation aborted");
5124                 else
5125                     Perl_sv_catpvf(aTHX_ atsv,
5126                                    "%s failed--call queue aborted",
5127                                    paramList == PL_checkav ? "CHECK"
5128                                    : paramList == PL_initav ? "INIT"
5129                                    : "END");
5130                 while (PL_scopestack_ix > oldscope)
5131                     LEAVE;
5132                 JMPENV_POP;
5133                 Perl_croak(aTHX_ "%"SVf"", atsv);
5134             }
5135             break;
5136         case 1:
5137             STATUS_ALL_FAILURE;
5138             /* FALL THROUGH */
5139         case 2:
5140             /* my_exit() was called */
5141             while (PL_scopestack_ix > oldscope)
5142                 LEAVE;
5143             FREETMPS;
5144             PL_curstash = PL_defstash;
5145             PL_curcop = &PL_compiling;
5146             CopLINE_set(PL_curcop, oldline);
5147             JMPENV_POP;
5148             if (PL_statusvalue && !(PL_exit_flags & PERL_EXIT_EXPECTED)) {
5149                 if (paramList == PL_beginav)
5150                     Perl_croak(aTHX_ "BEGIN failed--compilation aborted");
5151                 else
5152                     Perl_croak(aTHX_ "%s failed--call queue aborted",
5153                                paramList == PL_checkav ? "CHECK"
5154                                : paramList == PL_initav ? "INIT"
5155                                : "END");
5156             }
5157             my_exit_jump();
5158             /* NOTREACHED */
5159         case 3:
5160             if (PL_restartop) {
5161                 PL_curcop = &PL_compiling;
5162                 CopLINE_set(PL_curcop, oldline);
5163                 JMPENV_JUMP(3);
5164             }
5165             PerlIO_printf(Perl_error_log, "panic: restartop\n");
5166             FREETMPS;
5167             break;
5168         }
5169         JMPENV_POP;
5170     }
5171 }
5172
5173 STATIC void *
5174 S_call_list_body(pTHX_ CV *cv)
5175 {
5176     PUSHMARK(PL_stack_sp);
5177     call_sv((SV*)cv, G_EVAL|G_DISCARD);
5178     return NULL;
5179 }
5180
5181 void
5182 Perl_my_exit(pTHX_ U32 status)
5183 {
5184     DEBUG_S(PerlIO_printf(Perl_debug_log, "my_exit: thread %p, status %lu\n",
5185                           thr, (unsigned long) status));
5186     switch (status) {
5187     case 0:
5188         STATUS_ALL_SUCCESS;
5189         break;
5190     case 1:
5191         STATUS_ALL_FAILURE;
5192         break;
5193     default:
5194         STATUS_EXIT_SET(status);
5195         break;
5196     }
5197     my_exit_jump();
5198 }
5199
5200 void
5201 Perl_my_failure_exit(pTHX)
5202 {
5203 #ifdef VMS
5204      /* We have been called to fall on our sword.  The desired exit code
5205       * should be already set in STATUS_UNIX, but could be shifted over
5206       * by 8 bits.  STATUS_UNIX_EXIT_SET will handle the cases where a
5207       * that code is set.
5208       *
5209       * If an error code has not been set, then force the issue.
5210       */
5211     if (MY_POSIX_EXIT) {
5212
5213         /* In POSIX_EXIT mode follow Perl documentations and use 255 for
5214          * the exit code when there isn't an error.
5215          */
5216
5217         if (STATUS_UNIX == 0)
5218             STATUS_UNIX_EXIT_SET(255);
5219         else {
5220             STATUS_UNIX_EXIT_SET(STATUS_UNIX);
5221
5222             /* The exit code could have been set by $? or vmsish which
5223              * means that it may not be fatal.  So convert
5224              * success/warning codes to fatal.
5225              */
5226             if ((STATUS_NATIVE & (STS$K_SEVERE|STS$K_ERROR)) == 0)
5227                 STATUS_UNIX_EXIT_SET(255);
5228         }
5229     }
5230     else {
5231         /* Traditionally Perl on VMS always expects a Fatal Error. */
5232         if (vaxc$errno & 1) {
5233
5234             /* So force success status to failure */
5235             if (STATUS_NATIVE & 1)
5236                 STATUS_ALL_FAILURE;
5237         }
5238         else {
5239             if (!vaxc$errno) {
5240                 STATUS_UNIX = EINTR; /* In case something cares */
5241                 STATUS_ALL_FAILURE;
5242             }
5243             else {
5244                 int severity;
5245                 STATUS_NATIVE = vaxc$errno; /* Should already be this */
5246
5247                 /* Encode the severity code */
5248                 severity = STATUS_NATIVE & STS$M_SEVERITY;
5249                 STATUS_UNIX = (severity ? severity : 1) << 8;
5250
5251                 /* Perl expects this to be a fatal error */
5252                 if (severity != STS$K_SEVERE)
5253                     STATUS_ALL_FAILURE;
5254             }
5255         }
5256     }
5257
5258 #else
5259     int exitstatus;
5260     if (errno & 255)
5261         STATUS_UNIX_SET(errno);
5262     else {
5263         exitstatus = STATUS_UNIX >> 8;
5264         if (exitstatus & 255)
5265             STATUS_UNIX_SET(exitstatus);
5266         else
5267             STATUS_UNIX_SET(255);
5268     }
5269 #endif
5270     my_exit_jump();
5271 }
5272
5273 STATIC void
5274 S_my_exit_jump(pTHX)
5275 {
5276     dVAR;
5277     register PERL_CONTEXT *cx;
5278     I32 gimme;
5279     SV **newsp;
5280
5281     if (PL_e_script) {
5282         SvREFCNT_dec(PL_e_script);
5283         PL_e_script = Nullsv;
5284     }
5285
5286     POPSTACK_TO(PL_mainstack);
5287     if (cxstack_ix >= 0) {
5288         if (cxstack_ix > 0)
5289             dounwind(0);
5290         POPBLOCK(cx,PL_curpm);
5291         LEAVE;
5292     }
5293
5294     JMPENV_JUMP(2);
5295     PERL_UNUSED_VAR(gimme);
5296     PERL_UNUSED_VAR(newsp);
5297 }
5298
5299 static I32
5300 read_e_script(pTHX_ int idx, SV *buf_sv, int maxlen)
5301 {
5302     const char * const p  = SvPVX_const(PL_e_script);
5303     const char *nl = strchr(p, '\n');
5304
5305     PERL_UNUSED_ARG(idx);
5306     PERL_UNUSED_ARG(maxlen);
5307
5308     nl = (nl) ? nl+1 : SvEND(PL_e_script);
5309     if (nl-p == 0) {
5310         filter_del(read_e_script);
5311         return 0;
5312     }
5313     sv_catpvn(buf_sv, p, nl-p);
5314     sv_chop(PL_e_script, nl);
5315     return 1;
5316 }
5317
5318 /*
5319  * Local variables:
5320  * c-indentation-style: bsd
5321  * c-basic-offset: 4
5322  * indent-tabs-mode: t
5323  * End:
5324  *
5325  * ex: set ts=8 sts=4 sw=4 noet:
5326  */