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