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