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