This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Teach Porting/cmpVERSION.pl about Scalar-List-Utils (broken by cb8c84586a)
[perl5.git] / perl.c
CommitLineData
4b88f280 1#line 2 "perl.c"
a0d0e21e
LW
2/* perl.c
3 *
737f4459 4 * Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
2eee27d7 5 * 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
010d7370 6 * by Larry Wall and others
a687059c 7 *
352d5a3a
LW
8 * You may distribute under the terms of either the GNU General Public
9 * License or the Artistic License, as specified in the README file.
a687059c 10 *
8d063cd8
LW
11 */
12
a0d0e21e 13/*
4ac71550
TC
14 * A ship then new they built for him
15 * of mithril and of elven-glass
cdad3b53 16 * --from Bilbo's song of EƤrendil
4ac71550
TC
17 *
18 * [p.236 of _The Lord of the Rings_, II/i: "Many Meetings"]
a0d0e21e 19 */
45d8adaa 20
166f8a29
DM
21/* This file contains the top-level functions that are used to create, use
22 * and destroy a perl interpreter, plus the functions used by XS code to
23 * call back into perl. Note that it does not contain the actual main()
ddfa107c 24 * function of the interpreter; that can be found in perlmain.c
166f8a29
DM
25 */
26
c44493f1 27#if defined(PERL_IS_MINIPERL) && !defined(USE_SITECUSTOMIZE)
43c0c913
NC
28# define USE_SITECUSTOMIZE
29#endif
30
378cc40b 31#include "EXTERN.h"
864dbfa3 32#define PERL_IN_PERL_C
378cc40b 33#include "perl.h"
e3321bb0 34#include "patchlevel.h" /* for local_patches */
4a5df386 35#include "XSUB.h"
7b8dd5f4 36#include "charclass_invlists.h"
378cc40b 37
011f1a1a
JH
38#ifdef NETWARE
39#include "nwutil.h"
011f1a1a
JH
40#endif
41
2aa47728 42#ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
bf357333
NC
43# ifdef I_SYSUIO
44# include <sys/uio.h>
45# endif
46
47union control_un {
48 struct cmsghdr cm;
49 char control[CMSG_SPACE(sizeof(int))];
50};
51
2aa47728
NC
52#endif
53
5311654c
JH
54#ifndef HZ
55# ifdef CLK_TCK
56# define HZ CLK_TCK
57# else
58# define HZ 60
59# endif
60#endif
61
7114a2d2 62#if !defined(STANDARD_C) && !defined(HAS_GETENV_PROTOTYPE) && !defined(PERL_MICRO)
20ce7b12 63char *getenv (char *); /* Usually in <stdlib.h> */
54310121 64#endif
65
acfe0abc 66static I32 read_e_script(pTHX_ int idx, SV *buf_sv, int maxlen);
0cb96387 67
cc69b689 68#ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
b24bc095 69# define validate_suid(rsfp) NOOP
cc69b689 70#else
b24bc095 71# define validate_suid(rsfp) S_validate_suid(aTHX_ rsfp)
a687059c 72#endif
8d063cd8 73
d6f07c05
AL
74#define CALL_BODY_SUB(myop) \
75 if (PL_op == (myop)) \
139d0ce6 76 PL_op = PL_ppaddr[OP_ENTERSUB](aTHX); \
d6f07c05
AL
77 if (PL_op) \
78 CALLRUNOPS(aTHX);
79
80#define CALL_LIST_BODY(cv) \
81 PUSHMARK(PL_stack_sp); \
9a8aa25b 82 call_sv(MUTABLE_SV((cv)), G_EVAL|G_DISCARD|G_VOID);
d6f07c05 83
e6827a76 84static void
daa7d858 85S_init_tls_and_interp(PerlInterpreter *my_perl)
e6827a76 86{
27da23d5 87 dVAR;
e6827a76
NC
88 if (!PL_curinterp) {
89 PERL_SET_INTERP(my_perl);
3db8f154 90#if defined(USE_ITHREADS)
e6827a76
NC
91 INIT_THREADS;
92 ALLOC_THREAD_KEY;
93 PERL_SET_THX(my_perl);
94 OP_REFCNT_INIT;
e8570548 95 OP_CHECK_MUTEX_INIT;
71ad1b0c 96 HINTS_REFCNT_INIT;
e6827a76 97 MUTEX_INIT(&PL_dollarzero_mutex);
016af4f1
DM
98 MUTEX_INIT(&PL_my_ctx_mutex);
99# endif
e6827a76 100 }
c0bce9aa
NC
101#if defined(USE_ITHREADS)
102 else
103#else
104 /* This always happens for non-ithreads */
105#endif
106 {
e6827a76
NC
107 PERL_SET_THX(my_perl);
108 }
109}
06d86050 110
cbec8ebe
DM
111
112/* these implement the PERL_SYS_INIT, PERL_SYS_INIT3, PERL_SYS_TERM macros */
113
114void
115Perl_sys_init(int* argc, char*** argv)
116{
4fc0badb 117 dVAR;
7918f24d
NC
118
119 PERL_ARGS_ASSERT_SYS_INIT;
120
cbec8ebe
DM
121 PERL_UNUSED_ARG(argc); /* may not be used depending on _BODY macro */
122 PERL_UNUSED_ARG(argv);
123 PERL_SYS_INIT_BODY(argc, argv);
124}
125
126void
127Perl_sys_init3(int* argc, char*** argv, char*** env)
128{
4fc0badb 129 dVAR;
7918f24d
NC
130
131 PERL_ARGS_ASSERT_SYS_INIT3;
132
cbec8ebe
DM
133 PERL_UNUSED_ARG(argc); /* may not be used depending on _BODY macro */
134 PERL_UNUSED_ARG(argv);
135 PERL_UNUSED_ARG(env);
136 PERL_SYS_INIT3_BODY(argc, argv, env);
137}
138
139void
88772978 140Perl_sys_term(void)
cbec8ebe 141{
4fc0badb 142 dVAR;
bf81751b
DM
143 if (!PL_veto_cleanup) {
144 PERL_SYS_TERM_BODY();
145 }
cbec8ebe
DM
146}
147
148
32e30700
GS
149#ifdef PERL_IMPLICIT_SYS
150PerlInterpreter *
7766f137
GS
151perl_alloc_using(struct IPerlMem* ipM, struct IPerlMem* ipMS,
152 struct IPerlMem* ipMP, struct IPerlEnv* ipE,
32e30700
GS
153 struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
154 struct IPerlDir* ipD, struct IPerlSock* ipS,
155 struct IPerlProc* ipP)
156{
157 PerlInterpreter *my_perl;
7918f24d
NC
158
159 PERL_ARGS_ASSERT_PERL_ALLOC_USING;
160
9f653bb5 161 /* Newx() needs interpreter, so call malloc() instead */
32e30700 162 my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
e6827a76 163 S_init_tls_and_interp(my_perl);
32e30700
GS
164 Zero(my_perl, 1, PerlInterpreter);
165 PL_Mem = ipM;
7766f137
GS
166 PL_MemShared = ipMS;
167 PL_MemParse = ipMP;
32e30700
GS
168 PL_Env = ipE;
169 PL_StdIO = ipStd;
170 PL_LIO = ipLIO;
171 PL_Dir = ipD;
172 PL_Sock = ipS;
173 PL_Proc = ipP;
7cb608b5 174 INIT_TRACK_MEMPOOL(PL_memory_debug_header, my_perl);
7766f137 175
32e30700
GS
176 return my_perl;
177}
178#else
954c1994
GS
179
180/*
ccfc67b7
JH
181=head1 Embedding Functions
182
954c1994
GS
183=for apidoc perl_alloc
184
185Allocates a new Perl interpreter. See L<perlembed>.
186
187=cut
188*/
189
93a17b20 190PerlInterpreter *
cea2e8a9 191perl_alloc(void)
79072805 192{
cea2e8a9 193 PerlInterpreter *my_perl;
79072805 194
9f653bb5 195 /* Newx() needs interpreter, so call malloc() instead */
e8ee3774 196 my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
ba869deb 197
e6827a76 198 S_init_tls_and_interp(my_perl);
7cb608b5 199#ifndef PERL_TRACK_MEMPOOL
07409e01 200 return (PerlInterpreter *) ZeroD(my_perl, 1, PerlInterpreter);
7cb608b5
NC
201#else
202 Zero(my_perl, 1, PerlInterpreter);
203 INIT_TRACK_MEMPOOL(PL_memory_debug_header, my_perl);
204 return my_perl;
205#endif
79072805 206}
32e30700 207#endif /* PERL_IMPLICIT_SYS */
79072805 208
954c1994
GS
209/*
210=for apidoc perl_construct
211
212Initializes a new Perl interpreter. See L<perlembed>.
213
214=cut
215*/
216
79072805 217void
0cb96387 218perl_construct(pTHXx)
79072805 219{
27da23d5 220 dVAR;
7918f24d
NC
221
222 PERL_ARGS_ASSERT_PERL_CONSTRUCT;
223
8990e307 224#ifdef MULTIPLICITY
54aff467 225 init_interp();
ac27b0f5 226 PL_perl_destruct_level = 1;
54aff467 227#else
7918f24d 228 PERL_UNUSED_ARG(my_perl);
54aff467
GS
229 if (PL_perl_destruct_level > 0)
230 init_interp();
231#endif
34caed6d
DM
232 PL_curcop = &PL_compiling; /* needed by ckWARN, right away */
233
75d476e2
S
234#ifdef PERL_TRACE_OPS
235 Zero(PL_op_exec_cnt, OP_max+2, UV);
236#endif
237
0d96b528 238 init_constants();
34caed6d
DM
239
240 SvREADONLY_on(&PL_sv_placeholder);
fe54beba 241 SvREFCNT(&PL_sv_placeholder) = SvREFCNT_IMMORTAL;
34caed6d
DM
242
243 PL_sighandlerp = (Sighandler_t) Perl_sighandler;
ca0c25f6 244#ifdef PERL_USES_PL_PIDSTATUS
34caed6d 245 PL_pidstatus = newHV();
ca0c25f6 246#endif
79072805 247
396482e1 248 PL_rs = newSVpvs("\n");
dc92893f 249
cea2e8a9 250 init_stacks();
79072805 251
748a9306 252 init_ids();
a5f75d66 253
312caa8e 254 JMPENV_BOOTSTRAP;
f86702cc 255 STATUS_ALL_SUCCESS;
256
0672f40e 257 init_i18nl10n(1);
0b5b802d 258
ab821d7f 259#if defined(LOCAL_PATCH_COUNT)
3280af22 260 PL_localpatches = local_patches; /* For possible -v */
ab821d7f 261#endif
262
52853b95
GS
263#ifdef HAVE_INTERP_INTERN
264 sys_intern_init();
265#endif
266
3a1ee7e8 267 PerlIO_init(aTHX); /* Hook to IO system */
760ac839 268
3280af22
NIS
269 PL_fdpid = newAV(); /* for remembering popen pids by fd */
270 PL_modglobal = newHV(); /* pointers to per-interpreter module globals */
396482e1 271 PL_errors = newSVpvs("");
76f68e9b
MHM
272 sv_setpvs(PERL_DEBUG_PAD(0), ""); /* For regex debugging. */
273 sv_setpvs(PERL_DEBUG_PAD(1), ""); /* ext/re needs these */
274 sv_setpvs(PERL_DEBUG_PAD(2), ""); /* even without DEBUGGING. */
1fcf4c12 275#ifdef USE_ITHREADS
402d2eb1
NC
276 /* First entry is a list of empty elements. It needs to be initialised
277 else all hell breaks loose in S_find_uninit_var(). */
278 Perl_av_create_and_push(aTHX_ &PL_regex_padav, newSVpvs(""));
13137afc 279 PL_regex_pad = AvARRAY(PL_regex_padav);
d4d03940 280 Newxz(PL_stashpad, PL_stashpadmax, HV *);
1fcf4c12 281#endif
e5dd39fc 282#ifdef USE_REENTRANT_API
59bd0823 283 Perl_reentrant_init(aTHX);
e5dd39fc 284#endif
7dc86639
YO
285#if defined(USE_HASH_SEED) || defined(USE_HASH_SEED_EXPLICIT)
286 /* [perl #22371] Algorimic Complexity Attack on Perl 5.6.1, 5.8.0
287 * This MUST be done before any hash stores or fetches take place.
288 * If you set PL_hash_seed (and presumably also PL_hash_seed_set)
289 * yourself, it is your responsibility to provide a good random seed!
290 * You can also define PERL_HASH_SEED in compile time, see hv.h.
291 *
292 * XXX: fix this comment */
293 if (PL_hash_seed_set == FALSE) {
294 Perl_get_hash_seed(aTHX_ PL_hash_seed);
295 PL_hash_seed_set= TRUE;
296 }
297#endif /* #if defined(USE_HASH_SEED) || defined(USE_HASH_SEED_EXPLICIT) */
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
a38ab475
RZ
307 Zero(PL_sv_consts, SV_CONSTS_COUNT, SV*);
308
2f42fcb0
JH
309#ifndef PERL_MICRO
310# ifdef USE_ENVIRON_ARRAY
0631ea03 311 PL_origenviron = environ;
2f42fcb0 312# endif
0631ea03
AB
313#endif
314
5311654c 315 /* Use sysconf(_SC_CLK_TCK) if available, if not
dbc1d986 316 * available or if the sysconf() fails, use the HZ.
27da23d5
JH
317 * The HZ if not originally defined has been by now
318 * been defined as CLK_TCK, if available. */
b6c36746 319#if defined(HAS_SYSCONF) && defined(_SC_CLK_TCK)
5311654c
JH
320 PL_clocktick = sysconf(_SC_CLK_TCK);
321 if (PL_clocktick <= 0)
322#endif
323 PL_clocktick = HZ;
324
081fc587
AB
325 PL_stashcache = newHV();
326
e8e3635e 327 PL_patchlevel = newSVpvs("v" PERL_VERSION_STRING);
1e8125c6 328 PL_apiversion = newSVpvs("v" PERL_API_VERSION_STRING);
d7aa5382 329
27da23d5
JH
330#ifdef HAS_MMAP
331 if (!PL_mmap_page_size) {
332#if defined(HAS_SYSCONF) && (defined(_SC_PAGESIZE) || defined(_SC_MMAP_PAGE_SIZE))
333 {
334 SETERRNO(0, SS_NORMAL);
335# ifdef _SC_PAGESIZE
336 PL_mmap_page_size = sysconf(_SC_PAGESIZE);
337# else
338 PL_mmap_page_size = sysconf(_SC_MMAP_PAGE_SIZE);
339# endif
340 if ((long) PL_mmap_page_size < 0) {
341 if (errno) {
44f8325f 342 SV * const error = ERRSV;
d4c19fe8 343 SvUPGRADE(error, SVt_PV);
0510663f 344 Perl_croak(aTHX_ "panic: sysconf: %s", SvPV_nolen_const(error));
27da23d5
JH
345 }
346 else
347 Perl_croak(aTHX_ "panic: sysconf: pagesize unknown");
348 }
349 }
350#else
351# ifdef HAS_GETPAGESIZE
352 PL_mmap_page_size = getpagesize();
353# else
354# if defined(I_SYS_PARAM) && defined(PAGESIZE)
355 PL_mmap_page_size = PAGESIZE; /* compiletime, bad */
356# endif
357# endif
358#endif
359 if (PL_mmap_page_size <= 0)
360 Perl_croak(aTHX_ "panic: bad pagesize %" IVdf,
361 (IV) PL_mmap_page_size);
362 }
363#endif /* HAS_MMAP */
364
365#if defined(HAS_TIMES) && defined(PERL_NEED_TIMESBASE)
366 PL_timesbase.tms_utime = 0;
367 PL_timesbase.tms_stime = 0;
368 PL_timesbase.tms_cutime = 0;
369 PL_timesbase.tms_cstime = 0;
370#endif
371
7d113631
NC
372 PL_osname = Perl_savepvn(aTHX_ STR_WITH_LEN(OSNAME));
373
a3e6e81e 374 PL_registered_mros = newHV();
9e169432
NC
375 /* Start with 1 bucket, for DFS. It's unlikely we'll need more. */
376 HvMAX(PL_registered_mros) = 0;
a3e6e81e 377
7b8dd5f4
KW
378 PL_XPosix_ptrs[_CC_ASCII] = _new_invlist_C_array(ASCII_invlist);
379 PL_XPosix_ptrs[_CC_ALPHANUMERIC] = _new_invlist_C_array(XPosixAlnum_invlist);
380 PL_XPosix_ptrs[_CC_ALPHA] = _new_invlist_C_array(XPosixAlpha_invlist);
381 PL_XPosix_ptrs[_CC_BLANK] = _new_invlist_C_array(XPosixBlank_invlist);
382 PL_XPosix_ptrs[_CC_CASED] = _new_invlist_C_array(Cased_invlist);
383 PL_XPosix_ptrs[_CC_CNTRL] = _new_invlist_C_array(XPosixCntrl_invlist);
384 PL_XPosix_ptrs[_CC_DIGIT] = _new_invlist_C_array(XPosixDigit_invlist);
385 PL_XPosix_ptrs[_CC_GRAPH] = _new_invlist_C_array(XPosixGraph_invlist);
386 PL_XPosix_ptrs[_CC_LOWER] = _new_invlist_C_array(XPosixLower_invlist);
387 PL_XPosix_ptrs[_CC_PRINT] = _new_invlist_C_array(XPosixPrint_invlist);
388 PL_XPosix_ptrs[_CC_PUNCT] = _new_invlist_C_array(XPosixPunct_invlist);
389 PL_XPosix_ptrs[_CC_SPACE] = _new_invlist_C_array(XPerlSpace_invlist);
390 PL_XPosix_ptrs[_CC_PSXSPC] = _new_invlist_C_array(XPosixSpace_invlist);
391 PL_XPosix_ptrs[_CC_UPPER] = _new_invlist_C_array(XPosixUpper_invlist);
392 PL_XPosix_ptrs[_CC_VERTSPACE] = _new_invlist_C_array(VertSpace_invlist);
393 PL_XPosix_ptrs[_CC_WORDCHAR] = _new_invlist_C_array(XPosixWord_invlist);
394 PL_XPosix_ptrs[_CC_XDIGIT] = _new_invlist_C_array(XPosixXDigit_invlist);
395
8990e307 396 ENTER;
79072805
LW
397}
398
954c1994 399/*
62375a60
NIS
400=for apidoc nothreadhook
401
402Stub that provides thread hook for perl_destruct when there are
403no threads.
404
405=cut
406*/
407
408int
4e9e3734 409Perl_nothreadhook(pTHX)
62375a60 410{
96a5add6 411 PERL_UNUSED_CONTEXT;
62375a60
NIS
412 return 0;
413}
414
41e4abd8
NC
415#ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
416void
417Perl_dump_sv_child(pTHX_ SV *sv)
418{
419 ssize_t got;
bf357333
NC
420 const int sock = PL_dumper_fd;
421 const int debug_fd = PerlIO_fileno(Perl_debug_log);
bf357333
NC
422 union control_un control;
423 struct msghdr msg;
808ad2d0 424 struct iovec vec[2];
bf357333 425 struct cmsghdr *cmptr;
808ad2d0
NC
426 int returned_errno;
427 unsigned char buffer[256];
41e4abd8 428
7918f24d
NC
429 PERL_ARGS_ASSERT_DUMP_SV_CHILD;
430
bf357333 431 if(sock == -1 || debug_fd == -1)
41e4abd8
NC
432 return;
433
434 PerlIO_flush(Perl_debug_log);
435
bf357333
NC
436 /* All these shenanigans are to pass a file descriptor over to our child for
437 it to dump out to. We can't let it hold open the file descriptor when it
438 forks, as the file descriptor it will dump to can turn out to be one end
439 of pipe that some other process will wait on for EOF. (So as it would
b293a5f8 440 be open, the wait would be forever.) */
bf357333
NC
441
442 msg.msg_control = control.control;
443 msg.msg_controllen = sizeof(control.control);
444 /* We're a connected socket so we don't need a destination */
445 msg.msg_name = NULL;
446 msg.msg_namelen = 0;
447 msg.msg_iov = vec;
808ad2d0 448 msg.msg_iovlen = 1;
bf357333
NC
449
450 cmptr = CMSG_FIRSTHDR(&msg);
451 cmptr->cmsg_len = CMSG_LEN(sizeof(int));
452 cmptr->cmsg_level = SOL_SOCKET;
453 cmptr->cmsg_type = SCM_RIGHTS;
454 *((int *)CMSG_DATA(cmptr)) = 1;
455
456 vec[0].iov_base = (void*)&sv;
457 vec[0].iov_len = sizeof(sv);
458 got = sendmsg(sock, &msg, 0);
41e4abd8
NC
459
460 if(got < 0) {
bf357333 461 perror("Debug leaking scalars parent sendmsg failed");
41e4abd8
NC
462 abort();
463 }
bf357333
NC
464 if(got < sizeof(sv)) {
465 perror("Debug leaking scalars parent short sendmsg");
41e4abd8
NC
466 abort();
467 }
468
808ad2d0
NC
469 /* Return protocol is
470 int: errno value
471 unsigned char: length of location string (0 for empty)
472 unsigned char*: string (not terminated)
473 */
474 vec[0].iov_base = (void*)&returned_errno;
475 vec[0].iov_len = sizeof(returned_errno);
476 vec[1].iov_base = buffer;
477 vec[1].iov_len = 1;
478
479 got = readv(sock, vec, 2);
41e4abd8
NC
480
481 if(got < 0) {
482 perror("Debug leaking scalars parent read failed");
808ad2d0 483 PerlIO_flush(PerlIO_stderr());
41e4abd8
NC
484 abort();
485 }
808ad2d0 486 if(got < sizeof(returned_errno) + 1) {
41e4abd8 487 perror("Debug leaking scalars parent short read");
808ad2d0 488 PerlIO_flush(PerlIO_stderr());
41e4abd8
NC
489 abort();
490 }
491
808ad2d0
NC
492 if (*buffer) {
493 got = read(sock, buffer + 1, *buffer);
494 if(got < 0) {
495 perror("Debug leaking scalars parent read 2 failed");
496 PerlIO_flush(PerlIO_stderr());
497 abort();
498 }
499
500 if(got < *buffer) {
501 perror("Debug leaking scalars parent short read 2");
502 PerlIO_flush(PerlIO_stderr());
503 abort();
504 }
505 }
506
507 if (returned_errno || *buffer) {
508 Perl_warn(aTHX_ "Debug leaking scalars child failed%s%.*s with errno"
509 " %d: %s", (*buffer ? " at " : ""), (int) *buffer, buffer + 1,
0c0d42ff 510 returned_errno, Strerror(returned_errno));
41e4abd8
NC
511 }
512}
513#endif
514
62375a60 515/*
954c1994
GS
516=for apidoc perl_destruct
517
518Shuts down a Perl interpreter. See L<perlembed>.
519
520=cut
521*/
522
31d77e54 523int
0cb96387 524perl_destruct(pTHXx)
79072805 525{
27da23d5 526 dVAR;
be2ea8ed 527 VOL signed char destruct_level; /* see possible values in intrpvar.h */
a0d0e21e 528 HV *hv;
2aa47728 529#ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
2aa47728
NC
530 pid_t child;
531#endif
9c0b6888 532 int i;
8990e307 533
7918f24d
NC
534 PERL_ARGS_ASSERT_PERL_DESTRUCT;
535#ifndef MULTIPLICITY
ed6c66dd 536 PERL_UNUSED_ARG(my_perl);
7918f24d 537#endif
9d4ba2ae 538
3d22c4f0
GG
539 assert(PL_scopestack_ix == 1);
540
7766f137
GS
541 /* wait for all pseudo-forked children to finish */
542 PERL_WAIT_FOR_CHILDREN;
543
3280af22 544 destruct_level = PL_perl_destruct_level;
36e77d41 545#if defined(DEBUGGING) || defined(PERL_TRACK_MEMPOOL)
4633a7c4 546 {
9d4ba2ae
AL
547 const char * const s = PerlEnv_getenv("PERL_DESTRUCT_LEVEL");
548 if (s) {
96e440d2
JH
549 int i;
550 if (strEQ(s, "-1")) { /* Special case: modperl folklore. */
551 i = -1;
552 } else {
553 i = grok_atou(s, NULL);
554 }
36e77d41
DD
555#ifdef DEBUGGING
556 if (destruct_level < i) destruct_level = i;
557#endif
558#ifdef PERL_TRACK_MEMPOOL
f5199772
KW
559 /* RT #114496, for perl_free */
560 PL_perl_destruct_level = i;
36e77d41 561#endif
5f05dabc 562 }
4633a7c4
LW
563 }
564#endif
565
27da23d5 566 if (PL_exit_flags & PERL_EXIT_DESTRUCT_END) {
f3faeb53
AB
567 dJMPENV;
568 int x = 0;
569
570 JMPENV_PUSH(x);
1b6737cc 571 PERL_UNUSED_VAR(x);
9ebf26ad 572 if (PL_endav && !PL_minus_c) {
ca7b837b 573 PERL_SET_PHASE(PERL_PHASE_END);
f3faeb53 574 call_list(PL_scopestack_ix, PL_endav);
9ebf26ad 575 }
f3faeb53 576 JMPENV_POP;
26f423df 577 }
f3faeb53 578 LEAVE;
a0d0e21e 579 FREETMPS;
3d22c4f0 580 assert(PL_scopestack_ix == 0);
a0d0e21e 581
e00b64d4 582 /* Need to flush since END blocks can produce output */
f13a2bc0 583 my_fflush_all();
e00b64d4 584
75d476e2
S
585#ifdef PERL_TRACE_OPS
586 /* If we traced all Perl OP usage, report and clean up */
587 PerlIO_printf(Perl_debug_log, "Trace of all OPs executed:\n");
588 for (i = 0; i <= OP_max; ++i) {
589 PerlIO_printf(Perl_debug_log, " %s: %"UVuf"\n", PL_op_name[i], PL_op_exec_cnt[i]);
590 PL_op_exec_cnt[i] = 0;
591 }
592 /* Utility slot for easily doing little tracing experiments in the runloop: */
593 if (PL_op_exec_cnt[OP_max+1] != 0)
594 PerlIO_printf(Perl_debug_log, " SPECIAL: %"UVuf"\n", PL_op_exec_cnt[OP_max+1]);
595 PerlIO_printf(Perl_debug_log, "\n");
596#endif
597
598
16c91539 599 if (PL_threadhook(aTHX)) {
62375a60 600 /* Threads hook has vetoed further cleanup */
c301d606 601 PL_veto_cleanup = TRUE;
37038d91 602 return STATUS_EXIT;
62375a60
NIS
603 }
604
2aa47728
NC
605#ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
606 if (destruct_level != 0) {
607 /* Fork here to create a child. Our child's job is to preserve the
608 state of scalars prior to destruction, so that we can instruct it
609 to dump any scalars that we later find have leaked.
610 There's no subtlety in this code - it assumes POSIX, and it doesn't
611 fail gracefully */
612 int fd[2];
613
614 if(socketpair(AF_UNIX, SOCK_STREAM, 0, fd)) {
615 perror("Debug leaking scalars socketpair failed");
616 abort();
617 }
618
619 child = fork();
620 if(child == -1) {
621 perror("Debug leaking scalars fork failed");
622 abort();
623 }
624 if (!child) {
625 /* We are the child */
3125a5a4
NC
626 const int sock = fd[1];
627 const int debug_fd = PerlIO_fileno(Perl_debug_log);
628 int f;
808ad2d0
NC
629 const char *where;
630 /* Our success message is an integer 0, and a char 0 */
b61433a9 631 static const char success[sizeof(int) + 1] = {0};
3125a5a4 632
2aa47728 633 close(fd[0]);
2aa47728 634
3125a5a4
NC
635 /* We need to close all other file descriptors otherwise we end up
636 with interesting hangs, where the parent closes its end of a
637 pipe, and sits waiting for (another) child to terminate. Only
638 that child never terminates, because it never gets EOF, because
bf357333
NC
639 we also have the far end of the pipe open. We even need to
640 close the debugging fd, because sometimes it happens to be one
641 end of a pipe, and a process is waiting on the other end for
642 EOF. Normally it would be closed at some point earlier in
643 destruction, but if we happen to cause the pipe to remain open,
644 EOF never occurs, and we get an infinite hang. Hence all the
645 games to pass in a file descriptor if it's actually needed. */
3125a5a4
NC
646
647 f = sysconf(_SC_OPEN_MAX);
648 if(f < 0) {
808ad2d0
NC
649 where = "sysconf failed";
650 goto abort;
3125a5a4
NC
651 }
652 while (f--) {
653 if (f == sock)
654 continue;
3125a5a4
NC
655 close(f);
656 }
657
2aa47728
NC
658 while (1) {
659 SV *target;
bf357333
NC
660 union control_un control;
661 struct msghdr msg;
662 struct iovec vec[1];
663 struct cmsghdr *cmptr;
664 ssize_t got;
665 int got_fd;
666
667 msg.msg_control = control.control;
668 msg.msg_controllen = sizeof(control.control);
669 /* We're a connected socket so we don't need a source */
670 msg.msg_name = NULL;
671 msg.msg_namelen = 0;
672 msg.msg_iov = vec;
c3caa5c3 673 msg.msg_iovlen = C_ARRAY_LENGTH(vec);
bf357333
NC
674
675 vec[0].iov_base = (void*)&target;
676 vec[0].iov_len = sizeof(target);
677
678 got = recvmsg(sock, &msg, 0);
2aa47728
NC
679
680 if(got == 0)
681 break;
682 if(got < 0) {
808ad2d0
NC
683 where = "recv failed";
684 goto abort;
2aa47728
NC
685 }
686 if(got < sizeof(target)) {
808ad2d0
NC
687 where = "short recv";
688 goto abort;
2aa47728 689 }
bf357333 690
808ad2d0
NC
691 if(!(cmptr = CMSG_FIRSTHDR(&msg))) {
692 where = "no cmsg";
693 goto abort;
694 }
695 if(cmptr->cmsg_len != CMSG_LEN(sizeof(int))) {
696 where = "wrong cmsg_len";
697 goto abort;
698 }
699 if(cmptr->cmsg_level != SOL_SOCKET) {
700 where = "wrong cmsg_level";
701 goto abort;
702 }
703 if(cmptr->cmsg_type != SCM_RIGHTS) {
704 where = "wrong cmsg_type";
705 goto abort;
706 }
bf357333
NC
707
708 got_fd = *(int*)CMSG_DATA(cmptr);
709 /* For our last little bit of trickery, put the file descriptor
710 back into Perl_debug_log, as if we never actually closed it
711 */
808ad2d0
NC
712 if(got_fd != debug_fd) {
713 if (dup2(got_fd, debug_fd) == -1) {
714 where = "dup2";
715 goto abort;
716 }
717 }
2aa47728 718 sv_dump(target);
bf357333 719
2aa47728
NC
720 PerlIO_flush(Perl_debug_log);
721
808ad2d0 722 got = write(sock, &success, sizeof(success));
2aa47728
NC
723
724 if(got < 0) {
808ad2d0
NC
725 where = "write failed";
726 goto abort;
2aa47728 727 }
808ad2d0
NC
728 if(got < sizeof(success)) {
729 where = "short write";
730 goto abort;
2aa47728
NC
731 }
732 }
733 _exit(0);
808ad2d0
NC
734 abort:
735 {
736 int send_errno = errno;
737 unsigned char length = (unsigned char) strlen(where);
738 struct iovec failure[3] = {
739 {(void*)&send_errno, sizeof(send_errno)},
740 {&length, 1},
741 {(void*)where, length}
742 };
743 int got = writev(sock, failure, 3);
744 /* Bad news travels fast. Faster than data. We'll get a SIGPIPE
745 in the parent if we try to read from the socketpair after the
746 child has exited, even if there was data to read.
747 So sleep a bit to give the parent a fighting chance of
748 reading the data. */
749 sleep(2);
750 _exit((got == -1) ? errno : 0);
751 }
bf357333 752 /* End of child. */
2aa47728 753 }
41e4abd8 754 PL_dumper_fd = fd[0];
2aa47728
NC
755 close(fd[1]);
756 }
757#endif
758
ff0cee69 759 /* We must account for everything. */
760
761 /* Destroy the main CV and syntax tree */
37e77c23
FC
762 /* Set PL_curcop now, because destroying ops can cause new SVs
763 to be generated in Perl_pad_swipe, and when running with
764 -DDEBUG_LEAKING_SCALARS they expect PL_curcop to point to a valid
765 op from which the filename structure member is copied. */
17fbfdf6 766 PL_curcop = &PL_compiling;
3280af22 767 if (PL_main_root) {
4e380990
DM
768 /* ensure comppad/curpad to refer to main's pad */
769 if (CvPADLIST(PL_main_cv)) {
770 PAD_SET_CUR_NOSAVE(CvPADLIST(PL_main_cv), 1);
325e1816 771 PL_comppad_name = PadlistNAMES(CvPADLIST(PL_main_cv));
4e380990 772 }
3280af22 773 op_free(PL_main_root);
5f66b61c 774 PL_main_root = NULL;
a0d0e21e 775 }
5f66b61c 776 PL_main_start = NULL;
aac9d523
DM
777 /* note that PL_main_cv isn't usually actually freed at this point,
778 * due to the CvOUTSIDE refs from subs compiled within it. It will
779 * get freed once all the subs are freed in sv_clean_all(), for
780 * destruct_level > 0 */
3280af22 781 SvREFCNT_dec(PL_main_cv);
601f1833 782 PL_main_cv = NULL;
ca7b837b 783 PERL_SET_PHASE(PERL_PHASE_DESTRUCT);
ff0cee69 784
13621cfb
NIS
785 /* Tell PerlIO we are about to tear things apart in case
786 we have layers which are using resources that should
787 be cleaned up now.
788 */
789
790 PerlIO_destruct(aTHX);
791
ddf23d4a
S
792 /*
793 * Try to destruct global references. We do this first so that the
794 * destructors and destructees still exist. Some sv's might remain.
795 * Non-referenced objects are on their own.
796 */
797 sv_clean_objs();
8990e307 798
5cd24f17 799 /* unhook hooks which will soon be, or use, destroyed data */
3280af22 800 SvREFCNT_dec(PL_warnhook);
a0714e2c 801 PL_warnhook = NULL;
3280af22 802 SvREFCNT_dec(PL_diehook);
a0714e2c 803 PL_diehook = NULL;
5cd24f17 804
4b556e6c 805 /* call exit list functions */
3280af22 806 while (PL_exitlistlen-- > 0)
acfe0abc 807 PL_exitlist[PL_exitlistlen].fn(aTHX_ PL_exitlist[PL_exitlistlen].ptr);
4b556e6c 808
3280af22 809 Safefree(PL_exitlist);
4b556e6c 810
1c4916e5
CB
811 PL_exitlist = NULL;
812 PL_exitlistlen = 0;
813
a3e6e81e
NC
814 SvREFCNT_dec(PL_registered_mros);
815
551a8b83 816 /* jettison our possibly duplicated environment */
4b647fb0
DM
817 /* if PERL_USE_SAFE_PUTENV is defined environ will not have been copied
818 * so we certainly shouldn't free it here
819 */
2f42fcb0 820#ifndef PERL_MICRO
4b647fb0 821#if defined(USE_ENVIRON_ARRAY) && !defined(PERL_USE_SAFE_PUTENV)
50acdf95 822 if (environ != PL_origenviron && !PL_use_safe_putenv
4efc5df6
GS
823#ifdef USE_ITHREADS
824 /* only main thread can free environ[0] contents */
825 && PL_curinterp == aTHX
826#endif
827 )
828 {
551a8b83
JH
829 I32 i;
830
831 for (i = 0; environ[i]; i++)
4b420006 832 safesysfree(environ[i]);
0631ea03 833
4b420006
JH
834 /* Must use safesysfree() when working with environ. */
835 safesysfree(environ);
551a8b83
JH
836
837 environ = PL_origenviron;
838 }
839#endif
2f42fcb0 840#endif /* !PERL_MICRO */
551a8b83 841
30985c42
JH
842 if (destruct_level == 0) {
843
844 DEBUG_P(debprofdump());
845
846#if defined(PERLIO_LAYERS)
847 /* No more IO - including error messages ! */
848 PerlIO_cleanup(aTHX);
849#endif
850
851 CopFILE_free(&PL_compiling);
30985c42
JH
852
853 /* The exit() function will do everything that needs doing. */
854 return STATUS_EXIT;
855 }
856
9fa9f06b
KW
857 /* Below, do clean up for when PERL_DESTRUCT_LEVEL is not 0 */
858
5f8cb046
DM
859#ifdef USE_ITHREADS
860 /* the syntax tree is shared between clones
861 * so op_free(PL_main_root) only ReREFCNT_dec's
862 * REGEXPs in the parent interpreter
863 * we need to manually ReREFCNT_dec for the clones
864 */
0547a729
DM
865 {
866 I32 i = AvFILLp(PL_regex_padav);
867 SV **ary = AvARRAY(PL_regex_padav);
868
869 for (; i; i--) {
870 SvREFCNT_dec(ary[i]);
871 ary[i] = &PL_sv_undef;
872 }
873 }
5f8cb046
DM
874#endif
875
0547a729 876
ad64d0ec 877 SvREFCNT_dec(MUTABLE_SV(PL_stashcache));
081fc587
AB
878 PL_stashcache = NULL;
879
5f05dabc 880 /* loosen bonds of global variables */
881
2f9285f8
DM
882 /* XXX can PL_parser still be non-null here? */
883 if(PL_parser && PL_parser->rsfp) {
884 (void)PerlIO_close(PL_parser->rsfp);
885 PL_parser->rsfp = NULL;
8ebc5c01 886 }
887
84386e14
RGS
888 if (PL_minus_F) {
889 Safefree(PL_splitstr);
890 PL_splitstr = NULL;
891 }
892
8ebc5c01 893 /* switches */
3280af22
NIS
894 PL_minus_n = FALSE;
895 PL_minus_p = FALSE;
896 PL_minus_l = FALSE;
897 PL_minus_a = FALSE;
898 PL_minus_F = FALSE;
899 PL_doswitches = FALSE;
599cee73 900 PL_dowarn = G_WARN_OFF;
1a904fc8 901#ifdef PERL_SAWAMPERSAND
d3b97530 902 PL_sawampersand = 0; /* must save all match strings */
1a904fc8 903#endif
3280af22
NIS
904 PL_unsafe = FALSE;
905
906 Safefree(PL_inplace);
bd61b366 907 PL_inplace = NULL;
a7cb1f99 908 SvREFCNT_dec(PL_patchlevel);
1e8125c6 909 SvREFCNT_dec(PL_apiversion);
3280af22
NIS
910
911 if (PL_e_script) {
912 SvREFCNT_dec(PL_e_script);
a0714e2c 913 PL_e_script = NULL;
8ebc5c01 914 }
915
bf9cdc68
RG
916 PL_perldb = 0;
917
8ebc5c01 918 /* magical thingies */
919
e23d9e2f
CS
920 SvREFCNT_dec(PL_ofsgv); /* *, */
921 PL_ofsgv = NULL;
5f05dabc 922
7889fe52 923 SvREFCNT_dec(PL_ors_sv); /* $\ */
a0714e2c 924 PL_ors_sv = NULL;
8ebc5c01 925
3280af22 926 SvREFCNT_dec(PL_rs); /* $/ */
a0714e2c 927 PL_rs = NULL;
dc92893f 928
d33b2eba 929 Safefree(PL_osname); /* $^O */
bd61b366 930 PL_osname = NULL;
5f05dabc 931
3280af22 932 SvREFCNT_dec(PL_statname);
a0714e2c
SS
933 PL_statname = NULL;
934 PL_statgv = NULL;
5f05dabc 935
8ebc5c01 936 /* defgv, aka *_ should be taken care of elsewhere */
937
7d5ea4e7
GS
938 /* float buffer */
939 Safefree(PL_efloatbuf);
bd61b366 940 PL_efloatbuf = NULL;
7d5ea4e7
GS
941 PL_efloatsize = 0;
942
8ebc5c01 943 /* startup and shutdown function lists */
3280af22 944 SvREFCNT_dec(PL_beginav);
5a837c8f 945 SvREFCNT_dec(PL_beginav_save);
3280af22 946 SvREFCNT_dec(PL_endav);
7d30b5c4 947 SvREFCNT_dec(PL_checkav);
ece599bd 948 SvREFCNT_dec(PL_checkav_save);
3c10abe3
AG
949 SvREFCNT_dec(PL_unitcheckav);
950 SvREFCNT_dec(PL_unitcheckav_save);
3280af22 951 SvREFCNT_dec(PL_initav);
7d49f689
NC
952 PL_beginav = NULL;
953 PL_beginav_save = NULL;
954 PL_endav = NULL;
955 PL_checkav = NULL;
956 PL_checkav_save = NULL;
3c10abe3
AG
957 PL_unitcheckav = NULL;
958 PL_unitcheckav_save = NULL;
7d49f689 959 PL_initav = NULL;
5618dfe8 960
8ebc5c01 961 /* shortcuts just get cleared */
a0714e2c
SS
962 PL_hintgv = NULL;
963 PL_errgv = NULL;
a0714e2c
SS
964 PL_argvoutgv = NULL;
965 PL_stdingv = NULL;
966 PL_stderrgv = NULL;
967 PL_last_in_gv = NULL;
a0714e2c
SS
968 PL_DBsingle = NULL;
969 PL_DBtrace = NULL;
970 PL_DBsignal = NULL;
601f1833 971 PL_DBcv = NULL;
7d49f689 972 PL_dbargs = NULL;
5c284bb0 973 PL_debstash = NULL;
8ebc5c01 974
cf93a474 975 SvREFCNT_dec(PL_envgv);
f03015cd 976 SvREFCNT_dec(PL_incgv);
722fa0e9 977 SvREFCNT_dec(PL_argvgv);
475b1e90 978 SvREFCNT_dec(PL_replgv);
8cece913
FC
979 SvREFCNT_dec(PL_DBgv);
980 SvREFCNT_dec(PL_DBline);
981 SvREFCNT_dec(PL_DBsub);
cf93a474 982 PL_envgv = NULL;
f03015cd 983 PL_incgv = NULL;
722fa0e9 984 PL_argvgv = NULL;
475b1e90 985 PL_replgv = NULL;
8cece913
FC
986 PL_DBgv = NULL;
987 PL_DBline = NULL;
988 PL_DBsub = NULL;
989
7a1c5554 990 SvREFCNT_dec(PL_argvout_stack);
7d49f689 991 PL_argvout_stack = NULL;
8ebc5c01 992
5c831c24 993 SvREFCNT_dec(PL_modglobal);
5c284bb0 994 PL_modglobal = NULL;
5c831c24 995 SvREFCNT_dec(PL_preambleav);
7d49f689 996 PL_preambleav = NULL;
5c831c24 997 SvREFCNT_dec(PL_subname);
a0714e2c 998 PL_subname = NULL;
ca0c25f6 999#ifdef PERL_USES_PL_PIDSTATUS
5c831c24 1000 SvREFCNT_dec(PL_pidstatus);
5c284bb0 1001 PL_pidstatus = NULL;
ca0c25f6 1002#endif
5c831c24 1003 SvREFCNT_dec(PL_toptarget);
a0714e2c 1004 PL_toptarget = NULL;
5c831c24 1005 SvREFCNT_dec(PL_bodytarget);
a0714e2c
SS
1006 PL_bodytarget = NULL;
1007 PL_formtarget = NULL;
5c831c24 1008
d33b2eba 1009 /* free locale stuff */
b9582b6a 1010#ifdef USE_LOCALE_COLLATE
d33b2eba 1011 Safefree(PL_collation_name);
bd61b366 1012 PL_collation_name = NULL;
b9582b6a 1013#endif
d33b2eba 1014
b9582b6a 1015#ifdef USE_LOCALE_NUMERIC
d33b2eba 1016 Safefree(PL_numeric_name);
bd61b366 1017 PL_numeric_name = NULL;
a453c169 1018 SvREFCNT_dec(PL_numeric_radix_sv);
a0714e2c 1019 PL_numeric_radix_sv = NULL;
b9582b6a 1020#endif
d33b2eba 1021
9c0b6888
KW
1022 /* clear character classes */
1023 for (i = 0; i < POSIX_SWASH_COUNT; i++) {
1024 SvREFCNT_dec(PL_utf8_swash_ptrs[i]);
1025 PL_utf8_swash_ptrs[i] = NULL;
1026 }
5c831c24
GS
1027 SvREFCNT_dec(PL_utf8_mark);
1028 SvREFCNT_dec(PL_utf8_toupper);
4dbdbdc2 1029 SvREFCNT_dec(PL_utf8_totitle);
5c831c24 1030 SvREFCNT_dec(PL_utf8_tolower);
b4e400f9 1031 SvREFCNT_dec(PL_utf8_tofold);
82686b01
JH
1032 SvREFCNT_dec(PL_utf8_idstart);
1033 SvREFCNT_dec(PL_utf8_idcont);
c60f4405 1034 SvREFCNT_dec(PL_utf8_foldable);
2726813d 1035 SvREFCNT_dec(PL_utf8_foldclosures);
9fa9f06b 1036 SvREFCNT_dec(PL_AboveLatin1);
e0a1ff7a 1037 SvREFCNT_dec(PL_InBitmap);
9fa9f06b
KW
1038 SvREFCNT_dec(PL_UpperLatin1);
1039 SvREFCNT_dec(PL_Latin1);
1040 SvREFCNT_dec(PL_NonL1NonFinalFold);
1041 SvREFCNT_dec(PL_HasMultiCharFold);
a0714e2c
SS
1042 PL_utf8_mark = NULL;
1043 PL_utf8_toupper = NULL;
1044 PL_utf8_totitle = NULL;
1045 PL_utf8_tolower = NULL;
1046 PL_utf8_tofold = NULL;
1047 PL_utf8_idstart = NULL;
1048 PL_utf8_idcont = NULL;
2726813d 1049 PL_utf8_foldclosures = NULL;
9fa9f06b 1050 PL_AboveLatin1 = NULL;
e0a1ff7a 1051 PL_InBitmap = NULL;
9fa9f06b
KW
1052 PL_HasMultiCharFold = NULL;
1053 PL_Latin1 = NULL;
1054 PL_NonL1NonFinalFold = NULL;
1055 PL_UpperLatin1 = NULL;
86f72d56 1056 for (i = 0; i < POSIX_CC_COUNT; i++) {
cac6e0ca
KW
1057 SvREFCNT_dec(PL_XPosix_ptrs[i]);
1058 PL_XPosix_ptrs[i] = NULL;
86f72d56 1059 }
5c831c24 1060
971a9dd3 1061 if (!specialWARN(PL_compiling.cop_warnings))
72dc9ed5 1062 PerlMemShared_free(PL_compiling.cop_warnings);
a0714e2c 1063 PL_compiling.cop_warnings = NULL;
20439bc7
Z
1064 cophh_free(CopHINTHASH_get(&PL_compiling));
1065 CopHINTHASH_set(&PL_compiling, cophh_new_empty());
05ec9bb3 1066 CopFILE_free(&PL_compiling);
5c831c24 1067
a0d0e21e 1068 /* Prepare to destruct main symbol table. */
5f05dabc 1069
3280af22 1070 hv = PL_defstash;
ca556bcd
DM
1071 /* break ref loop *:: <=> %:: */
1072 (void)hv_delete(hv, "main::", 6, G_DISCARD);
3280af22 1073 PL_defstash = 0;
a0d0e21e 1074 SvREFCNT_dec(hv);
5c831c24 1075 SvREFCNT_dec(PL_curstname);
a0714e2c 1076 PL_curstname = NULL;
a0d0e21e 1077
5a844595
GS
1078 /* clear queued errors */
1079 SvREFCNT_dec(PL_errors);
a0714e2c 1080 PL_errors = NULL;
5a844595 1081
dd69841b
BB
1082 SvREFCNT_dec(PL_isarev);
1083
a0d0e21e 1084 FREETMPS;
9b387841 1085 if (destruct_level >= 2) {
3280af22 1086 if (PL_scopestack_ix != 0)
9b387841
NC
1087 Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL),
1088 "Unbalanced scopes: %ld more ENTERs than LEAVEs\n",
1089 (long)PL_scopestack_ix);
3280af22 1090 if (PL_savestack_ix != 0)
9b387841
NC
1091 Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL),
1092 "Unbalanced saves: %ld more saves than restores\n",
1093 (long)PL_savestack_ix);
3280af22 1094 if (PL_tmps_floor != -1)
9b387841
NC
1095 Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL),"Unbalanced tmps: %ld more allocs than frees\n",
1096 (long)PL_tmps_floor + 1);
a0d0e21e 1097 if (cxstack_ix != -1)
9b387841
NC
1098 Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL),"Unbalanced context: %ld more PUSHes than POPs\n",
1099 (long)cxstack_ix + 1);
a0d0e21e 1100 }
8990e307 1101
0547a729
DM
1102#ifdef USE_ITHREADS
1103 SvREFCNT_dec(PL_regex_padav);
1104 PL_regex_padav = NULL;
1105 PL_regex_pad = NULL;
1106#endif
1107
776df701 1108#ifdef PERL_IMPLICIT_CONTEXT
57bb2458
JH
1109 /* the entries in this list are allocated via SV PVX's, so get freed
1110 * in sv_clean_all */
1111 Safefree(PL_my_cxt_list);
776df701 1112#endif
57bb2458 1113
8990e307 1114 /* Now absolutely destruct everything, somehow or other, loops or no. */
5226ed68
JH
1115
1116 /* the 2 is for PL_fdpid and PL_strtab */
d17ea597 1117 while (sv_clean_all() > 2)
5226ed68
JH
1118 ;
1119
23083432
FC
1120#ifdef USE_ITHREADS
1121 Safefree(PL_stashpad); /* must come after sv_clean_all */
1122#endif
1123
d4777f27
GS
1124 AvREAL_off(PL_fdpid); /* no surviving entries */
1125 SvREFCNT_dec(PL_fdpid); /* needed in io_close() */
7d49f689 1126 PL_fdpid = NULL;
d33b2eba 1127
6c644e78
GS
1128#ifdef HAVE_INTERP_INTERN
1129 sys_intern_clear();
1130#endif
1131
a38ab475
RZ
1132 /* constant strings */
1133 for (i = 0; i < SV_CONSTS_COUNT; i++) {
1134 SvREFCNT_dec(PL_sv_consts[i]);
1135 PL_sv_consts[i] = NULL;
1136 }
1137
6e72f9df 1138 /* Destruct the global string table. */
1139 {
1140 /* Yell and reset the HeVAL() slots that are still holding refcounts,
1141 * so that sv_free() won't fail on them.
80459961
NC
1142 * Now that the global string table is using a single hunk of memory
1143 * for both HE and HEK, we either need to explicitly unshare it the
1144 * correct way, or actually free things here.
6e72f9df 1145 */
80459961
NC
1146 I32 riter = 0;
1147 const I32 max = HvMAX(PL_strtab);
c4420975 1148 HE * const * const array = HvARRAY(PL_strtab);
80459961
NC
1149 HE *hent = array[0];
1150
6e72f9df 1151 for (;;) {
0453d815 1152 if (hent && ckWARN_d(WARN_INTERNAL)) {
44f8325f 1153 HE * const next = HeNEXT(hent);
9014280d 1154 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
44f8325f 1155 "Unbalanced string table refcount: (%ld) for \"%s\"",
de616631 1156 (long)hent->he_valu.hent_refcount, HeKEY(hent));
80459961
NC
1157 Safefree(hent);
1158 hent = next;
6e72f9df 1159 }
1160 if (!hent) {
1161 if (++riter > max)
1162 break;
1163 hent = array[riter];
1164 }
1165 }
80459961
NC
1166
1167 Safefree(array);
1168 HvARRAY(PL_strtab) = 0;
1169 HvTOTALKEYS(PL_strtab) = 0;
6e72f9df 1170 }
3280af22 1171 SvREFCNT_dec(PL_strtab);
6e72f9df 1172
e652bb2f 1173#ifdef USE_ITHREADS
c21d1a0f 1174 /* free the pointer tables used for cloning */
a0739874 1175 ptr_table_free(PL_ptr_table);
bf9cdc68 1176 PL_ptr_table = (PTR_TBL_t*)NULL;
53186e96 1177#endif
a0739874 1178
d33b2eba
GS
1179 /* free special SVs */
1180
1181 SvREFCNT(&PL_sv_yes) = 0;
1182 sv_clear(&PL_sv_yes);
1183 SvANY(&PL_sv_yes) = NULL;
4c5e2b0d 1184 SvFLAGS(&PL_sv_yes) = 0;
d33b2eba
GS
1185
1186 SvREFCNT(&PL_sv_no) = 0;
1187 sv_clear(&PL_sv_no);
1188 SvANY(&PL_sv_no) = NULL;
4c5e2b0d 1189 SvFLAGS(&PL_sv_no) = 0;
01724ea0 1190
9f375a43
DM
1191 {
1192 int i;
1193 for (i=0; i<=2; i++) {
1194 SvREFCNT(PERL_DEBUG_PAD(i)) = 0;
1195 sv_clear(PERL_DEBUG_PAD(i));
1196 SvANY(PERL_DEBUG_PAD(i)) = NULL;
1197 SvFLAGS(PERL_DEBUG_PAD(i)) = 0;
1198 }
1199 }
1200
0453d815 1201 if (PL_sv_count != 0 && ckWARN_d(WARN_INTERNAL))
9014280d 1202 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),"Scalars leaked: %ld\n", (long)PL_sv_count);
6e72f9df 1203
eba0f806
DM
1204#ifdef DEBUG_LEAKING_SCALARS
1205 if (PL_sv_count != 0) {
1206 SV* sva;
1207 SV* sv;
eb578fdb 1208 SV* svend;
eba0f806 1209
ad64d0ec 1210 for (sva = PL_sv_arenaroot; sva; sva = MUTABLE_SV(SvANY(sva))) {
eba0f806
DM
1211 svend = &sva[SvREFCNT(sva)];
1212 for (sv = sva + 1; sv < svend; ++sv) {
e4787c0c 1213 if (SvTYPE(sv) != (svtype)SVTYPEMASK) {
a548cda8 1214 PerlIO_printf(Perl_debug_log, "leaked: sv=0x%p"
61b61456 1215 " flags=0x%"UVxf
fd0854ff 1216 " refcnt=%"UVuf pTHX__FORMAT "\n"
cd676548
DM
1217 "\tallocated at %s:%d %s %s (parent 0x%"UVxf");"
1218 "serial %"UVuf"\n",
574b8821
NC
1219 (void*)sv, (UV)sv->sv_flags, (UV)sv->sv_refcnt
1220 pTHX__VALUE,
fd0854ff
DM
1221 sv->sv_debug_file ? sv->sv_debug_file : "(unknown)",
1222 sv->sv_debug_line,
1223 sv->sv_debug_inpad ? "for" : "by",
1224 sv->sv_debug_optype ?
1225 PL_op_name[sv->sv_debug_optype]: "(none)",
cd676548 1226 PTR2UV(sv->sv_debug_parent),
cbe56f1d 1227 sv->sv_debug_serial
fd0854ff 1228 );
2aa47728 1229#ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
41e4abd8 1230 Perl_dump_sv_child(aTHX_ sv);
2aa47728 1231#endif
eba0f806
DM
1232 }
1233 }
1234 }
1235 }
2aa47728
NC
1236#ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
1237 {
1238 int status;
1239 fd_set rset;
1240 /* Wait for up to 4 seconds for child to terminate.
1241 This seems to be the least effort way of timing out on reaping
1242 its exit status. */
1243 struct timeval waitfor = {4, 0};
41e4abd8 1244 int sock = PL_dumper_fd;
2aa47728
NC
1245
1246 shutdown(sock, 1);
1247 FD_ZERO(&rset);
1248 FD_SET(sock, &rset);
1249 select(sock + 1, &rset, NULL, NULL, &waitfor);
1250 waitpid(child, &status, WNOHANG);
1251 close(sock);
1252 }
1253#endif
eba0f806 1254#endif
77abb4c6
NC
1255#ifdef DEBUG_LEAKING_SCALARS_ABORT
1256 if (PL_sv_count)
1257 abort();
1258#endif
bf9cdc68 1259 PL_sv_count = 0;
eba0f806 1260
56a2bab7 1261#if defined(PERLIO_LAYERS)
3a1ee7e8
NIS
1262 /* No more IO - including error messages ! */
1263 PerlIO_cleanup(aTHX);
1264#endif
1265
9f4bd222 1266 /* sv_undef needs to stay immortal until after PerlIO_cleanup
a0714e2c 1267 as currently layers use it rather than NULL as a marker
9f4bd222
NIS
1268 for no arg - and will try and SvREFCNT_dec it.
1269 */
1270 SvREFCNT(&PL_sv_undef) = 0;
1271 SvREADONLY_off(&PL_sv_undef);
1272
3280af22 1273 Safefree(PL_origfilename);
bd61b366 1274 PL_origfilename = NULL;
43c5f42d 1275 Safefree(PL_reg_curpm);
dd28f7bb 1276 free_tied_hv_pool();
3280af22 1277 Safefree(PL_op_mask);
cf36064f 1278 Safefree(PL_psig_name);
bf9cdc68 1279 PL_psig_name = (SV**)NULL;
d525a7b2 1280 PL_psig_ptr = (SV**)NULL;
31c91b43
LR
1281 {
1282 /* We need to NULL PL_psig_pend first, so that
1283 signal handlers know not to use it */
1284 int *psig_save = PL_psig_pend;
1285 PL_psig_pend = (int*)NULL;
1286 Safefree(psig_save);
1287 }
6e72f9df 1288 nuke_stacks();
284167a5
S
1289 TAINTING_set(FALSE);
1290 TAINT_WARN_set(FALSE);
3280af22 1291 PL_hints = 0; /* Reset hints. Should hints be per-interpreter ? */
bf9cdc68 1292 PL_debug = 0;
ac27b0f5 1293
a0d0e21e 1294 DEBUG_P(debprofdump());
d33b2eba 1295
e5dd39fc 1296#ifdef USE_REENTRANT_API
10bc17b6 1297 Perl_reentrant_free(aTHX);
e5dd39fc
AB
1298#endif
1299
612f20c3
GS
1300 sv_free_arenas();
1301
5d9a96ca
DM
1302 while (PL_regmatch_slab) {
1303 regmatch_slab *s = PL_regmatch_slab;
1304 PL_regmatch_slab = PL_regmatch_slab->next;
1305 Safefree(s);
1306 }
1307
fc36a67e 1308 /* As the absolutely last thing, free the non-arena SV for mess() */
1309
3280af22 1310 if (PL_mess_sv) {
f350b448
NC
1311 /* we know that type == SVt_PVMG */
1312
9c63abab 1313 /* it could have accumulated taint magic */
f350b448
NC
1314 MAGIC* mg;
1315 MAGIC* moremagic;
1316 for (mg = SvMAGIC(PL_mess_sv); mg; mg = moremagic) {
1317 moremagic = mg->mg_moremagic;
1318 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global
1319 && mg->mg_len >= 0)
1320 Safefree(mg->mg_ptr);
1321 Safefree(mg);
9c63abab 1322 }
f350b448 1323
fc36a67e 1324 /* we know that type >= SVt_PV */
8bd4d4c5 1325 SvPV_free(PL_mess_sv);
3280af22
NIS
1326 Safefree(SvANY(PL_mess_sv));
1327 Safefree(PL_mess_sv);
a0714e2c 1328 PL_mess_sv = NULL;
fc36a67e 1329 }
37038d91 1330 return STATUS_EXIT;
79072805
LW
1331}
1332
954c1994
GS
1333/*
1334=for apidoc perl_free
1335
1336Releases a Perl interpreter. See L<perlembed>.
1337
1338=cut
1339*/
1340
79072805 1341void
0cb96387 1342perl_free(pTHXx)
79072805 1343{
5174512c
NC
1344 dVAR;
1345
7918f24d
NC
1346 PERL_ARGS_ASSERT_PERL_FREE;
1347
c301d606
DM
1348 if (PL_veto_cleanup)
1349 return;
1350
7cb608b5 1351#ifdef PERL_TRACK_MEMPOOL
55ef9aae
MHM
1352 {
1353 /*
1354 * Don't free thread memory if PERL_DESTRUCT_LEVEL is set to a non-zero
1355 * value as we're probably hunting memory leaks then
1356 */
36e77d41 1357 if (PL_perl_destruct_level == 0) {
4fd0a9b8 1358 const U32 old_debug = PL_debug;
55ef9aae
MHM
1359 /* Emulate the PerlHost behaviour of free()ing all memory allocated in this
1360 thread at thread exit. */
4fd0a9b8
NC
1361 if (DEBUG_m_TEST) {
1362 PerlIO_puts(Perl_debug_log, "Disabling memory debugging as we "
1363 "free this thread's memory\n");
1364 PL_debug &= ~ DEBUG_m_FLAG;
1365 }
55ef9aae 1366 while(aTHXx->Imemory_debug_header.next != &(aTHXx->Imemory_debug_header))
a78adc84 1367 safesysfree(PERL_MEMORY_DEBUG_HEADER_SIZE + (char *)(aTHXx->Imemory_debug_header.next));
4fd0a9b8 1368 PL_debug = old_debug;
55ef9aae
MHM
1369 }
1370 }
7cb608b5
NC
1371#endif
1372
acfe0abc 1373#if defined(WIN32) || defined(NETWARE)
ce3e5b80 1374# if defined(PERL_IMPLICIT_SYS)
b36c9a52 1375 {
acfe0abc 1376# ifdef NETWARE
7af12a34 1377 void *host = nw_internal_host;
7af12a34 1378 PerlMem_free(aTHXx);
7af12a34 1379 nw_delete_internal_host(host);
acfe0abc 1380# else
bdb50480
NC
1381 void *host = w32_internal_host;
1382 PerlMem_free(aTHXx);
7af12a34 1383 win32_delete_internal_host(host);
acfe0abc 1384# endif
7af12a34 1385 }
1c0ca838
GS
1386# else
1387 PerlMem_free(aTHXx);
1388# endif
acfe0abc
GS
1389#else
1390 PerlMem_free(aTHXx);
76e3520e 1391#endif
79072805
LW
1392}
1393
b7f7fff6 1394#if defined(USE_ITHREADS)
aebd1ac7
GA
1395/* provide destructors to clean up the thread key when libperl is unloaded */
1396#ifndef WIN32 /* handled during DLL_PROCESS_DETACH in win32/perllib.c */
1397
826955bd 1398#if defined(__hpux) && !(defined(__ux_version) && __ux_version <= 1020) && !defined(__GNUC__)
aebd1ac7 1399#pragma fini "perl_fini"
666ad1ec
GA
1400#elif defined(__sun) && !defined(__GNUC__)
1401#pragma fini (perl_fini)
aebd1ac7
GA
1402#endif
1403
0dbb1585
AL
1404static void
1405#if defined(__GNUC__)
1406__attribute__((destructor))
aebd1ac7 1407#endif
de009b76 1408perl_fini(void)
aebd1ac7 1409{
27da23d5 1410 dVAR;
5c64bffd
NC
1411 if (
1412#ifdef PERL_GLOBAL_STRUCT_PRIVATE
1413 my_vars &&
1414#endif
1415 PL_curinterp && !PL_veto_cleanup)
aebd1ac7
GA
1416 FREE_THREAD_KEY;
1417}
1418
1419#endif /* WIN32 */
1420#endif /* THREADS */
1421
4b556e6c 1422void
864dbfa3 1423Perl_call_atexit(pTHX_ ATEXIT_t fn, void *ptr)
4b556e6c 1424{
3280af22
NIS
1425 Renew(PL_exitlist, PL_exitlistlen+1, PerlExitListEntry);
1426 PL_exitlist[PL_exitlistlen].fn = fn;
1427 PL_exitlist[PL_exitlistlen].ptr = ptr;
1428 ++PL_exitlistlen;
4b556e6c
JD
1429}
1430
954c1994
GS
1431/*
1432=for apidoc perl_parse
1433
1434Tells a Perl interpreter to parse a Perl script. See L<perlembed>.
1435
1436=cut
1437*/
1438
03d9f026
FC
1439#define SET_CURSTASH(newstash) \
1440 if (PL_curstash != newstash) { \
1441 SvREFCNT_dec(PL_curstash); \
1442 PL_curstash = (HV *)SvREFCNT_inc(newstash); \
1443 }
1444
79072805 1445int
0cb96387 1446perl_parse(pTHXx_ XSINIT_t xsinit, int argc, char **argv, char **env)
8d063cd8 1447{
27da23d5 1448 dVAR;
6224f72b 1449 I32 oldscope;
6224f72b 1450 int ret;
db36c5a1 1451 dJMPENV;
8d063cd8 1452
7918f24d
NC
1453 PERL_ARGS_ASSERT_PERL_PARSE;
1454#ifndef MULTIPLICITY
ed6c66dd 1455 PERL_UNUSED_ARG(my_perl);
7918f24d 1456#endif
7dc86639 1457#if defined(USE_HASH_SEED) || defined(USE_HASH_SEED_EXPLICIT) || defined(USE_HASH_SEED_DEBUG)
b0891165 1458 {
7dc86639
YO
1459 const char * const s = PerlEnv_getenv("PERL_HASH_SEED_DEBUG");
1460
96e440d2 1461 if (s && (grok_atou(s, NULL) == 1)) {
7dc86639
YO
1462 unsigned char *seed= PERL_HASH_SEED;
1463 unsigned char *seed_end= PERL_HASH_SEED + PERL_HASH_SEED_BYTES;
1464 PerlIO_printf(Perl_debug_log, "HASH_FUNCTION = %s HASH_SEED = 0x", PERL_HASH_FUNC);
1465 while (seed < seed_end) {
1466 PerlIO_printf(Perl_debug_log, "%02x", *seed++);
1467 }
6a5b4183
YO
1468#ifdef PERL_HASH_RANDOMIZE_KEYS
1469 PerlIO_printf(Perl_debug_log, " PERTURB_KEYS = %d (%s)",
1470 PL_HASH_RAND_BITS_ENABLED,
1471 PL_HASH_RAND_BITS_ENABLED == 0 ? "NO" : PL_HASH_RAND_BITS_ENABLED == 1 ? "RANDOM" : "DETERMINISTIC");
1472#endif
7dc86639
YO
1473 PerlIO_printf(Perl_debug_log, "\n");
1474 }
b0891165
JH
1475 }
1476#endif /* #if defined(USE_HASH_SEED) || defined(USE_HASH_SEED_EXPLICIT) */
3280af22 1477 PL_origargc = argc;
e2975953 1478 PL_origargv = argv;
a0d0e21e 1479
a2722ac9
GA
1480 if (PL_origalen != 0) {
1481 PL_origalen = 1; /* don't use old PL_origalen if perl_parse() is called again */
1482 }
1483 else {
3cb9023d
JH
1484 /* Set PL_origalen be the sum of the contiguous argv[]
1485 * elements plus the size of the env in case that it is
e9137a8e 1486 * contiguous with the argv[]. This is used in mg.c:Perl_magic_set()
3cb9023d
JH
1487 * as the maximum modifiable length of $0. In the worst case
1488 * the area we are able to modify is limited to the size of
43c32782 1489 * the original argv[0]. (See below for 'contiguous', though.)
3cb9023d 1490 * --jhi */
e1ec3a88 1491 const char *s = NULL;
54bfe034 1492 int i;
b7249aaf 1493 const UV mask = ~(UV)(PTRSIZE-1);
43c32782 1494 /* Do the mask check only if the args seem like aligned. */
1b6737cc 1495 const UV aligned =
43c32782
JH
1496 (mask < ~(UV)0) && ((PTR2UV(argv[0]) & mask) == PTR2UV(argv[0]));
1497
1498 /* See if all the arguments are contiguous in memory. Note
1499 * that 'contiguous' is a loose term because some platforms
1500 * align the argv[] and the envp[]. If the arguments look
1501 * like non-aligned, assume that they are 'strictly' or
1502 * 'traditionally' contiguous. If the arguments look like
1503 * aligned, we just check that they are within aligned
1504 * PTRSIZE bytes. As long as no system has something bizarre
1505 * like the argv[] interleaved with some other data, we are
1506 * fine. (Did I just evoke Murphy's Law?) --jhi */
c8941eeb
JH
1507 if (PL_origargv && PL_origargc >= 1 && (s = PL_origargv[0])) {
1508 while (*s) s++;
1509 for (i = 1; i < PL_origargc; i++) {
1510 if ((PL_origargv[i] == s + 1
43c32782 1511#ifdef OS2
c8941eeb 1512 || PL_origargv[i] == s + 2
43c32782 1513#endif
c8941eeb
JH
1514 )
1515 ||
1516 (aligned &&
1517 (PL_origargv[i] > s &&
1518 PL_origargv[i] <=
1519 INT2PTR(char *, PTR2UV(s + PTRSIZE) & mask)))
1520 )
1521 {
1522 s = PL_origargv[i];
1523 while (*s) s++;
1524 }
1525 else
1526 break;
54bfe034 1527 }
54bfe034 1528 }
a4a109c2
JD
1529
1530#ifndef PERL_USE_SAFE_PUTENV
3cb9023d 1531 /* Can we grab env area too to be used as the area for $0? */
a4a109c2 1532 if (s && PL_origenviron && !PL_use_safe_putenv) {
9d419b5f 1533 if ((PL_origenviron[0] == s + 1)
43c32782
JH
1534 ||
1535 (aligned &&
1536 (PL_origenviron[0] > s &&
1537 PL_origenviron[0] <=
1538 INT2PTR(char *, PTR2UV(s + PTRSIZE) & mask)))
1539 )
1540 {
9d419b5f 1541#ifndef OS2 /* ENVIRON is read by the kernel too. */
43c32782
JH
1542 s = PL_origenviron[0];
1543 while (*s) s++;
1544#endif
bd61b366 1545 my_setenv("NoNe SuCh", NULL);
43c32782
JH
1546 /* Force copy of environment. */
1547 for (i = 1; PL_origenviron[i]; i++) {
1548 if (PL_origenviron[i] == s + 1
1549 ||
1550 (aligned &&
1551 (PL_origenviron[i] > s &&
1552 PL_origenviron[i] <=
1553 INT2PTR(char *, PTR2UV(s + PTRSIZE) & mask)))
1554 )
1555 {
1556 s = PL_origenviron[i];
1557 while (*s) s++;
1558 }
1559 else
1560 break;
54bfe034 1561 }
43c32782 1562 }
54bfe034 1563 }
a4a109c2
JD
1564#endif /* !defined(PERL_USE_SAFE_PUTENV) */
1565
2d2af554 1566 PL_origalen = s ? s - PL_origargv[0] + 1 : 0;
54bfe034
JH
1567 }
1568
3280af22 1569 if (PL_do_undump) {
a0d0e21e
LW
1570
1571 /* Come here if running an undumped a.out. */
1572
3280af22
NIS
1573 PL_origfilename = savepv(argv[0]);
1574 PL_do_undump = FALSE;
a0d0e21e 1575 cxstack_ix = -1; /* start label stack again */
748a9306 1576 init_ids();
284167a5 1577 assert (!TAINT_get);
b7975bdd 1578 TAINT;
e2051532 1579 set_caret_X();
b7975bdd 1580 TAINT_NOT;
a0d0e21e
LW
1581 init_postdump_symbols(argc,argv,env);
1582 return 0;
1583 }
1584
3280af22 1585 if (PL_main_root) {
3280af22 1586 op_free(PL_main_root);
5f66b61c 1587 PL_main_root = NULL;
ff0cee69 1588 }
5f66b61c 1589 PL_main_start = NULL;
3280af22 1590 SvREFCNT_dec(PL_main_cv);
601f1833 1591 PL_main_cv = NULL;
79072805 1592
3280af22
NIS
1593 time(&PL_basetime);
1594 oldscope = PL_scopestack_ix;
599cee73 1595 PL_dowarn = G_WARN_OFF;
f86702cc 1596
14dd3ad8 1597 JMPENV_PUSH(ret);
6224f72b 1598 switch (ret) {
312caa8e 1599 case 0:
14dd3ad8 1600 parse_body(env,xsinit);
9ebf26ad 1601 if (PL_unitcheckav) {
3c10abe3 1602 call_list(oldscope, PL_unitcheckav);
9ebf26ad
FR
1603 }
1604 if (PL_checkav) {
ca7b837b 1605 PERL_SET_PHASE(PERL_PHASE_CHECK);
7d30b5c4 1606 call_list(oldscope, PL_checkav);
9ebf26ad 1607 }
14dd3ad8
GS
1608 ret = 0;
1609 break;
6224f72b
GS
1610 case 1:
1611 STATUS_ALL_FAILURE;
924ba076 1612 /* FALLTHROUGH */
6224f72b
GS
1613 case 2:
1614 /* my_exit() was called */
3280af22 1615 while (PL_scopestack_ix > oldscope)
6224f72b
GS
1616 LEAVE;
1617 FREETMPS;
03d9f026 1618 SET_CURSTASH(PL_defstash);
9ebf26ad 1619 if (PL_unitcheckav) {
3c10abe3 1620 call_list(oldscope, PL_unitcheckav);
9ebf26ad
FR
1621 }
1622 if (PL_checkav) {
ca7b837b 1623 PERL_SET_PHASE(PERL_PHASE_CHECK);
7d30b5c4 1624 call_list(oldscope, PL_checkav);
9ebf26ad 1625 }
37038d91 1626 ret = STATUS_EXIT;
14dd3ad8 1627 break;
6224f72b 1628 case 3:
bf49b057 1629 PerlIO_printf(Perl_error_log, "panic: top_env\n");
14dd3ad8
GS
1630 ret = 1;
1631 break;
6224f72b 1632 }
14dd3ad8
GS
1633 JMPENV_POP;
1634 return ret;
1635}
1636
4a5df386
NC
1637/* This needs to stay in perl.c, as perl.c is compiled with different flags for
1638 miniperl, and we need to see those flags reflected in the values here. */
1639
1640/* What this returns is subject to change. Use the public interface in Config.
1641 */
1642static void
1643S_Internals_V(pTHX_ CV *cv)
1644{
1645 dXSARGS;
1646#ifdef LOCAL_PATCH_COUNT
1647 const int local_patch_count = LOCAL_PATCH_COUNT;
1648#else
1649 const int local_patch_count = 0;
1650#endif
2dc296d2 1651 const int entries = 3 + local_patch_count;
4a5df386 1652 int i;
fe1c5936 1653 static const char non_bincompat_options[] =
4a5df386
NC
1654# ifdef DEBUGGING
1655 " DEBUGGING"
1656# endif
1657# ifdef NO_MATHOMS
0d311fbe 1658 " NO_MATHOMS"
4a5df386 1659# endif
59b86f4b
DM
1660# ifdef NO_HASH_SEED
1661 " NO_HASH_SEED"
1662# endif
3b0e4ee2
MB
1663# ifdef NO_TAINT_SUPPORT
1664 " NO_TAINT_SUPPORT"
1665# endif
cb26ef7a
MB
1666# ifdef PERL_BOOL_AS_CHAR
1667 " PERL_BOOL_AS_CHAR"
1668# endif
4a5df386
NC
1669# ifdef PERL_DISABLE_PMC
1670 " PERL_DISABLE_PMC"
1671# endif
1672# ifdef PERL_DONT_CREATE_GVSV
1673 " PERL_DONT_CREATE_GVSV"
1674# endif
9a044a43
NC
1675# ifdef PERL_EXTERNAL_GLOB
1676 " PERL_EXTERNAL_GLOB"
1677# endif
59b86f4b
DM
1678# ifdef PERL_HASH_FUNC_SIPHASH
1679 " PERL_HASH_FUNC_SIPHASH"
1680# endif
1681# ifdef PERL_HASH_FUNC_SDBM
1682 " PERL_HASH_FUNC_SDBM"
1683# endif
1684# ifdef PERL_HASH_FUNC_DJB2
1685 " PERL_HASH_FUNC_DJB2"
1686# endif
1687# ifdef PERL_HASH_FUNC_SUPERFAST
1688 " PERL_HASH_FUNC_SUPERFAST"
1689# endif
1690# ifdef PERL_HASH_FUNC_MURMUR3
1691 " PERL_HASH_FUNC_MURMUR3"
1692# endif
1693# ifdef PERL_HASH_FUNC_ONE_AT_A_TIME
1694 " PERL_HASH_FUNC_ONE_AT_A_TIME"
1695# endif
1696# ifdef PERL_HASH_FUNC_ONE_AT_A_TIME_HARD
1697 " PERL_HASH_FUNC_ONE_AT_A_TIME_HARD"
1698# endif
1699# ifdef PERL_HASH_FUNC_ONE_AT_A_TIME_OLD
1700 " PERL_HASH_FUNC_ONE_AT_A_TIME_OLD"
1701# endif
4a5df386
NC
1702# ifdef PERL_IS_MINIPERL
1703 " PERL_IS_MINIPERL"
1704# endif
1705# ifdef PERL_MALLOC_WRAP
1706 " PERL_MALLOC_WRAP"
1707# endif
1708# ifdef PERL_MEM_LOG
1709 " PERL_MEM_LOG"
1710# endif
1711# ifdef PERL_MEM_LOG_NOIMPL
1712 " PERL_MEM_LOG_NOIMPL"
1713# endif
2542212d
DM
1714# ifdef PERL_NEW_COPY_ON_WRITE
1715 " PERL_NEW_COPY_ON_WRITE"
1716# endif
59b86f4b
DM
1717# ifdef PERL_PERTURB_KEYS_DETERMINISTIC
1718 " PERL_PERTURB_KEYS_DETERMINISTIC"
1719# endif
1720# ifdef PERL_PERTURB_KEYS_DISABLED
1721 " PERL_PERTURB_KEYS_DISABLED"
1722# endif
1723# ifdef PERL_PERTURB_KEYS_RANDOM
1724 " PERL_PERTURB_KEYS_RANDOM"
1725# endif
c3cf41ec
NC
1726# ifdef PERL_PRESERVE_IVUV
1727 " PERL_PRESERVE_IVUV"
1728# endif
c051e30b
NC
1729# ifdef PERL_RELOCATABLE_INCPUSH
1730 " PERL_RELOCATABLE_INCPUSH"
1731# endif
4a5df386
NC
1732# ifdef PERL_USE_DEVEL
1733 " PERL_USE_DEVEL"
1734# endif
1735# ifdef PERL_USE_SAFE_PUTENV
1736 " PERL_USE_SAFE_PUTENV"
1737# endif
a3749cf3
NC
1738# ifdef UNLINK_ALL_VERSIONS
1739 " UNLINK_ALL_VERSIONS"
1740# endif
de618ee4
NC
1741# ifdef USE_ATTRIBUTES_FOR_PERLIO
1742 " USE_ATTRIBUTES_FOR_PERLIO"
1743# endif
4a5df386
NC
1744# ifdef USE_FAST_STDIO
1745 " USE_FAST_STDIO"
1746# endif
59b86f4b
DM
1747# ifdef USE_HASH_SEED_EXPLICIT
1748 " USE_HASH_SEED_EXPLICIT"
1749# endif
98548bdf
NC
1750# ifdef USE_LOCALE
1751 " USE_LOCALE"
1752# endif
98548bdf
NC
1753# ifdef USE_LOCALE_CTYPE
1754 " USE_LOCALE_CTYPE"
1755# endif
5a8d8935
NC
1756# ifdef USE_PERL_ATOF
1757 " USE_PERL_ATOF"
1758# endif
0d311fbe
NC
1759# ifdef USE_SITECUSTOMIZE
1760 " USE_SITECUSTOMIZE"
1761# endif
4a5df386
NC
1762 ;
1763 PERL_UNUSED_ARG(cv);
1764 PERL_UNUSED_ARG(items);
1765
1766 EXTEND(SP, entries);
1767
1768 PUSHs(sv_2mortal(newSVpv(PL_bincompat_options, 0)));
1769 PUSHs(Perl_newSVpvn_flags(aTHX_ non_bincompat_options,
1770 sizeof(non_bincompat_options) - 1, SVs_TEMP));
1771
1772#ifdef __DATE__
1773# ifdef __TIME__
1774 PUSHs(Perl_newSVpvn_flags(aTHX_
1775 STR_WITH_LEN("Compiled at " __DATE__ " " __TIME__),
1776 SVs_TEMP));
1777# else
1778 PUSHs(Perl_newSVpvn_flags(aTHX_ STR_WITH_LEN("Compiled on " __DATE__),
1779 SVs_TEMP));
1780# endif
1781#else
1782 PUSHs(&PL_sv_undef);
1783#endif
1784
4a5df386
NC
1785 for (i = 1; i <= local_patch_count; i++) {
1786 /* This will be an undef, if PL_localpatches[i] is NULL. */
1787 PUSHs(sv_2mortal(newSVpv(PL_localpatches[i], 0)));
1788 }
1789
1790 XSRETURN(entries);
1791}
1792
be71fc8f
NC
1793#define INCPUSH_UNSHIFT 0x01
1794#define INCPUSH_ADD_OLD_VERS 0x02
1795#define INCPUSH_ADD_VERSIONED_SUB_DIRS 0x04
1796#define INCPUSH_ADD_ARCHONLY_SUB_DIRS 0x08
1797#define INCPUSH_NOT_BASEDIR 0x10
1798#define INCPUSH_CAN_RELOCATE 0x20
1e3208d8
NC
1799#define INCPUSH_ADD_SUB_DIRS \
1800 (INCPUSH_ADD_VERSIONED_SUB_DIRS|INCPUSH_ADD_ARCHONLY_SUB_DIRS)
e28f3139 1801
312caa8e 1802STATIC void *
14dd3ad8 1803S_parse_body(pTHX_ char **env, XSINIT_t xsinit)
312caa8e 1804{
27da23d5 1805 dVAR;
2f9285f8 1806 PerlIO *rsfp;
312caa8e 1807 int argc = PL_origargc;
8f42b153 1808 char **argv = PL_origargv;
e1ec3a88 1809 const char *scriptname = NULL;
312caa8e 1810 VOL bool dosearch = FALSE;
eb578fdb 1811 char c;
737c24fc 1812 bool doextract = FALSE;
bd61b366 1813 const char *cddir = NULL;
ab019eaa 1814#ifdef USE_SITECUSTOMIZE
20ef40cf 1815 bool minus_f = FALSE;
ab019eaa 1816#endif
95670bde 1817 SV *linestr_sv = NULL;
5486870f 1818 bool add_read_e_script = FALSE;
87606032 1819 U32 lex_start_flags = 0;
009d90df 1820
ca7b837b 1821 PERL_SET_PHASE(PERL_PHASE_START);
9ebf26ad 1822
6224f72b 1823 init_main_stash();
54310121 1824
c7030b81
NC
1825 {
1826 const char *s;
6224f72b
GS
1827 for (argc--,argv++; argc > 0; argc--,argv++) {
1828 if (argv[0][0] != '-' || !argv[0][1])
1829 break;
6224f72b
GS
1830 s = argv[0]+1;
1831 reswitch:
47f56822 1832 switch ((c = *s)) {
729a02f2 1833 case 'C':
1d5472a9
GS
1834#ifndef PERL_STRICT_CR
1835 case '\r':
1836#endif
6224f72b
GS
1837 case ' ':
1838 case '0':
1839 case 'F':
1840 case 'a':
1841 case 'c':
1842 case 'd':
1843 case 'D':
1844 case 'h':
1845 case 'i':
1846 case 'l':
1847 case 'M':
1848 case 'm':
1849 case 'n':
1850 case 'p':
1851 case 's':
1852 case 'u':
1853 case 'U':
1854 case 'v':
599cee73
PM
1855 case 'W':
1856 case 'X':
6224f72b 1857 case 'w':
97bd5664 1858 if ((s = moreswitches(s)))
6224f72b
GS
1859 goto reswitch;
1860 break;
33b78306 1861
1dbad523 1862 case 't':
dc6d7f5c 1863#if defined(SILENT_NO_TAINT_SUPPORT)
284167a5 1864 /* silently ignore */
dc6d7f5c 1865#elif defined(NO_TAINT_SUPPORT)
3231f579 1866 Perl_croak_nocontext("This perl was compiled without taint support. "
284167a5
S
1867 "Cowardly refusing to run with -t or -T flags");
1868#else
22f7c9c9 1869 CHECK_MALLOC_TOO_LATE_FOR('t');
284167a5
S
1870 if( !TAINTING_get ) {
1871 TAINT_WARN_set(TRUE);
1872 TAINTING_set(TRUE);
317ea90d 1873 }
284167a5 1874#endif
317ea90d
MS
1875 s++;
1876 goto reswitch;
6224f72b 1877 case 'T':
dc6d7f5c 1878#if defined(SILENT_NO_TAINT_SUPPORT)
284167a5 1879 /* silently ignore */
dc6d7f5c 1880#elif defined(NO_TAINT_SUPPORT)
3231f579 1881 Perl_croak_nocontext("This perl was compiled without taint support. "
284167a5
S
1882 "Cowardly refusing to run with -t or -T flags");
1883#else
22f7c9c9 1884 CHECK_MALLOC_TOO_LATE_FOR('T');
284167a5
S
1885 TAINTING_set(TRUE);
1886 TAINT_WARN_set(FALSE);
1887#endif
6224f72b
GS
1888 s++;
1889 goto reswitch;
f86702cc 1890
bc9b29db
RH
1891 case 'E':
1892 PL_minus_E = TRUE;
924ba076 1893 /* FALLTHROUGH */
6224f72b 1894 case 'e':
f20b2998 1895 forbid_setid('e', FALSE);
3280af22 1896 if (!PL_e_script) {
396482e1 1897 PL_e_script = newSVpvs("");
5486870f 1898 add_read_e_script = TRUE;
6224f72b
GS
1899 }
1900 if (*++s)
3280af22 1901 sv_catpv(PL_e_script, s);
6224f72b 1902 else if (argv[1]) {
3280af22 1903 sv_catpv(PL_e_script, argv[1]);
6224f72b
GS
1904 argc--,argv++;
1905 }
1906 else
47f56822 1907 Perl_croak(aTHX_ "No code specified for -%c", c);
396482e1 1908 sv_catpvs(PL_e_script, "\n");
6224f72b 1909 break;
afe37c7d 1910
20ef40cf 1911 case 'f':
f5542d3a 1912#ifdef USE_SITECUSTOMIZE
20ef40cf 1913 minus_f = TRUE;
f5542d3a 1914#endif
20ef40cf
GA
1915 s++;
1916 goto reswitch;
1917
6224f72b 1918 case 'I': /* -I handled both here and in moreswitches() */
f20b2998 1919 forbid_setid('I', FALSE);
bd61b366 1920 if (!*++s && (s=argv[1]) != NULL) {
6224f72b
GS
1921 argc--,argv++;
1922 }
6224f72b 1923 if (s && *s) {
0df16ed7 1924 STRLEN len = strlen(s);
55b4bc1c 1925 incpush(s, len, INCPUSH_ADD_SUB_DIRS|INCPUSH_ADD_OLD_VERS);
0df16ed7
GS
1926 }
1927 else
a67e862a 1928 Perl_croak(aTHX_ "No directory specified for -I");
6224f72b 1929 break;
6224f72b 1930 case 'S':
f20b2998 1931 forbid_setid('S', FALSE);
6224f72b
GS
1932 dosearch = TRUE;
1933 s++;
1934 goto reswitch;
1935 case 'V':
7edfd0ef
NC
1936 {
1937 SV *opts_prog;
1938
7edfd0ef 1939 if (*++s != ':') {
37ca4a5b 1940 opts_prog = newSVpvs("use Config; Config::_V()");
7edfd0ef
NC
1941 }
1942 else {
1943 ++s;
1944 opts_prog = Perl_newSVpvf(aTHX_
37ca4a5b 1945 "use Config; Config::config_vars(qw%c%s%c)",
7edfd0ef
NC
1946 0, s, 0);
1947 s += strlen(s);
1948 }
37ca4a5b 1949 Perl_av_create_and_push(aTHX_ &PL_preambleav, opts_prog);
7edfd0ef
NC
1950 /* don't look for script or read stdin */
1951 scriptname = BIT_BUCKET;
1952 goto reswitch;
6224f72b 1953 }
6224f72b 1954 case 'x':
737c24fc 1955 doextract = TRUE;
6224f72b 1956 s++;
304334da 1957 if (*s)
f4c556ac 1958 cddir = s;
6224f72b
GS
1959 break;
1960 case 0:
1961 break;
1962 case '-':
1963 if (!*++s || isSPACE(*s)) {
1964 argc--,argv++;
1965 goto switch_end;
1966 }
ee8bc8b7
NC
1967 /* catch use of gnu style long options.
1968 Both of these exit immediately. */
1969 if (strEQ(s, "version"))
1970 minus_v();
1971 if (strEQ(s, "help"))
1972 usage();
6224f72b 1973 s--;
924ba076 1974 /* FALLTHROUGH */
6224f72b 1975 default:
cea2e8a9 1976 Perl_croak(aTHX_ "Unrecognized switch: -%s (-h will show valid options)",s);
8d063cd8
LW
1977 }
1978 }
c7030b81
NC
1979 }
1980
6224f72b 1981 switch_end:
54310121 1982
c7030b81
NC
1983 {
1984 char *s;
1985
f675dbe5
CB
1986 if (
1987#ifndef SECURE_INTERNAL_GETENV
284167a5 1988 !TAINTING_get &&
f675dbe5 1989#endif
cf756827 1990 (s = PerlEnv_getenv("PERL5OPT")))
0df16ed7 1991 {
74288ac8
GS
1992 while (isSPACE(*s))
1993 s++;
317ea90d 1994 if (*s == '-' && *(s+1) == 'T') {
dc6d7f5c 1995#if defined(SILENT_NO_TAINT_SUPPORT)
284167a5 1996 /* silently ignore */
dc6d7f5c 1997#elif defined(NO_TAINT_SUPPORT)
3231f579 1998 Perl_croak_nocontext("This perl was compiled without taint support. "
284167a5
S
1999 "Cowardly refusing to run with -t or -T flags");
2000#else
22f7c9c9 2001 CHECK_MALLOC_TOO_LATE_FOR('T');
284167a5
S
2002 TAINTING_set(TRUE);
2003 TAINT_WARN_set(FALSE);
2004#endif
317ea90d 2005 }
74288ac8 2006 else {
bd61b366 2007 char *popt_copy = NULL;
74288ac8 2008 while (s && *s) {
54913509 2009 const char *d;
74288ac8
GS
2010 while (isSPACE(*s))
2011 s++;
2012 if (*s == '-') {
2013 s++;
2014 if (isSPACE(*s))
2015 continue;
2016 }
4ea8f8fb 2017 d = s;
74288ac8
GS
2018 if (!*s)
2019 break;
2b622f1a 2020 if (!strchr("CDIMUdmtwW", *s))
cea2e8a9 2021 Perl_croak(aTHX_ "Illegal switch in PERL5OPT: -%c", *s);
4ea8f8fb
MS
2022 while (++s && *s) {
2023 if (isSPACE(*s)) {
cf756827 2024 if (!popt_copy) {
bfa6c418
NC
2025 popt_copy = SvPVX(sv_2mortal(newSVpv(d,0)));
2026 s = popt_copy + (s - d);
2027 d = popt_copy;
cf756827 2028 }
4ea8f8fb
MS
2029 *s++ = '\0';
2030 break;
2031 }
2032 }
1c4db469 2033 if (*d == 't') {
dc6d7f5c 2034#if defined(SILENT_NO_TAINT_SUPPORT)
284167a5 2035 /* silently ignore */
dc6d7f5c 2036#elif defined(NO_TAINT_SUPPORT)
3231f579 2037 Perl_croak_nocontext("This perl was compiled without taint support. "
284167a5
S
2038 "Cowardly refusing to run with -t or -T flags");
2039#else
2040 if( !TAINTING_get) {
2041 TAINT_WARN_set(TRUE);
2042 TAINTING_set(TRUE);
317ea90d 2043 }
284167a5 2044#endif
1c4db469 2045 } else {
97bd5664 2046 moreswitches(d);
1c4db469 2047 }
6224f72b 2048 }
6224f72b
GS
2049 }
2050 }
c7030b81 2051 }
a0d0e21e 2052
c29067d7
CH
2053 /* Set $^X early so that it can be used for relocatable paths in @INC */
2054 /* and for SITELIB_EXP in USE_SITECUSTOMIZE */
284167a5 2055 assert (!TAINT_get);
c29067d7 2056 TAINT;
e2051532 2057 set_caret_X();
c29067d7
CH
2058 TAINT_NOT;
2059
43c0c913 2060#if defined(USE_SITECUSTOMIZE)
20ef40cf 2061 if (!minus_f) {
43c0c913 2062 /* The games with local $! are to avoid setting errno if there is no
fc81b718
NC
2063 sitecustomize script. "q%c...%c", 0, ..., 0 becomes "q\0...\0",
2064 ie a q() operator with a NUL byte as a the delimiter. This avoids
2065 problems with pathnames containing (say) ' */
43c0c913
NC
2066# ifdef PERL_IS_MINIPERL
2067 AV *const inc = GvAV(PL_incgv);
2068 SV **const inc0 = inc ? av_fetch(inc, 0, FALSE) : NULL;
2069
2070 if (inc0) {
15870c5c
NC
2071 /* if lib/buildcustomize.pl exists, it should not fail. If it does,
2072 it should be reported immediately as a build failure. */
43c0c913
NC
2073 (void)Perl_av_create_and_unshift_one(aTHX_ &PL_preambleav,
2074 Perl_newSVpvf(aTHX_
5de87db5 2075 "BEGIN { my $f = q%c%s%"SVf"/buildcustomize.pl%c; "
af26e4f2
FC
2076 "do {local $!; -f $f }"
2077 " and do $f || die $@ || qq '$f: $!' }",
5de87db5 2078 0, (TAINTING_get ? "./" : ""), SVfARG(*inc0), 0));
43c0c913
NC
2079 }
2080# else
2081 /* SITELIB_EXP is a function call on Win32. */
c29067d7 2082 const char *const raw_sitelib = SITELIB_EXP;
bac5c4fc
JD
2083 if (raw_sitelib) {
2084 /* process .../.. if PERL_RELOCATABLE_INC is defined */
2085 SV *sitelib_sv = mayberelocate(raw_sitelib, strlen(raw_sitelib),
2086 INCPUSH_CAN_RELOCATE);
2087 const char *const sitelib = SvPVX(sitelib_sv);
2088 (void)Perl_av_create_and_unshift_one(aTHX_ &PL_preambleav,
2089 Perl_newSVpvf(aTHX_
2090 "BEGIN { do {local $!; -f q%c%s/sitecustomize.pl%c} && do q%c%s/sitecustomize.pl%c }",
c1f6cd39
BF
2091 0, SVfARG(sitelib), 0,
2092 0, SVfARG(sitelib), 0));
bac5c4fc
JD
2093 assert (SvREFCNT(sitelib_sv) == 1);
2094 SvREFCNT_dec(sitelib_sv);
2095 }
43c0c913 2096# endif
20ef40cf
GA
2097 }
2098#endif
2099
6224f72b
GS
2100 if (!scriptname)
2101 scriptname = argv[0];
3280af22 2102 if (PL_e_script) {
6224f72b
GS
2103 argc++,argv--;
2104 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
2105 }
bd61b366 2106 else if (scriptname == NULL) {
6224f72b
GS
2107#ifdef MSDOS
2108 if ( PerlLIO_isatty(PerlIO_fileno(PerlIO_stdin())) )
97bd5664 2109 moreswitches("h");
6224f72b
GS
2110#endif
2111 scriptname = "-";
2112 }
2113
284167a5 2114 assert (!TAINT_get);
2cace6ac 2115 init_perllib();
6224f72b 2116
a52eba0e 2117 {
f20b2998 2118 bool suidscript = FALSE;
829372d3 2119
8d113837 2120 rsfp = open_script(scriptname, dosearch, &suidscript);
c0b3891a
NC
2121 if (!rsfp) {
2122 rsfp = PerlIO_stdin();
87606032 2123 lex_start_flags = LEX_DONT_CLOSE_RSFP;
c0b3891a 2124 }
6224f72b 2125
b24bc095 2126 validate_suid(rsfp);
6224f72b 2127
64ca3a65 2128#ifndef PERL_MICRO
a52eba0e
NC
2129# if defined(SIGCHLD) || defined(SIGCLD)
2130 {
2131# ifndef SIGCHLD
2132# define SIGCHLD SIGCLD
2133# endif
2134 Sighandler_t sigstate = rsignal_state(SIGCHLD);
2135 if (sigstate == (Sighandler_t) SIG_IGN) {
a2a5de95
NC
2136 Perl_ck_warner(aTHX_ packWARN(WARN_SIGNAL),
2137 "Can't ignore signal CHLD, forcing to default");
a52eba0e
NC
2138 (void)rsignal(SIGCHLD, (Sighandler_t)SIG_DFL);
2139 }
0b5b802d 2140 }
a52eba0e 2141# endif
64ca3a65 2142#endif
0b5b802d 2143
737c24fc 2144 if (doextract) {
faef540c 2145
f20b2998 2146 /* This will croak if suidscript is true, as -x cannot be used with
faef540c
NC
2147 setuid scripts. */
2148 forbid_setid('x', suidscript);
f20b2998 2149 /* Hence you can't get here if suidscript is true */
faef540c 2150
95670bde
NC
2151 linestr_sv = newSV_type(SVt_PV);
2152 lex_start_flags |= LEX_START_COPIED;
2f9285f8 2153 find_beginning(linestr_sv, rsfp);
a52eba0e
NC
2154 if (cddir && PerlDir_chdir( (char *)cddir ) < 0)
2155 Perl_croak(aTHX_ "Can't chdir to %s",cddir);
2156 }
f4c556ac 2157 }
6224f72b 2158
ea726b52 2159 PL_main_cv = PL_compcv = MUTABLE_CV(newSV_type(SVt_PVCV));
3280af22
NIS
2160 CvUNIQUE_on(PL_compcv);
2161
dd2155a4 2162 CvPADLIST(PL_compcv) = pad_new(0);
6224f72b 2163
dd69841b
BB
2164 PL_isarev = newHV();
2165
0c4f7ff0 2166 boot_core_PerlIO();
6224f72b 2167 boot_core_UNIVERSAL();
e1a479c5 2168 boot_core_mro();
4a5df386 2169 newXS("Internals::V", S_Internals_V, __FILE__);
6224f72b
GS
2170
2171 if (xsinit)
acfe0abc 2172 (*xsinit)(aTHX); /* in case linked C routines want magical variables */
64ca3a65 2173#ifndef PERL_MICRO
739a0b84 2174#if defined(VMS) || defined(WIN32) || defined(DJGPP) || defined(__CYGWIN__) || defined(SYMBIAN)
c5be433b 2175 init_os_extras();
6224f72b 2176#endif
64ca3a65 2177#endif
6224f72b 2178
29209bc5 2179#ifdef USE_SOCKS
1b9c9cf5
DH
2180# ifdef HAS_SOCKS5_INIT
2181 socks5_init(argv[0]);
2182# else
29209bc5 2183 SOCKSinit(argv[0]);
1b9c9cf5 2184# endif
ac27b0f5 2185#endif
29209bc5 2186
6224f72b
GS
2187 init_predump_symbols();
2188 /* init_postdump_symbols not currently designed to be called */
2189 /* more than once (ENV isn't cleared first, for example) */
2190 /* But running with -u leaves %ENV & @ARGV undefined! XXX */
3280af22 2191 if (!PL_do_undump)
6224f72b
GS
2192 init_postdump_symbols(argc,argv,env);
2193
27da23d5
JH
2194 /* PL_unicode is turned on by -C, or by $ENV{PERL_UNICODE},
2195 * or explicitly in some platforms.
085a54d9 2196 * locale.c:Perl_init_i18nl10n() if the environment
a05d7ebb 2197 * look like the user wants to use UTF-8. */
a0fd4948 2198#if defined(__SYMBIAN32__)
27da23d5
JH
2199 PL_unicode = PERL_UNICODE_STD_FLAG; /* See PERL_SYMBIAN_CONSOLE_UTF8. */
2200#endif
e27b5b51 2201# ifndef PERL_IS_MINIPERL
06e66572
JH
2202 if (PL_unicode) {
2203 /* Requires init_predump_symbols(). */
a05d7ebb 2204 if (!(PL_unicode & PERL_UNICODE_LOCALE_FLAG) || PL_utf8locale) {
06e66572
JH
2205 IO* io;
2206 PerlIO* fp;
2207 SV* sv;
2208
a05d7ebb 2209 /* Turn on UTF-8-ness on STDIN, STDOUT, STDERR
06e66572 2210 * and the default open disciplines. */
a05d7ebb
JH
2211 if ((PL_unicode & PERL_UNICODE_STDIN_FLAG) &&
2212 PL_stdingv && (io = GvIO(PL_stdingv)) &&
2213 (fp = IoIFP(io)))
2214 PerlIO_binmode(aTHX_ fp, IoTYPE(io), 0, ":utf8");
2215 if ((PL_unicode & PERL_UNICODE_STDOUT_FLAG) &&
2216 PL_defoutgv && (io = GvIO(PL_defoutgv)) &&
2217 (fp = IoOFP(io)))
2218 PerlIO_binmode(aTHX_ fp, IoTYPE(io), 0, ":utf8");
2219 if ((PL_unicode & PERL_UNICODE_STDERR_FLAG) &&
2220 PL_stderrgv && (io = GvIO(PL_stderrgv)) &&
2221 (fp = IoOFP(io)))
2222 PerlIO_binmode(aTHX_ fp, IoTYPE(io), 0, ":utf8");
2223 if ((PL_unicode & PERL_UNICODE_INOUT_FLAG) &&
fafc274c
NC
2224 (sv = GvSV(gv_fetchpvs("\017PEN", GV_ADD|GV_NOTQUAL,
2225 SVt_PV)))) {
a05d7ebb
JH
2226 U32 in = PL_unicode & PERL_UNICODE_IN_FLAG;
2227 U32 out = PL_unicode & PERL_UNICODE_OUT_FLAG;
2228 if (in) {
2229 if (out)
76f68e9b 2230 sv_setpvs(sv, ":utf8\0:utf8");
a05d7ebb 2231 else
76f68e9b 2232 sv_setpvs(sv, ":utf8\0");
a05d7ebb
JH
2233 }
2234 else if (out)
76f68e9b 2235 sv_setpvs(sv, "\0:utf8");
a05d7ebb
JH
2236 SvSETMAGIC(sv);
2237 }
b310b053
JH
2238 }
2239 }
e27b5b51 2240#endif
b310b053 2241
c7030b81
NC
2242 {
2243 const char *s;
4ffa73a3
JH
2244 if ((s = PerlEnv_getenv("PERL_SIGNALS"))) {
2245 if (strEQ(s, "unsafe"))
2246 PL_signals |= PERL_SIGNALS_UNSAFE_FLAG;
2247 else if (strEQ(s, "safe"))
2248 PL_signals &= ~PERL_SIGNALS_UNSAFE_FLAG;
2249 else
2250 Perl_croak(aTHX_ "PERL_SIGNALS illegal: \"%s\"", s);
2251 }
c7030b81 2252 }
4ffa73a3 2253
81d86705 2254
87606032 2255 lex_start(linestr_sv, rsfp, lex_start_flags);
d2687c98 2256 SvREFCNT_dec(linestr_sv);
95670bde 2257
219f7226 2258 PL_subname = newSVpvs("main");
6224f72b 2259
5486870f
DM
2260 if (add_read_e_script)
2261 filter_add(read_e_script, NULL);
2262
6224f72b
GS
2263 /* now parse the script */
2264
93189314 2265 SETERRNO(0,SS_NORMAL);
28ac2b49 2266 if (yyparse(GRAMPROG) || PL_parser->error_count) {
3280af22 2267 if (PL_minus_c)
cea2e8a9 2268 Perl_croak(aTHX_ "%s had compilation errors.\n", PL_origfilename);
6224f72b 2269 else {
cea2e8a9 2270 Perl_croak(aTHX_ "Execution of %s aborted due to compilation errors.\n",
097ee67d 2271 PL_origfilename);
6224f72b
GS
2272 }
2273 }
57843af0 2274 CopLINE_set(PL_curcop, 0);
03d9f026 2275 SET_CURSTASH(PL_defstash);
3280af22
NIS
2276 if (PL_e_script) {
2277 SvREFCNT_dec(PL_e_script);
a0714e2c 2278 PL_e_script = NULL;
6224f72b
GS
2279 }
2280
3280af22 2281 if (PL_do_undump)
6224f72b
GS
2282 my_unexec();
2283
57843af0
GS
2284 if (isWARN_ONCE) {
2285 SAVECOPFILE(PL_curcop);
2286 SAVECOPLINE(PL_curcop);
3280af22 2287 gv_check(PL_defstash);
57843af0 2288 }
6224f72b
GS
2289
2290 LEAVE;
2291 FREETMPS;
2292
2293#ifdef MYMALLOC
f6a607bc
RGS
2294 {
2295 const char *s;
96e440d2
JH
2296 if ((s=PerlEnv_getenv("PERL_DEBUG_MSTATS")) && grok_atou(s, NULL) >= 2)
2297 dump_mstats("after compilation:");
f6a607bc 2298 }
6224f72b
GS
2299#endif
2300
2301 ENTER;
febb3a6d 2302 PL_restartjmpenv = NULL;
3280af22 2303 PL_restartop = 0;
312caa8e 2304 return NULL;
6224f72b
GS
2305}
2306
954c1994
GS
2307/*
2308=for apidoc perl_run
2309
2310Tells a Perl interpreter to run. See L<perlembed>.
2311
2312=cut
2313*/
2314
6224f72b 2315int
0cb96387 2316perl_run(pTHXx)
6224f72b 2317{
6224f72b 2318 I32 oldscope;
14dd3ad8 2319 int ret = 0;
db36c5a1 2320 dJMPENV;
6224f72b 2321
7918f24d
NC
2322 PERL_ARGS_ASSERT_PERL_RUN;
2323#ifndef MULTIPLICITY
ed6c66dd 2324 PERL_UNUSED_ARG(my_perl);
7918f24d 2325#endif
9d4ba2ae 2326
3280af22 2327 oldscope = PL_scopestack_ix;
96e176bf
CL
2328#ifdef VMS
2329 VMSISH_HUSHED = 0;
2330#endif
6224f72b 2331
14dd3ad8 2332 JMPENV_PUSH(ret);
6224f72b
GS
2333 switch (ret) {
2334 case 1:
2335 cxstack_ix = -1; /* start context stack again */
312caa8e 2336 goto redo_body;
14dd3ad8 2337 case 0: /* normal completion */
14dd3ad8
GS
2338 redo_body:
2339 run_body(oldscope);
924ba076 2340 /* FALLTHROUGH */
14dd3ad8 2341 case 2: /* my_exit() */
3280af22 2342 while (PL_scopestack_ix > oldscope)
6224f72b
GS
2343 LEAVE;
2344 FREETMPS;
03d9f026 2345 SET_CURSTASH(PL_defstash);
3a1ee7e8 2346 if (!(PL_exit_flags & PERL_EXIT_DESTRUCT_END) &&
9ebf26ad 2347 PL_endav && !PL_minus_c) {
ca7b837b 2348 PERL_SET_PHASE(PERL_PHASE_END);
31d77e54 2349 call_list(oldscope, PL_endav);
9ebf26ad 2350 }
6224f72b
GS
2351#ifdef MYMALLOC
2352 if (PerlEnv_getenv("PERL_DEBUG_MSTATS"))
2353 dump_mstats("after execution: ");
2354#endif
37038d91 2355 ret = STATUS_EXIT;
14dd3ad8 2356 break;
6224f72b 2357 case 3:
312caa8e
CS
2358 if (PL_restartop) {
2359 POPSTACK_TO(PL_mainstack);
2360 goto redo_body;
6224f72b 2361 }
5637ef5b 2362 PerlIO_printf(Perl_error_log, "panic: restartop in perl_run\n");
312caa8e 2363 FREETMPS;
14dd3ad8
GS
2364 ret = 1;
2365 break;
6224f72b
GS
2366 }
2367
14dd3ad8
GS
2368 JMPENV_POP;
2369 return ret;
312caa8e
CS
2370}
2371
dd374669 2372STATIC void
14dd3ad8
GS
2373S_run_body(pTHX_ I32 oldscope)
2374{
d3b97530
DM
2375 DEBUG_r(PerlIO_printf(Perl_debug_log, "%s $` $& $' support (0x%x).\n",
2376 PL_sawampersand ? "Enabling" : "Omitting",
2377 (unsigned int)(PL_sawampersand)));
6224f72b 2378
3280af22 2379 if (!PL_restartop) {
cf2782cd 2380#ifdef DEBUGGING
f0e3f042
CS
2381 if (DEBUG_x_TEST || DEBUG_B_TEST)
2382 dump_all_perl(!DEBUG_B_TEST);
ecae49c0
NC
2383 if (!DEBUG_q_TEST)
2384 PERL_DEBUG(PerlIO_printf(Perl_debug_log, "\nEXECUTING...\n\n"));
cf2782cd 2385#endif
6224f72b 2386
3280af22 2387 if (PL_minus_c) {
bf49b057 2388 PerlIO_printf(Perl_error_log, "%s syntax OK\n", PL_origfilename);
6224f72b
GS
2389 my_exit(0);
2390 }
3280af22 2391 if (PERLDB_SINGLE && PL_DBsingle)
ac27b0f5 2392 sv_setiv(PL_DBsingle, 1);
9ebf26ad 2393 if (PL_initav) {
ca7b837b 2394 PERL_SET_PHASE(PERL_PHASE_INIT);
3280af22 2395 call_list(oldscope, PL_initav);
9ebf26ad 2396 }
f1fac472 2397#ifdef PERL_DEBUG_READONLY_OPS
3107b51f
FC
2398 if (PL_main_root && PL_main_root->op_slabbed)
2399 Slab_to_ro(OpSLAB(PL_main_root));
f1fac472 2400#endif
6224f72b
GS
2401 }
2402
2403 /* do it */
2404
ca7b837b 2405 PERL_SET_PHASE(PERL_PHASE_RUN);
9ebf26ad 2406
3280af22 2407 if (PL_restartop) {
febb3a6d 2408 PL_restartjmpenv = NULL;
533c011a 2409 PL_op = PL_restartop;
3280af22 2410 PL_restartop = 0;
cea2e8a9 2411 CALLRUNOPS(aTHX);
6224f72b 2412 }
3280af22
NIS
2413 else if (PL_main_start) {
2414 CvDEPTH(PL_main_cv) = 1;
533c011a 2415 PL_op = PL_main_start;
cea2e8a9 2416 CALLRUNOPS(aTHX);
6224f72b 2417 }
f6b3007c 2418 my_exit(0);
a25b5927 2419 assert(0); /* NOTREACHED */
6224f72b
GS
2420}
2421
954c1994 2422/*
ccfc67b7
JH
2423=head1 SV Manipulation Functions
2424
954c1994
GS
2425=for apidoc p||get_sv
2426
64ace3f8 2427Returns the SV of the specified Perl scalar. C<flags> are passed to
72d33970 2428C<gv_fetchpv>. If C<GV_ADD> is set and the
64ace3f8
NC
2429Perl variable does not exist then it will be created. If C<flags> is zero
2430and the variable does not exist then NULL is returned.
954c1994
GS
2431
2432=cut
2433*/
2434
6224f72b 2435SV*
64ace3f8 2436Perl_get_sv(pTHX_ const char *name, I32 flags)
6224f72b
GS
2437{
2438 GV *gv;
7918f24d
NC
2439
2440 PERL_ARGS_ASSERT_GET_SV;
2441
64ace3f8 2442 gv = gv_fetchpv(name, flags, SVt_PV);
6224f72b
GS
2443 if (gv)
2444 return GvSV(gv);
a0714e2c 2445 return NULL;
6224f72b
GS
2446}
2447
954c1994 2448/*
ccfc67b7
JH
2449=head1 Array Manipulation Functions
2450
954c1994
GS
2451=for apidoc p||get_av
2452
f0b90de1
SF
2453Returns the AV of the specified Perl global or package array with the given
2454name (so it won't work on lexical variables). C<flags> are passed
72d33970 2455to C<gv_fetchpv>. If C<GV_ADD> is set and the
cbfd0a87
NC
2456Perl variable does not exist then it will be created. If C<flags> is zero
2457and the variable does not exist then NULL is returned.
954c1994 2458
f0b90de1
SF
2459Perl equivalent: C<@{"$name"}>.
2460
954c1994
GS
2461=cut
2462*/
2463
6224f72b 2464AV*
cbfd0a87 2465Perl_get_av(pTHX_ const char *name, I32 flags)
6224f72b 2466{
cbfd0a87 2467 GV* const gv = gv_fetchpv(name, flags, SVt_PVAV);
7918f24d
NC
2468
2469 PERL_ARGS_ASSERT_GET_AV;
2470
cbfd0a87 2471 if (flags)
6224f72b
GS
2472 return GvAVn(gv);
2473 if (gv)
2474 return GvAV(gv);
7d49f689 2475 return NULL;
6224f72b
GS
2476}
2477
954c1994 2478/*
ccfc67b7
JH
2479=head1 Hash Manipulation Functions
2480
954c1994
GS
2481=for apidoc p||get_hv
2482
6673a63c 2483Returns the HV of the specified Perl hash. C<flags> are passed to
72d33970 2484C<gv_fetchpv>. If C<GV_ADD> is set and the
6673a63c
NC
2485Perl variable does not exist then it will be created. If C<flags> is zero
2486and the variable does not exist then NULL is returned.
954c1994
GS
2487
2488=cut
2489*/
2490
6224f72b 2491HV*
6673a63c 2492Perl_get_hv(pTHX_ const char *name, I32 flags)
6224f72b 2493{
6673a63c 2494 GV* const gv = gv_fetchpv(name, flags, SVt_PVHV);
7918f24d
NC
2495
2496 PERL_ARGS_ASSERT_GET_HV;
2497
6673a63c 2498 if (flags)
a0d0e21e
LW
2499 return GvHVn(gv);
2500 if (gv)
2501 return GvHV(gv);
5c284bb0 2502 return NULL;
a0d0e21e
LW
2503}
2504
954c1994 2505/*
ccfc67b7
JH
2506=head1 CV Manipulation Functions
2507
780a5241
NC
2508=for apidoc p||get_cvn_flags
2509
2510Returns the CV of the specified Perl subroutine. C<flags> are passed to
72d33970 2511C<gv_fetchpvn_flags>. If C<GV_ADD> is set and the Perl subroutine does not
780a5241
NC
2512exist then it will be declared (which has the same effect as saying
2513C<sub name;>). If C<GV_ADD> is not set and the subroutine does not exist
2514then NULL is returned.
2515
954c1994
GS
2516=for apidoc p||get_cv
2517
780a5241 2518Uses C<strlen> to get the length of C<name>, then calls C<get_cvn_flags>.
954c1994
GS
2519
2520=cut
2521*/
2522
a0d0e21e 2523CV*
780a5241 2524Perl_get_cvn_flags(pTHX_ const char *name, STRLEN len, I32 flags)
a0d0e21e 2525{
780a5241 2526 GV* const gv = gv_fetchpvn_flags(name, len, flags, SVt_PVCV);
7918f24d
NC
2527
2528 PERL_ARGS_ASSERT_GET_CVN_FLAGS;
2529
334dda80
FC
2530 /* XXX this is probably not what they think they're getting.
2531 * It has the same effect as "sub name;", i.e. just a forward
2532 * declaration! */
780a5241 2533 if ((flags & ~GV_NOADD_MASK) && !GvCVu(gv)) {
186a5ba8 2534 return newSTUB(gv,0);
780a5241 2535 }
a0d0e21e 2536 if (gv)
8ebc5c01 2537 return GvCVu(gv);
601f1833 2538 return NULL;
a0d0e21e
LW
2539}
2540
2c67934f
NC
2541/* Nothing in core calls this now, but we can't replace it with a macro and
2542 move it to mathoms.c as a macro would evaluate name twice. */
780a5241
NC
2543CV*
2544Perl_get_cv(pTHX_ const char *name, I32 flags)
2545{
7918f24d
NC
2546 PERL_ARGS_ASSERT_GET_CV;
2547
780a5241
NC
2548 return get_cvn_flags(name, strlen(name), flags);
2549}
2550
79072805
LW
2551/* Be sure to refetch the stack pointer after calling these routines. */
2552
954c1994 2553/*
ccfc67b7
JH
2554
2555=head1 Callback Functions
2556
954c1994
GS
2557=for apidoc p||call_argv
2558
f0b90de1 2559Performs a callback to the specified named and package-scoped Perl subroutine
72d33970
FC
2560with C<argv> (a NULL-terminated array of strings) as arguments. See
2561L<perlcall>.
f0b90de1
SF
2562
2563Approximate Perl equivalent: C<&{"$sub_name"}(@$argv)>.
954c1994
GS
2564
2565=cut
2566*/
2567
a0d0e21e 2568I32
5aaab254 2569Perl_call_argv(pTHX_ const char *sub_name, I32 flags, char **argv)
ac27b0f5 2570
8ac85365
NIS
2571 /* See G_* flags in cop.h */
2572 /* null terminated arg list */
8990e307 2573{
a0d0e21e 2574 dSP;
8990e307 2575
7918f24d
NC
2576 PERL_ARGS_ASSERT_CALL_ARGV;
2577
924508f0 2578 PUSHMARK(SP);
a0d0e21e 2579 if (argv) {
8990e307 2580 while (*argv) {
6e449a3a 2581 mXPUSHs(newSVpv(*argv,0));
8990e307
LW
2582 argv++;
2583 }
a0d0e21e 2584 PUTBACK;
8990e307 2585 }
864dbfa3 2586 return call_pv(sub_name, flags);
8990e307
LW
2587}
2588
954c1994
GS
2589/*
2590=for apidoc p||call_pv
2591
2592Performs a callback to the specified Perl sub. See L<perlcall>.
2593
2594=cut
2595*/
2596
a0d0e21e 2597I32
864dbfa3 2598Perl_call_pv(pTHX_ const char *sub_name, I32 flags)
8ac85365
NIS
2599 /* name of the subroutine */
2600 /* See G_* flags in cop.h */
a0d0e21e 2601{
7918f24d
NC
2602 PERL_ARGS_ASSERT_CALL_PV;
2603
0da0e728 2604 return call_sv(MUTABLE_SV(get_cv(sub_name, GV_ADD)), flags);
a0d0e21e
LW
2605}
2606
954c1994
GS
2607/*
2608=for apidoc p||call_method
2609
2610Performs a callback to the specified Perl method. The blessed object must
2611be on the stack. See L<perlcall>.
2612
2613=cut
2614*/
2615
a0d0e21e 2616I32
864dbfa3 2617Perl_call_method(pTHX_ const char *methname, I32 flags)
8ac85365
NIS
2618 /* name of the subroutine */
2619 /* See G_* flags in cop.h */
a0d0e21e 2620{
46ca9bac 2621 STRLEN len;
c106c2be 2622 SV* sv;
7918f24d
NC
2623 PERL_ARGS_ASSERT_CALL_METHOD;
2624
46ca9bac 2625 len = strlen(methname);
c106c2be
RZ
2626 sv = flags & G_METHOD_NAMED
2627 ? sv_2mortal(newSVpvn_share(methname, len,0))
2628 : newSVpvn_flags(methname, len, SVs_TEMP);
46ca9bac 2629
c106c2be 2630 return call_sv(sv, flags | G_METHOD);
a0d0e21e
LW
2631}
2632
2633/* May be called with any of a CV, a GV, or an SV containing the name. */
954c1994
GS
2634/*
2635=for apidoc p||call_sv
2636
2637Performs a callback to the Perl sub whose name is in the SV. See
2638L<perlcall>.
2639
2640=cut
2641*/
2642
a0d0e21e 2643I32
001d637e 2644Perl_call_sv(pTHX_ SV *sv, VOL I32 flags)
8ac85365 2645 /* See G_* flags in cop.h */
a0d0e21e 2646{
27da23d5 2647 dVAR; dSP;
a0d0e21e 2648 LOGOP myop; /* fake syntax tree node */
c106c2be
RZ
2649 UNOP method_unop;
2650 SVOP method_svop;
aa689395 2651 I32 oldmark;
8ea43dc8 2652 VOL I32 retval = 0;
a0d0e21e 2653 I32 oldscope;
54310121 2654 bool oldcatch = CATCH_GET;
6224f72b 2655 int ret;
c4420975 2656 OP* const oldop = PL_op;
db36c5a1 2657 dJMPENV;
1e422769 2658
7918f24d
NC
2659 PERL_ARGS_ASSERT_CALL_SV;
2660
a0d0e21e
LW
2661 if (flags & G_DISCARD) {
2662 ENTER;
2663 SAVETMPS;
2664 }
2f8edad0
NC
2665 if (!(flags & G_WANT)) {
2666 /* Backwards compatibility - as G_SCALAR was 0, it could be omitted.
2667 */
2668 flags |= G_SCALAR;
2669 }
a0d0e21e 2670
aa689395 2671 Zero(&myop, 1, LOGOP);
f51d4af5 2672 if (!(flags & G_NOARGS))
aa689395 2673 myop.op_flags |= OPf_STACKED;
4f911530 2674 myop.op_flags |= OP_GIMME_REVERSE(flags);
462e5cf6 2675 SAVEOP();
533c011a 2676 PL_op = (OP*)&myop;
aa689395 2677
3280af22 2678 EXTEND(PL_stack_sp, 1);
c106c2be
RZ
2679 if (!(flags & G_METHOD_NAMED))
2680 *++PL_stack_sp = sv;
aa689395 2681 oldmark = TOPMARK;
3280af22 2682 oldscope = PL_scopestack_ix;
a0d0e21e 2683
3280af22 2684 if (PERLDB_SUB && PL_curstash != PL_debstash
36477c24 2685 /* Handle first BEGIN of -d. */
3280af22 2686 && (PL_DBcv || (PL_DBcv = GvCV(PL_DBsub)))
36477c24 2687 /* Try harder, since this may have been a sighandler, thus
2688 * curstash may be meaningless. */
ea726b52 2689 && (SvTYPE(sv) != SVt_PVCV || CvSTASH((const CV *)sv) != PL_debstash)
491527d0 2690 && !(flags & G_NODEBUG))
5ff48db8 2691 myop.op_private |= OPpENTERSUB_DB;
a0d0e21e 2692
c106c2be
RZ
2693 if (flags & (G_METHOD|G_METHOD_NAMED)) {
2694 if ( flags & G_METHOD_NAMED ) {
2695 Zero(&method_svop, 1, SVOP);
2696 method_svop.op_next = (OP*)&myop;
2697 method_svop.op_ppaddr = PL_ppaddr[OP_METHOD_NAMED];
2698 method_svop.op_type = OP_METHOD_NAMED;
2699 method_svop.op_sv = sv;
2700 PL_op = (OP*)&method_svop;
2701 } else {
2702 Zero(&method_unop, 1, UNOP);
2703 method_unop.op_next = (OP*)&myop;
2704 method_unop.op_ppaddr = PL_ppaddr[OP_METHOD];
2705 method_unop.op_type = OP_METHOD;
2706 PL_op = (OP*)&method_unop;
2707 }
2708 myop.op_ppaddr = PL_ppaddr[OP_ENTERSUB];
2709 myop.op_type = OP_ENTERSUB;
2710
968b3946
GS
2711 }
2712
312caa8e 2713 if (!(flags & G_EVAL)) {
0cdb2077 2714 CATCH_SET(TRUE);
d6f07c05 2715 CALL_BODY_SUB((OP*)&myop);
312caa8e 2716 retval = PL_stack_sp - (PL_stack_base + oldmark);
0253cb41 2717 CATCH_SET(oldcatch);
312caa8e
CS
2718 }
2719 else {
d78bda3d 2720 myop.op_other = (OP*)&myop;
3280af22 2721 PL_markstack_ptr--;
edb2152a 2722 create_eval_scope(flags|G_FAKINGEVAL);
3280af22 2723 PL_markstack_ptr++;
a0d0e21e 2724
14dd3ad8 2725 JMPENV_PUSH(ret);
edb2152a 2726
6224f72b
GS
2727 switch (ret) {
2728 case 0:
14dd3ad8 2729 redo_body:
d6f07c05 2730 CALL_BODY_SUB((OP*)&myop);
312caa8e 2731 retval = PL_stack_sp - (PL_stack_base + oldmark);
8433848b 2732 if (!(flags & G_KEEPERR)) {
ab69dbc2 2733 CLEAR_ERRSV();
8433848b 2734 }
a0d0e21e 2735 break;
6224f72b 2736 case 1:
f86702cc 2737 STATUS_ALL_FAILURE;
924ba076 2738 /* FALLTHROUGH */
6224f72b 2739 case 2:
a0d0e21e 2740 /* my_exit() was called */
03d9f026 2741 SET_CURSTASH(PL_defstash);
a0d0e21e 2742 FREETMPS;
14dd3ad8 2743 JMPENV_POP;
f86702cc 2744 my_exit_jump();
a25b5927 2745 assert(0); /* NOTREACHED */
6224f72b 2746 case 3:
3280af22 2747 if (PL_restartop) {
febb3a6d 2748 PL_restartjmpenv = NULL;
533c011a 2749 PL_op = PL_restartop;
3280af22 2750 PL_restartop = 0;
312caa8e 2751 goto redo_body;
a0d0e21e 2752 }
3280af22 2753 PL_stack_sp = PL_stack_base + oldmark;
51ce5529 2754 if ((flags & G_WANT) == G_ARRAY)
a0d0e21e
LW
2755 retval = 0;
2756 else {
2757 retval = 1;
3280af22 2758 *++PL_stack_sp = &PL_sv_undef;
a0d0e21e 2759 }
312caa8e 2760 break;
a0d0e21e 2761 }
a0d0e21e 2762
edb2152a
NC
2763 if (PL_scopestack_ix > oldscope)
2764 delete_eval_scope();
14dd3ad8 2765 JMPENV_POP;
a0d0e21e 2766 }
1e422769 2767
a0d0e21e 2768 if (flags & G_DISCARD) {
3280af22 2769 PL_stack_sp = PL_stack_base + oldmark;
a0d0e21e
LW
2770 retval = 0;
2771 FREETMPS;
2772 LEAVE;
2773 }
533c011a 2774 PL_op = oldop;
a0d0e21e
LW
2775 return retval;
2776}
2777
6e72f9df 2778/* Eval a string. The G_EVAL flag is always assumed. */
8990e307 2779
954c1994
GS
2780/*
2781=for apidoc p||eval_sv
2782
72d33970
FC
2783Tells Perl to C<eval> the string in the SV. It supports the same flags
2784as C<call_sv>, with the obvious exception of G_EVAL. See L<perlcall>.
954c1994
GS
2785
2786=cut
2787*/
2788
a0d0e21e 2789I32
864dbfa3 2790Perl_eval_sv(pTHX_ SV *sv, I32 flags)
ac27b0f5 2791
8ac85365 2792 /* See G_* flags in cop.h */
a0d0e21e 2793{
97aff369 2794 dVAR;
924508f0 2795 dSP;
a0d0e21e 2796 UNOP myop; /* fake syntax tree node */
8ea43dc8
SP
2797 VOL I32 oldmark = SP - PL_stack_base;
2798 VOL I32 retval = 0;
6224f72b 2799 int ret;
c4420975 2800 OP* const oldop = PL_op;
db36c5a1 2801 dJMPENV;
84902520 2802
7918f24d
NC
2803 PERL_ARGS_ASSERT_EVAL_SV;
2804
4633a7c4
LW
2805 if (flags & G_DISCARD) {
2806 ENTER;
2807 SAVETMPS;
2808 }
2809
462e5cf6 2810 SAVEOP();
533c011a 2811 PL_op = (OP*)&myop;
5ff48db8 2812 Zero(&myop, 1, UNOP);
3280af22
NIS
2813 EXTEND(PL_stack_sp, 1);
2814 *++PL_stack_sp = sv;
79072805 2815
4633a7c4
LW
2816 if (!(flags & G_NOARGS))
2817 myop.op_flags = OPf_STACKED;
6e72f9df 2818 myop.op_type = OP_ENTEREVAL;
4f911530 2819 myop.op_flags |= OP_GIMME_REVERSE(flags);
6e72f9df 2820 if (flags & G_KEEPERR)
2821 myop.op_flags |= OPf_SPECIAL;
a1941760
DM
2822
2823 if (flags & G_RE_REPARSING)
2824 myop.op_private = (OPpEVAL_COPHH | OPpEVAL_RE_REPARSING);
4633a7c4 2825
dedbcade
DM
2826 /* fail now; otherwise we could fail after the JMPENV_PUSH but
2827 * before a PUSHEVAL, which corrupts the stack after a croak */
2828 TAINT_PROPER("eval_sv()");
2829
14dd3ad8 2830 JMPENV_PUSH(ret);
6224f72b
GS
2831 switch (ret) {
2832 case 0:
14dd3ad8 2833 redo_body:
2ba65d5f
DM
2834 if (PL_op == (OP*)(&myop)) {
2835 PL_op = PL_ppaddr[OP_ENTEREVAL](aTHX);
2836 if (!PL_op)
2837 goto fail; /* failed in compilation */
2838 }
4aca2f62 2839 CALLRUNOPS(aTHX);
312caa8e 2840 retval = PL_stack_sp - (PL_stack_base + oldmark);
8433848b 2841 if (!(flags & G_KEEPERR)) {
ab69dbc2 2842 CLEAR_ERRSV();
8433848b 2843 }
4633a7c4 2844 break;
6224f72b 2845 case 1:
f86702cc 2846 STATUS_ALL_FAILURE;
924ba076 2847 /* FALLTHROUGH */
6224f72b 2848 case 2:
4633a7c4 2849 /* my_exit() was called */
03d9f026 2850 SET_CURSTASH(PL_defstash);
4633a7c4 2851 FREETMPS;
14dd3ad8 2852 JMPENV_POP;
f86702cc 2853 my_exit_jump();
a25b5927 2854 assert(0); /* NOTREACHED */
6224f72b 2855 case 3:
3280af22 2856 if (PL_restartop) {
febb3a6d 2857 PL_restartjmpenv = NULL;
533c011a 2858 PL_op = PL_restartop;
3280af22 2859 PL_restartop = 0;
312caa8e 2860 goto redo_body;
4633a7c4 2861 }
4aca2f62 2862 fail:
3280af22 2863 PL_stack_sp = PL_stack_base + oldmark;
51ce5529 2864 if ((flags & G_WANT) == G_ARRAY)
4633a7c4
LW
2865 retval = 0;
2866 else {
2867 retval = 1;
3280af22 2868 *++PL_stack_sp = &PL_sv_undef;
4633a7c4 2869 }
312caa8e 2870 break;
4633a7c4
LW
2871 }
2872
14dd3ad8 2873 JMPENV_POP;
4633a7c4 2874 if (flags & G_DISCARD) {
3280af22 2875 PL_stack_sp = PL_stack_base + oldmark;
4633a7c4
LW
2876 retval = 0;
2877 FREETMPS;
2878 LEAVE;
2879 }
533c011a 2880 PL_op = oldop;
4633a7c4
LW
2881 return retval;
2882}
2883
954c1994
GS
2884/*
2885=for apidoc p||eval_pv
2886
422791e4 2887Tells Perl to C<eval> the given string in scalar context and return an SV* result.
954c1994
GS
2888
2889=cut
2890*/
2891
137443ea 2892SV*
864dbfa3 2893Perl_eval_pv(pTHX_ const char *p, I32 croak_on_error)
137443ea 2894{
137443ea 2895 SV* sv = newSVpv(p, 0);
2896
7918f24d
NC
2897 PERL_ARGS_ASSERT_EVAL_PV;
2898
864dbfa3 2899 eval_sv(sv, G_SCALAR);
137443ea 2900 SvREFCNT_dec(sv);
2901
ed1786ad
DD
2902 {
2903 dSP;
2904 sv = POPs;
2905 PUTBACK;
2906 }
137443ea 2907
eed484f9
DD
2908 /* just check empty string or undef? */
2909 if (croak_on_error) {
2910 SV * const errsv = ERRSV;
2911 if(SvTRUE_NN(errsv))
2912 /* replace with croak_sv? */
2913 Perl_croak_nocontext("%s", SvPV_nolen_const(errsv));
2d8e6c8d 2914 }
137443ea 2915
2916 return sv;
2917}
2918
4633a7c4
LW
2919/* Require a module. */
2920
954c1994 2921/*
ccfc67b7
JH
2922=head1 Embedding Functions
2923
954c1994
GS
2924=for apidoc p||require_pv
2925
7d3fb230
BS
2926Tells Perl to C<require> the file named by the string argument. It is
2927analogous to the Perl code C<eval "require '$file'">. It's even
2307c6d0 2928implemented that way; consider using load_module instead.
954c1994 2929
7d3fb230 2930=cut */
954c1994 2931
4633a7c4 2932void
864dbfa3 2933Perl_require_pv(pTHX_ const char *pv)
4633a7c4 2934{
d3acc0f7 2935 dSP;
97aff369 2936 SV* sv;
7918f24d
NC
2937
2938 PERL_ARGS_ASSERT_REQUIRE_PV;
2939
e788e7d3 2940 PUSHSTACKi(PERLSI_REQUIRE);
be41e5d9
NC
2941 sv = Perl_newSVpvf(aTHX_ "require q%c%s%c", 0, pv, 0);
2942 eval_sv(sv_2mortal(sv), G_DISCARD);
d3acc0f7 2943 POPSTACK;
79072805
LW
2944}
2945
76e3520e 2946STATIC void
b6f82619 2947S_usage(pTHX) /* XXX move this out into a module ? */
4633a7c4 2948{
ab821d7f 2949 /* This message really ought to be max 23 lines.
75c72d73 2950 * Removed -h because the user already knows that option. Others? */
fb73857a 2951
1566c39d
NC
2952 /* Grouped as 6 lines per C string literal, to keep under the ANSI C 89
2953 minimum of 509 character string literals. */
27da23d5 2954 static const char * const usage_msg[] = {
1566c39d
NC
2955" -0[octal] specify record separator (\\0, if no argument)\n"
2956" -a autosplit mode with -n or -p (splits $_ into @F)\n"
2957" -C[number/list] enables the listed Unicode features\n"
2958" -c check syntax only (runs BEGIN and CHECK blocks)\n"
2959" -d[:debugger] run program under debugger\n"
2960" -D[number/list] set debugging flags (argument is a bit mask or alphabets)\n",
2961" -e program one line of program (several -e's allowed, omit programfile)\n"
2962" -E program like -e, but enables all optional features\n"
2963" -f don't do $sitelib/sitecustomize.pl at startup\n"
2964" -F/pattern/ split() pattern for -a switch (//'s are optional)\n"
2965" -i[extension] edit <> files in place (makes backup if extension supplied)\n"
2966" -Idirectory specify @INC/#include directory (several -I's allowed)\n",
2967" -l[octal] enable line ending processing, specifies line terminator\n"
2968" -[mM][-]module execute \"use/no module...\" before executing program\n"
2969" -n assume \"while (<>) { ... }\" loop around program\n"
2970" -p assume loop like -n but print line also, like sed\n"
2971" -s enable rudimentary parsing for switches after programfile\n"
2972" -S look for programfile using PATH environment variable\n",
2973" -t enable tainting warnings\n"
2974" -T enable tainting checks\n"
2975" -u dump core after parsing program\n"
2976" -U allow unsafe operations\n"
2977" -v print version, patchlevel and license\n"
2978" -V[:variable] print configuration summary (or a single Config.pm variable)\n",
60eaec42 2979" -w enable many useful warnings\n"
1566c39d
NC
2980" -W enable all warnings\n"
2981" -x[directory] ignore text before #!perl line (optionally cd to directory)\n"
2982" -X disable all warnings\n"
2983" \n"
2984"Run 'perldoc perl' for more help with Perl.\n\n",
fb73857a 2985NULL
2986};
27da23d5 2987 const char * const *p = usage_msg;
1566c39d 2988 PerlIO *out = PerlIO_stdout();
fb73857a 2989
1566c39d
NC
2990 PerlIO_printf(out,
2991 "\nUsage: %s [switches] [--] [programfile] [arguments]\n",
b6f82619 2992 PL_origargv[0]);
fb73857a 2993 while (*p)
1566c39d 2994 PerlIO_puts(out, *p++);
b6f82619 2995 my_exit(0);
4633a7c4
LW
2996}
2997
b4ab917c
DM
2998/* convert a string of -D options (or digits) into an int.
2999 * sets *s to point to the char after the options */
3000
3001#ifdef DEBUGGING
3002int
e1ec3a88 3003Perl_get_debug_opts(pTHX_ const char **s, bool givehelp)
b4ab917c 3004{
27da23d5 3005 static const char * const usage_msgd[] = {
651b8f1a
NC
3006 " Debugging flag values: (see also -d)\n"
3007 " p Tokenizing and parsing (with v, displays parse stack)\n"
3008 " s Stack snapshots (with v, displays all stacks)\n"
3009 " l Context (loop) stack processing\n"
3010 " t Trace execution\n"
3011 " o Method and overloading resolution\n",
3012 " c String/numeric conversions\n"
3013 " P Print profiling info, source file input state\n"
3014 " m Memory and SV allocation\n"
3015 " f Format processing\n"
3016 " r Regular expression parsing and execution\n"
3017 " x Syntax tree dump\n",
3018 " u Tainting checks\n"
3019 " H Hash dump -- usurps values()\n"
3020 " X Scratchpad allocation\n"
3021 " D Cleaning up\n"
56967202 3022 " S Op slab allocation\n"
651b8f1a
NC
3023 " T Tokenising\n"
3024 " R Include reference counts of dumped variables (eg when using -Ds)\n",
3025 " J Do not s,t,P-debug (Jump over) opcodes within package DB\n"
3026 " v Verbose: use in conjunction with other flags\n"
3027 " C Copy On Write\n"
3028 " A Consistency checks on internal structures\n"
3029 " q quiet - currently only suppresses the 'EXECUTING' message\n"
3030 " M trace smart match resolution\n"
3031 " B dump suBroutine definitions, including special Blocks like BEGIN\n",
69014004 3032 " L trace some locale setting information--for Perl core development\n",
e6e64d9b
JC
3033 NULL
3034 };
b4ab917c 3035 int i = 0;
7918f24d
NC
3036
3037 PERL_ARGS_ASSERT_GET_DEBUG_OPTS;
3038
b4ab917c
DM
3039 if (isALPHA(**s)) {
3040 /* if adding extra options, remember to update DEBUG_MASK */
69014004 3041 static const char debopts[] = "psltocPmfrxuUHXDSTRJvCAqMBL";
b4ab917c 3042
0eb30aeb 3043 for (; isWORDCHAR(**s); (*s)++) {
c4420975 3044 const char * const d = strchr(debopts,**s);
b4ab917c
DM
3045 if (d)
3046 i |= 1 << (d - debopts);
3047 else if (ckWARN_d(WARN_DEBUGGING))
e6e64d9b
JC
3048 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
3049 "invalid option -D%c, use -D'' to see choices\n", **s);
b4ab917c
DM
3050 }
3051 }
e6e64d9b 3052 else if (isDIGIT(**s)) {
96e440d2
JH
3053 const char* e;
3054 i = grok_atou(*s, &e);
3055 if (e)
3056 *s = e;
0eb30aeb 3057 for (; isWORDCHAR(**s); (*s)++) ;
b4ab917c 3058 }
ddcf8bc1 3059 else if (givehelp) {
06e869a4 3060 const char *const *p = usage_msgd;
651b8f1a 3061 while (*p) PerlIO_puts(PerlIO_stdout(), *p++);
e6e64d9b 3062 }
b4ab917c
DM
3063# ifdef EBCDIC
3064 if ((i & DEBUG_p_FLAG) && ckWARN_d(WARN_DEBUGGING))
3065 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
3066 "-Dp not implemented on this platform\n");
3067# endif
3068 return i;
3069}
3070#endif
3071
79072805
LW
3072/* This routine handles any switches that can be given during run */
3073
c7030b81
NC
3074const char *
3075Perl_moreswitches(pTHX_ const char *s)
79072805 3076{
27da23d5 3077 dVAR;
84c133a0 3078 UV rschar;
0544e6df 3079 const char option = *s; /* used to remember option in -m/-M code */
79072805 3080
7918f24d
NC
3081 PERL_ARGS_ASSERT_MORESWITCHES;
3082
79072805
LW
3083 switch (*s) {
3084 case '0':
a863c7d1 3085 {
f2095865 3086 I32 flags = 0;
a3b680e6 3087 STRLEN numlen;
f2095865
JH
3088
3089 SvREFCNT_dec(PL_rs);
3090 if (s[1] == 'x' && s[2]) {
a3b680e6 3091 const char *e = s+=2;
f2095865
JH
3092 U8 *tmps;
3093
a3b680e6
AL
3094 while (*e)
3095 e++;
f2095865
JH
3096 numlen = e - s;
3097 flags = PERL_SCAN_SILENT_ILLDIGIT;
3098 rschar = (U32)grok_hex(s, &numlen, &flags, NULL);
3099 if (s + numlen < e) {
3100 rschar = 0; /* Grandfather -0xFOO as -0 -xFOO. */
3101 numlen = 0;
3102 s--;
3103 }
396482e1 3104 PL_rs = newSVpvs("");
c5661c80 3105 SvGROW(PL_rs, (STRLEN)(UNISKIP(rschar) + 1));
f2095865
JH
3106 tmps = (U8*)SvPVX(PL_rs);
3107 uvchr_to_utf8(tmps, rschar);
3108 SvCUR_set(PL_rs, UNISKIP(rschar));
3109 SvUTF8_on(PL_rs);
3110 }
3111 else {
3112 numlen = 4;
3113 rschar = (U32)grok_oct(s, &numlen, &flags, NULL);
3114 if (rschar & ~((U8)~0))
3115 PL_rs = &PL_sv_undef;
3116 else if (!rschar && numlen >= 2)
396482e1 3117 PL_rs = newSVpvs("");
f2095865
JH
3118 else {
3119 char ch = (char)rschar;
3120 PL_rs = newSVpvn(&ch, 1);
3121 }
3122 }
64ace3f8 3123 sv_setsv(get_sv("/", GV_ADD), PL_rs);
f2095865 3124 return s + numlen;
a863c7d1 3125 }
46487f74 3126 case 'C':
a05d7ebb 3127 s++;
dd374669 3128 PL_unicode = parse_unicode_opts( (const char **)&s );
5a22a2bb
NC
3129 if (PL_unicode & PERL_UNICODE_UTF8CACHEASSERT_FLAG)
3130 PL_utf8cache = -1;
46487f74 3131 return s;
2304df62 3132 case 'F':
5fc691f1 3133 PL_minus_a = TRUE;
3280af22 3134 PL_minus_F = TRUE;
24ffa309 3135 PL_minus_n = TRUE;
ebce5377
RGS
3136 PL_splitstr = ++s;
3137 while (*s && !isSPACE(*s)) ++s;
e49e380e 3138 PL_splitstr = savepvn(PL_splitstr, s - PL_splitstr);
2304df62 3139 return s;
79072805 3140 case 'a':
3280af22 3141 PL_minus_a = TRUE;
24ffa309 3142 PL_minus_n = TRUE;
79072805
LW
3143 s++;
3144 return s;
3145 case 'c':
3280af22 3146 PL_minus_c = TRUE;
79072805
LW
3147 s++;
3148 return s;
3149 case 'd':
f20b2998 3150 forbid_setid('d', FALSE);
4633a7c4 3151 s++;
2cbb2ee1
RGS
3152
3153 /* -dt indicates to the debugger that threads will be used */
0eb30aeb 3154 if (*s == 't' && !isWORDCHAR(s[1])) {
2cbb2ee1
RGS
3155 ++s;
3156 my_setenv("PERL5DB_THREADED", "1");
3157 }
3158
70c94a19
RR
3159 /* The following permits -d:Mod to accepts arguments following an =
3160 in the fashion that -MSome::Mod does. */
3161 if (*s == ':' || *s == '=') {
b19934fb
NC
3162 const char *start;
3163 const char *end;
3164 SV *sv;
3165
3166 if (*++s == '-') {
3167 ++s;
3168 sv = newSVpvs("no Devel::");
3169 } else {
3170 sv = newSVpvs("use Devel::");
3171 }
3172
3173 start = s;
3174 end = s + strlen(s);
f85893a1 3175
b19934fb 3176 /* We now allow -d:Module=Foo,Bar and -d:-Module */
0eb30aeb 3177 while(isWORDCHAR(*s) || *s==':') ++s;
70c94a19 3178 if (*s != '=')
f85893a1 3179 sv_catpvn(sv, start, end - start);
70c94a19
RR
3180 else {
3181 sv_catpvn(sv, start, s-start);
95a2b409
RGS
3182 /* Don't use NUL as q// delimiter here, this string goes in the
3183 * environment. */
3184 Perl_sv_catpvf(aTHX_ sv, " split(/,/,q{%s});", ++s);
70c94a19 3185 }
f85893a1 3186 s = end;
184f32ec 3187 my_setenv("PERL5DB", SvPV_nolen_const(sv));
c4db126b 3188 SvREFCNT_dec(sv);
4633a7c4 3189 }
ed094faf 3190 if (!PL_perldb) {
3280af22 3191 PL_perldb = PERLDB_ALL;
a0d0e21e 3192 init_debugger();
ed094faf 3193 }
79072805
LW
3194 return s;
3195 case 'D':
0453d815 3196 {
79072805 3197#ifdef DEBUGGING
f20b2998 3198 forbid_setid('D', FALSE);
b4ab917c 3199 s++;
dd374669 3200 PL_debug = get_debug_opts( (const char **)&s, 1) | DEBUG_TOP_FLAG;
12a43e32 3201#else /* !DEBUGGING */
0453d815 3202 if (ckWARN_d(WARN_DEBUGGING))
9014280d 3203 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
e6e64d9b 3204 "Recompile perl with -DDEBUGGING to use -D switch (did you mean -d ?)\n");
0eb30aeb 3205 for (s++; isWORDCHAR(*s); s++) ;
79072805 3206#endif
79072805 3207 return s;
0453d815 3208 }
4633a7c4 3209 case 'h':
b6f82619 3210 usage();
79072805 3211 case 'i':
43c5f42d 3212 Safefree(PL_inplace);
c030f24b
GH
3213#if defined(__CYGWIN__) /* do backup extension automagically */
3214 if (*(s+1) == '\0') {
c86a4f2e 3215 PL_inplace = savepvs(".bak");
c030f24b
GH
3216 return s+1;
3217 }
3218#endif /* __CYGWIN__ */
5ef5d758 3219 {
d4c19fe8 3220 const char * const start = ++s;
5ef5d758
NC
3221 while (*s && !isSPACE(*s))
3222 ++s;
3223
3224 PL_inplace = savepvn(start, s - start);
3225 }
7b8d334a 3226 if (*s) {
5ef5d758 3227 ++s;
7b8d334a 3228 if (*s == '-') /* Additional switches on #! line. */
5ef5d758 3229 s++;
7b8d334a 3230 }
fb73857a 3231 return s;
4e49a025 3232 case 'I': /* -I handled both here and in parse_body() */
f20b2998 3233 forbid_setid('I', FALSE);
fb73857a 3234 ++s;
3235 while (*s && isSPACE(*s))
3236 ++s;
3237 if (*s) {
c7030b81 3238 const char *e, *p;
0df16ed7
GS
3239 p = s;
3240 /* ignore trailing spaces (possibly followed by other switches) */
3241 do {
3242 for (e = p; *e && !isSPACE(*e); e++) ;
3243 p = e;
3244 while (isSPACE(*p))
3245 p++;
3246 } while (*p && *p != '-');
55b4bc1c 3247 incpush(s, e-s,
e28f3139 3248 INCPUSH_ADD_SUB_DIRS|INCPUSH_ADD_OLD_VERS|INCPUSH_UNSHIFT);
0df16ed7
GS
3249 s = p;
3250 if (*s == '-')
3251 s++;
79072805
LW
3252 }
3253 else
a67e862a 3254 Perl_croak(aTHX_ "No directory specified for -I");
fb73857a 3255 return s;
79072805 3256 case 'l':
3280af22 3257 PL_minus_l = TRUE;
79072805 3258 s++;
7889fe52
NIS
3259 if (PL_ors_sv) {
3260 SvREFCNT_dec(PL_ors_sv);
a0714e2c 3261 PL_ors_sv = NULL;
7889fe52 3262 }
79072805 3263 if (isDIGIT(*s)) {
53305cf1 3264 I32 flags = 0;
a3b680e6 3265 STRLEN numlen;
396482e1 3266 PL_ors_sv = newSVpvs("\n");
53305cf1
NC
3267 numlen = 3 + (*s == '0');
3268 *SvPVX(PL_ors_sv) = (char)grok_oct(s, &numlen, &flags, NULL);
79072805
LW
3269 s += numlen;
3270 }
3271 else {
8bfdd7d9 3272 if (RsPARA(PL_rs)) {
396482e1 3273 PL_ors_sv = newSVpvs("\n\n");
7889fe52
NIS
3274 }
3275 else {
8bfdd7d9 3276 PL_ors_sv = newSVsv(PL_rs);
c07a80fd 3277 }
79072805
LW
3278 }
3279 return s;
1a30305b 3280 case 'M':
f20b2998 3281 forbid_setid('M', FALSE); /* XXX ? */
924ba076 3282 /* FALLTHROUGH */
1a30305b 3283 case 'm':
f20b2998 3284 forbid_setid('m', FALSE); /* XXX ? */
1a30305b 3285 if (*++s) {
c7030b81 3286 const char *start;
b64cb68c 3287 const char *end;
11343788 3288 SV *sv;
e1ec3a88 3289 const char *use = "use ";
0544e6df 3290 bool colon = FALSE;
a5f75d66 3291 /* -M-foo == 'no foo' */
d0043bd1
NC
3292 /* Leading space on " no " is deliberate, to make both
3293 possibilities the same length. */
3294 if (*s == '-') { use = " no "; ++s; }
3295 sv = newSVpvn(use,4);
a5f75d66 3296 start = s;
1a30305b 3297 /* We allow -M'Module qw(Foo Bar)' */
0eb30aeb 3298 while(isWORDCHAR(*s) || *s==':') {
0544e6df
RB
3299 if( *s++ == ':' ) {
3300 if( *s == ':' )
3301 s++;
3302 else
3303 colon = TRUE;
3304 }
3305 }
3306 if (s == start)
3307 Perl_croak(aTHX_ "Module name required with -%c option",
3308 option);
3309 if (colon)
3310 Perl_croak(aTHX_ "Invalid module name %.*s with -%c option: "
3311 "contains single ':'",
63da6837 3312 (int)(s - start), start, option);
b64cb68c 3313 end = s + strlen(s);
c07a80fd 3314 if (*s != '=') {
b64cb68c 3315 sv_catpvn(sv, start, end - start);
0544e6df 3316 if (option == 'm') {
c07a80fd 3317 if (*s != '\0')
cea2e8a9 3318 Perl_croak(aTHX_ "Can't use '%c' after -mname", *s);
396482e1 3319 sv_catpvs( sv, " ()");
c07a80fd 3320 }
3321 } else {
11343788 3322 sv_catpvn(sv, start, s-start);
b64cb68c
NC
3323 /* Use NUL as q''-delimiter. */
3324 sv_catpvs(sv, " split(/,/,q\0");
3325 ++s;
3326 sv_catpvn(sv, s, end - s);
396482e1 3327 sv_catpvs(sv, "\0)");
c07a80fd 3328 }
b64cb68c 3329 s = end;
29a861e7 3330 Perl_av_create_and_push(aTHX_ &PL_preambleav, sv);
1a30305b 3331 }
3332 else
0544e6df 3333 Perl_croak(aTHX_ "Missing argument to -%c", option);
1a30305b 3334 return s;
79072805 3335 case 'n':
3280af22 3336 PL_minus_n = TRUE;
79072805
LW
3337 s++;
3338 return s;
3339 case 'p':
3280af22 3340 PL_minus_p = TRUE;
79072805
LW
3341 s++;
3342 return s;
3343 case 's':
f20b2998 3344 forbid_setid('s', FALSE);
3280af22 3345 PL_doswitches = TRUE;
79072805
LW
3346 s++;
3347 return s;
6537fe72 3348 case 't':
27a6968b 3349 case 'T':
dc6d7f5c 3350#if defined(SILENT_NO_TAINT_SUPPORT)
284167a5 3351 /* silently ignore */
dc6d7f5c 3352#elif defined(NO_TAINT_SUPPORT)
3231f579 3353 Perl_croak_nocontext("This perl was compiled without taint support. "
284167a5
S
3354 "Cowardly refusing to run with -t or -T flags");
3355#else
3356 if (!TAINTING_get)
27a6968b 3357 TOO_LATE_FOR(*s);
284167a5 3358#endif
6537fe72 3359 s++;
463ee0b2 3360 return s;
79072805 3361 case 'u':
3280af22 3362 PL_do_undump = TRUE;
79072805
LW
3363 s++;
3364 return s;
3365 case 'U':
3280af22 3366 PL_unsafe = TRUE;
79072805
LW
3367 s++;
3368 return s;
3369 case 'v':
c4bc78d9
NC
3370 minus_v();
3371 case 'w':
3372 if (! (PL_dowarn & G_WARN_ALL_MASK)) {
3373 PL_dowarn |= G_WARN_ON;
3374 }
3375 s++;
3376 return s;
3377 case 'W':
3378 PL_dowarn = G_WARN_ALL_ON|G_WARN_ON;
3379 if (!specialWARN(PL_compiling.cop_warnings))
3380 PerlMemShared_free(PL_compiling.cop_warnings);
3381 PL_compiling.cop_warnings = pWARN_ALL ;
3382 s++;
3383 return s;
3384 case 'X':
3385 PL_dowarn = G_WARN_ALL_OFF;
3386 if (!specialWARN(PL_compiling.cop_warnings))
3387 PerlMemShared_free(PL_compiling.cop_warnings);
3388 PL_compiling.cop_warnings = pWARN_NONE ;
3389 s++;
3390 return s;
3391 case '*':
3392 case ' ':
3393 while( *s == ' ' )
3394 ++s;
3395 if (s[0] == '-') /* Additional switches on #! line. */
3396 return s+1;
3397 break;
3398 case '-':
3399 case 0:
3400#if defined(WIN32) || !defined(PERL_STRICT_CR)
3401 case '\r':
3402#endif
3403 case '\n':
3404 case '\t':
3405 break;
3406#ifdef ALTERNATE_SHEBANG
3407 case 'S': /* OS/2 needs -S on "extproc" line. */
3408 break;
3409#endif
4bb78d63
CB
3410 case 'e': case 'f': case 'x': case 'E':
3411#ifndef ALTERNATE_SHEBANG
3412 case 'S':
3413#endif
3414 case 'V':
c4bc78d9 3415 Perl_croak(aTHX_ "Can't emulate -%.1s on #! line",s);
b7e077d0
FC
3416 default:
3417 Perl_croak(aTHX_
3418 "Unrecognized switch: -%.1s (-h will show valid options)",s
3419 );
c4bc78d9
NC
3420 }
3421 return NULL;
3422}
3423
3424
3425STATIC void
3426S_minus_v(pTHX)
3427{
fc3381af 3428 PerlIO * PIO_stdout;
46807d8e 3429 {
709aee94
DD
3430 const char * const level_str = "v" PERL_VERSION_STRING;
3431 const STRLEN level_len = sizeof("v" PERL_VERSION_STRING)-1;
46807d8e 3432#ifdef PERL_PATCHNUM
709aee94 3433 SV* level;
23d483e2 3434# ifdef PERL_GIT_UNCOMMITTED_CHANGES
709aee94 3435 static const char num [] = PERL_PATCHNUM "*";
23d483e2 3436# else
709aee94 3437 static const char num [] = PERL_PATCHNUM;
23d483e2 3438# endif
fc3381af 3439 {
709aee94
DD
3440 const STRLEN num_len = sizeof(num)-1;
3441 /* A very advanced compiler would fold away the strnEQ
3442 and this whole conditional, but most (all?) won't do it.
3443 SV level could also be replaced by with preprocessor
3444 catenation.
3445 */
3446 if (num_len >= level_len && strnEQ(num,level_str,level_len)) {
3447 /* per 46807d8e80, PERL_PATCHNUM is outside of the control
3448 of the interp so it might contain format characters
3449 */
3450 level = newSVpvn(num, num_len);
fc3381af 3451 } else {
709aee94 3452 level = Perl_newSVpvf_nocontext("%s (%s)", level_str, num);
fc3381af 3453 }
46807d8e 3454 }
709aee94
DD
3455#else
3456 SV* level = newSVpvn(level_str, level_len);
3457#endif /* #ifdef PERL_PATCHNUM */
fc3381af
DD
3458 PIO_stdout = PerlIO_stdout();
3459 PerlIO_printf(PIO_stdout,
ded326e4
DG
3460 "\nThis is perl " STRINGIFY(PERL_REVISION)
3461 ", version " STRINGIFY(PERL_VERSION)
3462 ", subversion " STRINGIFY(PERL_SUBVERSION)
c1f6cd39 3463 " (%"SVf") built for " ARCHNAME, SVfARG(level)
ded326e4 3464 );
709aee94 3465 SvREFCNT_dec_NN(level);
46807d8e 3466 }
fb73857a 3467#if defined(LOCAL_PATCH_COUNT)
3468 if (LOCAL_PATCH_COUNT > 0)
fc3381af 3469 PerlIO_printf(PIO_stdout,
b0e47665
GS
3470 "\n(with %d registered patch%s, "
3471 "see perl -V for more detail)",
bb7a0f54 3472 LOCAL_PATCH_COUNT,
b0e47665 3473 (LOCAL_PATCH_COUNT!=1) ? "es" : "");
a5f75d66 3474#endif
1a30305b 3475
fc3381af 3476 PerlIO_printf(PIO_stdout,
fb435042 3477 "\n\nCopyright 1987-2014, Larry Wall\n");
79072805 3478#ifdef MSDOS
fc3381af 3479 PerlIO_printf(PIO_stdout,
b0e47665 3480 "\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
55497cff 3481#endif
3482#ifdef DJGPP
fc3381af 3483 PerlIO_printf(PIO_stdout,
b0e47665
GS
3484 "djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n"
3485 "djgpp v2 port (perl5004+) by Laszlo Molnar, 1997-1999\n");
4633a7c4 3486#endif
79072805 3487#ifdef OS2
fc3381af 3488 PerlIO_printf(PIO_stdout,
b0e47665 3489 "\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
be3c0a43 3490 "Version 5 port Copyright (c) 1994-2002, Andreas Kaiser, Ilya Zakharevich\n");
79072805 3491#endif
9d116dd7 3492#ifdef OEMVS
fc3381af 3493 PerlIO_printf(PIO_stdout,
b0e47665 3494 "MVS (OS390) port by Mortice Kern Systems, 1997-1999\n");
9d116dd7 3495#endif
495c5fdc 3496#ifdef __VOS__
fc3381af 3497 PerlIO_printf(PIO_stdout,
c0fcb8c5 3498 "Stratus OpenVOS port by Paul.Green@stratus.com, 1997-2013\n");
495c5fdc 3499#endif
a1a0e61e 3500#ifdef POSIX_BC
fc3381af 3501 PerlIO_printf(PIO_stdout,
b0e47665 3502 "BS2000 (POSIX) port by Start Amadeus GmbH, 1998-1999\n");
a1a0e61e 3503#endif
e1caacb4 3504#ifdef UNDER_CE
fc3381af
DD
3505 PerlIO_printf(PIO_stdout,
3506 "WINCE port by Rainer Keuchel, 2001-2002\n"
3507 "Built on " __DATE__ " " __TIME__ "\n\n");
e1caacb4
JH
3508 wce_hitreturn();
3509#endif
a0fd4948 3510#ifdef __SYMBIAN32__
fc3381af 3511 PerlIO_printf(PIO_stdout,
27da23d5
JH
3512 "Symbian port by Nokia, 2004-2005\n");
3513#endif
baed7233
DL
3514#ifdef BINARY_BUILD_NOTICE
3515 BINARY_BUILD_NOTICE;
3516#endif
fc3381af 3517 PerlIO_printf(PIO_stdout,
b0e47665 3518 "\n\
79072805 3519Perl may be copied only under the terms of either the Artistic License or the\n\
3d6f292d 3520GNU General Public License, which may be found in the Perl 5 source kit.\n\n\
95103687 3521Complete documentation for Perl, including FAQ lists, should be found on\n\
a0288114 3522this system using \"man perl\" or \"perldoc perl\". If you have access to the\n\
c9e30dd8 3523Internet, point your browser at http://www.perl.org/, the Perl Home Page.\n\n");
7ca617d0 3524 my_exit(0);
79072805
LW
3525}
3526
3527/* compliments of Tom Christiansen */
3528
3529/* unexec() can be found in the Gnu emacs distribution */
ee580363 3530/* Known to work with -DUNEXEC and using unexelf.c from GNU emacs-20.2 */
79072805 3531
25bbd826
CB
3532#ifdef VMS
3533#include <lib$routines.h>
3534#endif
3535
79072805 3536void
864dbfa3 3537Perl_my_unexec(pTHX)
79072805
LW
3538{
3539#ifdef UNEXEC
b37c2d43
AL
3540 SV * prog = newSVpv(BIN_EXP, 0);
3541 SV * file = newSVpv(PL_origfilename, 0);
ee580363 3542 int status = 1;
79072805
LW
3543 extern int etext;
3544
396482e1 3545 sv_catpvs(prog, "/perl");
396482e1 3546 sv_catpvs(file, ".perldump");
79072805 3547
ee580363
GS
3548 unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
3549 /* unexec prints msg to stderr in case of failure */
6ad3d225 3550 PerlProc_exit(status);
79072805 3551#else
ddeaf645 3552 PERL_UNUSED_CONTEXT;
a5f75d66 3553# ifdef VMS
a5f75d66 3554 lib$signal(SS$_DEBUG); /* ssdef.h #included from vmsish.h */
84d78eb7 3555# elif defined(WIN32) || defined(__CYGWIN__)
ddeaf645 3556 Perl_croak_nocontext("dump is not supported");
aa689395 3557# else
79072805 3558 ABORT(); /* for use with undump */
aa689395 3559# endif
a5f75d66 3560#endif
79072805
LW
3561}
3562
cb68f92d
GS
3563/* initialize curinterp */
3564STATIC void
cea2e8a9 3565S_init_interp(pTHX)
cb68f92d 3566{
acfe0abc 3567#ifdef MULTIPLICITY
115ff745
NC
3568# define PERLVAR(prefix,var,type)
3569# define PERLVARA(prefix,var,n,type)
acfe0abc 3570# if defined(PERL_IMPLICIT_CONTEXT)
115ff745
NC
3571# define PERLVARI(prefix,var,type,init) aTHX->prefix##var = init;
3572# define PERLVARIC(prefix,var,type,init) aTHX->prefix##var = init;
3967c732 3573# else
115ff745
NC
3574# define PERLVARI(prefix,var,type,init) PERL_GET_INTERP->var = init;
3575# define PERLVARIC(prefix,var,type,init) PERL_GET_INTERP->var = init;
066ef5b5 3576# endif
acfe0abc 3577# include "intrpvar.h"
acfe0abc
GS
3578# undef PERLVAR
3579# undef PERLVARA
3580# undef PERLVARI
3581# undef PERLVARIC
3582#else
115ff745
NC
3583# define PERLVAR(prefix,var,type)
3584# define PERLVARA(prefix,var,n,type)
3585# define PERLVARI(prefix,var,type,init) PL_##var = init;
3586# define PERLVARIC(prefix,var,type,init) PL_##var = init;
acfe0abc 3587# include "intrpvar.h"
acfe0abc
GS
3588# undef PERLVAR
3589# undef PERLVARA
3590# undef PERLVARI
3591# undef PERLVARIC
cb68f92d
GS
3592#endif
3593
cb68f92d
GS
3594}
3595
76e3520e 3596STATIC void
cea2e8a9 3597S_init_main_stash(pTHX)
79072805 3598{
463ee0b2 3599 GV *gv;
6e72f9df 3600
03d9f026 3601 PL_curstash = PL_defstash = (HV *)SvREFCNT_inc_simple_NN(newHV());
23579a14
NC
3602 /* We know that the string "main" will be in the global shared string
3603 table, so it's a small saving to use it rather than allocate another
3604 8 bytes. */
18916d0d 3605 PL_curstname = newSVpvs_share("main");
fafc274c 3606 gv = gv_fetchpvs("main::", GV_ADD|GV_NOTQUAL, SVt_PVHV);
23579a14
NC
3607 /* If we hadn't caused another reference to "main" to be in the shared
3608 string table above, then it would be worth reordering these two,
3609 because otherwise all we do is delete "main" from it as a consequence
3610 of the SvREFCNT_dec, only to add it again with hv_name_set */
adbc6bb1 3611 SvREFCNT_dec(GvHV(gv));
23579a14 3612 hv_name_set(PL_defstash, "main", 4, 0);
85fbaab2 3613 GvHV(gv) = MUTABLE_HV(SvREFCNT_inc_simple(PL_defstash));
463ee0b2 3614 SvREADONLY_on(gv);
fafc274c
NC
3615 PL_incgv = gv_HVadd(gv_AVadd(gv_fetchpvs("INC", GV_ADD|GV_NOTQUAL,
3616 SVt_PVAV)));
5a5094bd 3617 SvREFCNT_inc_simple_void(PL_incgv); /* Don't allow it to be freed */
3280af22 3618 GvMULTI_on(PL_incgv);
fafc274c 3619 PL_hintgv = gv_fetchpvs("\010", GV_ADD|GV_NOTQUAL, SVt_PV); /* ^H */
4639d557 3620 SvREFCNT_inc_simple_void(PL_hintgv);
3280af22 3621 GvMULTI_on(PL_hintgv);
fafc274c 3622 PL_defgv = gv_fetchpvs("_", GV_ADD|GV_NOTQUAL, SVt_PVAV);
5a5094bd 3623 SvREFCNT_inc_simple_void(PL_defgv);
d456e3f4 3624 PL_errgv = gv_fetchpvs("@", GV_ADD|GV_NOTQUAL, SVt_PV);
5a5094bd 3625 SvREFCNT_inc_simple_void(PL_errgv);
3280af22 3626 GvMULTI_on(PL_errgv);
fafc274c 3627 PL_replgv = gv_fetchpvs("\022", GV_ADD|GV_NOTQUAL, SVt_PV); /* ^R */
475b1e90 3628 SvREFCNT_inc_simple_void(PL_replgv);
3280af22 3629 GvMULTI_on(PL_replgv);
cea2e8a9 3630 (void)Perl_form(aTHX_ "%240s",""); /* Preallocate temp - for immediate signals. */
c69033f2
NC
3631#ifdef PERL_DONT_CREATE_GVSV
3632 gv_SVadd(PL_errgv);
3633#endif
38a03e6e 3634 sv_grow(ERRSV, 240); /* Preallocate - for immediate signals. */
ab69dbc2 3635 CLEAR_ERRSV();
03d9f026 3636 SET_CURSTASH(PL_defstash);
11faa288 3637 CopSTASH_set(&PL_compiling, PL_defstash);
5c1737d1
NC
3638 PL_debstash = GvHV(gv_fetchpvs("DB::", GV_ADDMULTI, SVt_PVHV));
3639 PL_globalstash = GvHV(gv_fetchpvs("CORE::GLOBAL::", GV_ADDMULTI,
3640 SVt_PVHV));
4633a7c4 3641 /* We must init $/ before switches are processed. */
64ace3f8 3642 sv_setpvs(get_sv("/", GV_ADD), "\n");
79072805
LW
3643}
3644
8d113837
NC
3645STATIC PerlIO *
3646S_open_script(pTHX_ const char *scriptname, bool dosearch, bool *suidscript)
79072805 3647{
fdf5d70d 3648 int fdscript = -1;
8d113837 3649 PerlIO *rsfp = NULL;
1dfef69b 3650 Stat_t tmpstatbuf;
375ed12a 3651 int fd;
1b24ed4b 3652
7918f24d
NC
3653 PERL_ARGS_ASSERT_OPEN_SCRIPT;
3654
3280af22 3655 if (PL_e_script) {
8afc33d6 3656 PL_origfilename = savepvs("-e");
96436eeb 3657 }
6c4ab083
GS
3658 else {
3659 /* if find_script() returns, it returns a malloc()-ed value */
dd374669 3660 scriptname = PL_origfilename = find_script(scriptname, dosearch, NULL, 1);
6c4ab083
GS
3661
3662 if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
e1ec3a88 3663 const char *s = scriptname + 8;
96e440d2
JH
3664 const char* e;
3665 fdscript = grok_atou(s, &e);
3666 s = e;
6c4ab083 3667 if (*s) {
ae3f3efd
PS
3668 /* PSz 18 Feb 04
3669 * Tell apart "normal" usage of fdscript, e.g.
3670 * with bash on FreeBSD:
3671 * perl <( echo '#!perl -DA'; echo 'print "$0\n"')
3672 * from usage in suidperl.
3673 * Does any "normal" usage leave garbage after the number???
3674 * Is it a mistake to use a similar /dev/fd/ construct for
3675 * suidperl?
3676 */
f20b2998 3677 *suidscript = TRUE;
ae3f3efd
PS
3678 /* PSz 20 Feb 04
3679 * Be supersafe and do some sanity-checks.
3680 * Still, can we be sure we got the right thing?
3681 */
3682 if (*s != '/') {
3683 Perl_croak(aTHX_ "Wrong syntax (suid) fd script name \"%s\"\n", s);
3684 }
3685 if (! *(s+1)) {
3686 Perl_croak(aTHX_ "Missing (suid) fd script name\n");
3687 }
6c4ab083 3688 scriptname = savepv(s + 1);
3280af22 3689 Safefree(PL_origfilename);
dd374669 3690 PL_origfilename = (char *)scriptname;
6c4ab083
GS
3691 }
3692 }
3693 }
3694
05ec9bb3 3695 CopFILE_free(PL_curcop);
57843af0 3696 CopFILE_set(PL_curcop, PL_origfilename);
770526c1 3697 if (*PL_origfilename == '-' && PL_origfilename[1] == '\0')
dd374669 3698 scriptname = (char *)"";
fdf5d70d 3699 if (fdscript >= 0) {
8d113837 3700 rsfp = PerlIO_fdopen(fdscript,PERL_SCRIPT_MODE);
96436eeb 3701 }
79072805 3702 else if (!*scriptname) {
cdd8118e 3703 forbid_setid(0, *suidscript);
c0b3891a 3704 return NULL;
79072805 3705 }
96436eeb 3706 else {
9c12f1e5
RGS
3707#ifdef FAKE_BIT_BUCKET
3708 /* This hack allows one not to have /dev/null (or BIT_BUCKET as it
3709 * is called) and still have the "-e" work. (Believe it or not,
3710 * a /dev/null is required for the "-e" to work because source
3711 * filter magic is used to implement it. ) This is *not* a general
3712 * replacement for a /dev/null. What we do here is create a temp
3713 * file (an empty file), open up that as the script, and then
3714 * immediately close and unlink it. Close enough for jazz. */
3715#define FAKE_BIT_BUCKET_PREFIX "/tmp/perlnull-"
3716#define FAKE_BIT_BUCKET_SUFFIX "XXXXXXXX"
3717#define FAKE_BIT_BUCKET_TEMPLATE FAKE_BIT_BUCKET_PREFIX FAKE_BIT_BUCKET_SUFFIX
3718 char tmpname[sizeof(FAKE_BIT_BUCKET_TEMPLATE)] = {
3719 FAKE_BIT_BUCKET_TEMPLATE
3720 };
3721 const char * const err = "Failed to create a fake bit bucket";
3722 if (strEQ(scriptname, BIT_BUCKET)) {
3723#ifdef HAS_MKSTEMP /* Hopefully mkstemp() is safe here. */
60f7fc1e 3724 int old_umask = umask(0600);
9c12f1e5 3725 int tmpfd = mkstemp(tmpname);
60f7fc1e 3726 umask(old_umask);
9c12f1e5
RGS
3727 if (tmpfd > -1) {
3728 scriptname = tmpname;
3729 close(tmpfd);
3730 } else
3731 Perl_croak(aTHX_ err);
3732#else
3733# ifdef HAS_MKTEMP
3734 scriptname = mktemp(tmpname);
3735 if (!scriptname)
3736 Perl_croak(aTHX_ err);
3737# endif
3738#endif
3739 }
3740#endif
8d113837 3741 rsfp = PerlIO_open(scriptname,PERL_SCRIPT_MODE);
9c12f1e5
RGS
3742#ifdef FAKE_BIT_BUCKET
3743 if (memEQ(scriptname, FAKE_BIT_BUCKET_PREFIX,
3744 sizeof(FAKE_BIT_BUCKET_PREFIX) - 1)
3745 && strlen(scriptname) == sizeof(tmpname) - 1) {
3746 unlink(scriptname);
3747 }
3748 scriptname = BIT_BUCKET;
3749#endif
96436eeb 3750 }
8d113837 3751 if (!rsfp) {
447218f8 3752 /* PSz 16 Sep 03 Keep neat error message */
b1681ed3
RGS
3753 if (PL_e_script)
3754 Perl_croak(aTHX_ "Can't open "BIT_BUCKET": %s\n", Strerror(errno));
3755 else
3756 Perl_croak(aTHX_ "Can't open perl script \"%s\": %s\n",
3757 CopFILE(PL_curcop), Strerror(errno));
13281fa4 3758 }
375ed12a 3759 fd = PerlIO_fileno(rsfp);
a7c81930 3760#if defined(HAS_FCNTL) && defined(F_SETFD)
375ed12a
JH
3761 if (fd >= 0) {
3762 /* ensure close-on-exec */
3763 if (fcntl(fd, F_SETFD, 1) < 0) {
3764 Perl_croak(aTHX_ "Can't open perl script \"%s\": %s\n",
3765 CopFILE(PL_curcop), Strerror(errno));
3766 }
3767 }
a7c81930 3768#endif
1dfef69b 3769
375ed12a
JH
3770 if (fd < 0 ||
3771 (PerlLIO_fstat(fd, &tmpstatbuf) >= 0
3772 && S_ISDIR(tmpstatbuf.st_mode)))
1dfef69b
RS
3773 Perl_croak(aTHX_ "Can't open perl script \"%s\": %s\n",
3774 CopFILE(PL_curcop),
0c0d42ff 3775 Strerror(EISDIR));
1dfef69b 3776
8d113837 3777 return rsfp;
79072805 3778}
8d063cd8 3779
7b89560d
JH
3780/* Mention
3781 * I_SYSSTATVFS HAS_FSTATVFS
3782 * I_SYSMOUNT
c890dc6c 3783 * I_STATFS HAS_FSTATFS HAS_GETFSSTAT
7b89560d
JH
3784 * I_MNTENT HAS_GETMNTENT HAS_HASMNTOPT
3785 * here so that metaconfig picks them up. */
3786
104d25b7 3787
cc69b689 3788#ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
ec2019ad 3789/* Don't even need this function. */
cc69b689 3790#else
ec2019ad
NC
3791STATIC void
3792S_validate_suid(pTHX_ PerlIO *rsfp)
3793{
dfff4baf
BF
3794 const Uid_t my_uid = PerlProc_getuid();
3795 const Uid_t my_euid = PerlProc_geteuid();
3796 const Gid_t my_gid = PerlProc_getgid();
3797 const Gid_t my_egid = PerlProc_getegid();
985213f2 3798
ac076a5c
NC
3799 PERL_ARGS_ASSERT_VALIDATE_SUID;
3800
985213f2 3801 if (my_euid != my_uid || my_egid != my_gid) { /* (suidperl doesn't exist, in fact) */
a2e578da 3802 dVAR;
375ed12a
JH
3803 int fd = PerlIO_fileno(rsfp);
3804 if (fd < 0) {
3805 Perl_croak(aTHX_ "Illegal suidscript");
3806 } else {
3807 if (PerlLIO_fstat(fd, &PL_statbuf) < 0) { /* may be either wrapped or real suid */
3808 Perl_croak(aTHX_ "Illegal suidscript");
3809 }
3810 }
3811 if ((my_euid != my_uid && my_euid == PL_statbuf.st_uid && PL_statbuf.st_mode & S_ISUID)
3812 ||
3813 (my_egid != my_gid && my_egid == PL_statbuf.st_gid && PL_statbuf.st_mode & S_ISGID)
3814 )
b28d0864 3815 if (!PL_do_undump)
cea2e8a9 3816 Perl_croak(aTHX_ "YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
a687059c 3817FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
a687059c 3818 /* not set-id, must be wrapped */
a687059c 3819 }
79072805 3820}
cc69b689 3821#endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
13281fa4 3822
76e3520e 3823STATIC void
2f9285f8 3824S_find_beginning(pTHX_ SV* linestr_sv, PerlIO *rsfp)
79072805 3825{
c7030b81 3826 const char *s;
eb578fdb 3827 const char *s2;
33b78306 3828
7918f24d
NC
3829 PERL_ARGS_ASSERT_FIND_BEGINNING;
3830
33b78306
LW
3831 /* skip forward in input to the real script? */
3832
737c24fc 3833 do {
2f9285f8 3834 if ((s = sv_gets(linestr_sv, rsfp, 0)) == NULL)
cea2e8a9 3835 Perl_croak(aTHX_ "No Perl script found in input\n");
4f0c37ba 3836 s2 = s;
737c24fc
Z
3837 } while (!(*s == '#' && s[1] == '!' && ((s = instr(s,"perl")) || (s = instr(s2,"PERL")))));
3838 PerlIO_ungetc(rsfp, '\n'); /* to keep line count right */
3839 while (*s && !(isSPACE (*s) || *s == '#')) s++;
3840 s2 = s;
3841 while (*s == ' ' || *s == '\t') s++;
3842 if (*s++ == '-') {
3843 while (isDIGIT(s2[-1]) || s2[-1] == '-' || s2[-1] == '.'
3844 || s2[-1] == '_') s2--;
3845 if (strnEQ(s2-4,"perl",4))
3846 while ((s = moreswitches(s)))
3847 ;
83025b21
LW
3848 }
3849}
3850
afe37c7d 3851
76e3520e 3852STATIC void
cea2e8a9 3853S_init_ids(pTHX)
352d5a3a 3854{
284167a5
S
3855 /* no need to do anything here any more if we don't
3856 * do tainting. */
dc6d7f5c 3857#ifndef NO_TAINT_SUPPORT
dfff4baf
BF
3858 const Uid_t my_uid = PerlProc_getuid();
3859 const Uid_t my_euid = PerlProc_geteuid();
3860 const Gid_t my_gid = PerlProc_getgid();
3861 const Gid_t my_egid = PerlProc_getegid();
985213f2 3862
20b7effb
JH
3863 PERL_UNUSED_CONTEXT;
3864
22f7c9c9 3865 /* Should not happen: */
985213f2 3866 CHECK_MALLOC_TAINT(my_uid && (my_euid != my_uid || my_egid != my_gid));
284167a5
S
3867 TAINTING_set( TAINTING_get | (my_uid && (my_euid != my_uid || my_egid != my_gid)) );
3868#endif
ae3f3efd
PS
3869 /* BUG */
3870 /* PSz 27 Feb 04
3871 * Should go by suidscript, not uid!=euid: why disallow
3872 * system("ls") in scripts run from setuid things?
3873 * Or, is this run before we check arguments and set suidscript?
3874 * What about SETUID_SCRIPTS_ARE_SECURE_NOW: could we use fdscript then?
3875 * (We never have suidscript, can we be sure to have fdscript?)
3876 * Or must then go by UID checks? See comments in forbid_setid also.
3877 */
748a9306 3878}
79072805 3879
a0643315
JH
3880/* This is used very early in the lifetime of the program,
3881 * before even the options are parsed, so PL_tainting has
b0891165 3882 * not been initialized properly. */
af419de7 3883bool
8f42b153 3884Perl_doing_taint(int argc, char *argv[], char *envp[])
22f7c9c9 3885{
c3446a78
JH
3886#ifndef PERL_IMPLICIT_SYS
3887 /* If we have PERL_IMPLICIT_SYS we can't call getuid() et alia
3888 * before we have an interpreter-- and the whole point of this
3889 * function is to be called at such an early stage. If you are on
3890 * a system with PERL_IMPLICIT_SYS but you do have a concept of
3891 * "tainted because running with altered effective ids', you'll
3892 * have to add your own checks somewhere in here. The two most
3893 * known samples of 'implicitness' are Win32 and NetWare, neither
3894 * of which has much of concept of 'uids'. */
dfff4baf
BF
3895 Uid_t uid = PerlProc_getuid();
3896 Uid_t euid = PerlProc_geteuid();
3897 Gid_t gid = PerlProc_getgid();
3898 Gid_t egid = PerlProc_getegid();
6867be6d 3899 (void)envp;
22f7c9c9
JH
3900
3901#ifdef VMS
af419de7 3902 uid |= gid << 16;
22f7c9c9
JH
3903 euid |= egid << 16;
3904#endif
3905 if (uid && (euid != uid || egid != gid))
3906 return 1;
c3446a78 3907#endif /* !PERL_IMPLICIT_SYS */
af419de7
JH
3908 /* This is a really primitive check; environment gets ignored only
3909 * if -T are the first chars together; otherwise one gets
3910 * "Too late" message. */
22f7c9c9 3911 if ( argc > 1 && argv[1][0] == '-'
305b8651 3912 && isALPHA_FOLD_EQ(argv[1][1], 't'))
22f7c9c9
JH
3913 return 1;
3914 return 0;
3915}
22f7c9c9 3916
d0bafe7e
NC
3917/* Passing the flag as a single char rather than a string is a slight space
3918 optimisation. The only message that isn't /^-.$/ is
3919 "program input from stdin", which is substituted in place of '\0', which
3920 could never be a command line flag. */
76e3520e 3921STATIC void
f20b2998 3922S_forbid_setid(pTHX_ const char flag, const bool suidscript) /* g */
bbce6d69 3923{
d0bafe7e
NC
3924 char string[3] = "-x";
3925 const char *message = "program input from stdin";
3926
20b7effb 3927 PERL_UNUSED_CONTEXT;
d0bafe7e
NC
3928 if (flag) {
3929 string[1] = flag;
3930 message = string;
3931 }
3932
ae3f3efd 3933#ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
985213f2 3934 if (PerlProc_getuid() != PerlProc_geteuid())
d0bafe7e 3935 Perl_croak(aTHX_ "No %s allowed while running setuid", message);
985213f2 3936 if (PerlProc_getgid() != PerlProc_getegid())
d0bafe7e 3937 Perl_croak(aTHX_ "No %s allowed while running setgid", message);
ae3f3efd 3938#endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
f20b2998 3939 if (suidscript)
d0bafe7e 3940 Perl_croak(aTHX_ "No %s allowed with (suid) fdscript", message);
bbce6d69 3941}
3942
1ee4443e 3943void
5b235299
NC
3944Perl_init_dbargs(pTHX)
3945{
3946 AV *const args = PL_dbargs = GvAV(gv_AVadd((gv_fetchpvs("DB::args",
3947 GV_ADDMULTI,
3948 SVt_PVAV))));
3949
3950 if (AvREAL(args)) {
3951 /* Someone has already created it.
3952 It might have entries, and if we just turn off AvREAL(), they will
3953 "leak" until global destruction. */
3954 av_clear(args);
3df49e2a 3955 if (SvTIED_mg((const SV *)args, PERL_MAGIC_tied))
7355df7e 3956 Perl_croak(aTHX_ "Cannot set tied @DB::args");
5b235299 3957 }
af80dd86 3958 AvREIFY_only(PL_dbargs);
5b235299
NC
3959}
3960
3961void
1ee4443e 3962Perl_init_debugger(pTHX)
748a9306 3963{
c4420975 3964 HV * const ostash = PL_curstash;
1ee4443e 3965
03d9f026 3966 PL_curstash = (HV *)SvREFCNT_inc_simple(PL_debstash);
5b235299
NC
3967
3968 Perl_init_dbargs(aTHX);
8cece913
FC
3969 PL_DBgv = MUTABLE_GV(
3970 SvREFCNT_inc(gv_fetchpvs("DB::DB", GV_ADDMULTI, SVt_PVGV))
3971 );
3972 PL_DBline = MUTABLE_GV(
3973 SvREFCNT_inc(gv_fetchpvs("DB::dbline", GV_ADDMULTI, SVt_PVAV))
3974 );
3975 PL_DBsub = MUTABLE_GV(SvREFCNT_inc(
3976 gv_HVadd(gv_fetchpvs("DB::sub", GV_ADDMULTI, SVt_PVHV))
3977 ));
5c1737d1 3978 PL_DBsingle = GvSV((gv_fetchpvs("DB::single", GV_ADDMULTI, SVt_PV)));
4c0f30d6
NC
3979 if (!SvIOK(PL_DBsingle))
3980 sv_setiv(PL_DBsingle, 0);
5c1737d1 3981 PL_DBtrace = GvSV((gv_fetchpvs("DB::trace", GV_ADDMULTI, SVt_PV)));
4c0f30d6
NC
3982 if (!SvIOK(PL_DBtrace))
3983 sv_setiv(PL_DBtrace, 0);
5c1737d1 3984 PL_DBsignal = GvSV((gv_fetchpvs("DB::signal", GV_ADDMULTI, SVt_PV)));
4c0f30d6
NC
3985 if (!SvIOK(PL_DBsignal))
3986 sv_setiv(PL_DBsignal, 0);
03d9f026 3987 SvREFCNT_dec(PL_curstash);
1ee4443e 3988 PL_curstash = ostash;
352d5a3a
LW
3989}
3990
2ce36478
SM
3991#ifndef STRESS_REALLOC
3992#define REASONABLE(size) (size)
0ff72558 3993#define REASONABLE_but_at_least(size,min) (size)
2ce36478
SM
3994#else
3995#define REASONABLE(size) (1) /* unreasonable */
0ff72558 3996#define REASONABLE_but_at_least(size,min) (min)
2ce36478
SM
3997#endif
3998
11343788 3999void
cea2e8a9 4000Perl_init_stacks(pTHX)
79072805 4001{
e336de0d 4002 /* start with 128-item stack and 8K cxstack */
3280af22 4003 PL_curstackinfo = new_stackinfo(REASONABLE(128),
e336de0d 4004 REASONABLE(8192/sizeof(PERL_CONTEXT) - 1));
3280af22
NIS
4005 PL_curstackinfo->si_type = PERLSI_MAIN;
4006 PL_curstack = PL_curstackinfo->si_stack;
4007 PL_mainstack = PL_curstack; /* remember in case we switch stacks */
79072805 4008
3280af22
NIS
4009 PL_stack_base = AvARRAY(PL_curstack);
4010 PL_stack_sp = PL_stack_base;
4011 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
8990e307 4012
a02a5408 4013 Newx(PL_tmps_stack,REASONABLE(128),SV*);
3280af22
NIS
4014 PL_tmps_floor = -1;
4015 PL_tmps_ix = -1;
4016 PL_tmps_max = REASONABLE(128);
8990e307 4017
a02a5408 4018 Newx(PL_markstack,REASONABLE(32),I32);
3280af22
NIS
4019 PL_markstack_ptr = PL_markstack;
4020 PL_markstack_max = PL_markstack + REASONABLE(32);
79072805 4021
ce2f7c3b 4022 SET_MARK_OFFSET;
e336de0d 4023
a02a5408 4024 Newx(PL_scopestack,REASONABLE(32),I32);
d343c3ef
GG
4025#ifdef DEBUGGING
4026 Newx(PL_scopestack_name,REASONABLE(32),const char*);
4027#endif
3280af22
NIS
4028 PL_scopestack_ix = 0;
4029 PL_scopestack_max = REASONABLE(32);
79072805 4030
0ff72558 4031 Newx(PL_savestack,REASONABLE_but_at_least(128,SS_MAXPUSH),ANY);
3280af22 4032 PL_savestack_ix = 0;
0ff72558 4033 PL_savestack_max = REASONABLE_but_at_least(128,SS_MAXPUSH);
378cc40b 4034}
33b78306 4035
2ce36478
SM
4036#undef REASONABLE
4037
76e3520e 4038STATIC void
cea2e8a9 4039S_nuke_stacks(pTHX)
6e72f9df 4040{
3280af22
NIS
4041 while (PL_curstackinfo->si_next)
4042 PL_curstackinfo = PL_curstackinfo->si_next;
4043 while (PL_curstackinfo) {
4044 PERL_SI *p = PL_curstackinfo->si_prev;
bac4b2ad 4045 /* curstackinfo->si_stack got nuked by sv_free_arenas() */
3280af22
NIS
4046 Safefree(PL_curstackinfo->si_cxstack);
4047 Safefree(PL_curstackinfo);
4048 PL_curstackinfo = p;
e336de0d 4049 }
3280af22
NIS
4050 Safefree(PL_tmps_stack);
4051 Safefree(PL_markstack);
4052 Safefree(PL_scopestack);
58780814
GG
4053#ifdef DEBUGGING
4054 Safefree(PL_scopestack_name);
4055#endif
3280af22 4056 Safefree(PL_savestack);
378cc40b 4057}
33b78306 4058
74e8ce34
NC
4059void
4060Perl_populate_isa(pTHX_ const char *name, STRLEN len, ...)
4061{
4062 GV *const gv = gv_fetchpvn(name, len, GV_ADD | GV_ADDMULTI, SVt_PVAV);
4063 AV *const isa = GvAVn(gv);
4064 va_list args;
4065
4066 PERL_ARGS_ASSERT_POPULATE_ISA;
4067
4068 if(AvFILLp(isa) != -1)
4069 return;
4070
4071 /* NOTE: No support for tied ISA */
4072
4073 va_start(args, len);
4074 do {
4075 const char *const parent = va_arg(args, const char*);
4076 size_t parent_len;
4077
4078 if (!parent)
4079 break;
4080 parent_len = va_arg(args, size_t);
4081
4082 /* Arguments are supplied with a trailing :: */
4083 assert(parent_len > 2);
4084 assert(parent[parent_len - 1] == ':');
4085 assert(parent[parent_len - 2] == ':');
4086 av_push(isa, newSVpvn(parent, parent_len - 2));
4087 (void) gv_fetchpvn(parent, parent_len, GV_ADD, SVt_PVGV);
4088 } while (1);
4089 va_end(args);
4090}
4091
8990e307 4092
76e3520e 4093STATIC void
cea2e8a9 4094S_init_predump_symbols(pTHX)
45d8adaa 4095{
93a17b20 4096 GV *tmpgv;
af8c498a 4097 IO *io;
79072805 4098
64ace3f8 4099 sv_setpvs(get_sv("\"", GV_ADD), " ");
e23d9e2f
CS
4100 PL_ofsgv = (GV*)SvREFCNT_inc(gv_fetchpvs(",", GV_ADD|GV_NOTQUAL, SVt_PV));
4101
d963bf01
NC
4102
4103 /* Historically, PVIOs were blessed into IO::Handle, unless
4104 FileHandle was loaded, in which case they were blessed into
4105 that. Action at a distance.
4106 However, if we simply bless into IO::Handle, we break code
4107 that assumes that PVIOs will have (among others) a seek
4108 method. IO::File inherits from IO::Handle and IO::Seekable,
4109 and provides the needed methods. But if we simply bless into
4110 it, then we break code that assumed that by loading
4111 IO::Handle, *it* would work.
4112 So a compromise is to set up the correct @IO::File::ISA,
4113 so that code that does C<use IO::Handle>; will still work.
4114 */
4115
74e8ce34
NC
4116 Perl_populate_isa(aTHX_ STR_WITH_LEN("IO::File::ISA"),
4117 STR_WITH_LEN("IO::Handle::"),
4118 STR_WITH_LEN("IO::Seekable::"),
4119 STR_WITH_LEN("Exporter::"),
4120 NULL);
d963bf01 4121
fafc274c 4122 PL_stdingv = gv_fetchpvs("STDIN", GV_ADD|GV_NOTQUAL, SVt_PVIO);
3280af22 4123 GvMULTI_on(PL_stdingv);
af8c498a 4124 io = GvIOp(PL_stdingv);
a04651f4 4125 IoTYPE(io) = IoTYPE_RDONLY;
af8c498a 4126 IoIFP(io) = PerlIO_stdin();
fafc274c 4127 tmpgv = gv_fetchpvs("stdin", GV_ADD|GV_NOTQUAL, SVt_PV);
a5f75d66 4128 GvMULTI_on(tmpgv);
a45c7426 4129 GvIOp(tmpgv) = MUTABLE_IO(SvREFCNT_inc_simple(io));
79072805 4130
fafc274c 4131 tmpgv = gv_fetchpvs("STDOUT", GV_ADD|GV_NOTQUAL, SVt_PVIO);
a5f75d66 4132 GvMULTI_on(tmpgv);
af8c498a 4133 io = GvIOp(tmpgv);
a04651f4 4134 IoTYPE(io) = IoTYPE_WRONLY;
af8c498a 4135 IoOFP(io) = IoIFP(io) = PerlIO_stdout();
4633a7c4 4136 setdefout(tmpgv);
fafc274c 4137 tmpgv = gv_fetchpvs("stdout", GV_ADD|GV_NOTQUAL, SVt_PV);
a5f75d66 4138 GvMULTI_on(tmpgv);
a45c7426 4139 GvIOp(tmpgv) = MUTABLE_IO(SvREFCNT_inc_simple(io));
79072805 4140
fafc274c 4141 PL_stderrgv = gv_fetchpvs("STDERR", GV_ADD|GV_NOTQUAL, SVt_PVIO);
bf49b057
GS
4142 GvMULTI_on(PL_stderrgv);
4143 io = GvIOp(PL_stderrgv);
a04651f4 4144 IoTYPE(io) = IoTYPE_WRONLY;
af8c498a 4145 IoOFP(io) = IoIFP(io) = PerlIO_stderr();
fafc274c 4146 tmpgv = gv_fetchpvs("stderr", GV_ADD|GV_NOTQUAL, SVt_PV);
a5f75d66 4147 GvMULTI_on(tmpgv);
a45c7426 4148 GvIOp(tmpgv) = MUTABLE_IO(SvREFCNT_inc_simple(io));
79072805 4149
de61bf2a 4150 PL_statname = newSVpvs(""); /* last filename we did stat on */
79072805 4151}
33b78306 4152
a11ec5a9 4153void
5aaab254 4154Perl_init_argv_symbols(pTHX_ int argc, char **argv)
33b78306 4155{
7918f24d
NC
4156 PERL_ARGS_ASSERT_INIT_ARGV_SYMBOLS;
4157
79072805 4158 argc--,argv++; /* skip name of script */
3280af22 4159 if (PL_doswitches) {
79072805 4160 for (; argc > 0 && **argv == '-'; argc--,argv++) {
aec46f14 4161 char *s;
79072805
LW
4162 if (!argv[0][1])
4163 break;
379d538a 4164 if (argv[0][1] == '-' && !argv[0][2]) {
79072805
LW
4165 argc--,argv++;
4166 break;
4167 }
155aba94 4168 if ((s = strchr(argv[0], '='))) {
b3d904f3
NC
4169 const char *const start_name = argv[0] + 1;
4170 sv_setpv(GvSV(gv_fetchpvn_flags(start_name, s - start_name,
4171 TRUE, SVt_PV)), s + 1);
79072805
LW
4172 }
4173 else
71315bf2 4174 sv_setiv(GvSV(gv_fetchpv(argv[0]+1, GV_ADD, SVt_PV)),1);
fe14fcc3 4175 }
79072805 4176 }
fafc274c 4177 if ((PL_argvgv = gv_fetchpvs("ARGV", GV_ADD|GV_NOTQUAL, SVt_PVAV))) {
722fa0e9 4178 SvREFCNT_inc_simple_void_NN(PL_argvgv);
a11ec5a9 4179 GvMULTI_on(PL_argvgv);
a11ec5a9
RGS
4180 av_clear(GvAVn(PL_argvgv));
4181 for (; argc > 0; argc--,argv++) {
aec46f14 4182 SV * const sv = newSVpv(argv[0],0);
b188953e 4183 av_push(GvAV(PL_argvgv),sv);
ce81ff12
JH
4184 if (!(PL_unicode & PERL_UNICODE_LOCALE_FLAG) || PL_utf8locale) {
4185 if (PL_unicode & PERL_UNICODE_ARGV_FLAG)
4186 SvUTF8_on(sv);
4187 }
a05d7ebb
JH
4188 if (PL_unicode & PERL_UNICODE_WIDESYSCALLS_FLAG) /* Sarathy? */
4189 (void)sv_utf8_decode(sv);
a11ec5a9
RGS
4190 }
4191 }
82f96200
JL
4192
4193 if (PL_inplace && (!PL_argvgv || AvFILL(GvAV(PL_argvgv)) == -1))
4194 Perl_ck_warner_d(aTHX_ packWARN(WARN_INPLACE),
4195 "-i used with no filenames on the command line, "
4196 "reading from STDIN");
a11ec5a9
RGS
4197}
4198
4199STATIC void
5aaab254 4200S_init_postdump_symbols(pTHX_ int argc, char **argv, char **env)
a11ec5a9 4201{
20b7effb 4202#ifdef USE_ITHREADS
27da23d5 4203 dVAR;
20b7effb 4204#endif
a11ec5a9 4205 GV* tmpgv;
a11ec5a9 4206
7918f24d
NC
4207 PERL_ARGS_ASSERT_INIT_POSTDUMP_SYMBOLS;
4208
f2da823f 4209 PL_toptarget = newSV_type(SVt_PVIV);
76f68e9b 4210 sv_setpvs(PL_toptarget, "");
f2da823f 4211 PL_bodytarget = newSV_type(SVt_PVIV);
76f68e9b 4212 sv_setpvs(PL_bodytarget, "");
3280af22 4213 PL_formtarget = PL_bodytarget;
79072805 4214
bbce6d69 4215 TAINT;
a11ec5a9
RGS
4216
4217 init_argv_symbols(argc,argv);
4218
fafc274c 4219 if ((tmpgv = gv_fetchpvs("0", GV_ADD|GV_NOTQUAL, SVt_PV))) {
3280af22 4220 sv_setpv(GvSV(tmpgv),PL_origfilename);
79072805 4221 }
fafc274c 4222 if ((PL_envgv = gv_fetchpvs("ENV", GV_ADD|GV_NOTQUAL, SVt_PVHV))) {
79072805 4223 HV *hv;
e17132c1 4224 bool env_is_not_environ;
cf93a474 4225 SvREFCNT_inc_simple_void_NN(PL_envgv);
3280af22
NIS
4226 GvMULTI_on(PL_envgv);
4227 hv = GvHVn(PL_envgv);
a0714e2c 4228 hv_magic(hv, NULL, PERL_MAGIC_env);
2f42fcb0 4229#ifndef PERL_MICRO
fa6a1c44 4230#ifdef USE_ENVIRON_ARRAY
4633a7c4
LW
4231 /* Note that if the supplied env parameter is actually a copy
4232 of the global environ then it may now point to free'd memory
4233 if the environment has been modified since. To avoid this
4234 problem we treat env==NULL as meaning 'use the default'
4235 */
4236 if (!env)
4237 env = environ;
e17132c1
JD
4238 env_is_not_environ = env != environ;
4239 if (env_is_not_environ
4efc5df6
GS
4240# ifdef USE_ITHREADS
4241 && PL_curinterp == aTHX
4242# endif
4243 )
4244 {
bd61b366 4245 environ[0] = NULL;
4efc5df6 4246 }
9b4eeda5 4247 if (env) {
9d27dca9 4248 char *s, *old_var;
27da23d5 4249 SV *sv;
764df951 4250 for (; *env; env++) {
9d27dca9
MT
4251 old_var = *env;
4252
4253 if (!(s = strchr(old_var,'=')) || s == old_var)
79072805 4254 continue;
9d27dca9 4255
7da0e383 4256#if defined(MSDOS) && !defined(DJGPP)
61968511 4257 *s = '\0';
9d27dca9 4258 (void)strupr(old_var);
61968511 4259 *s = '=';
137443ea 4260#endif
61968511 4261 sv = newSVpv(s+1, 0);
9d27dca9 4262 (void)hv_store(hv, old_var, s - old_var, sv, 0);
e17132c1 4263 if (env_is_not_environ)
61968511 4264 mg_set(sv);
764df951 4265 }
9b4eeda5 4266 }
103a7189 4267#endif /* USE_ENVIRON_ARRAY */
2f42fcb0 4268#endif /* !PERL_MICRO */
79072805 4269 }
bbce6d69 4270 TAINT_NOT;
2710853f
MJD
4271
4272 /* touch @F array to prevent spurious warnings 20020415 MJD */
4273 if (PL_minus_a) {
cbfd0a87 4274 (void) get_av("main::F", GV_ADD | GV_ADDMULTI);
2710853f 4275 }
33b78306 4276}
34de22dd 4277
76e3520e 4278STATIC void
2cace6ac 4279S_init_perllib(pTHX)
34de22dd 4280{
32910c7a 4281#ifndef VMS
929e5b34 4282 const char *perl5lib = NULL;
32910c7a 4283#endif
35ba5ce9 4284 const char *s;
a7560424 4285#if defined(WIN32) && !defined(PERL_IS_MINIPERL)
e6a0bbf8
NC
4286 STRLEN len;
4287#endif
4288
284167a5 4289 if (!TAINTING_get) {
552a7a9b 4290#ifndef VMS
32910c7a 4291 perl5lib = PerlEnv_getenv("PERL5LIB");
88f5bc07
AB
4292/*
4293 * It isn't possible to delete an environment variable with
42a3dd3a
RGS
4294 * PERL_USE_SAFE_PUTENV set unless unsetenv() is also available, so in that
4295 * case we treat PERL5LIB as undefined if it has a zero-length value.
88f5bc07
AB
4296 */
4297#if defined(PERL_USE_SAFE_PUTENV) && ! defined(HAS_UNSETENV)
32910c7a 4298 if (perl5lib && *perl5lib != '\0')
88f5bc07 4299#else
32910c7a 4300 if (perl5lib)
88f5bc07 4301#endif
32910c7a 4302 incpush_use_sep(perl5lib, 0, INCPUSH_ADD_SUB_DIRS);
2cace6ac 4303 else {
4705144d
NC
4304 s = PerlEnv_getenv("PERLLIB");
4305 if (s)
50d61629 4306 incpush_use_sep(s, 0, 0);
4705144d 4307 }
552a7a9b 4308#else /* VMS */
4309 /* Treat PERL5?LIB as a possible search list logical name -- the
4310 * "natural" VMS idiom for a Unix path string. We allow each
4311 * element to be a set of |-separated directories for compatibility.
4312 */
4313 char buf[256];
4314 int idx = 0;
4315 if (my_trnlnm("PERL5LIB",buf,0))
e28f3139 4316 do {
2cace6ac 4317 incpush_use_sep(buf, 0, INCPUSH_ADD_SUB_DIRS);
e28f3139 4318 } while (my_trnlnm("PERL5LIB",buf,++idx));
f05b5874 4319 else {
e28f3139 4320 while (my_trnlnm("PERLLIB",buf,idx++))
50d61629 4321 incpush_use_sep(buf, 0, 0);
f05b5874 4322 }
552a7a9b 4323#endif /* VMS */
85e6fe83 4324 }
34de22dd 4325
b0e687f7
NC
4326#ifndef PERL_IS_MINIPERL
4327 /* miniperl gets just -I..., the split of $ENV{PERL5LIB}, and "." in @INC
4328 (and not the architecture specific directories from $ENV{PERL5LIB}) */
4329
c90c0ff4 4330/* Use the ~-expanded versions of APPLLIB (undocumented),
826e305c 4331 SITEARCH, SITELIB, VENDORARCH, VENDORLIB, ARCHLIB and PRIVLIB
df5cef82 4332*/
4633a7c4 4333#ifdef APPLLIB_EXP
be71fc8f
NC
4334 S_incpush_use_sep(aTHX_ STR_WITH_LEN(APPLLIB_EXP),
4335 INCPUSH_ADD_SUB_DIRS|INCPUSH_CAN_RELOCATE);
16d20bd9 4336#endif
4633a7c4 4337
65f19062 4338#ifdef SITEARCH_EXP
3b290362
GS
4339 /* sitearch is always relative to sitelib on Windows for
4340 * DLL-based path intuition to work correctly */
4341# if !defined(WIN32)
be71fc8f
NC
4342 S_incpush_use_sep(aTHX_ STR_WITH_LEN(SITEARCH_EXP),
4343 INCPUSH_CAN_RELOCATE);
65f19062
GS
4344# endif
4345#endif
4346
4633a7c4 4347#ifdef SITELIB_EXP
65f19062 4348# if defined(WIN32)
574c798a 4349 /* this picks up sitearch as well */
e6a0bbf8 4350 s = win32_get_sitelib(PERL_FS_VERSION, &len);
1fa74d9f 4351 if (s)
e6a0bbf8 4352 incpush_use_sep(s, len, INCPUSH_ADD_SUB_DIRS|INCPUSH_CAN_RELOCATE);
65f19062 4353# else
50d61629 4354 S_incpush_use_sep(aTHX_ STR_WITH_LEN(SITELIB_EXP), INCPUSH_CAN_RELOCATE);
65f19062
GS
4355# endif
4356#endif
189d1e8d 4357
65f19062 4358#ifdef PERL_VENDORARCH_EXP
4ea817c6 4359 /* vendorarch is always relative to vendorlib on Windows for
3b290362
GS
4360 * DLL-based path intuition to work correctly */
4361# if !defined(WIN32)
be71fc8f
NC
4362 S_incpush_use_sep(aTHX_ STR_WITH_LEN(PERL_VENDORARCH_EXP),
4363 INCPUSH_CAN_RELOCATE);
65f19062 4364# endif
4b03c463 4365#endif
65f19062
GS
4366
4367#ifdef PERL_VENDORLIB_EXP
4368# if defined(WIN32)
e28f3139 4369 /* this picks up vendorarch as well */
e6a0bbf8 4370 s = win32_get_vendorlib(PERL_FS_VERSION, &len);
1fa74d9f 4371 if (s)
e6a0bbf8 4372 incpush_use_sep(s, len, INCPUSH_ADD_SUB_DIRS|INCPUSH_CAN_RELOCATE);
65f19062 4373# else
be71fc8f
NC
4374 S_incpush_use_sep(aTHX_ STR_WITH_LEN(PERL_VENDORLIB_EXP),
4375 INCPUSH_CAN_RELOCATE);
65f19062 4376# endif
a3635516 4377#endif
65f19062 4378
b9ba2fad 4379#ifdef ARCHLIB_EXP
2cace6ac 4380 S_incpush_use_sep(aTHX_ STR_WITH_LEN(ARCHLIB_EXP), INCPUSH_CAN_RELOCATE);
b9ba2fad
NC
4381#endif
4382
4383#ifndef PRIVLIB_EXP
4384# define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
4385#endif
4386
4387#if defined(WIN32)
2cace6ac
NC
4388 s = win32_get_privlib(PERL_FS_VERSION, &len);
4389 if (s)
4390 incpush_use_sep(s, len, INCPUSH_ADD_SUB_DIRS|INCPUSH_CAN_RELOCATE);
b9ba2fad 4391#else
04c9eecc 4392# ifdef NETWARE
2cace6ac 4393 S_incpush_use_sep(aTHX_ PRIVLIB_EXP, 0, INCPUSH_CAN_RELOCATE);
04c9eecc 4394# else
2cace6ac 4395 S_incpush_use_sep(aTHX_ STR_WITH_LEN(PRIVLIB_EXP), INCPUSH_CAN_RELOCATE);
04c9eecc 4396# endif
b9ba2fad
NC
4397#endif
4398
3b777bb4 4399#ifdef PERL_OTHERLIBDIRS
1e3208d8
NC
4400 S_incpush_use_sep(aTHX_ STR_WITH_LEN(PERL_OTHERLIBDIRS),
4401 INCPUSH_ADD_VERSIONED_SUB_DIRS|INCPUSH_NOT_BASEDIR
2cace6ac
NC
4402 |INCPUSH_CAN_RELOCATE);
4403#endif
2cace6ac 4404
284167a5 4405 if (!TAINTING_get) {
2cace6ac 4406#ifndef VMS
2cace6ac
NC
4407/*
4408 * It isn't possible to delete an environment variable with
4409 * PERL_USE_SAFE_PUTENV set unless unsetenv() is also available, so in that
4410 * case we treat PERL5LIB as undefined if it has a zero-length value.
4411 */
4412#if defined(PERL_USE_SAFE_PUTENV) && ! defined(HAS_UNSETENV)
32910c7a 4413 if (perl5lib && *perl5lib != '\0')
2cace6ac 4414#else
32910c7a 4415 if (perl5lib)
2cace6ac 4416#endif
32910c7a
NC
4417 incpush_use_sep(perl5lib, 0,
4418 INCPUSH_ADD_OLD_VERS|INCPUSH_NOT_BASEDIR);
2cace6ac
NC
4419#else /* VMS */
4420 /* Treat PERL5?LIB as a possible search list logical name -- the
4421 * "natural" VMS idiom for a Unix path string. We allow each
4422 * element to be a set of |-separated directories for compatibility.
4423 */
4424 char buf[256];
4425 int idx = 0;
4426 if (my_trnlnm("PERL5LIB",buf,0))
4427 do {
be71fc8f
NC
4428 incpush_use_sep(buf, 0,
4429 INCPUSH_ADD_OLD_VERS|INCPUSH_NOT_BASEDIR);
2cace6ac
NC
4430 } while (my_trnlnm("PERL5LIB",buf,++idx));
4431#endif /* VMS */
a26c0e28 4432 }
2cace6ac
NC
4433
4434/* Use the ~-expanded versions of APPLLIB (undocumented),
826e305c 4435 SITELIB and VENDORLIB for older versions
2cace6ac
NC
4436*/
4437#ifdef APPLLIB_EXP
be71fc8f
NC
4438 S_incpush_use_sep(aTHX_ STR_WITH_LEN(APPLLIB_EXP), INCPUSH_ADD_OLD_VERS
4439 |INCPUSH_NOT_BASEDIR|INCPUSH_CAN_RELOCATE);
2cace6ac
NC
4440#endif
4441
2cace6ac
NC
4442#if defined(SITELIB_STEM) && defined(PERL_INC_VERSION_LIST)
4443 /* Search for version-specific dirs below here */
be71fc8f
NC
4444 S_incpush_use_sep(aTHX_ STR_WITH_LEN(SITELIB_STEM),
4445 INCPUSH_ADD_OLD_VERS|INCPUSH_CAN_RELOCATE);
2cace6ac
NC
4446#endif
4447
4448
4449#if defined(PERL_VENDORLIB_STEM) && defined(PERL_INC_VERSION_LIST)
4450 /* Search for version-specific dirs below here */
be71fc8f
NC
4451 S_incpush_use_sep(aTHX_ STR_WITH_LEN(PERL_VENDORLIB_STEM),
4452 INCPUSH_ADD_OLD_VERS|INCPUSH_CAN_RELOCATE);
2cace6ac
NC
4453#endif
4454
4455#ifdef PERL_OTHERLIBDIRS
1e3208d8
NC
4456 S_incpush_use_sep(aTHX_ STR_WITH_LEN(PERL_OTHERLIBDIRS),
4457 INCPUSH_ADD_OLD_VERS|INCPUSH_ADD_ARCHONLY_SUB_DIRS
4458 |INCPUSH_CAN_RELOCATE);
3b777bb4 4459#endif
b0e687f7 4460#endif /* !PERL_IS_MINIPERL */
3b777bb4 4461
284167a5 4462 if (!TAINTING_get)
55b4bc1c 4463 S_incpush(aTHX_ STR_WITH_LEN("."), 0);
774d564b 4464}
4465
739a0b84 4466#if defined(DOSISH) || defined(__SYMBIAN32__)
774d564b 4467# define PERLLIB_SEP ';'
4468#else
4469# if defined(VMS)
4470# define PERLLIB_SEP '|'
4471# else
e37778c2 4472# define PERLLIB_SEP ':'
774d564b 4473# endif
4474#endif
4475#ifndef PERLLIB_MANGLE
4476# define PERLLIB_MANGLE(s,n) (s)
ac27b0f5 4477#endif
774d564b 4478
59d6f6a4 4479#ifndef PERL_IS_MINIPERL
ad17a1ae
NC
4480/* Push a directory onto @INC if it exists.
4481 Generate a new SV if we do this, to save needing to copy the SV we push
4482 onto @INC */
4483STATIC SV *
7ffdaae6 4484S_incpush_if_exists(pTHX_ AV *const av, SV *dir, SV *const stem)
ad17a1ae
NC
4485{
4486 Stat_t tmpstatbuf;
7918f24d
NC
4487
4488 PERL_ARGS_ASSERT_INCPUSH_IF_EXISTS;
4489
848ef955 4490 if (PerlLIO_stat(SvPVX_const(dir), &tmpstatbuf) >= 0 &&
ad17a1ae 4491 S_ISDIR(tmpstatbuf.st_mode)) {
3a9a9ba7 4492 av_push(av, dir);
7ffdaae6
NC
4493 dir = newSVsv(stem);
4494 } else {
4495 /* Truncate dir back to stem. */
4496 SvCUR_set(dir, SvCUR(stem));
ad17a1ae
NC
4497 }
4498 return dir;
4499}
59d6f6a4 4500#endif
ad17a1ae 4501
c29067d7
CH
4502STATIC SV *
4503S_mayberelocate(pTHX_ const char *const dir, STRLEN len, U32 flags)
774d564b 4504{
6434436b 4505 const U8 canrelocate = (U8)flags & INCPUSH_CAN_RELOCATE;
c29067d7 4506 SV *libdir;
774d564b 4507
c29067d7 4508 PERL_ARGS_ASSERT_MAYBERELOCATE;
08d0d8ab 4509 assert(len > 0);
3a9a9ba7 4510
d2898d73
EB
4511 /* I am not convinced that this is valid when PERLLIB_MANGLE is
4512 defined to so something (in os2/os2.c), but the code has been
4513 this way, ignoring any possible changed of length, since
4514 760ac839baf413929cd31cc32ffd6dba6b781a81 (5.003_02) so I'll leave
4515 it be. */
4516 libdir = newSVpvn(PERLLIB_MANGLE(dir, len), len);
774d564b 4517
81600524 4518#ifdef VMS
db12e2d3 4519 {
81600524 4520 char *unix;
81600524
CB
4521
4522 if ((unix = tounixspec_ts(SvPV(libdir,len),NULL)) != NULL) {
4523 len = strlen(unix);
f420cce1 4524 while (len > 1 && unix[len-1] == '/') len--; /* Cosmetic */
81600524
CB
4525 sv_usepvn(libdir,unix,len);
4526 }
4527 else
4528 PerlIO_printf(Perl_error_log,
4529 "Failed to unixify @INC element \"%s\"\n",
9dfa9235 4530 SvPV_nolen_const(libdir));
db12e2d3 4531 }
81600524
CB
4532#endif
4533
dd374669
AL
4534 /* Do the if() outside the #ifdef to avoid warnings about an unused
4535 parameter. */
4536 if (canrelocate) {
88fe16b2
NC
4537#ifdef PERL_RELOCATABLE_INC
4538 /*
4539 * Relocatable include entries are marked with a leading .../
4540 *
4541 * The algorithm is
4542 * 0: Remove that leading ".../"
4543 * 1: Remove trailing executable name (anything after the last '/')
4544 * from the perl path to give a perl prefix
4545 * Then
4546 * While the @INC element starts "../" and the prefix ends with a real
4547 * directory (ie not . or ..) chop that real directory off the prefix
4548 * and the leading "../" from the @INC element. ie a logical "../"
4549 * cleanup
4550 * Finally concatenate the prefix and the remainder of the @INC element
4551 * The intent is that /usr/local/bin/perl and .../../lib/perl5
4552 * generates /usr/local/lib/perl5
4553 */
890ce7af 4554 const char *libpath = SvPVX(libdir);
88fe16b2
NC
4555 STRLEN libpath_len = SvCUR(libdir);
4556 if (libpath_len >= 4 && memEQ (libpath, ".../", 4)) {
4557 /* Game on! */
890ce7af 4558 SV * const caret_X = get_sv("\030", 0);
88fe16b2
NC
4559 /* Going to use the SV just as a scratch buffer holding a C
4560 string: */
4561 SV *prefix_sv;
4562 char *prefix;
4563 char *lastslash;
4564
4565 /* $^X is *the* source of taint if tainting is on, hence
4566 SvPOK() won't be true. */
4567 assert(caret_X);
4568 assert(SvPOKp(caret_X));
a663657d
NC
4569 prefix_sv = newSVpvn_flags(SvPVX(caret_X), SvCUR(caret_X),
4570 SvUTF8(caret_X));
88fe16b2
NC
4571 /* Firstly take off the leading .../
4572 If all else fail we'll do the paths relative to the current
4573 directory. */
4574 sv_chop(libdir, libpath + 4);
4575 /* Don't use SvPV as we're intentionally bypassing taining,
4576 mortal copies that the mg_get of tainting creates, and
4577 corruption that seems to come via the save stack.
4578 I guess that the save stack isn't correctly set up yet. */
4579 libpath = SvPVX(libdir);
4580 libpath_len = SvCUR(libdir);
4581
4582 /* This would work more efficiently with memrchr, but as it's
4583 only a GNU extension we'd need to probe for it and
4584 implement our own. Not hard, but maybe not worth it? */
4585
4586 prefix = SvPVX(prefix_sv);
4587 lastslash = strrchr(prefix, '/');
4588
4589 /* First time in with the *lastslash = '\0' we just wipe off
4590 the trailing /perl from (say) /usr/foo/bin/perl
4591 */
4592 if (lastslash) {
4593 SV *tempsv;
4594 while ((*lastslash = '\0'), /* Do that, come what may. */
4595 (libpath_len >= 3 && memEQ(libpath, "../", 3)
4596 && (lastslash = strrchr(prefix, '/')))) {
4597 if (lastslash[1] == '\0'
4598 || (lastslash[1] == '.'
4599 && (lastslash[2] == '/' /* ends "/." */
4600 || (lastslash[2] == '/'
4601 && lastslash[3] == '/' /* or "/.." */
4602 )))) {
4603 /* Prefix ends "/" or "/." or "/..", any of which
4604 are fishy, so don't do any more logical cleanup.
4605 */
4606 break;
4607 }
4608 /* Remove leading "../" from path */
4609 libpath += 3;
4610 libpath_len -= 3;
4611 /* Next iteration round the loop removes the last
4612 directory name from prefix by writing a '\0' in
4613 the while clause. */
4614 }
4615 /* prefix has been terminated with a '\0' to the correct
4616 length. libpath points somewhere into the libdir SV.
4617 We need to join the 2 with '/' and drop the result into
4618 libdir. */
4619 tempsv = Perl_newSVpvf(aTHX_ "%s/%s", prefix, libpath);
4620 SvREFCNT_dec(libdir);
4621 /* And this is the new libdir. */
4622 libdir = tempsv;
284167a5 4623 if (TAINTING_get &&
985213f2
AB
4624 (PerlProc_getuid() != PerlProc_geteuid() ||
4625 PerlProc_getgid() != PerlProc_getegid())) {
486ec47a 4626 /* Need to taint relocated paths if running set ID */
88fe16b2
NC
4627 SvTAINTED_on(libdir);
4628 }
4629 }
4630 SvREFCNT_dec(prefix_sv);
4631 }
88fe16b2 4632#endif
dd374669 4633 }
c29067d7 4634 return libdir;
c29067d7
CH
4635}
4636
4637STATIC void
4638S_incpush(pTHX_ const char *const dir, STRLEN len, U32 flags)
4639{
c29067d7
CH
4640#ifndef PERL_IS_MINIPERL
4641 const U8 using_sub_dirs
4642 = (U8)flags & (INCPUSH_ADD_VERSIONED_SUB_DIRS
4643 |INCPUSH_ADD_ARCHONLY_SUB_DIRS|INCPUSH_ADD_OLD_VERS);
4644 const U8 add_versioned_sub_dirs
4645 = (U8)flags & INCPUSH_ADD_VERSIONED_SUB_DIRS;
4646 const U8 add_archonly_sub_dirs
4647 = (U8)flags & INCPUSH_ADD_ARCHONLY_SUB_DIRS;
4648#ifdef PERL_INC_VERSION_LIST
4649 const U8 addoldvers = (U8)flags & INCPUSH_ADD_OLD_VERS;
4650#endif
4651#endif
4652 const U8 unshift = (U8)flags & INCPUSH_UNSHIFT;
4653 const U8 push_basedir = (flags & INCPUSH_NOT_BASEDIR) ? 0 : 1;
4654 AV *const inc = GvAVn(PL_incgv);
4655
4656 PERL_ARGS_ASSERT_INCPUSH;
4657 assert(len > 0);
4658
4659 /* Could remove this vestigial extra block, if we don't mind a lot of
4660 re-indenting diff noise. */
4661 {
5a702b9a 4662 SV *const libdir = mayberelocate(dir, len, flags);
c29067d7
CH
4663 /* Change 20189146be79a0596543441fa369c6bf7f85103f, to fix RT#6665,
4664 arranged to unshift #! line -I onto the front of @INC. However,
4665 -I can add version and architecture specific libraries, and they
4666 need to go first. The old code assumed that it was always
4667 pushing. Hence to make it work, need to push the architecture
4668 (etc) libraries onto a temporary array, then "unshift" that onto
4669 the front of @INC. */
4670#ifndef PERL_IS_MINIPERL
4671 AV *const av = (using_sub_dirs) ? (unshift ? newAV() : inc) : NULL;
c29067d7 4672
774d564b 4673 /*
4674 * BEFORE pushing libdir onto @INC we may first push version- and
4675 * archname-specific sub-directories.
4676 */
ee80e7be 4677 if (using_sub_dirs) {
5a702b9a 4678 SV *subdir = newSVsv(libdir);
29d82f8d 4679#ifdef PERL_INC_VERSION_LIST
8353b874 4680 /* Configure terminates PERL_INC_VERSION_LIST with a NULL */
c4420975
AL
4681 const char * const incverlist[] = { PERL_INC_VERSION_LIST };
4682 const char * const *incver;
29d82f8d 4683#endif
7ffdaae6 4684
1e3208d8 4685 if (add_versioned_sub_dirs) {
9c8a64f0 4686 /* .../version/archname if -d .../version/archname */
e51b748d 4687 sv_catpvs(subdir, "/" PERL_FS_VERSION "/" ARCHNAME);
7ffdaae6 4688 subdir = S_incpush_if_exists(aTHX_ av, subdir, libdir);
4b03c463 4689
9c8a64f0 4690 /* .../version if -d .../version */
e51b748d 4691 sv_catpvs(subdir, "/" PERL_FS_VERSION);
7ffdaae6 4692 subdir = S_incpush_if_exists(aTHX_ av, subdir, libdir);
29d82f8d 4693 }
9c8a64f0 4694
9c8a64f0 4695#ifdef PERL_INC_VERSION_LIST
ccc2aad8 4696 if (addoldvers) {
9c8a64f0
GS
4697 for (incver = incverlist; *incver; incver++) {
4698 /* .../xxx if -d .../xxx */
e51b748d 4699 Perl_sv_catpvf(aTHX_ subdir, "/%s", *incver);
7ffdaae6 4700 subdir = S_incpush_if_exists(aTHX_ av, subdir, libdir);
9c8a64f0
GS
4701 }
4702 }
29d82f8d 4703#endif
c992324b 4704
1e3208d8 4705 if (add_archonly_sub_dirs) {
c992324b 4706 /* .../archname if -d .../archname */
e51b748d 4707 sv_catpvs(subdir, "/" ARCHNAME);
7ffdaae6 4708 subdir = S_incpush_if_exists(aTHX_ av, subdir, libdir);
c992324b
NC
4709
4710 }
10cc20f6
NC
4711
4712 assert (SvREFCNT(subdir) == 1);
4713 SvREFCNT_dec(subdir);
774d564b 4714 }
59d6f6a4 4715#endif /* !PERL_IS_MINIPERL */
20189146
RGS
4716 /* finally add this lib directory at the end of @INC */
4717 if (unshift) {
76895e89 4718#ifdef PERL_IS_MINIPERL
c70927a6 4719 const Size_t extra = 0;
76895e89 4720#else
b9f2b683 4721 Size_t extra = av_tindex(av) + 1;
76895e89 4722#endif
a26c0e28
NC
4723 av_unshift(inc, extra + push_basedir);
4724 if (push_basedir)
4725 av_store(inc, extra, libdir);
76895e89 4726#ifndef PERL_IS_MINIPERL
3a9a9ba7
NC
4727 while (extra--) {
4728 /* av owns a reference, av_store() expects to be donated a
4729 reference, and av expects to be sane when it's cleared.
4730 If I wanted to be naughty and wrong, I could peek inside the
4731 implementation of av_clear(), realise that it uses
4732 SvREFCNT_dec() too, so av's array could be a run of NULLs,
4733 and so directly steal from it (with a memcpy() to inc, and
4734 then memset() to NULL them out. But people copy code from the
4735 core expecting it to be best practise, so let's use the API.
4736 Although studious readers will note that I'm not checking any
4737 return codes. */
4738 av_store(inc, extra, SvREFCNT_inc(*av_fetch(av, extra, FALSE)));
4739 }
4740 SvREFCNT_dec(av);
59d6f6a4 4741#endif
20189146 4742 }
a26c0e28 4743 else if (push_basedir) {
3a9a9ba7 4744 av_push(inc, libdir);
20189146 4745 }
a26c0e28
NC
4746
4747 if (!push_basedir) {
4748 assert (SvREFCNT(libdir) == 1);
4749 SvREFCNT_dec(libdir);
4750 }
774d564b 4751 }
34de22dd 4752}
93a17b20 4753
55b4bc1c 4754STATIC void
50d61629 4755S_incpush_use_sep(pTHX_ const char *p, STRLEN len, U32 flags)
55b4bc1c 4756{
50d61629
NC
4757 const char *s;
4758 const char *end;
55b4bc1c
NC
4759 /* This logic has been broken out from S_incpush(). It may be possible to
4760 simplify it. */
4761
4705144d
NC
4762 PERL_ARGS_ASSERT_INCPUSH_USE_SEP;
4763
f31c6eed
JD
4764 /* perl compiled with -DPERL_RELOCATABLE_INCPUSH will ignore the len
4765 * argument to incpush_use_sep. This allows creation of relocatable
4766 * Perl distributions that patch the binary at install time. Those
4767 * distributions will have to provide their own relocation tools; this
4768 * is not a feature otherwise supported by core Perl.
4769 */
4770#ifndef PERL_RELOCATABLE_INCPUSH
50d61629 4771 if (!len)
f31c6eed 4772#endif
50d61629
NC
4773 len = strlen(p);
4774
4775 end = p + len;
4776
55b4bc1c 4777 /* Break at all separators */
e42f52dd 4778 while ((s = (const char*)memchr(p, PERLLIB_SEP, end - p))) {
50d61629
NC
4779 if (s == p) {
4780 /* skip any consecutive separators */
55b4bc1c 4781
55b4bc1c 4782 /* Uncomment the next line for PATH semantics */
50d61629 4783 /* But you'll need to write tests */
55b4bc1c 4784 /* av_push(GvAVn(PL_incgv), newSVpvs(".")); */
50d61629 4785 } else {
55b4bc1c 4786 incpush(p, (STRLEN)(s - p), flags);
55b4bc1c 4787 }
50d61629 4788 p = s + 1;
55b4bc1c 4789 }
50d61629
NC
4790 if (p != end)
4791 incpush(p, (STRLEN)(end - p), flags);
4792
55b4bc1c 4793}
199100c8 4794
93a17b20 4795void
864dbfa3 4796Perl_call_list(pTHX_ I32 oldscope, AV *paramList)
93a17b20 4797{
971a9dd3 4798 SV *atsv;
5f40764f 4799 volatile const line_t oldline = PL_curcop ? CopLINE(PL_curcop) : 0;
312caa8e 4800 CV *cv;
22921e25 4801 STRLEN len;
6224f72b 4802 int ret;
db36c5a1 4803 dJMPENV;
93a17b20 4804
7918f24d
NC
4805 PERL_ARGS_ASSERT_CALL_LIST;
4806
b9f2b683 4807 while (av_tindex(paramList) >= 0) {
ea726b52 4808 cv = MUTABLE_CV(av_shift(paramList));
ece599bd
RGS
4809 if (PL_savebegin) {
4810 if (paramList == PL_beginav) {
059a8bb7 4811 /* save PL_beginav for compiler */
ad64d0ec 4812 Perl_av_create_and_push(aTHX_ &PL_beginav_save, MUTABLE_SV(cv));
ece599bd
RGS
4813 }
4814 else if (paramList == PL_checkav) {
4815 /* save PL_checkav for compiler */
ad64d0ec 4816 Perl_av_create_and_push(aTHX_ &PL_checkav_save, MUTABLE_SV(cv));
ece599bd 4817 }
3c10abe3
AG
4818 else if (paramList == PL_unitcheckav) {
4819 /* save PL_unitcheckav for compiler */
ad64d0ec 4820 Perl_av_create_and_push(aTHX_ &PL_unitcheckav_save, MUTABLE_SV(cv));
3c10abe3 4821 }
059a8bb7 4822 } else {
b5bbe64a 4823 SAVEFREESV(cv);
059a8bb7 4824 }
14dd3ad8 4825 JMPENV_PUSH(ret);
6224f72b 4826 switch (ret) {
312caa8e 4827 case 0:
d6f07c05 4828 CALL_LIST_BODY(cv);
971a9dd3 4829 atsv = ERRSV;
10516c54 4830 (void)SvPV_const(atsv, len);
312caa8e
CS
4831 if (len) {
4832 PL_curcop = &PL_compiling;
57843af0 4833 CopLINE_set(PL_curcop, oldline);
312caa8e 4834 if (paramList == PL_beginav)
396482e1 4835 sv_catpvs(atsv, "BEGIN failed--compilation aborted");
312caa8e 4836 else
4f25aa18
GS
4837 Perl_sv_catpvf(aTHX_ atsv,
4838 "%s failed--call queue aborted",
7d30b5c4 4839 paramList == PL_checkav ? "CHECK"
4f25aa18 4840 : paramList == PL_initav ? "INIT"
3c10abe3 4841 : paramList == PL_unitcheckav ? "UNITCHECK"
4f25aa18 4842 : "END");
312caa8e
CS
4843 while (PL_scopestack_ix > oldscope)
4844 LEAVE;
14dd3ad8 4845 JMPENV_POP;
be2597df 4846 Perl_croak(aTHX_ "%"SVf"", SVfARG(atsv));
a0d0e21e 4847 }
85e6fe83 4848 break;
6224f72b 4849 case 1:
f86702cc 4850 STATUS_ALL_FAILURE;
924ba076 4851 /* FALLTHROUGH */
6224f72b 4852 case 2:
85e6fe83 4853 /* my_exit() was called */
3280af22 4854 while (PL_scopestack_ix > oldscope)
2ae324a7 4855 LEAVE;
84902520 4856 FREETMPS;
03d9f026 4857 SET_CURSTASH(PL_defstash);
3280af22 4858 PL_curcop = &PL_compiling;
57843af0 4859 CopLINE_set(PL_curcop, oldline);
14dd3ad8 4860 JMPENV_POP;
f86702cc 4861 my_exit_jump();
a25b5927 4862 assert(0); /* NOTREACHED */
6224f72b 4863 case 3:
312caa8e
CS
4864 if (PL_restartop) {
4865 PL_curcop = &PL_compiling;
57843af0 4866 CopLINE_set(PL_curcop, oldline);
312caa8e 4867 JMPENV_JUMP(3);
85e6fe83 4868 }
5637ef5b 4869 PerlIO_printf(Perl_error_log, "panic: restartop in call_list\n");
312caa8e
CS
4870 FREETMPS;
4871 break;
8990e307 4872 }
14dd3ad8 4873 JMPENV_POP;
93a17b20 4874 }
93a17b20 4875}
93a17b20 4876
f86702cc 4877void
864dbfa3 4878Perl_my_exit(pTHX_ U32 status)
f86702cc 4879{
6136213b
JGM
4880 if (PL_exit_flags & PERL_EXIT_ABORT) {
4881 abort();
4882 }
4883 if (PL_exit_flags & PERL_EXIT_WARN) {
4884 PL_exit_flags |= PERL_EXIT_ABORT; /* Protect against reentrant calls */
7b0eb0b8 4885 Perl_warn(aTHX_ "Unexpected exit %lu", (unsigned long)status);
6136213b
JGM
4886 PL_exit_flags &= ~PERL_EXIT_ABORT;
4887 }
f86702cc 4888 switch (status) {
4889 case 0:
4890 STATUS_ALL_SUCCESS;
4891 break;
4892 case 1:
4893 STATUS_ALL_FAILURE;
4894 break;
4895 default:
6ac6a52b 4896 STATUS_EXIT_SET(status);
f86702cc 4897 break;
4898 }
4899 my_exit_jump();
4900}
4901
4902void
864dbfa3 4903Perl_my_failure_exit(pTHX)
f86702cc 4904{
4905#ifdef VMS
fb38d079
JM
4906 /* We have been called to fall on our sword. The desired exit code
4907 * should be already set in STATUS_UNIX, but could be shifted over
0968cdad
JM
4908 * by 8 bits. STATUS_UNIX_EXIT_SET will handle the cases where a
4909 * that code is set.
fb38d079
JM
4910 *
4911 * If an error code has not been set, then force the issue.
4912 */
0968cdad
JM
4913 if (MY_POSIX_EXIT) {
4914
e08e1e1d
JM
4915 /* According to the die_exit.t tests, if errno is non-zero */
4916 /* It should be used for the error status. */
0968cdad 4917
e08e1e1d
JM
4918 if (errno == EVMSERR) {
4919 STATUS_NATIVE = vaxc$errno;
4920 } else {
0968cdad 4921
e08e1e1d
JM
4922 /* According to die_exit.t tests, if the child_exit code is */
4923 /* also zero, then we need to exit with a code of 255 */
4924 if ((errno != 0) && (errno < 256))
4925 STATUS_UNIX_EXIT_SET(errno);
4926 else if (STATUS_UNIX < 255) {
0968cdad 4927 STATUS_UNIX_EXIT_SET(255);
e08e1e1d
JM
4928 }
4929
0968cdad 4930 }
e08e1e1d
JM
4931
4932 /* The exit code could have been set by $? or vmsish which
4933 * means that it may not have fatal set. So convert
4934 * success/warning codes to fatal with out changing
4935 * the POSIX status code. The severity makes VMS native
4936 * status handling work, while UNIX mode programs use the
4937 * the POSIX exit codes.
4938 */
4939 if ((STATUS_NATIVE & (STS$K_SEVERE|STS$K_ERROR)) == 0) {
4940 STATUS_NATIVE &= STS$M_COND_ID;
4941 STATUS_NATIVE |= STS$K_ERROR | STS$M_INHIB_MSG;
4942 }
0968cdad
JM
4943 }
4944 else {
4945 /* Traditionally Perl on VMS always expects a Fatal Error. */
4946 if (vaxc$errno & 1) {
4947
4948 /* So force success status to failure */
4949 if (STATUS_NATIVE & 1)
4950 STATUS_ALL_FAILURE;
4951 }
4952 else {
4953 if (!vaxc$errno) {
4954 STATUS_UNIX = EINTR; /* In case something cares */
4955 STATUS_ALL_FAILURE;
4956 }
4957 else {
4958 int severity;
4959 STATUS_NATIVE = vaxc$errno; /* Should already be this */
4960
4961 /* Encode the severity code */
4962 severity = STATUS_NATIVE & STS$M_SEVERITY;
4963 STATUS_UNIX = (severity ? severity : 1) << 8;
4964
4965 /* Perl expects this to be a fatal error */
4966 if (severity != STS$K_SEVERE)
4967 STATUS_ALL_FAILURE;
4968 }
4969 }
4970 }
fb38d079 4971
f86702cc 4972#else
9b599b2a 4973 int exitstatus;
f86702cc 4974 if (errno & 255)
e5218da5 4975 STATUS_UNIX_SET(errno);
9b599b2a 4976 else {
e5218da5 4977 exitstatus = STATUS_UNIX >> 8;
9b599b2a 4978 if (exitstatus & 255)
e5218da5 4979 STATUS_UNIX_SET(exitstatus);
9b599b2a 4980 else
e5218da5 4981 STATUS_UNIX_SET(255);
9b599b2a 4982 }
f86702cc 4983#endif
6136213b
JGM
4984 if (PL_exit_flags & PERL_EXIT_ABORT) {
4985 abort();
4986 }
4987 if (PL_exit_flags & PERL_EXIT_WARN) {
4988 PL_exit_flags |= PERL_EXIT_ABORT; /* Protect against reentrant calls */
7b0eb0b8 4989 Perl_warn(aTHX_ "Unexpected exit failure %ld", (long)PL_statusvalue);
6136213b
JGM
4990 PL_exit_flags &= ~PERL_EXIT_ABORT;
4991 }
f86702cc 4992 my_exit_jump();
93a17b20
LW
4993}
4994
76e3520e 4995STATIC void
cea2e8a9 4996S_my_exit_jump(pTHX)
f86702cc 4997{
3280af22
NIS
4998 if (PL_e_script) {
4999 SvREFCNT_dec(PL_e_script);
a0714e2c 5000 PL_e_script = NULL;
f86702cc 5001 }
5002
3280af22 5003 POPSTACK_TO(PL_mainstack);
f97a0ef2
RH
5004 dounwind(-1);
5005 LEAVE_SCOPE(0);
ff0cee69 5006
6224f72b 5007 JMPENV_JUMP(2);
f86702cc 5008}
873ef191 5009
0cb96387 5010static I32
acfe0abc 5011read_e_script(pTHX_ int idx, SV *buf_sv, int maxlen)
873ef191 5012{
9d4ba2ae
AL
5013 const char * const p = SvPVX_const(PL_e_script);
5014 const char *nl = strchr(p, '\n');
5015
5016 PERL_UNUSED_ARG(idx);
5017 PERL_UNUSED_ARG(maxlen);
dd374669 5018
3280af22 5019 nl = (nl) ? nl+1 : SvEND(PL_e_script);
7dfe3f66 5020 if (nl-p == 0) {
0cb96387 5021 filter_del(read_e_script);
873ef191 5022 return 0;
7dfe3f66 5023 }
873ef191 5024 sv_catpvn(buf_sv, p, nl-p);
3280af22 5025 sv_chop(PL_e_script, nl);
873ef191
GS
5026 return 1;
5027}
66610fdd
RGS
5028
5029/*
5030 * Local variables:
5031 * c-indentation-style: bsd
5032 * c-basic-offset: 4
14d04a33 5033 * indent-tabs-mode: nil
66610fdd
RGS
5034 * End:
5035 *
14d04a33 5036 * ex: set ts=8 sts=4 sw=4 et:
37442d52 5037 */