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