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