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