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