This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
display_format used as a class method without arguments was broken,
[perl5.git] / perl.c
... / ...
CommitLineData
1/* perl.c
2 *
3 * Copyright (c) 1987-2000 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#define PERL_IN_PERL_C
16#include "perl.h"
17#include "patchlevel.h" /* for local_patches */
18
19/* XXX If this causes problems, set i_unistd=undef in the hint file. */
20#ifdef I_UNISTD
21#include <unistd.h>
22#endif
23
24#if !defined(STANDARD_C) && !defined(HAS_GETENV_PROTOTYPE)
25char *getenv (char *); /* Usually in <stdlib.h> */
26#endif
27
28static I32 read_e_script(pTHXo_ int idx, SV *buf_sv, int maxlen);
29
30#ifdef IAMSUID
31#ifndef DOSUID
32#define DOSUID
33#endif
34#endif
35
36#ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
37#ifdef DOSUID
38#undef DOSUID
39#endif
40#endif
41
42#ifdef PERL_OBJECT
43#define perl_construct Perl_construct
44#define perl_parse Perl_parse
45#define perl_run Perl_run
46#define perl_destruct Perl_destruct
47#define perl_free Perl_free
48#endif
49
50#if defined(USE_THREADS)
51# define INIT_TLS_AND_INTERP \
52 STMT_START { \
53 if (!PL_curinterp) { \
54 PERL_SET_INTERP(my_perl); \
55 INIT_THREADS; \
56 ALLOC_THREAD_KEY; \
57 } \
58 } STMT_END
59#else
60# if defined(USE_ITHREADS)
61# define INIT_TLS_AND_INTERP \
62 STMT_START { \
63 if (!PL_curinterp) { \
64 PERL_SET_INTERP(my_perl); \
65 INIT_THREADS; \
66 ALLOC_THREAD_KEY; \
67 PERL_SET_THX(my_perl); \
68 OP_REFCNT_INIT; \
69 } \
70 else { \
71 PERL_SET_THX(my_perl); \
72 } \
73 } STMT_END
74# else
75# define INIT_TLS_AND_INTERP \
76 STMT_START { \
77 if (!PL_curinterp) { \
78 PERL_SET_INTERP(my_perl); \
79 } \
80 PERL_SET_THX(my_perl); \
81 } STMT_END
82# endif
83#endif
84
85#ifdef PERL_IMPLICIT_SYS
86PerlInterpreter *
87perl_alloc_using(struct IPerlMem* ipM, struct IPerlMem* ipMS,
88 struct IPerlMem* ipMP, struct IPerlEnv* ipE,
89 struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
90 struct IPerlDir* ipD, struct IPerlSock* ipS,
91 struct IPerlProc* ipP)
92{
93 PerlInterpreter *my_perl;
94#ifdef PERL_OBJECT
95 my_perl = (PerlInterpreter*)new(ipM) CPerlObj(ipM, ipMS, ipMP, ipE, ipStd,
96 ipLIO, ipD, ipS, ipP);
97 INIT_TLS_AND_INTERP;
98#else
99 /* New() needs interpreter, so call malloc() instead */
100 my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
101 INIT_TLS_AND_INTERP;
102 Zero(my_perl, 1, PerlInterpreter);
103 PL_Mem = ipM;
104 PL_MemShared = ipMS;
105 PL_MemParse = ipMP;
106 PL_Env = ipE;
107 PL_StdIO = ipStd;
108 PL_LIO = ipLIO;
109 PL_Dir = ipD;
110 PL_Sock = ipS;
111 PL_Proc = ipP;
112#endif
113
114 return my_perl;
115}
116#else
117
118/*
119=for apidoc perl_alloc
120
121Allocates a new Perl interpreter. See L<perlembed>.
122
123=cut
124*/
125
126PerlInterpreter *
127perl_alloc(void)
128{
129 PerlInterpreter *my_perl;
130
131 /* New() needs interpreter, so call malloc() instead */
132 my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
133
134 INIT_TLS_AND_INTERP;
135 Zero(my_perl, 1, PerlInterpreter);
136 return my_perl;
137}
138#endif /* PERL_IMPLICIT_SYS */
139
140/*
141=for apidoc perl_construct
142
143Initializes a new Perl interpreter. See L<perlembed>.
144
145=cut
146*/
147
148void
149perl_construct(pTHXx)
150{
151#ifdef USE_THREADS
152 int i;
153#ifndef FAKE_THREADS
154 struct perl_thread *thr = NULL;
155#endif /* FAKE_THREADS */
156#endif /* USE_THREADS */
157
158#ifdef MULTIPLICITY
159 init_interp();
160 PL_perl_destruct_level = 1;
161#else
162 if (PL_perl_destruct_level > 0)
163 init_interp();
164#endif
165
166 /* Init the real globals (and main thread)? */
167 if (!PL_linestr) {
168#ifdef USE_THREADS
169 MUTEX_INIT(&PL_sv_mutex);
170 /*
171 * Safe to use basic SV functions from now on (though
172 * not things like mortals or tainting yet).
173 */
174 MUTEX_INIT(&PL_eval_mutex);
175 COND_INIT(&PL_eval_cond);
176 MUTEX_INIT(&PL_threads_mutex);
177 COND_INIT(&PL_nthreads_cond);
178# ifdef EMULATE_ATOMIC_REFCOUNTS
179 MUTEX_INIT(&PL_svref_mutex);
180# endif /* EMULATE_ATOMIC_REFCOUNTS */
181
182 MUTEX_INIT(&PL_cred_mutex);
183 MUTEX_INIT(&PL_sv_lock_mutex);
184 MUTEX_INIT(&PL_fdpid_mutex);
185
186 thr = init_main_thread();
187#endif /* USE_THREADS */
188
189#ifdef PERL_FLEXIBLE_EXCEPTIONS
190 PL_protect = MEMBER_TO_FPTR(Perl_default_protect); /* for exceptions */
191#endif
192
193 PL_curcop = &PL_compiling; /* needed by ckWARN, right away */
194
195 PL_linestr = NEWSV(65,79);
196 sv_upgrade(PL_linestr,SVt_PVIV);
197
198 if (!SvREADONLY(&PL_sv_undef)) {
199 /* set read-only and try to insure than we wont see REFCNT==0
200 very often */
201
202 SvREADONLY_on(&PL_sv_undef);
203 SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
204
205 sv_setpv(&PL_sv_no,PL_No);
206 SvNV(&PL_sv_no);
207 SvREADONLY_on(&PL_sv_no);
208 SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
209
210 sv_setpv(&PL_sv_yes,PL_Yes);
211 SvNV(&PL_sv_yes);
212 SvREADONLY_on(&PL_sv_yes);
213 SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
214 }
215
216#ifdef PERL_OBJECT
217 /* TODO: */
218 /* PL_sighandlerp = sighandler; */
219#else
220 PL_sighandlerp = Perl_sighandler;
221#endif
222 PL_pidstatus = newHV();
223
224#ifdef MSDOS
225 /*
226 * There is no way we can refer to them from Perl so close them to save
227 * space. The other alternative would be to provide STDAUX and STDPRN
228 * filehandles.
229 */
230 (void)fclose(stdaux);
231 (void)fclose(stdprn);
232#endif
233 }
234
235 PL_nrs = newSVpvn("\n", 1);
236 PL_rs = SvREFCNT_inc(PL_nrs);
237
238 init_stacks();
239
240 init_ids();
241 PL_lex_state = LEX_NOTPARSING;
242
243 JMPENV_BOOTSTRAP;
244 STATUS_ALL_SUCCESS;
245
246 init_i18nl10n(1);
247 SET_NUMERIC_STANDARD();
248
249 {
250 U8 *s;
251 PL_patchlevel = NEWSV(0,4);
252 (void)SvUPGRADE(PL_patchlevel, SVt_PVNV);
253 if (PERL_REVISION > 127 || PERL_VERSION > 127 || PERL_SUBVERSION > 127)
254 SvGROW(PL_patchlevel, UTF8_MAXLEN*3+1);
255 s = (U8*)SvPVX(PL_patchlevel);
256 s = uv_to_utf8(s, (UV)PERL_REVISION);
257 s = uv_to_utf8(s, (UV)PERL_VERSION);
258 s = uv_to_utf8(s, (UV)PERL_SUBVERSION);
259 *s = '\0';
260 SvCUR_set(PL_patchlevel, s - (U8*)SvPVX(PL_patchlevel));
261 SvPOK_on(PL_patchlevel);
262 SvNVX(PL_patchlevel) = (NV)PERL_REVISION
263 + ((NV)PERL_VERSION / (NV)1000)
264#if defined(PERL_SUBVERSION) && PERL_SUBVERSION > 0
265 + ((NV)PERL_SUBVERSION / (NV)1000000)
266#endif
267 ;
268 SvNOK_on(PL_patchlevel); /* dual valued */
269 SvUTF8_on(PL_patchlevel);
270 SvREADONLY_on(PL_patchlevel);
271 }
272
273#if defined(LOCAL_PATCH_COUNT)
274 PL_localpatches = local_patches; /* For possible -v */
275#endif
276
277#ifdef HAVE_INTERP_INTERN
278 sys_intern_init();
279#endif
280
281 PerlIO_init(); /* Hook to IO system */
282
283 PL_fdpid = newAV(); /* for remembering popen pids by fd */
284 PL_modglobal = newHV(); /* pointers to per-interpreter module globals */
285 PL_errors = newSVpvn("",0);
286
287 ENTER;
288}
289
290/*
291=for apidoc perl_destruct
292
293Shuts down a Perl interpreter. See L<perlembed>.
294
295=cut
296*/
297
298void
299perl_destruct(pTHXx)
300{
301 dTHR;
302 int destruct_level; /* 0=none, 1=full, 2=full with checks */
303 I32 last_sv_count;
304 HV *hv;
305#ifdef USE_THREADS
306 Thread t;
307 dTHX;
308#endif /* USE_THREADS */
309
310 /* wait for all pseudo-forked children to finish */
311 PERL_WAIT_FOR_CHILDREN;
312
313#ifdef USE_THREADS
314#ifndef FAKE_THREADS
315 /* Pass 1 on any remaining threads: detach joinables, join zombies */
316 retry_cleanup:
317 MUTEX_LOCK(&PL_threads_mutex);
318 DEBUG_S(PerlIO_printf(Perl_debug_log,
319 "perl_destruct: waiting for %d threads...\n",
320 PL_nthreads - 1));
321 for (t = thr->next; t != thr; t = t->next) {
322 MUTEX_LOCK(&t->mutex);
323 switch (ThrSTATE(t)) {
324 AV *av;
325 case THRf_ZOMBIE:
326 DEBUG_S(PerlIO_printf(Perl_debug_log,
327 "perl_destruct: joining zombie %p\n", t));
328 ThrSETSTATE(t, THRf_DEAD);
329 MUTEX_UNLOCK(&t->mutex);
330 PL_nthreads--;
331 /*
332 * The SvREFCNT_dec below may take a long time (e.g. av
333 * may contain an object scalar whose destructor gets
334 * called) so we have to unlock threads_mutex and start
335 * all over again.
336 */
337 MUTEX_UNLOCK(&PL_threads_mutex);
338 JOIN(t, &av);
339 SvREFCNT_dec((SV*)av);
340 DEBUG_S(PerlIO_printf(Perl_debug_log,
341 "perl_destruct: joined zombie %p OK\n", t));
342 goto retry_cleanup;
343 case THRf_R_JOINABLE:
344 DEBUG_S(PerlIO_printf(Perl_debug_log,
345 "perl_destruct: detaching thread %p\n", t));
346 ThrSETSTATE(t, THRf_R_DETACHED);
347 /*
348 * We unlock threads_mutex and t->mutex in the opposite order
349 * from which we locked them just so that DETACH won't
350 * deadlock if it panics. It's only a breach of good style
351 * not a bug since they are unlocks not locks.
352 */
353 MUTEX_UNLOCK(&PL_threads_mutex);
354 DETACH(t);
355 MUTEX_UNLOCK(&t->mutex);
356 goto retry_cleanup;
357 default:
358 DEBUG_S(PerlIO_printf(Perl_debug_log,
359 "perl_destruct: ignoring %p (state %u)\n",
360 t, ThrSTATE(t)));
361 MUTEX_UNLOCK(&t->mutex);
362 /* fall through and out */
363 }
364 }
365 /* We leave the above "Pass 1" loop with threads_mutex still locked */
366
367 /* Pass 2 on remaining threads: wait for the thread count to drop to one */
368 while (PL_nthreads > 1)
369 {
370 DEBUG_S(PerlIO_printf(Perl_debug_log,
371 "perl_destruct: final wait for %d threads\n",
372 PL_nthreads - 1));
373 COND_WAIT(&PL_nthreads_cond, &PL_threads_mutex);
374 }
375 /* At this point, we're the last thread */
376 MUTEX_UNLOCK(&PL_threads_mutex);
377 DEBUG_S(PerlIO_printf(Perl_debug_log, "perl_destruct: armageddon has arrived\n"));
378 MUTEX_DESTROY(&PL_threads_mutex);
379 COND_DESTROY(&PL_nthreads_cond);
380#endif /* !defined(FAKE_THREADS) */
381#endif /* USE_THREADS */
382
383 destruct_level = PL_perl_destruct_level;
384#ifdef DEBUGGING
385 {
386 char *s;
387 if ((s = PerlEnv_getenv("PERL_DESTRUCT_LEVEL"))) {
388 int i = atoi(s);
389 if (destruct_level < i)
390 destruct_level = i;
391 }
392 }
393#endif
394
395 LEAVE;
396 FREETMPS;
397
398 /* We must account for everything. */
399
400 /* Destroy the main CV and syntax tree */
401 if (PL_main_root) {
402 PL_curpad = AvARRAY(PL_comppad);
403 op_free(PL_main_root);
404 PL_main_root = Nullop;
405 }
406 PL_curcop = &PL_compiling;
407 PL_main_start = Nullop;
408 SvREFCNT_dec(PL_main_cv);
409 PL_main_cv = Nullcv;
410 PL_dirty = TRUE;
411
412 if (PL_sv_objcount) {
413 /*
414 * Try to destruct global references. We do this first so that the
415 * destructors and destructees still exist. Some sv's might remain.
416 * Non-referenced objects are on their own.
417 */
418 sv_clean_objs();
419 }
420
421 /* unhook hooks which will soon be, or use, destroyed data */
422 SvREFCNT_dec(PL_warnhook);
423 PL_warnhook = Nullsv;
424 SvREFCNT_dec(PL_diehook);
425 PL_diehook = Nullsv;
426
427 /* call exit list functions */
428 while (PL_exitlistlen-- > 0)
429 PL_exitlist[PL_exitlistlen].fn(aTHXo_ PL_exitlist[PL_exitlistlen].ptr);
430
431 Safefree(PL_exitlist);
432
433 if (destruct_level == 0){
434
435 DEBUG_P(debprofdump());
436
437 /* The exit() function will do everything that needs doing. */
438 return;
439 }
440
441 /* loosen bonds of global variables */
442
443 if(PL_rsfp) {
444 (void)PerlIO_close(PL_rsfp);
445 PL_rsfp = Nullfp;
446 }
447
448 /* Filters for program text */
449 SvREFCNT_dec(PL_rsfp_filters);
450 PL_rsfp_filters = Nullav;
451
452 /* switches */
453 PL_preprocess = FALSE;
454 PL_minus_n = FALSE;
455 PL_minus_p = FALSE;
456 PL_minus_l = FALSE;
457 PL_minus_a = FALSE;
458 PL_minus_F = FALSE;
459 PL_doswitches = FALSE;
460 PL_dowarn = G_WARN_OFF;
461 PL_doextract = FALSE;
462 PL_sawampersand = FALSE; /* must save all match strings */
463 PL_unsafe = FALSE;
464
465 Safefree(PL_inplace);
466 PL_inplace = Nullch;
467 SvREFCNT_dec(PL_patchlevel);
468
469 if (PL_e_script) {
470 SvREFCNT_dec(PL_e_script);
471 PL_e_script = Nullsv;
472 }
473
474 /* magical thingies */
475
476 Safefree(PL_ofs); /* $, */
477 PL_ofs = Nullch;
478
479 Safefree(PL_ors); /* $\ */
480 PL_ors = Nullch;
481
482 SvREFCNT_dec(PL_rs); /* $/ */
483 PL_rs = Nullsv;
484
485 SvREFCNT_dec(PL_nrs); /* $/ helper */
486 PL_nrs = Nullsv;
487
488 PL_multiline = 0; /* $* */
489 Safefree(PL_osname); /* $^O */
490 PL_osname = Nullch;
491
492 SvREFCNT_dec(PL_statname);
493 PL_statname = Nullsv;
494 PL_statgv = Nullgv;
495
496 /* defgv, aka *_ should be taken care of elsewhere */
497
498 /* clean up after study() */
499 SvREFCNT_dec(PL_lastscream);
500 PL_lastscream = Nullsv;
501 Safefree(PL_screamfirst);
502 PL_screamfirst = 0;
503 Safefree(PL_screamnext);
504 PL_screamnext = 0;
505
506 /* float buffer */
507 Safefree(PL_efloatbuf);
508 PL_efloatbuf = Nullch;
509 PL_efloatsize = 0;
510
511 /* startup and shutdown function lists */
512 SvREFCNT_dec(PL_beginav);
513 SvREFCNT_dec(PL_endav);
514 SvREFCNT_dec(PL_checkav);
515 SvREFCNT_dec(PL_initav);
516 PL_beginav = Nullav;
517 PL_endav = Nullav;
518 PL_checkav = Nullav;
519 PL_initav = Nullav;
520
521 /* shortcuts just get cleared */
522 PL_envgv = Nullgv;
523 PL_incgv = Nullgv;
524 PL_hintgv = Nullgv;
525 PL_errgv = Nullgv;
526 PL_argvgv = Nullgv;
527 PL_argvoutgv = Nullgv;
528 PL_stdingv = Nullgv;
529 PL_stderrgv = Nullgv;
530 PL_last_in_gv = Nullgv;
531 PL_replgv = Nullgv;
532 PL_debstash = Nullhv;
533
534 /* reset so print() ends up where we expect */
535 setdefout(Nullgv);
536
537 SvREFCNT_dec(PL_argvout_stack);
538 PL_argvout_stack = Nullav;
539
540 SvREFCNT_dec(PL_modglobal);
541 PL_modglobal = Nullhv;
542 SvREFCNT_dec(PL_preambleav);
543 PL_preambleav = Nullav;
544 SvREFCNT_dec(PL_subname);
545 PL_subname = Nullsv;
546 SvREFCNT_dec(PL_linestr);
547 PL_linestr = Nullsv;
548 SvREFCNT_dec(PL_pidstatus);
549 PL_pidstatus = Nullhv;
550 SvREFCNT_dec(PL_toptarget);
551 PL_toptarget = Nullsv;
552 SvREFCNT_dec(PL_bodytarget);
553 PL_bodytarget = Nullsv;
554 PL_formtarget = Nullsv;
555
556 /* free locale stuff */
557#ifdef USE_LOCALE_COLLATE
558 Safefree(PL_collation_name);
559 PL_collation_name = Nullch;
560#endif
561
562#ifdef USE_LOCALE_NUMERIC
563 Safefree(PL_numeric_name);
564 PL_numeric_name = Nullch;
565#endif
566
567 /* clear utf8 character classes */
568 SvREFCNT_dec(PL_utf8_alnum);
569 SvREFCNT_dec(PL_utf8_alnumc);
570 SvREFCNT_dec(PL_utf8_ascii);
571 SvREFCNT_dec(PL_utf8_alpha);
572 SvREFCNT_dec(PL_utf8_space);
573 SvREFCNT_dec(PL_utf8_cntrl);
574 SvREFCNT_dec(PL_utf8_graph);
575 SvREFCNT_dec(PL_utf8_digit);
576 SvREFCNT_dec(PL_utf8_upper);
577 SvREFCNT_dec(PL_utf8_lower);
578 SvREFCNT_dec(PL_utf8_print);
579 SvREFCNT_dec(PL_utf8_punct);
580 SvREFCNT_dec(PL_utf8_xdigit);
581 SvREFCNT_dec(PL_utf8_mark);
582 SvREFCNT_dec(PL_utf8_toupper);
583 SvREFCNT_dec(PL_utf8_tolower);
584 PL_utf8_alnum = Nullsv;
585 PL_utf8_alnumc = Nullsv;
586 PL_utf8_ascii = Nullsv;
587 PL_utf8_alpha = Nullsv;
588 PL_utf8_space = Nullsv;
589 PL_utf8_cntrl = Nullsv;
590 PL_utf8_graph = Nullsv;
591 PL_utf8_digit = Nullsv;
592 PL_utf8_upper = Nullsv;
593 PL_utf8_lower = Nullsv;
594 PL_utf8_print = Nullsv;
595 PL_utf8_punct = Nullsv;
596 PL_utf8_xdigit = Nullsv;
597 PL_utf8_mark = Nullsv;
598 PL_utf8_toupper = Nullsv;
599 PL_utf8_totitle = Nullsv;
600 PL_utf8_tolower = Nullsv;
601
602 if (!specialWARN(PL_compiling.cop_warnings))
603 SvREFCNT_dec(PL_compiling.cop_warnings);
604 PL_compiling.cop_warnings = Nullsv;
605#ifdef USE_ITHREADS
606 Safefree(CopFILE(&PL_compiling));
607 CopFILE(&PL_compiling) = Nullch;
608 Safefree(CopSTASHPV(&PL_compiling));
609#else
610 SvREFCNT_dec(CopFILEGV(&PL_compiling));
611 CopFILEGV(&PL_compiling) = Nullgv;
612 /* cop_stash is not refcounted */
613#endif
614
615 /* Prepare to destruct main symbol table. */
616
617 hv = PL_defstash;
618 PL_defstash = 0;
619 SvREFCNT_dec(hv);
620 SvREFCNT_dec(PL_curstname);
621 PL_curstname = Nullsv;
622
623 /* clear queued errors */
624 SvREFCNT_dec(PL_errors);
625 PL_errors = Nullsv;
626
627 FREETMPS;
628 if (destruct_level >= 2 && ckWARN_d(WARN_INTERNAL)) {
629 if (PL_scopestack_ix != 0)
630 Perl_warner(aTHX_ WARN_INTERNAL,
631 "Unbalanced scopes: %ld more ENTERs than LEAVEs\n",
632 (long)PL_scopestack_ix);
633 if (PL_savestack_ix != 0)
634 Perl_warner(aTHX_ WARN_INTERNAL,
635 "Unbalanced saves: %ld more saves than restores\n",
636 (long)PL_savestack_ix);
637 if (PL_tmps_floor != -1)
638 Perl_warner(aTHX_ WARN_INTERNAL,"Unbalanced tmps: %ld more allocs than frees\n",
639 (long)PL_tmps_floor + 1);
640 if (cxstack_ix != -1)
641 Perl_warner(aTHX_ WARN_INTERNAL,"Unbalanced context: %ld more PUSHes than POPs\n",
642 (long)cxstack_ix + 1);
643 }
644
645 /* Now absolutely destruct everything, somehow or other, loops or no. */
646 last_sv_count = 0;
647 SvFLAGS(PL_fdpid) |= SVTYPEMASK; /* don't clean out pid table now */
648 SvFLAGS(PL_strtab) |= SVTYPEMASK; /* don't clean out strtab now */
649 while (PL_sv_count != 0 && PL_sv_count != last_sv_count) {
650 last_sv_count = PL_sv_count;
651 sv_clean_all();
652 }
653 SvFLAGS(PL_fdpid) &= ~SVTYPEMASK;
654 SvFLAGS(PL_fdpid) |= SVt_PVAV;
655 SvFLAGS(PL_strtab) &= ~SVTYPEMASK;
656 SvFLAGS(PL_strtab) |= SVt_PVHV;
657
658 AvREAL_off(PL_fdpid); /* no surviving entries */
659 SvREFCNT_dec(PL_fdpid); /* needed in io_close() */
660 PL_fdpid = Nullav;
661
662#ifdef HAVE_INTERP_INTERN
663 sys_intern_clear();
664#endif
665
666 /* Destruct the global string table. */
667 {
668 /* Yell and reset the HeVAL() slots that are still holding refcounts,
669 * so that sv_free() won't fail on them.
670 */
671 I32 riter;
672 I32 max;
673 HE *hent;
674 HE **array;
675
676 riter = 0;
677 max = HvMAX(PL_strtab);
678 array = HvARRAY(PL_strtab);
679 hent = array[0];
680 for (;;) {
681 if (hent && ckWARN_d(WARN_INTERNAL)) {
682 Perl_warner(aTHX_ WARN_INTERNAL,
683 "Unbalanced string table refcount: (%d) for \"%s\"",
684 HeVAL(hent) - Nullsv, HeKEY(hent));
685 HeVAL(hent) = Nullsv;
686 hent = HeNEXT(hent);
687 }
688 if (!hent) {
689 if (++riter > max)
690 break;
691 hent = array[riter];
692 }
693 }
694 }
695 SvREFCNT_dec(PL_strtab);
696
697 /* free special SVs */
698
699 SvREFCNT(&PL_sv_yes) = 0;
700 sv_clear(&PL_sv_yes);
701 SvANY(&PL_sv_yes) = NULL;
702 SvFLAGS(&PL_sv_yes) = 0;
703
704 SvREFCNT(&PL_sv_no) = 0;
705 sv_clear(&PL_sv_no);
706 SvANY(&PL_sv_no) = NULL;
707 SvFLAGS(&PL_sv_no) = 0;
708
709 SvREFCNT(&PL_sv_undef) = 0;
710 SvREADONLY_off(&PL_sv_undef);
711
712 if (PL_sv_count != 0 && ckWARN_d(WARN_INTERNAL))
713 Perl_warner(aTHX_ WARN_INTERNAL,"Scalars leaked: %ld\n", (long)PL_sv_count);
714
715 Safefree(PL_origfilename);
716 Safefree(PL_reg_start_tmp);
717 if (PL_reg_curpm)
718 Safefree(PL_reg_curpm);
719 Safefree(PL_reg_poscache);
720 Safefree(HeKEY_hek(&PL_hv_fetch_ent_mh));
721 Safefree(PL_op_mask);
722 Safefree(PL_psig_ptr);
723 Safefree(PL_psig_name);
724 nuke_stacks();
725 PL_hints = 0; /* Reset hints. Should hints be per-interpreter ? */
726
727 DEBUG_P(debprofdump());
728#ifdef USE_THREADS
729 MUTEX_DESTROY(&PL_strtab_mutex);
730 MUTEX_DESTROY(&PL_sv_mutex);
731 MUTEX_DESTROY(&PL_eval_mutex);
732 MUTEX_DESTROY(&PL_cred_mutex);
733 MUTEX_DESTROY(&PL_fdpid_mutex);
734 COND_DESTROY(&PL_eval_cond);
735#ifdef EMULATE_ATOMIC_REFCOUNTS
736 MUTEX_DESTROY(&PL_svref_mutex);
737#endif /* EMULATE_ATOMIC_REFCOUNTS */
738
739 /* As the penultimate thing, free the non-arena SV for thrsv */
740 Safefree(SvPVX(PL_thrsv));
741 Safefree(SvANY(PL_thrsv));
742 Safefree(PL_thrsv);
743 PL_thrsv = Nullsv;
744#endif /* USE_THREADS */
745
746 sv_free_arenas();
747
748 /* As the absolutely last thing, free the non-arena SV for mess() */
749
750 if (PL_mess_sv) {
751 /* it could have accumulated taint magic */
752 if (SvTYPE(PL_mess_sv) >= SVt_PVMG) {
753 MAGIC* mg;
754 MAGIC* moremagic;
755 for (mg = SvMAGIC(PL_mess_sv); mg; mg = moremagic) {
756 moremagic = mg->mg_moremagic;
757 if (mg->mg_ptr && mg->mg_type != 'g' && mg->mg_len >= 0)
758 Safefree(mg->mg_ptr);
759 Safefree(mg);
760 }
761 }
762 /* we know that type >= SVt_PV */
763 (void)SvOOK_off(PL_mess_sv);
764 Safefree(SvPVX(PL_mess_sv));
765 Safefree(SvANY(PL_mess_sv));
766 Safefree(PL_mess_sv);
767 PL_mess_sv = Nullsv;
768 }
769}
770
771/*
772=for apidoc perl_free
773
774Releases a Perl interpreter. See L<perlembed>.
775
776=cut
777*/
778
779void
780perl_free(pTHXx)
781{
782#if defined(PERL_OBJECT)
783 PerlMem_free(this);
784#else
785# if defined(PERL_IMPLICIT_SYS) && defined(WIN32)
786 void *host = w32_internal_host;
787 PerlMem_free(aTHXx);
788 win32_delete_internal_host(host);
789# else
790 PerlMem_free(aTHXx);
791# endif
792#endif
793}
794
795void
796Perl_call_atexit(pTHX_ ATEXIT_t fn, void *ptr)
797{
798 Renew(PL_exitlist, PL_exitlistlen+1, PerlExitListEntry);
799 PL_exitlist[PL_exitlistlen].fn = fn;
800 PL_exitlist[PL_exitlistlen].ptr = ptr;
801 ++PL_exitlistlen;
802}
803
804/*
805=for apidoc perl_parse
806
807Tells a Perl interpreter to parse a Perl script. See L<perlembed>.
808
809=cut
810*/
811
812int
813perl_parse(pTHXx_ XSINIT_t xsinit, int argc, char **argv, char **env)
814{
815 dTHR;
816 I32 oldscope;
817 int ret;
818 dJMPENV;
819#ifdef USE_THREADS
820 dTHX;
821#endif
822
823#ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
824#ifdef IAMSUID
825#undef IAMSUID
826 Perl_croak(aTHX_ "suidperl is no longer needed since the kernel can now execute\n\
827setuid perl scripts securely.\n");
828#endif
829#endif
830
831#if defined(__DYNAMIC__) && (defined(NeXT) || defined(__NeXT__))
832 _dyld_lookup_and_bind
833 ("__environ", (unsigned long *) &environ_pointer, NULL);
834#endif /* environ */
835
836 PL_origargv = argv;
837 PL_origargc = argc;
838#ifndef VMS /* VMS doesn't have environ array */
839 PL_origenviron = environ;
840#endif
841
842 if (PL_do_undump) {
843
844 /* Come here if running an undumped a.out. */
845
846 PL_origfilename = savepv(argv[0]);
847 PL_do_undump = FALSE;
848 cxstack_ix = -1; /* start label stack again */
849 init_ids();
850 init_postdump_symbols(argc,argv,env);
851 return 0;
852 }
853
854 if (PL_main_root) {
855 PL_curpad = AvARRAY(PL_comppad);
856 op_free(PL_main_root);
857 PL_main_root = Nullop;
858 }
859 PL_main_start = Nullop;
860 SvREFCNT_dec(PL_main_cv);
861 PL_main_cv = Nullcv;
862
863 time(&PL_basetime);
864 oldscope = PL_scopestack_ix;
865 PL_dowarn = G_WARN_OFF;
866
867#ifdef PERL_FLEXIBLE_EXCEPTIONS
868 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vparse_body), env, xsinit);
869#else
870 JMPENV_PUSH(ret);
871#endif
872 switch (ret) {
873 case 0:
874#ifndef PERL_FLEXIBLE_EXCEPTIONS
875 parse_body(env,xsinit);
876#endif
877 if (PL_checkav)
878 call_list(oldscope, PL_checkav);
879 ret = 0;
880 break;
881 case 1:
882 STATUS_ALL_FAILURE;
883 /* FALL THROUGH */
884 case 2:
885 /* my_exit() was called */
886 while (PL_scopestack_ix > oldscope)
887 LEAVE;
888 FREETMPS;
889 PL_curstash = PL_defstash;
890 if (PL_checkav)
891 call_list(oldscope, PL_checkav);
892 ret = STATUS_NATIVE_EXPORT;
893 break;
894 case 3:
895 PerlIO_printf(Perl_error_log, "panic: top_env\n");
896 ret = 1;
897 break;
898 }
899 JMPENV_POP;
900 return ret;
901}
902
903#ifdef PERL_FLEXIBLE_EXCEPTIONS
904STATIC void *
905S_vparse_body(pTHX_ va_list args)
906{
907 char **env = va_arg(args, char**);
908 XSINIT_t xsinit = va_arg(args, XSINIT_t);
909
910 return parse_body(env, xsinit);
911}
912#endif
913
914STATIC void *
915S_parse_body(pTHX_ char **env, XSINIT_t xsinit)
916{
917 dTHR;
918 int argc = PL_origargc;
919 char **argv = PL_origargv;
920 char *scriptname = NULL;
921 int fdscript = -1;
922 VOL bool dosearch = FALSE;
923 char *validarg = "";
924 AV* comppadlist;
925 register SV *sv;
926 register char *s;
927 char *cddir = Nullch;
928
929 sv_setpvn(PL_linestr,"",0);
930 sv = newSVpvn("",0); /* first used for -I flags */
931 SAVEFREESV(sv);
932 init_main_stash();
933
934 for (argc--,argv++; argc > 0; argc--,argv++) {
935 if (argv[0][0] != '-' || !argv[0][1])
936 break;
937#ifdef DOSUID
938 if (*validarg)
939 validarg = " PHOOEY ";
940 else
941 validarg = argv[0];
942#endif
943 s = argv[0]+1;
944 reswitch:
945 switch (*s) {
946 case 'C':
947#ifdef WIN32
948 win32_argv2utf8(argc-1, argv+1);
949 /* FALL THROUGH */
950#endif
951#ifndef PERL_STRICT_CR
952 case '\r':
953#endif
954 case ' ':
955 case '0':
956 case 'F':
957 case 'a':
958 case 'c':
959 case 'd':
960 case 'D':
961 case 'h':
962 case 'i':
963 case 'l':
964 case 'M':
965 case 'm':
966 case 'n':
967 case 'p':
968 case 's':
969 case 'u':
970 case 'U':
971 case 'v':
972 case 'W':
973 case 'X':
974 case 'w':
975 if ((s = moreswitches(s)))
976 goto reswitch;
977 break;
978
979 case 'T':
980 PL_tainting = TRUE;
981 s++;
982 goto reswitch;
983
984 case 'e':
985#ifdef MACOS_TRADITIONAL
986 /* ignore -e for Dev:Pseudo argument */
987 if (argv[1] && !strcmp(argv[1], "Dev:Pseudo"))
988 break;
989#endif
990 if (PL_euid != PL_uid || PL_egid != PL_gid)
991 Perl_croak(aTHX_ "No -e allowed in setuid scripts");
992 if (!PL_e_script) {
993 PL_e_script = newSVpvn("",0);
994 filter_add(read_e_script, NULL);
995 }
996 if (*++s)
997 sv_catpv(PL_e_script, s);
998 else if (argv[1]) {
999 sv_catpv(PL_e_script, argv[1]);
1000 argc--,argv++;
1001 }
1002 else
1003 Perl_croak(aTHX_ "No code specified for -e");
1004 sv_catpv(PL_e_script, "\n");
1005 break;
1006
1007 case 'I': /* -I handled both here and in moreswitches() */
1008 forbid_setid("-I");
1009 if (!*++s && (s=argv[1]) != Nullch) {
1010 argc--,argv++;
1011 }
1012 if (s && *s) {
1013 char *p;
1014 STRLEN len = strlen(s);
1015 p = savepvn(s, len);
1016 incpush(p, TRUE, TRUE);
1017 sv_catpvn(sv, "-I", 2);
1018 sv_catpvn(sv, p, len);
1019 sv_catpvn(sv, " ", 1);
1020 Safefree(p);
1021 }
1022 else
1023 Perl_croak(aTHX_ "No directory specified for -I");
1024 break;
1025 case 'P':
1026 forbid_setid("-P");
1027 PL_preprocess = TRUE;
1028 s++;
1029 goto reswitch;
1030 case 'S':
1031 forbid_setid("-S");
1032 dosearch = TRUE;
1033 s++;
1034 goto reswitch;
1035 case 'V':
1036 if (!PL_preambleav)
1037 PL_preambleav = newAV();
1038 av_push(PL_preambleav, newSVpv("use Config qw(myconfig config_vars)",0));
1039 if (*++s != ':') {
1040 PL_Sv = newSVpv("print myconfig();",0);
1041#ifdef VMS
1042 sv_catpv(PL_Sv,"print \"\\nCharacteristics of this PERLSHR image: \\n\",");
1043#else
1044 sv_catpv(PL_Sv,"print \"\\nCharacteristics of this binary (from libperl): \\n\",");
1045#endif
1046 sv_catpv(PL_Sv,"\" Compile-time options:");
1047# ifdef DEBUGGING
1048 sv_catpv(PL_Sv," DEBUGGING");
1049# endif
1050# ifdef MULTIPLICITY
1051 sv_catpv(PL_Sv," MULTIPLICITY");
1052# endif
1053# ifdef USE_THREADS
1054 sv_catpv(PL_Sv," USE_THREADS");
1055# endif
1056# ifdef USE_ITHREADS
1057 sv_catpv(PL_Sv," USE_ITHREADS");
1058# endif
1059# ifdef USE_64_BIT_INT
1060 sv_catpv(PL_Sv," USE_64_BIT_INT");
1061# endif
1062# ifdef USE_64_BIT_ALL
1063 sv_catpv(PL_Sv," USE_64_BIT_ALL");
1064# endif
1065# ifdef USE_LONG_DOUBLE
1066 sv_catpv(PL_Sv," USE_LONG_DOUBLE");
1067# endif
1068# ifdef USE_LARGE_FILES
1069 sv_catpv(PL_Sv," USE_LARGE_FILES");
1070# endif
1071# ifdef USE_SOCKS
1072 sv_catpv(PL_Sv," USE_SOCKS");
1073# endif
1074# ifdef PERL_OBJECT
1075 sv_catpv(PL_Sv," PERL_OBJECT");
1076# endif
1077# ifdef PERL_IMPLICIT_CONTEXT
1078 sv_catpv(PL_Sv," PERL_IMPLICIT_CONTEXT");
1079# endif
1080# ifdef PERL_IMPLICIT_SYS
1081 sv_catpv(PL_Sv," PERL_IMPLICIT_SYS");
1082# endif
1083 sv_catpv(PL_Sv,"\\n\",");
1084
1085#if defined(LOCAL_PATCH_COUNT)
1086 if (LOCAL_PATCH_COUNT > 0) {
1087 int i;
1088 sv_catpv(PL_Sv,"\" Locally applied patches:\\n\",");
1089 for (i = 1; i <= LOCAL_PATCH_COUNT; i++) {
1090 if (PL_localpatches[i])
1091 Perl_sv_catpvf(aTHX_ PL_Sv,"q\" \t%s\n\",",PL_localpatches[i]);
1092 }
1093 }
1094#endif
1095 Perl_sv_catpvf(aTHX_ PL_Sv,"\" Built under %s\\n\"",OSNAME);
1096#ifdef __DATE__
1097# ifdef __TIME__
1098 Perl_sv_catpvf(aTHX_ PL_Sv,",\" Compiled at %s %s\\n\"",__DATE__,__TIME__);
1099# else
1100 Perl_sv_catpvf(aTHX_ PL_Sv,",\" Compiled on %s\\n\"",__DATE__);
1101# endif
1102#endif
1103 sv_catpv(PL_Sv, "; \
1104$\"=\"\\n \"; \
1105@env = map { \"$_=\\\"$ENV{$_}\\\"\" } sort grep {/^PERL/} keys %ENV; \
1106print \" \\%ENV:\\n @env\\n\" if @env; \
1107print \" \\@INC:\\n @INC\\n\";");
1108 }
1109 else {
1110 PL_Sv = newSVpv("config_vars(qw(",0);
1111 sv_catpv(PL_Sv, ++s);
1112 sv_catpv(PL_Sv, "))");
1113 s += strlen(s);
1114 }
1115 av_push(PL_preambleav, PL_Sv);
1116 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
1117 goto reswitch;
1118 case 'x':
1119 PL_doextract = TRUE;
1120 s++;
1121 if (*s)
1122 cddir = s;
1123 break;
1124 case 0:
1125 break;
1126 case '-':
1127 if (!*++s || isSPACE(*s)) {
1128 argc--,argv++;
1129 goto switch_end;
1130 }
1131 /* catch use of gnu style long options */
1132 if (strEQ(s, "version")) {
1133 s = "v";
1134 goto reswitch;
1135 }
1136 if (strEQ(s, "help")) {
1137 s = "h";
1138 goto reswitch;
1139 }
1140 s--;
1141 /* FALL THROUGH */
1142 default:
1143 Perl_croak(aTHX_ "Unrecognized switch: -%s (-h will show valid options)",s);
1144 }
1145 }
1146 switch_end:
1147
1148 if (
1149#ifndef SECURE_INTERNAL_GETENV
1150 !PL_tainting &&
1151#endif
1152 (s = PerlEnv_getenv("PERL5OPT")))
1153 {
1154 while (isSPACE(*s))
1155 s++;
1156 if (*s == '-' && *(s+1) == 'T')
1157 PL_tainting = TRUE;
1158 else {
1159 while (s && *s) {
1160 while (isSPACE(*s))
1161 s++;
1162 if (*s == '-') {
1163 s++;
1164 if (isSPACE(*s))
1165 continue;
1166 }
1167 if (!*s)
1168 break;
1169 if (!strchr("DIMUdmw", *s))
1170 Perl_croak(aTHX_ "Illegal switch in PERL5OPT: -%c", *s);
1171 s = moreswitches(s);
1172 }
1173 }
1174 }
1175
1176 if (!scriptname)
1177 scriptname = argv[0];
1178 if (PL_e_script) {
1179 argc++,argv--;
1180 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
1181 }
1182 else if (scriptname == Nullch) {
1183#ifdef MSDOS
1184 if ( PerlLIO_isatty(PerlIO_fileno(PerlIO_stdin())) )
1185 moreswitches("h");
1186#endif
1187 scriptname = "-";
1188 }
1189
1190 init_perllib();
1191
1192 open_script(scriptname,dosearch,sv,&fdscript);
1193
1194 validate_suid(validarg, scriptname,fdscript);
1195
1196#ifndef PERL_MICRO
1197#if defined(SIGCHLD) || defined(SIGCLD)
1198 {
1199#ifndef SIGCHLD
1200# define SIGCHLD SIGCLD
1201#endif
1202 Sighandler_t sigstate = rsignal_state(SIGCHLD);
1203 if (sigstate == SIG_IGN) {
1204 if (ckWARN(WARN_SIGNAL))
1205 Perl_warner(aTHX_ WARN_SIGNAL,
1206 "Can't ignore signal CHLD, forcing to default");
1207 (void)rsignal(SIGCHLD, (Sighandler_t)SIG_DFL);
1208 }
1209 }
1210#endif
1211#endif
1212
1213#ifdef MACOS_TRADITIONAL
1214 if (PL_doextract || gMacPerl_AlwaysExtract) {
1215#else
1216 if (PL_doextract) {
1217#endif
1218 find_beginning();
1219 if (cddir && PerlDir_chdir(cddir) < 0)
1220 Perl_croak(aTHX_ "Can't chdir to %s",cddir);
1221
1222 }
1223
1224 PL_main_cv = PL_compcv = (CV*)NEWSV(1104,0);
1225 sv_upgrade((SV *)PL_compcv, SVt_PVCV);
1226 CvUNIQUE_on(PL_compcv);
1227
1228 PL_comppad = newAV();
1229 av_push(PL_comppad, Nullsv);
1230 PL_curpad = AvARRAY(PL_comppad);
1231 PL_comppad_name = newAV();
1232 PL_comppad_name_fill = 0;
1233 PL_min_intro_pending = 0;
1234 PL_padix = 0;
1235#ifdef USE_THREADS
1236 av_store(PL_comppad_name, 0, newSVpvn("@_", 2));
1237 PL_curpad[0] = (SV*)newAV();
1238 SvPADMY_on(PL_curpad[0]); /* XXX Needed? */
1239 CvOWNER(PL_compcv) = 0;
1240 New(666, CvMUTEXP(PL_compcv), 1, perl_mutex);
1241 MUTEX_INIT(CvMUTEXP(PL_compcv));
1242#endif /* USE_THREADS */
1243
1244 comppadlist = newAV();
1245 AvREAL_off(comppadlist);
1246 av_store(comppadlist, 0, (SV*)PL_comppad_name);
1247 av_store(comppadlist, 1, (SV*)PL_comppad);
1248 CvPADLIST(PL_compcv) = comppadlist;
1249
1250 boot_core_UNIVERSAL();
1251#ifndef PERL_MICRO
1252 boot_core_xsutils();
1253#endif
1254
1255 if (xsinit)
1256 (*xsinit)(aTHXo); /* in case linked C routines want magical variables */
1257#ifndef PERL_MICRO
1258#if defined(VMS) || defined(WIN32) || defined(DJGPP) || defined(__CYGWIN__)
1259 init_os_extras();
1260#endif
1261#endif
1262
1263#ifdef USE_SOCKS
1264# ifdef HAS_SOCKS5_INIT
1265 socks5_init(argv[0]);
1266# else
1267 SOCKSinit(argv[0]);
1268# endif
1269#endif
1270
1271 init_predump_symbols();
1272 /* init_postdump_symbols not currently designed to be called */
1273 /* more than once (ENV isn't cleared first, for example) */
1274 /* But running with -u leaves %ENV & @ARGV undefined! XXX */
1275 if (!PL_do_undump)
1276 init_postdump_symbols(argc,argv,env);
1277
1278 init_lexer();
1279
1280 /* now parse the script */
1281
1282 SETERRNO(0,SS$_NORMAL);
1283 PL_error_count = 0;
1284#ifdef MACOS_TRADITIONAL
1285 if (gMacPerl_SyntaxError = (yyparse() || PL_error_count)) {
1286 if (PL_minus_c)
1287 Perl_croak(aTHX_ "%s had compilation errors.\n", MacPerl_MPWFileName(PL_origfilename));
1288 else {
1289 Perl_croak(aTHX_ "Execution of %s aborted due to compilation errors.\n",
1290 MacPerl_MPWFileName(PL_origfilename));
1291 }
1292 }
1293#else
1294 if (yyparse() || PL_error_count) {
1295 if (PL_minus_c)
1296 Perl_croak(aTHX_ "%s had compilation errors.\n", PL_origfilename);
1297 else {
1298 Perl_croak(aTHX_ "Execution of %s aborted due to compilation errors.\n",
1299 PL_origfilename);
1300 }
1301 }
1302#endif
1303 CopLINE_set(PL_curcop, 0);
1304 PL_curstash = PL_defstash;
1305 PL_preprocess = FALSE;
1306 if (PL_e_script) {
1307 SvREFCNT_dec(PL_e_script);
1308 PL_e_script = Nullsv;
1309 }
1310
1311 /* now that script is parsed, we can modify record separator */
1312 SvREFCNT_dec(PL_rs);
1313 PL_rs = SvREFCNT_inc(PL_nrs);
1314 sv_setsv(get_sv("/", TRUE), PL_rs);
1315 if (PL_do_undump)
1316 my_unexec();
1317
1318 if (isWARN_ONCE) {
1319 SAVECOPFILE(PL_curcop);
1320 SAVECOPLINE(PL_curcop);
1321 gv_check(PL_defstash);
1322 }
1323
1324 LEAVE;
1325 FREETMPS;
1326
1327#ifdef MYMALLOC
1328 if ((s=PerlEnv_getenv("PERL_DEBUG_MSTATS")) && atoi(s) >= 2)
1329 dump_mstats("after compilation:");
1330#endif
1331
1332 ENTER;
1333 PL_restartop = 0;
1334 return NULL;
1335}
1336
1337/*
1338=for apidoc perl_run
1339
1340Tells a Perl interpreter to run. See L<perlembed>.
1341
1342=cut
1343*/
1344
1345int
1346perl_run(pTHXx)
1347{
1348 dTHR;
1349 I32 oldscope;
1350 int ret = 0;
1351 dJMPENV;
1352#ifdef USE_THREADS
1353 dTHX;
1354#endif
1355
1356 oldscope = PL_scopestack_ix;
1357
1358#ifdef PERL_FLEXIBLE_EXCEPTIONS
1359 redo_body:
1360 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vrun_body), oldscope);
1361#else
1362 JMPENV_PUSH(ret);
1363#endif
1364 switch (ret) {
1365 case 1:
1366 cxstack_ix = -1; /* start context stack again */
1367 goto redo_body;
1368 case 0: /* normal completion */
1369#ifndef PERL_FLEXIBLE_EXCEPTIONS
1370 redo_body:
1371 run_body(oldscope);
1372#endif
1373 /* FALL THROUGH */
1374 case 2: /* my_exit() */
1375 while (PL_scopestack_ix > oldscope)
1376 LEAVE;
1377 FREETMPS;
1378 PL_curstash = PL_defstash;
1379 if (PL_endav && !PL_minus_c)
1380 call_list(oldscope, PL_endav);
1381#ifdef MYMALLOC
1382 if (PerlEnv_getenv("PERL_DEBUG_MSTATS"))
1383 dump_mstats("after execution: ");
1384#endif
1385 ret = STATUS_NATIVE_EXPORT;
1386 break;
1387 case 3:
1388 if (PL_restartop) {
1389 POPSTACK_TO(PL_mainstack);
1390 goto redo_body;
1391 }
1392 PerlIO_printf(Perl_error_log, "panic: restartop\n");
1393 FREETMPS;
1394 ret = 1;
1395 break;
1396 }
1397
1398 JMPENV_POP;
1399 return ret;
1400}
1401
1402#ifdef PERL_FLEXIBLE_EXCEPTIONS
1403STATIC void *
1404S_vrun_body(pTHX_ va_list args)
1405{
1406 I32 oldscope = va_arg(args, I32);
1407
1408 return run_body(oldscope);
1409}
1410#endif
1411
1412
1413STATIC void *
1414S_run_body(pTHX_ I32 oldscope)
1415{
1416 dTHR;
1417
1418 DEBUG_r(PerlIO_printf(Perl_debug_log, "%s $` $& $' support.\n",
1419 PL_sawampersand ? "Enabling" : "Omitting"));
1420
1421 if (!PL_restartop) {
1422 DEBUG_x(dump_all());
1423 DEBUG(PerlIO_printf(Perl_debug_log, "\nEXECUTING...\n\n"));
1424 DEBUG_S(PerlIO_printf(Perl_debug_log, "main thread is 0x%"UVxf"\n",
1425 PTR2UV(thr)));
1426
1427 if (PL_minus_c) {
1428#ifdef MACOS_TRADITIONAL
1429 PerlIO_printf(Perl_error_log, "%s syntax OK\n", MacPerl_MPWFileName(PL_origfilename));
1430#else
1431 PerlIO_printf(Perl_error_log, "%s syntax OK\n", PL_origfilename);
1432#endif
1433 my_exit(0);
1434 }
1435 if (PERLDB_SINGLE && PL_DBsingle)
1436 sv_setiv(PL_DBsingle, 1);
1437 if (PL_initav)
1438 call_list(oldscope, PL_initav);
1439 }
1440
1441 /* do it */
1442
1443 if (PL_restartop) {
1444 PL_op = PL_restartop;
1445 PL_restartop = 0;
1446 CALLRUNOPS(aTHX);
1447 }
1448 else if (PL_main_start) {
1449 CvDEPTH(PL_main_cv) = 1;
1450 PL_op = PL_main_start;
1451 CALLRUNOPS(aTHX);
1452 }
1453
1454 my_exit(0);
1455 /* NOTREACHED */
1456 return NULL;
1457}
1458
1459/*
1460=for apidoc p||get_sv
1461
1462Returns the SV of the specified Perl scalar. If C<create> is set and the
1463Perl variable does not exist then it will be created. If C<create> is not
1464set and the variable does not exist then NULL is returned.
1465
1466=cut
1467*/
1468
1469SV*
1470Perl_get_sv(pTHX_ const char *name, I32 create)
1471{
1472 GV *gv;
1473#ifdef USE_THREADS
1474 if (name[1] == '\0' && !isALPHA(name[0])) {
1475 PADOFFSET tmp = find_threadsv(name);
1476 if (tmp != NOT_IN_PAD) {
1477 dTHR;
1478 return THREADSV(tmp);
1479 }
1480 }
1481#endif /* USE_THREADS */
1482 gv = gv_fetchpv(name, create, SVt_PV);
1483 if (gv)
1484 return GvSV(gv);
1485 return Nullsv;
1486}
1487
1488/*
1489=for apidoc p||get_av
1490
1491Returns the AV of the specified Perl array. If C<create> is set and the
1492Perl variable does not exist then it will be created. If C<create> is not
1493set and the variable does not exist then NULL is returned.
1494
1495=cut
1496*/
1497
1498AV*
1499Perl_get_av(pTHX_ const char *name, I32 create)
1500{
1501 GV* gv = gv_fetchpv(name, create, SVt_PVAV);
1502 if (create)
1503 return GvAVn(gv);
1504 if (gv)
1505 return GvAV(gv);
1506 return Nullav;
1507}
1508
1509/*
1510=for apidoc p||get_hv
1511
1512Returns the HV of the specified Perl hash. If C<create> is set and the
1513Perl variable does not exist then it will be created. If C<create> is not
1514set and the variable does not exist then NULL is returned.
1515
1516=cut
1517*/
1518
1519HV*
1520Perl_get_hv(pTHX_ const char *name, I32 create)
1521{
1522 GV* gv = gv_fetchpv(name, create, SVt_PVHV);
1523 if (create)
1524 return GvHVn(gv);
1525 if (gv)
1526 return GvHV(gv);
1527 return Nullhv;
1528}
1529
1530/*
1531=for apidoc p||get_cv
1532
1533Returns the CV of the specified Perl subroutine. If C<create> is set and
1534the Perl subroutine does not exist then it will be declared (which has the
1535same effect as saying C<sub name;>). If C<create> is not set and the
1536subroutine does not exist then NULL is returned.
1537
1538=cut
1539*/
1540
1541CV*
1542Perl_get_cv(pTHX_ const char *name, I32 create)
1543{
1544 GV* gv = gv_fetchpv(name, create, SVt_PVCV);
1545 /* XXX unsafe for threads if eval_owner isn't held */
1546 /* XXX this is probably not what they think they're getting.
1547 * It has the same effect as "sub name;", i.e. just a forward
1548 * declaration! */
1549 if (create && !GvCVu(gv))
1550 return newSUB(start_subparse(FALSE, 0),
1551 newSVOP(OP_CONST, 0, newSVpv(name,0)),
1552 Nullop,
1553 Nullop);
1554 if (gv)
1555 return GvCVu(gv);
1556 return Nullcv;
1557}
1558
1559/* Be sure to refetch the stack pointer after calling these routines. */
1560
1561/*
1562=for apidoc p||call_argv
1563
1564Performs a callback to the specified Perl sub. See L<perlcall>.
1565
1566=cut
1567*/
1568
1569I32
1570Perl_call_argv(pTHX_ const char *sub_name, I32 flags, register char **argv)
1571
1572 /* See G_* flags in cop.h */
1573 /* null terminated arg list */
1574{
1575 dSP;
1576
1577 PUSHMARK(SP);
1578 if (argv) {
1579 while (*argv) {
1580 XPUSHs(sv_2mortal(newSVpv(*argv,0)));
1581 argv++;
1582 }
1583 PUTBACK;
1584 }
1585 return call_pv(sub_name, flags);
1586}
1587
1588/*
1589=for apidoc p||call_pv
1590
1591Performs a callback to the specified Perl sub. See L<perlcall>.
1592
1593=cut
1594*/
1595
1596I32
1597Perl_call_pv(pTHX_ const char *sub_name, I32 flags)
1598 /* name of the subroutine */
1599 /* See G_* flags in cop.h */
1600{
1601 return call_sv((SV*)get_cv(sub_name, TRUE), flags);
1602}
1603
1604/*
1605=for apidoc p||call_method
1606
1607Performs a callback to the specified Perl method. The blessed object must
1608be on the stack. See L<perlcall>.
1609
1610=cut
1611*/
1612
1613I32
1614Perl_call_method(pTHX_ const char *methname, I32 flags)
1615 /* name of the subroutine */
1616 /* See G_* flags in cop.h */
1617{
1618 return call_sv(sv_2mortal(newSVpv(methname,0)), flags | G_METHOD);
1619}
1620
1621/* May be called with any of a CV, a GV, or an SV containing the name. */
1622/*
1623=for apidoc p||call_sv
1624
1625Performs a callback to the Perl sub whose name is in the SV. See
1626L<perlcall>.
1627
1628=cut
1629*/
1630
1631I32
1632Perl_call_sv(pTHX_ SV *sv, I32 flags)
1633 /* See G_* flags in cop.h */
1634{
1635 dSP;
1636 LOGOP myop; /* fake syntax tree node */
1637 UNOP method_op;
1638 I32 oldmark;
1639 I32 retval;
1640 I32 oldscope;
1641 bool oldcatch = CATCH_GET;
1642 int ret;
1643 OP* oldop = PL_op;
1644 dJMPENV;
1645
1646 if (flags & G_DISCARD) {
1647 ENTER;
1648 SAVETMPS;
1649 }
1650
1651 Zero(&myop, 1, LOGOP);
1652 myop.op_next = Nullop;
1653 if (!(flags & G_NOARGS))
1654 myop.op_flags |= OPf_STACKED;
1655 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1656 (flags & G_ARRAY) ? OPf_WANT_LIST :
1657 OPf_WANT_SCALAR);
1658 SAVEOP();
1659 PL_op = (OP*)&myop;
1660
1661 EXTEND(PL_stack_sp, 1);
1662 *++PL_stack_sp = sv;
1663 oldmark = TOPMARK;
1664 oldscope = PL_scopestack_ix;
1665
1666 if (PERLDB_SUB && PL_curstash != PL_debstash
1667 /* Handle first BEGIN of -d. */
1668 && (PL_DBcv || (PL_DBcv = GvCV(PL_DBsub)))
1669 /* Try harder, since this may have been a sighandler, thus
1670 * curstash may be meaningless. */
1671 && (SvTYPE(sv) != SVt_PVCV || CvSTASH((CV*)sv) != PL_debstash)
1672 && !(flags & G_NODEBUG))
1673 PL_op->op_private |= OPpENTERSUB_DB;
1674
1675 if (flags & G_METHOD) {
1676 Zero(&method_op, 1, UNOP);
1677 method_op.op_next = PL_op;
1678 method_op.op_ppaddr = PL_ppaddr[OP_METHOD];
1679 myop.op_ppaddr = PL_ppaddr[OP_ENTERSUB];
1680 PL_op = (OP*)&method_op;
1681 }
1682
1683 if (!(flags & G_EVAL)) {
1684 CATCH_SET(TRUE);
1685 call_body((OP*)&myop, FALSE);
1686 retval = PL_stack_sp - (PL_stack_base + oldmark);
1687 CATCH_SET(oldcatch);
1688 }
1689 else {
1690 myop.op_other = (OP*)&myop;
1691 PL_markstack_ptr--;
1692 /* we're trying to emulate pp_entertry() here */
1693 {
1694 register PERL_CONTEXT *cx;
1695 I32 gimme = GIMME_V;
1696
1697 ENTER;
1698 SAVETMPS;
1699
1700 push_return(Nullop);
1701 PUSHBLOCK(cx, (CXt_EVAL|CXp_TRYBLOCK), PL_stack_sp);
1702 PUSHEVAL(cx, 0, 0);
1703 PL_eval_root = PL_op; /* Only needed so that goto works right. */
1704
1705 PL_in_eval = EVAL_INEVAL;
1706 if (flags & G_KEEPERR)
1707 PL_in_eval |= EVAL_KEEPERR;
1708 else
1709 sv_setpv(ERRSV,"");
1710 }
1711 PL_markstack_ptr++;
1712
1713#ifdef PERL_FLEXIBLE_EXCEPTIONS
1714 redo_body:
1715 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vcall_body),
1716 (OP*)&myop, FALSE);
1717#else
1718 JMPENV_PUSH(ret);
1719#endif
1720 switch (ret) {
1721 case 0:
1722#ifndef PERL_FLEXIBLE_EXCEPTIONS
1723 redo_body:
1724 call_body((OP*)&myop, FALSE);
1725#endif
1726 retval = PL_stack_sp - (PL_stack_base + oldmark);
1727 if (!(flags & G_KEEPERR))
1728 sv_setpv(ERRSV,"");
1729 break;
1730 case 1:
1731 STATUS_ALL_FAILURE;
1732 /* FALL THROUGH */
1733 case 2:
1734 /* my_exit() was called */
1735 PL_curstash = PL_defstash;
1736 FREETMPS;
1737 JMPENV_POP;
1738 if (PL_statusvalue && !(PL_exit_flags & PERL_EXIT_EXPECTED))
1739 Perl_croak(aTHX_ "Callback called exit");
1740 my_exit_jump();
1741 /* NOTREACHED */
1742 case 3:
1743 if (PL_restartop) {
1744 PL_op = PL_restartop;
1745 PL_restartop = 0;
1746 goto redo_body;
1747 }
1748 PL_stack_sp = PL_stack_base + oldmark;
1749 if (flags & G_ARRAY)
1750 retval = 0;
1751 else {
1752 retval = 1;
1753 *++PL_stack_sp = &PL_sv_undef;
1754 }
1755 break;
1756 }
1757
1758 if (PL_scopestack_ix > oldscope) {
1759 SV **newsp;
1760 PMOP *newpm;
1761 I32 gimme;
1762 register PERL_CONTEXT *cx;
1763 I32 optype;
1764
1765 POPBLOCK(cx,newpm);
1766 POPEVAL(cx);
1767 pop_return();
1768 PL_curpm = newpm;
1769 LEAVE;
1770 }
1771 JMPENV_POP;
1772 }
1773
1774 if (flags & G_DISCARD) {
1775 PL_stack_sp = PL_stack_base + oldmark;
1776 retval = 0;
1777 FREETMPS;
1778 LEAVE;
1779 }
1780 PL_op = oldop;
1781 return retval;
1782}
1783
1784#ifdef PERL_FLEXIBLE_EXCEPTIONS
1785STATIC void *
1786S_vcall_body(pTHX_ va_list args)
1787{
1788 OP *myop = va_arg(args, OP*);
1789 int is_eval = va_arg(args, int);
1790
1791 call_body(myop, is_eval);
1792 return NULL;
1793}
1794#endif
1795
1796STATIC void
1797S_call_body(pTHX_ OP *myop, int is_eval)
1798{
1799 dTHR;
1800
1801 if (PL_op == myop) {
1802 if (is_eval)
1803 PL_op = Perl_pp_entereval(aTHX); /* this doesn't do a POPMARK */
1804 else
1805 PL_op = Perl_pp_entersub(aTHX); /* this does */
1806 }
1807 if (PL_op)
1808 CALLRUNOPS(aTHX);
1809}
1810
1811/* Eval a string. The G_EVAL flag is always assumed. */
1812
1813/*
1814=for apidoc p||eval_sv
1815
1816Tells Perl to C<eval> the string in the SV.
1817
1818=cut
1819*/
1820
1821I32
1822Perl_eval_sv(pTHX_ SV *sv, I32 flags)
1823
1824 /* See G_* flags in cop.h */
1825{
1826 dSP;
1827 UNOP myop; /* fake syntax tree node */
1828 I32 oldmark = SP - PL_stack_base;
1829 I32 retval;
1830 I32 oldscope;
1831 int ret;
1832 OP* oldop = PL_op;
1833 dJMPENV;
1834
1835 if (flags & G_DISCARD) {
1836 ENTER;
1837 SAVETMPS;
1838 }
1839
1840 SAVEOP();
1841 PL_op = (OP*)&myop;
1842 Zero(PL_op, 1, UNOP);
1843 EXTEND(PL_stack_sp, 1);
1844 *++PL_stack_sp = sv;
1845 oldscope = PL_scopestack_ix;
1846
1847 if (!(flags & G_NOARGS))
1848 myop.op_flags = OPf_STACKED;
1849 myop.op_next = Nullop;
1850 myop.op_type = OP_ENTEREVAL;
1851 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1852 (flags & G_ARRAY) ? OPf_WANT_LIST :
1853 OPf_WANT_SCALAR);
1854 if (flags & G_KEEPERR)
1855 myop.op_flags |= OPf_SPECIAL;
1856
1857#ifdef PERL_FLEXIBLE_EXCEPTIONS
1858 redo_body:
1859 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vcall_body),
1860 (OP*)&myop, TRUE);
1861#else
1862 JMPENV_PUSH(ret);
1863#endif
1864 switch (ret) {
1865 case 0:
1866#ifndef PERL_FLEXIBLE_EXCEPTIONS
1867 redo_body:
1868 call_body((OP*)&myop,TRUE);
1869#endif
1870 retval = PL_stack_sp - (PL_stack_base + oldmark);
1871 if (!(flags & G_KEEPERR))
1872 sv_setpv(ERRSV,"");
1873 break;
1874 case 1:
1875 STATUS_ALL_FAILURE;
1876 /* FALL THROUGH */
1877 case 2:
1878 /* my_exit() was called */
1879 PL_curstash = PL_defstash;
1880 FREETMPS;
1881 JMPENV_POP;
1882 if (PL_statusvalue && !(PL_exit_flags & PERL_EXIT_EXPECTED))
1883 Perl_croak(aTHX_ "Callback called exit");
1884 my_exit_jump();
1885 /* NOTREACHED */
1886 case 3:
1887 if (PL_restartop) {
1888 PL_op = PL_restartop;
1889 PL_restartop = 0;
1890 goto redo_body;
1891 }
1892 PL_stack_sp = PL_stack_base + oldmark;
1893 if (flags & G_ARRAY)
1894 retval = 0;
1895 else {
1896 retval = 1;
1897 *++PL_stack_sp = &PL_sv_undef;
1898 }
1899 break;
1900 }
1901
1902 JMPENV_POP;
1903 if (flags & G_DISCARD) {
1904 PL_stack_sp = PL_stack_base + oldmark;
1905 retval = 0;
1906 FREETMPS;
1907 LEAVE;
1908 }
1909 PL_op = oldop;
1910 return retval;
1911}
1912
1913/*
1914=for apidoc p||eval_pv
1915
1916Tells Perl to C<eval> the given string and return an SV* result.
1917
1918=cut
1919*/
1920
1921SV*
1922Perl_eval_pv(pTHX_ const char *p, I32 croak_on_error)
1923{
1924 dSP;
1925 SV* sv = newSVpv(p, 0);
1926
1927 eval_sv(sv, G_SCALAR);
1928 SvREFCNT_dec(sv);
1929
1930 SPAGAIN;
1931 sv = POPs;
1932 PUTBACK;
1933
1934 if (croak_on_error && SvTRUE(ERRSV)) {
1935 STRLEN n_a;
1936 Perl_croak(aTHX_ SvPVx(ERRSV, n_a));
1937 }
1938
1939 return sv;
1940}
1941
1942/* Require a module. */
1943
1944/*
1945=for apidoc p||require_pv
1946
1947Tells Perl to C<require> a module.
1948
1949=cut
1950*/
1951
1952void
1953Perl_require_pv(pTHX_ const char *pv)
1954{
1955 SV* sv;
1956 dSP;
1957 PUSHSTACKi(PERLSI_REQUIRE);
1958 PUTBACK;
1959 sv = sv_newmortal();
1960 sv_setpv(sv, "require '");
1961 sv_catpv(sv, pv);
1962 sv_catpv(sv, "'");
1963 eval_sv(sv, G_DISCARD);
1964 SPAGAIN;
1965 POPSTACK;
1966}
1967
1968void
1969Perl_magicname(pTHX_ char *sym, char *name, I32 namlen)
1970{
1971 register GV *gv;
1972
1973 if ((gv = gv_fetchpv(sym,TRUE, SVt_PV)))
1974 sv_magic(GvSV(gv), (SV*)gv, 0, name, namlen);
1975}
1976
1977STATIC void
1978S_usage(pTHX_ char *name) /* XXX move this out into a module ? */
1979{
1980 /* This message really ought to be max 23 lines.
1981 * Removed -h because the user already knows that opton. Others? */
1982
1983 static char *usage_msg[] = {
1984"-0[octal] specify record separator (\\0, if no argument)",
1985"-a autosplit mode with -n or -p (splits $_ into @F)",
1986"-C enable native wide character system interfaces",
1987"-c check syntax only (runs BEGIN and CHECK blocks)",
1988"-d[:debugger] run program under debugger",
1989"-D[number/list] set debugging flags (argument is a bit mask or alphabets)",
1990"-e 'command' one line of program (several -e's allowed, omit programfile)",
1991"-F/pattern/ split() pattern for -a switch (//'s are optional)",
1992"-i[extension] edit <> files in place (makes backup if extension supplied)",
1993"-Idirectory specify @INC/#include directory (several -I's allowed)",
1994"-l[octal] enable line ending processing, specifies line terminator",
1995"-[mM][-]module execute `use/no module...' before executing program",
1996"-n assume 'while (<>) { ... }' loop around program",
1997"-p assume loop like -n but print line also, like sed",
1998"-P run program through C preprocessor before compilation",
1999"-s enable rudimentary parsing for switches after programfile",
2000"-S look for programfile using PATH environment variable",
2001"-T enable tainting checks",
2002"-u dump core after parsing program",
2003"-U allow unsafe operations",
2004"-v print version, subversion (includes VERY IMPORTANT perl info)",
2005"-V[:variable] print configuration summary (or a single Config.pm variable)",
2006"-w enable many useful warnings (RECOMMENDED)",
2007"-W enable all warnings",
2008"-X disable all warnings",
2009"-x[directory] strip off text before #!perl line and perhaps cd to directory",
2010"\n",
2011NULL
2012};
2013 char **p = usage_msg;
2014
2015 PerlIO_printf(PerlIO_stdout(),
2016 "\nUsage: %s [switches] [--] [programfile] [arguments]",
2017 name);
2018 while (*p)
2019 PerlIO_printf(PerlIO_stdout(), "\n %s", *p++);
2020}
2021
2022/* This routine handles any switches that can be given during run */
2023
2024char *
2025Perl_moreswitches(pTHX_ char *s)
2026{
2027 I32 numlen;
2028 U32 rschar;
2029
2030 switch (*s) {
2031 case '0':
2032 {
2033 dTHR;
2034 numlen = 0; /* disallow underscores */
2035 rschar = (U32)scan_oct(s, 4, &numlen);
2036 SvREFCNT_dec(PL_nrs);
2037 if (rschar & ~((U8)~0))
2038 PL_nrs = &PL_sv_undef;
2039 else if (!rschar && numlen >= 2)
2040 PL_nrs = newSVpvn("", 0);
2041 else {
2042 char ch = rschar;
2043 PL_nrs = newSVpvn(&ch, 1);
2044 }
2045 return s + numlen;
2046 }
2047 case 'C':
2048 PL_widesyscalls = TRUE;
2049 s++;
2050 return s;
2051 case 'F':
2052 PL_minus_F = TRUE;
2053 PL_splitstr = savepv(s + 1);
2054 s += strlen(s);
2055 return s;
2056 case 'a':
2057 PL_minus_a = TRUE;
2058 s++;
2059 return s;
2060 case 'c':
2061 PL_minus_c = TRUE;
2062 s++;
2063 return s;
2064 case 'd':
2065 forbid_setid("-d");
2066 s++;
2067 /* The following permits -d:Mod to accepts arguments following an =
2068 in the fashion that -MSome::Mod does. */
2069 if (*s == ':' || *s == '=') {
2070 char *start;
2071 SV *sv;
2072 sv = newSVpv("use Devel::", 0);
2073 start = ++s;
2074 /* We now allow -d:Module=Foo,Bar */
2075 while(isALNUM(*s) || *s==':') ++s;
2076 if (*s != '=')
2077 sv_catpv(sv, start);
2078 else {
2079 sv_catpvn(sv, start, s-start);
2080 sv_catpv(sv, " split(/,/,q{");
2081 sv_catpv(sv, ++s);
2082 sv_catpv(sv, "})");
2083 }
2084 s += strlen(s);
2085 my_setenv("PERL5DB", SvPV(sv, PL_na));
2086 }
2087 if (!PL_perldb) {
2088 PL_perldb = PERLDB_ALL;
2089 init_debugger();
2090 }
2091 return s;
2092 case 'D':
2093 {
2094#ifdef DEBUGGING
2095 forbid_setid("-D");
2096 if (isALPHA(s[1])) {
2097 static char debopts[] = "psltocPmfrxuLHXDS";
2098 char *d;
2099
2100 for (s++; *s && (d = strchr(debopts,*s)); s++)
2101 PL_debug |= 1 << (d - debopts);
2102 }
2103 else {
2104 PL_debug = atoi(s+1);
2105 for (s++; isDIGIT(*s); s++) ;
2106 }
2107 PL_debug |= 0x80000000;
2108#else
2109 dTHR;
2110 if (ckWARN_d(WARN_DEBUGGING))
2111 Perl_warner(aTHX_ WARN_DEBUGGING,
2112 "Recompile perl with -DDEBUGGING to use -D switch\n");
2113 for (s++; isALNUM(*s); s++) ;
2114#endif
2115 /*SUPPRESS 530*/
2116 return s;
2117 }
2118 case 'h':
2119 usage(PL_origargv[0]);
2120 PerlProc_exit(0);
2121 case 'i':
2122 if (PL_inplace)
2123 Safefree(PL_inplace);
2124 PL_inplace = savepv(s+1);
2125 /*SUPPRESS 530*/
2126 for (s = PL_inplace; *s && !isSPACE(*s); s++) ;
2127 if (*s) {
2128 *s++ = '\0';
2129 if (*s == '-') /* Additional switches on #! line. */
2130 s++;
2131 }
2132 return s;
2133 case 'I': /* -I handled both here and in parse_perl() */
2134 forbid_setid("-I");
2135 ++s;
2136 while (*s && isSPACE(*s))
2137 ++s;
2138 if (*s) {
2139 char *e, *p;
2140 p = s;
2141 /* ignore trailing spaces (possibly followed by other switches) */
2142 do {
2143 for (e = p; *e && !isSPACE(*e); e++) ;
2144 p = e;
2145 while (isSPACE(*p))
2146 p++;
2147 } while (*p && *p != '-');
2148 e = savepvn(s, e-s);
2149 incpush(e, TRUE, TRUE);
2150 Safefree(e);
2151 s = p;
2152 if (*s == '-')
2153 s++;
2154 }
2155 else
2156 Perl_croak(aTHX_ "No directory specified for -I");
2157 return s;
2158 case 'l':
2159 PL_minus_l = TRUE;
2160 s++;
2161 if (PL_ors)
2162 Safefree(PL_ors);
2163 if (isDIGIT(*s)) {
2164 PL_ors = savepv("\n");
2165 PL_orslen = 1;
2166 numlen = 0; /* disallow underscores */
2167 *PL_ors = (char)scan_oct(s, 3 + (*s == '0'), &numlen);
2168 s += numlen;
2169 }
2170 else {
2171 dTHR;
2172 if (RsPARA(PL_nrs)) {
2173 PL_ors = "\n\n";
2174 PL_orslen = 2;
2175 }
2176 else
2177 PL_ors = SvPV(PL_nrs, PL_orslen);
2178 PL_ors = savepvn(PL_ors, PL_orslen);
2179 }
2180 return s;
2181 case 'M':
2182 forbid_setid("-M"); /* XXX ? */
2183 /* FALL THROUGH */
2184 case 'm':
2185 forbid_setid("-m"); /* XXX ? */
2186 if (*++s) {
2187 char *start;
2188 SV *sv;
2189 char *use = "use ";
2190 /* -M-foo == 'no foo' */
2191 if (*s == '-') { use = "no "; ++s; }
2192 sv = newSVpv(use,0);
2193 start = s;
2194 /* We allow -M'Module qw(Foo Bar)' */
2195 while(isALNUM(*s) || *s==':') ++s;
2196 if (*s != '=') {
2197 sv_catpv(sv, start);
2198 if (*(start-1) == 'm') {
2199 if (*s != '\0')
2200 Perl_croak(aTHX_ "Can't use '%c' after -mname", *s);
2201 sv_catpv( sv, " ()");
2202 }
2203 } else {
2204 if (s == start)
2205 Perl_croak(aTHX_ "Module name required with -%c option",
2206 s[-1]);
2207 sv_catpvn(sv, start, s-start);
2208 sv_catpv(sv, " split(/,/,q{");
2209 sv_catpv(sv, ++s);
2210 sv_catpv(sv, "})");
2211 }
2212 s += strlen(s);
2213 if (!PL_preambleav)
2214 PL_preambleav = newAV();
2215 av_push(PL_preambleav, sv);
2216 }
2217 else
2218 Perl_croak(aTHX_ "No space allowed after -%c", *(s-1));
2219 return s;
2220 case 'n':
2221 PL_minus_n = TRUE;
2222 s++;
2223 return s;
2224 case 'p':
2225 PL_minus_p = TRUE;
2226 s++;
2227 return s;
2228 case 's':
2229 forbid_setid("-s");
2230 PL_doswitches = TRUE;
2231 s++;
2232 return s;
2233 case 'T':
2234 if (!PL_tainting)
2235 Perl_croak(aTHX_ "Too late for \"-T\" option");
2236 s++;
2237 return s;
2238 case 'u':
2239#ifdef MACOS_TRADITIONAL
2240 Perl_croak(aTHX_ "Believe me, you don't want to use \"-u\" on a Macintosh");
2241#endif
2242 PL_do_undump = TRUE;
2243 s++;
2244 return s;
2245 case 'U':
2246 PL_unsafe = TRUE;
2247 s++;
2248 return s;
2249 case 'v':
2250 PerlIO_printf(PerlIO_stdout(),
2251 Perl_form(aTHX_ "\nThis is perl, v%vd built for %s",
2252 PL_patchlevel, ARCHNAME));
2253#if defined(LOCAL_PATCH_COUNT)
2254 if (LOCAL_PATCH_COUNT > 0)
2255 PerlIO_printf(PerlIO_stdout(),
2256 "\n(with %d registered patch%s, "
2257 "see perl -V for more detail)",
2258 (int)LOCAL_PATCH_COUNT,
2259 (LOCAL_PATCH_COUNT!=1) ? "es" : "");
2260#endif
2261
2262 PerlIO_printf(PerlIO_stdout(),
2263 "\n\nCopyright 1987-2000, Larry Wall\n");
2264#ifdef MACOS_TRADITIONAL
2265 PerlIO_printf(PerlIO_stdout(),
2266 "\nMacOS port Copyright (c) 1991-2000, Matthias Neeracher\n");
2267#endif
2268#ifdef MSDOS
2269 PerlIO_printf(PerlIO_stdout(),
2270 "\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
2271#endif
2272#ifdef DJGPP
2273 PerlIO_printf(PerlIO_stdout(),
2274 "djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n"
2275 "djgpp v2 port (perl5004+) by Laszlo Molnar, 1997-1999\n");
2276#endif
2277#ifdef OS2
2278 PerlIO_printf(PerlIO_stdout(),
2279 "\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
2280 "Version 5 port Copyright (c) 1994-1999, Andreas Kaiser, Ilya Zakharevich\n");
2281#endif
2282#ifdef atarist
2283 PerlIO_printf(PerlIO_stdout(),
2284 "atariST series port, ++jrb bammi@cadence.com\n");
2285#endif
2286#ifdef __BEOS__
2287 PerlIO_printf(PerlIO_stdout(),
2288 "BeOS port Copyright Tom Spindler, 1997-1999\n");
2289#endif
2290#ifdef MPE
2291 PerlIO_printf(PerlIO_stdout(),
2292 "MPE/iX port Copyright by Mark Klein and Mark Bixby, 1996-1999\n");
2293#endif
2294#ifdef OEMVS
2295 PerlIO_printf(PerlIO_stdout(),
2296 "MVS (OS390) port by Mortice Kern Systems, 1997-1999\n");
2297#endif
2298#ifdef __VOS__
2299 PerlIO_printf(PerlIO_stdout(),
2300 "Stratus VOS port by Paul_Green@stratus.com, 1997-1999\n");
2301#endif
2302#ifdef __OPEN_VM
2303 PerlIO_printf(PerlIO_stdout(),
2304 "VM/ESA port by Neale Ferguson, 1998-1999\n");
2305#endif
2306#ifdef POSIX_BC
2307 PerlIO_printf(PerlIO_stdout(),
2308 "BS2000 (POSIX) port by Start Amadeus GmbH, 1998-1999\n");
2309#endif
2310#ifdef __MINT__
2311 PerlIO_printf(PerlIO_stdout(),
2312 "MiNT port by Guido Flohr, 1997-1999\n");
2313#endif
2314#ifdef EPOC
2315 PerlIO_printf(PerlIO_stdout(),
2316 "EPOC port by Olaf Flebbe, 1999-2000\n");
2317#endif
2318#ifdef BINARY_BUILD_NOTICE
2319 BINARY_BUILD_NOTICE;
2320#endif
2321 PerlIO_printf(PerlIO_stdout(),
2322 "\n\
2323Perl may be copied only under the terms of either the Artistic License or the\n\
2324GNU General Public License, which may be found in the Perl 5.0 source kit.\n\n\
2325Complete documentation for Perl, including FAQ lists, should be found on\n\
2326this system using `man perl' or `perldoc perl'. If you have access to the\n\
2327Internet, point your browser at http://www.perl.com/, the Perl Home Page.\n\n");
2328 PerlProc_exit(0);
2329 case 'w':
2330 if (! (PL_dowarn & G_WARN_ALL_MASK))
2331 PL_dowarn |= G_WARN_ON;
2332 s++;
2333 return s;
2334 case 'W':
2335 PL_dowarn = G_WARN_ALL_ON|G_WARN_ON;
2336 PL_compiling.cop_warnings = pWARN_ALL ;
2337 s++;
2338 return s;
2339 case 'X':
2340 PL_dowarn = G_WARN_ALL_OFF;
2341 PL_compiling.cop_warnings = pWARN_NONE ;
2342 s++;
2343 return s;
2344 case '*':
2345 case ' ':
2346 if (s[1] == '-') /* Additional switches on #! line. */
2347 return s+2;
2348 break;
2349 case '-':
2350 case 0:
2351#if defined(WIN32) || !defined(PERL_STRICT_CR)
2352 case '\r':
2353#endif
2354 case '\n':
2355 case '\t':
2356 break;
2357#ifdef ALTERNATE_SHEBANG
2358 case 'S': /* OS/2 needs -S on "extproc" line. */
2359 break;
2360#endif
2361 case 'P':
2362 if (PL_preprocess)
2363 return s+1;
2364 /* FALL THROUGH */
2365 default:
2366 Perl_croak(aTHX_ "Can't emulate -%.1s on #! line",s);
2367 }
2368 return Nullch;
2369}
2370
2371/* compliments of Tom Christiansen */
2372
2373/* unexec() can be found in the Gnu emacs distribution */
2374/* Known to work with -DUNEXEC and using unexelf.c from GNU emacs-20.2 */
2375
2376void
2377Perl_my_unexec(pTHX)
2378{
2379#ifdef UNEXEC
2380 SV* prog;
2381 SV* file;
2382 int status = 1;
2383 extern int etext;
2384
2385 prog = newSVpv(BIN_EXP, 0);
2386 sv_catpv(prog, "/perl");
2387 file = newSVpv(PL_origfilename, 0);
2388 sv_catpv(file, ".perldump");
2389
2390 unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
2391 /* unexec prints msg to stderr in case of failure */
2392 PerlProc_exit(status);
2393#else
2394# ifdef VMS
2395# include <lib$routines.h>
2396 lib$signal(SS$_DEBUG); /* ssdef.h #included from vmsish.h */
2397# else
2398 ABORT(); /* for use with undump */
2399# endif
2400#endif
2401}
2402
2403/* initialize curinterp */
2404STATIC void
2405S_init_interp(pTHX)
2406{
2407
2408#ifdef PERL_OBJECT /* XXX kludge */
2409#define I_REINIT \
2410 STMT_START { \
2411 PL_chopset = " \n-"; \
2412 PL_copline = NOLINE; \
2413 PL_curcop = &PL_compiling;\
2414 PL_curcopdb = NULL; \
2415 PL_dbargs = 0; \
2416 PL_dumpindent = 4; \
2417 PL_laststatval = -1; \
2418 PL_laststype = OP_STAT; \
2419 PL_maxscream = -1; \
2420 PL_maxsysfd = MAXSYSFD; \
2421 PL_statname = Nullsv; \
2422 PL_tmps_floor = -1; \
2423 PL_tmps_ix = -1; \
2424 PL_op_mask = NULL; \
2425 PL_laststatval = -1; \
2426 PL_laststype = OP_STAT; \
2427 PL_mess_sv = Nullsv; \
2428 PL_splitstr = " "; \
2429 PL_generation = 100; \
2430 PL_exitlist = NULL; \
2431 PL_exitlistlen = 0; \
2432 PL_regindent = 0; \
2433 PL_in_clean_objs = FALSE; \
2434 PL_in_clean_all = FALSE; \
2435 PL_profiledata = NULL; \
2436 PL_rsfp = Nullfp; \
2437 PL_rsfp_filters = Nullav; \
2438 PL_dirty = FALSE; \
2439 } STMT_END
2440 I_REINIT;
2441#else
2442# ifdef MULTIPLICITY
2443# define PERLVAR(var,type)
2444# define PERLVARA(var,n,type)
2445# if defined(PERL_IMPLICIT_CONTEXT)
2446# if defined(USE_THREADS)
2447# define PERLVARI(var,type,init) PERL_GET_INTERP->var = init;
2448# define PERLVARIC(var,type,init) PERL_GET_INTERP->var = init;
2449# else /* !USE_THREADS */
2450# define PERLVARI(var,type,init) aTHX->var = init;
2451# define PERLVARIC(var,type,init) aTHX->var = init;
2452# endif /* USE_THREADS */
2453# else
2454# define PERLVARI(var,type,init) PERL_GET_INTERP->var = init;
2455# define PERLVARIC(var,type,init) PERL_GET_INTERP->var = init;
2456# endif
2457# include "intrpvar.h"
2458# ifndef USE_THREADS
2459# include "thrdvar.h"
2460# endif
2461# undef PERLVAR
2462# undef PERLVARA
2463# undef PERLVARI
2464# undef PERLVARIC
2465# else
2466# define PERLVAR(var,type)
2467# define PERLVARA(var,n,type)
2468# define PERLVARI(var,type,init) PL_##var = init;
2469# define PERLVARIC(var,type,init) PL_##var = init;
2470# include "intrpvar.h"
2471# ifndef USE_THREADS
2472# include "thrdvar.h"
2473# endif
2474# undef PERLVAR
2475# undef PERLVARA
2476# undef PERLVARI
2477# undef PERLVARIC
2478# endif
2479#endif
2480
2481}
2482
2483STATIC void
2484S_init_main_stash(pTHX)
2485{
2486 dTHR;
2487 GV *gv;
2488
2489 /* Note that strtab is a rather special HV. Assumptions are made
2490 about not iterating on it, and not adding tie magic to it.
2491 It is properly deallocated in perl_destruct() */
2492 PL_strtab = newHV();
2493#ifdef USE_THREADS
2494 MUTEX_INIT(&PL_strtab_mutex);
2495#endif
2496 HvSHAREKEYS_off(PL_strtab); /* mandatory */
2497 hv_ksplit(PL_strtab, 512);
2498
2499 PL_curstash = PL_defstash = newHV();
2500 PL_curstname = newSVpvn("main",4);
2501 gv = gv_fetchpv("main::",TRUE, SVt_PVHV);
2502 SvREFCNT_dec(GvHV(gv));
2503 GvHV(gv) = (HV*)SvREFCNT_inc(PL_defstash);
2504 SvREADONLY_on(gv);
2505 HvNAME(PL_defstash) = savepv("main");
2506 PL_incgv = gv_HVadd(gv_AVadd(gv_fetchpv("INC",TRUE, SVt_PVAV)));
2507 GvMULTI_on(PL_incgv);
2508 PL_hintgv = gv_fetchpv("\010",TRUE, SVt_PV); /* ^H */
2509 GvMULTI_on(PL_hintgv);
2510 PL_defgv = gv_fetchpv("_",TRUE, SVt_PVAV);
2511 PL_errgv = gv_HVadd(gv_fetchpv("@", TRUE, SVt_PV));
2512 GvMULTI_on(PL_errgv);
2513 PL_replgv = gv_fetchpv("\022", TRUE, SVt_PV); /* ^R */
2514 GvMULTI_on(PL_replgv);
2515 (void)Perl_form(aTHX_ "%240s",""); /* Preallocate temp - for immediate signals. */
2516 sv_grow(ERRSV, 240); /* Preallocate - for immediate signals. */
2517 sv_setpvn(ERRSV, "", 0);
2518 PL_curstash = PL_defstash;
2519 CopSTASH_set(&PL_compiling, PL_defstash);
2520 PL_debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
2521 PL_globalstash = GvHV(gv_fetchpv("CORE::GLOBAL::", GV_ADDMULTI, SVt_PVHV));
2522 PL_nullstash = GvHV(gv_fetchpv("<none>::", GV_ADDMULTI, SVt_PVHV));
2523 /* We must init $/ before switches are processed. */
2524 sv_setpvn(get_sv("/", TRUE), "\n", 1);
2525}
2526
2527STATIC void
2528S_open_script(pTHX_ char *scriptname, bool dosearch, SV *sv, int *fdscript)
2529{
2530 dTHR;
2531
2532 *fdscript = -1;
2533
2534 if (PL_e_script) {
2535 PL_origfilename = savepv("-e");
2536 }
2537 else {
2538 /* if find_script() returns, it returns a malloc()-ed value */
2539 PL_origfilename = scriptname = find_script(scriptname, dosearch, NULL, 1);
2540
2541 if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
2542 char *s = scriptname + 8;
2543 *fdscript = atoi(s);
2544 while (isDIGIT(*s))
2545 s++;
2546 if (*s) {
2547 scriptname = savepv(s + 1);
2548 Safefree(PL_origfilename);
2549 PL_origfilename = scriptname;
2550 }
2551 }
2552 }
2553
2554#ifdef USE_ITHREADS
2555 Safefree(CopFILE(PL_curcop));
2556#else
2557 SvREFCNT_dec(CopFILEGV(PL_curcop));
2558#endif
2559 CopFILE_set(PL_curcop, PL_origfilename);
2560 if (strEQ(PL_origfilename,"-"))
2561 scriptname = "";
2562 if (*fdscript >= 0) {
2563 PL_rsfp = PerlIO_fdopen(*fdscript,PERL_SCRIPT_MODE);
2564#if defined(HAS_FCNTL) && defined(F_SETFD)
2565 if (PL_rsfp)
2566 fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,1); /* ensure close-on-exec */
2567#endif
2568 }
2569 else if (PL_preprocess) {
2570 char *cpp_cfg = CPPSTDIN;
2571 SV *cpp = newSVpvn("",0);
2572 SV *cmd = NEWSV(0,0);
2573
2574 if (strEQ(cpp_cfg, "cppstdin"))
2575 Perl_sv_catpvf(aTHX_ cpp, "%s/", BIN_EXP);
2576 sv_catpv(cpp, cpp_cfg);
2577
2578 sv_catpvn(sv, "-I", 2);
2579 sv_catpv(sv,PRIVLIB_EXP);
2580
2581#if defined(MSDOS) || defined(WIN32)
2582 Perl_sv_setpvf(aTHX_ cmd, "\
2583sed %s -e \"/^[^#]/b\" \
2584 -e \"/^#[ ]*include[ ]/b\" \
2585 -e \"/^#[ ]*define[ ]/b\" \
2586 -e \"/^#[ ]*if[ ]/b\" \
2587 -e \"/^#[ ]*ifdef[ ]/b\" \
2588 -e \"/^#[ ]*ifndef[ ]/b\" \
2589 -e \"/^#[ ]*else/b\" \
2590 -e \"/^#[ ]*elif[ ]/b\" \
2591 -e \"/^#[ ]*undef[ ]/b\" \
2592 -e \"/^#[ ]*endif/b\" \
2593 -e \"s/^#.*//\" \
2594 %s | %"SVf" -C %"SVf" %s",
2595 (PL_doextract ? "-e \"1,/^#/d\n\"" : ""),
2596#else
2597# ifdef __OPEN_VM
2598 Perl_sv_setpvf(aTHX_ cmd, "\
2599%s %s -e '/^[^#]/b' \
2600 -e '/^#[ ]*include[ ]/b' \
2601 -e '/^#[ ]*define[ ]/b' \
2602 -e '/^#[ ]*if[ ]/b' \
2603 -e '/^#[ ]*ifdef[ ]/b' \
2604 -e '/^#[ ]*ifndef[ ]/b' \
2605 -e '/^#[ ]*else/b' \
2606 -e '/^#[ ]*elif[ ]/b' \
2607 -e '/^#[ ]*undef[ ]/b' \
2608 -e '/^#[ ]*endif/b' \
2609 -e 's/^[ ]*#.*//' \
2610 %s | %"SVf" %"SVf" %s",
2611# else
2612 Perl_sv_setpvf(aTHX_ cmd, "\
2613%s %s -e '/^[^#]/b' \
2614 -e '/^#[ ]*include[ ]/b' \
2615 -e '/^#[ ]*define[ ]/b' \
2616 -e '/^#[ ]*if[ ]/b' \
2617 -e '/^#[ ]*ifdef[ ]/b' \
2618 -e '/^#[ ]*ifndef[ ]/b' \
2619 -e '/^#[ ]*else/b' \
2620 -e '/^#[ ]*elif[ ]/b' \
2621 -e '/^#[ ]*undef[ ]/b' \
2622 -e '/^#[ ]*endif/b' \
2623 -e 's/^[ ]*#.*//' \
2624 %s | %"SVf" -C %"SVf" %s",
2625# endif
2626#ifdef LOC_SED
2627 LOC_SED,
2628#else
2629 "sed",
2630#endif
2631 (PL_doextract ? "-e '1,/^#/d\n'" : ""),
2632#endif
2633 scriptname, cpp, sv, CPPMINUS);
2634 PL_doextract = FALSE;
2635#ifdef IAMSUID /* actually, this is caught earlier */
2636 if (PL_euid != PL_uid && !PL_euid) { /* if running suidperl */
2637#ifdef HAS_SETEUID
2638 (void)seteuid(PL_uid); /* musn't stay setuid root */
2639#else
2640#ifdef HAS_SETREUID
2641 (void)setreuid((Uid_t)-1, PL_uid);
2642#else
2643#ifdef HAS_SETRESUID
2644 (void)setresuid((Uid_t)-1, PL_uid, (Uid_t)-1);
2645#else
2646 PerlProc_setuid(PL_uid);
2647#endif
2648#endif
2649#endif
2650 if (PerlProc_geteuid() != PL_uid)
2651 Perl_croak(aTHX_ "Can't do seteuid!\n");
2652 }
2653#endif /* IAMSUID */
2654 PL_rsfp = PerlProc_popen(SvPVX(cmd), "r");
2655 SvREFCNT_dec(cmd);
2656 SvREFCNT_dec(cpp);
2657 }
2658 else if (!*scriptname) {
2659 forbid_setid("program input from stdin");
2660 PL_rsfp = PerlIO_stdin();
2661 }
2662 else {
2663 PL_rsfp = PerlIO_open(scriptname,PERL_SCRIPT_MODE);
2664#if defined(HAS_FCNTL) && defined(F_SETFD)
2665 if (PL_rsfp)
2666 fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,1); /* ensure close-on-exec */
2667#endif
2668 }
2669 if (!PL_rsfp) {
2670#ifdef DOSUID
2671#ifndef IAMSUID /* in case script is not readable before setuid */
2672 if (PL_euid &&
2673 PerlLIO_stat(CopFILE(PL_curcop),&PL_statbuf) >= 0 &&
2674 PL_statbuf.st_mode & (S_ISUID|S_ISGID))
2675 {
2676 /* try again */
2677 PerlProc_execv(Perl_form(aTHX_ "%s/sperl"PERL_FS_VER_FMT, BIN_EXP,
2678 (int)PERL_REVISION, (int)PERL_VERSION,
2679 (int)PERL_SUBVERSION), PL_origargv);
2680 Perl_croak(aTHX_ "Can't do setuid\n");
2681 }
2682#endif
2683#endif
2684 Perl_croak(aTHX_ "Can't open perl script \"%s\": %s\n",
2685 CopFILE(PL_curcop), Strerror(errno));
2686 }
2687}
2688
2689/* Mention
2690 * I_SYSSTATVFS HAS_FSTATVFS
2691 * I_SYSMOUNT
2692 * I_STATFS HAS_FSTATFS HAS_GETFSSTAT
2693 * I_MNTENT HAS_GETMNTENT HAS_HASMNTOPT
2694 * here so that metaconfig picks them up. */
2695
2696#ifdef IAMSUID
2697STATIC int
2698S_fd_on_nosuid_fs(pTHX_ int fd)
2699{
2700 int check_okay = 0; /* able to do all the required sys/libcalls */
2701 int on_nosuid = 0; /* the fd is on a nosuid fs */
2702/*
2703 * Preferred order: fstatvfs(), fstatfs(), ustat()+getmnt(), getmntent().
2704 * fstatvfs() is UNIX98.
2705 * fstatfs() is 4.3 BSD.
2706 * ustat()+getmnt() is pre-4.3 BSD.
2707 * getmntent() is O(number-of-mounted-filesystems) and can hang on
2708 * an irrelevant filesystem while trying to reach the right one.
2709 */
2710
2711#undef FD_ON_NOSUID_CHECK_OKAY /* found the syscalls to do the check? */
2712
2713# if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
2714 defined(HAS_FSTATVFS)
2715# define FD_ON_NOSUID_CHECK_OKAY
2716 struct statvfs stfs;
2717
2718 check_okay = fstatvfs(fd, &stfs) == 0;
2719 on_nosuid = check_okay && (stfs.f_flag & ST_NOSUID);
2720# endif /* fstatvfs */
2721
2722# if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
2723 defined(PERL_MOUNT_NOSUID) && \
2724 defined(HAS_FSTATFS) && \
2725 defined(HAS_STRUCT_STATFS) && \
2726 defined(HAS_STRUCT_STATFS_F_FLAGS)
2727# define FD_ON_NOSUID_CHECK_OKAY
2728 struct statfs stfs;
2729
2730 check_okay = fstatfs(fd, &stfs) == 0;
2731 on_nosuid = check_okay && (stfs.f_flags & PERL_MOUNT_NOSUID);
2732# endif /* fstatfs */
2733
2734# if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
2735 defined(PERL_MOUNT_NOSUID) && \
2736 defined(HAS_FSTAT) && \
2737 defined(HAS_USTAT) && \
2738 defined(HAS_GETMNT) && \
2739 defined(HAS_STRUCT_FS_DATA) && \
2740 defined(NOSTAT_ONE)
2741# define FD_ON_NOSUID_CHECK_OKAY
2742 struct stat fdst;
2743
2744 if (fstat(fd, &fdst) == 0) {
2745 struct ustat us;
2746 if (ustat(fdst.st_dev, &us) == 0) {
2747 struct fs_data fsd;
2748 /* NOSTAT_ONE here because we're not examining fields which
2749 * vary between that case and STAT_ONE. */
2750 if (getmnt((int*)0, &fsd, (int)0, NOSTAT_ONE, us.f_fname) == 0) {
2751 size_t cmplen = sizeof(us.f_fname);
2752 if (sizeof(fsd.fd_req.path) < cmplen)
2753 cmplen = sizeof(fsd.fd_req.path);
2754 if (strnEQ(fsd.fd_req.path, us.f_fname, cmplen) &&
2755 fdst.st_dev == fsd.fd_req.dev) {
2756 check_okay = 1;
2757 on_nosuid = fsd.fd_req.flags & PERL_MOUNT_NOSUID;
2758 }
2759 }
2760 }
2761 }
2762 }
2763# endif /* fstat+ustat+getmnt */
2764
2765# if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
2766 defined(HAS_GETMNTENT) && \
2767 defined(HAS_HASMNTOPT) && \
2768 defined(MNTOPT_NOSUID)
2769# define FD_ON_NOSUID_CHECK_OKAY
2770 FILE *mtab = fopen("/etc/mtab", "r");
2771 struct mntent *entry;
2772 struct stat stb, fsb;
2773
2774 if (mtab && (fstat(fd, &stb) == 0)) {
2775 while (entry = getmntent(mtab)) {
2776 if (stat(entry->mnt_dir, &fsb) == 0
2777 && fsb.st_dev == stb.st_dev)
2778 {
2779 /* found the filesystem */
2780 check_okay = 1;
2781 if (hasmntopt(entry, MNTOPT_NOSUID))
2782 on_nosuid = 1;
2783 break;
2784 } /* A single fs may well fail its stat(). */
2785 }
2786 }
2787 if (mtab)
2788 fclose(mtab);
2789# endif /* getmntent+hasmntopt */
2790
2791 if (!check_okay)
2792 Perl_croak(aTHX_ "Can't check filesystem of script \"%s\" for nosuid", PL_origfilename);
2793 return on_nosuid;
2794}
2795#endif /* IAMSUID */
2796
2797STATIC void
2798S_validate_suid(pTHX_ char *validarg, char *scriptname, int fdscript)
2799{
2800#ifdef IAMSUID
2801 int which;
2802#endif
2803
2804 /* do we need to emulate setuid on scripts? */
2805
2806 /* This code is for those BSD systems that have setuid #! scripts disabled
2807 * in the kernel because of a security problem. Merely defining DOSUID
2808 * in perl will not fix that problem, but if you have disabled setuid
2809 * scripts in the kernel, this will attempt to emulate setuid and setgid
2810 * on scripts that have those now-otherwise-useless bits set. The setuid
2811 * root version must be called suidperl or sperlN.NNN. If regular perl
2812 * discovers that it has opened a setuid script, it calls suidperl with
2813 * the same argv that it had. If suidperl finds that the script it has
2814 * just opened is NOT setuid root, it sets the effective uid back to the
2815 * uid. We don't just make perl setuid root because that loses the
2816 * effective uid we had before invoking perl, if it was different from the
2817 * uid.
2818 *
2819 * DOSUID must be defined in both perl and suidperl, and IAMSUID must
2820 * be defined in suidperl only. suidperl must be setuid root. The
2821 * Configure script will set this up for you if you want it.
2822 */
2823
2824#ifdef DOSUID
2825 dTHR;
2826 char *s, *s2;
2827
2828 if (PerlLIO_fstat(PerlIO_fileno(PL_rsfp),&PL_statbuf) < 0) /* normal stat is insecure */
2829 Perl_croak(aTHX_ "Can't stat script \"%s\"",PL_origfilename);
2830 if (fdscript < 0 && PL_statbuf.st_mode & (S_ISUID|S_ISGID)) {
2831 I32 len;
2832 STRLEN n_a;
2833
2834#ifdef IAMSUID
2835#ifndef HAS_SETREUID
2836 /* On this access check to make sure the directories are readable,
2837 * there is actually a small window that the user could use to make
2838 * filename point to an accessible directory. So there is a faint
2839 * chance that someone could execute a setuid script down in a
2840 * non-accessible directory. I don't know what to do about that.
2841 * But I don't think it's too important. The manual lies when
2842 * it says access() is useful in setuid programs.
2843 */
2844 if (PerlLIO_access(CopFILE(PL_curcop),1)) /*double check*/
2845 Perl_croak(aTHX_ "Permission denied");
2846#else
2847 /* If we can swap euid and uid, then we can determine access rights
2848 * with a simple stat of the file, and then compare device and
2849 * inode to make sure we did stat() on the same file we opened.
2850 * Then we just have to make sure he or she can execute it.
2851 */
2852 {
2853 struct stat tmpstatbuf;
2854
2855 if (
2856#ifdef HAS_SETREUID
2857 setreuid(PL_euid,PL_uid) < 0
2858#else
2859# if HAS_SETRESUID
2860 setresuid(PL_euid,PL_uid,(Uid_t)-1) < 0
2861# endif
2862#endif
2863 || PerlProc_getuid() != PL_euid || PerlProc_geteuid() != PL_uid)
2864 Perl_croak(aTHX_ "Can't swap uid and euid"); /* really paranoid */
2865 if (PerlLIO_stat(CopFILE(PL_curcop),&tmpstatbuf) < 0)
2866 Perl_croak(aTHX_ "Permission denied"); /* testing full pathname here */
2867#if defined(IAMSUID) && !defined(NO_NOSUID_CHECK)
2868 if (fd_on_nosuid_fs(PerlIO_fileno(PL_rsfp)))
2869 Perl_croak(aTHX_ "Permission denied");
2870#endif
2871 if (tmpstatbuf.st_dev != PL_statbuf.st_dev ||
2872 tmpstatbuf.st_ino != PL_statbuf.st_ino) {
2873 (void)PerlIO_close(PL_rsfp);
2874 Perl_croak(aTHX_ "Permission denied\n");
2875 }
2876 if (
2877#ifdef HAS_SETREUID
2878 setreuid(PL_uid,PL_euid) < 0
2879#else
2880# if defined(HAS_SETRESUID)
2881 setresuid(PL_uid,PL_euid,(Uid_t)-1) < 0
2882# endif
2883#endif
2884 || PerlProc_getuid() != PL_uid || PerlProc_geteuid() != PL_euid)
2885 Perl_croak(aTHX_ "Can't reswap uid and euid");
2886 if (!cando(S_IXUSR,FALSE,&PL_statbuf)) /* can real uid exec? */
2887 Perl_croak(aTHX_ "Permission denied\n");
2888 }
2889#endif /* HAS_SETREUID */
2890#endif /* IAMSUID */
2891
2892 if (!S_ISREG(PL_statbuf.st_mode))
2893 Perl_croak(aTHX_ "Permission denied");
2894 if (PL_statbuf.st_mode & S_IWOTH)
2895 Perl_croak(aTHX_ "Setuid/gid script is writable by world");
2896 PL_doswitches = FALSE; /* -s is insecure in suid */
2897 CopLINE_inc(PL_curcop);
2898 if (sv_gets(PL_linestr, PL_rsfp, 0) == Nullch ||
2899 strnNE(SvPV(PL_linestr,n_a),"#!",2) ) /* required even on Sys V */
2900 Perl_croak(aTHX_ "No #! line");
2901 s = SvPV(PL_linestr,n_a)+2;
2902 if (*s == ' ') s++;
2903 while (!isSPACE(*s)) s++;
2904 for (s2 = s; (s2 > SvPV(PL_linestr,n_a)+2 &&
2905 (isDIGIT(s2[-1]) || strchr("._-", s2[-1]))); s2--) ;
2906 if (strnNE(s2-4,"perl",4) && strnNE(s-9,"perl",4)) /* sanity check */
2907 Perl_croak(aTHX_ "Not a perl script");
2908 while (*s == ' ' || *s == '\t') s++;
2909 /*
2910 * #! arg must be what we saw above. They can invoke it by
2911 * mentioning suidperl explicitly, but they may not add any strange
2912 * arguments beyond what #! says if they do invoke suidperl that way.
2913 */
2914 len = strlen(validarg);
2915 if (strEQ(validarg," PHOOEY ") ||
2916 strnNE(s,validarg,len) || !isSPACE(s[len]))
2917 Perl_croak(aTHX_ "Args must match #! line");
2918
2919#ifndef IAMSUID
2920 if (PL_euid != PL_uid && (PL_statbuf.st_mode & S_ISUID) &&
2921 PL_euid == PL_statbuf.st_uid)
2922 if (!PL_do_undump)
2923 Perl_croak(aTHX_ "YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2924FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2925#endif /* IAMSUID */
2926
2927 if (PL_euid) { /* oops, we're not the setuid root perl */
2928 (void)PerlIO_close(PL_rsfp);
2929#ifndef IAMSUID
2930 /* try again */
2931 PerlProc_execv(Perl_form(aTHX_ "%s/sperl"PERL_FS_VER_FMT, BIN_EXP,
2932 (int)PERL_REVISION, (int)PERL_VERSION,
2933 (int)PERL_SUBVERSION), PL_origargv);
2934#endif
2935 Perl_croak(aTHX_ "Can't do setuid\n");
2936 }
2937
2938 if (PL_statbuf.st_mode & S_ISGID && PL_statbuf.st_gid != PL_egid) {
2939#ifdef HAS_SETEGID
2940 (void)setegid(PL_statbuf.st_gid);
2941#else
2942#ifdef HAS_SETREGID
2943 (void)setregid((Gid_t)-1,PL_statbuf.st_gid);
2944#else
2945#ifdef HAS_SETRESGID
2946 (void)setresgid((Gid_t)-1,PL_statbuf.st_gid,(Gid_t)-1);
2947#else
2948 PerlProc_setgid(PL_statbuf.st_gid);
2949#endif
2950#endif
2951#endif
2952 if (PerlProc_getegid() != PL_statbuf.st_gid)
2953 Perl_croak(aTHX_ "Can't do setegid!\n");
2954 }
2955 if (PL_statbuf.st_mode & S_ISUID) {
2956 if (PL_statbuf.st_uid != PL_euid)
2957#ifdef HAS_SETEUID
2958 (void)seteuid(PL_statbuf.st_uid); /* all that for this */
2959#else
2960#ifdef HAS_SETREUID
2961 (void)setreuid((Uid_t)-1,PL_statbuf.st_uid);
2962#else
2963#ifdef HAS_SETRESUID
2964 (void)setresuid((Uid_t)-1,PL_statbuf.st_uid,(Uid_t)-1);
2965#else
2966 PerlProc_setuid(PL_statbuf.st_uid);
2967#endif
2968#endif
2969#endif
2970 if (PerlProc_geteuid() != PL_statbuf.st_uid)
2971 Perl_croak(aTHX_ "Can't do seteuid!\n");
2972 }
2973 else if (PL_uid) { /* oops, mustn't run as root */
2974#ifdef HAS_SETEUID
2975 (void)seteuid((Uid_t)PL_uid);
2976#else
2977#ifdef HAS_SETREUID
2978 (void)setreuid((Uid_t)-1,(Uid_t)PL_uid);
2979#else
2980#ifdef HAS_SETRESUID
2981 (void)setresuid((Uid_t)-1,(Uid_t)PL_uid,(Uid_t)-1);
2982#else
2983 PerlProc_setuid((Uid_t)PL_uid);
2984#endif
2985#endif
2986#endif
2987 if (PerlProc_geteuid() != PL_uid)
2988 Perl_croak(aTHX_ "Can't do seteuid!\n");
2989 }
2990 init_ids();
2991 if (!cando(S_IXUSR,TRUE,&PL_statbuf))
2992 Perl_croak(aTHX_ "Permission denied\n"); /* they can't do this */
2993 }
2994#ifdef IAMSUID
2995 else if (PL_preprocess)
2996 Perl_croak(aTHX_ "-P not allowed for setuid/setgid script\n");
2997 else if (fdscript >= 0)
2998 Perl_croak(aTHX_ "fd script not allowed in suidperl\n");
2999 else
3000 Perl_croak(aTHX_ "Script is not setuid/setgid in suidperl\n");
3001
3002 /* We absolutely must clear out any saved ids here, so we */
3003 /* exec the real perl, substituting fd script for scriptname. */
3004 /* (We pass script name as "subdir" of fd, which perl will grok.) */
3005 PerlIO_rewind(PL_rsfp);
3006 PerlLIO_lseek(PerlIO_fileno(PL_rsfp),(Off_t)0,0); /* just in case rewind didn't */
3007 for (which = 1; PL_origargv[which] && PL_origargv[which] != scriptname; which++) ;
3008 if (!PL_origargv[which])
3009 Perl_croak(aTHX_ "Permission denied");
3010 PL_origargv[which] = savepv(Perl_form(aTHX_ "/dev/fd/%d/%s",
3011 PerlIO_fileno(PL_rsfp), PL_origargv[which]));
3012#if defined(HAS_FCNTL) && defined(F_SETFD)
3013 fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,0); /* ensure no close-on-exec */
3014#endif
3015 PerlProc_execv(Perl_form(aTHX_ "%s/perl"PERL_FS_VER_FMT, BIN_EXP,
3016 (int)PERL_REVISION, (int)PERL_VERSION,
3017 (int)PERL_SUBVERSION), PL_origargv);/* try again */
3018 Perl_croak(aTHX_ "Can't do setuid\n");
3019#endif /* IAMSUID */
3020#else /* !DOSUID */
3021 if (PL_euid != PL_uid || PL_egid != PL_gid) { /* (suidperl doesn't exist, in fact) */
3022#ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
3023 dTHR;
3024 PerlLIO_fstat(PerlIO_fileno(PL_rsfp),&PL_statbuf); /* may be either wrapped or real suid */
3025 if ((PL_euid != PL_uid && PL_euid == PL_statbuf.st_uid && PL_statbuf.st_mode & S_ISUID)
3026 ||
3027 (PL_egid != PL_gid && PL_egid == PL_statbuf.st_gid && PL_statbuf.st_mode & S_ISGID)
3028 )
3029 if (!PL_do_undump)
3030 Perl_croak(aTHX_ "YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
3031FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
3032#endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
3033 /* not set-id, must be wrapped */
3034 }
3035#endif /* DOSUID */
3036}
3037
3038STATIC void
3039S_find_beginning(pTHX)
3040{
3041 register char *s, *s2;
3042
3043 /* skip forward in input to the real script? */
3044
3045 forbid_setid("-x");
3046#ifdef MACOS_TRADITIONAL
3047 /* Since the Mac OS does not honor !# arguments for us, we do it ourselves */
3048
3049 while (PL_doextract || gMacPerl_AlwaysExtract) {
3050 if ((s = sv_gets(PL_linestr, PL_rsfp, 0)) == Nullch) {
3051 if (!gMacPerl_AlwaysExtract)
3052 Perl_croak(aTHX_ "No Perl script found in input\n");
3053
3054 if (PL_doextract) /* require explicit override ? */
3055 if (!OverrideExtract(PL_origfilename))
3056 Perl_croak(aTHX_ "User aborted script\n");
3057 else
3058 PL_doextract = FALSE;
3059
3060 /* Pater peccavi, file does not have #! */
3061 PerlIO_rewind(PL_rsfp);
3062
3063 break;
3064 }
3065#else
3066 while (PL_doextract) {
3067 if ((s = sv_gets(PL_linestr, PL_rsfp, 0)) == Nullch)
3068 Perl_croak(aTHX_ "No Perl script found in input\n");
3069#endif
3070 if (*s == '#' && s[1] == '!' && (s = instr(s,"perl"))) {
3071 PerlIO_ungetc(PL_rsfp, '\n'); /* to keep line count right */
3072 PL_doextract = FALSE;
3073 while (*s && !(isSPACE (*s) || *s == '#')) s++;
3074 s2 = s;
3075 while (*s == ' ' || *s == '\t') s++;
3076 if (*s++ == '-') {
3077 while (isDIGIT(s2[-1]) || strchr("-._", s2[-1])) s2--;
3078 if (strnEQ(s2-4,"perl",4))
3079 /*SUPPRESS 530*/
3080 while ((s = moreswitches(s)))
3081 ;
3082 }
3083 }
3084 }
3085}
3086
3087
3088STATIC void
3089S_init_ids(pTHX)
3090{
3091 PL_uid = PerlProc_getuid();
3092 PL_euid = PerlProc_geteuid();
3093 PL_gid = PerlProc_getgid();
3094 PL_egid = PerlProc_getegid();
3095#ifdef VMS
3096 PL_uid |= PL_gid << 16;
3097 PL_euid |= PL_egid << 16;
3098#endif
3099 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
3100}
3101
3102STATIC void
3103S_forbid_setid(pTHX_ char *s)
3104{
3105 if (PL_euid != PL_uid)
3106 Perl_croak(aTHX_ "No %s allowed while running setuid", s);
3107 if (PL_egid != PL_gid)
3108 Perl_croak(aTHX_ "No %s allowed while running setgid", s);
3109}
3110
3111void
3112Perl_init_debugger(pTHX)
3113{
3114 dTHR;
3115 HV *ostash = PL_curstash;
3116
3117 PL_curstash = PL_debstash;
3118 PL_dbargs = GvAV(gv_AVadd((gv_fetchpv("args", GV_ADDMULTI, SVt_PVAV))));
3119 AvREAL_off(PL_dbargs);
3120 PL_DBgv = gv_fetchpv("DB", GV_ADDMULTI, SVt_PVGV);
3121 PL_DBline = gv_fetchpv("dbline", GV_ADDMULTI, SVt_PVAV);
3122 PL_DBsub = gv_HVadd(gv_fetchpv("sub", GV_ADDMULTI, SVt_PVHV));
3123 sv_upgrade(GvSV(PL_DBsub), SVt_IV); /* IVX accessed if PERLDB_SUB_NN */
3124 PL_DBsingle = GvSV((gv_fetchpv("single", GV_ADDMULTI, SVt_PV)));
3125 sv_setiv(PL_DBsingle, 0);
3126 PL_DBtrace = GvSV((gv_fetchpv("trace", GV_ADDMULTI, SVt_PV)));
3127 sv_setiv(PL_DBtrace, 0);
3128 PL_DBsignal = GvSV((gv_fetchpv("signal", GV_ADDMULTI, SVt_PV)));
3129 sv_setiv(PL_DBsignal, 0);
3130 PL_curstash = ostash;
3131}
3132
3133#ifndef STRESS_REALLOC
3134#define REASONABLE(size) (size)
3135#else
3136#define REASONABLE(size) (1) /* unreasonable */
3137#endif
3138
3139void
3140Perl_init_stacks(pTHX)
3141{
3142 /* start with 128-item stack and 8K cxstack */
3143 PL_curstackinfo = new_stackinfo(REASONABLE(128),
3144 REASONABLE(8192/sizeof(PERL_CONTEXT) - 1));
3145 PL_curstackinfo->si_type = PERLSI_MAIN;
3146 PL_curstack = PL_curstackinfo->si_stack;
3147 PL_mainstack = PL_curstack; /* remember in case we switch stacks */
3148
3149 PL_stack_base = AvARRAY(PL_curstack);
3150 PL_stack_sp = PL_stack_base;
3151 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
3152
3153 New(50,PL_tmps_stack,REASONABLE(128),SV*);
3154 PL_tmps_floor = -1;
3155 PL_tmps_ix = -1;
3156 PL_tmps_max = REASONABLE(128);
3157
3158 New(54,PL_markstack,REASONABLE(32),I32);
3159 PL_markstack_ptr = PL_markstack;
3160 PL_markstack_max = PL_markstack + REASONABLE(32);
3161
3162 SET_MARK_OFFSET;
3163
3164 New(54,PL_scopestack,REASONABLE(32),I32);
3165 PL_scopestack_ix = 0;
3166 PL_scopestack_max = REASONABLE(32);
3167
3168 New(54,PL_savestack,REASONABLE(128),ANY);
3169 PL_savestack_ix = 0;
3170 PL_savestack_max = REASONABLE(128);
3171
3172 New(54,PL_retstack,REASONABLE(16),OP*);
3173 PL_retstack_ix = 0;
3174 PL_retstack_max = REASONABLE(16);
3175}
3176
3177#undef REASONABLE
3178
3179STATIC void
3180S_nuke_stacks(pTHX)
3181{
3182 dTHR;
3183 while (PL_curstackinfo->si_next)
3184 PL_curstackinfo = PL_curstackinfo->si_next;
3185 while (PL_curstackinfo) {
3186 PERL_SI *p = PL_curstackinfo->si_prev;
3187 /* curstackinfo->si_stack got nuked by sv_free_arenas() */
3188 Safefree(PL_curstackinfo->si_cxstack);
3189 Safefree(PL_curstackinfo);
3190 PL_curstackinfo = p;
3191 }
3192 Safefree(PL_tmps_stack);
3193 Safefree(PL_markstack);
3194 Safefree(PL_scopestack);
3195 Safefree(PL_savestack);
3196 Safefree(PL_retstack);
3197}
3198
3199#ifndef PERL_OBJECT
3200static PerlIO *tmpfp; /* moved outside init_lexer() because of UNICOS bug */
3201#endif
3202
3203STATIC void
3204S_init_lexer(pTHX)
3205{
3206#ifdef PERL_OBJECT
3207 PerlIO *tmpfp;
3208#endif
3209 tmpfp = PL_rsfp;
3210 PL_rsfp = Nullfp;
3211 lex_start(PL_linestr);
3212 PL_rsfp = tmpfp;
3213 PL_subname = newSVpvn("main",4);
3214}
3215
3216STATIC void
3217S_init_predump_symbols(pTHX)
3218{
3219 dTHR;
3220 GV *tmpgv;
3221 IO *io;
3222
3223 sv_setpvn(get_sv("\"", TRUE), " ", 1);
3224 PL_stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
3225 GvMULTI_on(PL_stdingv);
3226 io = GvIOp(PL_stdingv);
3227 IoIFP(io) = PerlIO_stdin();
3228 tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
3229 GvMULTI_on(tmpgv);
3230 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
3231
3232 tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
3233 GvMULTI_on(tmpgv);
3234 io = GvIOp(tmpgv);
3235 IoOFP(io) = IoIFP(io) = PerlIO_stdout();
3236 setdefout(tmpgv);
3237 tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
3238 GvMULTI_on(tmpgv);
3239 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
3240
3241 PL_stderrgv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
3242 GvMULTI_on(PL_stderrgv);
3243 io = GvIOp(PL_stderrgv);
3244 IoOFP(io) = IoIFP(io) = PerlIO_stderr();
3245 tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
3246 GvMULTI_on(tmpgv);
3247 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
3248
3249 PL_statname = NEWSV(66,0); /* last filename we did stat on */
3250
3251 if (PL_osname)
3252 Safefree(PL_osname);
3253 PL_osname = savepv(OSNAME);
3254}
3255
3256STATIC void
3257S_init_postdump_symbols(pTHX_ register int argc, register char **argv, register char **env)
3258{
3259 dTHR;
3260 char *s;
3261 SV *sv;
3262 GV* tmpgv;
3263
3264 argc--,argv++; /* skip name of script */
3265 if (PL_doswitches) {
3266 for (; argc > 0 && **argv == '-'; argc--,argv++) {
3267 if (!argv[0][1])
3268 break;
3269 if (argv[0][1] == '-' && !argv[0][2]) {
3270 argc--,argv++;
3271 break;
3272 }
3273 if ((s = strchr(argv[0], '='))) {
3274 *s++ = '\0';
3275 sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),s);
3276 }
3277 else
3278 sv_setiv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),1);
3279 }
3280 }
3281 PL_toptarget = NEWSV(0,0);
3282 sv_upgrade(PL_toptarget, SVt_PVFM);
3283 sv_setpvn(PL_toptarget, "", 0);
3284 PL_bodytarget = NEWSV(0,0);
3285 sv_upgrade(PL_bodytarget, SVt_PVFM);
3286 sv_setpvn(PL_bodytarget, "", 0);
3287 PL_formtarget = PL_bodytarget;
3288
3289 TAINT;
3290 if ((tmpgv = gv_fetchpv("0",TRUE, SVt_PV))) {
3291#ifdef MACOS_TRADITIONAL
3292 /* $0 is not majick on a Mac */
3293 sv_setpv(GvSV(tmpgv),MacPerl_MPWFileName(PL_origfilename));
3294#else
3295 sv_setpv(GvSV(tmpgv),PL_origfilename);
3296 magicname("0", "0", 1);
3297#endif
3298 }
3299 if ((tmpgv = gv_fetchpv("\030",TRUE, SVt_PV)))
3300#ifdef OS2
3301 sv_setpv(GvSV(tmpgv), os2_execname(aTHX));
3302#else
3303 sv_setpv(GvSV(tmpgv),PL_origargv[0]);
3304#endif
3305 if ((PL_argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV))) {
3306 GvMULTI_on(PL_argvgv);
3307 (void)gv_AVadd(PL_argvgv);
3308 av_clear(GvAVn(PL_argvgv));
3309 for (; argc > 0; argc--,argv++) {
3310 SV *sv = newSVpv(argv[0],0);
3311 av_push(GvAVn(PL_argvgv),sv);
3312 if (PL_widesyscalls)
3313 (void)sv_utf8_decode(sv);
3314 }
3315 }
3316 if ((PL_envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV))) {
3317 HV *hv;
3318 GvMULTI_on(PL_envgv);
3319 hv = GvHVn(PL_envgv);
3320 hv_magic(hv, PL_envgv, 'E');
3321#if !defined( VMS) && !defined(EPOC) && !defined(MACOS_TRADITIONAL) /* VMS doesn't have environ array */
3322 /* Note that if the supplied env parameter is actually a copy
3323 of the global environ then it may now point to free'd memory
3324 if the environment has been modified since. To avoid this
3325 problem we treat env==NULL as meaning 'use the default'
3326 */
3327 if (!env)
3328 env = environ;
3329 if (env != environ)
3330 environ[0] = Nullch;
3331 for (; *env; env++) {
3332 if (!(s = strchr(*env,'=')))
3333 continue;
3334 *s++ = '\0';
3335#if defined(MSDOS)
3336 (void)strupr(*env);
3337#endif
3338 sv = newSVpv(s--,0);
3339 (void)hv_store(hv, *env, s - *env, sv, 0);
3340 *s = '=';
3341#if defined(__BORLANDC__) && defined(USE_WIN32_RTL_ENV)
3342 /* Sins of the RTL. See note in my_setenv(). */
3343 (void)PerlEnv_putenv(savepv(*env));
3344#endif
3345 }
3346#endif
3347#ifdef DYNAMIC_ENV_FETCH
3348 HvNAME(hv) = savepv(ENV_HV_NAME);
3349#endif
3350 }
3351 TAINT_NOT;
3352 if ((tmpgv = gv_fetchpv("$",TRUE, SVt_PV)))
3353 sv_setiv(GvSV(tmpgv), (IV)PerlProc_getpid());
3354}
3355
3356STATIC void
3357S_init_perllib(pTHX)
3358{
3359 char *s;
3360 if (!PL_tainting) {
3361#ifndef VMS
3362 s = PerlEnv_getenv("PERL5LIB");
3363 if (s)
3364 incpush(s, TRUE, TRUE);
3365 else
3366 incpush(PerlEnv_getenv("PERLLIB"), FALSE, FALSE);
3367#else /* VMS */
3368 /* Treat PERL5?LIB as a possible search list logical name -- the
3369 * "natural" VMS idiom for a Unix path string. We allow each
3370 * element to be a set of |-separated directories for compatibility.
3371 */
3372 char buf[256];
3373 int idx = 0;
3374 if (my_trnlnm("PERL5LIB",buf,0))
3375 do { incpush(buf,TRUE,TRUE); } while (my_trnlnm("PERL5LIB",buf,++idx));
3376 else
3377 while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE,FALSE);
3378#endif /* VMS */
3379 }
3380
3381/* Use the ~-expanded versions of APPLLIB (undocumented),
3382 ARCHLIB PRIVLIB SITEARCH SITELIB VENDORARCH and VENDORLIB
3383*/
3384#ifdef APPLLIB_EXP
3385 incpush(APPLLIB_EXP, TRUE, TRUE);
3386#endif
3387
3388#ifdef ARCHLIB_EXP
3389 incpush(ARCHLIB_EXP, FALSE, FALSE);
3390#endif
3391#ifdef MACOS_TRADITIONAL
3392 {
3393 struct stat tmpstatbuf;
3394 SV * privdir = NEWSV(55, 0);
3395 char * macperl = PerlEnv_getenv("MACPERL");
3396
3397 if (!macperl)
3398 macperl = "";
3399
3400 Perl_sv_setpvf(aTHX_ privdir, "%slib:", macperl);
3401 if (PerlLIO_stat(SvPVX(privdir), &tmpstatbuf) >= 0 && S_ISDIR(tmpstatbuf.st_mode))
3402 incpush(SvPVX(privdir), TRUE, FALSE);
3403 Perl_sv_setpvf(aTHX_ privdir, "%ssite_perl:", macperl);
3404 if (PerlLIO_stat(SvPVX(privdir), &tmpstatbuf) >= 0 && S_ISDIR(tmpstatbuf.st_mode))
3405 incpush(SvPVX(privdir), TRUE, FALSE);
3406
3407 SvREFCNT_dec(privdir);
3408 }
3409 if (!PL_tainting)
3410 incpush(":", FALSE, FALSE);
3411#else
3412#ifndef PRIVLIB_EXP
3413# define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
3414#endif
3415#if defined(WIN32)
3416 incpush(PRIVLIB_EXP, TRUE, FALSE);
3417#else
3418 incpush(PRIVLIB_EXP, FALSE, FALSE);
3419#endif
3420
3421#ifdef SITEARCH_EXP
3422 /* sitearch is always relative to sitelib on Windows for
3423 * DLL-based path intuition to work correctly */
3424# if !defined(WIN32)
3425 incpush(SITEARCH_EXP, FALSE, FALSE);
3426# endif
3427#endif
3428
3429#ifdef SITELIB_EXP
3430# if defined(WIN32)
3431 incpush(SITELIB_EXP, TRUE, FALSE); /* this picks up sitearch as well */
3432# else
3433 incpush(SITELIB_EXP, FALSE, FALSE);
3434# endif
3435#endif
3436
3437#ifdef SITELIB_STEM /* Search for version-specific dirs below here */
3438 incpush(SITELIB_STEM, FALSE, TRUE);
3439#endif
3440
3441#ifdef PERL_VENDORARCH_EXP
3442 /* vendorarch is always relative to vendorlib on Windows for
3443 * DLL-based path intuition to work correctly */
3444# if !defined(WIN32)
3445 incpush(PERL_VENDORARCH_EXP, FALSE, FALSE);
3446# endif
3447#endif
3448
3449#ifdef PERL_VENDORLIB_EXP
3450# if defined(WIN32)
3451 incpush(PERL_VENDORLIB_EXP, TRUE, FALSE); /* this picks up vendorarch as well */
3452# else
3453 incpush(PERL_VENDORLIB_EXP, FALSE, FALSE);
3454# endif
3455#endif
3456
3457#ifdef PERL_VENDORLIB_STEM /* Search for version-specific dirs below here */
3458 incpush(PERL_VENDORLIB_STEM, FALSE, TRUE);
3459#endif
3460
3461#ifdef PERL_OTHERLIBDIRS
3462 incpush(PERL_OTHERLIBDIRS, TRUE, TRUE);
3463#endif
3464
3465 if (!PL_tainting)
3466 incpush(".", FALSE, FALSE);
3467#endif /* MACOS_TRADITIONAL */
3468}
3469
3470#if defined(DOSISH)
3471# define PERLLIB_SEP ';'
3472#else
3473# if defined(VMS)
3474# define PERLLIB_SEP '|'
3475# else
3476# if defined(MACOS_TRADITIONAL)
3477# define PERLLIB_SEP ','
3478# else
3479# define PERLLIB_SEP ':'
3480# endif
3481# endif
3482#endif
3483#ifndef PERLLIB_MANGLE
3484# define PERLLIB_MANGLE(s,n) (s)
3485#endif
3486
3487STATIC void
3488S_incpush(pTHX_ char *p, int addsubdirs, int addoldvers)
3489{
3490 SV *subdir = Nullsv;
3491
3492 if (!p || !*p)
3493 return;
3494
3495 if (addsubdirs || addoldvers) {
3496 subdir = sv_newmortal();
3497 }
3498
3499 /* Break at all separators */
3500 while (p && *p) {
3501 SV *libdir = NEWSV(55,0);
3502 char *s;
3503
3504 /* skip any consecutive separators */
3505 while ( *p == PERLLIB_SEP ) {
3506 /* Uncomment the next line for PATH semantics */
3507 /* av_push(GvAVn(PL_incgv), newSVpvn(".", 1)); */
3508 p++;
3509 }
3510
3511 if ( (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
3512 sv_setpvn(libdir, PERLLIB_MANGLE(p, (STRLEN)(s - p)),
3513 (STRLEN)(s - p));
3514 p = s + 1;
3515 }
3516 else {
3517 sv_setpv(libdir, PERLLIB_MANGLE(p, 0));
3518 p = Nullch; /* break out */
3519 }
3520#ifdef MACOS_TRADITIONAL
3521 if (!strchr(SvPVX(libdir), ':'))
3522 sv_insert(libdir, 0, 0, ":", 1);
3523 if (SvPVX(libdir)[SvCUR(libdir)-1] != ':')
3524 sv_catpv(libdir, ":");
3525#endif
3526
3527 /*
3528 * BEFORE pushing libdir onto @INC we may first push version- and
3529 * archname-specific sub-directories.
3530 */
3531 if (addsubdirs || addoldvers) {
3532#ifdef PERL_INC_VERSION_LIST
3533 /* Configure terminates PERL_INC_VERSION_LIST with a NULL */
3534 const char *incverlist[] = { PERL_INC_VERSION_LIST };
3535 const char **incver;
3536#endif
3537 struct stat tmpstatbuf;
3538#ifdef VMS
3539 char *unix;
3540 STRLEN len;
3541
3542 if ((unix = tounixspec_ts(SvPV(libdir,len),Nullch)) != Nullch) {
3543 len = strlen(unix);
3544 while (unix[len-1] == '/') len--; /* Cosmetic */
3545 sv_usepvn(libdir,unix,len);
3546 }
3547 else
3548 PerlIO_printf(Perl_error_log,
3549 "Failed to unixify @INC element \"%s\"\n",
3550 SvPV(libdir,len));
3551#endif
3552 if (addsubdirs) {
3553#ifdef MACOS_TRADITIONAL
3554#define PERL_AV_SUFFIX_FMT ""
3555#define PERL_ARCH_FMT ":%s"
3556#else
3557#define PERL_AV_SUFFIX_FMT "/"
3558#define PERL_ARCH_FMT "/%s"
3559#endif
3560 /* .../version/archname if -d .../version/archname */
3561 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_AV_SUFFIX_FMT PERL_FS_VER_FMT PERL_ARCH_FMT,
3562 libdir,
3563 (int)PERL_REVISION, (int)PERL_VERSION,
3564 (int)PERL_SUBVERSION, ARCHNAME);
3565 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
3566 S_ISDIR(tmpstatbuf.st_mode))
3567 av_push(GvAVn(PL_incgv), newSVsv(subdir));
3568
3569 /* .../version if -d .../version */
3570 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_AV_SUFFIX_FMT PERL_FS_VER_FMT, libdir,
3571 (int)PERL_REVISION, (int)PERL_VERSION,
3572 (int)PERL_SUBVERSION);
3573 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
3574 S_ISDIR(tmpstatbuf.st_mode))
3575 av_push(GvAVn(PL_incgv), newSVsv(subdir));
3576
3577 /* .../archname if -d .../archname */
3578 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT, libdir, ARCHNAME);
3579 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
3580 S_ISDIR(tmpstatbuf.st_mode))
3581 av_push(GvAVn(PL_incgv), newSVsv(subdir));
3582 }
3583
3584#ifdef PERL_INC_VERSION_LIST
3585 if (addoldvers) {
3586 for (incver = incverlist; *incver; incver++) {
3587 /* .../xxx if -d .../xxx */
3588 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT, libdir, *incver);
3589 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
3590 S_ISDIR(tmpstatbuf.st_mode))
3591 av_push(GvAVn(PL_incgv), newSVsv(subdir));
3592 }
3593 }
3594#endif
3595 }
3596
3597 /* finally push this lib directory on the end of @INC */
3598 av_push(GvAVn(PL_incgv), libdir);
3599 }
3600}
3601
3602#ifdef USE_THREADS
3603STATIC struct perl_thread *
3604S_init_main_thread(pTHX)
3605{
3606#if !defined(PERL_IMPLICIT_CONTEXT)
3607 struct perl_thread *thr;
3608#endif
3609 XPV *xpv;
3610
3611 Newz(53, thr, 1, struct perl_thread);
3612 PL_curcop = &PL_compiling;
3613 thr->interp = PERL_GET_INTERP;
3614 thr->cvcache = newHV();
3615 thr->threadsv = newAV();
3616 /* thr->threadsvp is set when find_threadsv is called */
3617 thr->specific = newAV();
3618 thr->flags = THRf_R_JOINABLE;
3619 MUTEX_INIT(&thr->mutex);
3620 /* Handcraft thrsv similarly to mess_sv */
3621 New(53, PL_thrsv, 1, SV);
3622 Newz(53, xpv, 1, XPV);
3623 SvFLAGS(PL_thrsv) = SVt_PV;
3624 SvANY(PL_thrsv) = (void*)xpv;
3625 SvREFCNT(PL_thrsv) = 1 << 30; /* practically infinite */
3626 SvPVX(PL_thrsv) = (char*)thr;
3627 SvCUR_set(PL_thrsv, sizeof(thr));
3628 SvLEN_set(PL_thrsv, sizeof(thr));
3629 *SvEND(PL_thrsv) = '\0'; /* in the trailing_nul field */
3630 thr->oursv = PL_thrsv;
3631 PL_chopset = " \n-";
3632 PL_dumpindent = 4;
3633
3634 MUTEX_LOCK(&PL_threads_mutex);
3635 PL_nthreads++;
3636 thr->tid = 0;
3637 thr->next = thr;
3638 thr->prev = thr;
3639 MUTEX_UNLOCK(&PL_threads_mutex);
3640
3641#ifdef HAVE_THREAD_INTERN
3642 Perl_init_thread_intern(thr);
3643#endif
3644
3645#ifdef SET_THREAD_SELF
3646 SET_THREAD_SELF(thr);
3647#else
3648 thr->self = pthread_self();
3649#endif /* SET_THREAD_SELF */
3650 PERL_SET_THX(thr);
3651
3652 /*
3653 * These must come after the SET_THR because sv_setpvn does
3654 * SvTAINT and the taint fields require dTHR.
3655 */
3656 PL_toptarget = NEWSV(0,0);
3657 sv_upgrade(PL_toptarget, SVt_PVFM);
3658 sv_setpvn(PL_toptarget, "", 0);
3659 PL_bodytarget = NEWSV(0,0);
3660 sv_upgrade(PL_bodytarget, SVt_PVFM);
3661 sv_setpvn(PL_bodytarget, "", 0);
3662 PL_formtarget = PL_bodytarget;
3663 thr->errsv = newSVpvn("", 0);
3664 (void) find_threadsv("@"); /* Ensure $@ is initialised early */
3665
3666 PL_maxscream = -1;
3667 PL_regcompp = MEMBER_TO_FPTR(Perl_pregcomp);
3668 PL_regexecp = MEMBER_TO_FPTR(Perl_regexec_flags);
3669 PL_regint_start = MEMBER_TO_FPTR(Perl_re_intuit_start);
3670 PL_regint_string = MEMBER_TO_FPTR(Perl_re_intuit_string);
3671 PL_regfree = MEMBER_TO_FPTR(Perl_pregfree);
3672 PL_regindent = 0;
3673 PL_reginterp_cnt = 0;
3674
3675 return thr;
3676}
3677#endif /* USE_THREADS */
3678
3679void
3680Perl_call_list(pTHX_ I32 oldscope, AV *paramList)
3681{
3682 dTHR;
3683 SV *atsv;
3684 line_t oldline = CopLINE(PL_curcop);
3685 CV *cv;
3686 STRLEN len;
3687 int ret;
3688 dJMPENV;
3689
3690 while (AvFILL(paramList) >= 0) {
3691 cv = (CV*)av_shift(paramList);
3692 if ((PL_minus_c & 0x10) && (paramList == PL_beginav)) {
3693 /* save PL_beginav for compiler */
3694 if (! PL_beginav_save)
3695 PL_beginav_save = newAV();
3696 av_push(PL_beginav_save, (SV*)cv);
3697 } else {
3698 SAVEFREESV(cv);
3699 }
3700#ifdef PERL_FLEXIBLE_EXCEPTIONS
3701 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vcall_list_body), cv);
3702#else
3703 JMPENV_PUSH(ret);
3704#endif
3705 switch (ret) {
3706 case 0:
3707#ifndef PERL_FLEXIBLE_EXCEPTIONS
3708 call_list_body(cv);
3709#endif
3710 atsv = ERRSV;
3711 (void)SvPV(atsv, len);
3712 if (len) {
3713 STRLEN n_a;
3714 PL_curcop = &PL_compiling;
3715 CopLINE_set(PL_curcop, oldline);
3716 if (paramList == PL_beginav)
3717 sv_catpv(atsv, "BEGIN failed--compilation aborted");
3718 else
3719 Perl_sv_catpvf(aTHX_ atsv,
3720 "%s failed--call queue aborted",
3721 paramList == PL_checkav ? "CHECK"
3722 : paramList == PL_initav ? "INIT"
3723 : "END");
3724 while (PL_scopestack_ix > oldscope)
3725 LEAVE;
3726 JMPENV_POP;
3727 Perl_croak(aTHX_ "%s", SvPVx(atsv, n_a));
3728 }
3729 break;
3730 case 1:
3731 STATUS_ALL_FAILURE;
3732 /* FALL THROUGH */
3733 case 2:
3734 /* my_exit() was called */
3735 while (PL_scopestack_ix > oldscope)
3736 LEAVE;
3737 FREETMPS;
3738 PL_curstash = PL_defstash;
3739 PL_curcop = &PL_compiling;
3740 CopLINE_set(PL_curcop, oldline);
3741 JMPENV_POP;
3742 if (PL_statusvalue && !(PL_exit_flags & PERL_EXIT_EXPECTED)) {
3743 if (paramList == PL_beginav)
3744 Perl_croak(aTHX_ "BEGIN failed--compilation aborted");
3745 else
3746 Perl_croak(aTHX_ "%s failed--call queue aborted",
3747 paramList == PL_checkav ? "CHECK"
3748 : paramList == PL_initav ? "INIT"
3749 : "END");
3750 }
3751 my_exit_jump();
3752 /* NOTREACHED */
3753 case 3:
3754 if (PL_restartop) {
3755 PL_curcop = &PL_compiling;
3756 CopLINE_set(PL_curcop, oldline);
3757 JMPENV_JUMP(3);
3758 }
3759 PerlIO_printf(Perl_error_log, "panic: restartop\n");
3760 FREETMPS;
3761 break;
3762 }
3763 JMPENV_POP;
3764 }
3765}
3766
3767#ifdef PERL_FLEXIBLE_EXCEPTIONS
3768STATIC void *
3769S_vcall_list_body(pTHX_ va_list args)
3770{
3771 CV *cv = va_arg(args, CV*);
3772 return call_list_body(cv);
3773}
3774#endif
3775
3776STATIC void *
3777S_call_list_body(pTHX_ CV *cv)
3778{
3779 PUSHMARK(PL_stack_sp);
3780 call_sv((SV*)cv, G_EVAL|G_DISCARD);
3781 return NULL;
3782}
3783
3784void
3785Perl_my_exit(pTHX_ U32 status)
3786{
3787 dTHR;
3788
3789 DEBUG_S(PerlIO_printf(Perl_debug_log, "my_exit: thread %p, status %lu\n",
3790 thr, (unsigned long) status));
3791 switch (status) {
3792 case 0:
3793 STATUS_ALL_SUCCESS;
3794 break;
3795 case 1:
3796 STATUS_ALL_FAILURE;
3797 break;
3798 default:
3799 STATUS_NATIVE_SET(status);
3800 break;
3801 }
3802 my_exit_jump();
3803}
3804
3805void
3806Perl_my_failure_exit(pTHX)
3807{
3808#ifdef VMS
3809 if (vaxc$errno & 1) {
3810 if (STATUS_NATIVE & 1) /* fortuitiously includes "-1" */
3811 STATUS_NATIVE_SET(44);
3812 }
3813 else {
3814 if (!vaxc$errno && errno) /* unlikely */
3815 STATUS_NATIVE_SET(44);
3816 else
3817 STATUS_NATIVE_SET(vaxc$errno);
3818 }
3819#else
3820 int exitstatus;
3821 if (errno & 255)
3822 STATUS_POSIX_SET(errno);
3823 else {
3824 exitstatus = STATUS_POSIX >> 8;
3825 if (exitstatus & 255)
3826 STATUS_POSIX_SET(exitstatus);
3827 else
3828 STATUS_POSIX_SET(255);
3829 }
3830#endif
3831 my_exit_jump();
3832}
3833
3834STATIC void
3835S_my_exit_jump(pTHX)
3836{
3837 dTHR;
3838 register PERL_CONTEXT *cx;
3839 I32 gimme;
3840 SV **newsp;
3841
3842 if (PL_e_script) {
3843 SvREFCNT_dec(PL_e_script);
3844 PL_e_script = Nullsv;
3845 }
3846
3847 POPSTACK_TO(PL_mainstack);
3848 if (cxstack_ix >= 0) {
3849 if (cxstack_ix > 0)
3850 dounwind(0);
3851 POPBLOCK(cx,PL_curpm);
3852 LEAVE;
3853 }
3854
3855 JMPENV_JUMP(2);
3856}
3857
3858#ifdef PERL_OBJECT
3859#include "XSUB.h"
3860#endif
3861
3862static I32
3863read_e_script(pTHXo_ int idx, SV *buf_sv, int maxlen)
3864{
3865 char *p, *nl;
3866 p = SvPVX(PL_e_script);
3867 nl = strchr(p, '\n');
3868 nl = (nl) ? nl+1 : SvEND(PL_e_script);
3869 if (nl-p == 0) {
3870 filter_del(read_e_script);
3871 return 0;
3872 }
3873 sv_catpvn(buf_sv, p, nl-p);
3874 sv_chop(PL_e_script, nl);
3875 return 1;
3876}