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