Weirdness in sv_peek()
[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, '/')
1660 #ifdef DOSISH
1661                  && !strchr(scriptname, '\\')
1662 #endif
1663                  && (s = getenv("PATH"))) {
1664         bufend = s + strlen(s);
1665         while (s < bufend) {
1666 #ifndef atarist
1667             s = delimcpy(tokenbuf, tokenbuf + sizeof tokenbuf, s, bufend,
1668 #ifdef DOSISH
1669                          ';',
1670 #else
1671                          ':',
1672 #endif
1673                          &len);
1674 #else  /* atarist */
1675             for (len = 0; *s && *s != ',' && *s != ';'; len++, s++) {
1676                 if (len < sizeof tokenbuf)
1677                     tokenbuf[len] = *s;
1678             }
1679             if (len < sizeof tokenbuf)
1680                 tokenbuf[len] = '\0';
1681 #endif /* atarist */
1682             if (s < bufend)
1683                 s++;
1684             if (len + 1 + strlen(scriptname) + MAX_EXT_LEN >= sizeof tokenbuf)
1685                 continue;       /* don't search dir with too-long name */
1686             if (len
1687 #if defined(atarist) && !defined(DOSISH)
1688                 && tokenbuf[len - 1] != '/'
1689 #endif
1690 #if defined(atarist) || defined(DOSISH)
1691                 && tokenbuf[len - 1] != '\\'
1692 #endif
1693                )
1694                 tokenbuf[len++] = '/';
1695             (void)strcpy(tokenbuf + len, scriptname);
1696 #endif  /* !VMS */
1697
1698 #ifdef SEARCH_EXTS
1699             len = strlen(tokenbuf);
1700             if (extidx > 0)     /* reset after previous loop */
1701                 extidx = 0;
1702             do {
1703 #endif
1704                 DEBUG_p(PerlIO_printf(Perl_debug_log, "Looking for %s\n",tokenbuf));
1705                 retval = Stat(tokenbuf,&statbuf);
1706 #ifdef SEARCH_EXTS
1707             } while (  retval < 0               /* not there */
1708                     && extidx>=0 && ext[extidx] /* try an extension? */
1709                     && strcpy(tokenbuf+len, ext[extidx++])
1710                 );
1711 #endif
1712             if (retval < 0)
1713                 continue;
1714             if (S_ISREG(statbuf.st_mode)
1715                 && cando(S_IRUSR,TRUE,&statbuf)
1716 #ifndef DOSISH
1717                 && cando(S_IXUSR,TRUE,&statbuf)
1718 #endif
1719                 )
1720             {
1721                 xfound = tokenbuf;              /* bingo! */
1722                 break;
1723             }
1724             if (!xfailed)
1725                 xfailed = savepv(tokenbuf);
1726         }
1727         if (!xfound)
1728             croak("Can't execute %s", xfailed ? xfailed : scriptname );
1729         if (xfailed)
1730             Safefree(xfailed);
1731         scriptname = xfound;
1732     }
1733
1734     if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
1735         char *s = scriptname + 8;
1736         fdscript = atoi(s);
1737         while (isDIGIT(*s))
1738             s++;
1739         if (*s)
1740             scriptname = s + 1;
1741     }
1742     else
1743         fdscript = -1;
1744     origfilename = savepv(e_tmpname ? "-e" : scriptname);
1745     curcop->cop_filegv = gv_fetchfile(origfilename);
1746     if (strEQ(origfilename,"-"))
1747         scriptname = "";
1748     if (fdscript >= 0) {
1749         rsfp = PerlIO_fdopen(fdscript,"r");
1750 #if defined(HAS_FCNTL) && defined(F_SETFD)
1751         if (rsfp)
1752             fcntl(PerlIO_fileno(rsfp),F_SETFD,1);  /* ensure close-on-exec */
1753 #endif
1754     }
1755     else if (preprocess) {
1756         char *cpp_cfg = CPPSTDIN;
1757         SV *cpp = NEWSV(0,0);
1758         SV *cmd = NEWSV(0,0);
1759
1760         if (strEQ(cpp_cfg, "cppstdin"))
1761             sv_catpvf(cpp, "%s/", BIN_EXP);
1762         sv_catpv(cpp, cpp_cfg);
1763
1764         sv_catpv(sv,"-I");
1765         sv_catpv(sv,PRIVLIB_EXP);
1766
1767 #ifdef MSDOS
1768         sv_setpvf(cmd, "\
1769 sed %s -e \"/^[^#]/b\" \
1770  -e \"/^#[      ]*include[      ]/b\" \
1771  -e \"/^#[      ]*define[       ]/b\" \
1772  -e \"/^#[      ]*if[   ]/b\" \
1773  -e \"/^#[      ]*ifdef[        ]/b\" \
1774  -e \"/^#[      ]*ifndef[       ]/b\" \
1775  -e \"/^#[      ]*else/b\" \
1776  -e \"/^#[      ]*elif[         ]/b\" \
1777  -e \"/^#[      ]*undef[        ]/b\" \
1778  -e \"/^#[      ]*endif/b\" \
1779  -e \"s/^#.*//\" \
1780  %s | %_ -C %_ %s",
1781           (doextract ? "-e \"1,/^#/d\n\"" : ""),
1782 #else
1783         sv_setpvf(cmd, "\
1784 %s %s -e '/^[^#]/b' \
1785  -e '/^#[       ]*include[      ]/b' \
1786  -e '/^#[       ]*define[       ]/b' \
1787  -e '/^#[       ]*if[   ]/b' \
1788  -e '/^#[       ]*ifdef[        ]/b' \
1789  -e '/^#[       ]*ifndef[       ]/b' \
1790  -e '/^#[       ]*else/b' \
1791  -e '/^#[       ]*elif[         ]/b' \
1792  -e '/^#[       ]*undef[        ]/b' \
1793  -e '/^#[       ]*endif/b' \
1794  -e 's/^[       ]*#.*//' \
1795  %s | %_ -C %_ %s",
1796 #ifdef LOC_SED
1797           LOC_SED,
1798 #else
1799           "sed",
1800 #endif
1801           (doextract ? "-e '1,/^#/d\n'" : ""),
1802 #endif
1803           scriptname, cpp, sv, CPPMINUS);
1804         doextract = FALSE;
1805 #ifdef IAMSUID                          /* actually, this is caught earlier */
1806         if (euid != uid && !euid) {     /* if running suidperl */
1807 #ifdef HAS_SETEUID
1808             (void)seteuid(uid);         /* musn't stay setuid root */
1809 #else
1810 #ifdef HAS_SETREUID
1811             (void)setreuid((Uid_t)-1, uid);
1812 #else
1813 #ifdef HAS_SETRESUID
1814             (void)setresuid((Uid_t)-1, uid, (Uid_t)-1);
1815 #else
1816             setuid(uid);
1817 #endif
1818 #endif
1819 #endif
1820             if (geteuid() != uid)
1821                 croak("Can't do seteuid!\n");
1822         }
1823 #endif /* IAMSUID */
1824         rsfp = my_popen(SvPVX(cmd), "r");
1825         SvREFCNT_dec(cmd);
1826         SvREFCNT_dec(cpp);
1827     }
1828     else if (!*scriptname) {
1829         forbid_setid("program input from stdin");
1830         rsfp = PerlIO_stdin();
1831     }
1832     else {
1833         rsfp = PerlIO_open(scriptname,"r");
1834 #if defined(HAS_FCNTL) && defined(F_SETFD)
1835         if (rsfp)
1836             fcntl(PerlIO_fileno(rsfp),F_SETFD,1);  /* ensure close-on-exec */
1837 #endif
1838     }
1839     if (e_tmpname) {
1840         e_fp = rsfp;
1841     }
1842     if (!rsfp) {
1843 #ifdef DOSUID
1844 #ifndef IAMSUID         /* in case script is not readable before setuid */
1845         if (euid && Stat(SvPVX(GvSV(curcop->cop_filegv)),&statbuf) >= 0 &&
1846           statbuf.st_mode & (S_ISUID|S_ISGID)) {
1847             /* try again */
1848             execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
1849             croak("Can't do setuid\n");
1850         }
1851 #endif
1852 #endif
1853         croak("Can't open perl script \"%s\": %s\n",
1854           SvPVX(GvSV(curcop->cop_filegv)), Strerror(errno));
1855     }
1856 }
1857
1858 static void
1859 validate_suid(validarg, scriptname)
1860 char *validarg;
1861 char *scriptname;
1862 {
1863     int which;
1864
1865     /* do we need to emulate setuid on scripts? */
1866
1867     /* This code is for those BSD systems that have setuid #! scripts disabled
1868      * in the kernel because of a security problem.  Merely defining DOSUID
1869      * in perl will not fix that problem, but if you have disabled setuid
1870      * scripts in the kernel, this will attempt to emulate setuid and setgid
1871      * on scripts that have those now-otherwise-useless bits set.  The setuid
1872      * root version must be called suidperl or sperlN.NNN.  If regular perl
1873      * discovers that it has opened a setuid script, it calls suidperl with
1874      * the same argv that it had.  If suidperl finds that the script it has
1875      * just opened is NOT setuid root, it sets the effective uid back to the
1876      * uid.  We don't just make perl setuid root because that loses the
1877      * effective uid we had before invoking perl, if it was different from the
1878      * uid.
1879      *
1880      * DOSUID must be defined in both perl and suidperl, and IAMSUID must
1881      * be defined in suidperl only.  suidperl must be setuid root.  The
1882      * Configure script will set this up for you if you want it.
1883      */
1884
1885 #ifdef DOSUID
1886     char *s, *s2;
1887
1888     if (Fstat(PerlIO_fileno(rsfp),&statbuf) < 0)        /* normal stat is insecure */
1889         croak("Can't stat script \"%s\"",origfilename);
1890     if (fdscript < 0 && statbuf.st_mode & (S_ISUID|S_ISGID)) {
1891         I32 len;
1892
1893 #ifdef IAMSUID
1894 #ifndef HAS_SETREUID
1895         /* On this access check to make sure the directories are readable,
1896          * there is actually a small window that the user could use to make
1897          * filename point to an accessible directory.  So there is a faint
1898          * chance that someone could execute a setuid script down in a
1899          * non-accessible directory.  I don't know what to do about that.
1900          * But I don't think it's too important.  The manual lies when
1901          * it says access() is useful in setuid programs.
1902          */
1903         if (access(SvPVX(GvSV(curcop->cop_filegv)),1))  /*double check*/
1904             croak("Permission denied");
1905 #else
1906         /* If we can swap euid and uid, then we can determine access rights
1907          * with a simple stat of the file, and then compare device and
1908          * inode to make sure we did stat() on the same file we opened.
1909          * Then we just have to make sure he or she can execute it.
1910          */
1911         {
1912             struct stat tmpstatbuf;
1913
1914             if (
1915 #ifdef HAS_SETREUID
1916                 setreuid(euid,uid) < 0
1917 #else
1918 # if HAS_SETRESUID
1919                 setresuid(euid,uid,(Uid_t)-1) < 0
1920 # endif
1921 #endif
1922                 || getuid() != euid || geteuid() != uid)
1923                 croak("Can't swap uid and euid");       /* really paranoid */
1924             if (Stat(SvPVX(GvSV(curcop->cop_filegv)),&tmpstatbuf) < 0)
1925                 croak("Permission denied");     /* testing full pathname here */
1926             if (tmpstatbuf.st_dev != statbuf.st_dev ||
1927                 tmpstatbuf.st_ino != statbuf.st_ino) {
1928                 (void)PerlIO_close(rsfp);
1929                 if (rsfp = my_popen("/bin/mail root","w")) {    /* heh, heh */
1930                     PerlIO_printf(rsfp,
1931 "User %ld tried to run dev %ld ino %ld in place of dev %ld ino %ld!\n\
1932 (Filename of set-id script was %s, uid %ld gid %ld.)\n\nSincerely,\nperl\n",
1933                         (long)uid,(long)tmpstatbuf.st_dev, (long)tmpstatbuf.st_ino,
1934                         (long)statbuf.st_dev, (long)statbuf.st_ino,
1935                         SvPVX(GvSV(curcop->cop_filegv)),
1936                         (long)statbuf.st_uid, (long)statbuf.st_gid);
1937                     (void)my_pclose(rsfp);
1938                 }
1939                 croak("Permission denied\n");
1940             }
1941             if (
1942 #ifdef HAS_SETREUID
1943               setreuid(uid,euid) < 0
1944 #else
1945 # if defined(HAS_SETRESUID)
1946               setresuid(uid,euid,(Uid_t)-1) < 0
1947 # endif
1948 #endif
1949               || getuid() != uid || geteuid() != euid)
1950                 croak("Can't reswap uid and euid");
1951             if (!cando(S_IXUSR,FALSE,&statbuf))         /* can real uid exec? */
1952                 croak("Permission denied\n");
1953         }
1954 #endif /* HAS_SETREUID */
1955 #endif /* IAMSUID */
1956
1957         if (!S_ISREG(statbuf.st_mode))
1958             croak("Permission denied");
1959         if (statbuf.st_mode & S_IWOTH)
1960             croak("Setuid/gid script is writable by world");
1961         doswitches = FALSE;             /* -s is insecure in suid */
1962         curcop->cop_line++;
1963         if (sv_gets(linestr, rsfp, 0) == Nullch ||
1964           strnNE(SvPV(linestr,na),"#!",2) )     /* required even on Sys V */
1965             croak("No #! line");
1966         s = SvPV(linestr,na)+2;
1967         if (*s == ' ') s++;
1968         while (!isSPACE(*s)) s++;
1969         for (s2 = s;  (s2 > SvPV(linestr,na)+2 &&
1970                        (isDIGIT(s2[-1]) || strchr("._-", s2[-1])));  s2--) ;
1971         if (strnNE(s2-4,"perl",4) && strnNE(s-9,"perl",4))  /* sanity check */
1972             croak("Not a perl script");
1973         while (*s == ' ' || *s == '\t') s++;
1974         /*
1975          * #! arg must be what we saw above.  They can invoke it by
1976          * mentioning suidperl explicitly, but they may not add any strange
1977          * arguments beyond what #! says if they do invoke suidperl that way.
1978          */
1979         len = strlen(validarg);
1980         if (strEQ(validarg," PHOOEY ") ||
1981             strnNE(s,validarg,len) || !isSPACE(s[len]))
1982             croak("Args must match #! line");
1983
1984 #ifndef IAMSUID
1985         if (euid != uid && (statbuf.st_mode & S_ISUID) &&
1986             euid == statbuf.st_uid)
1987             if (!do_undump)
1988                 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
1989 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
1990 #endif /* IAMSUID */
1991
1992         if (euid) {     /* oops, we're not the setuid root perl */
1993             (void)PerlIO_close(rsfp);
1994 #ifndef IAMSUID
1995             /* try again */
1996             execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
1997 #endif
1998             croak("Can't do setuid\n");
1999         }
2000
2001         if (statbuf.st_mode & S_ISGID && statbuf.st_gid != egid) {
2002 #ifdef HAS_SETEGID
2003             (void)setegid(statbuf.st_gid);
2004 #else
2005 #ifdef HAS_SETREGID
2006            (void)setregid((Gid_t)-1,statbuf.st_gid);
2007 #else
2008 #ifdef HAS_SETRESGID
2009            (void)setresgid((Gid_t)-1,statbuf.st_gid,(Gid_t)-1);
2010 #else
2011             setgid(statbuf.st_gid);
2012 #endif
2013 #endif
2014 #endif
2015             if (getegid() != statbuf.st_gid)
2016                 croak("Can't do setegid!\n");
2017         }
2018         if (statbuf.st_mode & S_ISUID) {
2019             if (statbuf.st_uid != euid)
2020 #ifdef HAS_SETEUID
2021                 (void)seteuid(statbuf.st_uid);  /* all that for this */
2022 #else
2023 #ifdef HAS_SETREUID
2024                 (void)setreuid((Uid_t)-1,statbuf.st_uid);
2025 #else
2026 #ifdef HAS_SETRESUID
2027                 (void)setresuid((Uid_t)-1,statbuf.st_uid,(Uid_t)-1);
2028 #else
2029                 setuid(statbuf.st_uid);
2030 #endif
2031 #endif
2032 #endif
2033             if (geteuid() != statbuf.st_uid)
2034                 croak("Can't do seteuid!\n");
2035         }
2036         else if (uid) {                 /* oops, mustn't run as root */
2037 #ifdef HAS_SETEUID
2038           (void)seteuid((Uid_t)uid);
2039 #else
2040 #ifdef HAS_SETREUID
2041           (void)setreuid((Uid_t)-1,(Uid_t)uid);
2042 #else
2043 #ifdef HAS_SETRESUID
2044           (void)setresuid((Uid_t)-1,(Uid_t)uid,(Uid_t)-1);
2045 #else
2046           setuid((Uid_t)uid);
2047 #endif
2048 #endif
2049 #endif
2050             if (geteuid() != uid)
2051                 croak("Can't do seteuid!\n");
2052         }
2053         init_ids();
2054         if (!cando(S_IXUSR,TRUE,&statbuf))
2055             croak("Permission denied\n");       /* they can't do this */
2056     }
2057 #ifdef IAMSUID
2058     else if (preprocess)
2059         croak("-P not allowed for setuid/setgid script\n");
2060     else if (fdscript >= 0)
2061         croak("fd script not allowed in suidperl\n");
2062     else
2063         croak("Script is not setuid/setgid in suidperl\n");
2064
2065     /* We absolutely must clear out any saved ids here, so we */
2066     /* exec the real perl, substituting fd script for scriptname. */
2067     /* (We pass script name as "subdir" of fd, which perl will grok.) */
2068     PerlIO_rewind(rsfp);
2069     lseek(PerlIO_fileno(rsfp),(Off_t)0,0);  /* just in case rewind didn't */
2070     for (which = 1; origargv[which] && origargv[which] != scriptname; which++) ;
2071     if (!origargv[which])
2072         croak("Permission denied");
2073     origargv[which] = savepv(form("/dev/fd/%d/%s",
2074                                   PerlIO_fileno(rsfp), origargv[which]));
2075 #if defined(HAS_FCNTL) && defined(F_SETFD)
2076     fcntl(PerlIO_fileno(rsfp),F_SETFD,0);       /* ensure no close-on-exec */
2077 #endif
2078     execv(form("%s/perl%s", BIN_EXP, patchlevel), origargv);    /* try again */
2079     croak("Can't do setuid\n");
2080 #endif /* IAMSUID */
2081 #else /* !DOSUID */
2082     if (euid != uid || egid != gid) {   /* (suidperl doesn't exist, in fact) */
2083 #ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
2084         Fstat(PerlIO_fileno(rsfp),&statbuf);    /* may be either wrapped or real suid */
2085         if ((euid != uid && euid == statbuf.st_uid && statbuf.st_mode & S_ISUID)
2086             ||
2087             (egid != gid && egid == statbuf.st_gid && statbuf.st_mode & S_ISGID)
2088            )
2089             if (!do_undump)
2090                 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2091 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2092 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
2093         /* not set-id, must be wrapped */
2094     }
2095 #endif /* DOSUID */
2096 }
2097
2098 static void
2099 find_beginning()
2100 {
2101     register char *s, *s2;
2102
2103     /* skip forward in input to the real script? */
2104
2105     forbid_setid("-x");
2106     while (doextract) {
2107         if ((s = sv_gets(linestr, rsfp, 0)) == Nullch)
2108             croak("No Perl script found in input\n");
2109         if (*s == '#' && s[1] == '!' && (s = instr(s,"perl"))) {
2110             PerlIO_ungetc(rsfp, '\n');          /* to keep line count right */
2111             doextract = FALSE;
2112             while (*s && !(isSPACE (*s) || *s == '#')) s++;
2113             s2 = s;
2114             while (*s == ' ' || *s == '\t') s++;
2115             if (*s++ == '-') {
2116                 while (isDIGIT(s2[-1]) || strchr("-._", s2[-1])) s2--;
2117                 if (strnEQ(s2-4,"perl",4))
2118                     /*SUPPRESS 530*/
2119                     while (s = moreswitches(s)) ;
2120             }
2121             if (cddir && chdir(cddir) < 0)
2122                 croak("Can't chdir to %s",cddir);
2123         }
2124     }
2125 }
2126
2127 static void
2128 init_ids()
2129 {
2130     uid = (int)getuid();
2131     euid = (int)geteuid();
2132     gid = (int)getgid();
2133     egid = (int)getegid();
2134 #ifdef VMS
2135     uid |= gid << 16;
2136     euid |= egid << 16;
2137 #endif
2138     tainting |= (uid && (euid != uid || egid != gid));
2139 }
2140
2141 static void
2142 forbid_setid(s)
2143 char *s;
2144 {
2145     if (euid != uid)
2146         croak("No %s allowed while running setuid", s);
2147     if (egid != gid)
2148         croak("No %s allowed while running setgid", s);
2149 }
2150
2151 static void
2152 init_debugger()
2153 {
2154     curstash = debstash;
2155     dbargs = GvAV(gv_AVadd((gv_fetchpv("args", GV_ADDMULTI, SVt_PVAV))));
2156     AvREAL_off(dbargs);
2157     DBgv = gv_fetchpv("DB", GV_ADDMULTI, SVt_PVGV);
2158     DBline = gv_fetchpv("dbline", GV_ADDMULTI, SVt_PVAV);
2159     DBsub = gv_HVadd(gv_fetchpv("sub", GV_ADDMULTI, SVt_PVHV));
2160     DBsingle = GvSV((gv_fetchpv("single", GV_ADDMULTI, SVt_PV)));
2161     sv_setiv(DBsingle, 0); 
2162     DBtrace = GvSV((gv_fetchpv("trace", GV_ADDMULTI, SVt_PV)));
2163     sv_setiv(DBtrace, 0); 
2164     DBsignal = GvSV((gv_fetchpv("signal", GV_ADDMULTI, SVt_PV)));
2165     sv_setiv(DBsignal, 0); 
2166     curstash = defstash;
2167 }
2168
2169 static void
2170 init_stacks()
2171 {
2172     curstack = newAV();
2173     mainstack = curstack;               /* remember in case we switch stacks */
2174     AvREAL_off(curstack);               /* not a real array */
2175     av_extend(curstack,127);
2176
2177     stack_base = AvARRAY(curstack);
2178     stack_sp = stack_base;
2179     stack_max = stack_base + 127;
2180
2181     cxstack_max = 8192 / sizeof(CONTEXT) - 2;   /* Use most of 8K. */
2182     New(50,cxstack,cxstack_max + 1,CONTEXT);
2183     cxstack_ix  = -1;
2184
2185     New(50,tmps_stack,128,SV*);
2186     tmps_ix = -1;
2187     tmps_max = 128;
2188
2189     DEBUG( {
2190         New(51,debname,128,char);
2191         New(52,debdelim,128,char);
2192     } )
2193
2194     /*
2195      * The following stacks almost certainly should be per-interpreter,
2196      * but for now they're not.  XXX
2197      */
2198
2199     if (markstack) {
2200         markstack_ptr = markstack;
2201     } else {
2202         New(54,markstack,64,I32);
2203         markstack_ptr = markstack;
2204         markstack_max = markstack + 64;
2205     }
2206
2207     if (scopestack) {
2208         scopestack_ix = 0;
2209     } else {
2210         New(54,scopestack,32,I32);
2211         scopestack_ix = 0;
2212         scopestack_max = 32;
2213     }
2214
2215     if (savestack) {
2216         savestack_ix = 0;
2217     } else {
2218         New(54,savestack,128,ANY);
2219         savestack_ix = 0;
2220         savestack_max = 128;
2221     }
2222
2223     if (retstack) {
2224         retstack_ix = 0;
2225     } else {
2226         New(54,retstack,16,OP*);
2227         retstack_ix = 0;
2228         retstack_max = 16;
2229     }
2230 }
2231
2232 static void
2233 nuke_stacks()
2234 {
2235     Safefree(cxstack);
2236     Safefree(tmps_stack);
2237     DEBUG( {
2238         Safefree(debname);
2239         Safefree(debdelim);
2240     } )
2241 }
2242
2243 static PerlIO *tmpfp;  /* moved outside init_lexer() because of UNICOS bug */
2244
2245 static void
2246 init_lexer()
2247 {
2248     tmpfp = rsfp;
2249     lex_start(linestr);
2250     rsfp = tmpfp;
2251     subname = newSVpv("main",4);
2252 }
2253
2254 static void
2255 init_predump_symbols()
2256 {
2257     GV *tmpgv;
2258     GV *othergv;
2259
2260     sv_setpvn(GvSV(gv_fetchpv("\"", TRUE, SVt_PV)), " ", 1);
2261
2262     stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
2263     GvMULTI_on(stdingv);
2264     IoIFP(GvIOp(stdingv)) = PerlIO_stdin();
2265     tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
2266     GvMULTI_on(tmpgv);
2267     GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(stdingv));
2268
2269     tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
2270     GvMULTI_on(tmpgv);
2271     IoOFP(GvIOp(tmpgv)) = IoIFP(GvIOp(tmpgv)) = PerlIO_stdout();
2272     setdefout(tmpgv);
2273     tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
2274     GvMULTI_on(tmpgv);
2275     GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(defoutgv));
2276
2277     othergv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
2278     GvMULTI_on(othergv);
2279     IoOFP(GvIOp(othergv)) = IoIFP(GvIOp(othergv)) = PerlIO_stderr();
2280     tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
2281     GvMULTI_on(tmpgv);
2282     GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(othergv));
2283
2284     statname = NEWSV(66,0);             /* last filename we did stat on */
2285
2286     if (!osname)
2287         osname = savepv(OSNAME);
2288 }
2289
2290 static void
2291 init_postdump_symbols(argc,argv,env)
2292 register int argc;
2293 register char **argv;
2294 register char **env;
2295 {
2296     char *s;
2297     SV *sv;
2298     GV* tmpgv;
2299
2300     argc--,argv++;      /* skip name of script */
2301     if (doswitches) {
2302         for (; argc > 0 && **argv == '-'; argc--,argv++) {
2303             if (!argv[0][1])
2304                 break;
2305             if (argv[0][1] == '-') {
2306                 argc--,argv++;
2307                 break;
2308             }
2309             if (s = strchr(argv[0], '=')) {
2310                 *s++ = '\0';
2311                 sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),s);
2312             }
2313             else
2314                 sv_setiv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),1);
2315         }
2316     }
2317     toptarget = NEWSV(0,0);
2318     sv_upgrade(toptarget, SVt_PVFM);
2319     sv_setpvn(toptarget, "", 0);
2320     bodytarget = NEWSV(0,0);
2321     sv_upgrade(bodytarget, SVt_PVFM);
2322     sv_setpvn(bodytarget, "", 0);
2323     formtarget = bodytarget;
2324
2325     TAINT;
2326     if (tmpgv = gv_fetchpv("0",TRUE, SVt_PV)) {
2327         sv_setpv(GvSV(tmpgv),origfilename);
2328         magicname("0", "0", 1);
2329     }
2330     if (tmpgv = gv_fetchpv("\030",TRUE, SVt_PV))
2331         sv_setpv(GvSV(tmpgv),origargv[0]);
2332     if (argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV)) {
2333         GvMULTI_on(argvgv);
2334         (void)gv_AVadd(argvgv);
2335         av_clear(GvAVn(argvgv));
2336         for (; argc > 0; argc--,argv++) {
2337             av_push(GvAVn(argvgv),newSVpv(argv[0],0));
2338         }
2339     }
2340     if (envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV)) {
2341         HV *hv;
2342         GvMULTI_on(envgv);
2343         hv = GvHVn(envgv);
2344         hv_magic(hv, envgv, 'E');
2345 #ifndef VMS  /* VMS doesn't have environ array */
2346         /* Note that if the supplied env parameter is actually a copy
2347            of the global environ then it may now point to free'd memory
2348            if the environment has been modified since. To avoid this
2349            problem we treat env==NULL as meaning 'use the default'
2350         */
2351         if (!env)
2352             env = environ;
2353         if (env != environ)
2354             environ[0] = Nullch;
2355         for (; *env; env++) {
2356             if (!(s = strchr(*env,'=')))
2357                 continue;
2358             *s++ = '\0';
2359 #ifdef WIN32
2360             (void)strupr(*env);
2361 #endif
2362             sv = newSVpv(s--,0);
2363             (void)hv_store(hv, *env, s - *env, sv, 0);
2364             *s = '=';
2365 #if defined(__BORLANDC__) && defined(USE_WIN32_RTL_ENV)
2366             /* Sins of the RTL. See note in my_setenv(). */
2367             (void)putenv(savepv(*env));
2368 #endif
2369         }
2370 #endif
2371 #ifdef DYNAMIC_ENV_FETCH
2372         HvNAME(hv) = savepv(ENV_HV_NAME);
2373 #endif
2374     }
2375     TAINT_NOT;
2376     if (tmpgv = gv_fetchpv("$",TRUE, SVt_PV))
2377         sv_setiv(GvSV(tmpgv), (IV)getpid());
2378 }
2379
2380 static void
2381 init_perllib()
2382 {
2383     char *s;
2384     if (!tainting) {
2385 #ifndef VMS
2386         s = getenv("PERL5LIB");
2387         if (s)
2388             incpush(s, TRUE);
2389         else
2390             incpush(getenv("PERLLIB"), FALSE);
2391 #else /* VMS */
2392         /* Treat PERL5?LIB as a possible search list logical name -- the
2393          * "natural" VMS idiom for a Unix path string.  We allow each
2394          * element to be a set of |-separated directories for compatibility.
2395          */
2396         char buf[256];
2397         int idx = 0;
2398         if (my_trnlnm("PERL5LIB",buf,0))
2399             do { incpush(buf,TRUE); } while (my_trnlnm("PERL5LIB",buf,++idx));
2400         else
2401             while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE);
2402 #endif /* VMS */
2403     }
2404
2405 /* Use the ~-expanded versions of APPLLIB (undocumented),
2406     ARCHLIB PRIVLIB SITEARCH SITELIB and OLDARCHLIB
2407 */
2408 #ifdef APPLLIB_EXP
2409     incpush(APPLLIB_EXP, FALSE);
2410 #endif
2411
2412 #ifdef ARCHLIB_EXP
2413     incpush(ARCHLIB_EXP, FALSE);
2414 #endif
2415 #ifndef PRIVLIB_EXP
2416 #define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
2417 #endif
2418     incpush(PRIVLIB_EXP, FALSE);
2419
2420 #ifdef SITEARCH_EXP
2421     incpush(SITEARCH_EXP, FALSE);
2422 #endif
2423 #ifdef SITELIB_EXP
2424     incpush(SITELIB_EXP, FALSE);
2425 #endif
2426 #ifdef OLDARCHLIB_EXP  /* 5.00[01] compatibility */
2427     incpush(OLDARCHLIB_EXP, FALSE);
2428 #endif
2429     
2430     if (!tainting)
2431         incpush(".", FALSE);
2432 }
2433
2434 #if defined(DOSISH)
2435 #    define PERLLIB_SEP ';'
2436 #else
2437 #  if defined(VMS)
2438 #    define PERLLIB_SEP '|'
2439 #  else
2440 #    define PERLLIB_SEP ':'
2441 #  endif
2442 #endif
2443 #ifndef PERLLIB_MANGLE
2444 #  define PERLLIB_MANGLE(s,n) (s)
2445 #endif 
2446
2447 static void
2448 incpush(p, addsubdirs)
2449 char *p;
2450 int addsubdirs;
2451 {
2452     SV *subdir = Nullsv;
2453     static char *archpat_auto;
2454
2455     if (!p)
2456         return;
2457
2458     if (addsubdirs) {
2459         subdir = newSV(0);
2460         if (!archpat_auto) {
2461             STRLEN len = (sizeof(ARCHNAME) + strlen(patchlevel)
2462                           + sizeof("//auto"));
2463             New(55, archpat_auto, len, char);
2464             sprintf(archpat_auto, "/%s/%s/auto", ARCHNAME, patchlevel);
2465 #ifdef VMS
2466         for (len = sizeof(ARCHNAME) + 2;
2467              archpat_auto[len] != '\0' && archpat_auto[len] != '/'; len++)
2468                 if (archpat_auto[len] == '.') archpat_auto[len] = '_';
2469 #endif
2470         }
2471     }
2472
2473     /* Break at all separators */
2474     while (p && *p) {
2475         SV *libdir = newSV(0);
2476         char *s;
2477
2478         /* skip any consecutive separators */
2479         while ( *p == PERLLIB_SEP ) {
2480             /* Uncomment the next line for PATH semantics */
2481             /* av_push(GvAVn(incgv), newSVpv(".", 1)); */
2482             p++;
2483         }
2484
2485         if ( (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
2486             sv_setpvn(libdir, PERLLIB_MANGLE(p, (STRLEN)(s - p)),
2487                       (STRLEN)(s - p));
2488             p = s + 1;
2489         }
2490         else {
2491             sv_setpv(libdir, PERLLIB_MANGLE(p, 0));
2492             p = Nullch; /* break out */
2493         }
2494
2495         /*
2496          * BEFORE pushing libdir onto @INC we may first push version- and
2497          * archname-specific sub-directories.
2498          */
2499         if (addsubdirs) {
2500             struct stat tmpstatbuf;
2501 #ifdef VMS
2502             char *unix;
2503             STRLEN len;
2504
2505             if ((unix = tounixspec_ts(SvPV(libdir,na),Nullch)) != Nullch) {
2506                 len = strlen(unix);
2507                 while (unix[len-1] == '/') len--;  /* Cosmetic */
2508                 sv_usepvn(libdir,unix,len);
2509             }
2510             else
2511                 PerlIO_printf(PerlIO_stderr(),
2512                               "Failed to unixify @INC element \"%s\"\n",
2513                               SvPV(libdir,na));
2514 #endif
2515             /* .../archname/version if -d .../archname/version/auto */
2516             sv_setsv(subdir, libdir);
2517             sv_catpv(subdir, archpat_auto);
2518             if (Stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2519                   S_ISDIR(tmpstatbuf.st_mode))
2520                 av_push(GvAVn(incgv),
2521                         newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2522
2523             /* .../archname if -d .../archname/auto */
2524             sv_insert(subdir, SvCUR(libdir) + sizeof(ARCHNAME),
2525                       strlen(patchlevel) + 1, "", 0);
2526             if (Stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2527                   S_ISDIR(tmpstatbuf.st_mode))
2528                 av_push(GvAVn(incgv),
2529                         newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2530         }
2531
2532         /* finally push this lib directory on the end of @INC */
2533         av_push(GvAVn(incgv), libdir);
2534     }
2535
2536     SvREFCNT_dec(subdir);
2537 }
2538
2539 void
2540 call_list(oldscope, list)
2541 I32 oldscope;
2542 AV* list;
2543 {
2544     line_t oldline = curcop->cop_line;
2545     STRLEN len;
2546     dJMPENV;
2547     int ret;
2548
2549     while (AvFILL(list) >= 0) {
2550         CV *cv = (CV*)av_shift(list);
2551
2552         SAVEFREESV(cv);
2553
2554         JMPENV_PUSH(ret);
2555         switch (ret) {
2556         case 0: {
2557                 SV* atsv = GvSV(errgv);
2558                 PUSHMARK(stack_sp);
2559                 perl_call_sv((SV*)cv, G_EVAL|G_DISCARD);
2560                 (void)SvPV(atsv, len);
2561                 if (len) {
2562                     JMPENV_POP;
2563                     curcop = &compiling;
2564                     curcop->cop_line = oldline;
2565                     if (list == beginav)
2566                         sv_catpv(atsv, "BEGIN failed--compilation aborted");
2567                     else
2568                         sv_catpv(atsv, "END failed--cleanup aborted");
2569                     while (scopestack_ix > oldscope)
2570                         LEAVE;
2571                     croak("%s", SvPVX(atsv));
2572                 }
2573             }
2574             break;
2575         case 1:
2576             STATUS_ALL_FAILURE;
2577             /* FALL THROUGH */
2578         case 2:
2579             /* my_exit() was called */
2580             while (scopestack_ix > oldscope)
2581                 LEAVE;
2582             curstash = defstash;
2583             if (endav)
2584                 call_list(oldscope, endav);
2585             FREETMPS;
2586             JMPENV_POP;
2587             curcop = &compiling;
2588             curcop->cop_line = oldline;
2589             if (statusvalue) {
2590                 if (list == beginav)
2591                     croak("BEGIN failed--compilation aborted");
2592                 else
2593                     croak("END failed--cleanup aborted");
2594             }
2595             my_exit_jump();
2596             /* NOTREACHED */
2597         case 3:
2598             if (!restartop) {
2599                 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
2600                 FREETMPS;
2601                 break;
2602             }
2603             JMPENV_POP;
2604             curcop = &compiling;
2605             curcop->cop_line = oldline;
2606             JMPENV_JUMP(3);
2607         }
2608         JMPENV_POP;
2609     }
2610 }
2611
2612 void
2613 my_exit(status)
2614 U32 status;
2615 {
2616     switch (status) {
2617     case 0:
2618         STATUS_ALL_SUCCESS;
2619         break;
2620     case 1:
2621         STATUS_ALL_FAILURE;
2622         break;
2623     default:
2624         STATUS_NATIVE_SET(status);
2625         break;
2626     }
2627     my_exit_jump();
2628 }
2629
2630 void
2631 my_failure_exit()
2632 {
2633 #ifdef VMS
2634     if (vaxc$errno & 1) {
2635         if (STATUS_NATIVE & 1)          /* fortuitiously includes "-1" */
2636             STATUS_NATIVE_SET(44);
2637     }
2638     else {
2639         if (!vaxc$errno && errno)       /* unlikely */
2640             STATUS_NATIVE_SET(44);
2641         else
2642             STATUS_NATIVE_SET(vaxc$errno);
2643     }
2644 #else
2645     if (errno & 255)
2646         STATUS_POSIX_SET(errno);
2647     else if (STATUS_POSIX == 0)
2648         STATUS_POSIX_SET(255);
2649 #endif
2650     my_exit_jump();
2651 }
2652
2653 static void
2654 my_exit_jump()
2655 {
2656     register CONTEXT *cx;
2657     I32 gimme;
2658     SV **newsp;
2659
2660     if (e_tmpname) {
2661         if (e_fp) {
2662             PerlIO_close(e_fp);
2663             e_fp = Nullfp;
2664         }
2665         (void)UNLINK(e_tmpname);
2666         Safefree(e_tmpname);
2667         e_tmpname = Nullch;
2668     }
2669
2670     if (cxstack_ix >= 0) {
2671         if (cxstack_ix > 0)
2672             dounwind(0);
2673         POPBLOCK(cx,curpm);
2674         LEAVE;
2675     }
2676
2677     JMPENV_JUMP(2);
2678 }