b3afec7ac0e4daffa4d32c0fcfd6c97a811362e5
[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         if (restartav)
889             calllist(restartav);
890     }
891
892     /* do it */
893
894     if (restartop) {
895         op = restartop;
896         restartop = 0;
897         runops();
898     }
899     else if (main_start) {
900         CvDEPTH(main_cv) = 1;
901         op = main_start;
902         runops();
903     }
904
905     my_exit(0);
906     /* NOTREACHED */
907     return 0;
908 }
909
910 SV*
911 perl_get_sv(name, create)
912 char* name;
913 I32 create;
914 {
915     GV* gv = gv_fetchpv(name, create, SVt_PV);
916     if (gv)
917         return GvSV(gv);
918     return Nullsv;
919 }
920
921 AV*
922 perl_get_av(name, create)
923 char* name;
924 I32 create;
925 {
926     GV* gv = gv_fetchpv(name, create, SVt_PVAV);
927     if (create)
928         return GvAVn(gv);
929     if (gv)
930         return GvAV(gv);
931     return Nullav;
932 }
933
934 HV*
935 perl_get_hv(name, create)
936 char* name;
937 I32 create;
938 {
939     GV* gv = gv_fetchpv(name, create, SVt_PVHV);
940     if (create)
941         return GvHVn(gv);
942     if (gv)
943         return GvHV(gv);
944     return Nullhv;
945 }
946
947 CV*
948 perl_get_cv(name, create)
949 char* name;
950 I32 create;
951 {
952     GV* gv = gv_fetchpv(name, create, SVt_PVCV);
953     if (create && !GvCVu(gv))
954         return newSUB(start_subparse(FALSE, 0),
955                       newSVOP(OP_CONST, 0, newSVpv(name,0)),
956                       Nullop,
957                       Nullop);
958     if (gv)
959         return GvCVu(gv);
960     return Nullcv;
961 }
962
963 /* Be sure to refetch the stack pointer after calling these routines. */
964
965 I32
966 perl_call_argv(subname, flags, argv)
967 char *subname;
968 I32 flags;              /* See G_* flags in cop.h */
969 register char **argv;   /* null terminated arg list */
970 {
971     dSP;
972
973     PUSHMARK(sp);
974     if (argv) {
975         while (*argv) {
976             XPUSHs(sv_2mortal(newSVpv(*argv,0)));
977             argv++;
978         }
979         PUTBACK;
980     }
981     return perl_call_pv(subname, flags);
982 }
983
984 I32
985 perl_call_pv(subname, flags)
986 char *subname;          /* name of the subroutine */
987 I32 flags;              /* See G_* flags in cop.h */
988 {
989     return perl_call_sv((SV*)perl_get_cv(subname, TRUE), flags);
990 }
991
992 I32
993 perl_call_method(methname, flags)
994 char *methname;         /* name of the subroutine */
995 I32 flags;              /* See G_* flags in cop.h */
996 {
997     dSP;
998     OP myop;
999     if (!op)
1000         op = &myop;
1001     XPUSHs(sv_2mortal(newSVpv(methname,0)));
1002     PUTBACK;
1003     pp_method();
1004     return perl_call_sv(*stack_sp--, flags);
1005 }
1006
1007 /* May be called with any of a CV, a GV, or an SV containing the name. */
1008 I32
1009 perl_call_sv(sv, flags)
1010 SV* sv;
1011 I32 flags;              /* See G_* flags in cop.h */
1012 {
1013     LOGOP myop;         /* fake syntax tree node */
1014     SV** sp = stack_sp;
1015     I32 oldmark;
1016     I32 retval;
1017     I32 oldscope;
1018     static CV *DBcv;
1019     bool oldcatch = CATCH_GET;
1020     dJMPENV;
1021     int ret;
1022
1023     if (flags & G_DISCARD) {
1024         ENTER;
1025         SAVETMPS;
1026     }
1027
1028     Zero(&myop, 1, LOGOP);
1029     myop.op_next = Nullop;
1030     if (!(flags & G_NOARGS))
1031         myop.op_flags |= OPf_STACKED;
1032     myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1033                       (flags & G_ARRAY) ? OPf_WANT_LIST :
1034                       OPf_WANT_SCALAR);
1035     SAVESPTR(op);
1036     op = (OP*)&myop;
1037
1038     EXTEND(stack_sp, 1);
1039     *++stack_sp = sv;
1040     oldmark = TOPMARK;
1041     oldscope = scopestack_ix;
1042
1043     if (perldb && curstash != debstash
1044            /* Handle first BEGIN of -d. */
1045           && (DBcv || (DBcv = GvCV(DBsub)))
1046            /* Try harder, since this may have been a sighandler, thus
1047             * curstash may be meaningless. */
1048           && (SvTYPE(sv) != SVt_PVCV || CvSTASH((CV*)sv) != debstash))
1049         op->op_private |= OPpENTERSUB_DB;
1050
1051     if (flags & G_EVAL) {
1052         cLOGOP->op_other = op;
1053         markstack_ptr--;
1054         /* we're trying to emulate pp_entertry() here */
1055         {
1056             register CONTEXT *cx;
1057             I32 gimme = GIMME_V;
1058             
1059             ENTER;
1060             SAVETMPS;
1061             
1062             push_return(op->op_next);
1063             PUSHBLOCK(cx, CXt_EVAL, stack_sp);
1064             PUSHEVAL(cx, 0, 0);
1065             eval_root = op;             /* Only needed so that goto works right. */
1066             
1067             in_eval = 1;
1068             if (flags & G_KEEPERR)
1069                 in_eval |= 4;
1070             else
1071                 sv_setpv(GvSV(errgv),"");
1072         }
1073         markstack_ptr++;
1074
1075         JMPENV_PUSH(ret);
1076         switch (ret) {
1077         case 0:
1078             break;
1079         case 1:
1080             STATUS_ALL_FAILURE;
1081             /* FALL THROUGH */
1082         case 2:
1083             /* my_exit() was called */
1084             curstash = defstash;
1085             FREETMPS;
1086             JMPENV_POP;
1087             if (statusvalue)
1088                 croak("Callback called exit");
1089             my_exit_jump();
1090             /* NOTREACHED */
1091         case 3:
1092             if (restartop) {
1093                 op = restartop;
1094                 restartop = 0;
1095                 break;
1096             }
1097             stack_sp = stack_base + oldmark;
1098             if (flags & G_ARRAY)
1099                 retval = 0;
1100             else {
1101                 retval = 1;
1102                 *++stack_sp = &sv_undef;
1103             }
1104             goto cleanup;
1105         }
1106     }
1107     else
1108         CATCH_SET(TRUE);
1109
1110     if (op == (OP*)&myop)
1111         op = pp_entersub();
1112     if (op)
1113         runops();
1114     retval = stack_sp - (stack_base + oldmark);
1115     if ((flags & G_EVAL) && !(flags & G_KEEPERR))
1116         sv_setpv(GvSV(errgv),"");
1117
1118   cleanup:
1119     if (flags & G_EVAL) {
1120         if (scopestack_ix > oldscope) {
1121             SV **newsp;
1122             PMOP *newpm;
1123             I32 gimme;
1124             register CONTEXT *cx;
1125             I32 optype;
1126
1127             POPBLOCK(cx,newpm);
1128             POPEVAL(cx);
1129             pop_return();
1130             curpm = newpm;
1131             LEAVE;
1132         }
1133         JMPENV_POP;
1134     }
1135     else
1136         CATCH_SET(oldcatch);
1137
1138     if (flags & G_DISCARD) {
1139         stack_sp = stack_base + oldmark;
1140         retval = 0;
1141         FREETMPS;
1142         LEAVE;
1143     }
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         }
2362 #endif
2363 #ifdef DYNAMIC_ENV_FETCH
2364         HvNAME(hv) = savepv(ENV_HV_NAME);
2365 #endif
2366     }
2367     TAINT_NOT;
2368     if (tmpgv = gv_fetchpv("$",TRUE, SVt_PV))
2369         sv_setiv(GvSV(tmpgv), (IV)getpid());
2370 }
2371
2372 static void
2373 init_perllib()
2374 {
2375     char *s;
2376     if (!tainting) {
2377 #ifndef VMS
2378         s = getenv("PERL5LIB");
2379         if (s)
2380             incpush(s, TRUE);
2381         else
2382             incpush(getenv("PERLLIB"), FALSE);
2383 #else /* VMS */
2384         /* Treat PERL5?LIB as a possible search list logical name -- the
2385          * "natural" VMS idiom for a Unix path string.  We allow each
2386          * element to be a set of |-separated directories for compatibility.
2387          */
2388         char buf[256];
2389         int idx = 0;
2390         if (my_trnlnm("PERL5LIB",buf,0))
2391             do { incpush(buf,TRUE); } while (my_trnlnm("PERL5LIB",buf,++idx));
2392         else
2393             while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE);
2394 #endif /* VMS */
2395     }
2396
2397 /* Use the ~-expanded versions of APPLLIB (undocumented),
2398     ARCHLIB PRIVLIB SITEARCH SITELIB and OLDARCHLIB
2399 */
2400 #ifdef APPLLIB_EXP
2401     incpush(APPLLIB_EXP, FALSE);
2402 #endif
2403
2404 #ifdef ARCHLIB_EXP
2405     incpush(ARCHLIB_EXP, FALSE);
2406 #endif
2407 #ifndef PRIVLIB_EXP
2408 #define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
2409 #endif
2410     incpush(PRIVLIB_EXP, FALSE);
2411
2412 #ifdef SITEARCH_EXP
2413     incpush(SITEARCH_EXP, FALSE);
2414 #endif
2415 #ifdef SITELIB_EXP
2416     incpush(SITELIB_EXP, FALSE);
2417 #endif
2418 #ifdef OLDARCHLIB_EXP  /* 5.00[01] compatibility */
2419     incpush(OLDARCHLIB_EXP, FALSE);
2420 #endif
2421     
2422     if (!tainting)
2423         incpush(".", FALSE);
2424 }
2425
2426 #if defined(DOSISH)
2427 #    define PERLLIB_SEP ';'
2428 #else
2429 #  if defined(VMS)
2430 #    define PERLLIB_SEP '|'
2431 #  else
2432 #    define PERLLIB_SEP ':'
2433 #  endif
2434 #endif
2435 #ifndef PERLLIB_MANGLE
2436 #  define PERLLIB_MANGLE(s,n) (s)
2437 #endif 
2438
2439 static void
2440 incpush(p, addsubdirs)
2441 char *p;
2442 int addsubdirs;
2443 {
2444     SV *subdir = Nullsv;
2445     static char *archpat_auto;
2446
2447     if (!p)
2448         return;
2449
2450     if (addsubdirs) {
2451         subdir = newSV(0);
2452         if (!archpat_auto) {
2453             STRLEN len = (sizeof(ARCHNAME) + strlen(patchlevel)
2454                           + sizeof("//auto"));
2455             New(55, archpat_auto, len, char);
2456             sprintf(archpat_auto, "/%s/%s/auto", ARCHNAME, patchlevel);
2457 #ifdef VMS
2458         for (len = sizeof(ARCHNAME) + 2;
2459              archpat_auto[len] != '\0' && archpat_auto[len] != '/'; len++)
2460                 if (archpat_auto[len] == '.') archpat_auto[len] = '_';
2461 #endif
2462         }
2463     }
2464
2465     /* Break at all separators */
2466     while (p && *p) {
2467         SV *libdir = newSV(0);
2468         char *s;
2469
2470         /* skip any consecutive separators */
2471         while ( *p == PERLLIB_SEP ) {
2472             /* Uncomment the next line for PATH semantics */
2473             /* av_push(GvAVn(incgv), newSVpv(".", 1)); */
2474             p++;
2475         }
2476
2477         if ( (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
2478             sv_setpvn(libdir, PERLLIB_MANGLE(p, (STRLEN)(s - p)),
2479                       (STRLEN)(s - p));
2480             p = s + 1;
2481         }
2482         else {
2483             sv_setpv(libdir, PERLLIB_MANGLE(p, 0));
2484             p = Nullch; /* break out */
2485         }
2486
2487         /*
2488          * BEFORE pushing libdir onto @INC we may first push version- and
2489          * archname-specific sub-directories.
2490          */
2491         if (addsubdirs) {
2492             struct stat tmpstatbuf;
2493 #ifdef VMS
2494             char *unix;
2495             STRLEN len;
2496
2497             if ((unix = tounixspec_ts(SvPV(libdir,na),Nullch)) != Nullch) {
2498                 len = strlen(unix);
2499                 while (unix[len-1] == '/') len--;  /* Cosmetic */
2500                 sv_usepvn(libdir,unix,len);
2501             }
2502             else
2503                 PerlIO_printf(PerlIO_stderr(),
2504                               "Failed to unixify @INC element \"%s\"\n",
2505                               SvPV(libdir,na));
2506 #endif
2507             /* .../archname/version if -d .../archname/version/auto */
2508             sv_setsv(subdir, libdir);
2509             sv_catpv(subdir, archpat_auto);
2510             if (Stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2511                   S_ISDIR(tmpstatbuf.st_mode))
2512                 av_push(GvAVn(incgv),
2513                         newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2514
2515             /* .../archname if -d .../archname/auto */
2516             sv_insert(subdir, SvCUR(libdir) + sizeof(ARCHNAME),
2517                       strlen(patchlevel) + 1, "", 0);
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
2524         /* finally push this lib directory on the end of @INC */
2525         av_push(GvAVn(incgv), libdir);
2526     }
2527
2528     SvREFCNT_dec(subdir);
2529 }
2530
2531 void
2532 call_list(oldscope, list)
2533 I32 oldscope;
2534 AV* list;
2535 {
2536     line_t oldline = curcop->cop_line;
2537     STRLEN len;
2538     dJMPENV;
2539     int ret;
2540
2541     while (AvFILL(list) >= 0) {
2542         CV *cv = (CV*)av_shift(list);
2543
2544         SAVEFREESV(cv);
2545
2546         JMPENV_PUSH(ret);
2547         switch (ret) {
2548         case 0: {
2549                 SV* atsv = GvSV(errgv);
2550                 PUSHMARK(stack_sp);
2551                 perl_call_sv((SV*)cv, G_EVAL|G_DISCARD);
2552                 (void)SvPV(atsv, len);
2553                 if (len) {
2554                     JMPENV_POP;
2555                     curcop = &compiling;
2556                     curcop->cop_line = oldline;
2557                     if (list == beginav)
2558                         sv_catpv(atsv, "BEGIN failed--compilation aborted");
2559                     else
2560                         sv_catpv(atsv, "END failed--cleanup aborted");
2561                     while (scopestack_ix > oldscope)
2562                         LEAVE;
2563                     croak("%s", SvPVX(atsv));
2564                 }
2565             }
2566             break;
2567         case 1:
2568             STATUS_ALL_FAILURE;
2569             /* FALL THROUGH */
2570         case 2:
2571             /* my_exit() was called */
2572             while (scopestack_ix > oldscope)
2573                 LEAVE;
2574             curstash = defstash;
2575             if (endav)
2576                 call_list(oldscope, endav);
2577             FREETMPS;
2578             JMPENV_POP;
2579             curcop = &compiling;
2580             curcop->cop_line = oldline;
2581             if (statusvalue) {
2582                 if (list == beginav)
2583                     croak("BEGIN failed--compilation aborted");
2584                 else
2585                     croak("END failed--cleanup aborted");
2586             }
2587             my_exit_jump();
2588             /* NOTREACHED */
2589         case 3:
2590             if (!restartop) {
2591                 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
2592                 FREETMPS;
2593                 break;
2594             }
2595             JMPENV_POP;
2596             curcop = &compiling;
2597             curcop->cop_line = oldline;
2598             JMPENV_JUMP(3);
2599         }
2600         JMPENV_POP;
2601     }
2602 }
2603
2604 void
2605 my_exit(status)
2606 U32 status;
2607 {
2608     switch (status) {
2609     case 0:
2610         STATUS_ALL_SUCCESS;
2611         break;
2612     case 1:
2613         STATUS_ALL_FAILURE;
2614         break;
2615     default:
2616         STATUS_NATIVE_SET(status);
2617         break;
2618     }
2619     my_exit_jump();
2620 }
2621
2622 void
2623 my_failure_exit()
2624 {
2625 #ifdef VMS
2626     if (vaxc$errno & 1) {
2627         if (STATUS_NATIVE & 1)          /* fortuitiously includes "-1" */
2628             STATUS_NATIVE_SET(44);
2629     }
2630     else {
2631         if (!vaxc$errno && errno)       /* unlikely */
2632             STATUS_NATIVE_SET(44);
2633         else
2634             STATUS_NATIVE_SET(vaxc$errno);
2635     }
2636 #else
2637     if (errno & 255)
2638         STATUS_POSIX_SET(errno);
2639     else if (STATUS_POSIX == 0)
2640         STATUS_POSIX_SET(255);
2641 #endif
2642     my_exit_jump();
2643 }
2644
2645 static void
2646 my_exit_jump()
2647 {
2648     register CONTEXT *cx;
2649     I32 gimme;
2650     SV **newsp;
2651
2652     if (e_tmpname) {
2653         if (e_fp) {
2654             PerlIO_close(e_fp);
2655             e_fp = Nullfp;
2656         }
2657         (void)UNLINK(e_tmpname);
2658         Safefree(e_tmpname);
2659         e_tmpname = Nullch;
2660     }
2661
2662     if (cxstack_ix >= 0) {
2663         if (cxstack_ix > 0)
2664             dounwind(0);
2665         POPBLOCK(cx,curpm);
2666         LEAVE;
2667     }
2668
2669     JMPENV_JUMP(2);
2670 }