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