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