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