This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
flip release & version in win32_uname()
[perl5.git] / perl.c
... / ...
CommitLineData
1/* perl.c
2 *
3 * Copyright (c) 1987-1999 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
17/* XXX If this causes problems, set i_unistd=undef in the hint file. */
18#ifdef I_UNISTD
19#include <unistd.h>
20#endif
21
22#if !defined(STANDARD_C) && !defined(HAS_GETENV_PROTOTYPE)
23char *getenv _((char *)); /* Usually in <stdlib.h> */
24#endif
25
26#ifdef I_FCNTL
27#include <fcntl.h>
28#endif
29#ifdef I_SYS_FILE
30#include <sys/file.h>
31#endif
32
33#ifdef IAMSUID
34#ifndef DOSUID
35#define DOSUID
36#endif
37#endif
38
39#ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
40#ifdef DOSUID
41#undef DOSUID
42#endif
43#endif
44
45#ifdef PERL_OBJECT
46static I32 read_e_script _((CPerlObj* pPerl, int idx, SV *buf_sv, int maxlen));
47#else
48static void find_beginning _((void));
49static void forbid_setid _((char *));
50static void incpush _((char *, int));
51static void init_interp _((void));
52static void init_ids _((void));
53static void init_debugger _((void));
54static void init_lexer _((void));
55static void init_main_stash _((void));
56#ifdef USE_THREADS
57static struct perl_thread * init_main_thread _((void));
58#endif /* USE_THREADS */
59static void init_perllib _((void));
60static void init_postdump_symbols _((int, char **, char **));
61static void init_predump_symbols _((void));
62static void my_exit_jump _((void)) __attribute__((noreturn));
63static void nuke_stacks _((void));
64static void open_script _((char *, bool, SV *, int *fd));
65static void usage _((char *));
66#ifdef IAMSUID
67static int fd_on_nosuid_fs _((int));
68#endif
69static void validate_suid _((char *, char*, int));
70static I32 read_e_script _((int idx, SV *buf_sv, int maxlen));
71#endif
72
73#ifdef PERL_OBJECT
74CPerlObj* perl_alloc(IPerlMem* ipM, IPerlEnv* ipE, IPerlStdIO* ipStd,
75 IPerlLIO* ipLIO, IPerlDir* ipD, IPerlSock* ipS, IPerlProc* ipP)
76{
77 CPerlObj* pPerl = new(ipM) CPerlObj(ipM, ipE, ipStd, ipLIO, ipD, ipS, ipP);
78 if(pPerl != NULL)
79 pPerl->Init();
80
81 return pPerl;
82}
83#else
84PerlInterpreter *
85perl_alloc(void)
86{
87 PerlInterpreter *sv_interp;
88
89 PL_curinterp = 0;
90 New(53, sv_interp, 1, PerlInterpreter);
91 return sv_interp;
92}
93#endif /* PERL_OBJECT */
94
95void
96#ifdef PERL_OBJECT
97perl_construct(void)
98#else
99perl_construct(register PerlInterpreter *sv_interp)
100#endif
101{
102#ifdef USE_THREADS
103 int i;
104#ifndef FAKE_THREADS
105 struct perl_thread *thr;
106#endif /* FAKE_THREADS */
107#endif /* USE_THREADS */
108
109#ifndef PERL_OBJECT
110 if (!(PL_curinterp = sv_interp))
111 return;
112#endif
113
114#ifdef MULTIPLICITY
115 ++PL_ninterps;
116 Zero(sv_interp, 1, PerlInterpreter);
117#endif
118
119 /* Init the real globals (and main thread)? */
120 if (!PL_linestr) {
121#ifdef USE_THREADS
122
123 INIT_THREADS;
124#ifdef ALLOC_THREAD_KEY
125 ALLOC_THREAD_KEY;
126#else
127 if (pthread_key_create(&PL_thr_key, 0))
128 croak("panic: pthread_key_create");
129#endif
130 MUTEX_INIT(&PL_sv_mutex);
131 /*
132 * Safe to use basic SV functions from now on (though
133 * not things like mortals or tainting yet).
134 */
135 MUTEX_INIT(&PL_eval_mutex);
136 COND_INIT(&PL_eval_cond);
137 MUTEX_INIT(&PL_threads_mutex);
138 COND_INIT(&PL_nthreads_cond);
139#ifdef EMULATE_ATOMIC_REFCOUNTS
140 MUTEX_INIT(&PL_svref_mutex);
141#endif /* EMULATE_ATOMIC_REFCOUNTS */
142
143 MUTEX_INIT(&PL_cred_mutex);
144
145 thr = init_main_thread();
146#endif /* USE_THREADS */
147
148 PL_curcop = &PL_compiling; /* needed by ckWARN, right away */
149
150 PL_linestr = NEWSV(65,79);
151 sv_upgrade(PL_linestr,SVt_PVIV);
152
153 if (!SvREADONLY(&PL_sv_undef)) {
154 /* set read-only and try to insure than we wont see REFCNT==0
155 very often */
156
157 SvREADONLY_on(&PL_sv_undef);
158 SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
159
160 sv_setpv(&PL_sv_no,PL_No);
161 SvNV(&PL_sv_no);
162 SvREADONLY_on(&PL_sv_no);
163 SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
164
165 sv_setpv(&PL_sv_yes,PL_Yes);
166 SvNV(&PL_sv_yes);
167 SvREADONLY_on(&PL_sv_yes);
168 SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
169 }
170
171#ifdef PERL_OBJECT
172 /* TODO: */
173 /* PL_sighandlerp = sighandler; */
174#else
175 PL_sighandlerp = sighandler;
176#endif
177 PL_pidstatus = newHV();
178
179#ifdef MSDOS
180 /*
181 * There is no way we can refer to them from Perl so close them to save
182 * space. The other alternative would be to provide STDAUX and STDPRN
183 * filehandles.
184 */
185 (void)fclose(stdaux);
186 (void)fclose(stdprn);
187#endif
188 }
189
190 PL_nrs = newSVpv("\n", 1);
191 PL_rs = SvREFCNT_inc(PL_nrs);
192
193 init_stacks(ARGS);
194#ifdef MULTIPLICITY
195 init_interp();
196 PL_perl_destruct_level = 1;
197#else
198 if (PL_perl_destruct_level > 0)
199 init_interp();
200#endif
201
202 init_ids();
203 PL_lex_state = LEX_NOTPARSING;
204
205 PL_start_env.je_prev = NULL;
206 PL_start_env.je_ret = -1;
207 PL_start_env.je_mustcatch = TRUE;
208 PL_top_env = &PL_start_env;
209 STATUS_ALL_SUCCESS;
210
211 SET_NUMERIC_STANDARD();
212#if defined(PERL_SUBVERSION) && PERL_SUBVERSION > 0
213 sprintf(PL_patchlevel, "%7.5f", (double) PERL_REVISION
214 + ((double) PERL_VERSION / (double) 1000)
215 + ((double) PERL_SUBVERSION / (double) 100000));
216#else
217 sprintf(PL_patchlevel, "%5.3f", (double) PERL_REVISION +
218 ((double) PERL_VERSION / (double) 1000));
219#endif
220
221#if defined(LOCAL_PATCH_COUNT)
222 PL_localpatches = local_patches; /* For possible -v */
223#endif
224
225 PerlIO_init(); /* Hook to IO system */
226
227 PL_fdpid = newAV(); /* for remembering popen pids by fd */
228 PL_modglobal = newHV(); /* pointers to per-interpreter module globals */
229
230 DEBUG( {
231 New(51,PL_debname,128,char);
232 New(52,PL_debdelim,128,char);
233 } )
234
235 ENTER;
236}
237
238void
239#ifdef PERL_OBJECT
240perl_destruct(void)
241#else
242perl_destruct(register PerlInterpreter *sv_interp)
243#endif
244{
245 dTHR;
246 int destruct_level; /* 0=none, 1=full, 2=full with checks */
247 I32 last_sv_count;
248 HV *hv;
249#ifdef USE_THREADS
250 Thread t;
251#endif /* USE_THREADS */
252
253#ifndef PERL_OBJECT
254 if (!(PL_curinterp = sv_interp))
255 return;
256#endif
257
258#ifdef USE_THREADS
259#ifndef FAKE_THREADS
260 /* Pass 1 on any remaining threads: detach joinables, join zombies */
261 retry_cleanup:
262 MUTEX_LOCK(&PL_threads_mutex);
263 DEBUG_S(PerlIO_printf(PerlIO_stderr(),
264 "perl_destruct: waiting for %d threads...\n",
265 PL_nthreads - 1));
266 for (t = thr->next; t != thr; t = t->next) {
267 MUTEX_LOCK(&t->mutex);
268 switch (ThrSTATE(t)) {
269 AV *av;
270 case THRf_ZOMBIE:
271 DEBUG_S(PerlIO_printf(PerlIO_stderr(),
272 "perl_destruct: joining zombie %p\n", t));
273 ThrSETSTATE(t, THRf_DEAD);
274 MUTEX_UNLOCK(&t->mutex);
275 PL_nthreads--;
276 /*
277 * The SvREFCNT_dec below may take a long time (e.g. av
278 * may contain an object scalar whose destructor gets
279 * called) so we have to unlock threads_mutex and start
280 * all over again.
281 */
282 MUTEX_UNLOCK(&PL_threads_mutex);
283 JOIN(t, &av);
284 SvREFCNT_dec((SV*)av);
285 DEBUG_S(PerlIO_printf(PerlIO_stderr(),
286 "perl_destruct: joined zombie %p OK\n", t));
287 goto retry_cleanup;
288 case THRf_R_JOINABLE:
289 DEBUG_S(PerlIO_printf(PerlIO_stderr(),
290 "perl_destruct: detaching thread %p\n", t));
291 ThrSETSTATE(t, THRf_R_DETACHED);
292 /*
293 * We unlock threads_mutex and t->mutex in the opposite order
294 * from which we locked them just so that DETACH won't
295 * deadlock if it panics. It's only a breach of good style
296 * not a bug since they are unlocks not locks.
297 */
298 MUTEX_UNLOCK(&PL_threads_mutex);
299 DETACH(t);
300 MUTEX_UNLOCK(&t->mutex);
301 goto retry_cleanup;
302 default:
303 DEBUG_S(PerlIO_printf(PerlIO_stderr(),
304 "perl_destruct: ignoring %p (state %u)\n",
305 t, ThrSTATE(t)));
306 MUTEX_UNLOCK(&t->mutex);
307 /* fall through and out */
308 }
309 }
310 /* We leave the above "Pass 1" loop with threads_mutex still locked */
311
312 /* Pass 2 on remaining threads: wait for the thread count to drop to one */
313 while (PL_nthreads > 1)
314 {
315 DEBUG_S(PerlIO_printf(PerlIO_stderr(),
316 "perl_destruct: final wait for %d threads\n",
317 PL_nthreads - 1));
318 COND_WAIT(&PL_nthreads_cond, &PL_threads_mutex);
319 }
320 /* At this point, we're the last thread */
321 MUTEX_UNLOCK(&PL_threads_mutex);
322 DEBUG_S(PerlIO_printf(PerlIO_stderr(), "perl_destruct: armageddon has arrived\n"));
323 MUTEX_DESTROY(&PL_threads_mutex);
324 COND_DESTROY(&PL_nthreads_cond);
325#endif /* !defined(FAKE_THREADS) */
326#endif /* USE_THREADS */
327
328 destruct_level = PL_perl_destruct_level;
329#ifdef DEBUGGING
330 {
331 char *s;
332 if (s = PerlEnv_getenv("PERL_DESTRUCT_LEVEL")) {
333 int i = atoi(s);
334 if (destruct_level < i)
335 destruct_level = i;
336 }
337 }
338#endif
339
340 LEAVE;
341 FREETMPS;
342
343#ifdef MULTIPLICITY
344 --PL_ninterps;
345#endif
346
347 /* We must account for everything. */
348
349 /* Destroy the main CV and syntax tree */
350 if (PL_main_root) {
351 PL_curpad = AvARRAY(PL_comppad);
352 op_free(PL_main_root);
353 PL_main_root = Nullop;
354 }
355 PL_curcop = &PL_compiling;
356 PL_main_start = Nullop;
357 SvREFCNT_dec(PL_main_cv);
358 PL_main_cv = Nullcv;
359 PL_dirty = TRUE;
360
361 if (PL_sv_objcount) {
362 /*
363 * Try to destruct global references. We do this first so that the
364 * destructors and destructees still exist. Some sv's might remain.
365 * Non-referenced objects are on their own.
366 */
367 sv_clean_objs();
368 }
369
370 /* unhook hooks which will soon be, or use, destroyed data */
371 SvREFCNT_dec(PL_warnhook);
372 PL_warnhook = Nullsv;
373 SvREFCNT_dec(PL_diehook);
374 PL_diehook = Nullsv;
375 SvREFCNT_dec(PL_parsehook);
376 PL_parsehook = Nullsv;
377
378 /* call exit list functions */
379 while (PL_exitlistlen-- > 0)
380 PL_exitlist[PL_exitlistlen].fn(PERL_OBJECT_THIS_ PL_exitlist[PL_exitlistlen].ptr);
381
382 Safefree(PL_exitlist);
383
384 if (destruct_level == 0){
385
386 DEBUG_P(debprofdump());
387
388 /* The exit() function will do everything that needs doing. */
389 return;
390 }
391
392 /* loosen bonds of global variables */
393
394 if(PL_rsfp) {
395 (void)PerlIO_close(PL_rsfp);
396 PL_rsfp = Nullfp;
397 }
398
399 /* Filters for program text */
400 SvREFCNT_dec(PL_rsfp_filters);
401 PL_rsfp_filters = Nullav;
402
403 /* switches */
404 PL_preprocess = FALSE;
405 PL_minus_n = FALSE;
406 PL_minus_p = FALSE;
407 PL_minus_l = FALSE;
408 PL_minus_a = FALSE;
409 PL_minus_F = FALSE;
410 PL_doswitches = FALSE;
411 PL_dowarn = G_WARN_OFF;
412 PL_doextract = FALSE;
413 PL_sawampersand = FALSE; /* must save all match strings */
414 PL_sawstudy = FALSE; /* do fbm_instr on all strings */
415 PL_sawvec = FALSE;
416 PL_unsafe = FALSE;
417
418 Safefree(PL_inplace);
419 PL_inplace = Nullch;
420
421 if (PL_e_script) {
422 SvREFCNT_dec(PL_e_script);
423 PL_e_script = Nullsv;
424 }
425
426 /* magical thingies */
427
428 Safefree(PL_ofs); /* $, */
429 PL_ofs = Nullch;
430
431 Safefree(PL_ors); /* $\ */
432 PL_ors = Nullch;
433
434 SvREFCNT_dec(PL_rs); /* $/ */
435 PL_rs = Nullsv;
436
437 SvREFCNT_dec(PL_nrs); /* $/ helper */
438 PL_nrs = Nullsv;
439
440 PL_multiline = 0; /* $* */
441
442 SvREFCNT_dec(PL_statname);
443 PL_statname = Nullsv;
444 PL_statgv = Nullgv;
445
446 /* defgv, aka *_ should be taken care of elsewhere */
447
448 /* clean up after study() */
449 SvREFCNT_dec(PL_lastscream);
450 PL_lastscream = Nullsv;
451 Safefree(PL_screamfirst);
452 PL_screamfirst = 0;
453 Safefree(PL_screamnext);
454 PL_screamnext = 0;
455
456 /* startup and shutdown function lists */
457 SvREFCNT_dec(PL_beginav);
458 SvREFCNT_dec(PL_endav);
459 SvREFCNT_dec(PL_initav);
460 PL_beginav = Nullav;
461 PL_endav = Nullav;
462 PL_initav = Nullav;
463
464 /* shortcuts just get cleared */
465 PL_envgv = Nullgv;
466 PL_siggv = Nullgv;
467 PL_incgv = Nullgv;
468 PL_hintgv = Nullgv;
469 PL_errgv = Nullgv;
470 PL_argvgv = Nullgv;
471 PL_argvoutgv = Nullgv;
472 PL_stdingv = Nullgv;
473 PL_last_in_gv = Nullgv;
474 PL_replgv = Nullgv;
475
476 /* reset so print() ends up where we expect */
477 setdefout(Nullgv);
478
479 /* Prepare to destruct main symbol table. */
480
481 hv = PL_defstash;
482 PL_defstash = 0;
483 SvREFCNT_dec(hv);
484
485 FREETMPS;
486 if (destruct_level >= 2) {
487 if (PL_scopestack_ix != 0)
488 warn("Unbalanced scopes: %ld more ENTERs than LEAVEs\n",
489 (long)PL_scopestack_ix);
490 if (PL_savestack_ix != 0)
491 warn("Unbalanced saves: %ld more saves than restores\n",
492 (long)PL_savestack_ix);
493 if (PL_tmps_floor != -1)
494 warn("Unbalanced tmps: %ld more allocs than frees\n",
495 (long)PL_tmps_floor + 1);
496 if (cxstack_ix != -1)
497 warn("Unbalanced context: %ld more PUSHes than POPs\n",
498 (long)cxstack_ix + 1);
499 }
500
501 /* Now absolutely destruct everything, somehow or other, loops or no. */
502 last_sv_count = 0;
503 SvFLAGS(PL_strtab) |= SVTYPEMASK; /* don't clean out strtab now */
504 while (PL_sv_count != 0 && PL_sv_count != last_sv_count) {
505 last_sv_count = PL_sv_count;
506 sv_clean_all();
507 }
508 SvFLAGS(PL_strtab) &= ~SVTYPEMASK;
509 SvFLAGS(PL_strtab) |= SVt_PVHV;
510
511 /* Destruct the global string table. */
512 {
513 /* Yell and reset the HeVAL() slots that are still holding refcounts,
514 * so that sv_free() won't fail on them.
515 */
516 I32 riter;
517 I32 max;
518 HE *hent;
519 HE **array;
520
521 riter = 0;
522 max = HvMAX(PL_strtab);
523 array = HvARRAY(PL_strtab);
524 hent = array[0];
525 for (;;) {
526 if (hent) {
527 warn("Unbalanced string table refcount: (%d) for \"%s\"",
528 HeVAL(hent) - Nullsv, HeKEY(hent));
529 HeVAL(hent) = Nullsv;
530 hent = HeNEXT(hent);
531 }
532 if (!hent) {
533 if (++riter > max)
534 break;
535 hent = array[riter];
536 }
537 }
538 }
539 SvREFCNT_dec(PL_strtab);
540
541 if (PL_sv_count != 0)
542 warn("Scalars leaked: %ld\n", (long)PL_sv_count);
543
544 sv_free_arenas();
545
546 /* No SVs have survived, need to clean out */
547 PL_linestr = NULL;
548 PL_pidstatus = Nullhv;
549 Safefree(PL_origfilename);
550 Safefree(PL_archpat_auto);
551 Safefree(PL_reg_start_tmp);
552 if (PL_reg_curpm)
553 Safefree(PL_reg_curpm);
554 Safefree(HeKEY_hek(&PL_hv_fetch_ent_mh));
555 Safefree(PL_op_mask);
556 nuke_stacks();
557 PL_hints = 0; /* Reset hints. Should hints be per-interpreter ? */
558
559 DEBUG_P(debprofdump());
560#ifdef USE_THREADS
561 MUTEX_DESTROY(&PL_strtab_mutex);
562 MUTEX_DESTROY(&PL_sv_mutex);
563 MUTEX_DESTROY(&PL_eval_mutex);
564 MUTEX_DESTROY(&PL_cred_mutex);
565 COND_DESTROY(&PL_eval_cond);
566#ifdef EMULATE_ATOMIC_REFCOUNTS
567 MUTEX_DESTROY(&PL_svref_mutex);
568#endif /* EMULATE_ATOMIC_REFCOUNTS */
569
570 /* As the penultimate thing, free the non-arena SV for thrsv */
571 Safefree(SvPVX(PL_thrsv));
572 Safefree(SvANY(PL_thrsv));
573 Safefree(PL_thrsv);
574 PL_thrsv = Nullsv;
575#endif /* USE_THREADS */
576
577 /* As the absolutely last thing, free the non-arena SV for mess() */
578
579 if (PL_mess_sv) {
580 /* it could have accumulated taint magic */
581 if (SvTYPE(PL_mess_sv) >= SVt_PVMG) {
582 MAGIC* mg;
583 MAGIC* moremagic;
584 for (mg = SvMAGIC(PL_mess_sv); mg; mg = moremagic) {
585 moremagic = mg->mg_moremagic;
586 if (mg->mg_ptr && mg->mg_type != 'g' && mg->mg_len >= 0)
587 Safefree(mg->mg_ptr);
588 Safefree(mg);
589 }
590 }
591 /* we know that type >= SVt_PV */
592 SvOOK_off(PL_mess_sv);
593 Safefree(SvPVX(PL_mess_sv));
594 Safefree(SvANY(PL_mess_sv));
595 Safefree(PL_mess_sv);
596 PL_mess_sv = Nullsv;
597 }
598}
599
600void
601#ifdef PERL_OBJECT
602perl_free(void)
603#else
604perl_free(PerlInterpreter *sv_interp)
605#endif
606{
607#ifdef PERL_OBJECT
608 Safefree(this);
609#else
610 if (!(PL_curinterp = sv_interp))
611 return;
612 Safefree(sv_interp);
613#endif
614}
615
616void
617#ifdef PERL_OBJECT
618perl_atexit(void (*fn) (CPerlObj*,void *), void *ptr)
619#else
620perl_atexit(void (*fn) (void *), void *ptr)
621#endif
622{
623 Renew(PL_exitlist, PL_exitlistlen+1, PerlExitListEntry);
624 PL_exitlist[PL_exitlistlen].fn = fn;
625 PL_exitlist[PL_exitlistlen].ptr = ptr;
626 ++PL_exitlistlen;
627}
628
629int
630#ifdef PERL_OBJECT
631perl_parse(void (*xsinit) (CPerlObj*), int argc, char **argv, char **env)
632#else
633perl_parse(PerlInterpreter *sv_interp, void (*xsinit) (void), int argc, char **argv, char **env)
634#endif
635{
636 dTHR;
637 register SV *sv;
638 register char *s;
639 char *scriptname = NULL;
640 VOL bool dosearch = FALSE;
641 char *validarg = "";
642 I32 oldscope;
643 AV* comppadlist;
644 dJMPENV;
645 int ret;
646 int fdscript = -1;
647
648#ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
649#ifdef IAMSUID
650#undef IAMSUID
651 croak("suidperl is no longer needed since the kernel can now execute\n\
652setuid perl scripts securely.\n");
653#endif
654#endif
655
656#ifndef PERL_OBJECT
657 if (!(PL_curinterp = sv_interp))
658 return 255;
659#endif
660
661#if defined(__DYNAMIC__) && (defined(NeXT) || defined(__NeXT__))
662 _dyld_lookup_and_bind
663 ("__environ", (unsigned long *) &environ_pointer, NULL);
664#endif /* environ */
665
666 PL_origargv = argv;
667 PL_origargc = argc;
668#ifndef VMS /* VMS doesn't have environ array */
669 PL_origenviron = environ;
670#endif
671
672 if (PL_do_undump) {
673
674 /* Come here if running an undumped a.out. */
675
676 PL_origfilename = savepv(argv[0]);
677 PL_do_undump = FALSE;
678 cxstack_ix = -1; /* start label stack again */
679 init_ids();
680 init_postdump_symbols(argc,argv,env);
681 return 0;
682 }
683
684 if (PL_main_root) {
685 PL_curpad = AvARRAY(PL_comppad);
686 op_free(PL_main_root);
687 PL_main_root = Nullop;
688 }
689 PL_main_start = Nullop;
690 SvREFCNT_dec(PL_main_cv);
691 PL_main_cv = Nullcv;
692
693 time(&PL_basetime);
694 oldscope = PL_scopestack_ix;
695 PL_dowarn = G_WARN_OFF;
696
697 JMPENV_PUSH(ret);
698 switch (ret) {
699 case 1:
700 STATUS_ALL_FAILURE;
701 /* FALL THROUGH */
702 case 2:
703 /* my_exit() was called */
704 while (PL_scopestack_ix > oldscope)
705 LEAVE;
706 FREETMPS;
707 PL_curstash = PL_defstash;
708 if (PL_endav)
709 call_list(oldscope, PL_endav);
710 JMPENV_POP;
711 return STATUS_NATIVE_EXPORT;
712 case 3:
713 JMPENV_POP;
714 PerlIO_printf(PerlIO_stderr(), "panic: top_env\n");
715 return 1;
716 }
717
718 sv_setpvn(PL_linestr,"",0);
719 sv = newSVpv("",0); /* first used for -I flags */
720 SAVEFREESV(sv);
721 init_main_stash();
722
723 for (argc--,argv++; argc > 0; argc--,argv++) {
724 if (argv[0][0] != '-' || !argv[0][1])
725 break;
726#ifdef DOSUID
727 if (*validarg)
728 validarg = " PHOOEY ";
729 else
730 validarg = argv[0];
731#endif
732 s = argv[0]+1;
733 reswitch:
734 switch (*s) {
735#ifndef PERL_STRICT_CR
736 case '\r':
737#endif
738 case ' ':
739 case '0':
740 case 'F':
741 case 'a':
742 case 'c':
743 case 'd':
744 case 'D':
745 case 'h':
746 case 'i':
747 case 'l':
748 case 'M':
749 case 'm':
750 case 'n':
751 case 'p':
752 case 's':
753 case 'u':
754 case 'U':
755 case 'v':
756 case 'W':
757 case 'X':
758 case 'w':
759 if (s = moreswitches(s))
760 goto reswitch;
761 break;
762
763 case 'T':
764 PL_tainting = TRUE;
765 s++;
766 goto reswitch;
767
768 case 'e':
769 if (PL_euid != PL_uid || PL_egid != PL_gid)
770 croak("No -e allowed in setuid scripts");
771 if (!PL_e_script) {
772 PL_e_script = newSVpv("",0);
773 filter_add(read_e_script, NULL);
774 }
775 if (*++s)
776 sv_catpv(PL_e_script, s);
777 else if (argv[1]) {
778 sv_catpv(PL_e_script, argv[1]);
779 argc--,argv++;
780 }
781 else
782 croak("No code specified for -e");
783 sv_catpv(PL_e_script, "\n");
784 break;
785
786 case 'I': /* -I handled both here and in moreswitches() */
787 forbid_setid("-I");
788 if (!*++s && (s=argv[1]) != Nullch) {
789 argc--,argv++;
790 }
791 while (s && isSPACE(*s))
792 ++s;
793 if (s && *s) {
794 char *e, *p;
795 for (e = s; *e && !isSPACE(*e); e++) ;
796 p = savepvn(s, e-s);
797 incpush(p, TRUE);
798 sv_catpv(sv,"-I");
799 sv_catpv(sv,p);
800 sv_catpv(sv," ");
801 Safefree(p);
802 } /* XXX else croak? */
803 break;
804 case 'P':
805 forbid_setid("-P");
806 PL_preprocess = TRUE;
807 s++;
808 goto reswitch;
809 case 'S':
810 forbid_setid("-S");
811 dosearch = TRUE;
812 s++;
813 goto reswitch;
814 case 'V':
815 if (!PL_preambleav)
816 PL_preambleav = newAV();
817 av_push(PL_preambleav, newSVpv("use Config qw(myconfig config_vars)",0));
818 if (*++s != ':') {
819 PL_Sv = newSVpv("print myconfig();",0);
820#ifdef VMS
821 sv_catpv(PL_Sv,"print \"\\nCharacteristics of this PERLSHR image: \\n\",");
822#else
823 sv_catpv(PL_Sv,"print \"\\nCharacteristics of this binary (from libperl): \\n\",");
824#endif
825#if defined(DEBUGGING) || defined(MULTIPLICITY)
826 sv_catpv(PL_Sv,"\" Compile-time options:");
827# ifdef DEBUGGING
828 sv_catpv(PL_Sv," DEBUGGING");
829# endif
830# ifdef MULTIPLICITY
831 sv_catpv(PL_Sv," MULTIPLICITY");
832# endif
833 sv_catpv(PL_Sv,"\\n\",");
834#endif
835#if defined(LOCAL_PATCH_COUNT)
836 if (LOCAL_PATCH_COUNT > 0) {
837 int i;
838 sv_catpv(PL_Sv,"\" Locally applied patches:\\n\",");
839 for (i = 1; i <= LOCAL_PATCH_COUNT; i++) {
840 if (PL_localpatches[i])
841 sv_catpvf(PL_Sv,"q\" \t%s\n\",",PL_localpatches[i]);
842 }
843 }
844#endif
845 sv_catpvf(PL_Sv,"\" Built under %s\\n\"",OSNAME);
846#ifdef __DATE__
847# ifdef __TIME__
848 sv_catpvf(PL_Sv,",\" Compiled at %s %s\\n\"",__DATE__,__TIME__);
849# else
850 sv_catpvf(PL_Sv,",\" Compiled on %s\\n\"",__DATE__);
851# endif
852#endif
853 sv_catpv(PL_Sv, "; \
854$\"=\"\\n \"; \
855@env = map { \"$_=\\\"$ENV{$_}\\\"\" } sort grep {/^PERL/} keys %ENV; \
856print \" \\%ENV:\\n @env\\n\" if @env; \
857print \" \\@INC:\\n @INC\\n\";");
858 }
859 else {
860 PL_Sv = newSVpv("config_vars(qw(",0);
861 sv_catpv(PL_Sv, ++s);
862 sv_catpv(PL_Sv, "))");
863 s += strlen(s);
864 }
865 av_push(PL_preambleav, PL_Sv);
866 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
867 goto reswitch;
868 case 'x':
869 PL_doextract = TRUE;
870 s++;
871 if (*s)
872 PL_cddir = savepv(s);
873 break;
874 case 0:
875 break;
876 case '-':
877 if (!*++s || isSPACE(*s)) {
878 argc--,argv++;
879 goto switch_end;
880 }
881 /* catch use of gnu style long options */
882 if (strEQ(s, "version")) {
883 s = "v";
884 goto reswitch;
885 }
886 if (strEQ(s, "help")) {
887 s = "h";
888 goto reswitch;
889 }
890 s--;
891 /* FALL THROUGH */
892 default:
893 croak("Unrecognized switch: -%s (-h will show valid options)",s);
894 }
895 }
896 switch_end:
897
898 if (!PL_tainting && (s = PerlEnv_getenv("PERL5OPT"))) {
899 while (isSPACE(*s))
900 s++;
901 if (*s == '-' && *(s+1) == 'T')
902 PL_tainting = TRUE;
903 else {
904 while (s && *s) {
905 while (isSPACE(*s))
906 s++;
907 if (*s == '-') {
908 s++;
909 if (isSPACE(*s))
910 continue;
911 }
912 if (!*s)
913 break;
914 if (!strchr("DIMUdmw", *s))
915 croak("Illegal switch in PERL5OPT: -%c", *s);
916 s = moreswitches(s);
917 }
918 }
919 }
920
921 if (!scriptname)
922 scriptname = argv[0];
923 if (PL_e_script) {
924 argc++,argv--;
925 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
926 }
927 else if (scriptname == Nullch) {
928#ifdef MSDOS
929 if ( PerlLIO_isatty(PerlIO_fileno(PerlIO_stdin())) )
930 moreswitches("h");
931#endif
932 scriptname = "-";
933 }
934
935 init_perllib();
936
937 open_script(scriptname,dosearch,sv,&fdscript);
938
939 validate_suid(validarg, scriptname,fdscript);
940
941 if (PL_doextract)
942 find_beginning();
943
944 PL_main_cv = PL_compcv = (CV*)NEWSV(1104,0);
945 sv_upgrade((SV *)PL_compcv, SVt_PVCV);
946 CvUNIQUE_on(PL_compcv);
947
948 PL_comppad = newAV();
949 av_push(PL_comppad, Nullsv);
950 PL_curpad = AvARRAY(PL_comppad);
951 PL_comppad_name = newAV();
952 PL_comppad_name_fill = 0;
953 PL_min_intro_pending = 0;
954 PL_padix = 0;
955#ifdef USE_THREADS
956 av_store(PL_comppad_name, 0, newSVpv("@_", 2));
957 PL_curpad[0] = (SV*)newAV();
958 SvPADMY_on(PL_curpad[0]); /* XXX Needed? */
959 CvOWNER(PL_compcv) = 0;
960 New(666, CvMUTEXP(PL_compcv), 1, perl_mutex);
961 MUTEX_INIT(CvMUTEXP(PL_compcv));
962#endif /* USE_THREADS */
963
964 comppadlist = newAV();
965 AvREAL_off(comppadlist);
966 av_store(comppadlist, 0, (SV*)PL_comppad_name);
967 av_store(comppadlist, 1, (SV*)PL_comppad);
968 CvPADLIST(PL_compcv) = comppadlist;
969
970 boot_core_UNIVERSAL();
971
972 if (xsinit)
973 (*xsinit)(PERL_OBJECT_THIS); /* in case linked C routines want magical variables */
974#if defined(VMS) || defined(WIN32) || defined(DJGPP)
975 init_os_extras();
976#endif
977
978 init_predump_symbols();
979 /* init_postdump_symbols not currently designed to be called */
980 /* more than once (ENV isn't cleared first, for example) */
981 /* But running with -u leaves %ENV & @ARGV undefined! XXX */
982 if (!PL_do_undump)
983 init_postdump_symbols(argc,argv,env);
984
985 init_lexer();
986
987 /* now parse the script */
988
989 SETERRNO(0,SS$_NORMAL);
990 PL_error_count = 0;
991 if (yyparse() || PL_error_count) {
992 if (PL_minus_c)
993 croak("%s had compilation errors.\n", PL_origfilename);
994 else {
995 croak("Execution of %s aborted due to compilation errors.\n",
996 PL_origfilename);
997 }
998 }
999 PL_curcop->cop_line = 0;
1000 PL_curstash = PL_defstash;
1001 PL_preprocess = FALSE;
1002 if (PL_e_script) {
1003 SvREFCNT_dec(PL_e_script);
1004 PL_e_script = Nullsv;
1005 }
1006
1007 /* now that script is parsed, we can modify record separator */
1008 SvREFCNT_dec(PL_rs);
1009 PL_rs = SvREFCNT_inc(PL_nrs);
1010 sv_setsv(perl_get_sv("/", TRUE), PL_rs);
1011 if (PL_do_undump)
1012 my_unexec();
1013
1014 if (ckWARN(WARN_ONCE))
1015 gv_check(PL_defstash);
1016
1017 LEAVE;
1018 FREETMPS;
1019
1020#ifdef MYMALLOC
1021 if ((s=PerlEnv_getenv("PERL_DEBUG_MSTATS")) && atoi(s) >= 2)
1022 dump_mstats("after compilation:");
1023#endif
1024
1025 ENTER;
1026 PL_restartop = 0;
1027 JMPENV_POP;
1028 return 0;
1029}
1030
1031int
1032#ifdef PERL_OBJECT
1033perl_run(void)
1034#else
1035perl_run(PerlInterpreter *sv_interp)
1036#endif
1037{
1038 dTHR;
1039 I32 oldscope;
1040 dJMPENV;
1041 int ret;
1042
1043#ifndef PERL_OBJECT
1044 if (!(PL_curinterp = sv_interp))
1045 return 255;
1046#endif
1047
1048 oldscope = PL_scopestack_ix;
1049
1050 JMPENV_PUSH(ret);
1051 switch (ret) {
1052 case 1:
1053 cxstack_ix = -1; /* start context stack again */
1054 break;
1055 case 2:
1056 /* my_exit() was called */
1057 while (PL_scopestack_ix > oldscope)
1058 LEAVE;
1059 FREETMPS;
1060 PL_curstash = PL_defstash;
1061 if (PL_endav)
1062 call_list(oldscope, PL_endav);
1063#ifdef MYMALLOC
1064 if (PerlEnv_getenv("PERL_DEBUG_MSTATS"))
1065 dump_mstats("after execution: ");
1066#endif
1067 JMPENV_POP;
1068 return STATUS_NATIVE_EXPORT;
1069 case 3:
1070 if (!PL_restartop) {
1071 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
1072 FREETMPS;
1073 JMPENV_POP;
1074 return 1;
1075 }
1076 POPSTACK_TO(PL_mainstack);
1077 break;
1078 }
1079
1080 DEBUG_r(PerlIO_printf(Perl_debug_log, "%s $` $& $' support.\n",
1081 PL_sawampersand ? "Enabling" : "Omitting"));
1082
1083 if (!PL_restartop) {
1084 DEBUG_x(dump_all());
1085 DEBUG(PerlIO_printf(Perl_debug_log, "\nEXECUTING...\n\n"));
1086 DEBUG_S(PerlIO_printf(Perl_debug_log, "main thread is 0x%lx\n",
1087 (unsigned long) thr));
1088
1089 if (PL_minus_c) {
1090 PerlIO_printf(PerlIO_stderr(), "%s syntax OK\n", PL_origfilename);
1091 my_exit(0);
1092 }
1093 if (PERLDB_SINGLE && PL_DBsingle)
1094 sv_setiv(PL_DBsingle, 1);
1095 if (PL_initav)
1096 call_list(oldscope, PL_initav);
1097 }
1098
1099 /* do it */
1100
1101 if (PL_restartop) {
1102 PL_op = PL_restartop;
1103 PL_restartop = 0;
1104 CALLRUNOPS();
1105 }
1106 else if (PL_main_start) {
1107 CvDEPTH(PL_main_cv) = 1;
1108 PL_op = PL_main_start;
1109 CALLRUNOPS();
1110 }
1111
1112 my_exit(0);
1113 /* NOTREACHED */
1114 return 0;
1115}
1116
1117SV*
1118perl_get_sv(const char *name, I32 create)
1119{
1120 GV *gv;
1121#ifdef USE_THREADS
1122 if (name[1] == '\0' && !isALPHA(name[0])) {
1123 PADOFFSET tmp = find_threadsv(name);
1124 if (tmp != NOT_IN_PAD) {
1125 dTHR;
1126 return THREADSV(tmp);
1127 }
1128 }
1129#endif /* USE_THREADS */
1130 gv = gv_fetchpv(name, create, SVt_PV);
1131 if (gv)
1132 return GvSV(gv);
1133 return Nullsv;
1134}
1135
1136AV*
1137perl_get_av(const char *name, I32 create)
1138{
1139 GV* gv = gv_fetchpv(name, create, SVt_PVAV);
1140 if (create)
1141 return GvAVn(gv);
1142 if (gv)
1143 return GvAV(gv);
1144 return Nullav;
1145}
1146
1147HV*
1148perl_get_hv(const char *name, I32 create)
1149{
1150 GV* gv = gv_fetchpv(name, create, SVt_PVHV);
1151 if (create)
1152 return GvHVn(gv);
1153 if (gv)
1154 return GvHV(gv);
1155 return Nullhv;
1156}
1157
1158CV*
1159perl_get_cv(const char *name, I32 create)
1160{
1161 GV* gv = gv_fetchpv(name, create, SVt_PVCV);
1162 /* XXX unsafe for threads if eval_owner isn't held */
1163 if (create && !GvCVu(gv))
1164 return newSUB(start_subparse(FALSE, 0),
1165 newSVOP(OP_CONST, 0, newSVpv(name,0)),
1166 Nullop,
1167 Nullop);
1168 if (gv)
1169 return GvCVu(gv);
1170 return Nullcv;
1171}
1172
1173/* Be sure to refetch the stack pointer after calling these routines. */
1174
1175I32
1176perl_call_argv(const char *sub_name, I32 flags, register char **argv)
1177
1178 /* See G_* flags in cop.h */
1179 /* null terminated arg list */
1180{
1181 dSP;
1182
1183 PUSHMARK(SP);
1184 if (argv) {
1185 while (*argv) {
1186 XPUSHs(sv_2mortal(newSVpv(*argv,0)));
1187 argv++;
1188 }
1189 PUTBACK;
1190 }
1191 return perl_call_pv(sub_name, flags);
1192}
1193
1194I32
1195perl_call_pv(const char *sub_name, I32 flags)
1196 /* name of the subroutine */
1197 /* See G_* flags in cop.h */
1198{
1199 return perl_call_sv((SV*)perl_get_cv(sub_name, TRUE), flags);
1200}
1201
1202I32
1203perl_call_method(const char *methname, I32 flags)
1204 /* name of the subroutine */
1205 /* See G_* flags in cop.h */
1206{
1207 dSP;
1208 OP myop;
1209 if (!PL_op)
1210 PL_op = &myop;
1211 XPUSHs(sv_2mortal(newSVpv(methname,0)));
1212 PUTBACK;
1213 pp_method(ARGS);
1214 if(PL_op == &myop)
1215 PL_op = Nullop;
1216 return perl_call_sv(*PL_stack_sp--, flags);
1217}
1218
1219/* May be called with any of a CV, a GV, or an SV containing the name. */
1220I32
1221perl_call_sv(SV *sv, I32 flags)
1222
1223 /* See G_* flags in cop.h */
1224{
1225 dSP;
1226 LOGOP myop; /* fake syntax tree node */
1227 I32 oldmark;
1228 I32 retval;
1229 I32 oldscope;
1230 bool oldcatch = CATCH_GET;
1231 dJMPENV;
1232 int ret;
1233 OP* oldop = PL_op;
1234
1235 if (flags & G_DISCARD) {
1236 ENTER;
1237 SAVETMPS;
1238 }
1239
1240 Zero(&myop, 1, LOGOP);
1241 myop.op_next = Nullop;
1242 if (!(flags & G_NOARGS))
1243 myop.op_flags |= OPf_STACKED;
1244 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1245 (flags & G_ARRAY) ? OPf_WANT_LIST :
1246 OPf_WANT_SCALAR);
1247 SAVEOP();
1248 PL_op = (OP*)&myop;
1249
1250 EXTEND(PL_stack_sp, 1);
1251 *++PL_stack_sp = sv;
1252 oldmark = TOPMARK;
1253 oldscope = PL_scopestack_ix;
1254
1255 if (PERLDB_SUB && PL_curstash != PL_debstash
1256 /* Handle first BEGIN of -d. */
1257 && (PL_DBcv || (PL_DBcv = GvCV(PL_DBsub)))
1258 /* Try harder, since this may have been a sighandler, thus
1259 * curstash may be meaningless. */
1260 && (SvTYPE(sv) != SVt_PVCV || CvSTASH((CV*)sv) != PL_debstash)
1261 && !(flags & G_NODEBUG))
1262 PL_op->op_private |= OPpENTERSUB_DB;
1263
1264 if (flags & G_EVAL) {
1265 cLOGOP->op_other = PL_op;
1266 PL_markstack_ptr--;
1267 /* we're trying to emulate pp_entertry() here */
1268 {
1269 register PERL_CONTEXT *cx;
1270 I32 gimme = GIMME_V;
1271
1272 ENTER;
1273 SAVETMPS;
1274
1275 push_return(PL_op->op_next);
1276 PUSHBLOCK(cx, CXt_EVAL, PL_stack_sp);
1277 PUSHEVAL(cx, 0, 0);
1278 PL_eval_root = PL_op; /* Only needed so that goto works right. */
1279
1280 PL_in_eval = 1;
1281 if (flags & G_KEEPERR)
1282 PL_in_eval |= 4;
1283 else
1284 sv_setpv(ERRSV,"");
1285 }
1286 PL_markstack_ptr++;
1287
1288 JMPENV_PUSH(ret);
1289 switch (ret) {
1290 case 0:
1291 break;
1292 case 1:
1293 STATUS_ALL_FAILURE;
1294 /* FALL THROUGH */
1295 case 2:
1296 /* my_exit() was called */
1297 PL_curstash = PL_defstash;
1298 FREETMPS;
1299 JMPENV_POP;
1300 if (PL_statusvalue)
1301 croak("Callback called exit");
1302 my_exit_jump();
1303 /* NOTREACHED */
1304 case 3:
1305 if (PL_restartop) {
1306 PL_op = PL_restartop;
1307 PL_restartop = 0;
1308 break;
1309 }
1310 PL_stack_sp = PL_stack_base + oldmark;
1311 if (flags & G_ARRAY)
1312 retval = 0;
1313 else {
1314 retval = 1;
1315 *++PL_stack_sp = &PL_sv_undef;
1316 }
1317 goto cleanup;
1318 }
1319 }
1320 else
1321 CATCH_SET(TRUE);
1322
1323 if (PL_op == (OP*)&myop)
1324 PL_op = pp_entersub(ARGS);
1325 if (PL_op)
1326 CALLRUNOPS();
1327 retval = PL_stack_sp - (PL_stack_base + oldmark);
1328 if ((flags & G_EVAL) && !(flags & G_KEEPERR))
1329 sv_setpv(ERRSV,"");
1330
1331 cleanup:
1332 if (flags & G_EVAL) {
1333 if (PL_scopestack_ix > oldscope) {
1334 SV **newsp;
1335 PMOP *newpm;
1336 I32 gimme;
1337 register PERL_CONTEXT *cx;
1338 I32 optype;
1339
1340 POPBLOCK(cx,newpm);
1341 POPEVAL(cx);
1342 pop_return();
1343 PL_curpm = newpm;
1344 LEAVE;
1345 }
1346 JMPENV_POP;
1347 }
1348 else
1349 CATCH_SET(oldcatch);
1350
1351 if (flags & G_DISCARD) {
1352 PL_stack_sp = PL_stack_base + oldmark;
1353 retval = 0;
1354 FREETMPS;
1355 LEAVE;
1356 }
1357 PL_op = oldop;
1358 return retval;
1359}
1360
1361/* Eval a string. The G_EVAL flag is always assumed. */
1362
1363I32
1364perl_eval_sv(SV *sv, I32 flags)
1365
1366 /* See G_* flags in cop.h */
1367{
1368 dSP;
1369 UNOP myop; /* fake syntax tree node */
1370 I32 oldmark = SP - PL_stack_base;
1371 I32 retval;
1372 I32 oldscope;
1373 dJMPENV;
1374 int ret;
1375 OP* oldop = PL_op;
1376
1377 if (flags & G_DISCARD) {
1378 ENTER;
1379 SAVETMPS;
1380 }
1381
1382 SAVEOP();
1383 PL_op = (OP*)&myop;
1384 Zero(PL_op, 1, UNOP);
1385 EXTEND(PL_stack_sp, 1);
1386 *++PL_stack_sp = sv;
1387 oldscope = PL_scopestack_ix;
1388
1389 if (!(flags & G_NOARGS))
1390 myop.op_flags = OPf_STACKED;
1391 myop.op_next = Nullop;
1392 myop.op_type = OP_ENTEREVAL;
1393 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1394 (flags & G_ARRAY) ? OPf_WANT_LIST :
1395 OPf_WANT_SCALAR);
1396 if (flags & G_KEEPERR)
1397 myop.op_flags |= OPf_SPECIAL;
1398
1399 JMPENV_PUSH(ret);
1400 switch (ret) {
1401 case 0:
1402 break;
1403 case 1:
1404 STATUS_ALL_FAILURE;
1405 /* FALL THROUGH */
1406 case 2:
1407 /* my_exit() was called */
1408 PL_curstash = PL_defstash;
1409 FREETMPS;
1410 JMPENV_POP;
1411 if (PL_statusvalue)
1412 croak("Callback called exit");
1413 my_exit_jump();
1414 /* NOTREACHED */
1415 case 3:
1416 if (PL_restartop) {
1417 PL_op = PL_restartop;
1418 PL_restartop = 0;
1419 break;
1420 }
1421 PL_stack_sp = PL_stack_base + oldmark;
1422 if (flags & G_ARRAY)
1423 retval = 0;
1424 else {
1425 retval = 1;
1426 *++PL_stack_sp = &PL_sv_undef;
1427 }
1428 goto cleanup;
1429 }
1430
1431 if (PL_op == (OP*)&myop)
1432 PL_op = pp_entereval(ARGS);
1433 if (PL_op)
1434 CALLRUNOPS();
1435 retval = PL_stack_sp - (PL_stack_base + oldmark);
1436 if (!(flags & G_KEEPERR))
1437 sv_setpv(ERRSV,"");
1438
1439 cleanup:
1440 JMPENV_POP;
1441 if (flags & G_DISCARD) {
1442 PL_stack_sp = PL_stack_base + oldmark;
1443 retval = 0;
1444 FREETMPS;
1445 LEAVE;
1446 }
1447 PL_op = oldop;
1448 return retval;
1449}
1450
1451SV*
1452perl_eval_pv(const char *p, I32 croak_on_error)
1453{
1454 dSP;
1455 SV* sv = newSVpv(p, 0);
1456
1457 PUSHMARK(SP);
1458 perl_eval_sv(sv, G_SCALAR);
1459 SvREFCNT_dec(sv);
1460
1461 SPAGAIN;
1462 sv = POPs;
1463 PUTBACK;
1464
1465 if (croak_on_error && SvTRUE(ERRSV)) {
1466 STRLEN n_a;
1467 croak(SvPVx(ERRSV, n_a));
1468 }
1469
1470 return sv;
1471}
1472
1473/* Require a module. */
1474
1475void
1476perl_require_pv(const char *pv)
1477{
1478 SV* sv;
1479 dSP;
1480 PUSHSTACKi(PERLSI_REQUIRE);
1481 PUTBACK;
1482 sv = sv_newmortal();
1483 sv_setpv(sv, "require '");
1484 sv_catpv(sv, pv);
1485 sv_catpv(sv, "'");
1486 perl_eval_sv(sv, G_DISCARD);
1487 SPAGAIN;
1488 POPSTACK;
1489}
1490
1491void
1492magicname(char *sym, char *name, I32 namlen)
1493{
1494 register GV *gv;
1495
1496 if (gv = gv_fetchpv(sym,TRUE, SVt_PV))
1497 sv_magic(GvSV(gv), (SV*)gv, 0, name, namlen);
1498}
1499
1500STATIC void
1501usage(char *name) /* XXX move this out into a module ? */
1502
1503{
1504 /* This message really ought to be max 23 lines.
1505 * Removed -h because the user already knows that opton. Others? */
1506
1507 static char *usage_msg[] = {
1508"-0[octal] specify record separator (\\0, if no argument)",
1509"-a autosplit mode with -n or -p (splits $_ into @F)",
1510"-c check syntax only (runs BEGIN and END blocks)",
1511"-d[:debugger] run scripts under debugger",
1512"-D[number/list] set debugging flags (argument is a bit mask or flags)",
1513"-e 'command' one line of script. Several -e's allowed. Omit [programfile].",
1514"-F/pattern/ split() pattern for autosplit (-a). The //'s are optional.",
1515"-i[extension] edit <> files in place (make backup if extension supplied)",
1516"-Idirectory specify @INC/#include directory (may be used more than once)",
1517"-l[octal] enable line ending processing, specifies line terminator",
1518"-[mM][-]module.. executes `use/no module...' before executing your script.",
1519"-n assume 'while (<>) { ... }' loop around your script",
1520"-p assume loop like -n but print line also like sed",
1521"-P run script through C preprocessor before compilation",
1522"-s enable some switch parsing for switches after script name",
1523"-S look for the script using PATH environment variable",
1524"-T turn on tainting checks",
1525"-u dump core after parsing script",
1526"-U allow unsafe operations",
1527"-v print version number, patchlevel plus VERY IMPORTANT perl info",
1528"-V[:variable] print perl configuration information",
1529"-w TURN WARNINGS ON FOR COMPILATION OF YOUR SCRIPT. Recommended.",
1530"-x[directory] strip off text before #!perl line and perhaps cd to directory",
1531"\n",
1532NULL
1533};
1534 char **p = usage_msg;
1535
1536 printf("\nUsage: %s [switches] [--] [programfile] [arguments]", name);
1537 while (*p)
1538 printf("\n %s", *p++);
1539}
1540
1541/* This routine handles any switches that can be given during run */
1542
1543char *
1544moreswitches(char *s)
1545{
1546 I32 numlen;
1547 U32 rschar;
1548
1549 switch (*s) {
1550 case '0':
1551 {
1552 dTHR;
1553 rschar = scan_oct(s, 4, &numlen);
1554 SvREFCNT_dec(PL_nrs);
1555 if (rschar & ~((U8)~0))
1556 PL_nrs = &PL_sv_undef;
1557 else if (!rschar && numlen >= 2)
1558 PL_nrs = newSVpv("", 0);
1559 else {
1560 char ch = rschar;
1561 PL_nrs = newSVpv(&ch, 1);
1562 }
1563 return s + numlen;
1564 }
1565 case 'F':
1566 PL_minus_F = TRUE;
1567 PL_splitstr = savepv(s + 1);
1568 s += strlen(s);
1569 return s;
1570 case 'a':
1571 PL_minus_a = TRUE;
1572 s++;
1573 return s;
1574 case 'c':
1575 PL_minus_c = TRUE;
1576 s++;
1577 return s;
1578 case 'd':
1579 forbid_setid("-d");
1580 s++;
1581 if (*s == ':' || *s == '=') {
1582 my_setenv("PERL5DB", form("use Devel::%s;", ++s));
1583 s += strlen(s);
1584 }
1585 if (!PL_perldb) {
1586 PL_perldb = PERLDB_ALL;
1587 init_debugger();
1588 }
1589 return s;
1590 case 'D':
1591#ifdef DEBUGGING
1592 forbid_setid("-D");
1593 if (isALPHA(s[1])) {
1594 static char debopts[] = "psltocPmfrxuLHXDS";
1595 char *d;
1596
1597 for (s++; *s && (d = strchr(debopts,*s)); s++)
1598 PL_debug |= 1 << (d - debopts);
1599 }
1600 else {
1601 PL_debug = atoi(s+1);
1602 for (s++; isDIGIT(*s); s++) ;
1603 }
1604 PL_debug |= 0x80000000;
1605#else
1606 warn("Recompile perl with -DDEBUGGING to use -D switch\n");
1607 for (s++; isALNUM(*s); s++) ;
1608#endif
1609 /*SUPPRESS 530*/
1610 return s;
1611 case 'h':
1612 usage(PL_origargv[0]);
1613 PerlProc_exit(0);
1614 case 'i':
1615 if (PL_inplace)
1616 Safefree(PL_inplace);
1617 PL_inplace = savepv(s+1);
1618 /*SUPPRESS 530*/
1619 for (s = PL_inplace; *s && !isSPACE(*s); s++) ;
1620 if (*s) {
1621 *s++ = '\0';
1622 if (*s == '-') /* Additional switches on #! line. */
1623 s++;
1624 }
1625 return s;
1626 case 'I': /* -I handled both here and in parse_perl() */
1627 forbid_setid("-I");
1628 ++s;
1629 while (*s && isSPACE(*s))
1630 ++s;
1631 if (*s) {
1632 char *e, *p;
1633 for (e = s; *e && !isSPACE(*e); e++) ;
1634 p = savepvn(s, e-s);
1635 incpush(p, TRUE);
1636 Safefree(p);
1637 s = e;
1638 }
1639 else
1640 croak("No space allowed after -I");
1641 return s;
1642 case 'l':
1643 PL_minus_l = TRUE;
1644 s++;
1645 if (PL_ors)
1646 Safefree(PL_ors);
1647 if (isDIGIT(*s)) {
1648 PL_ors = savepv("\n");
1649 PL_orslen = 1;
1650 *PL_ors = scan_oct(s, 3 + (*s == '0'), &numlen);
1651 s += numlen;
1652 }
1653 else {
1654 dTHR;
1655 if (RsPARA(PL_nrs)) {
1656 PL_ors = "\n\n";
1657 PL_orslen = 2;
1658 }
1659 else
1660 PL_ors = SvPV(PL_nrs, PL_orslen);
1661 PL_ors = savepvn(PL_ors, PL_orslen);
1662 }
1663 return s;
1664 case 'M':
1665 forbid_setid("-M"); /* XXX ? */
1666 /* FALL THROUGH */
1667 case 'm':
1668 forbid_setid("-m"); /* XXX ? */
1669 if (*++s) {
1670 char *start;
1671 SV *sv;
1672 char *use = "use ";
1673 /* -M-foo == 'no foo' */
1674 if (*s == '-') { use = "no "; ++s; }
1675 sv = newSVpv(use,0);
1676 start = s;
1677 /* We allow -M'Module qw(Foo Bar)' */
1678 while(isALNUM(*s) || *s==':') ++s;
1679 if (*s != '=') {
1680 sv_catpv(sv, start);
1681 if (*(start-1) == 'm') {
1682 if (*s != '\0')
1683 croak("Can't use '%c' after -mname", *s);
1684 sv_catpv( sv, " ()");
1685 }
1686 } else {
1687 sv_catpvn(sv, start, s-start);
1688 sv_catpv(sv, " split(/,/,q{");
1689 sv_catpv(sv, ++s);
1690 sv_catpv(sv, "})");
1691 }
1692 s += strlen(s);
1693 if (PL_preambleav == NULL)
1694 PL_preambleav = newAV();
1695 av_push(PL_preambleav, sv);
1696 }
1697 else
1698 croak("No space allowed after -%c", *(s-1));
1699 return s;
1700 case 'n':
1701 PL_minus_n = TRUE;
1702 s++;
1703 return s;
1704 case 'p':
1705 PL_minus_p = TRUE;
1706 s++;
1707 return s;
1708 case 's':
1709 forbid_setid("-s");
1710 PL_doswitches = TRUE;
1711 s++;
1712 return s;
1713 case 'T':
1714 if (!PL_tainting)
1715 croak("Too late for \"-T\" option");
1716 s++;
1717 return s;
1718 case 'u':
1719 PL_do_undump = TRUE;
1720 s++;
1721 return s;
1722 case 'U':
1723 PL_unsafe = TRUE;
1724 s++;
1725 return s;
1726 case 'v':
1727#if defined(PERL_SUBVERSION) && PERL_SUBVERSION > 0
1728 printf("\nThis is perl, version %d.%03d_%02d built for %s",
1729 PERL_REVISION, PERL_VERSION, PERL_SUBVERSION, ARCHNAME);
1730#else
1731 printf("\nThis is perl, version %s built for %s",
1732 PL_patchlevel, ARCHNAME);
1733#endif
1734#if defined(LOCAL_PATCH_COUNT)
1735 if (LOCAL_PATCH_COUNT > 0)
1736 printf("\n(with %d registered patch%s, see perl -V for more detail)",
1737 LOCAL_PATCH_COUNT, (LOCAL_PATCH_COUNT!=1) ? "es" : "");
1738#endif
1739
1740 printf("\n\nCopyright 1987-1999, Larry Wall\n");
1741#ifdef MSDOS
1742 printf("\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
1743#endif
1744#ifdef DJGPP
1745 printf("djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n");
1746 printf("djgpp v2 port (perl5004+) by Laszlo Molnar, 1997-1999\n");
1747#endif
1748#ifdef OS2
1749 printf("\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
1750 "Version 5 port Copyright (c) 1994-1999, Andreas Kaiser, Ilya Zakharevich\n");
1751#endif
1752#ifdef atarist
1753 printf("atariST series port, ++jrb bammi@cadence.com\n");
1754#endif
1755#ifdef __BEOS__
1756 printf("BeOS port Copyright Tom Spindler, 1997-1999\n");
1757#endif
1758#ifdef MPE
1759 printf("MPE/iX port Copyright by Mark Klein and Mark Bixby, 1996-1999\n");
1760#endif
1761#ifdef OEMVS
1762 printf("MVS (OS390) port by Mortice Kern Systems, 1997-1999\n");
1763#endif
1764#ifdef __VOS__
1765 printf("Stratus VOS port by Paul_Green@stratus.com, 1997-1999\n");
1766#endif
1767#ifdef __OPEN_VM
1768 printf("VM/ESA port by Neale Ferguson, 1998-1999\n");
1769#endif
1770#ifdef POSIX_BC
1771 printf("BS2000 (POSIX) port by Start Amadeus GmbH, 1998-1999\n");
1772#endif
1773#ifdef __MINT__
1774 printf("MiNT port by Guido Flohr, 1997-1999\n");
1775#endif
1776#ifdef BINARY_BUILD_NOTICE
1777 BINARY_BUILD_NOTICE;
1778#endif
1779 printf("\n\
1780Perl may be copied only under the terms of either the Artistic License or the\n\
1781GNU General Public License, which may be found in the Perl 5.0 source kit.\n\n\
1782Complete documentation for Perl, including FAQ lists, should be found on\n\
1783this system using `man perl' or `perldoc perl'. If you have access to the\n\
1784Internet, point your browser at http://www.perl.com/, the Perl Home Page.\n\n");
1785 PerlProc_exit(0);
1786 case 'w':
1787 if (! (PL_dowarn & G_WARN_ALL_MASK))
1788 PL_dowarn |= G_WARN_ON;
1789 s++;
1790 return s;
1791 case 'W':
1792 PL_dowarn = G_WARN_ALL_ON|G_WARN_ON;
1793 PL_compiling.cop_warnings = WARN_ALL ;
1794 s++;
1795 return s;
1796 case 'X':
1797 PL_dowarn = G_WARN_ALL_OFF;
1798 PL_compiling.cop_warnings = WARN_NONE ;
1799 s++;
1800 return s;
1801 case '*':
1802 case ' ':
1803 if (s[1] == '-') /* Additional switches on #! line. */
1804 return s+2;
1805 break;
1806 case '-':
1807 case 0:
1808#if defined(WIN32) || !defined(PERL_STRICT_CR)
1809 case '\r':
1810#endif
1811 case '\n':
1812 case '\t':
1813 break;
1814#ifdef ALTERNATE_SHEBANG
1815 case 'S': /* OS/2 needs -S on "extproc" line. */
1816 break;
1817#endif
1818 case 'P':
1819 if (PL_preprocess)
1820 return s+1;
1821 /* FALL THROUGH */
1822 default:
1823 croak("Can't emulate -%.1s on #! line",s);
1824 }
1825 return Nullch;
1826}
1827
1828/* compliments of Tom Christiansen */
1829
1830/* unexec() can be found in the Gnu emacs distribution */
1831/* Known to work with -DUNEXEC and using unexelf.c from GNU emacs-20.2 */
1832
1833void
1834my_unexec(void)
1835{
1836#ifdef UNEXEC
1837 SV* prog;
1838 SV* file;
1839 int status = 1;
1840 extern int etext;
1841
1842 prog = newSVpv(BIN_EXP, 0);
1843 sv_catpv(prog, "/perl");
1844 file = newSVpv(PL_origfilename, 0);
1845 sv_catpv(file, ".perldump");
1846
1847 unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
1848 /* unexec prints msg to stderr in case of failure */
1849 PerlProc_exit(status);
1850#else
1851# ifdef VMS
1852# include <lib$routines.h>
1853 lib$signal(SS$_DEBUG); /* ssdef.h #included from vmsish.h */
1854# else
1855 ABORT(); /* for use with undump */
1856# endif
1857#endif
1858}
1859
1860/* initialize curinterp */
1861STATIC void
1862init_interp(void)
1863{
1864
1865#ifdef PERL_OBJECT /* XXX kludge */
1866#define I_REINIT \
1867 STMT_START { \
1868 PL_chopset = " \n-"; \
1869 PL_copline = NOLINE; \
1870 PL_curcop = &PL_compiling;\
1871 PL_curcopdb = NULL; \
1872 PL_dbargs = 0; \
1873 PL_dlmax = 128; \
1874 PL_dumpindent = 4; \
1875 PL_laststatval = -1; \
1876 PL_laststype = OP_STAT; \
1877 PL_maxscream = -1; \
1878 PL_maxsysfd = MAXSYSFD; \
1879 PL_statname = Nullsv; \
1880 PL_tmps_floor = -1; \
1881 PL_tmps_ix = -1; \
1882 PL_op_mask = NULL; \
1883 PL_dlmax = 128; \
1884 PL_laststatval = -1; \
1885 PL_laststype = OP_STAT; \
1886 PL_mess_sv = Nullsv; \
1887 PL_splitstr = " "; \
1888 PL_generation = 100; \
1889 PL_exitlist = NULL; \
1890 PL_exitlistlen = 0; \
1891 PL_regindent = 0; \
1892 PL_in_clean_objs = FALSE; \
1893 PL_in_clean_all = FALSE; \
1894 PL_profiledata = NULL; \
1895 PL_rsfp = Nullfp; \
1896 PL_rsfp_filters = Nullav; \
1897 PL_dirty = FALSE; \
1898 } STMT_END
1899 I_REINIT;
1900#else
1901# ifdef MULTIPLICITY
1902# define PERLVAR(var,type)
1903# define PERLVARI(var,type,init) PL_curinterp->var = init;
1904# define PERLVARIC(var,type,init) PL_curinterp->var = init;
1905# include "intrpvar.h"
1906# ifndef USE_THREADS
1907# include "thrdvar.h"
1908# endif
1909# undef PERLVAR
1910# undef PERLVARI
1911# undef PERLVARIC
1912# else
1913# define PERLVAR(var,type)
1914# define PERLVARI(var,type,init) PL_##var = init;
1915# define PERLVARIC(var,type,init) PL_##var = init;
1916# include "intrpvar.h"
1917# ifndef USE_THREADS
1918# include "thrdvar.h"
1919# endif
1920# undef PERLVAR
1921# undef PERLVARI
1922# undef PERLVARIC
1923# endif
1924#endif
1925
1926}
1927
1928STATIC void
1929init_main_stash(void)
1930{
1931 dTHR;
1932 GV *gv;
1933
1934 /* Note that strtab is a rather special HV. Assumptions are made
1935 about not iterating on it, and not adding tie magic to it.
1936 It is properly deallocated in perl_destruct() */
1937 PL_strtab = newHV();
1938#ifdef USE_THREADS
1939 MUTEX_INIT(&PL_strtab_mutex);
1940#endif
1941 HvSHAREKEYS_off(PL_strtab); /* mandatory */
1942 hv_ksplit(PL_strtab, 512);
1943
1944 PL_curstash = PL_defstash = newHV();
1945 PL_curstname = newSVpv("main",4);
1946 gv = gv_fetchpv("main::",TRUE, SVt_PVHV);
1947 SvREFCNT_dec(GvHV(gv));
1948 GvHV(gv) = (HV*)SvREFCNT_inc(PL_defstash);
1949 SvREADONLY_on(gv);
1950 HvNAME(PL_defstash) = savepv("main");
1951 PL_incgv = gv_HVadd(gv_AVadd(gv_fetchpv("INC",TRUE, SVt_PVAV)));
1952 GvMULTI_on(PL_incgv);
1953 PL_hintgv = gv_fetchpv("\010",TRUE, SVt_PV); /* ^H */
1954 GvMULTI_on(PL_hintgv);
1955 PL_defgv = gv_fetchpv("_",TRUE, SVt_PVAV);
1956 PL_errgv = gv_HVadd(gv_fetchpv("@", TRUE, SVt_PV));
1957 GvMULTI_on(PL_errgv);
1958 PL_replgv = gv_fetchpv("\022", TRUE, SVt_PV); /* ^R */
1959 GvMULTI_on(PL_replgv);
1960 (void)form("%240s",""); /* Preallocate temp - for immediate signals. */
1961 sv_grow(ERRSV, 240); /* Preallocate - for immediate signals. */
1962 sv_setpvn(ERRSV, "", 0);
1963 PL_curstash = PL_defstash;
1964 PL_compiling.cop_stash = PL_defstash;
1965 PL_debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
1966 PL_globalstash = GvHV(gv_fetchpv("CORE::GLOBAL::", GV_ADDMULTI, SVt_PVHV));
1967 /* We must init $/ before switches are processed. */
1968 sv_setpvn(perl_get_sv("/", TRUE), "\n", 1);
1969}
1970
1971STATIC void
1972open_script(char *scriptname, bool dosearch, SV *sv, int *fdscript)
1973{
1974 dTHR;
1975 register char *s;
1976
1977 *fdscript = -1;
1978
1979 if (PL_e_script) {
1980 PL_origfilename = savepv("-e");
1981 }
1982 else {
1983 /* if find_script() returns, it returns a malloc()-ed value */
1984 PL_origfilename = scriptname = find_script(scriptname, dosearch, NULL, 1);
1985
1986 if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
1987 char *s = scriptname + 8;
1988 *fdscript = atoi(s);
1989 while (isDIGIT(*s))
1990 s++;
1991 if (*s) {
1992 scriptname = savepv(s + 1);
1993 Safefree(PL_origfilename);
1994 PL_origfilename = scriptname;
1995 }
1996 }
1997 }
1998
1999 PL_curcop->cop_filegv = gv_fetchfile(PL_origfilename);
2000 if (strEQ(PL_origfilename,"-"))
2001 scriptname = "";
2002 if (*fdscript >= 0) {
2003 PL_rsfp = PerlIO_fdopen(*fdscript,PERL_SCRIPT_MODE);
2004#if defined(HAS_FCNTL) && defined(F_SETFD)
2005 if (PL_rsfp)
2006 fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,1); /* ensure close-on-exec */
2007#endif
2008 }
2009 else if (PL_preprocess) {
2010 char *cpp_cfg = CPPSTDIN;
2011 SV *cpp = newSVpv("",0);
2012 SV *cmd = NEWSV(0,0);
2013
2014 if (strEQ(cpp_cfg, "cppstdin"))
2015 sv_catpvf(cpp, "%s/", BIN_EXP);
2016 sv_catpv(cpp, cpp_cfg);
2017
2018 sv_catpv(sv,"-I");
2019 sv_catpv(sv,PRIVLIB_EXP);
2020
2021#ifdef MSDOS
2022 sv_setpvf(cmd, "\
2023sed %s -e \"/^[^#]/b\" \
2024 -e \"/^#[ ]*include[ ]/b\" \
2025 -e \"/^#[ ]*define[ ]/b\" \
2026 -e \"/^#[ ]*if[ ]/b\" \
2027 -e \"/^#[ ]*ifdef[ ]/b\" \
2028 -e \"/^#[ ]*ifndef[ ]/b\" \
2029 -e \"/^#[ ]*else/b\" \
2030 -e \"/^#[ ]*elif[ ]/b\" \
2031 -e \"/^#[ ]*undef[ ]/b\" \
2032 -e \"/^#[ ]*endif/b\" \
2033 -e \"s/^#.*//\" \
2034 %s | %_ -C %_ %s",
2035 (PL_doextract ? "-e \"1,/^#/d\n\"" : ""),
2036#else
2037# ifdef __OPEN_VM
2038 sv_setpvf(cmd, "\
2039%s %s -e '/^[^#]/b' \
2040 -e '/^#[ ]*include[ ]/b' \
2041 -e '/^#[ ]*define[ ]/b' \
2042 -e '/^#[ ]*if[ ]/b' \
2043 -e '/^#[ ]*ifdef[ ]/b' \
2044 -e '/^#[ ]*ifndef[ ]/b' \
2045 -e '/^#[ ]*else/b' \
2046 -e '/^#[ ]*elif[ ]/b' \
2047 -e '/^#[ ]*undef[ ]/b' \
2048 -e '/^#[ ]*endif/b' \
2049 -e 's/^[ ]*#.*//' \
2050 %s | %_ %_ %s",
2051# else
2052 sv_setpvf(cmd, "\
2053%s %s -e '/^[^#]/b' \
2054 -e '/^#[ ]*include[ ]/b' \
2055 -e '/^#[ ]*define[ ]/b' \
2056 -e '/^#[ ]*if[ ]/b' \
2057 -e '/^#[ ]*ifdef[ ]/b' \
2058 -e '/^#[ ]*ifndef[ ]/b' \
2059 -e '/^#[ ]*else/b' \
2060 -e '/^#[ ]*elif[ ]/b' \
2061 -e '/^#[ ]*undef[ ]/b' \
2062 -e '/^#[ ]*endif/b' \
2063 -e 's/^[ ]*#.*//' \
2064 %s | %_ -C %_ %s",
2065# endif
2066#ifdef LOC_SED
2067 LOC_SED,
2068#else
2069 "sed",
2070#endif
2071 (PL_doextract ? "-e '1,/^#/d\n'" : ""),
2072#endif
2073 scriptname, cpp, sv, CPPMINUS);
2074 PL_doextract = FALSE;
2075#ifdef IAMSUID /* actually, this is caught earlier */
2076 if (PL_euid != PL_uid && !PL_euid) { /* if running suidperl */
2077#ifdef HAS_SETEUID
2078 (void)seteuid(PL_uid); /* musn't stay setuid root */
2079#else
2080#ifdef HAS_SETREUID
2081 (void)setreuid((Uid_t)-1, PL_uid);
2082#else
2083#ifdef HAS_SETRESUID
2084 (void)setresuid((Uid_t)-1, PL_uid, (Uid_t)-1);
2085#else
2086 PerlProc_setuid(PL_uid);
2087#endif
2088#endif
2089#endif
2090 if (PerlProc_geteuid() != PL_uid)
2091 croak("Can't do seteuid!\n");
2092 }
2093#endif /* IAMSUID */
2094 PL_rsfp = PerlProc_popen(SvPVX(cmd), "r");
2095 SvREFCNT_dec(cmd);
2096 SvREFCNT_dec(cpp);
2097 }
2098 else if (!*scriptname) {
2099 forbid_setid("program input from stdin");
2100 PL_rsfp = PerlIO_stdin();
2101 }
2102 else {
2103 PL_rsfp = PerlIO_open(scriptname,PERL_SCRIPT_MODE);
2104#if defined(HAS_FCNTL) && defined(F_SETFD)
2105 if (PL_rsfp)
2106 fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,1); /* ensure close-on-exec */
2107#endif
2108 }
2109 if (!PL_rsfp) {
2110#ifdef DOSUID
2111#ifndef IAMSUID /* in case script is not readable before setuid */
2112 if (PL_euid &&
2113 PerlLIO_stat(SvPVX(GvSV(PL_curcop->cop_filegv)),&PL_statbuf) >= 0 &&
2114 PL_statbuf.st_mode & (S_ISUID|S_ISGID))
2115 {
2116 /* try again */
2117 PerlProc_execv(form("%s/sperl%s", BIN_EXP, PL_patchlevel), PL_origargv);
2118 croak("Can't do setuid\n");
2119 }
2120#endif
2121#endif
2122 croak("Can't open perl script \"%s\": %s\n",
2123 SvPVX(GvSV(PL_curcop->cop_filegv)), Strerror(errno));
2124 }
2125}
2126
2127/* Mention
2128 * I_SYSSTATVFS HAS_FSTATVFS
2129 * I_SYSMOUNT
2130 * I_STATFS HAS_FSTATFS
2131 * I_MNTENT HAS_GETMNTENT HAS_HASMNTOPT
2132 * here so that metaconfig picks them up. */
2133
2134#ifdef IAMSUID
2135static int
2136fd_on_nosuid_fs(int fd)
2137{
2138 int on_nosuid = 0;
2139 int check_okay = 0;
2140/*
2141 * Preferred order: fstatvfs(), fstatfs(), getmntent().
2142 * fstatvfs() is UNIX98.
2143 * fstatfs() is BSD.
2144 * getmntent() is O(number-of-mounted-filesystems) and can hang.
2145 */
2146
2147# ifdef HAS_FSTATVFS
2148 struct statvfs stfs;
2149 check_okay = fstatvfs(fd, &stfs) == 0;
2150 on_nosuid = check_okay && (stfs.f_flag & ST_NOSUID);
2151# else
2152# if defined(HAS_FSTATFS) && defined(HAS_STRUCT_STATFS_FLAGS)
2153 struct statfs stfs;
2154 check_okay = fstatfs(fd, &stfs) == 0;
2155# undef PERL_MOUNT_NOSUID
2156# if !defined(PERL_MOUNT_NOSUID) && defined(MNT_NOSUID)
2157# define PERL_MOUNT_NOSUID MNT_NOSUID
2158# endif
2159# if !defined(PERL_MOUNT_NOSUID) && defined(MS_NOSUID)
2160# define PERL_MOUNT_NOSUID MS_NOSUID
2161# endif
2162# if !defined(PERL_MOUNT_NOSUID) && defined(M_NOSUID)
2163# define PERL_MOUNT_NOSUID M_NOSUID
2164# endif
2165# ifdef PERL_MOUNT_NOSUID
2166 on_nosuid = check_okay && (stfs.f_flags & PERL_MOUNT_NOSUID);
2167# endif
2168# else
2169# if defined(HAS_GETMNTENT) && defined(HAS_HASMNTOPT) && defined(MNTOPT_NOSUID)
2170 FILE *mtab = fopen("/etc/mtab", "r");
2171 struct mntent *entry;
2172 struct stat stb, fsb;
2173
2174 if (mtab && (fstat(fd, &stb) == 0)) {
2175 while (entry = getmntent(mtab)) {
2176 if (stat(entry->mnt_dir, &fsb) == 0
2177 && fsb.st_dev == stb.st_dev)
2178 {
2179 /* found the filesystem */
2180 check_okay = 1;
2181 if (hasmntopt(entry, MNTOPT_NOSUID))
2182 on_nosuid = 1;
2183 break;
2184 } /* A single fs may well fail its stat(). */
2185 }
2186 }
2187 if (mtab)
2188 fclose(mtab);
2189# endif /* mntent */
2190# endif /* statfs */
2191# endif /* statvfs */
2192 if (!check_okay)
2193 croak("Can't check filesystem of script \"%s\"", PL_origfilename);
2194 return on_nosuid;
2195}
2196#endif /* IAMSUID */
2197
2198STATIC void
2199validate_suid(char *validarg, char *scriptname, int fdscript)
2200{
2201 int which;
2202
2203 /* do we need to emulate setuid on scripts? */
2204
2205 /* This code is for those BSD systems that have setuid #! scripts disabled
2206 * in the kernel because of a security problem. Merely defining DOSUID
2207 * in perl will not fix that problem, but if you have disabled setuid
2208 * scripts in the kernel, this will attempt to emulate setuid and setgid
2209 * on scripts that have those now-otherwise-useless bits set. The setuid
2210 * root version must be called suidperl or sperlN.NNN. If regular perl
2211 * discovers that it has opened a setuid script, it calls suidperl with
2212 * the same argv that it had. If suidperl finds that the script it has
2213 * just opened is NOT setuid root, it sets the effective uid back to the
2214 * uid. We don't just make perl setuid root because that loses the
2215 * effective uid we had before invoking perl, if it was different from the
2216 * uid.
2217 *
2218 * DOSUID must be defined in both perl and suidperl, and IAMSUID must
2219 * be defined in suidperl only. suidperl must be setuid root. The
2220 * Configure script will set this up for you if you want it.
2221 */
2222
2223#ifdef DOSUID
2224 dTHR;
2225 char *s, *s2;
2226
2227 if (PerlLIO_fstat(PerlIO_fileno(PL_rsfp),&PL_statbuf) < 0) /* normal stat is insecure */
2228 croak("Can't stat script \"%s\"",PL_origfilename);
2229 if (fdscript < 0 && PL_statbuf.st_mode & (S_ISUID|S_ISGID)) {
2230 I32 len;
2231 STRLEN n_a;
2232
2233#ifdef IAMSUID
2234#ifndef HAS_SETREUID
2235 /* On this access check to make sure the directories are readable,
2236 * there is actually a small window that the user could use to make
2237 * filename point to an accessible directory. So there is a faint
2238 * chance that someone could execute a setuid script down in a
2239 * non-accessible directory. I don't know what to do about that.
2240 * But I don't think it's too important. The manual lies when
2241 * it says access() is useful in setuid programs.
2242 */
2243 if (PerlLIO_access(SvPVX(GvSV(PL_curcop->cop_filegv)),1)) /*double check*/
2244 croak("Permission denied");
2245#else
2246 /* If we can swap euid and uid, then we can determine access rights
2247 * with a simple stat of the file, and then compare device and
2248 * inode to make sure we did stat() on the same file we opened.
2249 * Then we just have to make sure he or she can execute it.
2250 */
2251 {
2252 struct stat tmpstatbuf;
2253
2254 if (
2255#ifdef HAS_SETREUID
2256 setreuid(PL_euid,PL_uid) < 0
2257#else
2258# if HAS_SETRESUID
2259 setresuid(PL_euid,PL_uid,(Uid_t)-1) < 0
2260# endif
2261#endif
2262 || PerlProc_getuid() != PL_euid || PerlProc_geteuid() != PL_uid)
2263 croak("Can't swap uid and euid"); /* really paranoid */
2264 if (PerlLIO_stat(SvPVX(GvSV(PL_curcop->cop_filegv)),&tmpstatbuf) < 0)
2265 croak("Permission denied"); /* testing full pathname here */
2266#if defined(IAMSUID) && !defined(NO_NOSUID_CHECK)
2267 if (fd_on_nosuid_fs(PerlIO_fileno(PL_rsfp)))
2268 croak("Permission denied");
2269#endif
2270 if (tmpstatbuf.st_dev != PL_statbuf.st_dev ||
2271 tmpstatbuf.st_ino != PL_statbuf.st_ino) {
2272 (void)PerlIO_close(PL_rsfp);
2273 if (PL_rsfp = PerlProc_popen("/bin/mail root","w")) { /* heh, heh */
2274 PerlIO_printf(PL_rsfp,
2275"User %ld tried to run dev %ld ino %ld in place of dev %ld ino %ld!\n\
2276(Filename of set-id script was %s, uid %ld gid %ld.)\n\nSincerely,\nperl\n",
2277 (long)PL_uid,(long)tmpstatbuf.st_dev, (long)tmpstatbuf.st_ino,
2278 (long)PL_statbuf.st_dev, (long)PL_statbuf.st_ino,
2279 SvPVX(GvSV(PL_curcop->cop_filegv)),
2280 (long)PL_statbuf.st_uid, (long)PL_statbuf.st_gid);
2281 (void)PerlProc_pclose(PL_rsfp);
2282 }
2283 croak("Permission denied\n");
2284 }
2285 if (
2286#ifdef HAS_SETREUID
2287 setreuid(PL_uid,PL_euid) < 0
2288#else
2289# if defined(HAS_SETRESUID)
2290 setresuid(PL_uid,PL_euid,(Uid_t)-1) < 0
2291# endif
2292#endif
2293 || PerlProc_getuid() != PL_uid || PerlProc_geteuid() != PL_euid)
2294 croak("Can't reswap uid and euid");
2295 if (!cando(S_IXUSR,FALSE,&PL_statbuf)) /* can real uid exec? */
2296 croak("Permission denied\n");
2297 }
2298#endif /* HAS_SETREUID */
2299#endif /* IAMSUID */
2300
2301 if (!S_ISREG(PL_statbuf.st_mode))
2302 croak("Permission denied");
2303 if (PL_statbuf.st_mode & S_IWOTH)
2304 croak("Setuid/gid script is writable by world");
2305 PL_doswitches = FALSE; /* -s is insecure in suid */
2306 PL_curcop->cop_line++;
2307 if (sv_gets(PL_linestr, PL_rsfp, 0) == Nullch ||
2308 strnNE(SvPV(PL_linestr,n_a),"#!",2) ) /* required even on Sys V */
2309 croak("No #! line");
2310 s = SvPV(PL_linestr,n_a)+2;
2311 if (*s == ' ') s++;
2312 while (!isSPACE(*s)) s++;
2313 for (s2 = s; (s2 > SvPV(PL_linestr,n_a)+2 &&
2314 (isDIGIT(s2[-1]) || strchr("._-", s2[-1]))); s2--) ;
2315 if (strnNE(s2-4,"perl",4) && strnNE(s-9,"perl",4)) /* sanity check */
2316 croak("Not a perl script");
2317 while (*s == ' ' || *s == '\t') s++;
2318 /*
2319 * #! arg must be what we saw above. They can invoke it by
2320 * mentioning suidperl explicitly, but they may not add any strange
2321 * arguments beyond what #! says if they do invoke suidperl that way.
2322 */
2323 len = strlen(validarg);
2324 if (strEQ(validarg," PHOOEY ") ||
2325 strnNE(s,validarg,len) || !isSPACE(s[len]))
2326 croak("Args must match #! line");
2327
2328#ifndef IAMSUID
2329 if (PL_euid != PL_uid && (PL_statbuf.st_mode & S_ISUID) &&
2330 PL_euid == PL_statbuf.st_uid)
2331 if (!PL_do_undump)
2332 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2333FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2334#endif /* IAMSUID */
2335
2336 if (PL_euid) { /* oops, we're not the setuid root perl */
2337 (void)PerlIO_close(PL_rsfp);
2338#ifndef IAMSUID
2339 /* try again */
2340 PerlProc_execv(form("%s/sperl%s", BIN_EXP, PL_patchlevel), PL_origargv);
2341#endif
2342 croak("Can't do setuid\n");
2343 }
2344
2345 if (PL_statbuf.st_mode & S_ISGID && PL_statbuf.st_gid != PL_egid) {
2346#ifdef HAS_SETEGID
2347 (void)setegid(PL_statbuf.st_gid);
2348#else
2349#ifdef HAS_SETREGID
2350 (void)setregid((Gid_t)-1,PL_statbuf.st_gid);
2351#else
2352#ifdef HAS_SETRESGID
2353 (void)setresgid((Gid_t)-1,PL_statbuf.st_gid,(Gid_t)-1);
2354#else
2355 PerlProc_setgid(PL_statbuf.st_gid);
2356#endif
2357#endif
2358#endif
2359 if (PerlProc_getegid() != PL_statbuf.st_gid)
2360 croak("Can't do setegid!\n");
2361 }
2362 if (PL_statbuf.st_mode & S_ISUID) {
2363 if (PL_statbuf.st_uid != PL_euid)
2364#ifdef HAS_SETEUID
2365 (void)seteuid(PL_statbuf.st_uid); /* all that for this */
2366#else
2367#ifdef HAS_SETREUID
2368 (void)setreuid((Uid_t)-1,PL_statbuf.st_uid);
2369#else
2370#ifdef HAS_SETRESUID
2371 (void)setresuid((Uid_t)-1,PL_statbuf.st_uid,(Uid_t)-1);
2372#else
2373 PerlProc_setuid(PL_statbuf.st_uid);
2374#endif
2375#endif
2376#endif
2377 if (PerlProc_geteuid() != PL_statbuf.st_uid)
2378 croak("Can't do seteuid!\n");
2379 }
2380 else if (PL_uid) { /* oops, mustn't run as root */
2381#ifdef HAS_SETEUID
2382 (void)seteuid((Uid_t)PL_uid);
2383#else
2384#ifdef HAS_SETREUID
2385 (void)setreuid((Uid_t)-1,(Uid_t)PL_uid);
2386#else
2387#ifdef HAS_SETRESUID
2388 (void)setresuid((Uid_t)-1,(Uid_t)PL_uid,(Uid_t)-1);
2389#else
2390 PerlProc_setuid((Uid_t)PL_uid);
2391#endif
2392#endif
2393#endif
2394 if (PerlProc_geteuid() != PL_uid)
2395 croak("Can't do seteuid!\n");
2396 }
2397 init_ids();
2398 if (!cando(S_IXUSR,TRUE,&PL_statbuf))
2399 croak("Permission denied\n"); /* they can't do this */
2400 }
2401#ifdef IAMSUID
2402 else if (PL_preprocess)
2403 croak("-P not allowed for setuid/setgid script\n");
2404 else if (fdscript >= 0)
2405 croak("fd script not allowed in suidperl\n");
2406 else
2407 croak("Script is not setuid/setgid in suidperl\n");
2408
2409 /* We absolutely must clear out any saved ids here, so we */
2410 /* exec the real perl, substituting fd script for scriptname. */
2411 /* (We pass script name as "subdir" of fd, which perl will grok.) */
2412 PerlIO_rewind(PL_rsfp);
2413 PerlLIO_lseek(PerlIO_fileno(PL_rsfp),(Off_t)0,0); /* just in case rewind didn't */
2414 for (which = 1; PL_origargv[which] && PL_origargv[which] != scriptname; which++) ;
2415 if (!PL_origargv[which])
2416 croak("Permission denied");
2417 PL_origargv[which] = savepv(form("/dev/fd/%d/%s",
2418 PerlIO_fileno(PL_rsfp), PL_origargv[which]));
2419#if defined(HAS_FCNTL) && defined(F_SETFD)
2420 fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,0); /* ensure no close-on-exec */
2421#endif
2422 PerlProc_execv(form("%s/perl%s", BIN_EXP, PL_patchlevel), PL_origargv);/* try again */
2423 croak("Can't do setuid\n");
2424#endif /* IAMSUID */
2425#else /* !DOSUID */
2426 if (PL_euid != PL_uid || PL_egid != PL_gid) { /* (suidperl doesn't exist, in fact) */
2427#ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
2428 dTHR;
2429 PerlLIO_fstat(PerlIO_fileno(PL_rsfp),&PL_statbuf); /* may be either wrapped or real suid */
2430 if ((PL_euid != PL_uid && PL_euid == PL_statbuf.st_uid && PL_statbuf.st_mode & S_ISUID)
2431 ||
2432 (PL_egid != PL_gid && PL_egid == PL_statbuf.st_gid && PL_statbuf.st_mode & S_ISGID)
2433 )
2434 if (!PL_do_undump)
2435 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2436FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2437#endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
2438 /* not set-id, must be wrapped */
2439 }
2440#endif /* DOSUID */
2441}
2442
2443STATIC void
2444find_beginning(void)
2445{
2446 register char *s, *s2;
2447
2448 /* skip forward in input to the real script? */
2449
2450 forbid_setid("-x");
2451 while (PL_doextract) {
2452 if ((s = sv_gets(PL_linestr, PL_rsfp, 0)) == Nullch)
2453 croak("No Perl script found in input\n");
2454 if (*s == '#' && s[1] == '!' && (s = instr(s,"perl"))) {
2455 PerlIO_ungetc(PL_rsfp, '\n'); /* to keep line count right */
2456 PL_doextract = FALSE;
2457 while (*s && !(isSPACE (*s) || *s == '#')) s++;
2458 s2 = s;
2459 while (*s == ' ' || *s == '\t') s++;
2460 if (*s++ == '-') {
2461 while (isDIGIT(s2[-1]) || strchr("-._", s2[-1])) s2--;
2462 if (strnEQ(s2-4,"perl",4))
2463 /*SUPPRESS 530*/
2464 while (s = moreswitches(s)) ;
2465 }
2466 if (PL_cddir && PerlDir_chdir(PL_cddir) < 0)
2467 croak("Can't chdir to %s",PL_cddir);
2468 }
2469 }
2470}
2471
2472
2473STATIC void
2474init_ids(void)
2475{
2476 PL_uid = (int)PerlProc_getuid();
2477 PL_euid = (int)PerlProc_geteuid();
2478 PL_gid = (int)PerlProc_getgid();
2479 PL_egid = (int)PerlProc_getegid();
2480#ifdef VMS
2481 PL_uid |= PL_gid << 16;
2482 PL_euid |= PL_egid << 16;
2483#endif
2484 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2485}
2486
2487STATIC void
2488forbid_setid(char *s)
2489{
2490 if (PL_euid != PL_uid)
2491 croak("No %s allowed while running setuid", s);
2492 if (PL_egid != PL_gid)
2493 croak("No %s allowed while running setgid", s);
2494}
2495
2496STATIC void
2497init_debugger(void)
2498{
2499 dTHR;
2500 PL_curstash = PL_debstash;
2501 PL_dbargs = GvAV(gv_AVadd((gv_fetchpv("args", GV_ADDMULTI, SVt_PVAV))));
2502 AvREAL_off(PL_dbargs);
2503 PL_DBgv = gv_fetchpv("DB", GV_ADDMULTI, SVt_PVGV);
2504 PL_DBline = gv_fetchpv("dbline", GV_ADDMULTI, SVt_PVAV);
2505 PL_DBsub = gv_HVadd(gv_fetchpv("sub", GV_ADDMULTI, SVt_PVHV));
2506 PL_DBsingle = GvSV((gv_fetchpv("single", GV_ADDMULTI, SVt_PV)));
2507 sv_setiv(PL_DBsingle, 0);
2508 PL_DBtrace = GvSV((gv_fetchpv("trace", GV_ADDMULTI, SVt_PV)));
2509 sv_setiv(PL_DBtrace, 0);
2510 PL_DBsignal = GvSV((gv_fetchpv("signal", GV_ADDMULTI, SVt_PV)));
2511 sv_setiv(PL_DBsignal, 0);
2512 PL_curstash = PL_defstash;
2513}
2514
2515#ifndef STRESS_REALLOC
2516#define REASONABLE(size) (size)
2517#else
2518#define REASONABLE(size) (1) /* unreasonable */
2519#endif
2520
2521void
2522init_stacks(ARGSproto)
2523{
2524 /* start with 128-item stack and 8K cxstack */
2525 PL_curstackinfo = new_stackinfo(REASONABLE(128),
2526 REASONABLE(8192/sizeof(PERL_CONTEXT) - 1));
2527 PL_curstackinfo->si_type = PERLSI_MAIN;
2528 PL_curstack = PL_curstackinfo->si_stack;
2529 PL_mainstack = PL_curstack; /* remember in case we switch stacks */
2530
2531 PL_stack_base = AvARRAY(PL_curstack);
2532 PL_stack_sp = PL_stack_base;
2533 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
2534
2535 New(50,PL_tmps_stack,REASONABLE(128),SV*);
2536 PL_tmps_floor = -1;
2537 PL_tmps_ix = -1;
2538 PL_tmps_max = REASONABLE(128);
2539
2540 New(54,PL_markstack,REASONABLE(32),I32);
2541 PL_markstack_ptr = PL_markstack;
2542 PL_markstack_max = PL_markstack + REASONABLE(32);
2543
2544 SET_MARKBASE;
2545
2546 New(54,PL_scopestack,REASONABLE(32),I32);
2547 PL_scopestack_ix = 0;
2548 PL_scopestack_max = REASONABLE(32);
2549
2550 New(54,PL_savestack,REASONABLE(128),ANY);
2551 PL_savestack_ix = 0;
2552 PL_savestack_max = REASONABLE(128);
2553
2554 New(54,PL_retstack,REASONABLE(16),OP*);
2555 PL_retstack_ix = 0;
2556 PL_retstack_max = REASONABLE(16);
2557}
2558
2559#undef REASONABLE
2560
2561STATIC void
2562nuke_stacks(void)
2563{
2564 dTHR;
2565 while (PL_curstackinfo->si_next)
2566 PL_curstackinfo = PL_curstackinfo->si_next;
2567 while (PL_curstackinfo) {
2568 PERL_SI *p = PL_curstackinfo->si_prev;
2569 /* curstackinfo->si_stack got nuked by sv_free_arenas() */
2570 Safefree(PL_curstackinfo->si_cxstack);
2571 Safefree(PL_curstackinfo);
2572 PL_curstackinfo = p;
2573 }
2574 Safefree(PL_tmps_stack);
2575 Safefree(PL_markstack);
2576 Safefree(PL_scopestack);
2577 Safefree(PL_savestack);
2578 Safefree(PL_retstack);
2579 DEBUG( {
2580 Safefree(PL_debname);
2581 Safefree(PL_debdelim);
2582 } )
2583}
2584
2585#ifndef PERL_OBJECT
2586static PerlIO *tmpfp; /* moved outside init_lexer() because of UNICOS bug */
2587#endif
2588
2589STATIC void
2590init_lexer(void)
2591{
2592#ifdef PERL_OBJECT
2593 PerlIO *tmpfp;
2594#endif
2595 tmpfp = PL_rsfp;
2596 PL_rsfp = Nullfp;
2597 lex_start(PL_linestr);
2598 PL_rsfp = tmpfp;
2599 PL_subname = newSVpv("main",4);
2600}
2601
2602STATIC void
2603init_predump_symbols(void)
2604{
2605 dTHR;
2606 GV *tmpgv;
2607 GV *othergv;
2608
2609 sv_setpvn(perl_get_sv("\"", TRUE), " ", 1);
2610 PL_stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
2611 GvMULTI_on(PL_stdingv);
2612 IoIFP(GvIOp(PL_stdingv)) = PerlIO_stdin();
2613 tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
2614 GvMULTI_on(tmpgv);
2615 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(PL_stdingv));
2616
2617 tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
2618 GvMULTI_on(tmpgv);
2619 IoOFP(GvIOp(tmpgv)) = IoIFP(GvIOp(tmpgv)) = PerlIO_stdout();
2620 setdefout(tmpgv);
2621 tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
2622 GvMULTI_on(tmpgv);
2623 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(PL_defoutgv));
2624
2625 othergv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
2626 GvMULTI_on(othergv);
2627 IoOFP(GvIOp(othergv)) = IoIFP(GvIOp(othergv)) = PerlIO_stderr();
2628 tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
2629 GvMULTI_on(tmpgv);
2630 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(othergv));
2631
2632 PL_statname = NEWSV(66,0); /* last filename we did stat on */
2633
2634 if (!PL_osname)
2635 PL_osname = savepv(OSNAME);
2636}
2637
2638STATIC void
2639init_postdump_symbols(register int argc, register char **argv, register char **env)
2640{
2641 dTHR;
2642 char *s;
2643 SV *sv;
2644 GV* tmpgv;
2645
2646 argc--,argv++; /* skip name of script */
2647 if (PL_doswitches) {
2648 for (; argc > 0 && **argv == '-'; argc--,argv++) {
2649 if (!argv[0][1])
2650 break;
2651 if (argv[0][1] == '-') {
2652 argc--,argv++;
2653 break;
2654 }
2655 if (s = strchr(argv[0], '=')) {
2656 *s++ = '\0';
2657 sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),s);
2658 }
2659 else
2660 sv_setiv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),1);
2661 }
2662 }
2663 PL_toptarget = NEWSV(0,0);
2664 sv_upgrade(PL_toptarget, SVt_PVFM);
2665 sv_setpvn(PL_toptarget, "", 0);
2666 PL_bodytarget = NEWSV(0,0);
2667 sv_upgrade(PL_bodytarget, SVt_PVFM);
2668 sv_setpvn(PL_bodytarget, "", 0);
2669 PL_formtarget = PL_bodytarget;
2670
2671 TAINT;
2672 if (tmpgv = gv_fetchpv("0",TRUE, SVt_PV)) {
2673 sv_setpv(GvSV(tmpgv),PL_origfilename);
2674 magicname("0", "0", 1);
2675 }
2676 if (tmpgv = gv_fetchpv("\030",TRUE, SVt_PV))
2677 sv_setpv(GvSV(tmpgv),PL_origargv[0]);
2678 if (PL_argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV)) {
2679 GvMULTI_on(PL_argvgv);
2680 (void)gv_AVadd(PL_argvgv);
2681 av_clear(GvAVn(PL_argvgv));
2682 for (; argc > 0; argc--,argv++) {
2683 av_push(GvAVn(PL_argvgv),newSVpv(argv[0],0));
2684 }
2685 }
2686 if (PL_envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV)) {
2687 HV *hv;
2688 GvMULTI_on(PL_envgv);
2689 hv = GvHVn(PL_envgv);
2690 hv_magic(hv, PL_envgv, 'E');
2691#ifndef VMS /* VMS doesn't have environ array */
2692 /* Note that if the supplied env parameter is actually a copy
2693 of the global environ then it may now point to free'd memory
2694 if the environment has been modified since. To avoid this
2695 problem we treat env==NULL as meaning 'use the default'
2696 */
2697 if (!env)
2698 env = environ;
2699 if (env != environ)
2700 environ[0] = Nullch;
2701 for (; *env; env++) {
2702 if (!(s = strchr(*env,'=')))
2703 continue;
2704 *s++ = '\0';
2705#if defined(MSDOS)
2706 (void)strupr(*env);
2707#endif
2708 sv = newSVpv(s--,0);
2709 (void)hv_store(hv, *env, s - *env, sv, 0);
2710 *s = '=';
2711#if defined(__BORLANDC__) && defined(USE_WIN32_RTL_ENV)
2712 /* Sins of the RTL. See note in my_setenv(). */
2713 (void)PerlEnv_putenv(savepv(*env));
2714#endif
2715 }
2716#endif
2717#ifdef DYNAMIC_ENV_FETCH
2718 HvNAME(hv) = savepv(ENV_HV_NAME);
2719#endif
2720 }
2721 TAINT_NOT;
2722 if (tmpgv = gv_fetchpv("$",TRUE, SVt_PV))
2723 sv_setiv(GvSV(tmpgv), (IV)getpid());
2724}
2725
2726STATIC void
2727init_perllib(void)
2728{
2729 char *s;
2730 if (!PL_tainting) {
2731#ifndef VMS
2732 s = PerlEnv_getenv("PERL5LIB");
2733 if (s)
2734 incpush(s, TRUE);
2735 else
2736 incpush(PerlEnv_getenv("PERLLIB"), FALSE);
2737#else /* VMS */
2738 /* Treat PERL5?LIB as a possible search list logical name -- the
2739 * "natural" VMS idiom for a Unix path string. We allow each
2740 * element to be a set of |-separated directories for compatibility.
2741 */
2742 char buf[256];
2743 int idx = 0;
2744 if (my_trnlnm("PERL5LIB",buf,0))
2745 do { incpush(buf,TRUE); } while (my_trnlnm("PERL5LIB",buf,++idx));
2746 else
2747 while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE);
2748#endif /* VMS */
2749 }
2750
2751/* Use the ~-expanded versions of APPLLIB (undocumented),
2752 ARCHLIB PRIVLIB SITEARCH and SITELIB
2753*/
2754#ifdef APPLLIB_EXP
2755 incpush(APPLLIB_EXP, TRUE);
2756#endif
2757
2758#ifdef ARCHLIB_EXP
2759 incpush(ARCHLIB_EXP, FALSE);
2760#endif
2761#ifndef PRIVLIB_EXP
2762#define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
2763#endif
2764#if defined(WIN32)
2765 incpush(PRIVLIB_EXP, TRUE);
2766#else
2767 incpush(PRIVLIB_EXP, FALSE);
2768#endif
2769
2770#ifdef SITEARCH_EXP
2771 incpush(SITEARCH_EXP, FALSE);
2772#endif
2773#ifdef SITELIB_EXP
2774#if defined(WIN32)
2775 incpush(SITELIB_EXP, TRUE);
2776#else
2777 incpush(SITELIB_EXP, FALSE);
2778#endif
2779#endif
2780 if (!PL_tainting)
2781 incpush(".", FALSE);
2782}
2783
2784#if defined(DOSISH)
2785# define PERLLIB_SEP ';'
2786#else
2787# if defined(VMS)
2788# define PERLLIB_SEP '|'
2789# else
2790# define PERLLIB_SEP ':'
2791# endif
2792#endif
2793#ifndef PERLLIB_MANGLE
2794# define PERLLIB_MANGLE(s,n) (s)
2795#endif
2796
2797STATIC void
2798incpush(char *p, int addsubdirs)
2799{
2800 SV *subdir = Nullsv;
2801
2802 if (!p)
2803 return;
2804
2805 if (addsubdirs) {
2806 subdir = sv_newmortal();
2807 if (!PL_archpat_auto) {
2808 STRLEN len = (sizeof(ARCHNAME) + strlen(PL_patchlevel)
2809 + sizeof("//auto"));
2810 New(55, PL_archpat_auto, len, char);
2811 sprintf(PL_archpat_auto, "/%s/%s/auto", ARCHNAME, PL_patchlevel);
2812#ifdef VMS
2813 for (len = sizeof(ARCHNAME) + 2;
2814 PL_archpat_auto[len] != '\0' && PL_archpat_auto[len] != '/'; len++)
2815 if (PL_archpat_auto[len] == '.') PL_archpat_auto[len] = '_';
2816#endif
2817 }
2818 }
2819
2820 /* Break at all separators */
2821 while (p && *p) {
2822 SV *libdir = NEWSV(55,0);
2823 char *s;
2824
2825 /* skip any consecutive separators */
2826 while ( *p == PERLLIB_SEP ) {
2827 /* Uncomment the next line for PATH semantics */
2828 /* av_push(GvAVn(PL_incgv), newSVpv(".", 1)); */
2829 p++;
2830 }
2831
2832 if ( (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
2833 sv_setpvn(libdir, PERLLIB_MANGLE(p, (STRLEN)(s - p)),
2834 (STRLEN)(s - p));
2835 p = s + 1;
2836 }
2837 else {
2838 sv_setpv(libdir, PERLLIB_MANGLE(p, 0));
2839 p = Nullch; /* break out */
2840 }
2841
2842 /*
2843 * BEFORE pushing libdir onto @INC we may first push version- and
2844 * archname-specific sub-directories.
2845 */
2846 if (addsubdirs) {
2847 struct stat tmpstatbuf;
2848#ifdef VMS
2849 char *unix;
2850 STRLEN len;
2851
2852 if ((unix = tounixspec_ts(SvPV(libdir,len),Nullch)) != Nullch) {
2853 len = strlen(unix);
2854 while (unix[len-1] == '/') len--; /* Cosmetic */
2855 sv_usepvn(libdir,unix,len);
2856 }
2857 else
2858 PerlIO_printf(PerlIO_stderr(),
2859 "Failed to unixify @INC element \"%s\"\n",
2860 SvPV(libdir,len));
2861#endif
2862 /* .../archname/version if -d .../archname/version/auto */
2863 sv_setsv(subdir, libdir);
2864 sv_catpv(subdir, PL_archpat_auto);
2865 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2866 S_ISDIR(tmpstatbuf.st_mode))
2867 av_push(GvAVn(PL_incgv),
2868 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2869
2870 /* .../archname if -d .../archname/auto */
2871 sv_insert(subdir, SvCUR(libdir) + sizeof(ARCHNAME),
2872 strlen(PL_patchlevel) + 1, "", 0);
2873 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2874 S_ISDIR(tmpstatbuf.st_mode))
2875 av_push(GvAVn(PL_incgv),
2876 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2877 }
2878
2879 /* finally push this lib directory on the end of @INC */
2880 av_push(GvAVn(PL_incgv), libdir);
2881 }
2882}
2883
2884#ifdef USE_THREADS
2885STATIC struct perl_thread *
2886init_main_thread()
2887{
2888 struct perl_thread *thr;
2889 XPV *xpv;
2890
2891 Newz(53, thr, 1, struct perl_thread);
2892 PL_curcop = &PL_compiling;
2893 thr->cvcache = newHV();
2894 thr->threadsv = newAV();
2895 /* thr->threadsvp is set when find_threadsv is called */
2896 thr->specific = newAV();
2897 thr->errhv = newHV();
2898 thr->flags = THRf_R_JOINABLE;
2899 MUTEX_INIT(&thr->mutex);
2900 /* Handcraft thrsv similarly to mess_sv */
2901 New(53, PL_thrsv, 1, SV);
2902 Newz(53, xpv, 1, XPV);
2903 SvFLAGS(PL_thrsv) = SVt_PV;
2904 SvANY(PL_thrsv) = (void*)xpv;
2905 SvREFCNT(PL_thrsv) = 1 << 30; /* practically infinite */
2906 SvPVX(PL_thrsv) = (char*)thr;
2907 SvCUR_set(PL_thrsv, sizeof(thr));
2908 SvLEN_set(PL_thrsv, sizeof(thr));
2909 *SvEND(PL_thrsv) = '\0'; /* in the trailing_nul field */
2910 thr->oursv = PL_thrsv;
2911 PL_chopset = " \n-";
2912 PL_dumpindent = 4;
2913
2914 MUTEX_LOCK(&PL_threads_mutex);
2915 PL_nthreads++;
2916 thr->tid = 0;
2917 thr->next = thr;
2918 thr->prev = thr;
2919 MUTEX_UNLOCK(&PL_threads_mutex);
2920
2921#ifdef HAVE_THREAD_INTERN
2922 init_thread_intern(thr);
2923#endif
2924
2925#ifdef SET_THREAD_SELF
2926 SET_THREAD_SELF(thr);
2927#else
2928 thr->self = pthread_self();
2929#endif /* SET_THREAD_SELF */
2930 SET_THR(thr);
2931
2932 /*
2933 * These must come after the SET_THR because sv_setpvn does
2934 * SvTAINT and the taint fields require dTHR.
2935 */
2936 PL_toptarget = NEWSV(0,0);
2937 sv_upgrade(PL_toptarget, SVt_PVFM);
2938 sv_setpvn(PL_toptarget, "", 0);
2939 PL_bodytarget = NEWSV(0,0);
2940 sv_upgrade(PL_bodytarget, SVt_PVFM);
2941 sv_setpvn(PL_bodytarget, "", 0);
2942 PL_formtarget = PL_bodytarget;
2943 thr->errsv = newSVpv("", 0);
2944 (void) find_threadsv("@"); /* Ensure $@ is initialised early */
2945
2946 PL_maxscream = -1;
2947 PL_regcompp = FUNC_NAME_TO_PTR(pregcomp);
2948 PL_regexecp = FUNC_NAME_TO_PTR(regexec_flags);
2949 PL_regindent = 0;
2950 PL_reginterp_cnt = 0;
2951
2952 return thr;
2953}
2954#endif /* USE_THREADS */
2955
2956void
2957call_list(I32 oldscope, AV *paramList)
2958{
2959 dTHR;
2960 line_t oldline = PL_curcop->cop_line;
2961 STRLEN len;
2962 dJMPENV;
2963 int ret;
2964
2965 while (AvFILL(paramList) >= 0) {
2966 CV *cv = (CV*)av_shift(paramList);
2967
2968 SAVEFREESV(cv);
2969
2970 JMPENV_PUSH(ret);
2971 switch (ret) {
2972 case 0: {
2973 SV* atsv = ERRSV;
2974 PUSHMARK(PL_stack_sp);
2975 perl_call_sv((SV*)cv, G_EVAL|G_DISCARD);
2976 (void)SvPV(atsv, len);
2977 if (len) {
2978 JMPENV_POP;
2979 PL_curcop = &PL_compiling;
2980 PL_curcop->cop_line = oldline;
2981 if (paramList == PL_beginav)
2982 sv_catpv(atsv, "BEGIN failed--compilation aborted");
2983 else
2984 sv_catpv(atsv, "END failed--cleanup aborted");
2985 while (PL_scopestack_ix > oldscope)
2986 LEAVE;
2987 croak("%s", SvPVX(atsv));
2988 }
2989 }
2990 break;
2991 case 1:
2992 STATUS_ALL_FAILURE;
2993 /* FALL THROUGH */
2994 case 2:
2995 /* my_exit() was called */
2996 while (PL_scopestack_ix > oldscope)
2997 LEAVE;
2998 FREETMPS;
2999 PL_curstash = PL_defstash;
3000 if (PL_endav)
3001 call_list(oldscope, PL_endav);
3002 JMPENV_POP;
3003 PL_curcop = &PL_compiling;
3004 PL_curcop->cop_line = oldline;
3005 if (PL_statusvalue) {
3006 if (paramList == PL_beginav)
3007 croak("BEGIN failed--compilation aborted");
3008 else
3009 croak("END failed--cleanup aborted");
3010 }
3011 my_exit_jump();
3012 /* NOTREACHED */
3013 case 3:
3014 if (!PL_restartop) {
3015 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
3016 FREETMPS;
3017 break;
3018 }
3019 JMPENV_POP;
3020 PL_curcop = &PL_compiling;
3021 PL_curcop->cop_line = oldline;
3022 JMPENV_JUMP(3);
3023 }
3024 JMPENV_POP;
3025 }
3026}
3027
3028void
3029my_exit(U32 status)
3030{
3031 dTHR;
3032
3033 DEBUG_S(PerlIO_printf(Perl_debug_log, "my_exit: thread %p, status %lu\n",
3034 thr, (unsigned long) status));
3035 switch (status) {
3036 case 0:
3037 STATUS_ALL_SUCCESS;
3038 break;
3039 case 1:
3040 STATUS_ALL_FAILURE;
3041 break;
3042 default:
3043 STATUS_NATIVE_SET(status);
3044 break;
3045 }
3046 my_exit_jump();
3047}
3048
3049void
3050my_failure_exit(void)
3051{
3052#ifdef VMS
3053 if (vaxc$errno & 1) {
3054 if (STATUS_NATIVE & 1) /* fortuitiously includes "-1" */
3055 STATUS_NATIVE_SET(44);
3056 }
3057 else {
3058 if (!vaxc$errno && errno) /* unlikely */
3059 STATUS_NATIVE_SET(44);
3060 else
3061 STATUS_NATIVE_SET(vaxc$errno);
3062 }
3063#else
3064 int exitstatus;
3065 if (errno & 255)
3066 STATUS_POSIX_SET(errno);
3067 else {
3068 exitstatus = STATUS_POSIX >> 8;
3069 if (exitstatus & 255)
3070 STATUS_POSIX_SET(exitstatus);
3071 else
3072 STATUS_POSIX_SET(255);
3073 }
3074#endif
3075 my_exit_jump();
3076}
3077
3078STATIC void
3079my_exit_jump(void)
3080{
3081 dTHR;
3082 register PERL_CONTEXT *cx;
3083 I32 gimme;
3084 SV **newsp;
3085
3086 if (PL_e_script) {
3087 SvREFCNT_dec(PL_e_script);
3088 PL_e_script = Nullsv;
3089 }
3090
3091 POPSTACK_TO(PL_mainstack);
3092 if (cxstack_ix >= 0) {
3093 if (cxstack_ix > 0)
3094 dounwind(0);
3095 POPBLOCK(cx,PL_curpm);
3096 LEAVE;
3097 }
3098
3099 JMPENV_JUMP(2);
3100}
3101
3102#ifdef PERL_OBJECT
3103#define NO_XSLOCKS
3104#endif /* PERL_OBJECT */
3105
3106#include "XSUB.h"
3107
3108static I32
3109#ifdef PERL_OBJECT
3110read_e_script(CPerlObj *pPerl, int idx, SV *buf_sv, int maxlen)
3111#else
3112read_e_script(int idx, SV *buf_sv, int maxlen)
3113#endif
3114{
3115 char *p, *nl;
3116 p = SvPVX(PL_e_script);
3117 nl = strchr(p, '\n');
3118 nl = (nl) ? nl+1 : SvEND(PL_e_script);
3119 if (nl-p == 0) {
3120 filter_del(read_e_script);
3121 return 0;
3122 }
3123 sv_catpvn(buf_sv, p, nl-p);
3124 sv_chop(PL_e_script, nl);
3125 return 1;
3126}
3127
3128