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