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