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