This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Shave off the explict 1; from the end of lib/Config.pm
[perl5.git] / perl.c
CommitLineData
a0d0e21e
LW
1/* perl.c
2 *
4bb101f2 3 * Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999,
770526c1 4 * 2000, 2001, 2002, 2003, 2004, 2005, by Larry Wall and others
a687059c 5 *
352d5a3a
LW
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
a687059c 8 *
8d063cd8
LW
9 */
10
a0d0e21e
LW
11/*
12 * "A ship then new they built for him/of mithril and of elven glass" --Bilbo
13 */
45d8adaa 14
166f8a29
DM
15/* This file contains the top-level functions that are used to create, use
16 * and destroy a perl interpreter, plus the functions used by XS code to
17 * call back into perl. Note that it does not contain the actual main()
ddfa107c 18 * function of the interpreter; that can be found in perlmain.c
166f8a29
DM
19 */
20
ae3f3efd
PS
21/* PSz 12 Nov 03
22 *
23 * Be proud that perl(1) may proclaim:
24 * Setuid Perl scripts are safer than C programs ...
25 * Do not abandon (deprecate) suidperl. Do not advocate C wrappers.
26 *
27 * The flow was: perl starts, notices script is suid, execs suidperl with same
28 * arguments; suidperl opens script, checks many things, sets itself with
29 * right UID, execs perl with similar arguments but with script pre-opened on
30 * /dev/fd/xxx; perl checks script is as should be and does work. This was
31 * insecure: see perlsec(1) for many problems with this approach.
32 *
33 * The "correct" flow should be: perl starts, opens script and notices it is
34 * suid, checks many things, execs suidperl with similar arguments but with
35 * script on /dev/fd/xxx; suidperl checks script and /dev/fd/xxx object are
36 * same, checks arguments match #! line, sets itself with right UID, execs
37 * perl with same arguments; perl checks many things and does work.
38 *
39 * (Opening the script in perl instead of suidperl, we "lose" scripts that
40 * are readable to the target UID but not to the invoker. Where did
41 * unreadable scripts work anyway?)
42 *
43 * For now, suidperl and perl are pretty much the same large and cumbersome
44 * program, so suidperl can check its argument list (see comments elsewhere).
45 *
46 * References:
47 * Original bug report:
48 * http://bugs.perl.org/index.html?req=bug_id&bug_id=20010322.218
49 * http://rt.perl.org/rt2/Ticket/Display.html?id=6511
50 * Comments and discussion with Debian:
51 * http://bugs.debian.org/203426
52 * http://bugs.debian.org/220486
53 * Debian Security Advisory DSA 431-1 (does not fully fix problem):
54 * http://www.debian.org/security/2004/dsa-431
55 * CVE candidate:
56 * http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2003-0618
57 * Previous versions of this patch sent to perl5-porters:
58 * http://www.mail-archive.com/perl5-porters@perl.org/msg71953.html
59 * http://www.mail-archive.com/perl5-porters@perl.org/msg75245.html
60 * http://www.mail-archive.com/perl5-porters@perl.org/msg75563.html
61 * http://www.mail-archive.com/perl5-porters@perl.org/msg75635.html
62 *
63Paul Szabo - psz@maths.usyd.edu.au http://www.maths.usyd.edu.au:8000/u/psz/
64School of Mathematics and Statistics University of Sydney 2006 Australia
65 *
66 */
67/* PSz 13 Nov 03
68 * Use truthful, neat, specific error messages.
69 * Cannot always hide the truth; security must not depend on doing so.
70 */
71
72/* PSz 18 Feb 04
73 * Use global(?), thread-local fdscript for easier checks.
74 * (I do not understand how we could possibly get a thread race:
75 * do not all threads go through the same initialization? Or in
76 * fact, are not threads started only after we get the script and
77 * so know what to do? Oh well, make things super-safe...)
78 */
79
378cc40b 80#include "EXTERN.h"
864dbfa3 81#define PERL_IN_PERL_C
378cc40b 82#include "perl.h"
e3321bb0 83#include "patchlevel.h" /* for local_patches */
378cc40b 84
011f1a1a
JH
85#ifdef NETWARE
86#include "nwutil.h"
87char *nw_get_sitelib(const char *pl);
88#endif
89
df5cef82 90/* XXX If this causes problems, set i_unistd=undef in the hint file. */
a0d0e21e
LW
91#ifdef I_UNISTD
92#include <unistd.h>
93#endif
a0d0e21e 94
5311654c
JH
95#ifdef __BEOS__
96# define HZ 1000000
97#endif
98
99#ifndef HZ
100# ifdef CLK_TCK
101# define HZ CLK_TCK
102# else
103# define HZ 60
104# endif
105#endif
106
7114a2d2 107#if !defined(STANDARD_C) && !defined(HAS_GETENV_PROTOTYPE) && !defined(PERL_MICRO)
20ce7b12 108char *getenv (char *); /* Usually in <stdlib.h> */
54310121 109#endif
110
acfe0abc 111static I32 read_e_script(pTHX_ int idx, SV *buf_sv, int maxlen);
0cb96387 112
a687059c
LW
113#ifdef IAMSUID
114#ifndef DOSUID
115#define DOSUID
116#endif
ae3f3efd 117#endif /* IAMSUID */
378cc40b 118
a687059c
LW
119#ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
120#ifdef DOSUID
121#undef DOSUID
122#endif
123#endif
8d063cd8 124
3db8f154 125#if defined(USE_ITHREADS)
06d86050
GS
126# define INIT_TLS_AND_INTERP \
127 STMT_START { \
128 if (!PL_curinterp) { \
129 PERL_SET_INTERP(my_perl); \
130 INIT_THREADS; \
131 ALLOC_THREAD_KEY; \
534825c4
GS
132 PERL_SET_THX(my_perl); \
133 OP_REFCNT_INIT; \
7d4724a4 134 MUTEX_INIT(&PL_dollarzero_mutex); \
534825c4
GS
135 } \
136 else { \
137 PERL_SET_THX(my_perl); \
06d86050 138 } \
06d86050 139 } STMT_END
3db8f154 140#else
06d86050
GS
141# define INIT_TLS_AND_INTERP \
142 STMT_START { \
143 if (!PL_curinterp) { \
144 PERL_SET_INTERP(my_perl); \
145 } \
146 PERL_SET_THX(my_perl); \
147 } STMT_END
148# endif
06d86050 149
32e30700
GS
150#ifdef PERL_IMPLICIT_SYS
151PerlInterpreter *
7766f137
GS
152perl_alloc_using(struct IPerlMem* ipM, struct IPerlMem* ipMS,
153 struct IPerlMem* ipMP, struct IPerlEnv* ipE,
32e30700
GS
154 struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
155 struct IPerlDir* ipD, struct IPerlSock* ipS,
156 struct IPerlProc* ipP)
157{
158 PerlInterpreter *my_perl;
32e30700
GS
159 /* New() needs interpreter, so call malloc() instead */
160 my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
06d86050 161 INIT_TLS_AND_INTERP;
32e30700
GS
162 Zero(my_perl, 1, PerlInterpreter);
163 PL_Mem = ipM;
7766f137
GS
164 PL_MemShared = ipMS;
165 PL_MemParse = ipMP;
32e30700
GS
166 PL_Env = ipE;
167 PL_StdIO = ipStd;
168 PL_LIO = ipLIO;
169 PL_Dir = ipD;
170 PL_Sock = ipS;
171 PL_Proc = ipP;
7766f137 172
32e30700
GS
173 return my_perl;
174}
175#else
954c1994
GS
176
177/*
ccfc67b7
JH
178=head1 Embedding Functions
179
954c1994
GS
180=for apidoc perl_alloc
181
182Allocates a new Perl interpreter. See L<perlembed>.
183
184=cut
185*/
186
93a17b20 187PerlInterpreter *
cea2e8a9 188perl_alloc(void)
79072805 189{
cea2e8a9 190 PerlInterpreter *my_perl;
35d7cf2c
JH
191#ifdef USE_5005THREADS
192 dTHX;
193#endif
79072805 194
54aff467 195 /* New() needs interpreter, so call malloc() instead */
e8ee3774 196 my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
ba869deb 197
06d86050 198 INIT_TLS_AND_INTERP;
e90e2364 199 return ZeroD(my_perl, 1, PerlInterpreter);
79072805 200}
32e30700 201#endif /* PERL_IMPLICIT_SYS */
79072805 202
954c1994
GS
203/*
204=for apidoc perl_construct
205
206Initializes a new Perl interpreter. See L<perlembed>.
207
208=cut
209*/
210
79072805 211void
0cb96387 212perl_construct(pTHXx)
79072805 213{
8990e307 214#ifdef MULTIPLICITY
54aff467 215 init_interp();
ac27b0f5 216 PL_perl_destruct_level = 1;
54aff467
GS
217#else
218 if (PL_perl_destruct_level > 0)
219 init_interp();
220#endif
33f46ff6 221 /* Init the real globals (and main thread)? */
3280af22 222 if (!PL_linestr) {
14dd3ad8 223#ifdef PERL_FLEXIBLE_EXCEPTIONS
0b94c7bb 224 PL_protect = MEMBER_TO_FPTR(Perl_default_protect); /* for exceptions */
14dd3ad8 225#endif
312caa8e 226
2aea9f8a
GS
227 PL_curcop = &PL_compiling; /* needed by ckWARN, right away */
228
3280af22
NIS
229 PL_linestr = NEWSV(65,79);
230 sv_upgrade(PL_linestr,SVt_PVIV);
79072805 231
3280af22 232 if (!SvREADONLY(&PL_sv_undef)) {
d689ffdd
JP
233 /* set read-only and try to insure than we wont see REFCNT==0
234 very often */
235
3280af22
NIS
236 SvREADONLY_on(&PL_sv_undef);
237 SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
79072805 238
3280af22 239 sv_setpv(&PL_sv_no,PL_No);
0309f36e
NC
240 /* value lookup in void context - happens to have the side effect
241 of caching the numeric forms. */
242 SvIV(&PL_sv_no);
3280af22
NIS
243 SvNV(&PL_sv_no);
244 SvREADONLY_on(&PL_sv_no);
245 SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
79072805 246
3280af22 247 sv_setpv(&PL_sv_yes,PL_Yes);
0309f36e 248 SvIV(&PL_sv_yes);
3280af22
NIS
249 SvNV(&PL_sv_yes);
250 SvREADONLY_on(&PL_sv_yes);
251 SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
7996736c
MHM
252
253 SvREADONLY_on(&PL_sv_placeholder);
254 SvREFCNT(&PL_sv_placeholder) = (~(U32)0)/2;
6e72f9df 255 }
79072805 256
cea2e8a9 257 PL_sighandlerp = Perl_sighandler;
3280af22 258 PL_pidstatus = newHV();
79072805
LW
259 }
260
8bfdd7d9 261 PL_rs = newSVpvn("\n", 1);
dc92893f 262
cea2e8a9 263 init_stacks();
79072805 264
748a9306 265 init_ids();
3280af22 266 PL_lex_state = LEX_NOTPARSING;
a5f75d66 267
312caa8e 268 JMPENV_BOOTSTRAP;
f86702cc 269 STATUS_ALL_SUCCESS;
270
0672f40e 271 init_i18nl10n(1);
36477c24 272 SET_NUMERIC_STANDARD();
0b5b802d 273
ab821d7f 274#if defined(LOCAL_PATCH_COUNT)
3280af22 275 PL_localpatches = local_patches; /* For possible -v */
ab821d7f 276#endif
277
52853b95
GS
278#ifdef HAVE_INTERP_INTERN
279 sys_intern_init();
280#endif
281
3a1ee7e8 282 PerlIO_init(aTHX); /* Hook to IO system */
760ac839 283
3280af22
NIS
284 PL_fdpid = newAV(); /* for remembering popen pids by fd */
285 PL_modglobal = newHV(); /* pointers to per-interpreter module globals */
24944567 286 PL_errors = newSVpvn("",0);
48c6b404 287 sv_setpvn(PERL_DEBUG_PAD(0), "", 0); /* For regex debugging. */
1f483ca1
JH
288 sv_setpvn(PERL_DEBUG_PAD(1), "", 0); /* ext/re needs these */
289 sv_setpvn(PERL_DEBUG_PAD(2), "", 0); /* even without DEBUGGING. */
1fcf4c12 290#ifdef USE_ITHREADS
13137afc
AB
291 PL_regex_padav = newAV();
292 av_push(PL_regex_padav,(SV*)newAV()); /* First entry is an array of empty elements */
293 PL_regex_pad = AvARRAY(PL_regex_padav);
1fcf4c12 294#endif
e5dd39fc 295#ifdef USE_REENTRANT_API
59bd0823 296 Perl_reentrant_init(aTHX);
e5dd39fc 297#endif
3d47000e
AB
298
299 /* Note that strtab is a rather special HV. Assumptions are made
300 about not iterating on it, and not adding tie magic to it.
301 It is properly deallocated in perl_destruct() */
302 PL_strtab = newHV();
303
3d47000e
AB
304 HvSHAREKEYS_off(PL_strtab); /* mandatory */
305 hv_ksplit(PL_strtab, 512);
306
0631ea03
AB
307#if defined(__DYNAMIC__) && (defined(NeXT) || defined(__NeXT__))
308 _dyld_lookup_and_bind
309 ("__environ", (unsigned long *) &environ_pointer, NULL);
310#endif /* environ */
311
2f42fcb0
JH
312#ifndef PERL_MICRO
313# ifdef USE_ENVIRON_ARRAY
0631ea03 314 PL_origenviron = environ;
2f42fcb0 315# endif
0631ea03
AB
316#endif
317
5311654c 318 /* Use sysconf(_SC_CLK_TCK) if available, if not
dbc1d986
IW
319 * available or if the sysconf() fails, use the HZ.
320 * BeOS has those, but returns the wrong value. */
321#if defined(HAS_SYSCONF) && defined(_SC_CLK_TCK) && !defined(__BEOS__)
5311654c
JH
322 PL_clocktick = sysconf(_SC_CLK_TCK);
323 if (PL_clocktick <= 0)
324#endif
325 PL_clocktick = HZ;
326
081fc587
AB
327 PL_stashcache = newHV();
328
d7aa5382
JP
329 PL_patchlevel = newSVpv(
330 Perl_form(aTHX_ "%d.%d.%d",
331 (int)PERL_REVISION,
332 (int)PERL_VERSION,
333 (int)PERL_SUBVERSION ), 0
334 );
335
8990e307 336 ENTER;
79072805
LW
337}
338
954c1994 339/*
62375a60
NIS
340=for apidoc nothreadhook
341
342Stub that provides thread hook for perl_destruct when there are
343no threads.
344
345=cut
346*/
347
348int
4e9e3734 349Perl_nothreadhook(pTHX)
62375a60
NIS
350{
351 return 0;
352}
353
354/*
954c1994
GS
355=for apidoc perl_destruct
356
357Shuts down a Perl interpreter. See L<perlembed>.
358
359=cut
360*/
361
31d77e54 362int
0cb96387 363perl_destruct(pTHXx)
79072805 364{
7c474504 365 volatile int destruct_level; /* 0=none, 1=full, 2=full with checks */
a0d0e21e 366 HV *hv;
4d1ff10f 367#ifdef USE_5005THREADS
cea2e8a9 368 dTHX;
4d1ff10f 369#endif /* USE_5005THREADS */
8990e307 370
7766f137
GS
371 /* wait for all pseudo-forked children to finish */
372 PERL_WAIT_FOR_CHILDREN;
373
3280af22 374 destruct_level = PL_perl_destruct_level;
4633a7c4
LW
375#ifdef DEBUGGING
376 {
377 char *s;
155aba94 378 if ((s = PerlEnv_getenv("PERL_DESTRUCT_LEVEL"))) {
5f05dabc 379 int i = atoi(s);
380 if (destruct_level < i)
381 destruct_level = i;
382 }
4633a7c4
LW
383 }
384#endif
385
31d77e54
AB
386
387 if(PL_exit_flags & PERL_EXIT_DESTRUCT_END) {
f3faeb53
AB
388 dJMPENV;
389 int x = 0;
390
391 JMPENV_PUSH(x);
392 if (PL_endav && !PL_minus_c)
393 call_list(PL_scopestack_ix, PL_endav);
394 JMPENV_POP;
26f423df 395 }
f3faeb53 396 LEAVE;
a0d0e21e
LW
397 FREETMPS;
398
e00b64d4 399 /* Need to flush since END blocks can produce output */
f13a2bc0 400 my_fflush_all();
e00b64d4 401
62375a60
NIS
402 if (CALL_FPTR(PL_threadhook)(aTHX)) {
403 /* Threads hook has vetoed further cleanup */
b47cad08 404 return STATUS_NATIVE_EXPORT;
62375a60
NIS
405 }
406
ff0cee69 407 /* We must account for everything. */
408
409 /* Destroy the main CV and syntax tree */
3280af22 410 if (PL_main_root) {
4e380990
DM
411 /* ensure comppad/curpad to refer to main's pad */
412 if (CvPADLIST(PL_main_cv)) {
413 PAD_SET_CUR_NOSAVE(CvPADLIST(PL_main_cv), 1);
414 }
3280af22
NIS
415 op_free(PL_main_root);
416 PL_main_root = Nullop;
a0d0e21e 417 }
3280af22
NIS
418 PL_curcop = &PL_compiling;
419 PL_main_start = Nullop;
420 SvREFCNT_dec(PL_main_cv);
421 PL_main_cv = Nullcv;
24d3c518 422 PL_dirty = TRUE;
ff0cee69 423
13621cfb
NIS
424 /* Tell PerlIO we are about to tear things apart in case
425 we have layers which are using resources that should
426 be cleaned up now.
427 */
428
429 PerlIO_destruct(aTHX);
430
3280af22 431 if (PL_sv_objcount) {
a0d0e21e
LW
432 /*
433 * Try to destruct global references. We do this first so that the
434 * destructors and destructees still exist. Some sv's might remain.
435 * Non-referenced objects are on their own.
436 */
a0d0e21e 437 sv_clean_objs();
bf9cdc68 438 PL_sv_objcount = 0;
8990e307
LW
439 }
440
5cd24f17 441 /* unhook hooks which will soon be, or use, destroyed data */
3280af22
NIS
442 SvREFCNT_dec(PL_warnhook);
443 PL_warnhook = Nullsv;
444 SvREFCNT_dec(PL_diehook);
445 PL_diehook = Nullsv;
5cd24f17 446
4b556e6c 447 /* call exit list functions */
3280af22 448 while (PL_exitlistlen-- > 0)
acfe0abc 449 PL_exitlist[PL_exitlistlen].fn(aTHX_ PL_exitlist[PL_exitlistlen].ptr);
4b556e6c 450
3280af22 451 Safefree(PL_exitlist);
4b556e6c 452
1c4916e5
CB
453 PL_exitlist = NULL;
454 PL_exitlistlen = 0;
455
a0d0e21e 456 if (destruct_level == 0){
8990e307 457
a0d0e21e 458 DEBUG_P(debprofdump());
ac27b0f5 459
56a2bab7
NIS
460#if defined(PERLIO_LAYERS)
461 /* No more IO - including error messages ! */
462 PerlIO_cleanup(aTHX);
463#endif
464
a0d0e21e 465 /* The exit() function will do everything that needs doing. */
b47cad08 466 return STATUS_NATIVE_EXPORT;
a0d0e21e 467 }
5dd60ef7 468
551a8b83 469 /* jettison our possibly duplicated environment */
4b647fb0
DM
470 /* if PERL_USE_SAFE_PUTENV is defined environ will not have been copied
471 * so we certainly shouldn't free it here
472 */
2f42fcb0 473#ifndef PERL_MICRO
4b647fb0 474#if defined(USE_ENVIRON_ARRAY) && !defined(PERL_USE_SAFE_PUTENV)
50acdf95 475 if (environ != PL_origenviron && !PL_use_safe_putenv
4efc5df6
GS
476#ifdef USE_ITHREADS
477 /* only main thread can free environ[0] contents */
478 && PL_curinterp == aTHX
479#endif
480 )
481 {
551a8b83
JH
482 I32 i;
483
484 for (i = 0; environ[i]; i++)
4b420006 485 safesysfree(environ[i]);
0631ea03 486
4b420006
JH
487 /* Must use safesysfree() when working with environ. */
488 safesysfree(environ);
551a8b83
JH
489
490 environ = PL_origenviron;
491 }
492#endif
2f42fcb0 493#endif /* !PERL_MICRO */
551a8b83 494
804ffa60
DM
495 /* reset so print() ends up where we expect */
496 setdefout(Nullgv);
497
5f8cb046
DM
498#ifdef USE_ITHREADS
499 /* the syntax tree is shared between clones
500 * so op_free(PL_main_root) only ReREFCNT_dec's
501 * REGEXPs in the parent interpreter
502 * we need to manually ReREFCNT_dec for the clones
503 */
504 {
505 I32 i = AvFILLp(PL_regex_padav) + 1;
506 SV **ary = AvARRAY(PL_regex_padav);
507
508 while (i) {
35061a7e 509 SV *resv = ary[--i];
ba89bb6e 510 REGEXP *re = INT2PTR(REGEXP *,SvIVX(resv));
35061a7e
DM
511
512 if (SvFLAGS(resv) & SVf_BREAK) {
577e12cc 513 /* this is PL_reg_curpm, already freed
35061a7e
DM
514 * flag is set in regexec.c:S_regtry
515 */
516 SvFLAGS(resv) &= ~SVf_BREAK;
3a1ee7e8 517 }
1cc8b4c5
AB
518 else if(SvREPADTMP(resv)) {
519 SvREPADTMP_off(resv);
520 }
35061a7e 521 else {
5f8cb046
DM
522 ReREFCNT_dec(re);
523 }
524 }
525 }
526 SvREFCNT_dec(PL_regex_padav);
527 PL_regex_padav = Nullav;
528 PL_regex_pad = NULL;
529#endif
530
081fc587
AB
531 SvREFCNT_dec((SV*) PL_stashcache);
532 PL_stashcache = NULL;
533
5f05dabc 534 /* loosen bonds of global variables */
535
3280af22
NIS
536 if(PL_rsfp) {
537 (void)PerlIO_close(PL_rsfp);
538 PL_rsfp = Nullfp;
8ebc5c01 539 }
540
541 /* Filters for program text */
3280af22
NIS
542 SvREFCNT_dec(PL_rsfp_filters);
543 PL_rsfp_filters = Nullav;
8ebc5c01 544
545 /* switches */
3280af22
NIS
546 PL_preprocess = FALSE;
547 PL_minus_n = FALSE;
548 PL_minus_p = FALSE;
549 PL_minus_l = FALSE;
550 PL_minus_a = FALSE;
551 PL_minus_F = FALSE;
552 PL_doswitches = FALSE;
599cee73 553 PL_dowarn = G_WARN_OFF;
3280af22
NIS
554 PL_doextract = FALSE;
555 PL_sawampersand = FALSE; /* must save all match strings */
3280af22
NIS
556 PL_unsafe = FALSE;
557
558 Safefree(PL_inplace);
559 PL_inplace = Nullch;
a7cb1f99 560 SvREFCNT_dec(PL_patchlevel);
3280af22
NIS
561
562 if (PL_e_script) {
563 SvREFCNT_dec(PL_e_script);
564 PL_e_script = Nullsv;
8ebc5c01 565 }
566
bf9cdc68
RG
567 PL_perldb = 0;
568
8ebc5c01 569 /* magical thingies */
570
7889fe52
NIS
571 SvREFCNT_dec(PL_ofs_sv); /* $, */
572 PL_ofs_sv = Nullsv;
5f05dabc 573
7889fe52
NIS
574 SvREFCNT_dec(PL_ors_sv); /* $\ */
575 PL_ors_sv = Nullsv;
8ebc5c01 576
3280af22
NIS
577 SvREFCNT_dec(PL_rs); /* $/ */
578 PL_rs = Nullsv;
dc92893f 579
d33b2eba
GS
580 PL_multiline = 0; /* $* */
581 Safefree(PL_osname); /* $^O */
582 PL_osname = Nullch;
5f05dabc 583
3280af22
NIS
584 SvREFCNT_dec(PL_statname);
585 PL_statname = Nullsv;
586 PL_statgv = Nullgv;
5f05dabc 587
8ebc5c01 588 /* defgv, aka *_ should be taken care of elsewhere */
589
8ebc5c01 590 /* clean up after study() */
3280af22
NIS
591 SvREFCNT_dec(PL_lastscream);
592 PL_lastscream = Nullsv;
593 Safefree(PL_screamfirst);
594 PL_screamfirst = 0;
595 Safefree(PL_screamnext);
596 PL_screamnext = 0;
8ebc5c01 597
7d5ea4e7
GS
598 /* float buffer */
599 Safefree(PL_efloatbuf);
600 PL_efloatbuf = Nullch;
601 PL_efloatsize = 0;
602
8ebc5c01 603 /* startup and shutdown function lists */
3280af22 604 SvREFCNT_dec(PL_beginav);
5a837c8f 605 SvREFCNT_dec(PL_beginav_save);
3280af22 606 SvREFCNT_dec(PL_endav);
7d30b5c4 607 SvREFCNT_dec(PL_checkav);
ece599bd 608 SvREFCNT_dec(PL_checkav_save);
3280af22
NIS
609 SvREFCNT_dec(PL_initav);
610 PL_beginav = Nullav;
5a837c8f 611 PL_beginav_save = Nullav;
3280af22 612 PL_endav = Nullav;
7d30b5c4 613 PL_checkav = Nullav;
ece599bd 614 PL_checkav_save = Nullav;
3280af22 615 PL_initav = Nullav;
5618dfe8 616
8ebc5c01 617 /* shortcuts just get cleared */
3280af22 618 PL_envgv = Nullgv;
3280af22
NIS
619 PL_incgv = Nullgv;
620 PL_hintgv = Nullgv;
621 PL_errgv = Nullgv;
622 PL_argvgv = Nullgv;
623 PL_argvoutgv = Nullgv;
624 PL_stdingv = Nullgv;
bf49b057 625 PL_stderrgv = Nullgv;
3280af22
NIS
626 PL_last_in_gv = Nullgv;
627 PL_replgv = Nullgv;
bf9cdc68
RG
628 PL_DBgv = Nullgv;
629 PL_DBline = Nullgv;
630 PL_DBsub = Nullgv;
631 PL_DBsingle = Nullsv;
632 PL_DBtrace = Nullsv;
633 PL_DBsignal = Nullsv;
634 PL_DBassertion = Nullsv;
635 PL_DBcv = Nullcv;
636 PL_dbargs = Nullav;
5c831c24 637 PL_debstash = Nullhv;
8ebc5c01 638
7a1c5554
GS
639 SvREFCNT_dec(PL_argvout_stack);
640 PL_argvout_stack = Nullav;
8ebc5c01 641
5c831c24
GS
642 SvREFCNT_dec(PL_modglobal);
643 PL_modglobal = Nullhv;
644 SvREFCNT_dec(PL_preambleav);
645 PL_preambleav = Nullav;
646 SvREFCNT_dec(PL_subname);
647 PL_subname = Nullsv;
648 SvREFCNT_dec(PL_linestr);
649 PL_linestr = Nullsv;
650 SvREFCNT_dec(PL_pidstatus);
651 PL_pidstatus = Nullhv;
652 SvREFCNT_dec(PL_toptarget);
653 PL_toptarget = Nullsv;
654 SvREFCNT_dec(PL_bodytarget);
655 PL_bodytarget = Nullsv;
656 PL_formtarget = Nullsv;
657
d33b2eba 658 /* free locale stuff */
b9582b6a 659#ifdef USE_LOCALE_COLLATE
d33b2eba
GS
660 Safefree(PL_collation_name);
661 PL_collation_name = Nullch;
b9582b6a 662#endif
d33b2eba 663
b9582b6a 664#ifdef USE_LOCALE_NUMERIC
d33b2eba
GS
665 Safefree(PL_numeric_name);
666 PL_numeric_name = Nullch;
a453c169 667 SvREFCNT_dec(PL_numeric_radix_sv);
bf9cdc68 668 PL_numeric_radix_sv = Nullsv;
b9582b6a 669#endif
d33b2eba 670
5c831c24
GS
671 /* clear utf8 character classes */
672 SvREFCNT_dec(PL_utf8_alnum);
673 SvREFCNT_dec(PL_utf8_alnumc);
674 SvREFCNT_dec(PL_utf8_ascii);
675 SvREFCNT_dec(PL_utf8_alpha);
676 SvREFCNT_dec(PL_utf8_space);
677 SvREFCNT_dec(PL_utf8_cntrl);
678 SvREFCNT_dec(PL_utf8_graph);
679 SvREFCNT_dec(PL_utf8_digit);
680 SvREFCNT_dec(PL_utf8_upper);
681 SvREFCNT_dec(PL_utf8_lower);
682 SvREFCNT_dec(PL_utf8_print);
683 SvREFCNT_dec(PL_utf8_punct);
684 SvREFCNT_dec(PL_utf8_xdigit);
685 SvREFCNT_dec(PL_utf8_mark);
686 SvREFCNT_dec(PL_utf8_toupper);
4dbdbdc2 687 SvREFCNT_dec(PL_utf8_totitle);
5c831c24 688 SvREFCNT_dec(PL_utf8_tolower);
b4e400f9 689 SvREFCNT_dec(PL_utf8_tofold);
82686b01
JH
690 SvREFCNT_dec(PL_utf8_idstart);
691 SvREFCNT_dec(PL_utf8_idcont);
5c831c24
GS
692 PL_utf8_alnum = Nullsv;
693 PL_utf8_alnumc = Nullsv;
694 PL_utf8_ascii = Nullsv;
695 PL_utf8_alpha = Nullsv;
696 PL_utf8_space = Nullsv;
697 PL_utf8_cntrl = Nullsv;
698 PL_utf8_graph = Nullsv;
699 PL_utf8_digit = Nullsv;
700 PL_utf8_upper = Nullsv;
701 PL_utf8_lower = Nullsv;
702 PL_utf8_print = Nullsv;
703 PL_utf8_punct = Nullsv;
704 PL_utf8_xdigit = Nullsv;
705 PL_utf8_mark = Nullsv;
706 PL_utf8_toupper = Nullsv;
707 PL_utf8_totitle = Nullsv;
708 PL_utf8_tolower = Nullsv;
b4e400f9 709 PL_utf8_tofold = Nullsv;
82686b01
JH
710 PL_utf8_idstart = Nullsv;
711 PL_utf8_idcont = Nullsv;
5c831c24 712
971a9dd3
GS
713 if (!specialWARN(PL_compiling.cop_warnings))
714 SvREFCNT_dec(PL_compiling.cop_warnings);
5c831c24 715 PL_compiling.cop_warnings = Nullsv;
ac27b0f5
NIS
716 if (!specialCopIO(PL_compiling.cop_io))
717 SvREFCNT_dec(PL_compiling.cop_io);
718 PL_compiling.cop_io = Nullsv;
05ec9bb3
NIS
719 CopFILE_free(&PL_compiling);
720 CopSTASH_free(&PL_compiling);
5c831c24 721
a0d0e21e 722 /* Prepare to destruct main symbol table. */
5f05dabc 723
3280af22
NIS
724 hv = PL_defstash;
725 PL_defstash = 0;
a0d0e21e 726 SvREFCNT_dec(hv);
5c831c24
GS
727 SvREFCNT_dec(PL_curstname);
728 PL_curstname = Nullsv;
a0d0e21e 729
5a844595
GS
730 /* clear queued errors */
731 SvREFCNT_dec(PL_errors);
732 PL_errors = Nullsv;
733
a0d0e21e 734 FREETMPS;
0453d815 735 if (destruct_level >= 2 && ckWARN_d(WARN_INTERNAL)) {
3280af22 736 if (PL_scopestack_ix != 0)
9014280d 737 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
0453d815 738 "Unbalanced scopes: %ld more ENTERs than LEAVEs\n",
3280af22
NIS
739 (long)PL_scopestack_ix);
740 if (PL_savestack_ix != 0)
9014280d 741 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
0453d815 742 "Unbalanced saves: %ld more saves than restores\n",
3280af22
NIS
743 (long)PL_savestack_ix);
744 if (PL_tmps_floor != -1)
9014280d 745 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),"Unbalanced tmps: %ld more allocs than frees\n",
3280af22 746 (long)PL_tmps_floor + 1);
a0d0e21e 747 if (cxstack_ix != -1)
9014280d 748 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),"Unbalanced context: %ld more PUSHes than POPs\n",
ff0cee69 749 (long)cxstack_ix + 1);
a0d0e21e 750 }
8990e307
LW
751
752 /* Now absolutely destruct everything, somehow or other, loops or no. */
d33b2eba 753 SvFLAGS(PL_fdpid) |= SVTYPEMASK; /* don't clean out pid table now */
3280af22 754 SvFLAGS(PL_strtab) |= SVTYPEMASK; /* don't clean out strtab now */
5226ed68
JH
755
756 /* the 2 is for PL_fdpid and PL_strtab */
757 while (PL_sv_count > 2 && sv_clean_all())
758 ;
759
d33b2eba
GS
760 SvFLAGS(PL_fdpid) &= ~SVTYPEMASK;
761 SvFLAGS(PL_fdpid) |= SVt_PVAV;
3280af22
NIS
762 SvFLAGS(PL_strtab) &= ~SVTYPEMASK;
763 SvFLAGS(PL_strtab) |= SVt_PVHV;
d33b2eba 764
d4777f27
GS
765 AvREAL_off(PL_fdpid); /* no surviving entries */
766 SvREFCNT_dec(PL_fdpid); /* needed in io_close() */
d33b2eba
GS
767 PL_fdpid = Nullav;
768
6c644e78
GS
769#ifdef HAVE_INTERP_INTERN
770 sys_intern_clear();
771#endif
772
6e72f9df 773 /* Destruct the global string table. */
774 {
775 /* Yell and reset the HeVAL() slots that are still holding refcounts,
776 * so that sv_free() won't fail on them.
777 */
778 I32 riter;
779 I32 max;
780 HE *hent;
781 HE **array;
782
783 riter = 0;
3280af22
NIS
784 max = HvMAX(PL_strtab);
785 array = HvARRAY(PL_strtab);
6e72f9df 786 hent = array[0];
787 for (;;) {
0453d815 788 if (hent && ckWARN_d(WARN_INTERNAL)) {
9014280d 789 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
0453d815 790 "Unbalanced string table refcount: (%d) for \"%s\"",
6e72f9df 791 HeVAL(hent) - Nullsv, HeKEY(hent));
792 HeVAL(hent) = Nullsv;
793 hent = HeNEXT(hent);
794 }
795 if (!hent) {
796 if (++riter > max)
797 break;
798 hent = array[riter];
799 }
800 }
801 }
3280af22 802 SvREFCNT_dec(PL_strtab);
6e72f9df 803
e652bb2f 804#ifdef USE_ITHREADS
a0739874
DM
805 /* free the pointer table used for cloning */
806 ptr_table_free(PL_ptr_table);
bf9cdc68 807 PL_ptr_table = (PTR_TBL_t*)NULL;
53186e96 808#endif
a0739874 809
d33b2eba
GS
810 /* free special SVs */
811
812 SvREFCNT(&PL_sv_yes) = 0;
813 sv_clear(&PL_sv_yes);
814 SvANY(&PL_sv_yes) = NULL;
4c5e2b0d 815 SvFLAGS(&PL_sv_yes) = 0;
d33b2eba
GS
816
817 SvREFCNT(&PL_sv_no) = 0;
818 sv_clear(&PL_sv_no);
819 SvANY(&PL_sv_no) = NULL;
4c5e2b0d 820 SvFLAGS(&PL_sv_no) = 0;
01724ea0 821
9f375a43
DM
822 {
823 int i;
824 for (i=0; i<=2; i++) {
825 SvREFCNT(PERL_DEBUG_PAD(i)) = 0;
826 sv_clear(PERL_DEBUG_PAD(i));
827 SvANY(PERL_DEBUG_PAD(i)) = NULL;
828 SvFLAGS(PERL_DEBUG_PAD(i)) = 0;
829 }
830 }
831
0453d815 832 if (PL_sv_count != 0 && ckWARN_d(WARN_INTERNAL))
9014280d 833 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),"Scalars leaked: %ld\n", (long)PL_sv_count);
6e72f9df 834
eba0f806
DM
835#ifdef DEBUG_LEAKING_SCALARS
836 if (PL_sv_count != 0) {
837 SV* sva;
838 SV* sv;
839 register SV* svend;
840
841 for (sva = PL_sv_arenaroot; sva; sva = (SV*)SvANY(sva)) {
842 svend = &sva[SvREFCNT(sva)];
843 for (sv = sva + 1; sv < svend; ++sv) {
844 if (SvTYPE(sv) != SVTYPEMASK) {
a548cda8
DM
845 PerlIO_printf(Perl_debug_log, "leaked: sv=0x%p"
846 " flags=0x08%"UVxf
847 " refcnt=%"UVuf pTHX__FORMAT "\n",
848 sv, sv->sv_flags, sv->sv_refcnt pTHX__VALUE);
eba0f806
DM
849 }
850 }
851 }
852 }
853#endif
bf9cdc68 854 PL_sv_count = 0;
eba0f806
DM
855
856
56a2bab7 857#if defined(PERLIO_LAYERS)
3a1ee7e8
NIS
858 /* No more IO - including error messages ! */
859 PerlIO_cleanup(aTHX);
860#endif
861
9f4bd222
NIS
862 /* sv_undef needs to stay immortal until after PerlIO_cleanup
863 as currently layers use it rather than Nullsv as a marker
864 for no arg - and will try and SvREFCNT_dec it.
865 */
866 SvREFCNT(&PL_sv_undef) = 0;
867 SvREADONLY_off(&PL_sv_undef);
868
3280af22 869 Safefree(PL_origfilename);
bf9cdc68 870 PL_origfilename = Nullch;
3280af22 871 Safefree(PL_reg_start_tmp);
bf9cdc68
RG
872 PL_reg_start_tmp = (char**)NULL;
873 PL_reg_start_tmpl = 0;
5c5e4c24
IZ
874 if (PL_reg_curpm)
875 Safefree(PL_reg_curpm);
82ba1be6 876 Safefree(PL_reg_poscache);
dd28f7bb 877 free_tied_hv_pool();
3280af22 878 Safefree(PL_op_mask);
cf36064f 879 Safefree(PL_psig_ptr);
bf9cdc68 880 PL_psig_ptr = (SV**)NULL;
cf36064f 881 Safefree(PL_psig_name);
bf9cdc68 882 PL_psig_name = (SV**)NULL;
2c2666fc 883 Safefree(PL_bitcount);
bf9cdc68 884 PL_bitcount = Nullch;
ce08f86c 885 Safefree(PL_psig_pend);
bf9cdc68
RG
886 PL_psig_pend = (int*)NULL;
887 PL_formfeed = Nullsv;
888 Safefree(PL_ofmt);
889 PL_ofmt = Nullch;
6e72f9df 890 nuke_stacks();
bf9cdc68
RG
891 PL_tainting = FALSE;
892 PL_taint_warn = FALSE;
3280af22 893 PL_hints = 0; /* Reset hints. Should hints be per-interpreter ? */
bf9cdc68 894 PL_debug = 0;
ac27b0f5 895
a0d0e21e 896 DEBUG_P(debprofdump());
d33b2eba 897
e5dd39fc 898#ifdef USE_REENTRANT_API
10bc17b6 899 Perl_reentrant_free(aTHX);
e5dd39fc
AB
900#endif
901
612f20c3
GS
902 sv_free_arenas();
903
fc36a67e 904 /* As the absolutely last thing, free the non-arena SV for mess() */
905
3280af22 906 if (PL_mess_sv) {
9c63abab
GS
907 /* it could have accumulated taint magic */
908 if (SvTYPE(PL_mess_sv) >= SVt_PVMG) {
909 MAGIC* mg;
910 MAGIC* moremagic;
911 for (mg = SvMAGIC(PL_mess_sv); mg; mg = moremagic) {
912 moremagic = mg->mg_moremagic;
14befaf4
DM
913 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global
914 && mg->mg_len >= 0)
9c63abab
GS
915 Safefree(mg->mg_ptr);
916 Safefree(mg);
917 }
918 }
fc36a67e 919 /* we know that type >= SVt_PV */
0c34ef67 920 SvOOK_off(PL_mess_sv);
3280af22
NIS
921 Safefree(SvPVX(PL_mess_sv));
922 Safefree(SvANY(PL_mess_sv));
923 Safefree(PL_mess_sv);
924 PL_mess_sv = Nullsv;
fc36a67e 925 }
31d77e54 926 return STATUS_NATIVE_EXPORT;
79072805
LW
927}
928
954c1994
GS
929/*
930=for apidoc perl_free
931
932Releases a Perl interpreter. See L<perlembed>.
933
934=cut
935*/
936
79072805 937void
0cb96387 938perl_free(pTHXx)
79072805 939{
acfe0abc 940#if defined(WIN32) || defined(NETWARE)
ce3e5b80 941# if defined(PERL_IMPLICIT_SYS)
acfe0abc
GS
942# ifdef NETWARE
943 void *host = nw_internal_host;
944# else
945 void *host = w32_internal_host;
946# endif
ce3e5b80 947 PerlMem_free(aTHXx);
acfe0abc 948# ifdef NETWARE
011f1a1a 949 nw_delete_internal_host(host);
acfe0abc
GS
950# else
951 win32_delete_internal_host(host);
952# endif
1c0ca838
GS
953# else
954 PerlMem_free(aTHXx);
955# endif
acfe0abc
GS
956#else
957 PerlMem_free(aTHXx);
76e3520e 958#endif
79072805
LW
959}
960
4b556e6c 961void
864dbfa3 962Perl_call_atexit(pTHX_ ATEXIT_t fn, void *ptr)
4b556e6c 963{
3280af22
NIS
964 Renew(PL_exitlist, PL_exitlistlen+1, PerlExitListEntry);
965 PL_exitlist[PL_exitlistlen].fn = fn;
966 PL_exitlist[PL_exitlistlen].ptr = ptr;
967 ++PL_exitlistlen;
4b556e6c
JD
968}
969
56cf6df8
RGS
970#ifdef HAS_PROCSELFEXE
971/* This is a function so that we don't hold on to MAXPATHLEN
972 bytes of stack longer than necessary
973 */
974STATIC void
975S_procself_val(pTHX_ SV *sv, char *arg0)
976{
977 char buf[MAXPATHLEN];
978 int len = readlink(PROCSELFEXE_PATH, buf, sizeof(buf) - 1);
979
980 /* On Playstation2 Linux V1.0 (kernel 2.2.1) readlink(/proc/self/exe)
981 includes a spurious NUL which will cause $^X to fail in system
982 or backticks (this will prevent extensions from being built and
983 many tests from working). readlink is not meant to add a NUL.
984 Normal readlink works fine.
985 */
986 if (len > 0 && buf[len-1] == '\0') {
987 len--;
988 }
989
990 /* FreeBSD's implementation is acknowledged to be imperfect, sometimes
991 returning the text "unknown" from the readlink rather than the path
992 to the executable (or returning an error from the readlink). Any valid
993 path has a '/' in it somewhere, so use that to validate the result.
994 See http://www.freebsd.org/cgi/query-pr.cgi?pr=35703
995 */
996 if (len > 0 && memchr(buf, '/', len)) {
997 sv_setpvn(sv,buf,len);
998 }
999 else {
1000 sv_setpv(sv,arg0);
1001 }
1002}
1003#endif /* HAS_PROCSELFEXE */
b7975bdd
NC
1004
1005STATIC void
1006S_set_caret_X(pTHX) {
1007 GV* tmpgv = gv_fetchpv("\030",TRUE, SVt_PV); /* $^X */
1008 if (tmpgv) {
1009#ifdef HAS_PROCSELFEXE
1010 S_procself_val(aTHX_ GvSV(tmpgv), PL_origargv[0]);
1011#else
1012#ifdef OS2
1013 sv_setpv(GvSV(tmpgv), os2_execname(aTHX));
1014#else
1015 sv_setpv(GvSV(tmpgv),PL_origargv[0]);
1016#endif
1017#endif
1018 }
1019}
1020
954c1994
GS
1021/*
1022=for apidoc perl_parse
1023
1024Tells a Perl interpreter to parse a Perl script. See L<perlembed>.
1025
1026=cut
1027*/
1028
79072805 1029int
0cb96387 1030perl_parse(pTHXx_ XSINIT_t xsinit, int argc, char **argv, char **env)
8d063cd8 1031{
6224f72b 1032 I32 oldscope;
6224f72b 1033 int ret;
db36c5a1 1034 dJMPENV;
4d1ff10f 1035#ifdef USE_5005THREADS
cea2e8a9
GS
1036 dTHX;
1037#endif
8d063cd8 1038
a687059c
LW
1039#ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
1040#ifdef IAMSUID
1041#undef IAMSUID
cea2e8a9 1042 Perl_croak(aTHX_ "suidperl is no longer needed since the kernel can now execute\n\
a687059c 1043setuid perl scripts securely.\n");
ae3f3efd 1044#endif /* IAMSUID */
a687059c
LW
1045#endif
1046
b0891165
JH
1047#if defined(USE_HASH_SEED) || defined(USE_HASH_SEED_EXPLICIT)
1048 /* [perl #22371] Algorimic Complexity Attack on Perl 5.6.1, 5.8.0
103dd899 1049 * This MUST be done before any hash stores or fetches take place.
008fb0c0
NC
1050 * If you set PL_rehash_seed (and assumedly also PL_rehash_seed_set)
1051 * yourself, it is your responsibility to provide a good random seed!
830b38bd 1052 * You can also define PERL_HASH_SEED in compile time, see hv.h. */
008fb0c0
NC
1053 if (!PL_rehash_seed_set)
1054 PL_rehash_seed = get_hash_seed();
b0891165 1055 {
bed60192
JH
1056 char *s = PerlEnv_getenv("PERL_HASH_SEED_DEBUG");
1057
1058 if (s) {
1059 int i = atoi(s);
1060
1061 if (i == 1)
1062 PerlIO_printf(Perl_debug_log, "HASH_SEED = %"UVuf"\n",
008fb0c0 1063 PL_rehash_seed);
bed60192 1064 }
b0891165
JH
1065 }
1066#endif /* #if defined(USE_HASH_SEED) || defined(USE_HASH_SEED_EXPLICIT) */
1067
3280af22 1068 PL_origargc = argc;
e2975953 1069 PL_origargv = argv;
a0d0e21e 1070
54bfe034 1071 {
3cb9023d
JH
1072 /* Set PL_origalen be the sum of the contiguous argv[]
1073 * elements plus the size of the env in case that it is
e9137a8e 1074 * contiguous with the argv[]. This is used in mg.c:Perl_magic_set()
3cb9023d
JH
1075 * as the maximum modifiable length of $0. In the worst case
1076 * the area we are able to modify is limited to the size of
43c32782 1077 * the original argv[0]. (See below for 'contiguous', though.)
3cb9023d 1078 * --jhi */
84458fbf 1079 char *s = NULL;
54bfe034 1080 int i;
7d8e7db3
JH
1081 UV mask =
1082 ~(UV)(PTRSIZE == 4 ? 3 : PTRSIZE == 8 ? 7 : PTRSIZE == 16 ? 15 : 0);
43c32782
JH
1083 /* Do the mask check only if the args seem like aligned. */
1084 UV aligned =
1085 (mask < ~(UV)0) && ((PTR2UV(argv[0]) & mask) == PTR2UV(argv[0]));
1086
1087 /* See if all the arguments are contiguous in memory. Note
1088 * that 'contiguous' is a loose term because some platforms
1089 * align the argv[] and the envp[]. If the arguments look
1090 * like non-aligned, assume that they are 'strictly' or
1091 * 'traditionally' contiguous. If the arguments look like
1092 * aligned, we just check that they are within aligned
1093 * PTRSIZE bytes. As long as no system has something bizarre
1094 * like the argv[] interleaved with some other data, we are
1095 * fine. (Did I just evoke Murphy's Law?) --jhi */
c8941eeb
JH
1096 if (PL_origargv && PL_origargc >= 1 && (s = PL_origargv[0])) {
1097 while (*s) s++;
1098 for (i = 1; i < PL_origargc; i++) {
1099 if ((PL_origargv[i] == s + 1
43c32782 1100#ifdef OS2
c8941eeb 1101 || PL_origargv[i] == s + 2
43c32782 1102#endif
c8941eeb
JH
1103 )
1104 ||
1105 (aligned &&
1106 (PL_origargv[i] > s &&
1107 PL_origargv[i] <=
1108 INT2PTR(char *, PTR2UV(s + PTRSIZE) & mask)))
1109 )
1110 {
1111 s = PL_origargv[i];
1112 while (*s) s++;
1113 }
1114 else
1115 break;
54bfe034 1116 }
54bfe034 1117 }
3cb9023d 1118 /* Can we grab env area too to be used as the area for $0? */
43c32782
JH
1119 if (PL_origenviron) {
1120 if ((PL_origenviron[0] == s + 1
1121#ifdef OS2
1122 || (PL_origenviron[0] == s + 9 && (s += 8))
1123#endif
1124 )
1125 ||
1126 (aligned &&
1127 (PL_origenviron[0] > s &&
1128 PL_origenviron[0] <=
1129 INT2PTR(char *, PTR2UV(s + PTRSIZE) & mask)))
1130 )
1131 {
1132#ifndef OS2
1133 s = PL_origenviron[0];
1134 while (*s) s++;
1135#endif
1136 my_setenv("NoNe SuCh", Nullch);
1137 /* Force copy of environment. */
1138 for (i = 1; PL_origenviron[i]; i++) {
1139 if (PL_origenviron[i] == s + 1
1140 ||
1141 (aligned &&
1142 (PL_origenviron[i] > s &&
1143 PL_origenviron[i] <=
1144 INT2PTR(char *, PTR2UV(s + PTRSIZE) & mask)))
1145 )
1146 {
1147 s = PL_origenviron[i];
1148 while (*s) s++;
1149 }
1150 else
1151 break;
54bfe034 1152 }
43c32782 1153 }
54bfe034 1154 }
284e1220 1155 PL_origalen = s - PL_origargv[0] + 1;
54bfe034
JH
1156 }
1157
3280af22 1158 if (PL_do_undump) {
a0d0e21e
LW
1159
1160 /* Come here if running an undumped a.out. */
1161
3280af22
NIS
1162 PL_origfilename = savepv(argv[0]);
1163 PL_do_undump = FALSE;
a0d0e21e 1164 cxstack_ix = -1; /* start label stack again */
748a9306 1165 init_ids();
b7975bdd
NC
1166 assert (!PL_tainted);
1167 TAINT;
1168 S_set_caret_X(aTHX);
1169 TAINT_NOT;
a0d0e21e
LW
1170 init_postdump_symbols(argc,argv,env);
1171 return 0;
1172 }
1173
3280af22 1174 if (PL_main_root) {
3280af22
NIS
1175 op_free(PL_main_root);
1176 PL_main_root = Nullop;
ff0cee69 1177 }
3280af22
NIS
1178 PL_main_start = Nullop;
1179 SvREFCNT_dec(PL_main_cv);
1180 PL_main_cv = Nullcv;
79072805 1181
3280af22
NIS
1182 time(&PL_basetime);
1183 oldscope = PL_scopestack_ix;
599cee73 1184 PL_dowarn = G_WARN_OFF;
f86702cc 1185
14dd3ad8
GS
1186#ifdef PERL_FLEXIBLE_EXCEPTIONS
1187 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vparse_body), env, xsinit);
1188#else
1189 JMPENV_PUSH(ret);
1190#endif
6224f72b 1191 switch (ret) {
312caa8e 1192 case 0:
14dd3ad8
GS
1193#ifndef PERL_FLEXIBLE_EXCEPTIONS
1194 parse_body(env,xsinit);
1195#endif
7d30b5c4
GS
1196 if (PL_checkav)
1197 call_list(oldscope, PL_checkav);
14dd3ad8
GS
1198 ret = 0;
1199 break;
6224f72b
GS
1200 case 1:
1201 STATUS_ALL_FAILURE;
1202 /* FALL THROUGH */
1203 case 2:
1204 /* my_exit() was called */
3280af22 1205 while (PL_scopestack_ix > oldscope)
6224f72b
GS
1206 LEAVE;
1207 FREETMPS;
3280af22 1208 PL_curstash = PL_defstash;
7d30b5c4
GS
1209 if (PL_checkav)
1210 call_list(oldscope, PL_checkav);
14dd3ad8
GS
1211 ret = STATUS_NATIVE_EXPORT;
1212 break;
6224f72b 1213 case 3:
bf49b057 1214 PerlIO_printf(Perl_error_log, "panic: top_env\n");
14dd3ad8
GS
1215 ret = 1;
1216 break;
6224f72b 1217 }
14dd3ad8
GS
1218 JMPENV_POP;
1219 return ret;
1220}
1221
1222#ifdef PERL_FLEXIBLE_EXCEPTIONS
1223STATIC void *
1224S_vparse_body(pTHX_ va_list args)
1225{
1226 char **env = va_arg(args, char**);
1227 XSINIT_t xsinit = va_arg(args, XSINIT_t);
1228
1229 return parse_body(env, xsinit);
312caa8e 1230}
14dd3ad8 1231#endif
312caa8e
CS
1232
1233STATIC void *
14dd3ad8 1234S_parse_body(pTHX_ char **env, XSINIT_t xsinit)
312caa8e 1235{
312caa8e
CS
1236 int argc = PL_origargc;
1237 char **argv = PL_origargv;
312caa8e 1238 char *scriptname = NULL;
312caa8e
CS
1239 VOL bool dosearch = FALSE;
1240 char *validarg = "";
312caa8e
CS
1241 register SV *sv;
1242 register char *s;
cf756827 1243 char *cddir = Nullch;
312caa8e 1244
ae3f3efd
PS
1245 PL_fdscript = -1;
1246 PL_suidscript = -1;
3280af22 1247 sv_setpvn(PL_linestr,"",0);
79cb57f6 1248 sv = newSVpvn("",0); /* first used for -I flags */
6224f72b
GS
1249 SAVEFREESV(sv);
1250 init_main_stash();
54310121 1251
6224f72b
GS
1252 for (argc--,argv++; argc > 0; argc--,argv++) {
1253 if (argv[0][0] != '-' || !argv[0][1])
1254 break;
1255#ifdef DOSUID
1256 if (*validarg)
1257 validarg = " PHOOEY ";
1258 else
1259 validarg = argv[0];
ae3f3efd
PS
1260 /*
1261 * Can we rely on the kernel to start scripts with argv[1] set to
1262 * contain all #! line switches (the whole line)? (argv[0] is set to
1263 * the interpreter name, argv[2] to the script name; argv[3] and
1264 * above may contain other arguments.)
1265 */
13281fa4 1266#endif
6224f72b
GS
1267 s = argv[0]+1;
1268 reswitch:
1269 switch (*s) {
729a02f2 1270 case 'C':
1d5472a9
GS
1271#ifndef PERL_STRICT_CR
1272 case '\r':
1273#endif
6224f72b
GS
1274 case ' ':
1275 case '0':
1276 case 'F':
1277 case 'a':
1278 case 'c':
1279 case 'd':
1280 case 'D':
1281 case 'h':
1282 case 'i':
1283 case 'l':
1284 case 'M':
1285 case 'm':
1286 case 'n':
1287 case 'p':
1288 case 's':
1289 case 'u':
1290 case 'U':
1291 case 'v':
599cee73
PM
1292 case 'W':
1293 case 'X':
6224f72b 1294 case 'w':
06492da6 1295 case 'A':
155aba94 1296 if ((s = moreswitches(s)))
6224f72b
GS
1297 goto reswitch;
1298 break;
33b78306 1299
1dbad523 1300 case 't':
22f7c9c9 1301 CHECK_MALLOC_TOO_LATE_FOR('t');
317ea90d
MS
1302 if( !PL_tainting ) {
1303 PL_taint_warn = TRUE;
1304 PL_tainting = TRUE;
1305 }
1306 s++;
1307 goto reswitch;
6224f72b 1308 case 'T':
22f7c9c9 1309 CHECK_MALLOC_TOO_LATE_FOR('T');
3280af22 1310 PL_tainting = TRUE;
317ea90d 1311 PL_taint_warn = FALSE;
6224f72b
GS
1312 s++;
1313 goto reswitch;
f86702cc 1314
6224f72b 1315 case 'e':
bf4acbe4
GS
1316#ifdef MACOS_TRADITIONAL
1317 /* ignore -e for Dev:Pseudo argument */
1318 if (argv[1] && !strcmp(argv[1], "Dev:Pseudo"))
e55ac0fa 1319 break;
bf4acbe4 1320#endif
ae3f3efd 1321 forbid_setid("-e");
3280af22 1322 if (!PL_e_script) {
79cb57f6 1323 PL_e_script = newSVpvn("",0);
0cb96387 1324 filter_add(read_e_script, NULL);
6224f72b
GS
1325 }
1326 if (*++s)
3280af22 1327 sv_catpv(PL_e_script, s);
6224f72b 1328 else if (argv[1]) {
3280af22 1329 sv_catpv(PL_e_script, argv[1]);
6224f72b
GS
1330 argc--,argv++;
1331 }
1332 else
cea2e8a9 1333 Perl_croak(aTHX_ "No code specified for -e");
3280af22 1334 sv_catpv(PL_e_script, "\n");
6224f72b 1335 break;
afe37c7d 1336
6224f72b
GS
1337 case 'I': /* -I handled both here and in moreswitches() */
1338 forbid_setid("-I");
1339 if (!*++s && (s=argv[1]) != Nullch) {
1340 argc--,argv++;
1341 }
6224f72b 1342 if (s && *s) {
0df16ed7
GS
1343 char *p;
1344 STRLEN len = strlen(s);
1345 p = savepvn(s, len);
88fe16b2 1346 incpush(p, TRUE, TRUE, FALSE, FALSE);
0df16ed7
GS
1347 sv_catpvn(sv, "-I", 2);
1348 sv_catpvn(sv, p, len);
1349 sv_catpvn(sv, " ", 1);
6224f72b 1350 Safefree(p);
0df16ed7
GS
1351 }
1352 else
a67e862a 1353 Perl_croak(aTHX_ "No directory specified for -I");
6224f72b
GS
1354 break;
1355 case 'P':
1356 forbid_setid("-P");
3280af22 1357 PL_preprocess = TRUE;
6224f72b
GS
1358 s++;
1359 goto reswitch;
1360 case 'S':
1361 forbid_setid("-S");
1362 dosearch = TRUE;
1363 s++;
1364 goto reswitch;
1365 case 'V':
3280af22
NIS
1366 if (!PL_preambleav)
1367 PL_preambleav = newAV();
1368 av_push(PL_preambleav, newSVpv("use Config qw(myconfig config_vars)",0));
6224f72b 1369 if (*++s != ':') {
3280af22 1370 PL_Sv = newSVpv("print myconfig();",0);
6224f72b 1371#ifdef VMS
6b88bc9c 1372 sv_catpv(PL_Sv,"print \"\\nCharacteristics of this PERLSHR image: \\n\",");
6224f72b 1373#else
3280af22 1374 sv_catpv(PL_Sv,"print \"\\nCharacteristics of this binary (from libperl): \\n\",");
6224f72b 1375#endif
3280af22 1376 sv_catpv(PL_Sv,"\" Compile-time options:");
6224f72b 1377# ifdef DEBUGGING
3280af22 1378 sv_catpv(PL_Sv," DEBUGGING");
6224f72b 1379# endif
6224f72b 1380# ifdef MULTIPLICITY
8f872242 1381 sv_catpv(PL_Sv," MULTIPLICITY");
6224f72b 1382# endif
4d1ff10f
AB
1383# ifdef USE_5005THREADS
1384 sv_catpv(PL_Sv," USE_5005THREADS");
b363f7ed 1385# endif
ac5e8965
JH
1386# ifdef USE_ITHREADS
1387 sv_catpv(PL_Sv," USE_ITHREADS");
1388# endif
10cc9d2a
JH
1389# ifdef USE_64_BIT_INT
1390 sv_catpv(PL_Sv," USE_64_BIT_INT");
1391# endif
1392# ifdef USE_64_BIT_ALL
1393 sv_catpv(PL_Sv," USE_64_BIT_ALL");
ac5e8965
JH
1394# endif
1395# ifdef USE_LONG_DOUBLE
1396 sv_catpv(PL_Sv," USE_LONG_DOUBLE");
1397# endif
53430762
JH
1398# ifdef USE_LARGE_FILES
1399 sv_catpv(PL_Sv," USE_LARGE_FILES");
1400# endif
ac5e8965
JH
1401# ifdef USE_SOCKS
1402 sv_catpv(PL_Sv," USE_SOCKS");
1403# endif
b363f7ed
GS
1404# ifdef PERL_IMPLICIT_CONTEXT
1405 sv_catpv(PL_Sv," PERL_IMPLICIT_CONTEXT");
1406# endif
1407# ifdef PERL_IMPLICIT_SYS
1408 sv_catpv(PL_Sv," PERL_IMPLICIT_SYS");
1409# endif
3280af22 1410 sv_catpv(PL_Sv,"\\n\",");
b363f7ed 1411
6224f72b
GS
1412#if defined(LOCAL_PATCH_COUNT)
1413 if (LOCAL_PATCH_COUNT > 0) {
1414 int i;
3280af22 1415 sv_catpv(PL_Sv,"\" Locally applied patches:\\n\",");
6224f72b 1416 for (i = 1; i <= LOCAL_PATCH_COUNT; i++) {
3280af22 1417 if (PL_localpatches[i])
acb03d05
AB
1418 Perl_sv_catpvf(aTHX_ PL_Sv,"q%c\t%s\n%c,",
1419 0, PL_localpatches[i], 0);
6224f72b
GS
1420 }
1421 }
1422#endif
cea2e8a9 1423 Perl_sv_catpvf(aTHX_ PL_Sv,"\" Built under %s\\n\"",OSNAME);
6224f72b
GS
1424#ifdef __DATE__
1425# ifdef __TIME__
cea2e8a9 1426 Perl_sv_catpvf(aTHX_ PL_Sv,",\" Compiled at %s %s\\n\"",__DATE__,__TIME__);
6224f72b 1427# else
cea2e8a9 1428 Perl_sv_catpvf(aTHX_ PL_Sv,",\" Compiled on %s\\n\"",__DATE__);
6224f72b
GS
1429# endif
1430#endif
3280af22 1431 sv_catpv(PL_Sv, "; \
6224f72b 1432$\"=\"\\n \"; \
69fcd688
JH
1433@env = map { \"$_=\\\"$ENV{$_}\\\"\" } sort grep {/^PERL/} keys %ENV; ");
1434#ifdef __CYGWIN__
1435 sv_catpv(PL_Sv,"\
1436push @env, \"CYGWIN=\\\"$ENV{CYGWIN}\\\"\";");
1437#endif
1438 sv_catpv(PL_Sv, "\
6224f72b
GS
1439print \" \\%ENV:\\n @env\\n\" if @env; \
1440print \" \\@INC:\\n @INC\\n\";");
1441 }
1442 else {
3280af22
NIS
1443 PL_Sv = newSVpv("config_vars(qw(",0);
1444 sv_catpv(PL_Sv, ++s);
1445 sv_catpv(PL_Sv, "))");
6224f72b
GS
1446 s += strlen(s);
1447 }
3280af22 1448 av_push(PL_preambleav, PL_Sv);
6224f72b
GS
1449 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
1450 goto reswitch;
1451 case 'x':
3280af22 1452 PL_doextract = TRUE;
6224f72b
GS
1453 s++;
1454 if (*s)
f4c556ac 1455 cddir = s;
6224f72b
GS
1456 break;
1457 case 0:
1458 break;
1459 case '-':
1460 if (!*++s || isSPACE(*s)) {
1461 argc--,argv++;
1462 goto switch_end;
1463 }
1464 /* catch use of gnu style long options */
1465 if (strEQ(s, "version")) {
1466 s = "v";
1467 goto reswitch;
1468 }
1469 if (strEQ(s, "help")) {
1470 s = "h";
1471 goto reswitch;
1472 }
1473 s--;
1474 /* FALL THROUGH */
1475 default:
cea2e8a9 1476 Perl_croak(aTHX_ "Unrecognized switch: -%s (-h will show valid options)",s);
8d063cd8
LW
1477 }
1478 }
6224f72b 1479 switch_end:
54310121 1480
f675dbe5
CB
1481 if (
1482#ifndef SECURE_INTERNAL_GETENV
1483 !PL_tainting &&
1484#endif
cf756827 1485 (s = PerlEnv_getenv("PERL5OPT")))
0df16ed7 1486 {
cf756827 1487 char *popt = s;
74288ac8
GS
1488 while (isSPACE(*s))
1489 s++;
317ea90d 1490 if (*s == '-' && *(s+1) == 'T') {
22f7c9c9 1491 CHECK_MALLOC_TOO_LATE_FOR('T');
74288ac8 1492 PL_tainting = TRUE;
317ea90d
MS
1493 PL_taint_warn = FALSE;
1494 }
74288ac8 1495 else {
cf756827 1496 char *popt_copy = Nullch;
74288ac8 1497 while (s && *s) {
4ea8f8fb 1498 char *d;
74288ac8
GS
1499 while (isSPACE(*s))
1500 s++;
1501 if (*s == '-') {
1502 s++;
1503 if (isSPACE(*s))
1504 continue;
1505 }
4ea8f8fb 1506 d = s;
74288ac8
GS
1507 if (!*s)
1508 break;
06492da6 1509 if (!strchr("DIMUdmtwA", *s))
cea2e8a9 1510 Perl_croak(aTHX_ "Illegal switch in PERL5OPT: -%c", *s);
4ea8f8fb
MS
1511 while (++s && *s) {
1512 if (isSPACE(*s)) {
cf756827
GS
1513 if (!popt_copy) {
1514 popt_copy = SvPVX(sv_2mortal(newSVpv(popt,0)));
1515 s = popt_copy + (s - popt);
1516 d = popt_copy + (d - popt);
1517 }
4ea8f8fb
MS
1518 *s++ = '\0';
1519 break;
1520 }
1521 }
1c4db469 1522 if (*d == 't') {
317ea90d
MS
1523 if( !PL_tainting ) {
1524 PL_taint_warn = TRUE;
1525 PL_tainting = TRUE;
1526 }
1c4db469
RGS
1527 } else {
1528 moreswitches(d);
1529 }
6224f72b 1530 }
6224f72b
GS
1531 }
1532 }
a0d0e21e 1533
317ea90d
MS
1534 if (PL_taint_warn && PL_dowarn != G_WARN_ALL_OFF) {
1535 PL_compiling.cop_warnings = newSVpvn(WARN_TAINTstring, WARNsize);
1536 }
1537
6224f72b
GS
1538 if (!scriptname)
1539 scriptname = argv[0];
3280af22 1540 if (PL_e_script) {
6224f72b
GS
1541 argc++,argv--;
1542 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
1543 }
1544 else if (scriptname == Nullch) {
1545#ifdef MSDOS
1546 if ( PerlLIO_isatty(PerlIO_fileno(PerlIO_stdin())) )
1547 moreswitches("h");
1548#endif
1549 scriptname = "-";
1550 }
1551
b7975bdd
NC
1552 /* Set $^X early so that it can be used for relocatable paths in @INC */
1553 assert (!PL_tainted);
1554 TAINT;
1555 S_set_caret_X(aTHX);
1556 TAINT_NOT;
6224f72b
GS
1557 init_perllib();
1558
c5cccb17 1559 open_script(scriptname,dosearch,sv);
6224f72b 1560
c5cccb17 1561 validate_suid(validarg, scriptname);
6224f72b 1562
64ca3a65 1563#ifndef PERL_MICRO
0b5b802d
GS
1564#if defined(SIGCHLD) || defined(SIGCLD)
1565 {
1566#ifndef SIGCHLD
1567# define SIGCHLD SIGCLD
1568#endif
1569 Sighandler_t sigstate = rsignal_state(SIGCHLD);
1570 if (sigstate == SIG_IGN) {
1571 if (ckWARN(WARN_SIGNAL))
9014280d 1572 Perl_warner(aTHX_ packWARN(WARN_SIGNAL),
0b5b802d
GS
1573 "Can't ignore signal CHLD, forcing to default");
1574 (void)rsignal(SIGCHLD, (Sighandler_t)SIG_DFL);
1575 }
1576 }
1577#endif
64ca3a65 1578#endif
0b5b802d 1579
bf4acbe4
GS
1580#ifdef MACOS_TRADITIONAL
1581 if (PL_doextract || gMacPerl_AlwaysExtract) {
1582#else
f4c556ac 1583 if (PL_doextract) {
bf4acbe4 1584#endif
6224f72b 1585 find_beginning();
f4c556ac
GS
1586 if (cddir && PerlDir_chdir(cddir) < 0)
1587 Perl_croak(aTHX_ "Can't chdir to %s",cddir);
1588
1589 }
6224f72b 1590
3280af22
NIS
1591 PL_main_cv = PL_compcv = (CV*)NEWSV(1104,0);
1592 sv_upgrade((SV *)PL_compcv, SVt_PVCV);
1593 CvUNIQUE_on(PL_compcv);
1594
dd2155a4 1595 CvPADLIST(PL_compcv) = pad_new(0);
4d1ff10f 1596#ifdef USE_5005THREADS
533c011a
NIS
1597 CvOWNER(PL_compcv) = 0;
1598 New(666, CvMUTEXP(PL_compcv), 1, perl_mutex);
1599 MUTEX_INIT(CvMUTEXP(PL_compcv));
4d1ff10f 1600#endif /* USE_5005THREADS */
6224f72b 1601
0c4f7ff0 1602 boot_core_PerlIO();
6224f72b 1603 boot_core_UNIVERSAL();
09bef843 1604 boot_core_xsutils();
6224f72b
GS
1605
1606 if (xsinit)
acfe0abc 1607 (*xsinit)(aTHX); /* in case linked C routines want magical variables */
64ca3a65 1608#ifndef PERL_MICRO
ed79a026 1609#if defined(VMS) || defined(WIN32) || defined(DJGPP) || defined(__CYGWIN__) || defined(EPOC)
c5be433b 1610 init_os_extras();
6224f72b 1611#endif
64ca3a65 1612#endif
6224f72b 1613
29209bc5 1614#ifdef USE_SOCKS
1b9c9cf5
DH
1615# ifdef HAS_SOCKS5_INIT
1616 socks5_init(argv[0]);
1617# else
29209bc5 1618 SOCKSinit(argv[0]);
1b9c9cf5 1619# endif
ac27b0f5 1620#endif
29209bc5 1621
6224f72b
GS
1622 init_predump_symbols();
1623 /* init_postdump_symbols not currently designed to be called */
1624 /* more than once (ENV isn't cleared first, for example) */
1625 /* But running with -u leaves %ENV & @ARGV undefined! XXX */
3280af22 1626 if (!PL_do_undump)
6224f72b
GS
1627 init_postdump_symbols(argc,argv,env);
1628
a05d7ebb
JH
1629 /* PL_unicode is turned on by -C or by $ENV{PERL_UNICODE}.
1630 * PL_utf8locale is conditionally turned on by
085a54d9 1631 * locale.c:Perl_init_i18nl10n() if the environment
a05d7ebb 1632 * look like the user wants to use UTF-8. */
06e66572
JH
1633 if (PL_unicode) {
1634 /* Requires init_predump_symbols(). */
a05d7ebb 1635 if (!(PL_unicode & PERL_UNICODE_LOCALE_FLAG) || PL_utf8locale) {
06e66572
JH
1636 IO* io;
1637 PerlIO* fp;
1638 SV* sv;
1639
a05d7ebb 1640 /* Turn on UTF-8-ness on STDIN, STDOUT, STDERR
06e66572 1641 * and the default open disciplines. */
a05d7ebb
JH
1642 if ((PL_unicode & PERL_UNICODE_STDIN_FLAG) &&
1643 PL_stdingv && (io = GvIO(PL_stdingv)) &&
1644 (fp = IoIFP(io)))
1645 PerlIO_binmode(aTHX_ fp, IoTYPE(io), 0, ":utf8");
1646 if ((PL_unicode & PERL_UNICODE_STDOUT_FLAG) &&
1647 PL_defoutgv && (io = GvIO(PL_defoutgv)) &&
1648 (fp = IoOFP(io)))
1649 PerlIO_binmode(aTHX_ fp, IoTYPE(io), 0, ":utf8");
1650 if ((PL_unicode & PERL_UNICODE_STDERR_FLAG) &&
1651 PL_stderrgv && (io = GvIO(PL_stderrgv)) &&
1652 (fp = IoOFP(io)))
1653 PerlIO_binmode(aTHX_ fp, IoTYPE(io), 0, ":utf8");
1654 if ((PL_unicode & PERL_UNICODE_INOUT_FLAG) &&
1655 (sv = GvSV(gv_fetchpv("\017PEN", TRUE, SVt_PV)))) {
1656 U32 in = PL_unicode & PERL_UNICODE_IN_FLAG;
1657 U32 out = PL_unicode & PERL_UNICODE_OUT_FLAG;
1658 if (in) {
1659 if (out)
1660 sv_setpvn(sv, ":utf8\0:utf8", 11);
1661 else
1662 sv_setpvn(sv, ":utf8\0", 6);
1663 }
1664 else if (out)
1665 sv_setpvn(sv, "\0:utf8", 6);
1666 SvSETMAGIC(sv);
1667 }
b310b053
JH
1668 }
1669 }
1670
4ffa73a3
JH
1671 if ((s = PerlEnv_getenv("PERL_SIGNALS"))) {
1672 if (strEQ(s, "unsafe"))
1673 PL_signals |= PERL_SIGNALS_UNSAFE_FLAG;
1674 else if (strEQ(s, "safe"))
1675 PL_signals &= ~PERL_SIGNALS_UNSAFE_FLAG;
1676 else
1677 Perl_croak(aTHX_ "PERL_SIGNALS illegal: \"%s\"", s);
1678 }
1679
6224f72b
GS
1680 init_lexer();
1681
1682 /* now parse the script */
1683
93189314 1684 SETERRNO(0,SS_NORMAL);
3280af22 1685 PL_error_count = 0;
bf4acbe4
GS
1686#ifdef MACOS_TRADITIONAL
1687 if (gMacPerl_SyntaxError = (yyparse() || PL_error_count)) {
1688 if (PL_minus_c)
1689 Perl_croak(aTHX_ "%s had compilation errors.\n", MacPerl_MPWFileName(PL_origfilename));
1690 else {
1691 Perl_croak(aTHX_ "Execution of %s aborted due to compilation errors.\n",
1692 MacPerl_MPWFileName(PL_origfilename));
1693 }
1694 }
1695#else
3280af22
NIS
1696 if (yyparse() || PL_error_count) {
1697 if (PL_minus_c)
cea2e8a9 1698 Perl_croak(aTHX_ "%s had compilation errors.\n", PL_origfilename);
6224f72b 1699 else {
cea2e8a9 1700 Perl_croak(aTHX_ "Execution of %s aborted due to compilation errors.\n",
097ee67d 1701 PL_origfilename);
6224f72b
GS
1702 }
1703 }
bf4acbe4 1704#endif
57843af0 1705 CopLINE_set(PL_curcop, 0);
3280af22
NIS
1706 PL_curstash = PL_defstash;
1707 PL_preprocess = FALSE;
1708 if (PL_e_script) {
1709 SvREFCNT_dec(PL_e_script);
1710 PL_e_script = Nullsv;
6224f72b
GS
1711 }
1712
3280af22 1713 if (PL_do_undump)
6224f72b
GS
1714 my_unexec();
1715
57843af0
GS
1716 if (isWARN_ONCE) {
1717 SAVECOPFILE(PL_curcop);
1718 SAVECOPLINE(PL_curcop);
3280af22 1719 gv_check(PL_defstash);
57843af0 1720 }
6224f72b
GS
1721
1722 LEAVE;
1723 FREETMPS;
1724
1725#ifdef MYMALLOC
1726 if ((s=PerlEnv_getenv("PERL_DEBUG_MSTATS")) && atoi(s) >= 2)
1727 dump_mstats("after compilation:");
1728#endif
1729
1730 ENTER;
3280af22 1731 PL_restartop = 0;
312caa8e 1732 return NULL;
6224f72b
GS
1733}
1734
954c1994
GS
1735/*
1736=for apidoc perl_run
1737
1738Tells a Perl interpreter to run. See L<perlembed>.
1739
1740=cut
1741*/
1742
6224f72b 1743int
0cb96387 1744perl_run(pTHXx)
6224f72b 1745{
6224f72b 1746 I32 oldscope;
14dd3ad8 1747 int ret = 0;
db36c5a1 1748 dJMPENV;
4d1ff10f 1749#ifdef USE_5005THREADS
cea2e8a9
GS
1750 dTHX;
1751#endif
6224f72b 1752
3280af22 1753 oldscope = PL_scopestack_ix;
96e176bf
CL
1754#ifdef VMS
1755 VMSISH_HUSHED = 0;
1756#endif
6224f72b 1757
14dd3ad8 1758#ifdef PERL_FLEXIBLE_EXCEPTIONS
312caa8e 1759 redo_body:
14dd3ad8
GS
1760 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vrun_body), oldscope);
1761#else
1762 JMPENV_PUSH(ret);
1763#endif
6224f72b
GS
1764 switch (ret) {
1765 case 1:
1766 cxstack_ix = -1; /* start context stack again */
312caa8e 1767 goto redo_body;
14dd3ad8
GS
1768 case 0: /* normal completion */
1769#ifndef PERL_FLEXIBLE_EXCEPTIONS
1770 redo_body:
1771 run_body(oldscope);
1772#endif
1773 /* FALL THROUGH */
1774 case 2: /* my_exit() */
3280af22 1775 while (PL_scopestack_ix > oldscope)
6224f72b
GS
1776 LEAVE;
1777 FREETMPS;
3280af22 1778 PL_curstash = PL_defstash;
3a1ee7e8 1779 if (!(PL_exit_flags & PERL_EXIT_DESTRUCT_END) &&
31d77e54
AB
1780 PL_endav && !PL_minus_c)
1781 call_list(oldscope, PL_endav);
6224f72b
GS
1782#ifdef MYMALLOC
1783 if (PerlEnv_getenv("PERL_DEBUG_MSTATS"))
1784 dump_mstats("after execution: ");
1785#endif
14dd3ad8
GS
1786 ret = STATUS_NATIVE_EXPORT;
1787 break;
6224f72b 1788 case 3:
312caa8e
CS
1789 if (PL_restartop) {
1790 POPSTACK_TO(PL_mainstack);
1791 goto redo_body;
6224f72b 1792 }
bf49b057 1793 PerlIO_printf(Perl_error_log, "panic: restartop\n");
312caa8e 1794 FREETMPS;
14dd3ad8
GS
1795 ret = 1;
1796 break;
6224f72b
GS
1797 }
1798
14dd3ad8
GS
1799 JMPENV_POP;
1800 return ret;
312caa8e
CS
1801}
1802
14dd3ad8 1803#ifdef PERL_FLEXIBLE_EXCEPTIONS
312caa8e 1804STATIC void *
14dd3ad8 1805S_vrun_body(pTHX_ va_list args)
312caa8e 1806{
312caa8e
CS
1807 I32 oldscope = va_arg(args, I32);
1808
14dd3ad8
GS
1809 return run_body(oldscope);
1810}
1811#endif
1812
1813
1814STATIC void *
1815S_run_body(pTHX_ I32 oldscope)
1816{
6224f72b 1817 DEBUG_r(PerlIO_printf(Perl_debug_log, "%s $` $& $' support.\n",
3280af22 1818 PL_sawampersand ? "Enabling" : "Omitting"));
6224f72b 1819
3280af22 1820 if (!PL_restartop) {
6224f72b 1821 DEBUG_x(dump_all());
ecae49c0
NC
1822 if (!DEBUG_q_TEST)
1823 PERL_DEBUG(PerlIO_printf(Perl_debug_log, "\nEXECUTING...\n\n"));
b900a521
JH
1824 DEBUG_S(PerlIO_printf(Perl_debug_log, "main thread is 0x%"UVxf"\n",
1825 PTR2UV(thr)));
6224f72b 1826
3280af22 1827 if (PL_minus_c) {
bf4acbe4 1828#ifdef MACOS_TRADITIONAL
e69a2255
JH
1829 PerlIO_printf(Perl_error_log, "%s%s syntax OK\n",
1830 (gMacPerl_ErrorFormat ? "# " : ""),
1831 MacPerl_MPWFileName(PL_origfilename));
bf4acbe4 1832#else
bf49b057 1833 PerlIO_printf(Perl_error_log, "%s syntax OK\n", PL_origfilename);
bf4acbe4 1834#endif
6224f72b
GS
1835 my_exit(0);
1836 }
3280af22 1837 if (PERLDB_SINGLE && PL_DBsingle)
ac27b0f5 1838 sv_setiv(PL_DBsingle, 1);
3280af22
NIS
1839 if (PL_initav)
1840 call_list(oldscope, PL_initav);
6224f72b
GS
1841 }
1842
1843 /* do it */
1844
3280af22 1845 if (PL_restartop) {
533c011a 1846 PL_op = PL_restartop;
3280af22 1847 PL_restartop = 0;
cea2e8a9 1848 CALLRUNOPS(aTHX);
6224f72b 1849 }
3280af22
NIS
1850 else if (PL_main_start) {
1851 CvDEPTH(PL_main_cv) = 1;
533c011a 1852 PL_op = PL_main_start;
cea2e8a9 1853 CALLRUNOPS(aTHX);
6224f72b
GS
1854 }
1855
f6b3007c
JH
1856 my_exit(0);
1857 /* NOTREACHED */
312caa8e 1858 return NULL;
6224f72b
GS
1859}
1860
954c1994 1861/*
ccfc67b7
JH
1862=head1 SV Manipulation Functions
1863
954c1994
GS
1864=for apidoc p||get_sv
1865
1866Returns the SV of the specified Perl scalar. If C<create> is set and the
1867Perl variable does not exist then it will be created. If C<create> is not
1868set and the variable does not exist then NULL is returned.
1869
1870=cut
1871*/
1872
6224f72b 1873SV*
864dbfa3 1874Perl_get_sv(pTHX_ const char *name, I32 create)
6224f72b
GS
1875{
1876 GV *gv;
4d1ff10f 1877#ifdef USE_5005THREADS
6224f72b
GS
1878 if (name[1] == '\0' && !isALPHA(name[0])) {
1879 PADOFFSET tmp = find_threadsv(name);
411caa50 1880 if (tmp != NOT_IN_PAD)
6224f72b 1881 return THREADSV(tmp);
6224f72b 1882 }
4d1ff10f 1883#endif /* USE_5005THREADS */
6224f72b
GS
1884 gv = gv_fetchpv(name, create, SVt_PV);
1885 if (gv)
1886 return GvSV(gv);
1887 return Nullsv;
1888}
1889
954c1994 1890/*
ccfc67b7
JH
1891=head1 Array Manipulation Functions
1892
954c1994
GS
1893=for apidoc p||get_av
1894
1895Returns the AV of the specified Perl array. If C<create> is set and the
1896Perl variable does not exist then it will be created. If C<create> is not
1897set and the variable does not exist then NULL is returned.
1898
1899=cut
1900*/
1901
6224f72b 1902AV*
864dbfa3 1903Perl_get_av(pTHX_ const char *name, I32 create)
6224f72b
GS
1904{
1905 GV* gv = gv_fetchpv(name, create, SVt_PVAV);
1906 if (create)
1907 return GvAVn(gv);
1908 if (gv)
1909 return GvAV(gv);
1910 return Nullav;
1911}
1912
954c1994 1913/*
ccfc67b7
JH
1914=head1 Hash Manipulation Functions
1915
954c1994
GS
1916=for apidoc p||get_hv
1917
1918Returns the HV of the specified Perl hash. If C<create> is set and the
1919Perl variable does not exist then it will be created. If C<create> is not
1920set and the variable does not exist then NULL is returned.
1921
1922=cut
1923*/
1924
6224f72b 1925HV*
864dbfa3 1926Perl_get_hv(pTHX_ const char *name, I32 create)
6224f72b 1927{
a0d0e21e
LW
1928 GV* gv = gv_fetchpv(name, create, SVt_PVHV);
1929 if (create)
1930 return GvHVn(gv);
1931 if (gv)
1932 return GvHV(gv);
1933 return Nullhv;
1934}
1935
954c1994 1936/*
ccfc67b7
JH
1937=head1 CV Manipulation Functions
1938
954c1994
GS
1939=for apidoc p||get_cv
1940
1941Returns the CV of the specified Perl subroutine. If C<create> is set and
1942the Perl subroutine does not exist then it will be declared (which has the
1943same effect as saying C<sub name;>). If C<create> is not set and the
1944subroutine does not exist then NULL is returned.
1945
1946=cut
1947*/
1948
a0d0e21e 1949CV*
864dbfa3 1950Perl_get_cv(pTHX_ const char *name, I32 create)
a0d0e21e
LW
1951{
1952 GV* gv = gv_fetchpv(name, create, SVt_PVCV);
b099ddc0 1953 /* XXX unsafe for threads if eval_owner isn't held */
f6ec51f7
GS
1954 /* XXX this is probably not what they think they're getting.
1955 * It has the same effect as "sub name;", i.e. just a forward
1956 * declaration! */
8ebc5c01 1957 if (create && !GvCVu(gv))
774d564b 1958 return newSUB(start_subparse(FALSE, 0),
a0d0e21e 1959 newSVOP(OP_CONST, 0, newSVpv(name,0)),
4633a7c4 1960 Nullop,
a0d0e21e
LW
1961 Nullop);
1962 if (gv)
8ebc5c01 1963 return GvCVu(gv);
a0d0e21e
LW
1964 return Nullcv;
1965}
1966
79072805
LW
1967/* Be sure to refetch the stack pointer after calling these routines. */
1968
954c1994 1969/*
ccfc67b7
JH
1970
1971=head1 Callback Functions
1972
954c1994
GS
1973=for apidoc p||call_argv
1974
1975Performs a callback to the specified Perl sub. See L<perlcall>.
1976
1977=cut
1978*/
1979
a0d0e21e 1980I32
864dbfa3 1981Perl_call_argv(pTHX_ const char *sub_name, I32 flags, register char **argv)
ac27b0f5 1982
8ac85365
NIS
1983 /* See G_* flags in cop.h */
1984 /* null terminated arg list */
8990e307 1985{
a0d0e21e 1986 dSP;
8990e307 1987
924508f0 1988 PUSHMARK(SP);
a0d0e21e 1989 if (argv) {
8990e307 1990 while (*argv) {
a0d0e21e 1991 XPUSHs(sv_2mortal(newSVpv(*argv,0)));
8990e307
LW
1992 argv++;
1993 }
a0d0e21e 1994 PUTBACK;
8990e307 1995 }
864dbfa3 1996 return call_pv(sub_name, flags);
8990e307
LW
1997}
1998
954c1994
GS
1999/*
2000=for apidoc p||call_pv
2001
2002Performs a callback to the specified Perl sub. See L<perlcall>.
2003
2004=cut
2005*/
2006
a0d0e21e 2007I32
864dbfa3 2008Perl_call_pv(pTHX_ const char *sub_name, I32 flags)
8ac85365
NIS
2009 /* name of the subroutine */
2010 /* See G_* flags in cop.h */
a0d0e21e 2011{
864dbfa3 2012 return call_sv((SV*)get_cv(sub_name, TRUE), flags);
a0d0e21e
LW
2013}
2014
954c1994
GS
2015/*
2016=for apidoc p||call_method
2017
2018Performs a callback to the specified Perl method. The blessed object must
2019be on the stack. See L<perlcall>.
2020
2021=cut
2022*/
2023
a0d0e21e 2024I32
864dbfa3 2025Perl_call_method(pTHX_ const char *methname, I32 flags)
8ac85365
NIS
2026 /* name of the subroutine */
2027 /* See G_* flags in cop.h */
a0d0e21e 2028{
968b3946 2029 return call_sv(sv_2mortal(newSVpv(methname,0)), flags | G_METHOD);
a0d0e21e
LW
2030}
2031
2032/* May be called with any of a CV, a GV, or an SV containing the name. */
954c1994
GS
2033/*
2034=for apidoc p||call_sv
2035
2036Performs a callback to the Perl sub whose name is in the SV. See
2037L<perlcall>.
2038
2039=cut
2040*/
2041
a0d0e21e 2042I32
864dbfa3 2043Perl_call_sv(pTHX_ SV *sv, I32 flags)
8ac85365 2044 /* See G_* flags in cop.h */
a0d0e21e 2045{
924508f0 2046 dSP;
a0d0e21e 2047 LOGOP myop; /* fake syntax tree node */
968b3946 2048 UNOP method_op;
aa689395 2049 I32 oldmark;
13689cfe 2050 volatile I32 retval = 0;
a0d0e21e 2051 I32 oldscope;
54310121 2052 bool oldcatch = CATCH_GET;
6224f72b 2053 int ret;
533c011a 2054 OP* oldop = PL_op;
db36c5a1 2055 dJMPENV;
1e422769 2056
a0d0e21e
LW
2057 if (flags & G_DISCARD) {
2058 ENTER;
2059 SAVETMPS;
2060 }
2061
aa689395 2062 Zero(&myop, 1, LOGOP);
54310121 2063 myop.op_next = Nullop;
f51d4af5 2064 if (!(flags & G_NOARGS))
aa689395 2065 myop.op_flags |= OPf_STACKED;
54310121 2066 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
2067 (flags & G_ARRAY) ? OPf_WANT_LIST :
2068 OPf_WANT_SCALAR);
462e5cf6 2069 SAVEOP();
533c011a 2070 PL_op = (OP*)&myop;
aa689395 2071
3280af22
NIS
2072 EXTEND(PL_stack_sp, 1);
2073 *++PL_stack_sp = sv;
aa689395 2074 oldmark = TOPMARK;
3280af22 2075 oldscope = PL_scopestack_ix;
a0d0e21e 2076
3280af22 2077 if (PERLDB_SUB && PL_curstash != PL_debstash
36477c24 2078 /* Handle first BEGIN of -d. */
3280af22 2079 && (PL_DBcv || (PL_DBcv = GvCV(PL_DBsub)))
36477c24 2080 /* Try harder, since this may have been a sighandler, thus
2081 * curstash may be meaningless. */
3280af22 2082 && (SvTYPE(sv) != SVt_PVCV || CvSTASH((CV*)sv) != PL_debstash)
491527d0 2083 && !(flags & G_NODEBUG))
533c011a 2084 PL_op->op_private |= OPpENTERSUB_DB;
a0d0e21e 2085
968b3946
GS
2086 if (flags & G_METHOD) {
2087 Zero(&method_op, 1, UNOP);
2088 method_op.op_next = PL_op;
2089 method_op.op_ppaddr = PL_ppaddr[OP_METHOD];
2090 myop.op_ppaddr = PL_ppaddr[OP_ENTERSUB];
f39d0b86 2091 PL_op = (OP*)&method_op;
968b3946
GS
2092 }
2093
312caa8e 2094 if (!(flags & G_EVAL)) {
0cdb2077 2095 CATCH_SET(TRUE);
14dd3ad8 2096 call_body((OP*)&myop, FALSE);
312caa8e 2097 retval = PL_stack_sp - (PL_stack_base + oldmark);
0253cb41 2098 CATCH_SET(oldcatch);
312caa8e
CS
2099 }
2100 else {
d78bda3d 2101 myop.op_other = (OP*)&myop;
3280af22 2102 PL_markstack_ptr--;
4633a7c4
LW
2103 /* we're trying to emulate pp_entertry() here */
2104 {
c09156bb 2105 register PERL_CONTEXT *cx;
54310121 2106 I32 gimme = GIMME_V;
ac27b0f5 2107
4633a7c4
LW
2108 ENTER;
2109 SAVETMPS;
ac27b0f5 2110
1d76a5c3 2111 PUSHBLOCK(cx, (CXt_EVAL|CXp_TRYBLOCK), PL_stack_sp);
4633a7c4 2112 PUSHEVAL(cx, 0, 0);
533c011a 2113 PL_eval_root = PL_op; /* Only needed so that goto works right. */
ac27b0f5 2114
faef0170 2115 PL_in_eval = EVAL_INEVAL;
4633a7c4 2116 if (flags & G_KEEPERR)
faef0170 2117 PL_in_eval |= EVAL_KEEPERR;
4633a7c4 2118 else
38a03e6e 2119 sv_setpv(ERRSV,"");
4633a7c4 2120 }
3280af22 2121 PL_markstack_ptr++;
a0d0e21e 2122
14dd3ad8
GS
2123#ifdef PERL_FLEXIBLE_EXCEPTIONS
2124 redo_body:
2125 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vcall_body),
db36c5a1 2126 (OP*)&myop, FALSE);
14dd3ad8
GS
2127#else
2128 JMPENV_PUSH(ret);
2129#endif
6224f72b
GS
2130 switch (ret) {
2131 case 0:
14dd3ad8
GS
2132#ifndef PERL_FLEXIBLE_EXCEPTIONS
2133 redo_body:
2134 call_body((OP*)&myop, FALSE);
2135#endif
312caa8e
CS
2136 retval = PL_stack_sp - (PL_stack_base + oldmark);
2137 if (!(flags & G_KEEPERR))
2138 sv_setpv(ERRSV,"");
a0d0e21e 2139 break;
6224f72b 2140 case 1:
f86702cc 2141 STATUS_ALL_FAILURE;
a0d0e21e 2142 /* FALL THROUGH */
6224f72b 2143 case 2:
a0d0e21e 2144 /* my_exit() was called */
3280af22 2145 PL_curstash = PL_defstash;
a0d0e21e 2146 FREETMPS;
14dd3ad8 2147 JMPENV_POP;
cc3604b1 2148 if (PL_statusvalue && !(PL_exit_flags & PERL_EXIT_EXPECTED))
cea2e8a9 2149 Perl_croak(aTHX_ "Callback called exit");
f86702cc 2150 my_exit_jump();
a0d0e21e 2151 /* NOTREACHED */
6224f72b 2152 case 3:
3280af22 2153 if (PL_restartop) {
533c011a 2154 PL_op = PL_restartop;
3280af22 2155 PL_restartop = 0;
312caa8e 2156 goto redo_body;
a0d0e21e 2157 }
3280af22 2158 PL_stack_sp = PL_stack_base + oldmark;
a0d0e21e
LW
2159 if (flags & G_ARRAY)
2160 retval = 0;
2161 else {
2162 retval = 1;
3280af22 2163 *++PL_stack_sp = &PL_sv_undef;
a0d0e21e 2164 }
312caa8e 2165 break;
a0d0e21e 2166 }
a0d0e21e 2167
3280af22 2168 if (PL_scopestack_ix > oldscope) {
a0a2876f
LW
2169 SV **newsp;
2170 PMOP *newpm;
2171 I32 gimme;
c09156bb 2172 register PERL_CONTEXT *cx;
a0a2876f
LW
2173 I32 optype;
2174
2175 POPBLOCK(cx,newpm);
2176 POPEVAL(cx);
3280af22 2177 PL_curpm = newpm;
a0a2876f 2178 LEAVE;
a0d0e21e 2179 }
14dd3ad8 2180 JMPENV_POP;
a0d0e21e 2181 }
1e422769 2182
a0d0e21e 2183 if (flags & G_DISCARD) {
3280af22 2184 PL_stack_sp = PL_stack_base + oldmark;
a0d0e21e
LW
2185 retval = 0;
2186 FREETMPS;
2187 LEAVE;
2188 }
533c011a 2189 PL_op = oldop;
a0d0e21e
LW
2190 return retval;
2191}
2192
14dd3ad8 2193#ifdef PERL_FLEXIBLE_EXCEPTIONS
312caa8e 2194STATIC void *
14dd3ad8 2195S_vcall_body(pTHX_ va_list args)
312caa8e
CS
2196{
2197 OP *myop = va_arg(args, OP*);
2198 int is_eval = va_arg(args, int);
2199
14dd3ad8 2200 call_body(myop, is_eval);
312caa8e
CS
2201 return NULL;
2202}
14dd3ad8 2203#endif
312caa8e
CS
2204
2205STATIC void
14dd3ad8 2206S_call_body(pTHX_ OP *myop, int is_eval)
312caa8e 2207{
312caa8e
CS
2208 if (PL_op == myop) {
2209 if (is_eval)
f807eda9 2210 PL_op = Perl_pp_entereval(aTHX); /* this doesn't do a POPMARK */
312caa8e 2211 else
f807eda9 2212 PL_op = Perl_pp_entersub(aTHX); /* this does */
312caa8e
CS
2213 }
2214 if (PL_op)
cea2e8a9 2215 CALLRUNOPS(aTHX);
312caa8e
CS
2216}
2217
6e72f9df 2218/* Eval a string. The G_EVAL flag is always assumed. */
8990e307 2219
954c1994
GS
2220/*
2221=for apidoc p||eval_sv
2222
2223Tells Perl to C<eval> the string in the SV.
2224
2225=cut
2226*/
2227
a0d0e21e 2228I32
864dbfa3 2229Perl_eval_sv(pTHX_ SV *sv, I32 flags)
ac27b0f5 2230
8ac85365 2231 /* See G_* flags in cop.h */
a0d0e21e 2232{
924508f0 2233 dSP;
a0d0e21e 2234 UNOP myop; /* fake syntax tree node */
8fa7f367 2235 volatile I32 oldmark = SP - PL_stack_base;
13689cfe 2236 volatile I32 retval = 0;
4633a7c4 2237 I32 oldscope;
6224f72b 2238 int ret;
533c011a 2239 OP* oldop = PL_op;
db36c5a1 2240 dJMPENV;
84902520 2241
4633a7c4
LW
2242 if (flags & G_DISCARD) {
2243 ENTER;
2244 SAVETMPS;
2245 }
2246
462e5cf6 2247 SAVEOP();
533c011a
NIS
2248 PL_op = (OP*)&myop;
2249 Zero(PL_op, 1, UNOP);
3280af22
NIS
2250 EXTEND(PL_stack_sp, 1);
2251 *++PL_stack_sp = sv;
2252 oldscope = PL_scopestack_ix;
79072805 2253
4633a7c4
LW
2254 if (!(flags & G_NOARGS))
2255 myop.op_flags = OPf_STACKED;
79072805 2256 myop.op_next = Nullop;
6e72f9df 2257 myop.op_type = OP_ENTEREVAL;
54310121 2258 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
2259 (flags & G_ARRAY) ? OPf_WANT_LIST :
2260 OPf_WANT_SCALAR);
6e72f9df 2261 if (flags & G_KEEPERR)
2262 myop.op_flags |= OPf_SPECIAL;
4633a7c4 2263
14dd3ad8 2264#ifdef PERL_FLEXIBLE_EXCEPTIONS
312caa8e 2265 redo_body:
14dd3ad8 2266 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vcall_body),
db36c5a1 2267 (OP*)&myop, TRUE);
14dd3ad8 2268#else
dedbcade
DM
2269 /* fail now; otherwise we could fail after the JMPENV_PUSH but
2270 * before a PUSHEVAL, which corrupts the stack after a croak */
2271 TAINT_PROPER("eval_sv()");
2272
14dd3ad8
GS
2273 JMPENV_PUSH(ret);
2274#endif
6224f72b
GS
2275 switch (ret) {
2276 case 0:
14dd3ad8
GS
2277#ifndef PERL_FLEXIBLE_EXCEPTIONS
2278 redo_body:
2279 call_body((OP*)&myop,TRUE);
2280#endif
312caa8e
CS
2281 retval = PL_stack_sp - (PL_stack_base + oldmark);
2282 if (!(flags & G_KEEPERR))
2283 sv_setpv(ERRSV,"");
4633a7c4 2284 break;
6224f72b 2285 case 1:
f86702cc 2286 STATUS_ALL_FAILURE;
4633a7c4 2287 /* FALL THROUGH */
6224f72b 2288 case 2:
4633a7c4 2289 /* my_exit() was called */
3280af22 2290 PL_curstash = PL_defstash;
4633a7c4 2291 FREETMPS;
14dd3ad8 2292 JMPENV_POP;
cc3604b1 2293 if (PL_statusvalue && !(PL_exit_flags & PERL_EXIT_EXPECTED))
cea2e8a9 2294 Perl_croak(aTHX_ "Callback called exit");
f86702cc 2295 my_exit_jump();
4633a7c4 2296 /* NOTREACHED */
6224f72b 2297 case 3:
3280af22 2298 if (PL_restartop) {
533c011a 2299 PL_op = PL_restartop;
3280af22 2300 PL_restartop = 0;
312caa8e 2301 goto redo_body;
4633a7c4 2302 }
3280af22 2303 PL_stack_sp = PL_stack_base + oldmark;
4633a7c4
LW
2304 if (flags & G_ARRAY)
2305 retval = 0;
2306 else {
2307 retval = 1;
3280af22 2308 *++PL_stack_sp = &PL_sv_undef;
4633a7c4 2309 }
312caa8e 2310 break;
4633a7c4
LW
2311 }
2312
14dd3ad8 2313 JMPENV_POP;
4633a7c4 2314 if (flags & G_DISCARD) {
3280af22 2315 PL_stack_sp = PL_stack_base + oldmark;
4633a7c4
LW
2316 retval = 0;
2317 FREETMPS;
2318 LEAVE;
2319 }
533c011a 2320 PL_op = oldop;
4633a7c4
LW
2321 return retval;
2322}
2323
954c1994
GS
2324/*
2325=for apidoc p||eval_pv
2326
2327Tells Perl to C<eval> the given string and return an SV* result.
2328
2329=cut
2330*/
2331
137443ea 2332SV*
864dbfa3 2333Perl_eval_pv(pTHX_ const char *p, I32 croak_on_error)
137443ea 2334{
2335 dSP;
2336 SV* sv = newSVpv(p, 0);
2337
864dbfa3 2338 eval_sv(sv, G_SCALAR);
137443ea 2339 SvREFCNT_dec(sv);
2340
2341 SPAGAIN;
2342 sv = POPs;
2343 PUTBACK;
2344
2d8e6c8d
GS
2345 if (croak_on_error && SvTRUE(ERRSV)) {
2346 STRLEN n_a;
cea2e8a9 2347 Perl_croak(aTHX_ SvPVx(ERRSV, n_a));
2d8e6c8d 2348 }
137443ea 2349
2350 return sv;
2351}
2352
4633a7c4
LW
2353/* Require a module. */
2354
954c1994 2355/*
ccfc67b7
JH
2356=head1 Embedding Functions
2357
954c1994
GS
2358=for apidoc p||require_pv
2359
7d3fb230
BS
2360Tells Perl to C<require> the file named by the string argument. It is
2361analogous to the Perl code C<eval "require '$file'">. It's even
2307c6d0 2362implemented that way; consider using load_module instead.
954c1994 2363
7d3fb230 2364=cut */
954c1994 2365
4633a7c4 2366void
864dbfa3 2367Perl_require_pv(pTHX_ const char *pv)
4633a7c4 2368{
d3acc0f7
JP
2369 SV* sv;
2370 dSP;
e788e7d3 2371 PUSHSTACKi(PERLSI_REQUIRE);
d3acc0f7
JP
2372 PUTBACK;
2373 sv = sv_newmortal();
4633a7c4
LW
2374 sv_setpv(sv, "require '");
2375 sv_catpv(sv, pv);
2376 sv_catpv(sv, "'");
864dbfa3 2377 eval_sv(sv, G_DISCARD);
d3acc0f7
JP
2378 SPAGAIN;
2379 POPSTACK;
79072805
LW
2380}
2381
79072805 2382void
864dbfa3 2383Perl_magicname(pTHX_ char *sym, char *name, I32 namlen)
79072805
LW
2384{
2385 register GV *gv;
2386
155aba94 2387 if ((gv = gv_fetchpv(sym,TRUE, SVt_PV)))
14befaf4 2388 sv_magic(GvSV(gv), (SV*)gv, PERL_MAGIC_sv, name, namlen);
79072805
LW
2389}
2390
76e3520e 2391STATIC void
cea2e8a9 2392S_usage(pTHX_ char *name) /* XXX move this out into a module ? */
4633a7c4 2393{
ab821d7f 2394 /* This message really ought to be max 23 lines.
75c72d73 2395 * Removed -h because the user already knows that option. Others? */
fb73857a 2396
76e3520e 2397 static char *usage_msg[] = {
fb73857a 2398"-0[octal] specify record separator (\\0, if no argument)",
2399"-a autosplit mode with -n or -p (splits $_ into @F)",
fb3560ee 2400"-C[number/list] enables the listed Unicode features",
1950ee41 2401"-c check syntax only (runs BEGIN and CHECK blocks)",
aac3bd0d
GS
2402"-d[:debugger] run program under debugger",
2403"-D[number/list] set debugging flags (argument is a bit mask or alphabets)",
90490ea3 2404"-e program one line of program (several -e's allowed, omit programfile)",
aac3bd0d
GS
2405"-F/pattern/ split() pattern for -a switch (//'s are optional)",
2406"-i[extension] edit <> files in place (makes backup if extension supplied)",
2407"-Idirectory specify @INC/#include directory (several -I's allowed)",
fb73857a 2408"-l[octal] enable line ending processing, specifies line terminator",
aac3bd0d
GS
2409"-[mM][-]module execute `use/no module...' before executing program",
2410"-n assume 'while (<>) { ... }' loop around program",
2411"-p assume loop like -n but print line also, like sed",
2412"-P run program through C preprocessor before compilation",
2413"-s enable rudimentary parsing for switches after programfile",
2414"-S look for programfile using PATH environment variable",
9cbc33e8 2415"-t enable tainting warnings",
90490ea3 2416"-T enable tainting checks",
aac3bd0d 2417"-u dump core after parsing program",
fb73857a 2418"-U allow unsafe operations",
aac3bd0d
GS
2419"-v print version, subversion (includes VERY IMPORTANT perl info)",
2420"-V[:variable] print configuration summary (or a single Config.pm variable)",
2421"-w enable many useful warnings (RECOMMENDED)",
3c0facb2 2422"-W enable all warnings",
fb73857a 2423"-x[directory] strip off text before #!perl line and perhaps cd to directory",
90490ea3 2424"-X disable all warnings",
fb73857a 2425"\n",
2426NULL
2427};
76e3520e 2428 char **p = usage_msg;
fb73857a 2429
b0e47665
GS
2430 PerlIO_printf(PerlIO_stdout(),
2431 "\nUsage: %s [switches] [--] [programfile] [arguments]",
2432 name);
fb73857a 2433 while (*p)
b0e47665 2434 PerlIO_printf(PerlIO_stdout(), "\n %s", *p++);
4633a7c4
LW
2435}
2436
b4ab917c
DM
2437/* convert a string of -D options (or digits) into an int.
2438 * sets *s to point to the char after the options */
2439
2440#ifdef DEBUGGING
2441int
ddcf8bc1 2442Perl_get_debug_opts(pTHX_ char **s, bool givehelp)
b4ab917c 2443{
e6e64d9b
JC
2444 static char *usage_msgd[] = {
2445 " Debugging flag values: (see also -d)",
2446 " p Tokenizing and parsing (with v, displays parse stack)",
3679267a 2447 " s Stack snapshots (with v, displays all stacks)",
e6e64d9b
JC
2448 " l Context (loop) stack processing",
2449 " t Trace execution",
2450 " o Method and overloading resolution",
2451 " c String/numeric conversions",
2452 " P Print profiling info, preprocessor command for -P, source file input state",
2453 " m Memory allocation",
2454 " f Format processing",
2455 " r Regular expression parsing and execution",
2456 " x Syntax tree dump",
3679267a 2457 " u Tainting checks",
e6e64d9b
JC
2458 " H Hash dump -- usurps values()",
2459 " X Scratchpad allocation",
2460 " D Cleaning up",
2461 " S Thread synchronization",
2462 " T Tokenising",
2463 " R Include reference counts of dumped variables (eg when using -Ds)",
2464 " J Do not s,t,P-debug (Jump over) opcodes within package DB",
2465 " v Verbose: use in conjunction with other flags",
2466 " C Copy On Write",
2467 " A Consistency checks on internal structures",
3679267a 2468 " q quiet - currently only suppresses the 'EXECUTING' message",
e6e64d9b
JC
2469 NULL
2470 };
b4ab917c
DM
2471 int i = 0;
2472 if (isALPHA(**s)) {
2473 /* if adding extra options, remember to update DEBUG_MASK */
ecae49c0 2474 static char debopts[] = "psltocPmfrxu HXDSTRJvCAq";
b4ab917c
DM
2475
2476 for (; isALNUM(**s); (*s)++) {
2477 char *d = strchr(debopts,**s);
2478 if (d)
2479 i |= 1 << (d - debopts);
2480 else if (ckWARN_d(WARN_DEBUGGING))
e6e64d9b
JC
2481 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
2482 "invalid option -D%c, use -D'' to see choices\n", **s);
b4ab917c
DM
2483 }
2484 }
e6e64d9b 2485 else if (isDIGIT(**s)) {
b4ab917c
DM
2486 i = atoi(*s);
2487 for (; isALNUM(**s); (*s)++) ;
2488 }
ddcf8bc1 2489 else if (givehelp) {
e6e64d9b
JC
2490 char **p = usage_msgd;
2491 while (*p) PerlIO_printf(PerlIO_stdout(), "%s\n", *p++);
2492 }
b4ab917c
DM
2493# ifdef EBCDIC
2494 if ((i & DEBUG_p_FLAG) && ckWARN_d(WARN_DEBUGGING))
2495 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
2496 "-Dp not implemented on this platform\n");
2497# endif
2498 return i;
2499}
2500#endif
2501
79072805
LW
2502/* This routine handles any switches that can be given during run */
2503
2504char *
864dbfa3 2505Perl_moreswitches(pTHX_ char *s)
79072805 2506{
ba210ebe 2507 STRLEN numlen;
84c133a0 2508 UV rschar;
79072805
LW
2509
2510 switch (*s) {
2511 case '0':
a863c7d1 2512 {
f2095865
JH
2513 I32 flags = 0;
2514
2515 SvREFCNT_dec(PL_rs);
2516 if (s[1] == 'x' && s[2]) {
2517 char *e;
2518 U8 *tmps;
2519
2520 for (s += 2, e = s; *e; e++);
2521 numlen = e - s;
2522 flags = PERL_SCAN_SILENT_ILLDIGIT;
2523 rschar = (U32)grok_hex(s, &numlen, &flags, NULL);
2524 if (s + numlen < e) {
2525 rschar = 0; /* Grandfather -0xFOO as -0 -xFOO. */
2526 numlen = 0;
2527 s--;
2528 }
2529 PL_rs = newSVpvn("", 0);
c5661c80 2530 SvGROW(PL_rs, (STRLEN)(UNISKIP(rschar) + 1));
f2095865
JH
2531 tmps = (U8*)SvPVX(PL_rs);
2532 uvchr_to_utf8(tmps, rschar);
2533 SvCUR_set(PL_rs, UNISKIP(rschar));
2534 SvUTF8_on(PL_rs);
2535 }
2536 else {
2537 numlen = 4;
2538 rschar = (U32)grok_oct(s, &numlen, &flags, NULL);
2539 if (rschar & ~((U8)~0))
2540 PL_rs = &PL_sv_undef;
2541 else if (!rschar && numlen >= 2)
2542 PL_rs = newSVpvn("", 0);
2543 else {
2544 char ch = (char)rschar;
2545 PL_rs = newSVpvn(&ch, 1);
2546 }
2547 }
800633c3 2548 sv_setsv(get_sv("/", TRUE), PL_rs);
f2095865 2549 return s + numlen;
a863c7d1 2550 }
46487f74 2551 case 'C':
a05d7ebb
JH
2552 s++;
2553 PL_unicode = parse_unicode_opts(&s);
46487f74 2554 return s;
2304df62 2555 case 'F':
3280af22 2556 PL_minus_F = TRUE;
ebce5377
RGS
2557 PL_splitstr = ++s;
2558 while (*s && !isSPACE(*s)) ++s;
2559 *s = '\0';
2560 PL_splitstr = savepv(PL_splitstr);
2304df62 2561 return s;
79072805 2562 case 'a':
3280af22 2563 PL_minus_a = TRUE;
79072805
LW
2564 s++;
2565 return s;
2566 case 'c':
3280af22 2567 PL_minus_c = TRUE;
79072805
LW
2568 s++;
2569 return s;
2570 case 'd':
bbce6d69 2571 forbid_setid("-d");
4633a7c4 2572 s++;
2cbb2ee1
RGS
2573
2574 /* -dt indicates to the debugger that threads will be used */
2575 if (*s == 't' && !isALNUM(s[1])) {
2576 ++s;
2577 my_setenv("PERL5DB_THREADED", "1");
2578 }
2579
70c94a19
RR
2580 /* The following permits -d:Mod to accepts arguments following an =
2581 in the fashion that -MSome::Mod does. */
2582 if (*s == ':' || *s == '=') {
2583 char *start;
2584 SV *sv;
2585 sv = newSVpv("use Devel::", 0);
2586 start = ++s;
2587 /* We now allow -d:Module=Foo,Bar */
2588 while(isALNUM(*s) || *s==':') ++s;
2589 if (*s != '=')
2590 sv_catpv(sv, start);
2591 else {
2592 sv_catpvn(sv, start, s-start);
2593 sv_catpv(sv, " split(/,/,q{");
2594 sv_catpv(sv, ++s);
3d27e215 2595 sv_catpv(sv, "})");
70c94a19 2596 }
4633a7c4 2597 s += strlen(s);
70c94a19 2598 my_setenv("PERL5DB", SvPV(sv, PL_na));
4633a7c4 2599 }
ed094faf 2600 if (!PL_perldb) {
3280af22 2601 PL_perldb = PERLDB_ALL;
a0d0e21e 2602 init_debugger();
ed094faf 2603 }
79072805
LW
2604 return s;
2605 case 'D':
0453d815 2606 {
79072805 2607#ifdef DEBUGGING
bbce6d69 2608 forbid_setid("-D");
b4ab917c 2609 s++;
ddcf8bc1 2610 PL_debug = get_debug_opts(&s, 1) | DEBUG_TOP_FLAG;
12a43e32 2611#else /* !DEBUGGING */
0453d815 2612 if (ckWARN_d(WARN_DEBUGGING))
9014280d 2613 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
e6e64d9b 2614 "Recompile perl with -DDEBUGGING to use -D switch (did you mean -d ?)\n");
a0d0e21e 2615 for (s++; isALNUM(*s); s++) ;
79072805
LW
2616#endif
2617 /*SUPPRESS 530*/
2618 return s;
0453d815 2619 }
4633a7c4 2620 case 'h':
ac27b0f5 2621 usage(PL_origargv[0]);
7ca617d0 2622 my_exit(0);
79072805 2623 case 'i':
3280af22
NIS
2624 if (PL_inplace)
2625 Safefree(PL_inplace);
c030f24b
GH
2626#if defined(__CYGWIN__) /* do backup extension automagically */
2627 if (*(s+1) == '\0') {
2628 PL_inplace = savepv(".bak");
2629 return s+1;
2630 }
2631#endif /* __CYGWIN__ */
3280af22 2632 PL_inplace = savepv(s+1);
79072805 2633 /*SUPPRESS 530*/
3280af22 2634 for (s = PL_inplace; *s && !isSPACE(*s); s++) ;
7b8d334a 2635 if (*s) {
fb73857a 2636 *s++ = '\0';
7b8d334a
GS
2637 if (*s == '-') /* Additional switches on #! line. */
2638 s++;
2639 }
fb73857a 2640 return s;
4e49a025 2641 case 'I': /* -I handled both here and in parse_body() */
bbce6d69 2642 forbid_setid("-I");
fb73857a 2643 ++s;
2644 while (*s && isSPACE(*s))
2645 ++s;
2646 if (*s) {
774d564b 2647 char *e, *p;
0df16ed7
GS
2648 p = s;
2649 /* ignore trailing spaces (possibly followed by other switches) */
2650 do {
2651 for (e = p; *e && !isSPACE(*e); e++) ;
2652 p = e;
2653 while (isSPACE(*p))
2654 p++;
2655 } while (*p && *p != '-');
2656 e = savepvn(s, e-s);
88fe16b2 2657 incpush(e, TRUE, TRUE, FALSE, FALSE);
0df16ed7
GS
2658 Safefree(e);
2659 s = p;
2660 if (*s == '-')
2661 s++;
79072805
LW
2662 }
2663 else
a67e862a 2664 Perl_croak(aTHX_ "No directory specified for -I");
fb73857a 2665 return s;
79072805 2666 case 'l':
3280af22 2667 PL_minus_l = TRUE;
79072805 2668 s++;
7889fe52
NIS
2669 if (PL_ors_sv) {
2670 SvREFCNT_dec(PL_ors_sv);
2671 PL_ors_sv = Nullsv;
2672 }
79072805 2673 if (isDIGIT(*s)) {
53305cf1 2674 I32 flags = 0;
7889fe52 2675 PL_ors_sv = newSVpvn("\n",1);
53305cf1
NC
2676 numlen = 3 + (*s == '0');
2677 *SvPVX(PL_ors_sv) = (char)grok_oct(s, &numlen, &flags, NULL);
79072805
LW
2678 s += numlen;
2679 }
2680 else {
8bfdd7d9 2681 if (RsPARA(PL_rs)) {
7889fe52
NIS
2682 PL_ors_sv = newSVpvn("\n\n",2);
2683 }
2684 else {
8bfdd7d9 2685 PL_ors_sv = newSVsv(PL_rs);
c07a80fd 2686 }
79072805
LW
2687 }
2688 return s;
06492da6
SF
2689 case 'A':
2690 forbid_setid("-A");
930366bd
RGS
2691 if (!PL_preambleav)
2692 PL_preambleav = newAV();
06492da6 2693 if (*++s) {
3d27e215
LM
2694 SV *sv = newSVpv("use assertions::activate split(/,/,q", 0);
2695 sv_catpvn(sv, "\0", 1); /* Use NUL as q//-delimiter. */
06492da6 2696 sv_catpv(sv,s);
3d27e215 2697 sv_catpvn(sv, "\0)", 2);
06492da6 2698 s+=strlen(s);
06492da6
SF
2699 av_push(PL_preambleav, sv);
2700 }
2701 else
930366bd 2702 av_push(PL_preambleav, newSVpvn("use assertions::activate",24));
06492da6 2703 return s;
1a30305b 2704 case 'M':
bbce6d69 2705 forbid_setid("-M"); /* XXX ? */
1a30305b 2706 /* FALL THROUGH */
2707 case 'm':
bbce6d69 2708 forbid_setid("-m"); /* XXX ? */
1a30305b 2709 if (*++s) {
a5f75d66 2710 char *start;
11343788 2711 SV *sv;
a5f75d66
AD
2712 char *use = "use ";
2713 /* -M-foo == 'no foo' */
2714 if (*s == '-') { use = "no "; ++s; }
11343788 2715 sv = newSVpv(use,0);
a5f75d66 2716 start = s;
1a30305b 2717 /* We allow -M'Module qw(Foo Bar)' */
c07a80fd 2718 while(isALNUM(*s) || *s==':') ++s;
2719 if (*s != '=') {
11343788 2720 sv_catpv(sv, start);
c07a80fd 2721 if (*(start-1) == 'm') {
2722 if (*s != '\0')
cea2e8a9 2723 Perl_croak(aTHX_ "Can't use '%c' after -mname", *s);
11343788 2724 sv_catpv( sv, " ()");
c07a80fd 2725 }
2726 } else {
6df41af2 2727 if (s == start)
be98fb35
GS
2728 Perl_croak(aTHX_ "Module name required with -%c option",
2729 s[-1]);
11343788 2730 sv_catpvn(sv, start, s-start);
3d27e215
LM
2731 sv_catpv(sv, " split(/,/,q");
2732 sv_catpvn(sv, "\0)", 1); /* Use NUL as q//-delimiter. */
11343788 2733 sv_catpv(sv, ++s);
3d27e215 2734 sv_catpvn(sv, "\0)", 2);
c07a80fd 2735 }
1a30305b 2736 s += strlen(s);
5c831c24 2737 if (!PL_preambleav)
3280af22
NIS
2738 PL_preambleav = newAV();
2739 av_push(PL_preambleav, sv);
1a30305b 2740 }
2741 else
9e81e6a1 2742 Perl_croak(aTHX_ "Missing argument to -%c", *(s-1));
1a30305b 2743 return s;
79072805 2744 case 'n':
3280af22 2745 PL_minus_n = TRUE;
79072805
LW
2746 s++;
2747 return s;
2748 case 'p':
3280af22 2749 PL_minus_p = TRUE;
79072805
LW
2750 s++;
2751 return s;
2752 case 's':
bbce6d69 2753 forbid_setid("-s");
3280af22 2754 PL_doswitches = TRUE;
79072805
LW
2755 s++;
2756 return s;
6537fe72
MS
2757 case 't':
2758 if (!PL_tainting)
22f7c9c9 2759 TOO_LATE_FOR('t');
6537fe72
MS
2760 s++;
2761 return s;
463ee0b2 2762 case 'T':
3280af22 2763 if (!PL_tainting)
22f7c9c9 2764 TOO_LATE_FOR('T');
463ee0b2
LW
2765 s++;
2766 return s;
79072805 2767 case 'u':
bf4acbe4
GS
2768#ifdef MACOS_TRADITIONAL
2769 Perl_croak(aTHX_ "Believe me, you don't want to use \"-u\" on a Macintosh");
2770#endif
3280af22 2771 PL_do_undump = TRUE;
79072805
LW
2772 s++;
2773 return s;
2774 case 'U':
3280af22 2775 PL_unsafe = TRUE;
79072805
LW
2776 s++;
2777 return s;
2778 case 'v':
d7aa5382
JP
2779 if (!sv_derived_from(PL_patchlevel, "version"))
2780 (void *)upg_version(PL_patchlevel);
8e9464f1 2781#if !defined(DGUX)
b0e47665 2782 PerlIO_printf(PerlIO_stdout(),
d7aa5382
JP
2783 Perl_form(aTHX_ "\nThis is perl, v%_ built for %s",
2784 vstringify(PL_patchlevel),
2785 ARCHNAME));
8e9464f1
JH
2786#else /* DGUX */
2787/* Adjust verbose output as in the perl that ships with the DG/UX OS from EMC */
2788 PerlIO_printf(PerlIO_stdout(),
d7aa5382
JP
2789 Perl_form(aTHX_ "\nThis is perl, v%_\n",
2790 vstringify(PL_patchlevel)));
8e9464f1
JH
2791 PerlIO_printf(PerlIO_stdout(),
2792 Perl_form(aTHX_ " built under %s at %s %s\n",
2793 OSNAME, __DATE__, __TIME__));
2794 PerlIO_printf(PerlIO_stdout(),
2795 Perl_form(aTHX_ " OS Specific Release: %s\n",
40a39f85 2796 OSVERS));
8e9464f1
JH
2797#endif /* !DGUX */
2798
fb73857a 2799#if defined(LOCAL_PATCH_COUNT)
2800 if (LOCAL_PATCH_COUNT > 0)
b0e47665
GS
2801 PerlIO_printf(PerlIO_stdout(),
2802 "\n(with %d registered patch%s, "
2803 "see perl -V for more detail)",
2804 (int)LOCAL_PATCH_COUNT,
2805 (LOCAL_PATCH_COUNT!=1) ? "es" : "");
a5f75d66 2806#endif
1a30305b 2807
b0e47665 2808 PerlIO_printf(PerlIO_stdout(),
45a2796c 2809 "\n\nCopyright 1987-2004, Larry Wall\n");
eae9c151
JH
2810#ifdef MACOS_TRADITIONAL
2811 PerlIO_printf(PerlIO_stdout(),
be3c0a43 2812 "\nMac OS port Copyright 1991-2002, Matthias Neeracher;\n"
03765510 2813 "maintained by Chris Nandor\n");
eae9c151 2814#endif
79072805 2815#ifdef MSDOS
b0e47665
GS
2816 PerlIO_printf(PerlIO_stdout(),
2817 "\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
55497cff 2818#endif
2819#ifdef DJGPP
b0e47665
GS
2820 PerlIO_printf(PerlIO_stdout(),
2821 "djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n"
2822 "djgpp v2 port (perl5004+) by Laszlo Molnar, 1997-1999\n");
4633a7c4 2823#endif
79072805 2824#ifdef OS2
b0e47665
GS
2825 PerlIO_printf(PerlIO_stdout(),
2826 "\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
be3c0a43 2827 "Version 5 port Copyright (c) 1994-2002, Andreas Kaiser, Ilya Zakharevich\n");
79072805 2828#endif
79072805 2829#ifdef atarist
b0e47665
GS
2830 PerlIO_printf(PerlIO_stdout(),
2831 "atariST series port, ++jrb bammi@cadence.com\n");
79072805 2832#endif
a3f9223b 2833#ifdef __BEOS__
b0e47665
GS
2834 PerlIO_printf(PerlIO_stdout(),
2835 "BeOS port Copyright Tom Spindler, 1997-1999\n");
a3f9223b 2836#endif
1d84e8df 2837#ifdef MPE
b0e47665 2838 PerlIO_printf(PerlIO_stdout(),
e583a879 2839 "MPE/iX port Copyright by Mark Klein and Mark Bixby, 1996-2003\n");
1d84e8df 2840#endif
9d116dd7 2841#ifdef OEMVS
b0e47665
GS
2842 PerlIO_printf(PerlIO_stdout(),
2843 "MVS (OS390) port by Mortice Kern Systems, 1997-1999\n");
9d116dd7 2844#endif
495c5fdc 2845#ifdef __VOS__
b0e47665 2846 PerlIO_printf(PerlIO_stdout(),
94efb9fb 2847 "Stratus VOS port by Paul.Green@stratus.com, 1997-2002\n");
495c5fdc 2848#endif
092bebab 2849#ifdef __OPEN_VM
b0e47665
GS
2850 PerlIO_printf(PerlIO_stdout(),
2851 "VM/ESA port by Neale Ferguson, 1998-1999\n");
092bebab 2852#endif
a1a0e61e 2853#ifdef POSIX_BC
b0e47665
GS
2854 PerlIO_printf(PerlIO_stdout(),
2855 "BS2000 (POSIX) port by Start Amadeus GmbH, 1998-1999\n");
a1a0e61e 2856#endif
61ae2fbf 2857#ifdef __MINT__
b0e47665
GS
2858 PerlIO_printf(PerlIO_stdout(),
2859 "MiNT port by Guido Flohr, 1997-1999\n");
61ae2fbf 2860#endif
f83d2536 2861#ifdef EPOC
b0e47665 2862 PerlIO_printf(PerlIO_stdout(),
be3c0a43 2863 "EPOC port by Olaf Flebbe, 1999-2002\n");
f83d2536 2864#endif
e1caacb4 2865#ifdef UNDER_CE
b475b3e6
JH
2866 PerlIO_printf(PerlIO_stdout(),"WINCE port by Rainer Keuchel, 2001-2002\n");
2867 PerlIO_printf(PerlIO_stdout(),"Built on " __DATE__ " " __TIME__ "\n\n");
e1caacb4
JH
2868 wce_hitreturn();
2869#endif
baed7233
DL
2870#ifdef BINARY_BUILD_NOTICE
2871 BINARY_BUILD_NOTICE;
2872#endif
b0e47665
GS
2873 PerlIO_printf(PerlIO_stdout(),
2874 "\n\
79072805 2875Perl may be copied only under the terms of either the Artistic License or the\n\
3d6f292d 2876GNU General Public License, which may be found in the Perl 5 source kit.\n\n\
95103687
GS
2877Complete documentation for Perl, including FAQ lists, should be found on\n\
2878this system using `man perl' or `perldoc perl'. If you have access to the\n\
c9e30dd8 2879Internet, point your browser at http://www.perl.org/, the Perl Home Page.\n\n");
7ca617d0 2880 my_exit(0);
79072805 2881 case 'w':
599cee73 2882 if (! (PL_dowarn & G_WARN_ALL_MASK))
ac27b0f5 2883 PL_dowarn |= G_WARN_ON;
599cee73
PM
2884 s++;
2885 return s;
2886 case 'W':
ac27b0f5 2887 PL_dowarn = G_WARN_ALL_ON|G_WARN_ON;
317ea90d
MS
2888 if (!specialWARN(PL_compiling.cop_warnings))
2889 SvREFCNT_dec(PL_compiling.cop_warnings);
d3a7d8c7 2890 PL_compiling.cop_warnings = pWARN_ALL ;
599cee73
PM
2891 s++;
2892 return s;
2893 case 'X':
ac27b0f5 2894 PL_dowarn = G_WARN_ALL_OFF;
317ea90d
MS
2895 if (!specialWARN(PL_compiling.cop_warnings))
2896 SvREFCNT_dec(PL_compiling.cop_warnings);
d3a7d8c7 2897 PL_compiling.cop_warnings = pWARN_NONE ;
79072805
LW
2898 s++;
2899 return s;
a0d0e21e 2900 case '*':
79072805
LW
2901 case ' ':
2902 if (s[1] == '-') /* Additional switches on #! line. */
2903 return s+2;
2904 break;
a0d0e21e 2905 case '-':
79072805 2906 case 0:
51882d45 2907#if defined(WIN32) || !defined(PERL_STRICT_CR)
a868473f
NIS
2908 case '\r':
2909#endif
79072805
LW
2910 case '\n':
2911 case '\t':
2912 break;
aa689395 2913#ifdef ALTERNATE_SHEBANG
2914 case 'S': /* OS/2 needs -S on "extproc" line. */
2915 break;
2916#endif
a0d0e21e 2917 case 'P':
3280af22 2918 if (PL_preprocess)
a0d0e21e
LW
2919 return s+1;
2920 /* FALL THROUGH */
79072805 2921 default:
cea2e8a9 2922 Perl_croak(aTHX_ "Can't emulate -%.1s on #! line",s);
79072805
LW
2923 }
2924 return Nullch;
2925}
2926
2927/* compliments of Tom Christiansen */
2928
2929/* unexec() can be found in the Gnu emacs distribution */
ee580363 2930/* Known to work with -DUNEXEC and using unexelf.c from GNU emacs-20.2 */
79072805
LW
2931
2932void
864dbfa3 2933Perl_my_unexec(pTHX)
79072805
LW
2934{
2935#ifdef UNEXEC
46fc3d4c 2936 SV* prog;
2937 SV* file;
ee580363 2938 int status = 1;
79072805
LW
2939 extern int etext;
2940
ee580363 2941 prog = newSVpv(BIN_EXP, 0);
46fc3d4c 2942 sv_catpv(prog, "/perl");
6b88bc9c 2943 file = newSVpv(PL_origfilename, 0);
46fc3d4c 2944 sv_catpv(file, ".perldump");
79072805 2945
ee580363
GS
2946 unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
2947 /* unexec prints msg to stderr in case of failure */
6ad3d225 2948 PerlProc_exit(status);
79072805 2949#else
a5f75d66
AD
2950# ifdef VMS
2951# include <lib$routines.h>
2952 lib$signal(SS$_DEBUG); /* ssdef.h #included from vmsish.h */
aa689395 2953# else
79072805 2954 ABORT(); /* for use with undump */
aa689395 2955# endif
a5f75d66 2956#endif
79072805
LW
2957}
2958
cb68f92d
GS
2959/* initialize curinterp */
2960STATIC void
cea2e8a9 2961S_init_interp(pTHX)
cb68f92d
GS
2962{
2963
acfe0abc
GS
2964#ifdef MULTIPLICITY
2965# define PERLVAR(var,type)
2966# define PERLVARA(var,n,type)
2967# if defined(PERL_IMPLICIT_CONTEXT)
2968# if defined(USE_5005THREADS)
2969# define PERLVARI(var,type,init) PERL_GET_INTERP->var = init;
c5be433b 2970# define PERLVARIC(var,type,init) PERL_GET_INTERP->var = init;
acfe0abc
GS
2971# else /* !USE_5005THREADS */
2972# define PERLVARI(var,type,init) aTHX->var = init;
2973# define PERLVARIC(var,type,init) aTHX->var = init;
2974# endif /* USE_5005THREADS */
3967c732 2975# else
acfe0abc
GS
2976# define PERLVARI(var,type,init) PERL_GET_INTERP->var = init;
2977# define PERLVARIC(var,type,init) PERL_GET_INTERP->var = init;
066ef5b5 2978# endif
acfe0abc
GS
2979# include "intrpvar.h"
2980# ifndef USE_5005THREADS
2981# include "thrdvar.h"
2982# endif
2983# undef PERLVAR
2984# undef PERLVARA
2985# undef PERLVARI
2986# undef PERLVARIC
2987#else
2988# define PERLVAR(var,type)
2989# define PERLVARA(var,n,type)
2990# define PERLVARI(var,type,init) PL_##var = init;
2991# define PERLVARIC(var,type,init) PL_##var = init;
2992# include "intrpvar.h"
2993# ifndef USE_5005THREADS
2994# include "thrdvar.h"
2995# endif
2996# undef PERLVAR
2997# undef PERLVARA
2998# undef PERLVARI
2999# undef PERLVARIC
cb68f92d
GS
3000#endif
3001
cb68f92d
GS
3002}
3003
76e3520e 3004STATIC void
cea2e8a9 3005S_init_main_stash(pTHX)
79072805 3006{
463ee0b2 3007 GV *gv;
6e72f9df 3008
3280af22 3009 PL_curstash = PL_defstash = newHV();
79cb57f6 3010 PL_curstname = newSVpvn("main",4);
adbc6bb1
LW
3011 gv = gv_fetchpv("main::",TRUE, SVt_PVHV);
3012 SvREFCNT_dec(GvHV(gv));
3280af22 3013 GvHV(gv) = (HV*)SvREFCNT_inc(PL_defstash);
463ee0b2 3014 SvREADONLY_on(gv);
3280af22
NIS
3015 HvNAME(PL_defstash) = savepv("main");
3016 PL_incgv = gv_HVadd(gv_AVadd(gv_fetchpv("INC",TRUE, SVt_PVAV)));
3017 GvMULTI_on(PL_incgv);
3018 PL_hintgv = gv_fetchpv("\010",TRUE, SVt_PV); /* ^H */
3019 GvMULTI_on(PL_hintgv);
3020 PL_defgv = gv_fetchpv("_",TRUE, SVt_PVAV);
3021 PL_errgv = gv_HVadd(gv_fetchpv("@", TRUE, SVt_PV));
3022 GvMULTI_on(PL_errgv);
3023 PL_replgv = gv_fetchpv("\022", TRUE, SVt_PV); /* ^R */
3024 GvMULTI_on(PL_replgv);
cea2e8a9 3025 (void)Perl_form(aTHX_ "%240s",""); /* Preallocate temp - for immediate signals. */
38a03e6e
MB
3026 sv_grow(ERRSV, 240); /* Preallocate - for immediate signals. */
3027 sv_setpvn(ERRSV, "", 0);
3280af22 3028 PL_curstash = PL_defstash;
11faa288 3029 CopSTASH_set(&PL_compiling, PL_defstash);
ed094faf 3030 PL_debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
3280af22 3031 PL_globalstash = GvHV(gv_fetchpv("CORE::GLOBAL::", GV_ADDMULTI, SVt_PVHV));
4633a7c4 3032 /* We must init $/ before switches are processed. */
864dbfa3 3033 sv_setpvn(get_sv("/", TRUE), "\n", 1);
79072805
LW
3034}
3035
ae3f3efd 3036/* PSz 18 Nov 03 fdscript now global but do not change prototype */
76e3520e 3037STATIC void
c5cccb17 3038S_open_script(pTHX_ char *scriptname, bool dosearch, SV *sv)
79072805 3039{
ae3f3efd 3040#ifndef IAMSUID
1b24ed4b
MS
3041 char *quote;
3042 char *code;
3043 char *cpp_discard_flag;
3044 char *perl;
ae3f3efd 3045#endif
1b24ed4b 3046
ae3f3efd
PS
3047 PL_fdscript = -1;
3048 PL_suidscript = -1;
79072805 3049
3280af22
NIS
3050 if (PL_e_script) {
3051 PL_origfilename = savepv("-e");
96436eeb 3052 }
6c4ab083
GS
3053 else {
3054 /* if find_script() returns, it returns a malloc()-ed value */
3280af22 3055 PL_origfilename = scriptname = find_script(scriptname, dosearch, NULL, 1);
6c4ab083
GS
3056
3057 if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
3058 char *s = scriptname + 8;
ae3f3efd 3059 PL_fdscript = atoi(s);
6c4ab083
GS
3060 while (isDIGIT(*s))
3061 s++;
3062 if (*s) {
ae3f3efd
PS
3063 /* PSz 18 Feb 04
3064 * Tell apart "normal" usage of fdscript, e.g.
3065 * with bash on FreeBSD:
3066 * perl <( echo '#!perl -DA'; echo 'print "$0\n"')
3067 * from usage in suidperl.
3068 * Does any "normal" usage leave garbage after the number???
3069 * Is it a mistake to use a similar /dev/fd/ construct for
3070 * suidperl?
3071 */
3072 PL_suidscript = 1;
3073 /* PSz 20 Feb 04
3074 * Be supersafe and do some sanity-checks.
3075 * Still, can we be sure we got the right thing?
3076 */
3077 if (*s != '/') {
3078 Perl_croak(aTHX_ "Wrong syntax (suid) fd script name \"%s\"\n", s);
3079 }
3080 if (! *(s+1)) {
3081 Perl_croak(aTHX_ "Missing (suid) fd script name\n");
3082 }
6c4ab083 3083 scriptname = savepv(s + 1);
3280af22
NIS
3084 Safefree(PL_origfilename);
3085 PL_origfilename = scriptname;
6c4ab083
GS
3086 }
3087 }
3088 }
3089
05ec9bb3 3090 CopFILE_free(PL_curcop);
57843af0 3091 CopFILE_set(PL_curcop, PL_origfilename);
770526c1 3092 if (*PL_origfilename == '-' && PL_origfilename[1] == '\0')
79072805 3093 scriptname = "";
ae3f3efd
PS
3094 if (PL_fdscript >= 0) {
3095 PL_rsfp = PerlIO_fdopen(PL_fdscript,PERL_SCRIPT_MODE);
1b24ed4b
MS
3096# if defined(HAS_FCNTL) && defined(F_SETFD)
3097 if (PL_rsfp)
3098 /* ensure close-on-exec */
3099 fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,1);
3100# endif
96436eeb 3101 }
ae3f3efd
PS
3102#ifdef IAMSUID
3103 else {
86207487
NC
3104 Perl_croak(aTHX_ "sperl needs fd script\n"
3105 "You should not call sperl directly; do you need to "
3106 "change a #! line\nfrom sperl to perl?\n");
3107
ae3f3efd
PS
3108/* PSz 11 Nov 03
3109 * Do not open (or do other fancy stuff) while setuid.
3110 * Perl does the open, and hands script to suidperl on a fd;
3111 * suidperl only does some checks, sets up UIDs and re-execs
3112 * perl with that fd as it has always done.
3113 */
3114 }
3115 if (PL_suidscript != 1) {
3116 Perl_croak(aTHX_ "suidperl needs (suid) fd script\n");
3117 }
3118#else /* IAMSUID */
3280af22 3119 else if (PL_preprocess) {
46fc3d4c 3120 char *cpp_cfg = CPPSTDIN;
79cb57f6 3121 SV *cpp = newSVpvn("",0);
46fc3d4c 3122 SV *cmd = NEWSV(0,0);
3123
ae58f265
JH
3124 if (cpp_cfg[0] == 0) /* PERL_MICRO? */
3125 Perl_croak(aTHX_ "Can't run with cpp -P with CPPSTDIN undefined");
46fc3d4c 3126 if (strEQ(cpp_cfg, "cppstdin"))
cea2e8a9 3127 Perl_sv_catpvf(aTHX_ cpp, "%s/", BIN_EXP);
46fc3d4c 3128 sv_catpv(cpp, cpp_cfg);
79072805 3129
1b24ed4b
MS
3130# ifndef VMS
3131 sv_catpvn(sv, "-I", 2);
3132 sv_catpv(sv,PRIVLIB_EXP);
3133# endif
46fc3d4c 3134
14953ddc
MB
3135 DEBUG_P(PerlIO_printf(Perl_debug_log,
3136 "PL_preprocess: scriptname=\"%s\", cpp=\"%s\", sv=\"%s\", CPPMINUS=\"%s\"\n",
3137 scriptname, SvPVX (cpp), SvPVX (sv), CPPMINUS));
1b24ed4b
MS
3138
3139# if defined(MSDOS) || defined(WIN32) || defined(VMS)
3140 quote = "\"";
3141# else
3142 quote = "'";
3143# endif
3144
3145# ifdef VMS
3146 cpp_discard_flag = "";
3147# else
3148 cpp_discard_flag = "-C";
3149# endif
3150
3151# ifdef OS2
3152 perl = os2_execname(aTHX);
3153# else
3154 perl = PL_origargv[0];
3155# endif
3156
3157
3158 /* This strips off Perl comments which might interfere with
62375a60
NIS
3159 the C pre-processor, including #!. #line directives are
3160 deliberately stripped to avoid confusion with Perl's version
1b24ed4b
MS
3161 of #line. FWP played some golf with it so it will fit
3162 into VMS's 255 character buffer.
3163 */
3164 if( PL_doextract )
3165 code = "(1../^#!.*perl/i)|/^\\s*#(?!\\s*((ifn?|un)def|(el|end)?if|define|include|else|error|pragma)\\b)/||!($|=1)||print";
3166 else
3167 code = "/^\\s*#(?!\\s*((ifn?|un)def|(el|end)?if|define|include|else|error|pragma)\\b)/||!($|=1)||print";
3168
3169 Perl_sv_setpvf(aTHX_ cmd, "\
3170%s -ne%s%s%s %s | %"SVf" %s %"SVf" %s",
62375a60 3171 perl, quote, code, quote, scriptname, cpp,
1b24ed4b
MS
3172 cpp_discard_flag, sv, CPPMINUS);
3173
3280af22 3174 PL_doextract = FALSE;
0a6c758d 3175
62375a60
NIS
3176 DEBUG_P(PerlIO_printf(Perl_debug_log,
3177 "PL_preprocess: cmd=\"%s\"\n",
0a6c758d
MS
3178 SvPVX(cmd)));
3179
3280af22 3180 PL_rsfp = PerlProc_popen(SvPVX(cmd), "r");
46fc3d4c 3181 SvREFCNT_dec(cmd);
3182 SvREFCNT_dec(cpp);
79072805
LW
3183 }
3184 else if (!*scriptname) {
bbce6d69 3185 forbid_setid("program input from stdin");
3280af22 3186 PL_rsfp = PerlIO_stdin();
79072805 3187 }
96436eeb 3188 else {
3280af22 3189 PL_rsfp = PerlIO_open(scriptname,PERL_SCRIPT_MODE);
1b24ed4b
MS
3190# if defined(HAS_FCNTL) && defined(F_SETFD)
3191 if (PL_rsfp)
3192 /* ensure close-on-exec */
3193 fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,1);
3194# endif
96436eeb 3195 }
ae3f3efd 3196#endif /* IAMSUID */
3280af22 3197 if (!PL_rsfp) {
447218f8 3198 /* PSz 16 Sep 03 Keep neat error message */
fa3aa65a
JC
3199 Perl_croak(aTHX_ "Can't open perl script \"%s\": %s\n",
3200 CopFILE(PL_curcop), Strerror(errno));
13281fa4 3201 }
79072805 3202}
8d063cd8 3203
7b89560d
JH
3204/* Mention
3205 * I_SYSSTATVFS HAS_FSTATVFS
3206 * I_SYSMOUNT
c890dc6c 3207 * I_STATFS HAS_FSTATFS HAS_GETFSSTAT
7b89560d
JH
3208 * I_MNTENT HAS_GETMNTENT HAS_HASMNTOPT
3209 * here so that metaconfig picks them up. */
3210
104d25b7 3211#ifdef IAMSUID
864dbfa3 3212STATIC int
e688b231 3213S_fd_on_nosuid_fs(pTHX_ int fd)
104d25b7 3214{
ae3f3efd
PS
3215/* PSz 27 Feb 04
3216 * We used to do this as "plain" user (after swapping UIDs with setreuid);
3217 * but is needed also on machines without setreuid.
3218 * Seems safe enough to run as root.
3219 */
0545a864
JH
3220 int check_okay = 0; /* able to do all the required sys/libcalls */
3221 int on_nosuid = 0; /* the fd is on a nosuid fs */
ae3f3efd
PS
3222 /* PSz 12 Nov 03
3223 * Need to check noexec also: nosuid might not be set, the average
3224 * sysadmin would say that nosuid is irrelevant once he sets noexec.
3225 */
3226 int on_noexec = 0; /* the fd is on a noexec fs */
3227
104d25b7 3228/*
ad27e871 3229 * Preferred order: fstatvfs(), fstatfs(), ustat()+getmnt(), getmntent().
e688b231 3230 * fstatvfs() is UNIX98.
0545a864 3231 * fstatfs() is 4.3 BSD.
ad27e871 3232 * ustat()+getmnt() is pre-4.3 BSD.
0545a864
JH
3233 * getmntent() is O(number-of-mounted-filesystems) and can hang on
3234 * an irrelevant filesystem while trying to reach the right one.
104d25b7
JH
3235 */
3236
6439433f
JH
3237#undef FD_ON_NOSUID_CHECK_OKAY /* found the syscalls to do the check? */
3238
3239# if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
3240 defined(HAS_FSTATVFS)
3241# define FD_ON_NOSUID_CHECK_OKAY
104d25b7 3242 struct statvfs stfs;
6439433f 3243
104d25b7
JH
3244 check_okay = fstatvfs(fd, &stfs) == 0;
3245 on_nosuid = check_okay && (stfs.f_flag & ST_NOSUID);
ae3f3efd
PS
3246#ifdef ST_NOEXEC
3247 /* ST_NOEXEC certainly absent on AIX 5.1, and doesn't seem to be documented
3248 on platforms where it is present. */
3249 on_noexec = check_okay && (stfs.f_flag & ST_NOEXEC);
3250#endif
6439433f 3251# endif /* fstatvfs */
ac27b0f5 3252
6439433f
JH
3253# if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
3254 defined(PERL_MOUNT_NOSUID) && \
ae3f3efd 3255 defined(PERL_MOUNT_NOEXEC) && \
6439433f
JH
3256 defined(HAS_FSTATFS) && \
3257 defined(HAS_STRUCT_STATFS) && \
3258 defined(HAS_STRUCT_STATFS_F_FLAGS)
3259# define FD_ON_NOSUID_CHECK_OKAY
e688b231 3260 struct statfs stfs;
6439433f 3261
104d25b7 3262 check_okay = fstatfs(fd, &stfs) == 0;
104d25b7 3263 on_nosuid = check_okay && (stfs.f_flags & PERL_MOUNT_NOSUID);
ae3f3efd 3264 on_noexec = check_okay && (stfs.f_flags & PERL_MOUNT_NOEXEC);
6439433f
JH
3265# endif /* fstatfs */
3266
3267# if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
3268 defined(PERL_MOUNT_NOSUID) && \
ae3f3efd 3269 defined(PERL_MOUNT_NOEXEC) && \
6439433f
JH
3270 defined(HAS_FSTAT) && \
3271 defined(HAS_USTAT) && \
3272 defined(HAS_GETMNT) && \
3273 defined(HAS_STRUCT_FS_DATA) && \
3274 defined(NOSTAT_ONE)
3275# define FD_ON_NOSUID_CHECK_OKAY
c623ac67 3276 Stat_t fdst;
6439433f 3277
0545a864 3278 if (fstat(fd, &fdst) == 0) {
6439433f
JH
3279 struct ustat us;
3280 if (ustat(fdst.st_dev, &us) == 0) {
3281 struct fs_data fsd;
3282 /* NOSTAT_ONE here because we're not examining fields which
3283 * vary between that case and STAT_ONE. */
ad27e871 3284 if (getmnt((int*)0, &fsd, (int)0, NOSTAT_ONE, us.f_fname) == 0) {
6439433f
JH
3285 size_t cmplen = sizeof(us.f_fname);
3286 if (sizeof(fsd.fd_req.path) < cmplen)
3287 cmplen = sizeof(fsd.fd_req.path);
3288 if (strnEQ(fsd.fd_req.path, us.f_fname, cmplen) &&
3289 fdst.st_dev == fsd.fd_req.dev) {
3290 check_okay = 1;
3291 on_nosuid = fsd.fd_req.flags & PERL_MOUNT_NOSUID;
ae3f3efd 3292 on_noexec = fsd.fd_req.flags & PERL_MOUNT_NOEXEC;
6439433f
JH
3293 }
3294 }
3295 }
3296 }
0545a864 3297 }
6439433f
JH
3298# endif /* fstat+ustat+getmnt */
3299
3300# if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
3301 defined(HAS_GETMNTENT) && \
3302 defined(HAS_HASMNTOPT) && \
ae3f3efd
PS
3303 defined(MNTOPT_NOSUID) && \
3304 defined(MNTOPT_NOEXEC)
6439433f
JH
3305# define FD_ON_NOSUID_CHECK_OKAY
3306 FILE *mtab = fopen("/etc/mtab", "r");
3307 struct mntent *entry;
c623ac67 3308 Stat_t stb, fsb;
104d25b7
JH
3309
3310 if (mtab && (fstat(fd, &stb) == 0)) {
6439433f
JH
3311 while (entry = getmntent(mtab)) {
3312 if (stat(entry->mnt_dir, &fsb) == 0
3313 && fsb.st_dev == stb.st_dev)
3314 {
3315 /* found the filesystem */
3316 check_okay = 1;
3317 if (hasmntopt(entry, MNTOPT_NOSUID))
3318 on_nosuid = 1;
ae3f3efd
PS
3319 if (hasmntopt(entry, MNTOPT_NOEXEC))
3320 on_noexec = 1;
6439433f
JH
3321 break;
3322 } /* A single fs may well fail its stat(). */
3323 }
104d25b7
JH
3324 }
3325 if (mtab)
6439433f
JH
3326 fclose(mtab);
3327# endif /* getmntent+hasmntopt */
0545a864 3328
ac27b0f5 3329 if (!check_okay)
ae3f3efd
PS
3330 Perl_croak(aTHX_ "Can't check filesystem of script \"%s\" for nosuid/noexec", PL_origfilename);
3331 if (on_nosuid)
3332 Perl_croak(aTHX_ "Setuid script \"%s\" on nosuid filesystem", PL_origfilename);
3333 if (on_noexec)
3334 Perl_croak(aTHX_ "Setuid script \"%s\" on noexec filesystem", PL_origfilename);
3335 return ((!check_okay) || on_nosuid || on_noexec);
104d25b7
JH
3336}
3337#endif /* IAMSUID */
3338
76e3520e 3339STATIC void
c5cccb17 3340S_validate_suid(pTHX_ char *validarg, char *scriptname)
79072805 3341{
155aba94 3342#ifdef IAMSUID
ae3f3efd
PS
3343 /* int which; */
3344#endif /* IAMSUID */
96436eeb 3345
13281fa4
LW
3346 /* do we need to emulate setuid on scripts? */
3347
3348 /* This code is for those BSD systems that have setuid #! scripts disabled
3349 * in the kernel because of a security problem. Merely defining DOSUID
3350 * in perl will not fix that problem, but if you have disabled setuid
3351 * scripts in the kernel, this will attempt to emulate setuid and setgid
3352 * on scripts that have those now-otherwise-useless bits set. The setuid
27e2fb84
LW
3353 * root version must be called suidperl or sperlN.NNN. If regular perl
3354 * discovers that it has opened a setuid script, it calls suidperl with
3355 * the same argv that it had. If suidperl finds that the script it has
3356 * just opened is NOT setuid root, it sets the effective uid back to the
3357 * uid. We don't just make perl setuid root because that loses the
3358 * effective uid we had before invoking perl, if it was different from the
3359 * uid.
ae3f3efd
PS
3360 * PSz 27 Feb 04
3361 * Description/comments above do not match current workings:
3362 * suidperl must be hardlinked to sperlN.NNN (that is what we exec);
3363 * suidperl called with script open and name changed to /dev/fd/N/X;
3364 * suidperl croaks if script is not setuid;
3365 * making perl setuid would be a huge security risk (and yes, that
3366 * would lose any euid we might have had).
13281fa4
LW
3367 *
3368 * DOSUID must be defined in both perl and suidperl, and IAMSUID must
3369 * be defined in suidperl only. suidperl must be setuid root. The
3370 * Configure script will set this up for you if you want it.
3371 */
a687059c 3372
13281fa4 3373#ifdef DOSUID
6e72f9df 3374 char *s, *s2;
a0d0e21e 3375
b28d0864 3376 if (PerlLIO_fstat(PerlIO_fileno(PL_rsfp),&PL_statbuf) < 0) /* normal stat is insecure */
cea2e8a9 3377 Perl_croak(aTHX_ "Can't stat script \"%s\"",PL_origfilename);
ae3f3efd 3378 if (PL_statbuf.st_mode & (S_ISUID|S_ISGID)) {
79072805 3379 I32 len;
2d8e6c8d 3380 STRLEN n_a;
13281fa4 3381
a687059c 3382#ifdef IAMSUID
ae3f3efd
PS
3383 if (PL_fdscript < 0 || PL_suidscript != 1)
3384 Perl_croak(aTHX_ "Need (suid) fdscript in suidperl\n"); /* We already checked this */
3385 /* PSz 11 Nov 03
3386 * Since the script is opened by perl, not suidperl, some of these
3387 * checks are superfluous. Leaving them in probably does not lower
3388 * security(?!).
3389 */
3390 /* PSz 27 Feb 04
3391 * Do checks even for systems with no HAS_SETREUID.
3392 * We used to swap, then re-swap UIDs with
3393#ifdef HAS_SETREUID
3394 if (setreuid(PL_euid,PL_uid) < 0
3395 || PerlProc_getuid() != PL_euid || PerlProc_geteuid() != PL_uid)
3396 Perl_croak(aTHX_ "Can't swap uid and euid");
3397#endif
3398#ifdef HAS_SETREUID
3399 if (setreuid(PL_uid,PL_euid) < 0
3400 || PerlProc_getuid() != PL_uid || PerlProc_geteuid() != PL_euid)
3401 Perl_croak(aTHX_ "Can't reswap uid and euid");
3402#endif
3403 */
3404
a687059c
LW
3405 /* On this access check to make sure the directories are readable,
3406 * there is actually a small window that the user could use to make
3407 * filename point to an accessible directory. So there is a faint
3408 * chance that someone could execute a setuid script down in a
3409 * non-accessible directory. I don't know what to do about that.
3410 * But I don't think it's too important. The manual lies when
3411 * it says access() is useful in setuid programs.
ae3f3efd
PS
3412 *
3413 * So, access() is pretty useless... but not harmful... do anyway.
a687059c 3414 */
e57400b1 3415 if (PerlLIO_access(CopFILE(PL_curcop),1)) { /*double check*/
ae3f3efd 3416 Perl_croak(aTHX_ "Can't access() script\n");
e57400b1 3417 }
ae3f3efd 3418
a687059c
LW
3419 /* If we can swap euid and uid, then we can determine access rights
3420 * with a simple stat of the file, and then compare device and
3421 * inode to make sure we did stat() on the same file we opened.
3422 * Then we just have to make sure he or she can execute it.
ae3f3efd
PS
3423 *
3424 * PSz 24 Feb 04
3425 * As the script is opened by perl, not suidperl, we do not need to
3426 * care much about access rights.
3427 *
3428 * The 'script changed' check is needed, or we can get lied to
3429 * about $0 with e.g.
3430 * suidperl /dev/fd/4//bin/x 4<setuidscript
3431 * Without HAS_SETREUID, is it safe to stat() as root?
3432 *
3433 * Are there any operating systems that pass /dev/fd/xxx for setuid
3434 * scripts, as suggested/described in perlsec(1)? Surely they do not
3435 * pass the script name as we do, so the "script changed" test would
3436 * fail for them... but we never get here with
3437 * SETUID_SCRIPTS_ARE_SECURE_NOW defined.
3438 *
3439 * This is one place where we must "lie" about return status: not
3440 * say if the stat() failed. We are doing this as root, and could
3441 * be tricked into reporting existence or not of files that the
3442 * "plain" user cannot even see.
a687059c
LW
3443 */
3444 {
c623ac67 3445 Stat_t tmpstatbuf;
ae3f3efd
PS
3446 if (PerlLIO_stat(CopFILE(PL_curcop),&tmpstatbuf) < 0 ||
3447 tmpstatbuf.st_dev != PL_statbuf.st_dev ||
b28d0864 3448 tmpstatbuf.st_ino != PL_statbuf.st_ino) {
ae3f3efd 3449 Perl_croak(aTHX_ "Setuid script changed\n");
a687059c 3450 }
ae3f3efd 3451
a687059c 3452 }
ae3f3efd
PS
3453 if (!cando(S_IXUSR,FALSE,&PL_statbuf)) /* can real uid exec? */
3454 Perl_croak(aTHX_ "Real UID cannot exec script\n");
3455
3456 /* PSz 27 Feb 04
3457 * We used to do this check as the "plain" user (after swapping
3458 * UIDs). But the check for nosuid and noexec filesystem is needed,
3459 * and should be done even without HAS_SETREUID. (Maybe those
3460 * operating systems do not have such mount options anyway...)
3461 * Seems safe enough to do as root.
3462 */
3463#if !defined(NO_NOSUID_CHECK)
3464 if (fd_on_nosuid_fs(PerlIO_fileno(PL_rsfp))) {
3465 Perl_croak(aTHX_ "Setuid script on nosuid or noexec filesystem\n");
3466 }
3467#endif
a687059c
LW
3468#endif /* IAMSUID */
3469
e57400b1 3470 if (!S_ISREG(PL_statbuf.st_mode)) {
ae3f3efd 3471 Perl_croak(aTHX_ "Setuid script not plain file\n");
e57400b1 3472 }
b28d0864 3473 if (PL_statbuf.st_mode & S_IWOTH)
cea2e8a9 3474 Perl_croak(aTHX_ "Setuid/gid script is writable by world");
6b88bc9c 3475 PL_doswitches = FALSE; /* -s is insecure in suid */
ae3f3efd 3476 /* PSz 13 Nov 03 But -s was caught elsewhere ... so unsetting it here is useless(?!) */
57843af0 3477 CopLINE_inc(PL_curcop);
6b88bc9c 3478 if (sv_gets(PL_linestr, PL_rsfp, 0) == Nullch ||
2d8e6c8d 3479 strnNE(SvPV(PL_linestr,n_a),"#!",2) ) /* required even on Sys V */
cea2e8a9 3480 Perl_croak(aTHX_ "No #! line");
2d8e6c8d 3481 s = SvPV(PL_linestr,n_a)+2;
ae3f3efd
PS
3482 /* PSz 27 Feb 04 */
3483 /* Sanity check on line length */
3484 if (strlen(s) < 1 || strlen(s) > 4000)
3485 Perl_croak(aTHX_ "Very long #! line");
3486 /* Allow more than a single space after #! */
3487 while (isSPACE(*s)) s++;
3488 /* Sanity check on buffer end */
3489 while ((*s) && !isSPACE(*s)) s++;
2d8e6c8d 3490 for (s2 = s; (s2 > SvPV(PL_linestr,n_a)+2 &&
3792a11b
NC
3491 (isDIGIT(s2[-1]) || s2[-1] == '.' || s2[-1] == '_'
3492 || s2[-1] == '-')); s2--) ;
ae3f3efd
PS
3493 /* Sanity check on buffer start */
3494 if ( (s2-4 < SvPV(PL_linestr,n_a)+2 || strnNE(s2-4,"perl",4)) &&
3495 (s-9 < SvPV(PL_linestr,n_a)+2 || strnNE(s-9,"perl",4)) )
cea2e8a9 3496 Perl_croak(aTHX_ "Not a perl script");
a687059c 3497 while (*s == ' ' || *s == '\t') s++;
13281fa4
LW
3498 /*
3499 * #! arg must be what we saw above. They can invoke it by
3500 * mentioning suidperl explicitly, but they may not add any strange
3501 * arguments beyond what #! says if they do invoke suidperl that way.
3502 */
ae3f3efd
PS
3503 /*
3504 * The way validarg was set up, we rely on the kernel to start
3505 * scripts with argv[1] set to contain all #! line switches (the
3506 * whole line).
3507 */
3508 /*
3509 * Check that we got all the arguments listed in the #! line (not
3510 * just that there are no extraneous arguments). Might not matter
3511 * much, as switches from #! line seem to be acted upon (also), and
3512 * so may be checked and trapped in perl. But, security checks must
3513 * be done in suidperl and not deferred to perl. Note that suidperl
3514 * does not get around to parsing (and checking) the switches on
3515 * the #! line (but execs perl sooner).
3516 * Allow (require) a trailing newline (which may be of two
3517 * characters on some architectures?) (but no other trailing
3518 * whitespace).
3519 */
13281fa4
LW
3520 len = strlen(validarg);
3521 if (strEQ(validarg," PHOOEY ") ||
ae3f3efd
PS
3522 strnNE(s,validarg,len) || !isSPACE(s[len]) ||
3523 !(strlen(s) == len+1 || (strlen(s) == len+2 && isSPACE(s[len+1]))))
cea2e8a9 3524 Perl_croak(aTHX_ "Args must match #! line");
a687059c
LW
3525
3526#ifndef IAMSUID
ae3f3efd
PS
3527 if (PL_fdscript < 0 &&
3528 PL_euid != PL_uid && (PL_statbuf.st_mode & S_ISUID) &&
b28d0864
NIS
3529 PL_euid == PL_statbuf.st_uid)
3530 if (!PL_do_undump)
cea2e8a9 3531 Perl_croak(aTHX_ "YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
11fb1898 3532FIX YOUR KERNEL, OR PUT A C WRAPPER AROUND THIS SCRIPT!\n");
a687059c 3533#endif /* IAMSUID */
13281fa4 3534
ae3f3efd
PS
3535 if (PL_fdscript < 0 &&
3536 PL_euid) { /* oops, we're not the setuid root perl */
3537 /* PSz 18 Feb 04
3538 * When root runs a setuid script, we do not go through the same
3539 * steps of execing sperl and then perl with fd scripts, but
3540 * simply set up UIDs within the same perl invocation; so do
3541 * not have the same checks (on options, whatever) that we have
3542 * for plain users. No problem really: would have to be a script
3543 * that does not actually work for plain users; and if root is
3544 * foolish and can be persuaded to run such an unsafe script, he
3545 * might run also non-setuid ones, and deserves what he gets.
3546 *
3547 * Or, we might drop the PL_euid check above (and rely just on
3548 * PL_fdscript to avoid loops), and do the execs
3549 * even for root.
3550 */
13281fa4 3551#ifndef IAMSUID
ae3f3efd
PS
3552 int which;
3553 /* PSz 11 Nov 03
3554 * Pass fd script to suidperl.
3555 * Exec suidperl, substituting fd script for scriptname.
3556 * Pass script name as "subdir" of fd, which perl will grok;
3557 * in fact will use that to distinguish this from "normal"
3558 * usage, see comments above.
3559 */
3560 PerlIO_rewind(PL_rsfp);
3561 PerlLIO_lseek(PerlIO_fileno(PL_rsfp),(Off_t)0,0); /* just in case rewind didn't */
3562 /* PSz 27 Feb 04 Sanity checks on scriptname */
3563 if ((!scriptname) || (!*scriptname) ) {
3564 Perl_croak(aTHX_ "No setuid script name\n");
3565 }
3566 if (*scriptname == '-') {
3567 Perl_croak(aTHX_ "Setuid script name may not begin with dash\n");
3568 /* Or we might confuse it with an option when replacing
3569 * name in argument list, below (though we do pointer, not
3570 * string, comparisons).
3571 */
3572 }
3573 for (which = 1; PL_origargv[which] && PL_origargv[which] != scriptname; which++) ;
3574 if (!PL_origargv[which]) {
3575 Perl_croak(aTHX_ "Can't change argv to have fd script\n");
3576 }
3577 PL_origargv[which] = savepv(Perl_form(aTHX_ "/dev/fd/%d/%s",
3578 PerlIO_fileno(PL_rsfp), PL_origargv[which]));
3579#if defined(HAS_FCNTL) && defined(F_SETFD)
3580 fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,0); /* ensure no close-on-exec */
3581#endif
b35112e7 3582 PERL_FPU_PRE_EXEC
a7cb1f99 3583 PerlProc_execv(Perl_form(aTHX_ "%s/sperl"PERL_FS_VER_FMT, BIN_EXP,
273cf8d1
GS
3584 (int)PERL_REVISION, (int)PERL_VERSION,
3585 (int)PERL_SUBVERSION), PL_origargv);
b35112e7 3586 PERL_FPU_POST_EXEC
ae3f3efd
PS
3587#endif /* IAMSUID */
3588 Perl_croak(aTHX_ "Can't do setuid (cannot exec sperl)\n");
13281fa4
LW
3589 }
3590
b28d0864 3591 if (PL_statbuf.st_mode & S_ISGID && PL_statbuf.st_gid != PL_egid) {
ae3f3efd
PS
3592/* PSz 26 Feb 04
3593 * This seems back to front: we try HAS_SETEGID first; if not available
3594 * then try HAS_SETREGID; as a last chance we try HAS_SETRESGID. May be OK
3595 * in the sense that we only want to set EGID; but are there any machines
3596 * with either of the latter, but not the former? Same with UID, later.
3597 */
fe14fcc3 3598#ifdef HAS_SETEGID
b28d0864 3599 (void)setegid(PL_statbuf.st_gid);
a687059c 3600#else
fe14fcc3 3601#ifdef HAS_SETREGID
b28d0864 3602 (void)setregid((Gid_t)-1,PL_statbuf.st_gid);
85e6fe83
LW
3603#else
3604#ifdef HAS_SETRESGID
b28d0864 3605 (void)setresgid((Gid_t)-1,PL_statbuf.st_gid,(Gid_t)-1);
a687059c 3606#else
b28d0864 3607 PerlProc_setgid(PL_statbuf.st_gid);
a687059c
LW
3608#endif
3609#endif
85e6fe83 3610#endif
b28d0864 3611 if (PerlProc_getegid() != PL_statbuf.st_gid)
cea2e8a9 3612 Perl_croak(aTHX_ "Can't do setegid!\n");
83025b21 3613 }
b28d0864
NIS
3614 if (PL_statbuf.st_mode & S_ISUID) {
3615 if (PL_statbuf.st_uid != PL_euid)
fe14fcc3 3616#ifdef HAS_SETEUID
b28d0864 3617 (void)seteuid(PL_statbuf.st_uid); /* all that for this */
a687059c 3618#else
fe14fcc3 3619#ifdef HAS_SETREUID
b28d0864 3620 (void)setreuid((Uid_t)-1,PL_statbuf.st_uid);
85e6fe83
LW
3621#else
3622#ifdef HAS_SETRESUID
b28d0864 3623 (void)setresuid((Uid_t)-1,PL_statbuf.st_uid,(Uid_t)-1);
a687059c 3624#else
b28d0864 3625 PerlProc_setuid(PL_statbuf.st_uid);
a687059c
LW
3626#endif
3627#endif
85e6fe83 3628#endif
b28d0864 3629 if (PerlProc_geteuid() != PL_statbuf.st_uid)
cea2e8a9 3630 Perl_croak(aTHX_ "Can't do seteuid!\n");
a687059c 3631 }
b28d0864 3632 else if (PL_uid) { /* oops, mustn't run as root */
fe14fcc3 3633#ifdef HAS_SETEUID
b28d0864 3634 (void)seteuid((Uid_t)PL_uid);
a687059c 3635#else
fe14fcc3 3636#ifdef HAS_SETREUID
b28d0864 3637 (void)setreuid((Uid_t)-1,(Uid_t)PL_uid);
a687059c 3638#else
85e6fe83 3639#ifdef HAS_SETRESUID
b28d0864 3640 (void)setresuid((Uid_t)-1,(Uid_t)PL_uid,(Uid_t)-1);
85e6fe83 3641#else
b28d0864 3642 PerlProc_setuid((Uid_t)PL_uid);
85e6fe83 3643#endif
a687059c
LW
3644#endif
3645#endif
b28d0864 3646 if (PerlProc_geteuid() != PL_uid)
cea2e8a9 3647 Perl_croak(aTHX_ "Can't do seteuid!\n");
83025b21 3648 }
748a9306 3649 init_ids();
b28d0864 3650 if (!cando(S_IXUSR,TRUE,&PL_statbuf))
ae3f3efd 3651 Perl_croak(aTHX_ "Effective UID cannot exec script\n"); /* they can't do this */
13281fa4
LW
3652 }
3653#ifdef IAMSUID
ae3f3efd 3654 else if (PL_preprocess) /* PSz 13 Nov 03 Caught elsewhere, useless(?!) here */
cea2e8a9 3655 Perl_croak(aTHX_ "-P not allowed for setuid/setgid script\n");
ae3f3efd
PS
3656 else if (PL_fdscript < 0 || PL_suidscript != 1)
3657 /* PSz 13 Nov 03 Caught elsewhere, useless(?!) here */
3658 Perl_croak(aTHX_ "(suid) fdscript needed in suidperl\n");
e57400b1 3659 else {
ae3f3efd
PS
3660/* PSz 16 Sep 03 Keep neat error message */
3661 Perl_croak(aTHX_ "Script is not setuid/setgid in suidperl\n");
e57400b1 3662 }
96436eeb 3663
3664 /* We absolutely must clear out any saved ids here, so we */
3665 /* exec the real perl, substituting fd script for scriptname. */
3666 /* (We pass script name as "subdir" of fd, which perl will grok.) */
ae3f3efd
PS
3667 /*
3668 * It might be thought that using setresgid and/or setresuid (changed to
3669 * set the saved IDs) above might obviate the need to exec, and we could
3670 * go on to "do the perl thing".
3671 *
3672 * Is there such a thing as "saved GID", and is that set for setuid (but
3673 * not setgid) execution like suidperl? Without exec, it would not be
3674 * cleared for setuid (but not setgid) scripts (or might need a dummy
3675 * setresgid).
3676 *
3677 * We need suidperl to do the exact same argument checking that perl
3678 * does. Thus it cannot be very small; while it could be significantly
3679 * smaller, it is safer (simpler?) to make it essentially the same
3680 * binary as perl (but they are not identical). - Maybe could defer that
3681 * check to the invoked perl, and suidperl be a tiny wrapper instead;
3682 * but prefer to do thorough checks in suidperl itself. Such deferral
3683 * would make suidperl security rely on perl, a design no-no.
3684 *
3685 * Setuid things should be short and simple, thus easy to understand and
3686 * verify. They should do their "own thing", without influence by
3687 * attackers. It may help if their internal execution flow is fixed,
3688 * regardless of platform: it may be best to exec anyway.
3689 *
3690 * Suidperl should at least be conceptually simple: a wrapper only,
3691 * never to do any real perl. Maybe we should put
3692 * #ifdef IAMSUID
3693 * Perl_croak(aTHX_ "Suidperl should never do real perl\n");
3694 * #endif
3695 * into the perly bits.
3696 */
b28d0864
NIS
3697 PerlIO_rewind(PL_rsfp);
3698 PerlLIO_lseek(PerlIO_fileno(PL_rsfp),(Off_t)0,0); /* just in case rewind didn't */
ae3f3efd
PS
3699 /* PSz 11 Nov 03
3700 * Keep original arguments: suidperl already has fd script.
3701 */
3702/* for (which = 1; PL_origargv[which] && PL_origargv[which] != scriptname; which++) ; */
3703/* if (!PL_origargv[which]) { */
3704/* errno = EPERM; */
3705/* Perl_croak(aTHX_ "Permission denied\n"); */
3706/* } */
3707/* PL_origargv[which] = savepv(Perl_form(aTHX_ "/dev/fd/%d/%s", */
3708/* PerlIO_fileno(PL_rsfp), PL_origargv[which])); */
96436eeb 3709#if defined(HAS_FCNTL) && defined(F_SETFD)
b28d0864 3710 fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,0); /* ensure no close-on-exec */
96436eeb 3711#endif
b35112e7 3712 PERL_FPU_PRE_EXEC
a7cb1f99 3713 PerlProc_execv(Perl_form(aTHX_ "%s/perl"PERL_FS_VER_FMT, BIN_EXP,
273cf8d1
GS
3714 (int)PERL_REVISION, (int)PERL_VERSION,
3715 (int)PERL_SUBVERSION), PL_origargv);/* try again */
b35112e7 3716 PERL_FPU_POST_EXEC
ae3f3efd 3717 Perl_croak(aTHX_ "Can't do setuid (suidperl cannot exec perl)\n");
13281fa4 3718#endif /* IAMSUID */
a687059c 3719#else /* !DOSUID */
3280af22 3720 if (PL_euid != PL_uid || PL_egid != PL_gid) { /* (suidperl doesn't exist, in fact) */
a687059c 3721#ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
b28d0864
NIS
3722 PerlLIO_fstat(PerlIO_fileno(PL_rsfp),&PL_statbuf); /* may be either wrapped or real suid */
3723 if ((PL_euid != PL_uid && PL_euid == PL_statbuf.st_uid && PL_statbuf.st_mode & S_ISUID)
a687059c 3724 ||
b28d0864 3725 (PL_egid != PL_gid && PL_egid == PL_statbuf.st_gid && PL_statbuf.st_mode & S_ISGID)
a687059c 3726 )
b28d0864 3727 if (!PL_do_undump)
cea2e8a9 3728 Perl_croak(aTHX_ "YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
a687059c
LW
3729FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
3730#endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
3731 /* not set-id, must be wrapped */
a687059c 3732 }
13281fa4 3733#endif /* DOSUID */
79072805 3734}
13281fa4 3735
76e3520e 3736STATIC void
cea2e8a9 3737S_find_beginning(pTHX)
79072805 3738{
6e72f9df 3739 register char *s, *s2;
e55ac0fa
HS
3740#ifdef MACOS_TRADITIONAL
3741 int maclines = 0;
3742#endif
33b78306
LW
3743
3744 /* skip forward in input to the real script? */
3745
bbce6d69 3746 forbid_setid("-x");
bf4acbe4 3747#ifdef MACOS_TRADITIONAL
084592ab 3748 /* Since the Mac OS does not honor #! arguments for us, we do it ourselves */
ac27b0f5 3749
bf4acbe4
GS
3750 while (PL_doextract || gMacPerl_AlwaysExtract) {
3751 if ((s = sv_gets(PL_linestr, PL_rsfp, 0)) == Nullch) {
3752 if (!gMacPerl_AlwaysExtract)
3753 Perl_croak(aTHX_ "No Perl script found in input\n");
e55ac0fa 3754
bf4acbe4
GS
3755 if (PL_doextract) /* require explicit override ? */
3756 if (!OverrideExtract(PL_origfilename))
3757 Perl_croak(aTHX_ "User aborted script\n");
3758 else
3759 PL_doextract = FALSE;
e55ac0fa 3760
bf4acbe4
GS
3761 /* Pater peccavi, file does not have #! */
3762 PerlIO_rewind(PL_rsfp);
e55ac0fa 3763
bf4acbe4
GS
3764 break;
3765 }
3766#else
3280af22
NIS
3767 while (PL_doextract) {
3768 if ((s = sv_gets(PL_linestr, PL_rsfp, 0)) == Nullch)
cea2e8a9 3769 Perl_croak(aTHX_ "No Perl script found in input\n");
bf4acbe4 3770#endif
4f0c37ba
IZ
3771 s2 = s;
3772 if (*s == '#' && s[1] == '!' && ((s = instr(s,"perl")) || (s = instr(s2,"PERL")))) {
3280af22
NIS
3773 PerlIO_ungetc(PL_rsfp, '\n'); /* to keep line count right */
3774 PL_doextract = FALSE;
6e72f9df 3775 while (*s && !(isSPACE (*s) || *s == '#')) s++;
3776 s2 = s;
3777 while (*s == ' ' || *s == '\t') s++;
3778 if (*s++ == '-') {
3792a11b
NC
3779 while (isDIGIT(s2[-1]) || s2[-1] == '-' || s2[-1] == '.'
3780 || s2[-1] == '_') s2--;
6e72f9df 3781 if (strnEQ(s2-4,"perl",4))
3782 /*SUPPRESS 530*/
155aba94
GS
3783 while ((s = moreswitches(s)))
3784 ;
33b78306 3785 }
95e8664e 3786#ifdef MACOS_TRADITIONAL
e55ac0fa
HS
3787 /* We are always searching for the #!perl line in MacPerl,
3788 * so if we find it, still keep the line count correct
3789 * by counting lines we already skipped over
3790 */
3791 for (; maclines > 0 ; maclines--)
3792 PerlIO_ungetc(PL_rsfp, '\n');
3793
95e8664e 3794 break;
e55ac0fa
HS
3795
3796 /* gMacPerl_AlwaysExtract is false in MPW tool */
3797 } else if (gMacPerl_AlwaysExtract) {
3798 ++maclines;
95e8664e 3799#endif
83025b21
LW
3800 }
3801 }
3802}
3803
afe37c7d 3804
76e3520e 3805STATIC void
cea2e8a9 3806S_init_ids(pTHX)
352d5a3a 3807{
d8eceb89
JH
3808 PL_uid = PerlProc_getuid();
3809 PL_euid = PerlProc_geteuid();
3810 PL_gid = PerlProc_getgid();
3811 PL_egid = PerlProc_getegid();
748a9306 3812#ifdef VMS
b28d0864
NIS
3813 PL_uid |= PL_gid << 16;
3814 PL_euid |= PL_egid << 16;
748a9306 3815#endif
22f7c9c9
JH
3816 /* Should not happen: */
3817 CHECK_MALLOC_TAINT(PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
3280af22 3818 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
ae3f3efd
PS
3819 /* BUG */
3820 /* PSz 27 Feb 04
3821 * Should go by suidscript, not uid!=euid: why disallow
3822 * system("ls") in scripts run from setuid things?
3823 * Or, is this run before we check arguments and set suidscript?
3824 * What about SETUID_SCRIPTS_ARE_SECURE_NOW: could we use fdscript then?
3825 * (We never have suidscript, can we be sure to have fdscript?)
3826 * Or must then go by UID checks? See comments in forbid_setid also.
3827 */
748a9306 3828}
79072805 3829
a0643315
JH
3830/* This is used very early in the lifetime of the program,
3831 * before even the options are parsed, so PL_tainting has
b0891165 3832 * not been initialized properly. */
af419de7 3833bool
22f7c9c9
JH
3834Perl_doing_taint(int argc, char *argv[], char *envp[])
3835{
c3446a78
JH
3836#ifndef PERL_IMPLICIT_SYS
3837 /* If we have PERL_IMPLICIT_SYS we can't call getuid() et alia
3838 * before we have an interpreter-- and the whole point of this
3839 * function is to be called at such an early stage. If you are on
3840 * a system with PERL_IMPLICIT_SYS but you do have a concept of
3841 * "tainted because running with altered effective ids', you'll
3842 * have to add your own checks somewhere in here. The two most
3843 * known samples of 'implicitness' are Win32 and NetWare, neither
3844 * of which has much of concept of 'uids'. */
af419de7 3845 int uid = PerlProc_getuid();
22f7c9c9 3846 int euid = PerlProc_geteuid();
af419de7 3847 int gid = PerlProc_getgid();
22f7c9c9
JH
3848 int egid = PerlProc_getegid();
3849
3850#ifdef VMS
af419de7 3851 uid |= gid << 16;
22f7c9c9
JH
3852 euid |= egid << 16;
3853#endif
3854 if (uid && (euid != uid || egid != gid))
3855 return 1;
c3446a78 3856#endif /* !PERL_IMPLICIT_SYS */
af419de7
JH
3857 /* This is a really primitive check; environment gets ignored only
3858 * if -T are the first chars together; otherwise one gets
3859 * "Too late" message. */
22f7c9c9
JH
3860 if ( argc > 1 && argv[1][0] == '-'
3861 && (argv[1][1] == 't' || argv[1][1] == 'T') )
3862 return 1;
3863 return 0;
3864}
22f7c9c9 3865
76e3520e 3866STATIC void
cea2e8a9 3867S_forbid_setid(pTHX_ char *s)
bbce6d69 3868{
ae3f3efd 3869#ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
3280af22 3870 if (PL_euid != PL_uid)
cea2e8a9 3871 Perl_croak(aTHX_ "No %s allowed while running setuid", s);
3280af22 3872 if (PL_egid != PL_gid)
cea2e8a9 3873 Perl_croak(aTHX_ "No %s allowed while running setgid", s);
ae3f3efd
PS
3874#endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
3875 /* PSz 29 Feb 04
3876 * Checks for UID/GID above "wrong": why disallow
3877 * perl -e 'print "Hello\n"'
3878 * from within setuid things?? Simply drop them: replaced by
3879 * fdscript/suidscript and #ifdef IAMSUID checks below.
3880 *
3881 * This may be too late for command-line switches. Will catch those on
3882 * the #! line, after finding the script name and setting up
3883 * fdscript/suidscript. Note that suidperl does not get around to
3884 * parsing (and checking) the switches on the #! line, but checks that
3885 * the two sets are identical.
3886 *
3887 * With SETUID_SCRIPTS_ARE_SECURE_NOW, could we use fdscript, also or
3888 * instead, or would that be "too late"? (We never have suidscript, can
3889 * we be sure to have fdscript?)
3890 *
3891 * Catch things with suidscript (in descendant of suidperl), even with
3892 * right UID/GID. Was already checked in suidperl, with #ifdef IAMSUID,
3893 * below; but I am paranoid.
3894 *
3895 * Also see comments about root running a setuid script, elsewhere.
3896 */
3897 if (PL_suidscript >= 0)
3898 Perl_croak(aTHX_ "No %s allowed with (suid) fdscript", s);
3899#ifdef IAMSUID
3900 /* PSz 11 Nov 03 Catch it in suidperl, always! */
3901 Perl_croak(aTHX_ "No %s allowed in suidperl", s);
3902#endif /* IAMSUID */
bbce6d69 3903}
3904
1ee4443e
IZ
3905void
3906Perl_init_debugger(pTHX)
748a9306 3907{
1ee4443e
IZ
3908 HV *ostash = PL_curstash;
3909
3280af22 3910 PL_curstash = PL_debstash;
7619c85e 3911 PL_dbargs = GvAV(gv_AVadd((gv_fetchpv("DB::args", GV_ADDMULTI, SVt_PVAV))));
3280af22 3912 AvREAL_off(PL_dbargs);
7619c85e
RG
3913 PL_DBgv = gv_fetchpv("DB::DB", GV_ADDMULTI, SVt_PVGV);
3914 PL_DBline = gv_fetchpv("DB::dbline", GV_ADDMULTI, SVt_PVAV);
3915 PL_DBsub = gv_HVadd(gv_fetchpv("DB::sub", GV_ADDMULTI, SVt_PVHV));
1ee4443e 3916 sv_upgrade(GvSV(PL_DBsub), SVt_IV); /* IVX accessed if PERLDB_SUB_NN */
7619c85e 3917 PL_DBsingle = GvSV((gv_fetchpv("DB::single", GV_ADDMULTI, SVt_PV)));
ac27b0f5 3918 sv_setiv(PL_DBsingle, 0);
7619c85e 3919 PL_DBtrace = GvSV((gv_fetchpv("DB::trace", GV_ADDMULTI, SVt_PV)));
ac27b0f5 3920 sv_setiv(PL_DBtrace, 0);
7619c85e 3921 PL_DBsignal = GvSV((gv_fetchpv("DB::signal", GV_ADDMULTI, SVt_PV)));
ac27b0f5 3922 sv_setiv(PL_DBsignal, 0);
bf9cdc68 3923 PL_DBassertion = GvSV((gv_fetchpv("DB::assertion", GV_ADDMULTI, SVt_PV)));
06492da6 3924 sv_setiv(PL_DBassertion, 0);
1ee4443e 3925 PL_curstash = ostash;
352d5a3a
LW
3926}
3927
2ce36478
SM
3928#ifndef STRESS_REALLOC
3929#define REASONABLE(size) (size)
3930#else
3931#define REASONABLE(size) (1) /* unreasonable */
3932#endif
3933
11343788 3934void
cea2e8a9 3935Perl_init_stacks(pTHX)
79072805 3936{
e336de0d 3937 /* start with 128-item stack and 8K cxstack */
3280af22 3938 PL_curstackinfo = new_stackinfo(REASONABLE(128),
e336de0d 3939 REASONABLE(8192/sizeof(PERL_CONTEXT) - 1));
3280af22
NIS
3940 PL_curstackinfo->si_type = PERLSI_MAIN;
3941 PL_curstack = PL_curstackinfo->si_stack;
3942 PL_mainstack = PL_curstack; /* remember in case we switch stacks */
79072805 3943
3280af22
NIS
3944 PL_stack_base = AvARRAY(PL_curstack);
3945 PL_stack_sp = PL_stack_base;
3946 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
8990e307 3947
3280af22
NIS
3948 New(50,PL_tmps_stack,REASONABLE(128),SV*);
3949 PL_tmps_floor = -1;
3950 PL_tmps_ix = -1;
3951 PL_tmps_max = REASONABLE(128);
8990e307 3952
3280af22
NIS
3953 New(54,PL_markstack,REASONABLE(32),I32);
3954 PL_markstack_ptr = PL_markstack;
3955 PL_markstack_max = PL_markstack + REASONABLE(32);
79072805 3956
ce2f7c3b 3957 SET_MARK_OFFSET;
e336de0d 3958
3280af22
NIS
3959 New(54,PL_scopestack,REASONABLE(32),I32);
3960 PL_scopestack_ix = 0;
3961 PL_scopestack_max = REASONABLE(32);
79072805 3962
3280af22
NIS
3963 New(54,PL_savestack,REASONABLE(128),ANY);
3964 PL_savestack_ix = 0;
3965 PL_savestack_max = REASONABLE(128);
378cc40b 3966}
33b78306 3967
2ce36478
SM
3968#undef REASONABLE
3969
76e3520e 3970STATIC void
cea2e8a9 3971S_nuke_stacks(pTHX)
6e72f9df 3972{
3280af22
NIS
3973 while (PL_curstackinfo->si_next)
3974 PL_curstackinfo = PL_curstackinfo->si_next;
3975 while (PL_curstackinfo) {
3976 PERL_SI *p = PL_curstackinfo->si_prev;
bac4b2ad 3977 /* curstackinfo->si_stack got nuked by sv_free_arenas() */
3280af22
NIS
3978 Safefree(PL_curstackinfo->si_cxstack);
3979 Safefree(PL_curstackinfo);
3980 PL_curstackinfo = p;
e336de0d 3981 }
3280af22
NIS
3982 Safefree(PL_tmps_stack);
3983 Safefree(PL_markstack);
3984 Safefree(PL_scopestack);
3985 Safefree(PL_savestack);
378cc40b 3986}
33b78306 3987
76e3520e 3988STATIC void
cea2e8a9 3989S_init_lexer(pTHX)
8990e307 3990{
06039172 3991 PerlIO *tmpfp;
3280af22
NIS
3992 tmpfp = PL_rsfp;
3993 PL_rsfp = Nullfp;
3994 lex_start(PL_linestr);
3995 PL_rsfp = tmpfp;
79cb57f6 3996 PL_subname = newSVpvn("main",4);
8990e307
LW
3997}
3998
76e3520e 3999STATIC void
cea2e8a9 4000S_init_predump_symbols(pTHX)
45d8adaa 4001{
93a17b20 4002 GV *tmpgv;
af8c498a 4003 IO *io;
79072805 4004
864dbfa3 4005 sv_setpvn(get_sv("\"", TRUE), " ", 1);
3280af22
NIS
4006 PL_stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
4007 GvMULTI_on(PL_stdingv);
af8c498a 4008 io = GvIOp(PL_stdingv);
a04651f4 4009 IoTYPE(io) = IoTYPE_RDONLY;
af8c498a 4010 IoIFP(io) = PerlIO_stdin();
adbc6bb1 4011 tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
a5f75d66 4012 GvMULTI_on(tmpgv);
af8c498a 4013 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
79072805 4014
85e6fe83 4015 tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
a5f75d66 4016 GvMULTI_on(tmpgv);
af8c498a 4017 io = GvIOp(tmpgv);
a04651f4 4018 IoTYPE(io) = IoTYPE_WRONLY;
af8c498a 4019 IoOFP(io) = IoIFP(io) = PerlIO_stdout();
4633a7c4 4020 setdefout(tmpgv);
adbc6bb1 4021 tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
a5f75d66 4022 GvMULTI_on(tmpgv);
af8c498a 4023 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
79072805 4024
bf49b057
GS
4025 PL_stderrgv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
4026 GvMULTI_on(PL_stderrgv);
4027 io = GvIOp(PL_stderrgv);
a04651f4 4028 IoTYPE(io) = IoTYPE_WRONLY;
af8c498a 4029 IoOFP(io) = IoIFP(io) = PerlIO_stderr();
adbc6bb1 4030 tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
a5f75d66 4031 GvMULTI_on(tmpgv);
af8c498a 4032 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
79072805 4033
3280af22 4034 PL_statname = NEWSV(66,0); /* last filename we did stat on */
ab821d7f 4035
bf4acbe4
GS
4036 if (PL_osname)
4037 Safefree(PL_osname);
4038 PL_osname = savepv(OSNAME);
79072805 4039}
33b78306 4040
a11ec5a9
RGS
4041void
4042Perl_init_argv_symbols(pTHX_ register int argc, register char **argv)
33b78306 4043{
79072805 4044 char *s;
79072805 4045 argc--,argv++; /* skip name of script */
3280af22 4046 if (PL_doswitches) {
79072805
LW
4047 for (; argc > 0 && **argv == '-'; argc--,argv++) {
4048 if (!argv[0][1])
4049 break;
379d538a 4050 if (argv[0][1] == '-' && !argv[0][2]) {
79072805
LW
4051 argc--,argv++;
4052 break;
4053 }
155aba94 4054 if ((s = strchr(argv[0], '='))) {
79072805 4055 *s++ = '\0';
85e6fe83 4056 sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),s);
79072805
LW
4057 }
4058 else
85e6fe83 4059 sv_setiv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),1);
fe14fcc3 4060 }
79072805 4061 }
a11ec5a9
RGS
4062 if ((PL_argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV))) {
4063 GvMULTI_on(PL_argvgv);
4064 (void)gv_AVadd(PL_argvgv);
4065 av_clear(GvAVn(PL_argvgv));
4066 for (; argc > 0; argc--,argv++) {
4067 SV *sv = newSVpv(argv[0],0);
4068 av_push(GvAVn(PL_argvgv),sv);
ce81ff12
JH
4069 if (!(PL_unicode & PERL_UNICODE_LOCALE_FLAG) || PL_utf8locale) {
4070 if (PL_unicode & PERL_UNICODE_ARGV_FLAG)
4071 SvUTF8_on(sv);
4072 }
a05d7ebb
JH
4073 if (PL_unicode & PERL_UNICODE_WIDESYSCALLS_FLAG) /* Sarathy? */
4074 (void)sv_utf8_decode(sv);
a11ec5a9
RGS
4075 }
4076 }
4077}
4078
4079STATIC void
4080S_init_postdump_symbols(pTHX_ register int argc, register char **argv, register char **env)
4081{
4082 char *s;
4083 SV *sv;
4084 GV* tmpgv;
a11ec5a9 4085
3280af22
NIS
4086 PL_toptarget = NEWSV(0,0);
4087 sv_upgrade(PL_toptarget, SVt_PVFM);
4088 sv_setpvn(PL_toptarget, "", 0);
4089 PL_bodytarget = NEWSV(0,0);
4090 sv_upgrade(PL_bodytarget, SVt_PVFM);
4091 sv_setpvn(PL_bodytarget, "", 0);
4092 PL_formtarget = PL_bodytarget;
79072805 4093
bbce6d69 4094 TAINT;
a11ec5a9
RGS
4095
4096 init_argv_symbols(argc,argv);
4097
155aba94 4098 if ((tmpgv = gv_fetchpv("0",TRUE, SVt_PV))) {
bf4acbe4
GS
4099#ifdef MACOS_TRADITIONAL
4100 /* $0 is not majick on a Mac */
4101 sv_setpv(GvSV(tmpgv),MacPerl_MPWFileName(PL_origfilename));
4102#else
3280af22 4103 sv_setpv(GvSV(tmpgv),PL_origfilename);
79072805 4104 magicname("0", "0", 1);
bf4acbe4 4105#endif
79072805 4106 }
155aba94 4107 if ((PL_envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV))) {
79072805 4108 HV *hv;
3280af22
NIS
4109 GvMULTI_on(PL_envgv);
4110 hv = GvHVn(PL_envgv);
14befaf4 4111 hv_magic(hv, Nullgv, PERL_MAGIC_env);
2f42fcb0 4112#ifndef PERL_MICRO
fa6a1c44 4113#ifdef USE_ENVIRON_ARRAY
4633a7c4
LW
4114 /* Note that if the supplied env parameter is actually a copy
4115 of the global environ then it may now point to free'd memory
4116 if the environment has been modified since. To avoid this
4117 problem we treat env==NULL as meaning 'use the default'
4118 */
4119 if (!env)
4120 env = environ;
4efc5df6
GS
4121 if (env != environ
4122# ifdef USE_ITHREADS
4123 && PL_curinterp == aTHX
4124# endif
4125 )
4126 {
79072805 4127 environ[0] = Nullch;
4efc5df6 4128 }
9b4eeda5
MB
4129 if (env) {
4130 char** origenv = environ;
764df951 4131 for (; *env; env++) {
9b4eeda5 4132 if (!(s = strchr(*env,'=')) || s == *env)
79072805 4133 continue;
7da0e383 4134#if defined(MSDOS) && !defined(DJGPP)
61968511 4135 *s = '\0';
137443ea 4136 (void)strupr(*env);
61968511 4137 *s = '=';
137443ea 4138#endif
61968511 4139 sv = newSVpv(s+1, 0);
79072805 4140 (void)hv_store(hv, *env, s - *env, sv, 0);
61968511
GA
4141 if (env != environ)
4142 mg_set(sv);
9b4eeda5
MB
4143 if (origenv != environ) {
4144 /* realloc has shifted us */
4145 env = (env - origenv) + environ;
4146 origenv = environ;
4147 }
764df951 4148 }
9b4eeda5 4149 }
103a7189 4150#endif /* USE_ENVIRON_ARRAY */
2f42fcb0 4151#endif /* !PERL_MICRO */
79072805 4152 }
bbce6d69 4153 TAINT_NOT;
306196c3
MS
4154 if ((tmpgv = gv_fetchpv("$",TRUE, SVt_PV))) {
4155 SvREADONLY_off(GvSV(tmpgv));
7766f137 4156 sv_setiv(GvSV(tmpgv), (IV)PerlProc_getpid());
306196c3
MS
4157 SvREADONLY_on(GvSV(tmpgv));
4158 }
4d76a344
RGS
4159#ifdef THREADS_HAVE_PIDS
4160 PL_ppid = (IV)getppid();
4161#endif
2710853f
MJD
4162
4163 /* touch @F array to prevent spurious warnings 20020415 MJD */
4164 if (PL_minus_a) {
4165 (void) get_av("main::F", TRUE | GV_ADDMULTI);
4166 }
4167 /* touch @- and @+ arrays to prevent spurious warnings 20020415 MJD */
4168 (void) get_av("main::-", TRUE | GV_ADDMULTI);
4169 (void) get_av("main::+", TRUE | GV_ADDMULTI);
33b78306 4170}
34de22dd 4171
76e3520e 4172STATIC void
cea2e8a9 4173S_init_perllib(pTHX)
34de22dd 4174{
85e6fe83 4175 char *s;
3280af22 4176 if (!PL_tainting) {
552a7a9b 4177#ifndef VMS
76e3520e 4178 s = PerlEnv_getenv("PERL5LIB");
85e6fe83 4179 if (s)
88fe16b2 4180 incpush(s, TRUE, TRUE, TRUE, FALSE);
85e6fe83 4181 else
88fe16b2 4182 incpush(PerlEnv_getenv("PERLLIB"), FALSE, FALSE, TRUE, FALSE);
552a7a9b 4183#else /* VMS */
4184 /* Treat PERL5?LIB as a possible search list logical name -- the
4185 * "natural" VMS idiom for a Unix path string. We allow each
4186 * element to be a set of |-separated directories for compatibility.
4187 */
4188 char buf[256];
4189 int idx = 0;
4190 if (my_trnlnm("PERL5LIB",buf,0))
88fe16b2 4191 do { incpush(buf,TRUE,TRUE,TRUE,FALSE); } while (my_trnlnm("PERL5LIB",buf,++idx));
552a7a9b 4192 else
88fe16b2 4193 while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE,FALSE,TRUE,FALSE);
552a7a9b 4194#endif /* VMS */
85e6fe83 4195 }
34de22dd 4196
c90c0ff4 4197/* Use the ~-expanded versions of APPLLIB (undocumented),
65f19062 4198 ARCHLIB PRIVLIB SITEARCH SITELIB VENDORARCH and VENDORLIB
df5cef82 4199*/
4633a7c4 4200#ifdef APPLLIB_EXP
88fe16b2 4201 incpush(APPLLIB_EXP, TRUE, TRUE, TRUE, TRUE);
16d20bd9 4202#endif
4633a7c4 4203
fed7345c 4204#ifdef ARCHLIB_EXP
88fe16b2 4205 incpush(ARCHLIB_EXP, FALSE, FALSE, TRUE, TRUE);
a0d0e21e 4206#endif
bf4acbe4
GS
4207#ifdef MACOS_TRADITIONAL
4208 {
c623ac67 4209 Stat_t tmpstatbuf;
bf4acbe4
GS
4210 SV * privdir = NEWSV(55, 0);
4211 char * macperl = PerlEnv_getenv("MACPERL");
4212
4213 if (!macperl)
4214 macperl = "";
4215
4216 Perl_sv_setpvf(aTHX_ privdir, "%slib:", macperl);
4217 if (PerlLIO_stat(SvPVX(privdir), &tmpstatbuf) >= 0 && S_ISDIR(tmpstatbuf.st_mode))
88fe16b2 4218 incpush(SvPVX(privdir), TRUE, FALSE, TRUE, FALSE);
bf4acbe4
GS
4219 Perl_sv_setpvf(aTHX_ privdir, "%ssite_perl:", macperl);
4220 if (PerlLIO_stat(SvPVX(privdir), &tmpstatbuf) >= 0 && S_ISDIR(tmpstatbuf.st_mode))
88fe16b2 4221 incpush(SvPVX(privdir), TRUE, FALSE, TRUE, FALSE);
ac27b0f5 4222
bf4acbe4
GS
4223 SvREFCNT_dec(privdir);
4224 }
4225 if (!PL_tainting)
88fe16b2 4226 incpush(":", FALSE, FALSE, TRUE, FALSE);
bf4acbe4 4227#else
fed7345c 4228#ifndef PRIVLIB_EXP
65f19062 4229# define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
34de22dd 4230#endif
ac27b0f5 4231#if defined(WIN32)
88fe16b2 4232 incpush(PRIVLIB_EXP, TRUE, FALSE, TRUE, TRUE);
00dc2f4f 4233#else
88fe16b2 4234 incpush(PRIVLIB_EXP, FALSE, FALSE, TRUE, TRUE);
00dc2f4f 4235#endif
4633a7c4 4236
65f19062 4237#ifdef SITEARCH_EXP
3b290362
GS
4238 /* sitearch is always relative to sitelib on Windows for
4239 * DLL-based path intuition to work correctly */
4240# if !defined(WIN32)
88fe16b2 4241 incpush(SITEARCH_EXP, FALSE, FALSE, TRUE, TRUE);
65f19062
GS
4242# endif
4243#endif
4244
4633a7c4 4245#ifdef SITELIB_EXP
65f19062 4246# if defined(WIN32)
574c798a 4247 /* this picks up sitearch as well */
88fe16b2 4248 incpush(SITELIB_EXP, TRUE, FALSE, TRUE, TRUE);
65f19062 4249# else
88fe16b2 4250 incpush(SITELIB_EXP, FALSE, FALSE, TRUE, TRUE);
65f19062
GS
4251# endif
4252#endif
189d1e8d 4253
65f19062 4254#ifdef SITELIB_STEM /* Search for version-specific dirs below here */
88fe16b2 4255 incpush(SITELIB_STEM, FALSE, TRUE, TRUE, TRUE);
81c6dfba 4256#endif
65f19062
GS
4257
4258#ifdef PERL_VENDORARCH_EXP
4ea817c6 4259 /* vendorarch is always relative to vendorlib on Windows for
3b290362
GS
4260 * DLL-based path intuition to work correctly */
4261# if !defined(WIN32)
88fe16b2 4262 incpush(PERL_VENDORARCH_EXP, FALSE, FALSE, TRUE, TRUE);
65f19062 4263# endif
4b03c463 4264#endif
65f19062
GS
4265
4266#ifdef PERL_VENDORLIB_EXP
4267# if defined(WIN32)
88fe16b2 4268 incpush(PERL_VENDORLIB_EXP, TRUE, FALSE, TRUE, TRUE); /* this picks up vendorarch as well */
65f19062 4269# else
88fe16b2 4270 incpush(PERL_VENDORLIB_EXP, FALSE, FALSE, TRUE, TRUE);
65f19062 4271# endif
a3635516 4272#endif
65f19062
GS
4273
4274#ifdef PERL_VENDORLIB_STEM /* Search for version-specific dirs below here */
88fe16b2 4275 incpush(PERL_VENDORLIB_STEM, FALSE, TRUE, TRUE, TRUE);
00dc2f4f 4276#endif
65f19062 4277
3b777bb4 4278#ifdef PERL_OTHERLIBDIRS
88fe16b2 4279 incpush(PERL_OTHERLIBDIRS, TRUE, TRUE, TRUE, TRUE);
3b777bb4
GS
4280#endif
4281
3280af22 4282 if (!PL_tainting)
88fe16b2 4283 incpush(".", FALSE, FALSE, TRUE, FALSE);
bf4acbe4 4284#endif /* MACOS_TRADITIONAL */
774d564b 4285}
4286
ed79a026 4287#if defined(DOSISH) || defined(EPOC)
774d564b 4288# define PERLLIB_SEP ';'
4289#else
4290# if defined(VMS)
4291# define PERLLIB_SEP '|'
4292# else
bf4acbe4
GS
4293# if defined(MACOS_TRADITIONAL)
4294# define PERLLIB_SEP ','
4295# else
4296# define PERLLIB_SEP ':'
4297# endif
774d564b 4298# endif
4299#endif
4300#ifndef PERLLIB_MANGLE
4301# define PERLLIB_MANGLE(s,n) (s)
ac27b0f5 4302#endif
774d564b 4303
ad17a1ae
NC
4304/* Push a directory onto @INC if it exists.
4305 Generate a new SV if we do this, to save needing to copy the SV we push
4306 onto @INC */
4307STATIC SV *
4308S_incpush_if_exists(pTHX_ SV *dir)
4309{
4310 Stat_t tmpstatbuf;
4311 if (PerlLIO_stat(SvPVX(dir), &tmpstatbuf) >= 0 &&
4312 S_ISDIR(tmpstatbuf.st_mode)) {
4313 av_push(GvAVn(PL_incgv), dir);
4314 dir = NEWSV(0,0);
4315 }
4316 return dir;
4317}
4318
76e3520e 4319STATIC void
88fe16b2
NC
4320S_incpush(pTHX_ char *p, int addsubdirs, int addoldvers, int usesep,
4321 int canrelocate)
774d564b 4322{
4323 SV *subdir = Nullsv;
774d564b 4324
3b290362 4325 if (!p || !*p)
774d564b 4326 return;
4327
9c8a64f0 4328 if (addsubdirs || addoldvers) {
ad17a1ae 4329 subdir = NEWSV(0,0);
774d564b 4330 }
4331
4332 /* Break at all separators */
4333 while (p && *p) {
8c52afec 4334 SV *libdir = NEWSV(55,0);
774d564b 4335 char *s;
4336
4337 /* skip any consecutive separators */
574c798a
SR
4338 if (usesep) {
4339 while ( *p == PERLLIB_SEP ) {
4340 /* Uncomment the next line for PATH semantics */
4341 /* av_push(GvAVn(PL_incgv), newSVpvn(".", 1)); */
4342 p++;
4343 }
774d564b 4344 }
4345
574c798a 4346 if ( usesep && (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
774d564b 4347 sv_setpvn(libdir, PERLLIB_MANGLE(p, (STRLEN)(s - p)),
4348 (STRLEN)(s - p));
4349 p = s + 1;
4350 }
4351 else {
4352 sv_setpv(libdir, PERLLIB_MANGLE(p, 0));
4353 p = Nullch; /* break out */
4354 }
bf4acbe4 4355#ifdef MACOS_TRADITIONAL
e69a2255
JH
4356 if (!strchr(SvPVX(libdir), ':')) {
4357 char buf[256];
4358
4359 sv_setpv(libdir, MacPerl_CanonDir(SvPVX(libdir), buf, 0));
4360 }
bf4acbe4
GS
4361 if (SvPVX(libdir)[SvCUR(libdir)-1] != ':')
4362 sv_catpv(libdir, ":");
4363#endif
774d564b 4364
88fe16b2
NC
4365#ifdef PERL_RELOCATABLE_INC
4366 /*
4367 * Relocatable include entries are marked with a leading .../
4368 *
4369 * The algorithm is
4370 * 0: Remove that leading ".../"
4371 * 1: Remove trailing executable name (anything after the last '/')
4372 * from the perl path to give a perl prefix
4373 * Then
4374 * While the @INC element starts "../" and the prefix ends with a real
4375 * directory (ie not . or ..) chop that real directory off the prefix
4376 * and the leading "../" from the @INC element. ie a logical "../"
4377 * cleanup
4378 * Finally concatenate the prefix and the remainder of the @INC element
4379 * The intent is that /usr/local/bin/perl and .../../lib/perl5
4380 * generates /usr/local/lib/perl5
4381 */
4382 {
4383 char *libpath = SvPVX(libdir);
4384 STRLEN libpath_len = SvCUR(libdir);
4385 if (libpath_len >= 4 && memEQ (libpath, ".../", 4)) {
4386 /* Game on! */
4387 SV *caret_X = get_sv("\030", 0);
4388 /* Going to use the SV just as a scratch buffer holding a C
4389 string: */
4390 SV *prefix_sv;
4391 char *prefix;
4392 char *lastslash;
4393
4394 /* $^X is *the* source of taint if tainting is on, hence
4395 SvPOK() won't be true. */
4396 assert(caret_X);
4397 assert(SvPOKp(caret_X));
4398 prefix_sv = newSVpvn(SvPVX(caret_X), SvCUR(caret_X));
4399 /* Firstly take off the leading .../
4400 If all else fail we'll do the paths relative to the current
4401 directory. */
4402 sv_chop(libdir, libpath + 4);
4403 /* Don't use SvPV as we're intentionally bypassing taining,
4404 mortal copies that the mg_get of tainting creates, and
4405 corruption that seems to come via the save stack.
4406 I guess that the save stack isn't correctly set up yet. */
4407 libpath = SvPVX(libdir);
4408 libpath_len = SvCUR(libdir);
4409
4410 /* This would work more efficiently with memrchr, but as it's
4411 only a GNU extension we'd need to probe for it and
4412 implement our own. Not hard, but maybe not worth it? */
4413
4414 prefix = SvPVX(prefix_sv);
4415 lastslash = strrchr(prefix, '/');
4416
4417 /* First time in with the *lastslash = '\0' we just wipe off
4418 the trailing /perl from (say) /usr/foo/bin/perl
4419 */
4420 if (lastslash) {
4421 SV *tempsv;
4422 while ((*lastslash = '\0'), /* Do that, come what may. */
4423 (libpath_len >= 3 && memEQ(libpath, "../", 3)
4424 && (lastslash = strrchr(prefix, '/')))) {
4425 if (lastslash[1] == '\0'
4426 || (lastslash[1] == '.'
4427 && (lastslash[2] == '/' /* ends "/." */
4428 || (lastslash[2] == '/'
4429 && lastslash[3] == '/' /* or "/.." */
4430 )))) {
4431 /* Prefix ends "/" or "/." or "/..", any of which
4432 are fishy, so don't do any more logical cleanup.
4433 */
4434 break;
4435 }
4436 /* Remove leading "../" from path */
4437 libpath += 3;
4438 libpath_len -= 3;
4439 /* Next iteration round the loop removes the last
4440 directory name from prefix by writing a '\0' in
4441 the while clause. */
4442 }
4443 /* prefix has been terminated with a '\0' to the correct
4444 length. libpath points somewhere into the libdir SV.
4445 We need to join the 2 with '/' and drop the result into
4446 libdir. */
4447 tempsv = Perl_newSVpvf(aTHX_ "%s/%s", prefix, libpath);
4448 SvREFCNT_dec(libdir);
4449 /* And this is the new libdir. */
4450 libdir = tempsv;
4451 if (PL_tainting &&
4452 (PL_uid != PL_euid || PL_gid != PL_egid)) {
4453 /* Need to taint reloccated paths if running set ID */
4454 SvTAINTED_on(libdir);
4455 }
4456 }
4457 SvREFCNT_dec(prefix_sv);
4458 }
4459 }
4460#endif
774d564b 4461 /*
4462 * BEFORE pushing libdir onto @INC we may first push version- and
4463 * archname-specific sub-directories.
4464 */
9c8a64f0 4465 if (addsubdirs || addoldvers) {
29d82f8d 4466#ifdef PERL_INC_VERSION_LIST
8353b874
GS
4467 /* Configure terminates PERL_INC_VERSION_LIST with a NULL */
4468 const char *incverlist[] = { PERL_INC_VERSION_LIST };
29d82f8d
GS
4469 const char **incver;
4470#endif
aa689395 4471#ifdef VMS
4472 char *unix;
4473 STRLEN len;
774d564b 4474
2d8e6c8d 4475 if ((unix = tounixspec_ts(SvPV(libdir,len),Nullch)) != Nullch) {
aa689395 4476 len = strlen(unix);
4477 while (unix[len-1] == '/') len--; /* Cosmetic */
4478 sv_usepvn(libdir,unix,len);
4479 }
4480 else
bf49b057 4481 PerlIO_printf(Perl_error_log,
aa689395 4482 "Failed to unixify @INC element \"%s\"\n",
2d8e6c8d 4483 SvPV(libdir,len));
aa689395 4484#endif
9c8a64f0 4485 if (addsubdirs) {
bf4acbe4
GS
4486#ifdef MACOS_TRADITIONAL
4487#define PERL_AV_SUFFIX_FMT ""
084592ab
CN
4488#define PERL_ARCH_FMT "%s:"
4489#define PERL_ARCH_FMT_PATH PERL_FS_VER_FMT PERL_AV_SUFFIX_FMT
bf4acbe4
GS
4490#else
4491#define PERL_AV_SUFFIX_FMT "/"
4492#define PERL_ARCH_FMT "/%s"
084592ab 4493#define PERL_ARCH_FMT_PATH PERL_AV_SUFFIX_FMT PERL_FS_VER_FMT
bf4acbe4 4494#endif
9c8a64f0 4495 /* .../version/archname if -d .../version/archname */
084592ab 4496 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT_PATH PERL_ARCH_FMT,
9c8a64f0
GS
4497 libdir,
4498 (int)PERL_REVISION, (int)PERL_VERSION,
4499 (int)PERL_SUBVERSION, ARCHNAME);
ad17a1ae 4500 subdir = S_incpush_if_exists(aTHX_ subdir);
4b03c463 4501
9c8a64f0 4502 /* .../version if -d .../version */
084592ab 4503 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT_PATH, libdir,
9c8a64f0
GS
4504 (int)PERL_REVISION, (int)PERL_VERSION,
4505 (int)PERL_SUBVERSION);
ad17a1ae 4506 subdir = S_incpush_if_exists(aTHX_ subdir);
9c8a64f0
GS
4507
4508 /* .../archname if -d .../archname */
bf4acbe4 4509 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT, libdir, ARCHNAME);
ad17a1ae
NC
4510 subdir = S_incpush_if_exists(aTHX_ subdir);
4511
29d82f8d 4512 }
9c8a64f0 4513
9c8a64f0 4514#ifdef PERL_INC_VERSION_LIST
ccc2aad8 4515 if (addoldvers) {
9c8a64f0
GS
4516 for (incver = incverlist; *incver; incver++) {
4517 /* .../xxx if -d .../xxx */
bf4acbe4 4518 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT, libdir, *incver);
ad17a1ae 4519 subdir = S_incpush_if_exists(aTHX_ subdir);
9c8a64f0
GS
4520 }
4521 }
29d82f8d 4522#endif
774d564b 4523 }
4524
4525 /* finally push this lib directory on the end of @INC */
3280af22 4526 av_push(GvAVn(PL_incgv), libdir);
774d564b 4527 }
ad17a1ae 4528 if (subdir) {
ef97f5b3 4529 assert (SvREFCNT(subdir) == 1);
ad17a1ae
NC
4530 SvREFCNT_dec(subdir);
4531 }
34de22dd 4532}
93a17b20 4533
4d1ff10f 4534#ifdef USE_5005THREADS
76e3520e 4535STATIC struct perl_thread *
cea2e8a9 4536S_init_main_thread(pTHX)
199100c8 4537{
c5be433b 4538#if !defined(PERL_IMPLICIT_CONTEXT)
52e1cb5e 4539 struct perl_thread *thr;
cea2e8a9 4540#endif
199100c8
MB
4541 XPV *xpv;
4542
52e1cb5e 4543 Newz(53, thr, 1, struct perl_thread);
533c011a 4544 PL_curcop = &PL_compiling;
c5be433b 4545 thr->interp = PERL_GET_INTERP;
199100c8 4546 thr->cvcache = newHV();
54b9620d 4547 thr->threadsv = newAV();
940cb80d 4548 /* thr->threadsvp is set when find_threadsv is called */
199100c8
MB
4549 thr->specific = newAV();
4550 thr->flags = THRf_R_JOINABLE;
4551 MUTEX_INIT(&thr->mutex);
4552 /* Handcraft thrsv similarly to mess_sv */
533c011a 4553 New(53, PL_thrsv, 1, SV);
199100c8 4554 Newz(53, xpv, 1, XPV);
533c011a
NIS
4555 SvFLAGS(PL_thrsv) = SVt_PV;
4556 SvANY(PL_thrsv) = (void*)xpv;
4557 SvREFCNT(PL_thrsv) = 1 << 30; /* practically infinite */
4558 SvPVX(PL_thrsv) = (char*)thr;
4559 SvCUR_set(PL_thrsv, sizeof(thr));
4560 SvLEN_set(PL_thrsv, sizeof(thr));
4561 *SvEND(PL_thrsv) = '\0'; /* in the trailing_nul field */
4562 thr->oursv = PL_thrsv;
4563 PL_chopset = " \n-";
3967c732 4564 PL_dumpindent = 4;
533c011a
NIS
4565
4566 MUTEX_LOCK(&PL_threads_mutex);
4567 PL_nthreads++;
199100c8
MB
4568 thr->tid = 0;
4569 thr->next = thr;
4570 thr->prev = thr;
8dcd6f7b 4571 thr->thr_done = 0;
533c011a 4572 MUTEX_UNLOCK(&PL_threads_mutex);
199100c8 4573
4b026b9e 4574#ifdef HAVE_THREAD_INTERN
4f63d024 4575 Perl_init_thread_intern(thr);
235db74f
GS
4576#endif
4577
4578#ifdef SET_THREAD_SELF
4579 SET_THREAD_SELF(thr);
199100c8
MB
4580#else
4581 thr->self = pthread_self();
235db74f 4582#endif /* SET_THREAD_SELF */
06d86050 4583 PERL_SET_THX(thr);
199100c8
MB
4584
4585 /*
411caa50
JH
4586 * These must come after the thread self setting
4587 * because sv_setpvn does SvTAINT and the taint
4588 * fields thread selfness being set.
199100c8 4589 */
533c011a
NIS
4590 PL_toptarget = NEWSV(0,0);
4591 sv_upgrade(PL_toptarget, SVt_PVFM);
4592 sv_setpvn(PL_toptarget, "", 0);
4593 PL_bodytarget = NEWSV(0,0);
4594 sv_upgrade(PL_bodytarget, SVt_PVFM);
4595 sv_setpvn(PL_bodytarget, "", 0);
4596 PL_formtarget = PL_bodytarget;
79cb57f6 4597 thr->errsv = newSVpvn("", 0);
78857c3c 4598 (void) find_threadsv("@"); /* Ensure $@ is initialised early */
5c0ca799 4599
533c011a 4600 PL_maxscream = -1;
a2efc822 4601 PL_peepp = MEMBER_TO_FPTR(Perl_peep);
0b94c7bb
GS
4602 PL_regcompp = MEMBER_TO_FPTR(Perl_pregcomp);
4603 PL_regexecp = MEMBER_TO_FPTR(Perl_regexec_flags);
4604 PL_regint_start = MEMBER_TO_FPTR(Perl_re_intuit_start);
4605 PL_regint_string = MEMBER_TO_FPTR(Perl_re_intuit_string);
4606 PL_regfree = MEMBER_TO_FPTR(Perl_pregfree);
533c011a
NIS
4607 PL_regindent = 0;
4608 PL_reginterp_cnt = 0;
5c0ca799 4609
199100c8
MB
4610 return thr;
4611}
4d1ff10f 4612#endif /* USE_5005THREADS */
199100c8 4613
93a17b20 4614void
864dbfa3 4615Perl_call_list(pTHX_ I32 oldscope, AV *paramList)
93a17b20 4616{
971a9dd3 4617 SV *atsv;
57843af0 4618 line_t oldline = CopLINE(PL_curcop);
312caa8e 4619 CV *cv;
22921e25 4620 STRLEN len;
6224f72b 4621 int ret;
db36c5a1 4622 dJMPENV;
93a17b20 4623
76e3520e 4624 while (AvFILL(paramList) >= 0) {
312caa8e 4625 cv = (CV*)av_shift(paramList);
ece599bd
RGS
4626 if (PL_savebegin) {
4627 if (paramList == PL_beginav) {
059a8bb7 4628 /* save PL_beginav for compiler */
ece599bd
RGS
4629 if (! PL_beginav_save)
4630 PL_beginav_save = newAV();
4631 av_push(PL_beginav_save, (SV*)cv);
4632 }
4633 else if (paramList == PL_checkav) {
4634 /* save PL_checkav for compiler */
4635 if (! PL_checkav_save)
4636 PL_checkav_save = newAV();
4637 av_push(PL_checkav_save, (SV*)cv);
4638 }
059a8bb7
JH
4639 } else {
4640 SAVEFREESV(cv);
4641 }
14dd3ad8
GS
4642#ifdef PERL_FLEXIBLE_EXCEPTIONS
4643 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vcall_list_body), cv);
4644#else
4645 JMPENV_PUSH(ret);
4646#endif
6224f72b 4647 switch (ret) {
312caa8e 4648 case 0:
14dd3ad8
GS
4649#ifndef PERL_FLEXIBLE_EXCEPTIONS
4650 call_list_body(cv);
4651#endif
971a9dd3 4652 atsv = ERRSV;
312caa8e
CS
4653 (void)SvPV(atsv, len);
4654 if (len) {
4655 PL_curcop = &PL_compiling;
57843af0 4656 CopLINE_set(PL_curcop, oldline);
312caa8e
CS
4657 if (paramList == PL_beginav)
4658 sv_catpv(atsv, "BEGIN failed--compilation aborted");
4659 else
4f25aa18
GS
4660 Perl_sv_catpvf(aTHX_ atsv,
4661 "%s failed--call queue aborted",
7d30b5c4 4662 paramList == PL_checkav ? "CHECK"
4f25aa18
GS
4663 : paramList == PL_initav ? "INIT"
4664 : "END");
312caa8e
CS
4665 while (PL_scopestack_ix > oldscope)
4666 LEAVE;
14dd3ad8 4667 JMPENV_POP;
35c1215d 4668 Perl_croak(aTHX_ "%"SVf"", atsv);
a0d0e21e 4669 }
85e6fe83 4670 break;
6224f72b 4671 case 1:
f86702cc 4672 STATUS_ALL_FAILURE;
85e6fe83 4673 /* FALL THROUGH */
6224f72b 4674 case 2:
85e6fe83 4675 /* my_exit() was called */
3280af22 4676 while (PL_scopestack_ix > oldscope)
2ae324a7 4677 LEAVE;
84902520 4678 FREETMPS;
3280af22 4679 PL_curstash = PL_defstash;
3280af22 4680 PL_curcop = &PL_compiling;
57843af0 4681 CopLINE_set(PL_curcop, oldline);
14dd3ad8 4682 JMPENV_POP;
cc3604b1 4683 if (PL_statusvalue && !(PL_exit_flags & PERL_EXIT_EXPECTED)) {
3280af22 4684 if (paramList == PL_beginav)
cea2e8a9 4685 Perl_croak(aTHX_ "BEGIN failed--compilation aborted");
85e6fe83 4686 else
4f25aa18 4687 Perl_croak(aTHX_ "%s failed--call queue aborted",
7d30b5c4 4688 paramList == PL_checkav ? "CHECK"
4f25aa18
GS
4689 : paramList == PL_initav ? "INIT"
4690 : "END");
85e6fe83 4691 }
f86702cc 4692 my_exit_jump();
85e6fe83 4693 /* NOTREACHED */
6224f72b 4694 case 3:
312caa8e
CS
4695 if (PL_restartop) {
4696 PL_curcop = &PL_compiling;
57843af0 4697 CopLINE_set(PL_curcop, oldline);
312caa8e 4698 JMPENV_JUMP(3);
85e6fe83 4699 }
bf49b057 4700 PerlIO_printf(Perl_error_log, "panic: restartop\n");
312caa8e
CS
4701 FREETMPS;
4702 break;
8990e307 4703 }
14dd3ad8 4704 JMPENV_POP;
93a17b20 4705 }
93a17b20 4706}
93a17b20 4707
14dd3ad8 4708#ifdef PERL_FLEXIBLE_EXCEPTIONS
312caa8e 4709STATIC void *
14dd3ad8 4710S_vcall_list_body(pTHX_ va_list args)
312caa8e 4711{
312caa8e 4712 CV *cv = va_arg(args, CV*);
14dd3ad8
GS
4713 return call_list_body(cv);
4714}
4715#endif
312caa8e 4716
14dd3ad8
GS
4717STATIC void *
4718S_call_list_body(pTHX_ CV *cv)
4719{
312caa8e 4720 PUSHMARK(PL_stack_sp);
864dbfa3 4721 call_sv((SV*)cv, G_EVAL|G_DISCARD);
312caa8e
CS
4722 return NULL;
4723}
4724
f86702cc 4725void
864dbfa3 4726Perl_my_exit(pTHX_ U32 status)
f86702cc 4727{
8b73bbec 4728 DEBUG_S(PerlIO_printf(Perl_debug_log, "my_exit: thread %p, status %lu\n",
a863c7d1 4729 thr, (unsigned long) status));
f86702cc 4730 switch (status) {
4731 case 0:
4732 STATUS_ALL_SUCCESS;
4733 break;
4734 case 1:
4735 STATUS_ALL_FAILURE;
4736 break;
4737 default:
4738 STATUS_NATIVE_SET(status);
4739 break;
4740 }
4741 my_exit_jump();
4742}
4743
4744void
864dbfa3 4745Perl_my_failure_exit(pTHX)
f86702cc 4746{
4747#ifdef VMS
4748 if (vaxc$errno & 1) {
4fdae800 4749 if (STATUS_NATIVE & 1) /* fortuitiously includes "-1" */
4750 STATUS_NATIVE_SET(44);
f86702cc 4751 }
4752 else {
69232efa 4753 if (!vaxc$errno) /* unlikely */
4fdae800 4754 STATUS_NATIVE_SET(44);
f86702cc 4755 else
4fdae800 4756 STATUS_NATIVE_SET(vaxc$errno);
f86702cc 4757 }
4758#else
9b599b2a 4759 int exitstatus;
f86702cc 4760 if (errno & 255)
4761 STATUS_POSIX_SET(errno);
9b599b2a 4762 else {
ac27b0f5 4763 exitstatus = STATUS_POSIX >> 8;
9b599b2a
GS
4764 if (exitstatus & 255)
4765 STATUS_POSIX_SET(exitstatus);
4766 else
4767 STATUS_POSIX_SET(255);
4768 }
f86702cc 4769#endif
4770 my_exit_jump();
93a17b20
LW
4771}
4772
76e3520e 4773STATIC void
cea2e8a9 4774S_my_exit_jump(pTHX)
f86702cc 4775{
c09156bb 4776 register PERL_CONTEXT *cx;
f86702cc 4777 I32 gimme;
4778 SV **newsp;
4779
3280af22
NIS
4780 if (PL_e_script) {
4781 SvREFCNT_dec(PL_e_script);
4782 PL_e_script = Nullsv;
f86702cc 4783 }
4784
3280af22 4785 POPSTACK_TO(PL_mainstack);
f86702cc 4786 if (cxstack_ix >= 0) {
4787 if (cxstack_ix > 0)
4788 dounwind(0);
3280af22 4789 POPBLOCK(cx,PL_curpm);
f86702cc 4790 LEAVE;
4791 }
ff0cee69 4792
6224f72b 4793 JMPENV_JUMP(2);
f86702cc 4794}
873ef191 4795
0cb96387 4796static I32
acfe0abc 4797read_e_script(pTHX_ int idx, SV *buf_sv, int maxlen)
873ef191
GS
4798{
4799 char *p, *nl;
3280af22 4800 p = SvPVX(PL_e_script);
873ef191 4801 nl = strchr(p, '\n');
3280af22 4802 nl = (nl) ? nl+1 : SvEND(PL_e_script);
7dfe3f66 4803 if (nl-p == 0) {
0cb96387 4804 filter_del(read_e_script);
873ef191 4805 return 0;
7dfe3f66 4806 }
873ef191 4807 sv_catpvn(buf_sv, p, nl-p);
3280af22 4808 sv_chop(PL_e_script, nl);
873ef191
GS
4809 return 1;
4810}