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