7c84173abc824395027cb3adf551abd1d051af9b
[p5sagit/p5-mst-13.2.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     OP* oldop = op;
1021
1022     if (flags & G_DISCARD) {
1023         ENTER;
1024         SAVETMPS;
1025     }
1026
1027     Zero(&myop, 1, LOGOP);
1028     myop.op_next = Nullop;
1029     if (!(flags & G_NOARGS))
1030         myop.op_flags |= OPf_STACKED;
1031     myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1032                       (flags & G_ARRAY) ? OPf_WANT_LIST :
1033                       OPf_WANT_SCALAR);
1034     SAVESPTR(op);
1035     op = (OP*)&myop;
1036
1037     EXTEND(stack_sp, 1);
1038     *++stack_sp = sv;
1039     oldmark = TOPMARK;
1040     oldscope = scopestack_ix;
1041
1042     if (perldb && curstash != debstash
1043            /* Handle first BEGIN of -d. */
1044           && (DBcv || (DBcv = GvCV(DBsub)))
1045            /* Try harder, since this may have been a sighandler, thus
1046             * curstash may be meaningless. */
1047           && (SvTYPE(sv) != SVt_PVCV || CvSTASH((CV*)sv) != debstash))
1048         op->op_private |= OPpENTERSUB_DB;
1049
1050     if (flags & G_EVAL) {
1051         cLOGOP->op_other = op;
1052         markstack_ptr--;
1053         /* we're trying to emulate pp_entertry() here */
1054         {
1055             register CONTEXT *cx;
1056             I32 gimme = GIMME_V;
1057             
1058             ENTER;
1059             SAVETMPS;
1060             
1061             push_return(op->op_next);
1062             PUSHBLOCK(cx, CXt_EVAL, stack_sp);
1063             PUSHEVAL(cx, 0, 0);
1064             eval_root = op;             /* Only needed so that goto works right. */
1065             
1066             in_eval = 1;
1067             if (flags & G_KEEPERR)
1068                 in_eval |= 4;
1069             else
1070                 sv_setpv(GvSV(errgv),"");
1071         }
1072         markstack_ptr++;
1073
1074         JMPENV_PUSH(ret);
1075         switch (ret) {
1076         case 0:
1077             break;
1078         case 1:
1079             STATUS_ALL_FAILURE;
1080             /* FALL THROUGH */
1081         case 2:
1082             /* my_exit() was called */
1083             curstash = defstash;
1084             FREETMPS;
1085             JMPENV_POP;
1086             if (statusvalue)
1087                 croak("Callback called exit");
1088             my_exit_jump();
1089             /* NOTREACHED */
1090         case 3:
1091             if (restartop) {
1092                 op = restartop;
1093                 restartop = 0;
1094                 break;
1095             }
1096             stack_sp = stack_base + oldmark;
1097             if (flags & G_ARRAY)
1098                 retval = 0;
1099             else {
1100                 retval = 1;
1101                 *++stack_sp = &sv_undef;
1102             }
1103             goto cleanup;
1104         }
1105     }
1106     else
1107         CATCH_SET(TRUE);
1108
1109     if (op == (OP*)&myop)
1110         op = pp_entersub();
1111     if (op)
1112         runops();
1113     retval = stack_sp - (stack_base + oldmark);
1114     if ((flags & G_EVAL) && !(flags & G_KEEPERR))
1115         sv_setpv(GvSV(errgv),"");
1116
1117   cleanup:
1118     if (flags & G_EVAL) {
1119         if (scopestack_ix > oldscope) {
1120             SV **newsp;
1121             PMOP *newpm;
1122             I32 gimme;
1123             register CONTEXT *cx;
1124             I32 optype;
1125
1126             POPBLOCK(cx,newpm);
1127             POPEVAL(cx);
1128             pop_return();
1129             curpm = newpm;
1130             LEAVE;
1131         }
1132         JMPENV_POP;
1133     }
1134     else
1135         CATCH_SET(oldcatch);
1136
1137     if (flags & G_DISCARD) {
1138         stack_sp = stack_base + oldmark;
1139         retval = 0;
1140         FREETMPS;
1141         LEAVE;
1142     }
1143     op = oldop;
1144     return retval;
1145 }
1146
1147 /* Eval a string. The G_EVAL flag is always assumed. */
1148
1149 I32
1150 perl_eval_sv(sv, flags)
1151 SV* sv;
1152 I32 flags;              /* See G_* flags in cop.h */
1153 {
1154     UNOP myop;          /* fake syntax tree node */
1155     SV** sp = stack_sp;
1156     I32 oldmark = sp - stack_base;
1157     I32 retval;
1158     I32 oldscope;
1159     dJMPENV;
1160     int ret;
1161     
1162     if (flags & G_DISCARD) {
1163         ENTER;
1164         SAVETMPS;
1165     }
1166
1167     SAVESPTR(op);
1168     op = (OP*)&myop;
1169     Zero(op, 1, UNOP);
1170     EXTEND(stack_sp, 1);
1171     *++stack_sp = sv;
1172     oldscope = scopestack_ix;
1173
1174     if (!(flags & G_NOARGS))
1175         myop.op_flags = OPf_STACKED;
1176     myop.op_next = Nullop;
1177     myop.op_type = OP_ENTEREVAL;
1178     myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1179                       (flags & G_ARRAY) ? OPf_WANT_LIST :
1180                       OPf_WANT_SCALAR);
1181     if (flags & G_KEEPERR)
1182         myop.op_flags |= OPf_SPECIAL;
1183
1184     JMPENV_PUSH(ret);
1185     switch (ret) {
1186     case 0:
1187         break;
1188     case 1:
1189         STATUS_ALL_FAILURE;
1190         /* FALL THROUGH */
1191     case 2:
1192         /* my_exit() was called */
1193         curstash = defstash;
1194         FREETMPS;
1195         JMPENV_POP;
1196         if (statusvalue)
1197             croak("Callback called exit");
1198         my_exit_jump();
1199         /* NOTREACHED */
1200     case 3:
1201         if (restartop) {
1202             op = restartop;
1203             restartop = 0;
1204             break;
1205         }
1206         stack_sp = stack_base + oldmark;
1207         if (flags & G_ARRAY)
1208             retval = 0;
1209         else {
1210             retval = 1;
1211             *++stack_sp = &sv_undef;
1212         }
1213         goto cleanup;
1214     }
1215
1216     if (op == (OP*)&myop)
1217         op = pp_entereval();
1218     if (op)
1219         runops();
1220     retval = stack_sp - (stack_base + oldmark);
1221     if (!(flags & G_KEEPERR))
1222         sv_setpv(GvSV(errgv),"");
1223
1224   cleanup:
1225     JMPENV_POP;
1226     if (flags & G_DISCARD) {
1227         stack_sp = stack_base + oldmark;
1228         retval = 0;
1229         FREETMPS;
1230         LEAVE;
1231     }
1232     return retval;
1233 }
1234
1235 SV*
1236 perl_eval_pv(p, croak_on_error)
1237 char* p;
1238 I32 croak_on_error;
1239 {
1240     dSP;
1241     SV* sv = newSVpv(p, 0);
1242
1243     PUSHMARK(sp);
1244     perl_eval_sv(sv, G_SCALAR);
1245     SvREFCNT_dec(sv);
1246
1247     SPAGAIN;
1248     sv = POPs;
1249     PUTBACK;
1250
1251     if (croak_on_error && SvTRUE(GvSV(errgv)))
1252         croak(SvPVx(GvSV(errgv), na));
1253
1254     return sv;
1255 }
1256
1257 /* Require a module. */
1258
1259 void
1260 perl_require_pv(pv)
1261 char* pv;
1262 {
1263     SV* sv = sv_newmortal();
1264     sv_setpv(sv, "require '");
1265     sv_catpv(sv, pv);
1266     sv_catpv(sv, "'");
1267     perl_eval_sv(sv, G_DISCARD);
1268 }
1269
1270 void
1271 magicname(sym,name,namlen)
1272 char *sym;
1273 char *name;
1274 I32 namlen;
1275 {
1276     register GV *gv;
1277
1278     if (gv = gv_fetchpv(sym,TRUE, SVt_PV))
1279         sv_magic(GvSV(gv), (SV*)gv, 0, name, namlen);
1280 }
1281
1282 static void
1283 usage(name)             /* XXX move this out into a module ? */
1284 char *name;
1285 {
1286     /* This message really ought to be max 23 lines.
1287      * Removed -h because the user already knows that opton. Others? */
1288     printf("\nUsage: %s [switches] [--] [programfile] [arguments]", name);
1289     printf("\n  -0[octal]       specify record separator (\\0, if no argument)");
1290     printf("\n  -a              autosplit mode with -n or -p (splits $_ into @F)");
1291     printf("\n  -c              check syntax only (runs BEGIN and END blocks)");
1292     printf("\n  -d[:debugger]   run scripts under debugger");
1293     printf("\n  -D[number/list] set debugging flags (argument is a bit mask or flags)");
1294     printf("\n  -e 'command'    one line of script. Several -e's allowed. Omit [programfile].");
1295     printf("\n  -F/pattern/     split() pattern for autosplit (-a). The //'s are optional.");
1296     printf("\n  -i[extension]   edit <> files in place (make backup if extension supplied)");
1297     printf("\n  -Idirectory     specify @INC/#include directory (may be used more then once)");
1298     printf("\n  -l[octal]       enable line ending processing, specifies line teminator");
1299     printf("\n  -[mM][-]module.. executes `use/no module...' before executing your script.");
1300     printf("\n  -n              assume 'while (<>) { ... }' loop arround your script");
1301     printf("\n  -p              assume loop like -n but print line also like sed");
1302     printf("\n  -P              run script through C preprocessor before compilation");
1303     printf("\n  -s              enable some switch parsing for switches after script name");
1304     printf("\n  -S              look for the script using PATH environment variable");
1305     printf("\n  -T              turn on tainting checks");
1306     printf("\n  -u              dump core after parsing script");
1307     printf("\n  -U              allow unsafe operations");
1308     printf("\n  -v              print version number and patchlevel of perl");
1309     printf("\n  -V[:variable]   print perl configuration information");
1310     printf("\n  -w              TURN WARNINGS ON FOR COMPILATION OF YOUR SCRIPT.");
1311     printf("\n  -x[directory]   strip off text before #!perl line and perhaps cd to directory\n");
1312 }
1313
1314 /* This routine handles any switches that can be given during run */
1315
1316 char *
1317 moreswitches(s)
1318 char *s;
1319 {
1320     I32 numlen;
1321     U32 rschar;
1322
1323     switch (*s) {
1324     case '0':
1325         rschar = scan_oct(s, 4, &numlen);
1326         SvREFCNT_dec(nrs);
1327         if (rschar & ~((U8)~0))
1328             nrs = &sv_undef;
1329         else if (!rschar && numlen >= 2)
1330             nrs = newSVpv("", 0);
1331         else {
1332             char ch = rschar;
1333             nrs = newSVpv(&ch, 1);
1334         }
1335         return s + numlen;
1336     case 'F':
1337         minus_F = TRUE;
1338         splitstr = savepv(s + 1);
1339         s += strlen(s);
1340         return s;
1341     case 'a':
1342         minus_a = TRUE;
1343         s++;
1344         return s;
1345     case 'c':
1346         minus_c = TRUE;
1347         s++;
1348         return s;
1349     case 'd':
1350         forbid_setid("-d");
1351         s++;
1352         if (*s == ':' || *s == '=')  {
1353             my_setenv("PERL5DB", form("use Devel::%s;", ++s));
1354             s += strlen(s);
1355         }
1356         if (!perldb) {
1357             perldb = TRUE;
1358             init_debugger();
1359         }
1360         return s;
1361     case 'D':
1362 #ifdef DEBUGGING
1363         forbid_setid("-D");
1364         if (isALPHA(s[1])) {
1365             static char debopts[] = "psltocPmfrxuLHXD";
1366             char *d;
1367
1368             for (s++; *s && (d = strchr(debopts,*s)); s++)
1369                 debug |= 1 << (d - debopts);
1370         }
1371         else {
1372             debug = atoi(s+1);
1373             for (s++; isDIGIT(*s); s++) ;
1374         }
1375         debug |= 0x80000000;
1376 #else
1377         warn("Recompile perl with -DDEBUGGING to use -D switch\n");
1378         for (s++; isALNUM(*s); s++) ;
1379 #endif
1380         /*SUPPRESS 530*/
1381         return s;
1382     case 'h':
1383         usage(origargv[0]);    
1384         exit(0);
1385     case 'i':
1386         if (inplace)
1387             Safefree(inplace);
1388         inplace = savepv(s+1);
1389         /*SUPPRESS 530*/
1390         for (s = inplace; *s && !isSPACE(*s); s++) ;
1391         *s = '\0';
1392         break;
1393     case 'I':
1394         forbid_setid("-I");
1395         if (*++s) {
1396             char *e, *p;
1397             for (e = s; *e && !isSPACE(*e); e++) ;
1398             p = savepvn(s, e-s);
1399             incpush(p, TRUE);
1400             Safefree(p);
1401             if (*e)
1402                 return e;
1403         }
1404         else
1405             croak("No space allowed after -I");
1406         break;
1407     case 'l':
1408         minus_l = TRUE;
1409         s++;
1410         if (ors)
1411             Safefree(ors);
1412         if (isDIGIT(*s)) {
1413             ors = savepv("\n");
1414             orslen = 1;
1415             *ors = scan_oct(s, 3 + (*s == '0'), &numlen);
1416             s += numlen;
1417         }
1418         else {
1419             if (RsPARA(nrs)) {
1420                 ors = "\n\n";
1421                 orslen = 2;
1422             }
1423             else
1424                 ors = SvPV(nrs, orslen);
1425             ors = savepvn(ors, orslen);
1426         }
1427         return s;
1428     case 'M':
1429         forbid_setid("-M");     /* XXX ? */
1430         /* FALL THROUGH */
1431     case 'm':
1432         forbid_setid("-m");     /* XXX ? */
1433         if (*++s) {
1434             char *start;
1435             char *use = "use ";
1436             /* -M-foo == 'no foo'       */
1437             if (*s == '-') { use = "no "; ++s; }
1438             Sv = newSVpv(use,0);
1439             start = s;
1440             /* We allow -M'Module qw(Foo Bar)'  */
1441             while(isALNUM(*s) || *s==':') ++s;
1442             if (*s != '=') {
1443                 sv_catpv(Sv, start);
1444                 if (*(start-1) == 'm') {
1445                     if (*s != '\0')
1446                         croak("Can't use '%c' after -mname", *s);
1447                     sv_catpv( Sv, " ()");
1448                 }
1449             } else {
1450                 sv_catpvn(Sv, start, s-start);
1451                 sv_catpv(Sv, " split(/,/,q{");
1452                 sv_catpv(Sv, ++s);
1453                 sv_catpv(Sv,    "})");
1454             }
1455             s += strlen(s);
1456             if (preambleav == NULL)
1457                 preambleav = newAV();
1458             av_push(preambleav, Sv);
1459         }
1460         else
1461             croak("No space allowed after -%c", *(s-1));
1462         return s;
1463     case 'n':
1464         minus_n = TRUE;
1465         s++;
1466         return s;
1467     case 'p':
1468         minus_p = TRUE;
1469         s++;
1470         return s;
1471     case 's':
1472         forbid_setid("-s");
1473         doswitches = TRUE;
1474         s++;
1475         return s;
1476     case 'T':
1477         if (!tainting)
1478             croak("Too late for \"-T\" option");
1479         s++;
1480         return s;
1481     case 'u':
1482         do_undump = TRUE;
1483         s++;
1484         return s;
1485     case 'U':
1486         unsafe = TRUE;
1487         s++;
1488         return s;
1489     case 'v':
1490 #if defined(SUBVERSION) && SUBVERSION > 0
1491         printf("\nThis is perl, version 5.%03d_%02d", PATCHLEVEL, SUBVERSION);
1492 #else
1493         printf("\nThis is perl, version %s",patchlevel);
1494 #endif
1495
1496         printf("\n\nCopyright 1987-1997, Larry Wall\n");
1497 #ifdef MSDOS
1498         printf("\n\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
1499 #endif
1500 #ifdef DJGPP
1501         printf("djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n");
1502 #endif
1503 #ifdef OS2
1504         printf("\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
1505             "Version 5 port Copyright (c) 1994-1997, Andreas Kaiser, Ilya Zakharevich\n");
1506 #endif
1507 #ifdef atarist
1508         printf("atariST series port, ++jrb  bammi@cadence.com\n");
1509 #endif
1510         printf("\n\
1511 Perl may be copied only under the terms of either the Artistic License or the\n\
1512 GNU General Public License, which may be found in the Perl 5.0 source kit.\n\n");
1513         exit(0);
1514     case 'w':
1515         dowarn = TRUE;
1516         s++;
1517         return s;
1518     case '*':
1519     case ' ':
1520         if (s[1] == '-')        /* Additional switches on #! line. */
1521             return s+2;
1522         break;
1523     case '-':
1524     case 0:
1525     case '\n':
1526     case '\t':
1527         break;
1528 #ifdef ALTERNATE_SHEBANG
1529     case 'S':                   /* OS/2 needs -S on "extproc" line. */
1530         break;
1531 #endif
1532     case 'P':
1533         if (preprocess)
1534             return s+1;
1535         /* FALL THROUGH */
1536     default:
1537         croak("Can't emulate -%.1s on #! line",s);
1538     }
1539     return Nullch;
1540 }
1541
1542 /* compliments of Tom Christiansen */
1543
1544 /* unexec() can be found in the Gnu emacs distribution */
1545
1546 void
1547 my_unexec()
1548 {
1549 #ifdef UNEXEC
1550     SV*    prog;
1551     SV*    file;
1552     int    status;
1553     extern int etext;
1554
1555     prog = newSVpv(BIN_EXP);
1556     sv_catpv(prog, "/perl");
1557     file = newSVpv(origfilename);
1558     sv_catpv(file, ".perldump");
1559
1560     status = unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
1561     if (status)
1562         PerlIO_printf(PerlIO_stderr(), "unexec of %s into %s failed!\n",
1563                       SvPVX(prog), SvPVX(file));
1564     exit(status);
1565 #else
1566 #  ifdef VMS
1567 #    include <lib$routines.h>
1568      lib$signal(SS$_DEBUG);  /* ssdef.h #included from vmsish.h */
1569 #  else
1570     ABORT();            /* for use with undump */
1571 #  endif
1572 #endif
1573 }
1574
1575 static void
1576 init_main_stash()
1577 {
1578     GV *gv;
1579
1580     /* Note that strtab is a rather special HV.  Assumptions are made
1581        about not iterating on it, and not adding tie magic to it.
1582        It is properly deallocated in perl_destruct() */
1583     strtab = newHV();
1584     HvSHAREKEYS_off(strtab);                    /* mandatory */
1585     Newz(506,((XPVHV*)SvANY(strtab))->xhv_array,
1586          sizeof(HE*) * (((XPVHV*)SvANY(strtab))->xhv_max + 1), char);
1587     
1588     curstash = defstash = newHV();
1589     curstname = newSVpv("main",4);
1590     gv = gv_fetchpv("main::",TRUE, SVt_PVHV);
1591     SvREFCNT_dec(GvHV(gv));
1592     GvHV(gv) = (HV*)SvREFCNT_inc(defstash);
1593     SvREADONLY_on(gv);
1594     HvNAME(defstash) = savepv("main");
1595     incgv = gv_HVadd(gv_AVadd(gv_fetchpv("INC",TRUE, SVt_PVAV)));
1596     GvMULTI_on(incgv);
1597     defgv = gv_fetchpv("_",TRUE, SVt_PVAV);
1598     errgv = gv_HVadd(gv_fetchpv("@", TRUE, SVt_PV));
1599     GvMULTI_on(errgv);
1600     sv_setpvn(GvSV(errgv), "", 0);
1601     curstash = defstash;
1602     compiling.cop_stash = defstash;
1603     debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
1604     /* We must init $/ before switches are processed. */
1605     sv_setpvn(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), "\n", 1);
1606 }
1607
1608 #ifdef CAN_PROTOTYPE
1609 static void
1610 open_script(char *scriptname, bool dosearch, SV *sv)
1611 #else
1612 static void
1613 open_script(scriptname,dosearch,sv)
1614 char *scriptname;
1615 bool dosearch;
1616 SV *sv;
1617 #endif
1618 {
1619     char *xfound = Nullch;
1620     char *xfailed = Nullch;
1621     register char *s;
1622     I32 len;
1623     int retval;
1624 #if defined(DOSISH) && !defined(OS2) && !defined(atarist)
1625 #  define SEARCH_EXTS ".bat", ".cmd", NULL
1626 #  define MAX_EXT_LEN 4
1627 #endif
1628 #ifdef VMS
1629 #  define SEARCH_EXTS ".pl", ".com", NULL
1630 #  define MAX_EXT_LEN 4
1631 #endif
1632     /* additional extensions to try in each dir if scriptname not found */
1633 #ifdef SEARCH_EXTS
1634     char *ext[] = { SEARCH_EXTS };
1635     int extidx = (strchr(scriptname,'.')) ? -1 : 0; /* has ext already */
1636 #else
1637 #  define MAX_EXT_LEN 0
1638 #endif
1639
1640 #ifdef VMS
1641     if (dosearch) {
1642         int hasdir, idx = 0, deftypes = 1;
1643
1644         hasdir = (strpbrk(scriptname,":[</") != Nullch) ;
1645         /* The first time through, just add SEARCH_EXTS to whatever we
1646          * already have, so we can check for default file types. */
1647         while (deftypes ||
1648                (!hasdir && my_trnlnm("DCL$PATH",tokenbuf,idx++)) )
1649         {
1650             if (deftypes) {
1651                 deftypes = 0;
1652                 *tokenbuf = '\0';
1653             }
1654             if ((strlen(tokenbuf) + strlen(scriptname)
1655                  + MAX_EXT_LEN) >= sizeof tokenbuf)
1656                 continue;       /* don't search dir with too-long name */
1657             strcat(tokenbuf, scriptname);
1658 #else  /* !VMS */
1659     if (dosearch && !strchr(scriptname, '/') && (s = getenv("PATH"))) {
1660         bufend = s + strlen(s);
1661         while (s < bufend) {
1662 #ifndef atarist
1663             s = delimcpy(tokenbuf, tokenbuf + sizeof tokenbuf, s, bufend,
1664 #ifdef DOSISH
1665                          ';',
1666 #else
1667                          ':',
1668 #endif
1669                          &len);
1670 #else  /* atarist */
1671             for (len = 0; *s && *s != ',' && *s != ';'; len++, s++) {
1672                 if (len < sizeof tokenbuf)
1673                     tokenbuf[len] = *s;
1674             }
1675             if (len < sizeof tokenbuf)
1676                 tokenbuf[len] = '\0';
1677 #endif /* atarist */
1678             if (s < bufend)
1679                 s++;
1680             if (len + 1 + strlen(scriptname) + MAX_EXT_LEN >= sizeof tokenbuf)
1681                 continue;       /* don't search dir with too-long name */
1682             if (len
1683 #if defined(atarist) && !defined(DOSISH)
1684                 && tokenbuf[len - 1] != '/'
1685 #endif
1686 #if defined(atarist) || defined(DOSISH)
1687                 && tokenbuf[len - 1] != '\\'
1688 #endif
1689                )
1690                 tokenbuf[len++] = '/';
1691             (void)strcpy(tokenbuf + len, scriptname);
1692 #endif  /* !VMS */
1693
1694 #ifdef SEARCH_EXTS
1695             len = strlen(tokenbuf);
1696             if (extidx > 0)     /* reset after previous loop */
1697                 extidx = 0;
1698             do {
1699 #endif
1700                 DEBUG_p(PerlIO_printf(Perl_debug_log, "Looking for %s\n",tokenbuf));
1701                 retval = Stat(tokenbuf,&statbuf);
1702 #ifdef SEARCH_EXTS
1703             } while (  retval < 0               /* not there */
1704                     && extidx>=0 && ext[extidx] /* try an extension? */
1705                     && strcpy(tokenbuf+len, ext[extidx++])
1706                 );
1707 #endif
1708             if (retval < 0)
1709                 continue;
1710             if (S_ISREG(statbuf.st_mode)
1711                 && cando(S_IRUSR,TRUE,&statbuf)
1712 #ifndef DOSISH
1713                 && cando(S_IXUSR,TRUE,&statbuf)
1714 #endif
1715                 )
1716             {
1717                 xfound = tokenbuf;              /* bingo! */
1718                 break;
1719             }
1720             if (!xfailed)
1721                 xfailed = savepv(tokenbuf);
1722         }
1723         if (!xfound)
1724             croak("Can't execute %s", xfailed ? xfailed : scriptname );
1725         if (xfailed)
1726             Safefree(xfailed);
1727         scriptname = xfound;
1728     }
1729
1730     if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
1731         char *s = scriptname + 8;
1732         fdscript = atoi(s);
1733         while (isDIGIT(*s))
1734             s++;
1735         if (*s)
1736             scriptname = s + 1;
1737     }
1738     else
1739         fdscript = -1;
1740     origfilename = savepv(e_tmpname ? "-e" : scriptname);
1741     curcop->cop_filegv = gv_fetchfile(origfilename);
1742     if (strEQ(origfilename,"-"))
1743         scriptname = "";
1744     if (fdscript >= 0) {
1745         rsfp = PerlIO_fdopen(fdscript,"r");
1746 #if defined(HAS_FCNTL) && defined(F_SETFD)
1747         if (rsfp)
1748             fcntl(PerlIO_fileno(rsfp),F_SETFD,1);  /* ensure close-on-exec */
1749 #endif
1750     }
1751     else if (preprocess) {
1752         char *cpp_cfg = CPPSTDIN;
1753         SV *cpp = NEWSV(0,0);
1754         SV *cmd = NEWSV(0,0);
1755
1756         if (strEQ(cpp_cfg, "cppstdin"))
1757             sv_catpvf(cpp, "%s/", BIN_EXP);
1758         sv_catpv(cpp, cpp_cfg);
1759
1760         sv_catpv(sv,"-I");
1761         sv_catpv(sv,PRIVLIB_EXP);
1762
1763 #ifdef MSDOS
1764         sv_setpvf(cmd, "\
1765 sed %s -e \"/^[^#]/b\" \
1766  -e \"/^#[      ]*include[      ]/b\" \
1767  -e \"/^#[      ]*define[       ]/b\" \
1768  -e \"/^#[      ]*if[   ]/b\" \
1769  -e \"/^#[      ]*ifdef[        ]/b\" \
1770  -e \"/^#[      ]*ifndef[       ]/b\" \
1771  -e \"/^#[      ]*else/b\" \
1772  -e \"/^#[      ]*elif[         ]/b\" \
1773  -e \"/^#[      ]*undef[        ]/b\" \
1774  -e \"/^#[      ]*endif/b\" \
1775  -e \"s/^#.*//\" \
1776  %s | %_ -C %_ %s",
1777           (doextract ? "-e \"1,/^#/d\n\"" : ""),
1778 #else
1779         sv_setpvf(cmd, "\
1780 %s %s -e '/^[^#]/b' \
1781  -e '/^#[       ]*include[      ]/b' \
1782  -e '/^#[       ]*define[       ]/b' \
1783  -e '/^#[       ]*if[   ]/b' \
1784  -e '/^#[       ]*ifdef[        ]/b' \
1785  -e '/^#[       ]*ifndef[       ]/b' \
1786  -e '/^#[       ]*else/b' \
1787  -e '/^#[       ]*elif[         ]/b' \
1788  -e '/^#[       ]*undef[        ]/b' \
1789  -e '/^#[       ]*endif/b' \
1790  -e 's/^[       ]*#.*//' \
1791  %s | %_ -C %_ %s",
1792 #ifdef LOC_SED
1793           LOC_SED,
1794 #else
1795           "sed",
1796 #endif
1797           (doextract ? "-e '1,/^#/d\n'" : ""),
1798 #endif
1799           scriptname, cpp, sv, CPPMINUS);
1800         doextract = FALSE;
1801 #ifdef IAMSUID                          /* actually, this is caught earlier */
1802         if (euid != uid && !euid) {     /* if running suidperl */
1803 #ifdef HAS_SETEUID
1804             (void)seteuid(uid);         /* musn't stay setuid root */
1805 #else
1806 #ifdef HAS_SETREUID
1807             (void)setreuid((Uid_t)-1, uid);
1808 #else
1809 #ifdef HAS_SETRESUID
1810             (void)setresuid((Uid_t)-1, uid, (Uid_t)-1);
1811 #else
1812             setuid(uid);
1813 #endif
1814 #endif
1815 #endif
1816             if (geteuid() != uid)
1817                 croak("Can't do seteuid!\n");
1818         }
1819 #endif /* IAMSUID */
1820         rsfp = my_popen(SvPVX(cmd), "r");
1821         SvREFCNT_dec(cmd);
1822         SvREFCNT_dec(cpp);
1823     }
1824     else if (!*scriptname) {
1825         forbid_setid("program input from stdin");
1826         rsfp = PerlIO_stdin();
1827     }
1828     else {
1829         rsfp = PerlIO_open(scriptname,"r");
1830 #if defined(HAS_FCNTL) && defined(F_SETFD)
1831         if (rsfp)
1832             fcntl(PerlIO_fileno(rsfp),F_SETFD,1);  /* ensure close-on-exec */
1833 #endif
1834     }
1835     if (e_tmpname) {
1836         e_fp = rsfp;
1837     }
1838     if (!rsfp) {
1839 #ifdef DOSUID
1840 #ifndef IAMSUID         /* in case script is not readable before setuid */
1841         if (euid && Stat(SvPVX(GvSV(curcop->cop_filegv)),&statbuf) >= 0 &&
1842           statbuf.st_mode & (S_ISUID|S_ISGID)) {
1843             /* try again */
1844             execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
1845             croak("Can't do setuid\n");
1846         }
1847 #endif
1848 #endif
1849         croak("Can't open perl script \"%s\": %s\n",
1850           SvPVX(GvSV(curcop->cop_filegv)), Strerror(errno));
1851     }
1852 }
1853
1854 static void
1855 validate_suid(validarg, scriptname)
1856 char *validarg;
1857 char *scriptname;
1858 {
1859     int which;
1860
1861     /* do we need to emulate setuid on scripts? */
1862
1863     /* This code is for those BSD systems that have setuid #! scripts disabled
1864      * in the kernel because of a security problem.  Merely defining DOSUID
1865      * in perl will not fix that problem, but if you have disabled setuid
1866      * scripts in the kernel, this will attempt to emulate setuid and setgid
1867      * on scripts that have those now-otherwise-useless bits set.  The setuid
1868      * root version must be called suidperl or sperlN.NNN.  If regular perl
1869      * discovers that it has opened a setuid script, it calls suidperl with
1870      * the same argv that it had.  If suidperl finds that the script it has
1871      * just opened is NOT setuid root, it sets the effective uid back to the
1872      * uid.  We don't just make perl setuid root because that loses the
1873      * effective uid we had before invoking perl, if it was different from the
1874      * uid.
1875      *
1876      * DOSUID must be defined in both perl and suidperl, and IAMSUID must
1877      * be defined in suidperl only.  suidperl must be setuid root.  The
1878      * Configure script will set this up for you if you want it.
1879      */
1880
1881 #ifdef DOSUID
1882     char *s, *s2;
1883
1884     if (Fstat(PerlIO_fileno(rsfp),&statbuf) < 0)        /* normal stat is insecure */
1885         croak("Can't stat script \"%s\"",origfilename);
1886     if (fdscript < 0 && statbuf.st_mode & (S_ISUID|S_ISGID)) {
1887         I32 len;
1888
1889 #ifdef IAMSUID
1890 #ifndef HAS_SETREUID
1891         /* On this access check to make sure the directories are readable,
1892          * there is actually a small window that the user could use to make
1893          * filename point to an accessible directory.  So there is a faint
1894          * chance that someone could execute a setuid script down in a
1895          * non-accessible directory.  I don't know what to do about that.
1896          * But I don't think it's too important.  The manual lies when
1897          * it says access() is useful in setuid programs.
1898          */
1899         if (access(SvPVX(GvSV(curcop->cop_filegv)),1))  /*double check*/
1900             croak("Permission denied");
1901 #else
1902         /* If we can swap euid and uid, then we can determine access rights
1903          * with a simple stat of the file, and then compare device and
1904          * inode to make sure we did stat() on the same file we opened.
1905          * Then we just have to make sure he or she can execute it.
1906          */
1907         {
1908             struct stat tmpstatbuf;
1909
1910             if (
1911 #ifdef HAS_SETREUID
1912                 setreuid(euid,uid) < 0
1913 #else
1914 # if HAS_SETRESUID
1915                 setresuid(euid,uid,(Uid_t)-1) < 0
1916 # endif
1917 #endif
1918                 || getuid() != euid || geteuid() != uid)
1919                 croak("Can't swap uid and euid");       /* really paranoid */
1920             if (Stat(SvPVX(GvSV(curcop->cop_filegv)),&tmpstatbuf) < 0)
1921                 croak("Permission denied");     /* testing full pathname here */
1922             if (tmpstatbuf.st_dev != statbuf.st_dev ||
1923                 tmpstatbuf.st_ino != statbuf.st_ino) {
1924                 (void)PerlIO_close(rsfp);
1925                 if (rsfp = my_popen("/bin/mail root","w")) {    /* heh, heh */
1926                     PerlIO_printf(rsfp,
1927 "User %ld tried to run dev %ld ino %ld in place of dev %ld ino %ld!\n\
1928 (Filename of set-id script was %s, uid %ld gid %ld.)\n\nSincerely,\nperl\n",
1929                         (long)uid,(long)tmpstatbuf.st_dev, (long)tmpstatbuf.st_ino,
1930                         (long)statbuf.st_dev, (long)statbuf.st_ino,
1931                         SvPVX(GvSV(curcop->cop_filegv)),
1932                         (long)statbuf.st_uid, (long)statbuf.st_gid);
1933                     (void)my_pclose(rsfp);
1934                 }
1935                 croak("Permission denied\n");
1936             }
1937             if (
1938 #ifdef HAS_SETREUID
1939               setreuid(uid,euid) < 0
1940 #else
1941 # if defined(HAS_SETRESUID)
1942               setresuid(uid,euid,(Uid_t)-1) < 0
1943 # endif
1944 #endif
1945               || getuid() != uid || geteuid() != euid)
1946                 croak("Can't reswap uid and euid");
1947             if (!cando(S_IXUSR,FALSE,&statbuf))         /* can real uid exec? */
1948                 croak("Permission denied\n");
1949         }
1950 #endif /* HAS_SETREUID */
1951 #endif /* IAMSUID */
1952
1953         if (!S_ISREG(statbuf.st_mode))
1954             croak("Permission denied");
1955         if (statbuf.st_mode & S_IWOTH)
1956             croak("Setuid/gid script is writable by world");
1957         doswitches = FALSE;             /* -s is insecure in suid */
1958         curcop->cop_line++;
1959         if (sv_gets(linestr, rsfp, 0) == Nullch ||
1960           strnNE(SvPV(linestr,na),"#!",2) )     /* required even on Sys V */
1961             croak("No #! line");
1962         s = SvPV(linestr,na)+2;
1963         if (*s == ' ') s++;
1964         while (!isSPACE(*s)) s++;
1965         for (s2 = s;  (s2 > SvPV(linestr,na)+2 &&
1966                        (isDIGIT(s2[-1]) || strchr("._-", s2[-1])));  s2--) ;
1967         if (strnNE(s2-4,"perl",4) && strnNE(s-9,"perl",4))  /* sanity check */
1968             croak("Not a perl script");
1969         while (*s == ' ' || *s == '\t') s++;
1970         /*
1971          * #! arg must be what we saw above.  They can invoke it by
1972          * mentioning suidperl explicitly, but they may not add any strange
1973          * arguments beyond what #! says if they do invoke suidperl that way.
1974          */
1975         len = strlen(validarg);
1976         if (strEQ(validarg," PHOOEY ") ||
1977             strnNE(s,validarg,len) || !isSPACE(s[len]))
1978             croak("Args must match #! line");
1979
1980 #ifndef IAMSUID
1981         if (euid != uid && (statbuf.st_mode & S_ISUID) &&
1982             euid == statbuf.st_uid)
1983             if (!do_undump)
1984                 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
1985 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
1986 #endif /* IAMSUID */
1987
1988         if (euid) {     /* oops, we're not the setuid root perl */
1989             (void)PerlIO_close(rsfp);
1990 #ifndef IAMSUID
1991             /* try again */
1992             execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
1993 #endif
1994             croak("Can't do setuid\n");
1995         }
1996
1997         if (statbuf.st_mode & S_ISGID && statbuf.st_gid != egid) {
1998 #ifdef HAS_SETEGID
1999             (void)setegid(statbuf.st_gid);
2000 #else
2001 #ifdef HAS_SETREGID
2002            (void)setregid((Gid_t)-1,statbuf.st_gid);
2003 #else
2004 #ifdef HAS_SETRESGID
2005            (void)setresgid((Gid_t)-1,statbuf.st_gid,(Gid_t)-1);
2006 #else
2007             setgid(statbuf.st_gid);
2008 #endif
2009 #endif
2010 #endif
2011             if (getegid() != statbuf.st_gid)
2012                 croak("Can't do setegid!\n");
2013         }
2014         if (statbuf.st_mode & S_ISUID) {
2015             if (statbuf.st_uid != euid)
2016 #ifdef HAS_SETEUID
2017                 (void)seteuid(statbuf.st_uid);  /* all that for this */
2018 #else
2019 #ifdef HAS_SETREUID
2020                 (void)setreuid((Uid_t)-1,statbuf.st_uid);
2021 #else
2022 #ifdef HAS_SETRESUID
2023                 (void)setresuid((Uid_t)-1,statbuf.st_uid,(Uid_t)-1);
2024 #else
2025                 setuid(statbuf.st_uid);
2026 #endif
2027 #endif
2028 #endif
2029             if (geteuid() != statbuf.st_uid)
2030                 croak("Can't do seteuid!\n");
2031         }
2032         else if (uid) {                 /* oops, mustn't run as root */
2033 #ifdef HAS_SETEUID
2034           (void)seteuid((Uid_t)uid);
2035 #else
2036 #ifdef HAS_SETREUID
2037           (void)setreuid((Uid_t)-1,(Uid_t)uid);
2038 #else
2039 #ifdef HAS_SETRESUID
2040           (void)setresuid((Uid_t)-1,(Uid_t)uid,(Uid_t)-1);
2041 #else
2042           setuid((Uid_t)uid);
2043 #endif
2044 #endif
2045 #endif
2046             if (geteuid() != uid)
2047                 croak("Can't do seteuid!\n");
2048         }
2049         init_ids();
2050         if (!cando(S_IXUSR,TRUE,&statbuf))
2051             croak("Permission denied\n");       /* they can't do this */
2052     }
2053 #ifdef IAMSUID
2054     else if (preprocess)
2055         croak("-P not allowed for setuid/setgid script\n");
2056     else if (fdscript >= 0)
2057         croak("fd script not allowed in suidperl\n");
2058     else
2059         croak("Script is not setuid/setgid in suidperl\n");
2060
2061     /* We absolutely must clear out any saved ids here, so we */
2062     /* exec the real perl, substituting fd script for scriptname. */
2063     /* (We pass script name as "subdir" of fd, which perl will grok.) */
2064     PerlIO_rewind(rsfp);
2065     lseek(PerlIO_fileno(rsfp),(Off_t)0,0);  /* just in case rewind didn't */
2066     for (which = 1; origargv[which] && origargv[which] != scriptname; which++) ;
2067     if (!origargv[which])
2068         croak("Permission denied");
2069     origargv[which] = savepv(form("/dev/fd/%d/%s",
2070                                   PerlIO_fileno(rsfp), origargv[which]));
2071 #if defined(HAS_FCNTL) && defined(F_SETFD)
2072     fcntl(PerlIO_fileno(rsfp),F_SETFD,0);       /* ensure no close-on-exec */
2073 #endif
2074     execv(form("%s/perl%s", BIN_EXP, patchlevel), origargv);    /* try again */
2075     croak("Can't do setuid\n");
2076 #endif /* IAMSUID */
2077 #else /* !DOSUID */
2078     if (euid != uid || egid != gid) {   /* (suidperl doesn't exist, in fact) */
2079 #ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
2080         Fstat(PerlIO_fileno(rsfp),&statbuf);    /* may be either wrapped or real suid */
2081         if ((euid != uid && euid == statbuf.st_uid && statbuf.st_mode & S_ISUID)
2082             ||
2083             (egid != gid && egid == statbuf.st_gid && statbuf.st_mode & S_ISGID)
2084            )
2085             if (!do_undump)
2086                 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2087 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2088 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
2089         /* not set-id, must be wrapped */
2090     }
2091 #endif /* DOSUID */
2092 }
2093
2094 static void
2095 find_beginning()
2096 {
2097     register char *s, *s2;
2098
2099     /* skip forward in input to the real script? */
2100
2101     forbid_setid("-x");
2102     while (doextract) {
2103         if ((s = sv_gets(linestr, rsfp, 0)) == Nullch)
2104             croak("No Perl script found in input\n");
2105         if (*s == '#' && s[1] == '!' && (s = instr(s,"perl"))) {
2106             PerlIO_ungetc(rsfp, '\n');          /* to keep line count right */
2107             doextract = FALSE;
2108             while (*s && !(isSPACE (*s) || *s == '#')) s++;
2109             s2 = s;
2110             while (*s == ' ' || *s == '\t') s++;
2111             if (*s++ == '-') {
2112                 while (isDIGIT(s2[-1]) || strchr("-._", s2[-1])) s2--;
2113                 if (strnEQ(s2-4,"perl",4))
2114                     /*SUPPRESS 530*/
2115                     while (s = moreswitches(s)) ;
2116             }
2117             if (cddir && chdir(cddir) < 0)
2118                 croak("Can't chdir to %s",cddir);
2119         }
2120     }
2121 }
2122
2123 static void
2124 init_ids()
2125 {
2126     uid = (int)getuid();
2127     euid = (int)geteuid();
2128     gid = (int)getgid();
2129     egid = (int)getegid();
2130 #ifdef VMS
2131     uid |= gid << 16;
2132     euid |= egid << 16;
2133 #endif
2134     tainting |= (uid && (euid != uid || egid != gid));
2135 }
2136
2137 static void
2138 forbid_setid(s)
2139 char *s;
2140 {
2141     if (euid != uid)
2142         croak("No %s allowed while running setuid", s);
2143     if (egid != gid)
2144         croak("No %s allowed while running setgid", s);
2145 }
2146
2147 static void
2148 init_debugger()
2149 {
2150     curstash = debstash;
2151     dbargs = GvAV(gv_AVadd((gv_fetchpv("args", GV_ADDMULTI, SVt_PVAV))));
2152     AvREAL_off(dbargs);
2153     DBgv = gv_fetchpv("DB", GV_ADDMULTI, SVt_PVGV);
2154     DBline = gv_fetchpv("dbline", GV_ADDMULTI, SVt_PVAV);
2155     DBsub = gv_HVadd(gv_fetchpv("sub", GV_ADDMULTI, SVt_PVHV));
2156     DBsingle = GvSV((gv_fetchpv("single", GV_ADDMULTI, SVt_PV)));
2157     sv_setiv(DBsingle, 0); 
2158     DBtrace = GvSV((gv_fetchpv("trace", GV_ADDMULTI, SVt_PV)));
2159     sv_setiv(DBtrace, 0); 
2160     DBsignal = GvSV((gv_fetchpv("signal", GV_ADDMULTI, SVt_PV)));
2161     sv_setiv(DBsignal, 0); 
2162     curstash = defstash;
2163 }
2164
2165 static void
2166 init_stacks()
2167 {
2168     curstack = newAV();
2169     mainstack = curstack;               /* remember in case we switch stacks */
2170     AvREAL_off(curstack);               /* not a real array */
2171     av_extend(curstack,127);
2172
2173     stack_base = AvARRAY(curstack);
2174     stack_sp = stack_base;
2175     stack_max = stack_base + 127;
2176
2177     cxstack_max = 8192 / sizeof(CONTEXT) - 2;   /* Use most of 8K. */
2178     New(50,cxstack,cxstack_max + 1,CONTEXT);
2179     cxstack_ix  = -1;
2180
2181     New(50,tmps_stack,128,SV*);
2182     tmps_ix = -1;
2183     tmps_max = 128;
2184
2185     DEBUG( {
2186         New(51,debname,128,char);
2187         New(52,debdelim,128,char);
2188     } )
2189
2190     /*
2191      * The following stacks almost certainly should be per-interpreter,
2192      * but for now they're not.  XXX
2193      */
2194
2195     if (markstack) {
2196         markstack_ptr = markstack;
2197     } else {
2198         New(54,markstack,64,I32);
2199         markstack_ptr = markstack;
2200         markstack_max = markstack + 64;
2201     }
2202
2203     if (scopestack) {
2204         scopestack_ix = 0;
2205     } else {
2206         New(54,scopestack,32,I32);
2207         scopestack_ix = 0;
2208         scopestack_max = 32;
2209     }
2210
2211     if (savestack) {
2212         savestack_ix = 0;
2213     } else {
2214         New(54,savestack,128,ANY);
2215         savestack_ix = 0;
2216         savestack_max = 128;
2217     }
2218
2219     if (retstack) {
2220         retstack_ix = 0;
2221     } else {
2222         New(54,retstack,16,OP*);
2223         retstack_ix = 0;
2224         retstack_max = 16;
2225     }
2226 }
2227
2228 static void
2229 nuke_stacks()
2230 {
2231     Safefree(cxstack);
2232     Safefree(tmps_stack);
2233     DEBUG( {
2234         Safefree(debname);
2235         Safefree(debdelim);
2236     } )
2237 }
2238
2239 static PerlIO *tmpfp;  /* moved outside init_lexer() because of UNICOS bug */
2240
2241 static void
2242 init_lexer()
2243 {
2244     tmpfp = rsfp;
2245     lex_start(linestr);
2246     rsfp = tmpfp;
2247     subname = newSVpv("main",4);
2248 }
2249
2250 static void
2251 init_predump_symbols()
2252 {
2253     GV *tmpgv;
2254     GV *othergv;
2255
2256     sv_setpvn(GvSV(gv_fetchpv("\"", TRUE, SVt_PV)), " ", 1);
2257
2258     stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
2259     GvMULTI_on(stdingv);
2260     IoIFP(GvIOp(stdingv)) = PerlIO_stdin();
2261     tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
2262     GvMULTI_on(tmpgv);
2263     GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(stdingv));
2264
2265     tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
2266     GvMULTI_on(tmpgv);
2267     IoOFP(GvIOp(tmpgv)) = IoIFP(GvIOp(tmpgv)) = PerlIO_stdout();
2268     setdefout(tmpgv);
2269     tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
2270     GvMULTI_on(tmpgv);
2271     GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(defoutgv));
2272
2273     othergv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
2274     GvMULTI_on(othergv);
2275     IoOFP(GvIOp(othergv)) = IoIFP(GvIOp(othergv)) = PerlIO_stderr();
2276     tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
2277     GvMULTI_on(tmpgv);
2278     GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(othergv));
2279
2280     statname = NEWSV(66,0);             /* last filename we did stat on */
2281
2282     if (!osname)
2283         osname = savepv(OSNAME);
2284 }
2285
2286 static void
2287 init_postdump_symbols(argc,argv,env)
2288 register int argc;
2289 register char **argv;
2290 register char **env;
2291 {
2292     char *s;
2293     SV *sv;
2294     GV* tmpgv;
2295
2296     argc--,argv++;      /* skip name of script */
2297     if (doswitches) {
2298         for (; argc > 0 && **argv == '-'; argc--,argv++) {
2299             if (!argv[0][1])
2300                 break;
2301             if (argv[0][1] == '-') {
2302                 argc--,argv++;
2303                 break;
2304             }
2305             if (s = strchr(argv[0], '=')) {
2306                 *s++ = '\0';
2307                 sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),s);
2308             }
2309             else
2310                 sv_setiv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),1);
2311         }
2312     }
2313     toptarget = NEWSV(0,0);
2314     sv_upgrade(toptarget, SVt_PVFM);
2315     sv_setpvn(toptarget, "", 0);
2316     bodytarget = NEWSV(0,0);
2317     sv_upgrade(bodytarget, SVt_PVFM);
2318     sv_setpvn(bodytarget, "", 0);
2319     formtarget = bodytarget;
2320
2321     TAINT;
2322     if (tmpgv = gv_fetchpv("0",TRUE, SVt_PV)) {
2323         sv_setpv(GvSV(tmpgv),origfilename);
2324         magicname("0", "0", 1);
2325     }
2326     if (tmpgv = gv_fetchpv("\030",TRUE, SVt_PV))
2327         sv_setpv(GvSV(tmpgv),origargv[0]);
2328     if (argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV)) {
2329         GvMULTI_on(argvgv);
2330         (void)gv_AVadd(argvgv);
2331         av_clear(GvAVn(argvgv));
2332         for (; argc > 0; argc--,argv++) {
2333             av_push(GvAVn(argvgv),newSVpv(argv[0],0));
2334         }
2335     }
2336     if (envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV)) {
2337         HV *hv;
2338         GvMULTI_on(envgv);
2339         hv = GvHVn(envgv);
2340         hv_magic(hv, envgv, 'E');
2341 #ifndef VMS  /* VMS doesn't have environ array */
2342         /* Note that if the supplied env parameter is actually a copy
2343            of the global environ then it may now point to free'd memory
2344            if the environment has been modified since. To avoid this
2345            problem we treat env==NULL as meaning 'use the default'
2346         */
2347         if (!env)
2348             env = environ;
2349         if (env != environ)
2350             environ[0] = Nullch;
2351         for (; *env; env++) {
2352             if (!(s = strchr(*env,'=')))
2353                 continue;
2354             *s++ = '\0';
2355 #ifdef WIN32
2356             (void)strupr(*env);
2357 #endif
2358             sv = newSVpv(s--,0);
2359             (void)hv_store(hv, *env, s - *env, sv, 0);
2360             *s = '=';
2361 #if defined(__BORLANDC__) && defined(USE_WIN32_RTL_ENV)
2362             /* Sins of the RTL. See note in my_setenv(). */
2363             (void)putenv(savepv(*env));
2364 #endif
2365         }
2366 #endif
2367 #ifdef DYNAMIC_ENV_FETCH
2368         HvNAME(hv) = savepv(ENV_HV_NAME);
2369 #endif
2370     }
2371     TAINT_NOT;
2372     if (tmpgv = gv_fetchpv("$",TRUE, SVt_PV))
2373         sv_setiv(GvSV(tmpgv), (IV)getpid());
2374 }
2375
2376 static void
2377 init_perllib()
2378 {
2379     char *s;
2380     if (!tainting) {
2381 #ifndef VMS
2382         s = getenv("PERL5LIB");
2383         if (s)
2384             incpush(s, TRUE);
2385         else
2386             incpush(getenv("PERLLIB"), FALSE);
2387 #else /* VMS */
2388         /* Treat PERL5?LIB as a possible search list logical name -- the
2389          * "natural" VMS idiom for a Unix path string.  We allow each
2390          * element to be a set of |-separated directories for compatibility.
2391          */
2392         char buf[256];
2393         int idx = 0;
2394         if (my_trnlnm("PERL5LIB",buf,0))
2395             do { incpush(buf,TRUE); } while (my_trnlnm("PERL5LIB",buf,++idx));
2396         else
2397             while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE);
2398 #endif /* VMS */
2399     }
2400
2401 /* Use the ~-expanded versions of APPLLIB (undocumented),
2402     ARCHLIB PRIVLIB SITEARCH SITELIB and OLDARCHLIB
2403 */
2404 #ifdef APPLLIB_EXP
2405     incpush(APPLLIB_EXP, FALSE);
2406 #endif
2407
2408 #ifdef ARCHLIB_EXP
2409     incpush(ARCHLIB_EXP, FALSE);
2410 #endif
2411 #ifndef PRIVLIB_EXP
2412 #define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
2413 #endif
2414     incpush(PRIVLIB_EXP, FALSE);
2415
2416 #ifdef SITEARCH_EXP
2417     incpush(SITEARCH_EXP, FALSE);
2418 #endif
2419 #ifdef SITELIB_EXP
2420     incpush(SITELIB_EXP, FALSE);
2421 #endif
2422 #ifdef OLDARCHLIB_EXP  /* 5.00[01] compatibility */
2423     incpush(OLDARCHLIB_EXP, FALSE);
2424 #endif
2425     
2426     if (!tainting)
2427         incpush(".", FALSE);
2428 }
2429
2430 #if defined(DOSISH)
2431 #    define PERLLIB_SEP ';'
2432 #else
2433 #  if defined(VMS)
2434 #    define PERLLIB_SEP '|'
2435 #  else
2436 #    define PERLLIB_SEP ':'
2437 #  endif
2438 #endif
2439 #ifndef PERLLIB_MANGLE
2440 #  define PERLLIB_MANGLE(s,n) (s)
2441 #endif 
2442
2443 static void
2444 incpush(p, addsubdirs)
2445 char *p;
2446 int addsubdirs;
2447 {
2448     SV *subdir = Nullsv;
2449     static char *archpat_auto;
2450
2451     if (!p)
2452         return;
2453
2454     if (addsubdirs) {
2455         subdir = newSV(0);
2456         if (!archpat_auto) {
2457             STRLEN len = (sizeof(ARCHNAME) + strlen(patchlevel)
2458                           + sizeof("//auto"));
2459             New(55, archpat_auto, len, char);
2460             sprintf(archpat_auto, "/%s/%s/auto", ARCHNAME, patchlevel);
2461 #ifdef VMS
2462         for (len = sizeof(ARCHNAME) + 2;
2463              archpat_auto[len] != '\0' && archpat_auto[len] != '/'; len++)
2464                 if (archpat_auto[len] == '.') archpat_auto[len] = '_';
2465 #endif
2466         }
2467     }
2468
2469     /* Break at all separators */
2470     while (p && *p) {
2471         SV *libdir = newSV(0);
2472         char *s;
2473
2474         /* skip any consecutive separators */
2475         while ( *p == PERLLIB_SEP ) {
2476             /* Uncomment the next line for PATH semantics */
2477             /* av_push(GvAVn(incgv), newSVpv(".", 1)); */
2478             p++;
2479         }
2480
2481         if ( (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
2482             sv_setpvn(libdir, PERLLIB_MANGLE(p, (STRLEN)(s - p)),
2483                       (STRLEN)(s - p));
2484             p = s + 1;
2485         }
2486         else {
2487             sv_setpv(libdir, PERLLIB_MANGLE(p, 0));
2488             p = Nullch; /* break out */
2489         }
2490
2491         /*
2492          * BEFORE pushing libdir onto @INC we may first push version- and
2493          * archname-specific sub-directories.
2494          */
2495         if (addsubdirs) {
2496             struct stat tmpstatbuf;
2497 #ifdef VMS
2498             char *unix;
2499             STRLEN len;
2500
2501             if ((unix = tounixspec_ts(SvPV(libdir,na),Nullch)) != Nullch) {
2502                 len = strlen(unix);
2503                 while (unix[len-1] == '/') len--;  /* Cosmetic */
2504                 sv_usepvn(libdir,unix,len);
2505             }
2506             else
2507                 PerlIO_printf(PerlIO_stderr(),
2508                               "Failed to unixify @INC element \"%s\"\n",
2509                               SvPV(libdir,na));
2510 #endif
2511             /* .../archname/version if -d .../archname/version/auto */
2512             sv_setsv(subdir, libdir);
2513             sv_catpv(subdir, archpat_auto);
2514             if (Stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2515                   S_ISDIR(tmpstatbuf.st_mode))
2516                 av_push(GvAVn(incgv),
2517                         newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2518
2519             /* .../archname if -d .../archname/auto */
2520             sv_insert(subdir, SvCUR(libdir) + sizeof(ARCHNAME),
2521                       strlen(patchlevel) + 1, "", 0);
2522             if (Stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2523                   S_ISDIR(tmpstatbuf.st_mode))
2524                 av_push(GvAVn(incgv),
2525                         newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2526         }
2527
2528         /* finally push this lib directory on the end of @INC */
2529         av_push(GvAVn(incgv), libdir);
2530     }
2531
2532     SvREFCNT_dec(subdir);
2533 }
2534
2535 void
2536 call_list(oldscope, list)
2537 I32 oldscope;
2538 AV* list;
2539 {
2540     line_t oldline = curcop->cop_line;
2541     STRLEN len;
2542     dJMPENV;
2543     int ret;
2544
2545     while (AvFILL(list) >= 0) {
2546         CV *cv = (CV*)av_shift(list);
2547
2548         SAVEFREESV(cv);
2549
2550         JMPENV_PUSH(ret);
2551         switch (ret) {
2552         case 0: {
2553                 SV* atsv = GvSV(errgv);
2554                 PUSHMARK(stack_sp);
2555                 perl_call_sv((SV*)cv, G_EVAL|G_DISCARD);
2556                 (void)SvPV(atsv, len);
2557                 if (len) {
2558                     JMPENV_POP;
2559                     curcop = &compiling;
2560                     curcop->cop_line = oldline;
2561                     if (list == beginav)
2562                         sv_catpv(atsv, "BEGIN failed--compilation aborted");
2563                     else
2564                         sv_catpv(atsv, "END failed--cleanup aborted");
2565                     while (scopestack_ix > oldscope)
2566                         LEAVE;
2567                     croak("%s", SvPVX(atsv));
2568                 }
2569             }
2570             break;
2571         case 1:
2572             STATUS_ALL_FAILURE;
2573             /* FALL THROUGH */
2574         case 2:
2575             /* my_exit() was called */
2576             while (scopestack_ix > oldscope)
2577                 LEAVE;
2578             curstash = defstash;
2579             if (endav)
2580                 call_list(oldscope, endav);
2581             FREETMPS;
2582             JMPENV_POP;
2583             curcop = &compiling;
2584             curcop->cop_line = oldline;
2585             if (statusvalue) {
2586                 if (list == beginav)
2587                     croak("BEGIN failed--compilation aborted");
2588                 else
2589                     croak("END failed--cleanup aborted");
2590             }
2591             my_exit_jump();
2592             /* NOTREACHED */
2593         case 3:
2594             if (!restartop) {
2595                 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
2596                 FREETMPS;
2597                 break;
2598             }
2599             JMPENV_POP;
2600             curcop = &compiling;
2601             curcop->cop_line = oldline;
2602             JMPENV_JUMP(3);
2603         }
2604         JMPENV_POP;
2605     }
2606 }
2607
2608 void
2609 my_exit(status)
2610 U32 status;
2611 {
2612     switch (status) {
2613     case 0:
2614         STATUS_ALL_SUCCESS;
2615         break;
2616     case 1:
2617         STATUS_ALL_FAILURE;
2618         break;
2619     default:
2620         STATUS_NATIVE_SET(status);
2621         break;
2622     }
2623     my_exit_jump();
2624 }
2625
2626 void
2627 my_failure_exit()
2628 {
2629 #ifdef VMS
2630     if (vaxc$errno & 1) {
2631         if (STATUS_NATIVE & 1)          /* fortuitiously includes "-1" */
2632             STATUS_NATIVE_SET(44);
2633     }
2634     else {
2635         if (!vaxc$errno && errno)       /* unlikely */
2636             STATUS_NATIVE_SET(44);
2637         else
2638             STATUS_NATIVE_SET(vaxc$errno);
2639     }
2640 #else
2641     if (errno & 255)
2642         STATUS_POSIX_SET(errno);
2643     else if (STATUS_POSIX == 0)
2644         STATUS_POSIX_SET(255);
2645 #endif
2646     my_exit_jump();
2647 }
2648
2649 static void
2650 my_exit_jump()
2651 {
2652     register CONTEXT *cx;
2653     I32 gimme;
2654     SV **newsp;
2655
2656     if (e_tmpname) {
2657         if (e_fp) {
2658             PerlIO_close(e_fp);
2659             e_fp = Nullfp;
2660         }
2661         (void)UNLINK(e_tmpname);
2662         Safefree(e_tmpname);
2663         e_tmpname = Nullch;
2664     }
2665
2666     if (cxstack_ix >= 0) {
2667         if (cxstack_ix > 0)
2668             dounwind(0);
2669         POPBLOCK(cx,curpm);
2670         LEAVE;
2671     }
2672
2673     JMPENV_JUMP(2);
2674 }