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