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