This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Don't require executable bit on perl -S if DOSISH
[perl5.git] / perl.c
1 /*    perl.c
2  *
3  *    Copyright (c) 1987-1997 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 #include "perl.h"
16 #include "patchlevel.h"
17
18 /* XXX If this causes problems, set i_unistd=undef in the hint file.  */
19 #ifdef I_UNISTD
20 #include <unistd.h>
21 #endif
22
23 #if !defined(STANDARD_C) && !defined(HAS_GETENV_PROTOTYPE)
24 char *getenv _((char *)); /* Usually in <stdlib.h> */
25 #endif
26
27 dEXTCONST char rcsid[] = "perl.c\nPatch level: ###\n";
28
29 #ifdef IAMSUID
30 #ifndef DOSUID
31 #define DOSUID
32 #endif
33 #endif
34
35 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
36 #ifdef DOSUID
37 #undef DOSUID
38 #endif
39 #endif
40
41 #define I_REINIT \
42   STMT_START {                  \
43     chopset     = " \n-";       \
44     copline     = NOLINE;       \
45     curcop      = &compiling;   \
46     curcopdb    = NULL;         \
47     cxstack_ix  = -1;           \
48     cxstack_max = 128;          \
49     dbargs      = 0;            \
50     dlmax       = 128;          \
51     laststatval = -1;           \
52     laststype   = OP_STAT;      \
53     maxscream   = -1;           \
54     maxsysfd    = MAXSYSFD;     \
55     statname    = Nullsv;       \
56     tmps_floor  = -1;           \
57     tmps_ix     = -1;           \
58     op_mask     = NULL;         \
59     dlmax       = 128;          \
60     laststatval = -1;           \
61     laststype   = OP_STAT;      \
62     mess_sv     = Nullsv;       \
63   } STMT_END
64
65 static void find_beginning _((void));
66 static void forbid_setid _((char *));
67 static void incpush _((char *, int));
68 static void init_ids _((void));
69 static void init_debugger _((void));
70 static void init_lexer _((void));
71 static void init_main_stash _((void));
72 static void init_perllib _((void));
73 static void init_postdump_symbols _((int, char **, char **));
74 static void init_predump_symbols _((void));
75 static void init_stacks _((void));
76 static void my_exit_jump _((void)) __attribute__((noreturn));
77 static void nuke_stacks _((void));
78 static void open_script _((char *, bool, SV *));
79 static void usage _((char *));
80 static void validate_suid _((char *, char*));
81
82 static int fdscript = -1;
83
84 PerlInterpreter *
85 perl_alloc()
86 {
87     PerlInterpreter *sv_interp;
88
89     curinterp = 0;
90     New(53, sv_interp, 1, PerlInterpreter);
91     return sv_interp;
92 }
93
94 void
95 perl_construct( sv_interp )
96 register PerlInterpreter *sv_interp;
97 {
98     if (!(curinterp = sv_interp))
99         return;
100
101 #ifdef MULTIPLICITY
102     Zero(sv_interp, 1, PerlInterpreter);
103 #endif
104
105     /* Init the real globals? */
106     if (!linestr) {
107         linestr = NEWSV(65,80);
108         sv_upgrade(linestr,SVt_PVIV);
109
110         if (!SvREADONLY(&sv_undef)) {
111             SvREADONLY_on(&sv_undef);
112
113             sv_setpv(&sv_no,No);
114             SvNV(&sv_no);
115             SvREADONLY_on(&sv_no);
116
117             sv_setpv(&sv_yes,Yes);
118             SvNV(&sv_yes);
119             SvREADONLY_on(&sv_yes);
120         }
121
122         nrs = newSVpv("\n", 1);
123         rs = SvREFCNT_inc(nrs);
124
125         pidstatus = newHV();
126
127 #ifdef MSDOS
128         /*
129          * There is no way we can refer to them from Perl so close them to save
130          * space.  The other alternative would be to provide STDAUX and STDPRN
131          * filehandles.
132          */
133         (void)fclose(stdaux);
134         (void)fclose(stdprn);
135 #endif
136     }
137
138 #ifdef MULTIPLICITY
139     I_REINIT;
140     perl_destruct_level = 1; 
141 #else
142    if(perl_destruct_level > 0)
143        I_REINIT;
144 #endif
145
146     init_ids();
147
148     start_env.je_prev = NULL;
149     start_env.je_ret = -1;
150     start_env.je_mustcatch = TRUE;
151     top_env     = &start_env;
152     STATUS_ALL_SUCCESS;
153
154     SET_NUMERIC_STANDARD();
155 #if defined(SUBVERSION) && SUBVERSION > 0
156     sprintf(patchlevel, "%7.5f",   (double) 5 
157                                 + ((double) PATCHLEVEL / (double) 1000)
158                                 + ((double) SUBVERSION / (double) 100000));
159 #else
160     sprintf(patchlevel, "%5.3f", (double) 5 +
161                                 ((double) PATCHLEVEL / (double) 1000));
162 #endif
163
164 #if defined(LOCAL_PATCH_COUNT)
165     localpatches = local_patches;       /* For possible -v */
166 #endif
167
168     PerlIO_init();      /* Hook to IO system */
169
170     fdpid = newAV();    /* for remembering popen pids by fd */
171
172     init_stacks();
173     ENTER;
174 }
175
176 void
177 perl_destruct(sv_interp)
178 register PerlInterpreter *sv_interp;
179 {
180     int destruct_level;  /* 0=none, 1=full, 2=full with checks */
181     I32 last_sv_count;
182     HV *hv;
183
184     if (!(curinterp = sv_interp))
185         return;
186
187     destruct_level = perl_destruct_level;
188 #ifdef DEBUGGING
189     {
190         char *s;
191         if (s = getenv("PERL_DESTRUCT_LEVEL")) {
192             int i = atoi(s);
193             if (destruct_level < i)
194                 destruct_level = i;
195         }
196     }
197 #endif
198
199     LEAVE;
200     FREETMPS;
201
202     /* We must account for everything.  */
203
204     /* Destroy the main CV and syntax tree */
205     if (main_root) {
206         curpad = AvARRAY(comppad);
207         op_free(main_root);
208         main_root = Nullop;
209     }
210     main_start = Nullop;
211     SvREFCNT_dec(main_cv);
212     main_cv = Nullcv;
213
214     if (sv_objcount) {
215         /*
216          * Try to destruct global references.  We do this first so that the
217          * destructors and destructees still exist.  Some sv's might remain.
218          * Non-referenced objects are on their own.
219          */
220     
221         dirty = TRUE;
222         sv_clean_objs();
223     }
224
225     /* unhook hooks which will soon be, or use, destroyed data */
226     SvREFCNT_dec(warnhook);
227     warnhook = Nullsv;
228     SvREFCNT_dec(diehook);
229     diehook = Nullsv;
230     SvREFCNT_dec(parsehook);
231     parsehook = Nullsv;
232
233     if (destruct_level == 0){
234
235         DEBUG_P(debprofdump());
236     
237         /* The exit() function will do everything that needs doing. */
238         return;
239     }
240
241     /* loosen bonds of global variables */
242
243     if(rsfp) {
244         (void)PerlIO_close(rsfp);
245         rsfp = Nullfp;
246     }
247
248     /* Filters for program text */
249     SvREFCNT_dec(rsfp_filters);
250     rsfp_filters = Nullav;
251
252     /* switches */
253     preprocess   = FALSE;
254     minus_n      = FALSE;
255     minus_p      = FALSE;
256     minus_l      = FALSE;
257     minus_a      = FALSE;
258     minus_F      = FALSE;
259     doswitches   = FALSE;
260     dowarn       = FALSE;
261     doextract    = FALSE;
262     sawampersand = FALSE;       /* must save all match strings */
263     sawstudy     = FALSE;       /* do fbm_instr on all strings */
264     sawvec       = FALSE;
265     unsafe       = FALSE;
266
267     Safefree(inplace);
268     inplace = Nullch;
269
270     Safefree(e_tmpname);
271     e_tmpname = Nullch;
272
273     if (e_fp) {
274         PerlIO_close(e_fp);
275         e_fp = Nullfp;
276     }
277
278     /* magical thingies */
279
280     Safefree(ofs);      /* $, */
281     ofs = Nullch;
282
283     Safefree(ors);      /* $\ */
284     ors = Nullch;
285
286     SvREFCNT_dec(nrs);  /* $\ helper */
287     nrs = Nullsv;
288
289     multiline = 0;      /* $* */
290
291     SvREFCNT_dec(statname);
292     statname = Nullsv;
293     statgv = Nullgv;
294
295     /* defgv, aka *_ should be taken care of elsewhere */
296
297 #if 0  /* just about all regexp stuff, seems to be ok */
298
299     /* shortcuts to regexp stuff */
300     leftgv = Nullgv;
301     ampergv = Nullgv;
302
303     SAVEFREEOP(curpm);
304     SAVEFREEOP(oldlastpm); /* for saving regexp context during debugger */
305
306     regprecomp = NULL;  /* uncompiled string. */
307     regparse = NULL;    /* Input-scan pointer. */
308     regxend = NULL;     /* End of input for compile */
309     regnpar = 0;        /* () count. */
310     regcode = NULL;     /* Code-emit pointer; &regdummy = don't. */
311     regsize = 0;        /* Code size. */
312     regnaughty = 0;     /* How bad is this pattern? */
313     regsawback = 0;     /* Did we see \1, ...? */
314
315     reginput = NULL;            /* String-input pointer. */
316     regbol = NULL;              /* Beginning of input, for ^ check. */
317     regeol = NULL;              /* End of input, for $ check. */
318     regstartp = (char **)NULL;  /* Pointer to startp array. */
319     regendp = (char **)NULL;    /* Ditto for endp. */
320     reglastparen = 0;           /* Similarly for lastparen. */
321     regtill = NULL;             /* How far we are required to go. */
322     regflags = 0;               /* are we folding, multilining? */
323     regprev = (char)NULL;       /* char before regbol, \n if none */
324
325 #endif /* if 0 */
326
327     /* clean up after study() */
328     SvREFCNT_dec(lastscream);
329     lastscream = Nullsv;
330     Safefree(screamfirst);
331     screamfirst = 0;
332     Safefree(screamnext);
333     screamnext  = 0;
334
335     /* startup and shutdown function lists */
336     SvREFCNT_dec(beginav);
337     SvREFCNT_dec(endav);
338     beginav = Nullav;
339     endav = Nullav;
340
341     /* temp stack during pp_sort() */
342     SvREFCNT_dec(sortstack);
343     sortstack = Nullav;
344
345     /* shortcuts just get cleared */
346     envgv = Nullgv;
347     siggv = Nullgv;
348     incgv = Nullgv;
349     errgv = Nullgv;
350     argvgv = Nullgv;
351     argvoutgv = Nullgv;
352     stdingv = Nullgv;
353     last_in_gv = Nullgv;
354
355     /* reset so print() ends up where we expect */
356     setdefout(Nullgv);
357
358     /* Prepare to destruct main symbol table.  */
359
360     hv = defstash;
361     defstash = 0;
362     SvREFCNT_dec(hv);
363
364     FREETMPS;
365     if (destruct_level >= 2) {
366         if (scopestack_ix != 0)
367             warn("Unbalanced scopes: %ld more ENTERs than LEAVEs\n",
368                  (long)scopestack_ix);
369         if (savestack_ix != 0)
370             warn("Unbalanced saves: %ld more saves than restores\n",
371                  (long)savestack_ix);
372         if (tmps_floor != -1)
373             warn("Unbalanced tmps: %ld more allocs than frees\n",
374                  (long)tmps_floor + 1);
375         if (cxstack_ix != -1)
376             warn("Unbalanced context: %ld more PUSHes than POPs\n",
377                  (long)cxstack_ix + 1);
378     }
379
380     /* Now absolutely destruct everything, somehow or other, loops or no. */
381     last_sv_count = 0;
382     SvFLAGS(strtab) |= SVTYPEMASK;              /* don't clean out strtab now */
383     while (sv_count != 0 && sv_count != last_sv_count) {
384         last_sv_count = sv_count;
385         sv_clean_all();
386     }
387     SvFLAGS(strtab) &= ~SVTYPEMASK;
388     SvFLAGS(strtab) |= SVt_PVHV;
389     
390     /* Destruct the global string table. */
391     {
392         /* Yell and reset the HeVAL() slots that are still holding refcounts,
393          * so that sv_free() won't fail on them.
394          */
395         I32 riter;
396         I32 max;
397         HE *hent;
398         HE **array;
399
400         riter = 0;
401         max = HvMAX(strtab);
402         array = HvARRAY(strtab);
403         hent = array[0];
404         for (;;) {
405             if (hent) {
406                 warn("Unbalanced string table refcount: (%d) for \"%s\"",
407                      HeVAL(hent) - Nullsv, HeKEY(hent));
408                 HeVAL(hent) = Nullsv;
409                 hent = HeNEXT(hent);
410             }
411             if (!hent) {
412                 if (++riter > max)
413                     break;
414                 hent = array[riter];
415             }
416         }
417     }
418     SvREFCNT_dec(strtab);
419
420     if (sv_count != 0)
421         warn("Scalars leaked: %ld\n", (long)sv_count);
422
423     sv_free_arenas();
424
425     /* No SVs have survived, need to clean out */
426     linestr = NULL;
427     pidstatus = Nullhv;
428     if (origfilename)
429         Safefree(origfilename);
430     nuke_stacks();
431     hints = 0;          /* Reset hints. Should hints be per-interpreter ? */
432     
433     DEBUG_P(debprofdump());
434
435     /* As the absolutely last thing, free the non-arena SV for mess() */
436
437     if (mess_sv) {
438         /* we know that type >= SVt_PV */
439         SvOOK_off(mess_sv);
440         Safefree(SvPVX(mess_sv));
441         Safefree(SvANY(mess_sv));
442         Safefree(mess_sv);
443         mess_sv = Nullsv;
444     }
445 }
446
447 void
448 perl_free(sv_interp)
449 PerlInterpreter *sv_interp;
450 {
451     if (!(curinterp = sv_interp))
452         return;
453     Safefree(sv_interp);
454 }
455
456 int
457 perl_parse(sv_interp, xsinit, argc, argv, env)
458 PerlInterpreter *sv_interp;
459 void (*xsinit)_((void));
460 int argc;
461 char **argv;
462 char **env;
463 {
464     register SV *sv;
465     register char *s;
466     char *scriptname = NULL;
467     VOL bool dosearch = FALSE;
468     char *validarg = "";
469     I32 oldscope;
470     AV* comppadlist;
471     dJMPENV;
472     int ret;
473
474 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
475 #ifdef IAMSUID
476 #undef IAMSUID
477     croak("suidperl is no longer needed since the kernel can now execute\n\
478 setuid perl scripts securely.\n");
479 #endif
480 #endif
481
482     if (!(curinterp = sv_interp))
483         return 255;
484
485 #if defined(NeXT) && defined(__DYNAMIC__)
486     _dyld_lookup_and_bind
487         ("__environ", (unsigned long *) &environ_pointer, NULL);
488 #endif /* environ */
489
490     origargv = argv;
491     origargc = argc;
492 #ifndef VMS  /* VMS doesn't have environ array */
493     origenviron = environ;
494 #endif
495     e_tmpname = Nullch;
496
497     if (do_undump) {
498
499         /* Come here if running an undumped a.out. */
500
501         origfilename = savepv(argv[0]);
502         do_undump = FALSE;
503         cxstack_ix = -1;                /* start label stack again */
504         init_ids();
505         init_postdump_symbols(argc,argv,env);
506         return 0;
507     }
508
509     if (main_root) {
510         curpad = AvARRAY(comppad);
511         op_free(main_root);
512         main_root = Nullop;
513     }
514     main_start = Nullop;
515     SvREFCNT_dec(main_cv);
516     main_cv = Nullcv;
517
518     time(&basetime);
519     oldscope = scopestack_ix;
520
521     JMPENV_PUSH(ret);
522     switch (ret) {
523     case 1:
524         STATUS_ALL_FAILURE;
525         /* FALL THROUGH */
526     case 2:
527         /* my_exit() was called */
528         while (scopestack_ix > oldscope)
529             LEAVE;
530         curstash = defstash;
531         if (endav)
532             call_list(oldscope, endav);
533         JMPENV_POP;
534         return STATUS_NATIVE_EXPORT;
535     case 3:
536         JMPENV_POP;
537         PerlIO_printf(PerlIO_stderr(), "panic: top_env\n");
538         return 1;
539     }
540
541     sv_setpvn(linestr,"",0);
542     sv = newSVpv("",0);         /* first used for -I flags */
543     SAVEFREESV(sv);
544     init_main_stash();
545
546     for (argc--,argv++; argc > 0; argc--,argv++) {
547         if (argv[0][0] != '-' || !argv[0][1])
548             break;
549 #ifdef DOSUID
550     if (*validarg)
551         validarg = " PHOOEY ";
552     else
553         validarg = argv[0];
554 #endif
555         s = argv[0]+1;
556       reswitch:
557         switch (*s) {
558         case '0':
559         case 'F':
560         case 'a':
561         case 'c':
562         case 'd':
563         case 'D':
564         case 'h':
565         case 'i':
566         case 'l':
567         case 'M':
568         case 'm':
569         case 'n':
570         case 'p':
571         case 's':
572         case 'u':
573         case 'U':
574         case 'v':
575         case 'w':
576             if (s = moreswitches(s))
577                 goto reswitch;
578             break;
579
580         case 'T':
581             tainting = TRUE;
582             s++;
583             goto reswitch;
584
585         case 'e':
586             if (euid != uid || egid != gid)
587                 croak("No -e allowed in setuid scripts");
588             if (!e_fp) {
589                 e_tmpname = savepv(TMPPATH);
590                 (void)mktemp(e_tmpname);
591                 if (!*e_tmpname)
592                     croak("Can't mktemp()");
593                 e_fp = PerlIO_open(e_tmpname,"w");
594                 if (!e_fp)
595                     croak("Cannot open temporary file");
596             }
597             if (*++s)
598                 PerlIO_puts(e_fp,s);
599             else if (argv[1]) {
600                 PerlIO_puts(e_fp,argv[1]);
601                 argc--,argv++;
602             }
603             else
604                 croak("No code specified for -e");
605             (void)PerlIO_putc(e_fp,'\n');
606             break;
607         case 'I':
608             forbid_setid("-I");
609             sv_catpv(sv,"-");
610             sv_catpv(sv,s);
611             sv_catpv(sv," ");
612             if (*++s) {
613                 incpush(s, TRUE);
614             }
615             else if (argv[1]) {
616                 incpush(argv[1], TRUE);
617                 sv_catpv(sv,argv[1]);
618                 argc--,argv++;
619                 sv_catpv(sv," ");
620             }
621             break;
622         case 'P':
623             forbid_setid("-P");
624             preprocess = TRUE;
625             s++;
626             goto reswitch;
627         case 'S':
628             forbid_setid("-S");
629             dosearch = TRUE;
630             s++;
631             goto reswitch;
632         case 'V':
633             if (!preambleav)
634                 preambleav = newAV();
635             av_push(preambleav, newSVpv("use Config qw(myconfig config_vars)",0));
636             if (*++s != ':')  {
637                 Sv = newSVpv("print myconfig();",0);
638 #ifdef VMS
639                 sv_catpv(Sv,"print \"\\nCharacteristics of this PERLSHR image: \\n\",");
640 #else
641                 sv_catpv(Sv,"print \"\\nCharacteristics of this binary (from libperl): \\n\",");
642 #endif
643 #if defined(DEBUGGING) || defined(NO_EMBED) || defined(MULTIPLICITY)
644                 sv_catpv(Sv,"\"  Compile-time options:");
645 #  ifdef DEBUGGING
646                 sv_catpv(Sv," DEBUGGING");
647 #  endif
648 #  ifdef NO_EMBED
649                 sv_catpv(Sv," NO_EMBED");
650 #  endif
651 #  ifdef MULTIPLICITY
652                 sv_catpv(Sv," MULTIPLICITY");
653 #  endif
654                 sv_catpv(Sv,"\\n\",");
655 #endif
656 #if defined(LOCAL_PATCH_COUNT)
657                 if (LOCAL_PATCH_COUNT > 0) {
658                     int i;
659                     sv_catpv(Sv,"\"  Locally applied patches:\\n\",");
660                     for (i = 1; i <= LOCAL_PATCH_COUNT; i++) {
661                         if (localpatches[i])
662                             sv_catpvf(Sv,"\"  \\t%s\\n\",",localpatches[i]);
663                     }
664                 }
665 #endif
666                 sv_catpvf(Sv,"\"  Built under %s\\n\"",OSNAME);
667 #ifdef __DATE__
668 #  ifdef __TIME__
669                 sv_catpvf(Sv,",\"  Compiled at %s %s\\n\"",__DATE__,__TIME__);
670 #  else
671                 sv_catpvf(Sv,",\"  Compiled on %s\\n\"",__DATE__);
672 #  endif
673 #endif
674                 sv_catpv(Sv, "; \
675 $\"=\"\\n    \"; \
676 @env = map { \"$_=\\\"$ENV{$_}\\\"\" } sort grep {/^PERL/} keys %ENV; \
677 print \"  \\%ENV:\\n    @env\\n\" if @env; \
678 print \"  \\@INC:\\n    @INC\\n\";");
679             }
680             else {
681                 Sv = newSVpv("config_vars(qw(",0);
682                 sv_catpv(Sv, ++s);
683                 sv_catpv(Sv, "))");
684                 s += strlen(s);
685             }
686             av_push(preambleav, Sv);
687             scriptname = BIT_BUCKET;    /* don't look for script or read stdin */
688             goto reswitch;
689         case 'x':
690             doextract = TRUE;
691             s++;
692             if (*s)
693                 cddir = savepv(s);
694             break;
695         case '-':
696             argc--,argv++;
697             goto switch_end;
698         case 0:
699             break;
700         default:
701             croak("Unrecognized switch: -%s",s);
702         }
703     }
704   switch_end:
705
706     if (!tainting && (s = getenv("PERL5OPT"))) {
707         for (;;) {
708             while (isSPACE(*s))
709                 s++;
710             if (*s == '-') {
711                 s++;
712                 if (isSPACE(*s))
713                     continue;
714             }
715             if (!*s)
716                 break;
717             if (!strchr("DIMUdmw", *s))
718                 croak("Illegal switch in PERL5OPT: -%c", *s);
719             s = moreswitches(s);
720         }
721     }
722
723     if (!scriptname)
724         scriptname = argv[0];
725     if (e_fp) {
726         if (PerlIO_flush(e_fp) || PerlIO_error(e_fp) || PerlIO_close(e_fp)) {
727 #ifndef MULTIPLICITY
728             warn("Did you forget to compile with -DMULTIPLICITY?");
729 #endif      
730             croak("Can't write to temp file for -e: %s", Strerror(errno));
731         }
732         e_fp = Nullfp;
733         argc++,argv--;
734         scriptname = e_tmpname;
735     }
736     else if (scriptname == Nullch) {
737 #ifdef MSDOS
738         if ( isatty(PerlIO_fileno(PerlIO_stdin())) )
739             moreswitches("h");
740 #endif
741         scriptname = "-";
742     }
743
744     init_perllib();
745
746     open_script(scriptname,dosearch,sv);
747
748     validate_suid(validarg, scriptname);
749
750     if (doextract)
751         find_beginning();
752
753     main_cv = compcv = (CV*)NEWSV(1104,0);
754     sv_upgrade((SV *)compcv, SVt_PVCV);
755     CvUNIQUE_on(compcv);
756
757     comppad = newAV();
758     av_push(comppad, Nullsv);
759     curpad = AvARRAY(comppad);
760     comppad_name = newAV();
761     comppad_name_fill = 0;
762     min_intro_pending = 0;
763     padix = 0;
764
765     comppadlist = newAV();
766     AvREAL_off(comppadlist);
767     av_store(comppadlist, 0, (SV*)comppad_name);
768     av_store(comppadlist, 1, (SV*)comppad);
769     CvPADLIST(compcv) = comppadlist;
770
771     boot_core_UNIVERSAL();
772     if (xsinit)
773         (*xsinit)();    /* in case linked C routines want magical variables */
774 #ifdef VMS
775     init_os_extras();
776 #endif
777
778     init_predump_symbols();
779     if (!do_undump)
780         init_postdump_symbols(argc,argv,env);
781
782     init_lexer();
783
784     /* now parse the script */
785
786     error_count = 0;
787     if (yyparse() || error_count) {
788         if (minus_c)
789             croak("%s had compilation errors.\n", origfilename);
790         else {
791             croak("Execution of %s aborted due to compilation errors.\n",
792                 origfilename);
793         }
794     }
795     curcop->cop_line = 0;
796     curstash = defstash;
797     preprocess = FALSE;
798     if (e_tmpname) {
799         (void)UNLINK(e_tmpname);
800         Safefree(e_tmpname);
801         e_tmpname = Nullch;
802     }
803
804     /* now that script is parsed, we can modify record separator */
805     SvREFCNT_dec(rs);
806     rs = SvREFCNT_inc(nrs);
807     sv_setsv(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), rs);
808
809     if (do_undump)
810         my_unexec();
811
812     if (dowarn)
813         gv_check(defstash);
814
815     LEAVE;
816     FREETMPS;
817
818 #ifdef DEBUGGING_MSTATS
819     if ((s=getenv("PERL_DEBUG_MSTATS")) && atoi(s) >= 2)
820         dump_mstats("after compilation:");
821 #endif
822
823     ENTER;
824     restartop = 0;
825     JMPENV_POP;
826     return 0;
827 }
828
829 int
830 perl_run(sv_interp)
831 PerlInterpreter *sv_interp;
832 {
833     I32 oldscope;
834     dJMPENV;
835     int ret;
836
837     if (!(curinterp = sv_interp))
838         return 255;
839
840     oldscope = scopestack_ix;
841
842     JMPENV_PUSH(ret);
843     switch (ret) {
844     case 1:
845         cxstack_ix = -1;                /* start context stack again */
846         break;
847     case 2:
848         /* my_exit() was called */
849         while (scopestack_ix > oldscope)
850             LEAVE;
851         curstash = defstash;
852         if (endav)
853             call_list(oldscope, endav);
854         FREETMPS;
855 #ifdef DEBUGGING_MSTATS
856         if (getenv("PERL_DEBUG_MSTATS"))
857             dump_mstats("after execution:  ");
858 #endif
859         JMPENV_POP;
860         return STATUS_NATIVE_EXPORT;
861     case 3:
862         if (!restartop) {
863             PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
864             FREETMPS;
865             JMPENV_POP;
866             return 1;
867         }
868         if (curstack != mainstack) {
869             dSP;
870             SWITCHSTACK(curstack, mainstack);
871         }
872         break;
873     }
874
875     DEBUG_r(PerlIO_printf(PerlIO_stderr(), "%s $` $& $' support.\n",
876                     sawampersand ? "Enabling" : "Omitting"));
877
878     if (!restartop) {
879         DEBUG_x(dump_all());
880         DEBUG(PerlIO_printf(Perl_debug_log, "\nEXECUTING...\n\n"));
881
882         if (minus_c) {
883             PerlIO_printf(PerlIO_stderr(), "%s syntax OK\n", origfilename);
884             my_exit(0);
885         }
886         if (perldb && DBsingle)
887            sv_setiv(DBsingle, 1); 
888     }
889
890     /* do it */
891
892     if (restartop) {
893         op = restartop;
894         restartop = 0;
895         runops();
896     }
897     else if (main_start) {
898         CvDEPTH(main_cv) = 1;
899         op = main_start;
900         runops();
901     }
902
903     my_exit(0);
904     /* NOTREACHED */
905     return 0;
906 }
907
908 SV*
909 perl_get_sv(name, create)
910 char* name;
911 I32 create;
912 {
913     GV* gv = gv_fetchpv(name, create, SVt_PV);
914     if (gv)
915         return GvSV(gv);
916     return Nullsv;
917 }
918
919 AV*
920 perl_get_av(name, create)
921 char* name;
922 I32 create;
923 {
924     GV* gv = gv_fetchpv(name, create, SVt_PVAV);
925     if (create)
926         return GvAVn(gv);
927     if (gv)
928         return GvAV(gv);
929     return Nullav;
930 }
931
932 HV*
933 perl_get_hv(name, create)
934 char* name;
935 I32 create;
936 {
937     GV* gv = gv_fetchpv(name, create, SVt_PVHV);
938     if (create)
939         return GvHVn(gv);
940     if (gv)
941         return GvHV(gv);
942     return Nullhv;
943 }
944
945 CV*
946 perl_get_cv(name, create)
947 char* name;
948 I32 create;
949 {
950     GV* gv = gv_fetchpv(name, create, SVt_PVCV);
951     if (create && !GvCVu(gv))
952         return newSUB(start_subparse(FALSE, 0),
953                       newSVOP(OP_CONST, 0, newSVpv(name,0)),
954                       Nullop,
955                       Nullop);
956     if (gv)
957         return GvCVu(gv);
958     return Nullcv;
959 }
960
961 /* Be sure to refetch the stack pointer after calling these routines. */
962
963 I32
964 perl_call_argv(subname, flags, argv)
965 char *subname;
966 I32 flags;              /* See G_* flags in cop.h */
967 register char **argv;   /* null terminated arg list */
968 {
969     dSP;
970
971     PUSHMARK(sp);
972     if (argv) {
973         while (*argv) {
974             XPUSHs(sv_2mortal(newSVpv(*argv,0)));
975             argv++;
976         }
977         PUTBACK;
978     }
979     return perl_call_pv(subname, flags);
980 }
981
982 I32
983 perl_call_pv(subname, flags)
984 char *subname;          /* name of the subroutine */
985 I32 flags;              /* See G_* flags in cop.h */
986 {
987     return perl_call_sv((SV*)perl_get_cv(subname, TRUE), flags);
988 }
989
990 I32
991 perl_call_method(methname, flags)
992 char *methname;         /* name of the subroutine */
993 I32 flags;              /* See G_* flags in cop.h */
994 {
995     dSP;
996     OP myop;
997     if (!op)
998         op = &myop;
999     XPUSHs(sv_2mortal(newSVpv(methname,0)));
1000     PUTBACK;
1001     pp_method();
1002     return perl_call_sv(*stack_sp--, flags);
1003 }
1004
1005 /* May be called with any of a CV, a GV, or an SV containing the name. */
1006 I32
1007 perl_call_sv(sv, flags)
1008 SV* sv;
1009 I32 flags;              /* See G_* flags in cop.h */
1010 {
1011     LOGOP myop;         /* fake syntax tree node */
1012     SV** sp = stack_sp;
1013     I32 oldmark;
1014     I32 retval;
1015     I32 oldscope;
1016     static CV *DBcv;
1017     bool oldcatch = CATCH_GET;
1018     dJMPENV;
1019     int ret;
1020
1021     if (flags & G_DISCARD) {
1022         ENTER;
1023         SAVETMPS;
1024     }
1025
1026     Zero(&myop, 1, LOGOP);
1027     myop.op_next = Nullop;
1028     if (!(flags & G_NOARGS))
1029         myop.op_flags |= OPf_STACKED;
1030     myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1031                       (flags & G_ARRAY) ? OPf_WANT_LIST :
1032                       OPf_WANT_SCALAR);
1033     SAVESPTR(op);
1034     op = (OP*)&myop;
1035
1036     EXTEND(stack_sp, 1);
1037     *++stack_sp = sv;
1038     oldmark = TOPMARK;
1039     oldscope = scopestack_ix;
1040
1041     if (perldb && curstash != debstash
1042            /* Handle first BEGIN of -d. */
1043           && (DBcv || (DBcv = GvCV(DBsub)))
1044            /* Try harder, since this may have been a sighandler, thus
1045             * curstash may be meaningless. */
1046           && (SvTYPE(sv) != SVt_PVCV || CvSTASH((CV*)sv) != debstash))
1047         op->op_private |= OPpENTERSUB_DB;
1048
1049     if (flags & G_EVAL) {
1050         cLOGOP->op_other = op;
1051         markstack_ptr--;
1052         /* we're trying to emulate pp_entertry() here */
1053         {
1054             register CONTEXT *cx;
1055             I32 gimme = GIMME_V;
1056             
1057             ENTER;
1058             SAVETMPS;
1059             
1060             push_return(op->op_next);
1061             PUSHBLOCK(cx, CXt_EVAL, stack_sp);
1062             PUSHEVAL(cx, 0, 0);
1063             eval_root = op;             /* Only needed so that goto works right. */
1064             
1065             in_eval = 1;
1066             if (flags & G_KEEPERR)
1067                 in_eval |= 4;
1068             else
1069                 sv_setpv(GvSV(errgv),"");
1070         }
1071         markstack_ptr++;
1072
1073         JMPENV_PUSH(ret);
1074         switch (ret) {
1075         case 0:
1076             break;
1077         case 1:
1078             STATUS_ALL_FAILURE;
1079             /* FALL THROUGH */
1080         case 2:
1081             /* my_exit() was called */
1082             curstash = defstash;
1083             FREETMPS;
1084             JMPENV_POP;
1085             if (statusvalue)
1086                 croak("Callback called exit");
1087             my_exit_jump();
1088             /* NOTREACHED */
1089         case 3:
1090             if (restartop) {
1091                 op = restartop;
1092                 restartop = 0;
1093                 break;
1094             }
1095             stack_sp = stack_base + oldmark;
1096             if (flags & G_ARRAY)
1097                 retval = 0;
1098             else {
1099                 retval = 1;
1100                 *++stack_sp = &sv_undef;
1101             }
1102             goto cleanup;
1103         }
1104     }
1105     else
1106         CATCH_SET(TRUE);
1107
1108     if (op == (OP*)&myop)
1109         op = pp_entersub();
1110     if (op)
1111         runops();
1112     retval = stack_sp - (stack_base + oldmark);
1113     if ((flags & G_EVAL) && !(flags & G_KEEPERR))
1114         sv_setpv(GvSV(errgv),"");
1115
1116   cleanup:
1117     if (flags & G_EVAL) {
1118         if (scopestack_ix > oldscope) {
1119             SV **newsp;
1120             PMOP *newpm;
1121             I32 gimme;
1122             register CONTEXT *cx;
1123             I32 optype;
1124
1125             POPBLOCK(cx,newpm);
1126             POPEVAL(cx);
1127             pop_return();
1128             curpm = newpm;
1129             LEAVE;
1130         }
1131         JMPENV_POP;
1132     }
1133     else
1134         CATCH_SET(oldcatch);
1135
1136     if (flags & G_DISCARD) {
1137         stack_sp = stack_base + oldmark;
1138         retval = 0;
1139         FREETMPS;
1140         LEAVE;
1141     }
1142     return retval;
1143 }
1144
1145 /* Eval a string. The G_EVAL flag is always assumed. */
1146
1147 I32
1148 perl_eval_sv(sv, flags)
1149 SV* sv;
1150 I32 flags;              /* See G_* flags in cop.h */
1151 {
1152     UNOP myop;          /* fake syntax tree node */
1153     SV** sp = stack_sp;
1154     I32 oldmark = sp - stack_base;
1155     I32 retval;
1156     I32 oldscope;
1157     dJMPENV;
1158     int ret;
1159     
1160     if (flags & G_DISCARD) {
1161         ENTER;
1162         SAVETMPS;
1163     }
1164
1165     SAVESPTR(op);
1166     op = (OP*)&myop;
1167     Zero(op, 1, UNOP);
1168     EXTEND(stack_sp, 1);
1169     *++stack_sp = sv;
1170     oldscope = scopestack_ix;
1171
1172     if (!(flags & G_NOARGS))
1173         myop.op_flags = OPf_STACKED;
1174     myop.op_next = Nullop;
1175     myop.op_type = OP_ENTEREVAL;
1176     myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1177                       (flags & G_ARRAY) ? OPf_WANT_LIST :
1178                       OPf_WANT_SCALAR);
1179     if (flags & G_KEEPERR)
1180         myop.op_flags |= OPf_SPECIAL;
1181
1182     JMPENV_PUSH(ret);
1183     switch (ret) {
1184     case 0:
1185         break;
1186     case 1:
1187         STATUS_ALL_FAILURE;
1188         /* FALL THROUGH */
1189     case 2:
1190         /* my_exit() was called */
1191         curstash = defstash;
1192         FREETMPS;
1193         JMPENV_POP;
1194         if (statusvalue)
1195             croak("Callback called exit");
1196         my_exit_jump();
1197         /* NOTREACHED */
1198     case 3:
1199         if (restartop) {
1200             op = restartop;
1201             restartop = 0;
1202             break;
1203         }
1204         stack_sp = stack_base + oldmark;
1205         if (flags & G_ARRAY)
1206             retval = 0;
1207         else {
1208             retval = 1;
1209             *++stack_sp = &sv_undef;
1210         }
1211         goto cleanup;
1212     }
1213
1214     if (op == (OP*)&myop)
1215         op = pp_entereval();
1216     if (op)
1217         runops();
1218     retval = stack_sp - (stack_base + oldmark);
1219     if (!(flags & G_KEEPERR))
1220         sv_setpv(GvSV(errgv),"");
1221
1222   cleanup:
1223     JMPENV_POP;
1224     if (flags & G_DISCARD) {
1225         stack_sp = stack_base + oldmark;
1226         retval = 0;
1227         FREETMPS;
1228         LEAVE;
1229     }
1230     return retval;
1231 }
1232
1233 SV*
1234 perl_eval_pv(p, croak_on_error)
1235 char* p;
1236 I32 croak_on_error;
1237 {
1238     dSP;
1239     SV* sv = newSVpv(p, 0);
1240
1241     PUSHMARK(sp);
1242     perl_eval_sv(sv, G_SCALAR);
1243     SvREFCNT_dec(sv);
1244
1245     SPAGAIN;
1246     sv = POPs;
1247     PUTBACK;
1248
1249     if (croak_on_error && SvTRUE(GvSV(errgv)))
1250         croak(SvPVx(GvSV(errgv), na));
1251
1252     return sv;
1253 }
1254
1255 /* Require a module. */
1256
1257 void
1258 perl_require_pv(pv)
1259 char* pv;
1260 {
1261     SV* sv = sv_newmortal();
1262     sv_setpv(sv, "require '");
1263     sv_catpv(sv, pv);
1264     sv_catpv(sv, "'");
1265     perl_eval_sv(sv, G_DISCARD);
1266 }
1267
1268 void
1269 magicname(sym,name,namlen)
1270 char *sym;
1271 char *name;
1272 I32 namlen;
1273 {
1274     register GV *gv;
1275
1276     if (gv = gv_fetchpv(sym,TRUE, SVt_PV))
1277         sv_magic(GvSV(gv), (SV*)gv, 0, name, namlen);
1278 }
1279
1280 static void
1281 usage(name)             /* XXX move this out into a module ? */
1282 char *name;
1283 {
1284     /* This message really ought to be max 23 lines.
1285      * Removed -h because the user already knows that opton. Others? */
1286     printf("\nUsage: %s [switches] [--] [programfile] [arguments]", name);
1287     printf("\n  -0[octal]       specify record separator (\\0, if no argument)");
1288     printf("\n  -a              autosplit mode with -n or -p (splits $_ into @F)");
1289     printf("\n  -c              check syntax only (runs BEGIN and END blocks)");
1290     printf("\n  -d[:debugger]   run scripts under debugger");
1291     printf("\n  -D[number/list] set debugging flags (argument is a bit mask or flags)");
1292     printf("\n  -e 'command'    one line of script. Several -e's allowed. Omit [programfile].");
1293     printf("\n  -F/pattern/     split() pattern for autosplit (-a). The //'s are optional.");
1294     printf("\n  -i[extension]   edit <> files in place (make backup if extension supplied)");
1295     printf("\n  -Idirectory     specify @INC/#include directory (may be used more then once)");
1296     printf("\n  -l[octal]       enable line ending processing, specifies line teminator");
1297     printf("\n  -[mM][-]module.. executes `use/no module...' before executing your script.");
1298     printf("\n  -n              assume 'while (<>) { ... }' loop arround your script");
1299     printf("\n  -p              assume loop like -n but print line also like sed");
1300     printf("\n  -P              run script through C preprocessor before compilation");
1301     printf("\n  -s              enable some switch parsing for switches after script name");
1302     printf("\n  -S              look for the script using PATH environment variable");
1303     printf("\n  -T              turn on tainting checks");
1304     printf("\n  -u              dump core after parsing script");
1305     printf("\n  -U              allow unsafe operations");
1306     printf("\n  -v              print version number and patchlevel of perl");
1307     printf("\n  -V[:variable]   print perl configuration information");
1308     printf("\n  -w              TURN WARNINGS ON FOR COMPILATION OF YOUR SCRIPT.");
1309     printf("\n  -x[directory]   strip off text before #!perl line and perhaps cd to directory\n");
1310 }
1311
1312 /* This routine handles any switches that can be given during run */
1313
1314 char *
1315 moreswitches(s)
1316 char *s;
1317 {
1318     I32 numlen;
1319     U32 rschar;
1320
1321     switch (*s) {
1322     case '0':
1323         rschar = scan_oct(s, 4, &numlen);
1324         SvREFCNT_dec(nrs);
1325         if (rschar & ~((U8)~0))
1326             nrs = &sv_undef;
1327         else if (!rschar && numlen >= 2)
1328             nrs = newSVpv("", 0);
1329         else {
1330             char ch = rschar;
1331             nrs = newSVpv(&ch, 1);
1332         }
1333         return s + numlen;
1334     case 'F':
1335         minus_F = TRUE;
1336         splitstr = savepv(s + 1);
1337         s += strlen(s);
1338         return s;
1339     case 'a':
1340         minus_a = TRUE;
1341         s++;
1342         return s;
1343     case 'c':
1344         minus_c = TRUE;
1345         s++;
1346         return s;
1347     case 'd':
1348         forbid_setid("-d");
1349         s++;
1350         if (*s == ':' || *s == '=')  {
1351             my_setenv("PERL5DB", form("use Devel::%s;", ++s));
1352             s += strlen(s);
1353         }
1354         if (!perldb) {
1355             perldb = TRUE;
1356             init_debugger();
1357         }
1358         return s;
1359     case 'D':
1360 #ifdef DEBUGGING
1361         forbid_setid("-D");
1362         if (isALPHA(s[1])) {
1363             static char debopts[] = "psltocPmfrxuLHXD";
1364             char *d;
1365
1366             for (s++; *s && (d = strchr(debopts,*s)); s++)
1367                 debug |= 1 << (d - debopts);
1368         }
1369         else {
1370             debug = atoi(s+1);
1371             for (s++; isDIGIT(*s); s++) ;
1372         }
1373         debug |= 0x80000000;
1374 #else
1375         warn("Recompile perl with -DDEBUGGING to use -D switch\n");
1376         for (s++; isALNUM(*s); s++) ;
1377 #endif
1378         /*SUPPRESS 530*/
1379         return s;
1380     case 'h':
1381         usage(origargv[0]);    
1382         exit(0);
1383     case 'i':
1384         if (inplace)
1385             Safefree(inplace);
1386         inplace = savepv(s+1);
1387         /*SUPPRESS 530*/
1388         for (s = inplace; *s && !isSPACE(*s); s++) ;
1389         *s = '\0';
1390         break;
1391     case 'I':
1392         forbid_setid("-I");
1393         if (*++s) {
1394             char *e, *p;
1395             for (e = s; *e && !isSPACE(*e); e++) ;
1396             p = savepvn(s, e-s);
1397             incpush(p, TRUE);
1398             Safefree(p);
1399             if (*e)
1400                 return e;
1401         }
1402         else
1403             croak("No space allowed after -I");
1404         break;
1405     case 'l':
1406         minus_l = TRUE;
1407         s++;
1408         if (ors)
1409             Safefree(ors);
1410         if (isDIGIT(*s)) {
1411             ors = savepv("\n");
1412             orslen = 1;
1413             *ors = scan_oct(s, 3 + (*s == '0'), &numlen);
1414             s += numlen;
1415         }
1416         else {
1417             if (RsPARA(nrs)) {
1418                 ors = "\n\n";
1419                 orslen = 2;
1420             }
1421             else
1422                 ors = SvPV(nrs, orslen);
1423             ors = savepvn(ors, orslen);
1424         }
1425         return s;
1426     case 'M':
1427         forbid_setid("-M");     /* XXX ? */
1428         /* FALL THROUGH */
1429     case 'm':
1430         forbid_setid("-m");     /* XXX ? */
1431         if (*++s) {
1432             char *start;
1433             char *use = "use ";
1434             /* -M-foo == 'no foo'       */
1435             if (*s == '-') { use = "no "; ++s; }
1436             Sv = newSVpv(use,0);
1437             start = s;
1438             /* We allow -M'Module qw(Foo Bar)'  */
1439             while(isALNUM(*s) || *s==':') ++s;
1440             if (*s != '=') {
1441                 sv_catpv(Sv, start);
1442                 if (*(start-1) == 'm') {
1443                     if (*s != '\0')
1444                         croak("Can't use '%c' after -mname", *s);
1445                     sv_catpv( Sv, " ()");
1446                 }
1447             } else {
1448                 sv_catpvn(Sv, start, s-start);
1449                 sv_catpv(Sv, " split(/,/,q{");
1450                 sv_catpv(Sv, ++s);
1451                 sv_catpv(Sv,    "})");
1452             }
1453             s += strlen(s);
1454             if (preambleav == NULL)
1455                 preambleav = newAV();
1456             av_push(preambleav, Sv);
1457         }
1458         else
1459             croak("No space allowed after -%c", *(s-1));
1460         return s;
1461     case 'n':
1462         minus_n = TRUE;
1463         s++;
1464         return s;
1465     case 'p':
1466         minus_p = TRUE;
1467         s++;
1468         return s;
1469     case 's':
1470         forbid_setid("-s");
1471         doswitches = TRUE;
1472         s++;
1473         return s;
1474     case 'T':
1475         if (!tainting)
1476             croak("Too late for \"-T\" option");
1477         s++;
1478         return s;
1479     case 'u':
1480         do_undump = TRUE;
1481         s++;
1482         return s;
1483     case 'U':
1484         unsafe = TRUE;
1485         s++;
1486         return s;
1487     case 'v':
1488 #if defined(SUBVERSION) && SUBVERSION > 0
1489         printf("\nThis is perl, version 5.%03d_%02d", PATCHLEVEL, SUBVERSION);
1490 #else
1491         printf("\nThis is perl, version %s",patchlevel);
1492 #endif
1493
1494         printf("\n\nCopyright 1987-1997, Larry Wall\n");
1495 #ifdef MSDOS
1496         printf("\n\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
1497 #endif
1498 #ifdef DJGPP
1499         printf("djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n");
1500 #endif
1501 #ifdef OS2
1502         printf("\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
1503             "Version 5 port Copyright (c) 1994-1997, Andreas Kaiser, Ilya Zakharevich\n");
1504 #endif
1505 #ifdef atarist
1506         printf("atariST series port, ++jrb  bammi@cadence.com\n");
1507 #endif
1508         printf("\n\
1509 Perl may be copied only under the terms of either the Artistic License or the\n\
1510 GNU General Public License, which may be found in the Perl 5.0 source kit.\n\n");
1511         exit(0);
1512     case 'w':
1513         dowarn = TRUE;
1514         s++;
1515         return s;
1516     case '*':
1517     case ' ':
1518         if (s[1] == '-')        /* Additional switches on #! line. */
1519             return s+2;
1520         break;
1521     case '-':
1522     case 0:
1523     case '\n':
1524     case '\t':
1525         break;
1526 #ifdef ALTERNATE_SHEBANG
1527     case 'S':                   /* OS/2 needs -S on "extproc" line. */
1528         break;
1529 #endif
1530     case 'P':
1531         if (preprocess)
1532             return s+1;
1533         /* FALL THROUGH */
1534     default:
1535         croak("Can't emulate -%.1s on #! line",s);
1536     }
1537     return Nullch;
1538 }
1539
1540 /* compliments of Tom Christiansen */
1541
1542 /* unexec() can be found in the Gnu emacs distribution */
1543
1544 void
1545 my_unexec()
1546 {
1547 #ifdef UNEXEC
1548     SV*    prog;
1549     SV*    file;
1550     int    status;
1551     extern int etext;
1552
1553     prog = newSVpv(BIN_EXP);
1554     sv_catpv(prog, "/perl");
1555     file = newSVpv(origfilename);
1556     sv_catpv(file, ".perldump");
1557
1558     status = unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
1559     if (status)
1560         PerlIO_printf(PerlIO_stderr(), "unexec of %s into %s failed!\n",
1561                       SvPVX(prog), SvPVX(file));
1562     exit(status);
1563 #else
1564 #  ifdef VMS
1565 #    include <lib$routines.h>
1566      lib$signal(SS$_DEBUG);  /* ssdef.h #included from vmsish.h */
1567 #  else
1568     ABORT();            /* for use with undump */
1569 #  endif
1570 #endif
1571 }
1572
1573 static void
1574 init_main_stash()
1575 {
1576     GV *gv;
1577
1578     /* Note that strtab is a rather special HV.  Assumptions are made
1579        about not iterating on it, and not adding tie magic to it.
1580        It is properly deallocated in perl_destruct() */
1581     strtab = newHV();
1582     HvSHAREKEYS_off(strtab);                    /* mandatory */
1583     Newz(506,((XPVHV*)SvANY(strtab))->xhv_array,
1584          sizeof(HE*) * (((XPVHV*)SvANY(strtab))->xhv_max + 1), char);
1585     
1586     curstash = defstash = newHV();
1587     curstname = newSVpv("main",4);
1588     gv = gv_fetchpv("main::",TRUE, SVt_PVHV);
1589     SvREFCNT_dec(GvHV(gv));
1590     GvHV(gv) = (HV*)SvREFCNT_inc(defstash);
1591     SvREADONLY_on(gv);
1592     HvNAME(defstash) = savepv("main");
1593     incgv = gv_HVadd(gv_AVadd(gv_fetchpv("INC",TRUE, SVt_PVAV)));
1594     GvMULTI_on(incgv);
1595     defgv = gv_fetchpv("_",TRUE, SVt_PVAV);
1596     errgv = gv_HVadd(gv_fetchpv("@", TRUE, SVt_PV));
1597     GvMULTI_on(errgv);
1598     sv_setpvn(GvSV(errgv), "", 0);
1599     curstash = defstash;
1600     compiling.cop_stash = defstash;
1601     debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
1602     /* We must init $/ before switches are processed. */
1603     sv_setpvn(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), "\n", 1);
1604 }
1605
1606 #ifdef CAN_PROTOTYPE
1607 static void
1608 open_script(char *scriptname, bool dosearch, SV *sv)
1609 #else
1610 static void
1611 open_script(scriptname,dosearch,sv)
1612 char *scriptname;
1613 bool dosearch;
1614 SV *sv;
1615 #endif
1616 {
1617     char *xfound = Nullch;
1618     char *xfailed = Nullch;
1619     register char *s;
1620     I32 len;
1621     int retval;
1622 #if defined(DOSISH) && !defined(OS2) && !defined(atarist)
1623 #  define SEARCH_EXTS ".bat", ".cmd", NULL
1624 #  define MAX_EXT_LEN 4
1625 #endif
1626 #ifdef VMS
1627 #  define SEARCH_EXTS ".pl", ".com", NULL
1628 #  define MAX_EXT_LEN 4
1629 #endif
1630     /* additional extensions to try in each dir if scriptname not found */
1631 #ifdef SEARCH_EXTS
1632     char *ext[] = { SEARCH_EXTS };
1633     int extidx = (strchr(scriptname,'.')) ? -1 : 0; /* has ext already */
1634 #else
1635 #  define MAX_EXT_LEN 0
1636 #endif
1637
1638 #ifdef VMS
1639     if (dosearch) {
1640         int hasdir, idx = 0, deftypes = 1;
1641
1642         hasdir = (strpbrk(scriptname,":[</") != Nullch) ;
1643         /* The first time through, just add SEARCH_EXTS to whatever we
1644          * already have, so we can check for default file types. */
1645         while (deftypes ||
1646                (!hasdir && my_trnlnm("DCL$PATH",tokenbuf,idx++)) )
1647         {
1648             if (deftypes) {
1649                 deftypes = 0;
1650                 *tokenbuf = '\0';
1651             }
1652             if ((strlen(tokenbuf) + strlen(scriptname)
1653                  + MAX_EXT_LEN) >= sizeof tokenbuf)
1654                 continue;       /* don't search dir with too-long name */
1655             strcat(tokenbuf, scriptname);
1656 #else  /* !VMS */
1657     if (dosearch && !strchr(scriptname, '/') && (s = getenv("PATH"))) {
1658         bufend = s + strlen(s);
1659         while (s < bufend) {
1660 #ifndef atarist
1661             s = delimcpy(tokenbuf, tokenbuf + sizeof tokenbuf, s, bufend,
1662 #ifdef DOSISH
1663                          ';',
1664 #else
1665                          ':',
1666 #endif
1667                          &len);
1668 #else  /* atarist */
1669             for (len = 0; *s && *s != ',' && *s != ';'; len++, s++) {
1670                 if (len < sizeof tokenbuf)
1671                     tokenbuf[len] = *s;
1672             }
1673             if (len < sizeof tokenbuf)
1674                 tokenbuf[len] = '\0';
1675 #endif /* atarist */
1676             if (s < bufend)
1677                 s++;
1678             if (len + 1 + strlen(scriptname) + MAX_EXT_LEN >= sizeof tokenbuf)
1679                 continue;       /* don't search dir with too-long name */
1680             if (len
1681 #if defined(atarist) && !defined(DOSISH)
1682                 && tokenbuf[len - 1] != '/'
1683 #endif
1684 #if defined(atarist) || defined(DOSISH)
1685                 && tokenbuf[len - 1] != '\\'
1686 #endif
1687                )
1688                 tokenbuf[len++] = '/';
1689             (void)strcpy(tokenbuf + len, scriptname);
1690 #endif  /* !VMS */
1691
1692 #ifdef SEARCH_EXTS
1693             len = strlen(tokenbuf);
1694             if (extidx > 0)     /* reset after previous loop */
1695                 extidx = 0;
1696             do {
1697 #endif
1698                 DEBUG_p(PerlIO_printf(Perl_debug_log, "Looking for %s\n",tokenbuf));
1699                 retval = Stat(tokenbuf,&statbuf);
1700 #ifdef SEARCH_EXTS
1701             } while (  retval < 0               /* not there */
1702                     && extidx>=0 && ext[extidx] /* try an extension? */
1703                     && strcpy(tokenbuf+len, ext[extidx++])
1704                 );
1705 #endif
1706             if (retval < 0)
1707                 continue;
1708             if (S_ISREG(statbuf.st_mode)
1709                 && cando(S_IRUSR,TRUE,&statbuf)
1710 #ifndef DOSISH
1711                 && cando(S_IXUSR,TRUE,&statbuf)
1712 #endif
1713                 ) {
1714                 xfound = tokenbuf;              /* bingo! */
1715                 break;
1716             }
1717             if (!xfailed)
1718                 xfailed = savepv(tokenbuf);
1719         }
1720         if (!xfound)
1721             croak("Can't execute %s", xfailed ? xfailed : scriptname );
1722         if (xfailed)
1723             Safefree(xfailed);
1724         scriptname = xfound;
1725     }
1726
1727     if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
1728         char *s = scriptname + 8;
1729         fdscript = atoi(s);
1730         while (isDIGIT(*s))
1731             s++;
1732         if (*s)
1733             scriptname = s + 1;
1734     }
1735     else
1736         fdscript = -1;
1737     origfilename = savepv(e_tmpname ? "-e" : scriptname);
1738     curcop->cop_filegv = gv_fetchfile(origfilename);
1739     if (strEQ(origfilename,"-"))
1740         scriptname = "";
1741     if (fdscript >= 0) {
1742         rsfp = PerlIO_fdopen(fdscript,"r");
1743 #if defined(HAS_FCNTL) && defined(F_SETFD)
1744         if (rsfp)
1745             fcntl(PerlIO_fileno(rsfp),F_SETFD,1);  /* ensure close-on-exec */
1746 #endif
1747     }
1748     else if (preprocess) {
1749         char *cpp_cfg = CPPSTDIN;
1750         SV *cpp = NEWSV(0,0);
1751         SV *cmd = NEWSV(0,0);
1752
1753         if (strEQ(cpp_cfg, "cppstdin"))
1754             sv_catpvf(cpp, "%s/", BIN_EXP);
1755         sv_catpv(cpp, cpp_cfg);
1756
1757         sv_catpv(sv,"-I");
1758         sv_catpv(sv,PRIVLIB_EXP);
1759
1760 #ifdef MSDOS
1761         sv_setpvf(cmd, "\
1762 sed %s -e \"/^[^#]/b\" \
1763  -e \"/^#[      ]*include[      ]/b\" \
1764  -e \"/^#[      ]*define[       ]/b\" \
1765  -e \"/^#[      ]*if[   ]/b\" \
1766  -e \"/^#[      ]*ifdef[        ]/b\" \
1767  -e \"/^#[      ]*ifndef[       ]/b\" \
1768  -e \"/^#[      ]*else/b\" \
1769  -e \"/^#[      ]*elif[         ]/b\" \
1770  -e \"/^#[      ]*undef[        ]/b\" \
1771  -e \"/^#[      ]*endif/b\" \
1772  -e \"s/^#.*//\" \
1773  %s | %_ -C %_ %s",
1774           (doextract ? "-e \"1,/^#/d\n\"" : ""),
1775 #else
1776         sv_setpvf(cmd, "\
1777 %s %s -e '/^[^#]/b' \
1778  -e '/^#[       ]*include[      ]/b' \
1779  -e '/^#[       ]*define[       ]/b' \
1780  -e '/^#[       ]*if[   ]/b' \
1781  -e '/^#[       ]*ifdef[        ]/b' \
1782  -e '/^#[       ]*ifndef[       ]/b' \
1783  -e '/^#[       ]*else/b' \
1784  -e '/^#[       ]*elif[         ]/b' \
1785  -e '/^#[       ]*undef[        ]/b' \
1786  -e '/^#[       ]*endif/b' \
1787  -e 's/^[       ]*#.*//' \
1788  %s | %_ -C %_ %s",
1789 #ifdef LOC_SED
1790           LOC_SED,
1791 #else
1792           "sed",
1793 #endif
1794           (doextract ? "-e '1,/^#/d\n'" : ""),
1795 #endif
1796           scriptname, cpp, sv, CPPMINUS);
1797         doextract = FALSE;
1798 #ifdef IAMSUID                          /* actually, this is caught earlier */
1799         if (euid != uid && !euid) {     /* if running suidperl */
1800 #ifdef HAS_SETEUID
1801             (void)seteuid(uid);         /* musn't stay setuid root */
1802 #else
1803 #ifdef HAS_SETREUID
1804             (void)setreuid((Uid_t)-1, uid);
1805 #else
1806 #ifdef HAS_SETRESUID
1807             (void)setresuid((Uid_t)-1, uid, (Uid_t)-1);
1808 #else
1809             setuid(uid);
1810 #endif
1811 #endif
1812 #endif
1813             if (geteuid() != uid)
1814                 croak("Can't do seteuid!\n");
1815         }
1816 #endif /* IAMSUID */
1817         rsfp = my_popen(SvPVX(cmd), "r");
1818         SvREFCNT_dec(cmd);
1819         SvREFCNT_dec(cpp);
1820     }
1821     else if (!*scriptname) {
1822         forbid_setid("program input from stdin");
1823         rsfp = PerlIO_stdin();
1824     }
1825     else {
1826         rsfp = PerlIO_open(scriptname,"r");
1827 #if defined(HAS_FCNTL) && defined(F_SETFD)
1828         if (rsfp)
1829             fcntl(PerlIO_fileno(rsfp),F_SETFD,1);  /* ensure close-on-exec */
1830 #endif
1831     }
1832     if (e_tmpname) {
1833         e_fp = rsfp;
1834     }
1835     if (!rsfp) {
1836 #ifdef DOSUID
1837 #ifndef IAMSUID         /* in case script is not readable before setuid */
1838         if (euid && Stat(SvPVX(GvSV(curcop->cop_filegv)),&statbuf) >= 0 &&
1839           statbuf.st_mode & (S_ISUID|S_ISGID)) {
1840             /* try again */
1841             execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
1842             croak("Can't do setuid\n");
1843         }
1844 #endif
1845 #endif
1846         croak("Can't open perl script \"%s\": %s\n",
1847           SvPVX(GvSV(curcop->cop_filegv)), Strerror(errno));
1848     }
1849 }
1850
1851 static void
1852 validate_suid(validarg, scriptname)
1853 char *validarg;
1854 char *scriptname;
1855 {
1856     int which;
1857
1858     /* do we need to emulate setuid on scripts? */
1859
1860     /* This code is for those BSD systems that have setuid #! scripts disabled
1861      * in the kernel because of a security problem.  Merely defining DOSUID
1862      * in perl will not fix that problem, but if you have disabled setuid
1863      * scripts in the kernel, this will attempt to emulate setuid and setgid
1864      * on scripts that have those now-otherwise-useless bits set.  The setuid
1865      * root version must be called suidperl or sperlN.NNN.  If regular perl
1866      * discovers that it has opened a setuid script, it calls suidperl with
1867      * the same argv that it had.  If suidperl finds that the script it has
1868      * just opened is NOT setuid root, it sets the effective uid back to the
1869      * uid.  We don't just make perl setuid root because that loses the
1870      * effective uid we had before invoking perl, if it was different from the
1871      * uid.
1872      *
1873      * DOSUID must be defined in both perl and suidperl, and IAMSUID must
1874      * be defined in suidperl only.  suidperl must be setuid root.  The
1875      * Configure script will set this up for you if you want it.
1876      */
1877
1878 #ifdef DOSUID
1879     char *s, *s2;
1880
1881     if (Fstat(PerlIO_fileno(rsfp),&statbuf) < 0)        /* normal stat is insecure */
1882         croak("Can't stat script \"%s\"",origfilename);
1883     if (fdscript < 0 && statbuf.st_mode & (S_ISUID|S_ISGID)) {
1884         I32 len;
1885
1886 #ifdef IAMSUID
1887 #ifndef HAS_SETREUID
1888         /* On this access check to make sure the directories are readable,
1889          * there is actually a small window that the user could use to make
1890          * filename point to an accessible directory.  So there is a faint
1891          * chance that someone could execute a setuid script down in a
1892          * non-accessible directory.  I don't know what to do about that.
1893          * But I don't think it's too important.  The manual lies when
1894          * it says access() is useful in setuid programs.
1895          */
1896         if (access(SvPVX(GvSV(curcop->cop_filegv)),1))  /*double check*/
1897             croak("Permission denied");
1898 #else
1899         /* If we can swap euid and uid, then we can determine access rights
1900          * with a simple stat of the file, and then compare device and
1901          * inode to make sure we did stat() on the same file we opened.
1902          * Then we just have to make sure he or she can execute it.
1903          */
1904         {
1905             struct stat tmpstatbuf;
1906
1907             if (
1908 #ifdef HAS_SETREUID
1909                 setreuid(euid,uid) < 0
1910 #else
1911 # if HAS_SETRESUID
1912                 setresuid(euid,uid,(Uid_t)-1) < 0
1913 # endif
1914 #endif
1915                 || getuid() != euid || geteuid() != uid)
1916                 croak("Can't swap uid and euid");       /* really paranoid */
1917             if (Stat(SvPVX(GvSV(curcop->cop_filegv)),&tmpstatbuf) < 0)
1918                 croak("Permission denied");     /* testing full pathname here */
1919             if (tmpstatbuf.st_dev != statbuf.st_dev ||
1920                 tmpstatbuf.st_ino != statbuf.st_ino) {
1921                 (void)PerlIO_close(rsfp);
1922                 if (rsfp = my_popen("/bin/mail root","w")) {    /* heh, heh */
1923                     PerlIO_printf(rsfp,
1924 "User %ld tried to run dev %ld ino %ld in place of dev %ld ino %ld!\n\
1925 (Filename of set-id script was %s, uid %ld gid %ld.)\n\nSincerely,\nperl\n",
1926                         (long)uid,(long)tmpstatbuf.st_dev, (long)tmpstatbuf.st_ino,
1927                         (long)statbuf.st_dev, (long)statbuf.st_ino,
1928                         SvPVX(GvSV(curcop->cop_filegv)),
1929                         (long)statbuf.st_uid, (long)statbuf.st_gid);
1930                     (void)my_pclose(rsfp);
1931                 }
1932                 croak("Permission denied\n");
1933             }
1934             if (
1935 #ifdef HAS_SETREUID
1936               setreuid(uid,euid) < 0
1937 #else
1938 # if defined(HAS_SETRESUID)
1939               setresuid(uid,euid,(Uid_t)-1) < 0
1940 # endif
1941 #endif
1942               || getuid() != uid || geteuid() != euid)
1943                 croak("Can't reswap uid and euid");
1944             if (!cando(S_IXUSR,FALSE,&statbuf))         /* can real uid exec? */
1945                 croak("Permission denied\n");
1946         }
1947 #endif /* HAS_SETREUID */
1948 #endif /* IAMSUID */
1949
1950         if (!S_ISREG(statbuf.st_mode))
1951             croak("Permission denied");
1952         if (statbuf.st_mode & S_IWOTH)
1953             croak("Setuid/gid script is writable by world");
1954         doswitches = FALSE;             /* -s is insecure in suid */
1955         curcop->cop_line++;
1956         if (sv_gets(linestr, rsfp, 0) == Nullch ||
1957           strnNE(SvPV(linestr,na),"#!",2) )     /* required even on Sys V */
1958             croak("No #! line");
1959         s = SvPV(linestr,na)+2;
1960         if (*s == ' ') s++;
1961         while (!isSPACE(*s)) s++;
1962         for (s2 = s;  (s2 > SvPV(linestr,na)+2 &&
1963                        (isDIGIT(s2[-1]) || strchr("._-", s2[-1])));  s2--) ;
1964         if (strnNE(s2-4,"perl",4) && strnNE(s-9,"perl",4))  /* sanity check */
1965             croak("Not a perl script");
1966         while (*s == ' ' || *s == '\t') s++;
1967         /*
1968          * #! arg must be what we saw above.  They can invoke it by
1969          * mentioning suidperl explicitly, but they may not add any strange
1970          * arguments beyond what #! says if they do invoke suidperl that way.
1971          */
1972         len = strlen(validarg);
1973         if (strEQ(validarg," PHOOEY ") ||
1974             strnNE(s,validarg,len) || !isSPACE(s[len]))
1975             croak("Args must match #! line");
1976
1977 #ifndef IAMSUID
1978         if (euid != uid && (statbuf.st_mode & S_ISUID) &&
1979             euid == statbuf.st_uid)
1980             if (!do_undump)
1981                 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
1982 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
1983 #endif /* IAMSUID */
1984
1985         if (euid) {     /* oops, we're not the setuid root perl */
1986             (void)PerlIO_close(rsfp);
1987 #ifndef IAMSUID
1988             /* try again */
1989             execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
1990 #endif
1991             croak("Can't do setuid\n");
1992         }
1993
1994         if (statbuf.st_mode & S_ISGID && statbuf.st_gid != egid) {
1995 #ifdef HAS_SETEGID
1996             (void)setegid(statbuf.st_gid);
1997 #else
1998 #ifdef HAS_SETREGID
1999            (void)setregid((Gid_t)-1,statbuf.st_gid);
2000 #else
2001 #ifdef HAS_SETRESGID
2002            (void)setresgid((Gid_t)-1,statbuf.st_gid,(Gid_t)-1);
2003 #else
2004             setgid(statbuf.st_gid);
2005 #endif
2006 #endif
2007 #endif
2008             if (getegid() != statbuf.st_gid)
2009                 croak("Can't do setegid!\n");
2010         }
2011         if (statbuf.st_mode & S_ISUID) {
2012             if (statbuf.st_uid != euid)
2013 #ifdef HAS_SETEUID
2014                 (void)seteuid(statbuf.st_uid);  /* all that for this */
2015 #else
2016 #ifdef HAS_SETREUID
2017                 (void)setreuid((Uid_t)-1,statbuf.st_uid);
2018 #else
2019 #ifdef HAS_SETRESUID
2020                 (void)setresuid((Uid_t)-1,statbuf.st_uid,(Uid_t)-1);
2021 #else
2022                 setuid(statbuf.st_uid);
2023 #endif
2024 #endif
2025 #endif
2026             if (geteuid() != statbuf.st_uid)
2027                 croak("Can't do seteuid!\n");
2028         }
2029         else if (uid) {                 /* oops, mustn't run as root */
2030 #ifdef HAS_SETEUID
2031           (void)seteuid((Uid_t)uid);
2032 #else
2033 #ifdef HAS_SETREUID
2034           (void)setreuid((Uid_t)-1,(Uid_t)uid);
2035 #else
2036 #ifdef HAS_SETRESUID
2037           (void)setresuid((Uid_t)-1,(Uid_t)uid,(Uid_t)-1);
2038 #else
2039           setuid((Uid_t)uid);
2040 #endif
2041 #endif
2042 #endif
2043             if (geteuid() != uid)
2044                 croak("Can't do seteuid!\n");
2045         }
2046         init_ids();
2047         if (!cando(S_IXUSR,TRUE,&statbuf))
2048             croak("Permission denied\n");       /* they can't do this */
2049     }
2050 #ifdef IAMSUID
2051     else if (preprocess)
2052         croak("-P not allowed for setuid/setgid script\n");
2053     else if (fdscript >= 0)
2054         croak("fd script not allowed in suidperl\n");
2055     else
2056         croak("Script is not setuid/setgid in suidperl\n");
2057
2058     /* We absolutely must clear out any saved ids here, so we */
2059     /* exec the real perl, substituting fd script for scriptname. */
2060     /* (We pass script name as "subdir" of fd, which perl will grok.) */
2061     PerlIO_rewind(rsfp);
2062     lseek(PerlIO_fileno(rsfp),(Off_t)0,0);  /* just in case rewind didn't */
2063     for (which = 1; origargv[which] && origargv[which] != scriptname; which++) ;
2064     if (!origargv[which])
2065         croak("Permission denied");
2066     origargv[which] = savepv(form("/dev/fd/%d/%s",
2067                                   PerlIO_fileno(rsfp), origargv[which]));
2068 #if defined(HAS_FCNTL) && defined(F_SETFD)
2069     fcntl(PerlIO_fileno(rsfp),F_SETFD,0);       /* ensure no close-on-exec */
2070 #endif
2071     execv(form("%s/perl%s", BIN_EXP, patchlevel), origargv);    /* try again */
2072     croak("Can't do setuid\n");
2073 #endif /* IAMSUID */
2074 #else /* !DOSUID */
2075     if (euid != uid || egid != gid) {   /* (suidperl doesn't exist, in fact) */
2076 #ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
2077         Fstat(PerlIO_fileno(rsfp),&statbuf);    /* may be either wrapped or real suid */
2078         if ((euid != uid && euid == statbuf.st_uid && statbuf.st_mode & S_ISUID)
2079             ||
2080             (egid != gid && egid == statbuf.st_gid && statbuf.st_mode & S_ISGID)
2081            )
2082             if (!do_undump)
2083                 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2084 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2085 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
2086         /* not set-id, must be wrapped */
2087     }
2088 #endif /* DOSUID */
2089 }
2090
2091 static void
2092 find_beginning()
2093 {
2094     register char *s, *s2;
2095
2096     /* skip forward in input to the real script? */
2097
2098     forbid_setid("-x");
2099     while (doextract) {
2100         if ((s = sv_gets(linestr, rsfp, 0)) == Nullch)
2101             croak("No Perl script found in input\n");
2102         if (*s == '#' && s[1] == '!' && (s = instr(s,"perl"))) {
2103             PerlIO_ungetc(rsfp, '\n');          /* to keep line count right */
2104             doextract = FALSE;
2105             while (*s && !(isSPACE (*s) || *s == '#')) s++;
2106             s2 = s;
2107             while (*s == ' ' || *s == '\t') s++;
2108             if (*s++ == '-') {
2109                 while (isDIGIT(s2[-1]) || strchr("-._", s2[-1])) s2--;
2110                 if (strnEQ(s2-4,"perl",4))
2111                     /*SUPPRESS 530*/
2112                     while (s = moreswitches(s)) ;
2113             }
2114             if (cddir && chdir(cddir) < 0)
2115                 croak("Can't chdir to %s",cddir);
2116         }
2117     }
2118 }
2119
2120 static void
2121 init_ids()
2122 {
2123     uid = (int)getuid();
2124     euid = (int)geteuid();
2125     gid = (int)getgid();
2126     egid = (int)getegid();
2127 #ifdef VMS
2128     uid |= gid << 16;
2129     euid |= egid << 16;
2130 #endif
2131     tainting |= (uid && (euid != uid || egid != gid));
2132 }
2133
2134 static void
2135 forbid_setid(s)
2136 char *s;
2137 {
2138     if (euid != uid)
2139         croak("No %s allowed while running setuid", s);
2140     if (egid != gid)
2141         croak("No %s allowed while running setgid", s);
2142 }
2143
2144 static void
2145 init_debugger()
2146 {
2147     curstash = debstash;
2148     dbargs = GvAV(gv_AVadd((gv_fetchpv("args", GV_ADDMULTI, SVt_PVAV))));
2149     AvREAL_off(dbargs);
2150     DBgv = gv_fetchpv("DB", GV_ADDMULTI, SVt_PVGV);
2151     DBline = gv_fetchpv("dbline", GV_ADDMULTI, SVt_PVAV);
2152     DBsub = gv_HVadd(gv_fetchpv("sub", GV_ADDMULTI, SVt_PVHV));
2153     DBsingle = GvSV((gv_fetchpv("single", GV_ADDMULTI, SVt_PV)));
2154     sv_setiv(DBsingle, 0); 
2155     DBtrace = GvSV((gv_fetchpv("trace", GV_ADDMULTI, SVt_PV)));
2156     sv_setiv(DBtrace, 0); 
2157     DBsignal = GvSV((gv_fetchpv("signal", GV_ADDMULTI, SVt_PV)));
2158     sv_setiv(DBsignal, 0); 
2159     curstash = defstash;
2160 }
2161
2162 static void
2163 init_stacks()
2164 {
2165     curstack = newAV();
2166     mainstack = curstack;               /* remember in case we switch stacks */
2167     AvREAL_off(curstack);               /* not a real array */
2168     av_extend(curstack,127);
2169
2170     stack_base = AvARRAY(curstack);
2171     stack_sp = stack_base;
2172     stack_max = stack_base + 127;
2173
2174     cxstack_max = 8192 / sizeof(CONTEXT) - 2;   /* Use most of 8K. */
2175     New(50,cxstack,cxstack_max + 1,CONTEXT);
2176     cxstack_ix  = -1;
2177
2178     New(50,tmps_stack,128,SV*);
2179     tmps_ix = -1;
2180     tmps_max = 128;
2181
2182     DEBUG( {
2183         New(51,debname,128,char);
2184         New(52,debdelim,128,char);
2185     } )
2186
2187     /*
2188      * The following stacks almost certainly should be per-interpreter,
2189      * but for now they're not.  XXX
2190      */
2191
2192     if (markstack) {
2193         markstack_ptr = markstack;
2194     } else {
2195         New(54,markstack,64,I32);
2196         markstack_ptr = markstack;
2197         markstack_max = markstack + 64;
2198     }
2199
2200     if (scopestack) {
2201         scopestack_ix = 0;
2202     } else {
2203         New(54,scopestack,32,I32);
2204         scopestack_ix = 0;
2205         scopestack_max = 32;
2206     }
2207
2208     if (savestack) {
2209         savestack_ix = 0;
2210     } else {
2211         New(54,savestack,128,ANY);
2212         savestack_ix = 0;
2213         savestack_max = 128;
2214     }
2215
2216     if (retstack) {
2217         retstack_ix = 0;
2218     } else {
2219         New(54,retstack,16,OP*);
2220         retstack_ix = 0;
2221         retstack_max = 16;
2222     }
2223 }
2224
2225 static void
2226 nuke_stacks()
2227 {
2228     Safefree(cxstack);
2229     Safefree(tmps_stack);
2230     DEBUG( {
2231         Safefree(debname);
2232         Safefree(debdelim);
2233     } )
2234 }
2235
2236 static PerlIO *tmpfp;  /* moved outside init_lexer() because of UNICOS bug */
2237
2238 static void
2239 init_lexer()
2240 {
2241     tmpfp = rsfp;
2242     lex_start(linestr);
2243     rsfp = tmpfp;
2244     subname = newSVpv("main",4);
2245 }
2246
2247 static void
2248 init_predump_symbols()
2249 {
2250     GV *tmpgv;
2251     GV *othergv;
2252
2253     sv_setpvn(GvSV(gv_fetchpv("\"", TRUE, SVt_PV)), " ", 1);
2254
2255     stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
2256     GvMULTI_on(stdingv);
2257     IoIFP(GvIOp(stdingv)) = PerlIO_stdin();
2258     tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
2259     GvMULTI_on(tmpgv);
2260     GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(stdingv));
2261
2262     tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
2263     GvMULTI_on(tmpgv);
2264     IoOFP(GvIOp(tmpgv)) = IoIFP(GvIOp(tmpgv)) = PerlIO_stdout();
2265     setdefout(tmpgv);
2266     tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
2267     GvMULTI_on(tmpgv);
2268     GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(defoutgv));
2269
2270     othergv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
2271     GvMULTI_on(othergv);
2272     IoOFP(GvIOp(othergv)) = IoIFP(GvIOp(othergv)) = PerlIO_stderr();
2273     tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
2274     GvMULTI_on(tmpgv);
2275     GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(othergv));
2276
2277     statname = NEWSV(66,0);             /* last filename we did stat on */
2278
2279     if (!osname)
2280         osname = savepv(OSNAME);
2281 }
2282
2283 static void
2284 init_postdump_symbols(argc,argv,env)
2285 register int argc;
2286 register char **argv;
2287 register char **env;
2288 {
2289     char *s;
2290     SV *sv;
2291     GV* tmpgv;
2292
2293     argc--,argv++;      /* skip name of script */
2294     if (doswitches) {
2295         for (; argc > 0 && **argv == '-'; argc--,argv++) {
2296             if (!argv[0][1])
2297                 break;
2298             if (argv[0][1] == '-') {
2299                 argc--,argv++;
2300                 break;
2301             }
2302             if (s = strchr(argv[0], '=')) {
2303                 *s++ = '\0';
2304                 sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),s);
2305             }
2306             else
2307                 sv_setiv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),1);
2308         }
2309     }
2310     toptarget = NEWSV(0,0);
2311     sv_upgrade(toptarget, SVt_PVFM);
2312     sv_setpvn(toptarget, "", 0);
2313     bodytarget = NEWSV(0,0);
2314     sv_upgrade(bodytarget, SVt_PVFM);
2315     sv_setpvn(bodytarget, "", 0);
2316     formtarget = bodytarget;
2317
2318     TAINT;
2319     if (tmpgv = gv_fetchpv("0",TRUE, SVt_PV)) {
2320         sv_setpv(GvSV(tmpgv),origfilename);
2321         magicname("0", "0", 1);
2322     }
2323     if (tmpgv = gv_fetchpv("\030",TRUE, SVt_PV))
2324         sv_setpv(GvSV(tmpgv),origargv[0]);
2325     if (argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV)) {
2326         GvMULTI_on(argvgv);
2327         (void)gv_AVadd(argvgv);
2328         av_clear(GvAVn(argvgv));
2329         for (; argc > 0; argc--,argv++) {
2330             av_push(GvAVn(argvgv),newSVpv(argv[0],0));
2331         }
2332     }
2333     if (envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV)) {
2334         HV *hv;
2335         GvMULTI_on(envgv);
2336         hv = GvHVn(envgv);
2337         hv_magic(hv, envgv, 'E');
2338 #ifndef VMS  /* VMS doesn't have environ array */
2339         /* Note that if the supplied env parameter is actually a copy
2340            of the global environ then it may now point to free'd memory
2341            if the environment has been modified since. To avoid this
2342            problem we treat env==NULL as meaning 'use the default'
2343         */
2344         if (!env)
2345             env = environ;
2346         if (env != environ)
2347             environ[0] = Nullch;
2348         for (; *env; env++) {
2349             if (!(s = strchr(*env,'=')))
2350                 continue;
2351             *s++ = '\0';
2352 #ifdef WIN32
2353             (void)strupr(*env);
2354 #endif
2355             sv = newSVpv(s--,0);
2356             (void)hv_store(hv, *env, s - *env, sv, 0);
2357             *s = '=';
2358         }
2359 #endif
2360 #ifdef DYNAMIC_ENV_FETCH
2361         HvNAME(hv) = savepv(ENV_HV_NAME);
2362 #endif
2363     }
2364     TAINT_NOT;
2365     if (tmpgv = gv_fetchpv("$",TRUE, SVt_PV))
2366         sv_setiv(GvSV(tmpgv), (IV)getpid());
2367 }
2368
2369 static void
2370 init_perllib()
2371 {
2372     char *s;
2373     if (!tainting) {
2374 #ifndef VMS
2375         s = getenv("PERL5LIB");
2376         if (s)
2377             incpush(s, TRUE);
2378         else
2379             incpush(getenv("PERLLIB"), FALSE);
2380 #else /* VMS */
2381         /* Treat PERL5?LIB as a possible search list logical name -- the
2382          * "natural" VMS idiom for a Unix path string.  We allow each
2383          * element to be a set of |-separated directories for compatibility.
2384          */
2385         char buf[256];
2386         int idx = 0;
2387         if (my_trnlnm("PERL5LIB",buf,0))
2388             do { incpush(buf,TRUE); } while (my_trnlnm("PERL5LIB",buf,++idx));
2389         else
2390             while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE);
2391 #endif /* VMS */
2392     }
2393
2394 /* Use the ~-expanded versions of APPLIB (undocumented),
2395     ARCHLIB PRIVLIB SITEARCH SITELIB and OLDARCHLIB
2396 */
2397 #ifdef APPLLIB_EXP
2398     incpush(APPLLIB_EXP, FALSE);
2399 #endif
2400
2401 #ifdef ARCHLIB_EXP
2402     incpush(ARCHLIB_EXP, FALSE);
2403 #endif
2404 #ifndef PRIVLIB_EXP
2405 #define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
2406 #endif
2407     incpush(PRIVLIB_EXP, FALSE);
2408
2409 #ifdef SITEARCH_EXP
2410     incpush(SITEARCH_EXP, FALSE);
2411 #endif
2412 #ifdef SITELIB_EXP
2413     incpush(SITELIB_EXP, FALSE);
2414 #endif
2415 #ifdef OLDARCHLIB_EXP  /* 5.00[01] compatibility */
2416     incpush(OLDARCHLIB_EXP, FALSE);
2417 #endif
2418     
2419     if (!tainting)
2420         incpush(".", FALSE);
2421 }
2422
2423 #if defined(DOSISH)
2424 #    define PERLLIB_SEP ';'
2425 #else
2426 #  if defined(VMS)
2427 #    define PERLLIB_SEP '|'
2428 #  else
2429 #    define PERLLIB_SEP ':'
2430 #  endif
2431 #endif
2432 #ifndef PERLLIB_MANGLE
2433 #  define PERLLIB_MANGLE(s,n) (s)
2434 #endif 
2435
2436 static void
2437 incpush(p, addsubdirs)
2438 char *p;
2439 int addsubdirs;
2440 {
2441     SV *subdir = Nullsv;
2442     static char *archpat_auto;
2443
2444     if (!p)
2445         return;
2446
2447     if (addsubdirs) {
2448         subdir = newSV(0);
2449         if (!archpat_auto) {
2450             STRLEN len = (sizeof(ARCHNAME) + strlen(patchlevel)
2451                           + sizeof("//auto"));
2452             New(55, archpat_auto, len, char);
2453             sprintf(archpat_auto, "/%s/%s/auto", ARCHNAME, patchlevel);
2454 #ifdef VMS
2455         for (len = sizeof(ARCHNAME) + 2;
2456              archpat_auto[len] != '\0' && archpat_auto[len] != '/'; len++)
2457                 if (archpat_auto[len] == '.') archpat_auto[len] = '_';
2458 #endif
2459         }
2460     }
2461
2462     /* Break at all separators */
2463     while (p && *p) {
2464         SV *libdir = newSV(0);
2465         char *s;
2466
2467         /* skip any consecutive separators */
2468         while ( *p == PERLLIB_SEP ) {
2469             /* Uncomment the next line for PATH semantics */
2470             /* av_push(GvAVn(incgv), newSVpv(".", 1)); */
2471             p++;
2472         }
2473
2474         if ( (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
2475             sv_setpvn(libdir, PERLLIB_MANGLE(p, (STRLEN)(s - p)),
2476                       (STRLEN)(s - p));
2477             p = s + 1;
2478         }
2479         else {
2480             sv_setpv(libdir, PERLLIB_MANGLE(p, 0));
2481             p = Nullch; /* break out */
2482         }
2483
2484         /*
2485          * BEFORE pushing libdir onto @INC we may first push version- and
2486          * archname-specific sub-directories.
2487          */
2488         if (addsubdirs) {
2489             struct stat tmpstatbuf;
2490 #ifdef VMS
2491             char *unix;
2492             STRLEN len;
2493
2494             if ((unix = tounixspec_ts(SvPV(libdir,na),Nullch)) != Nullch) {
2495                 len = strlen(unix);
2496                 while (unix[len-1] == '/') len--;  /* Cosmetic */
2497                 sv_usepvn(libdir,unix,len);
2498             }
2499             else
2500                 PerlIO_printf(PerlIO_stderr(),
2501                               "Failed to unixify @INC element \"%s\"\n",
2502                               SvPV(libdir,na));
2503 #endif
2504             /* .../archname/version if -d .../archname/version/auto */
2505             sv_setsv(subdir, libdir);
2506             sv_catpv(subdir, archpat_auto);
2507             if (Stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2508                   S_ISDIR(tmpstatbuf.st_mode))
2509                 av_push(GvAVn(incgv),
2510                         newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2511
2512             /* .../archname if -d .../archname/auto */
2513             sv_insert(subdir, SvCUR(libdir) + sizeof(ARCHNAME),
2514                       strlen(patchlevel) + 1, "", 0);
2515             if (Stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2516                   S_ISDIR(tmpstatbuf.st_mode))
2517                 av_push(GvAVn(incgv),
2518                         newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2519         }
2520
2521         /* finally push this lib directory on the end of @INC */
2522         av_push(GvAVn(incgv), libdir);
2523     }
2524
2525     SvREFCNT_dec(subdir);
2526 }
2527
2528 void
2529 call_list(oldscope, list)
2530 I32 oldscope;
2531 AV* list;
2532 {
2533     line_t oldline = curcop->cop_line;
2534     STRLEN len;
2535     dJMPENV;
2536     int ret;
2537
2538     while (AvFILL(list) >= 0) {
2539         CV *cv = (CV*)av_shift(list);
2540
2541         SAVEFREESV(cv);
2542
2543         JMPENV_PUSH(ret);
2544         switch (ret) {
2545         case 0: {
2546                 SV* atsv = GvSV(errgv);
2547                 PUSHMARK(stack_sp);
2548                 perl_call_sv((SV*)cv, G_EVAL|G_DISCARD);
2549                 (void)SvPV(atsv, len);
2550                 if (len) {
2551                     JMPENV_POP;
2552                     curcop = &compiling;
2553                     curcop->cop_line = oldline;
2554                     if (list == beginav)
2555                         sv_catpv(atsv, "BEGIN failed--compilation aborted");
2556                     else
2557                         sv_catpv(atsv, "END failed--cleanup aborted");
2558                     while (scopestack_ix > oldscope)
2559                         LEAVE;
2560                     croak("%s", SvPVX(atsv));
2561                 }
2562             }
2563             break;
2564         case 1:
2565             STATUS_ALL_FAILURE;
2566             /* FALL THROUGH */
2567         case 2:
2568             /* my_exit() was called */
2569             while (scopestack_ix > oldscope)
2570                 LEAVE;
2571             curstash = defstash;
2572             if (endav)
2573                 call_list(oldscope, endav);
2574             FREETMPS;
2575             JMPENV_POP;
2576             curcop = &compiling;
2577             curcop->cop_line = oldline;
2578             if (statusvalue) {
2579                 if (list == beginav)
2580                     croak("BEGIN failed--compilation aborted");
2581                 else
2582                     croak("END failed--cleanup aborted");
2583             }
2584             my_exit_jump();
2585             /* NOTREACHED */
2586         case 3:
2587             if (!restartop) {
2588                 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
2589                 FREETMPS;
2590                 break;
2591             }
2592             JMPENV_POP;
2593             curcop = &compiling;
2594             curcop->cop_line = oldline;
2595             JMPENV_JUMP(3);
2596         }
2597         JMPENV_POP;
2598     }
2599 }
2600
2601 void
2602 my_exit(status)
2603 U32 status;
2604 {
2605     switch (status) {
2606     case 0:
2607         STATUS_ALL_SUCCESS;
2608         break;
2609     case 1:
2610         STATUS_ALL_FAILURE;
2611         break;
2612     default:
2613         STATUS_NATIVE_SET(status);
2614         break;
2615     }
2616     my_exit_jump();
2617 }
2618
2619 void
2620 my_failure_exit()
2621 {
2622 #ifdef VMS
2623     if (vaxc$errno & 1) {
2624         if (STATUS_NATIVE & 1)          /* fortuitiously includes "-1" */
2625             STATUS_NATIVE_SET(44);
2626     }
2627     else {
2628         if (!vaxc$errno && errno)       /* unlikely */
2629             STATUS_NATIVE_SET(44);
2630         else
2631             STATUS_NATIVE_SET(vaxc$errno);
2632     }
2633 #else
2634     if (errno & 255)
2635         STATUS_POSIX_SET(errno);
2636     else if (STATUS_POSIX == 0)
2637         STATUS_POSIX_SET(255);
2638 #endif
2639     my_exit_jump();
2640 }
2641
2642 static void
2643 my_exit_jump()
2644 {
2645     register CONTEXT *cx;
2646     I32 gimme;
2647     SV **newsp;
2648
2649     if (e_tmpname) {
2650         if (e_fp) {
2651             PerlIO_close(e_fp);
2652             e_fp = Nullfp;
2653         }
2654         (void)UNLINK(e_tmpname);
2655         Safefree(e_tmpname);
2656         e_tmpname = Nullch;
2657     }
2658
2659     if (cxstack_ix >= 0) {
2660         if (cxstack_ix > 0)
2661             dounwind(0);
2662         POPBLOCK(cx,curpm);
2663         LEAVE;
2664     }
2665
2666     JMPENV_JUMP(2);
2667 }