This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
tweak warning test
[perl5.git] / perl.c
CommitLineData
a0d0e21e
LW
1/* perl.c
2 *
a411490c 3 * Copyright (c) 1987-1998 Larry Wall
a687059c 4 *
352d5a3a
LW
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
a687059c 7 *
8d063cd8
LW
8 */
9
a0d0e21e
LW
10/*
11 * "A ship then new they built for him/of mithril and of elven glass" --Bilbo
12 */
45d8adaa 13
378cc40b
LW
14#include "EXTERN.h"
15#include "perl.h"
a687059c 16#include "patchlevel.h"
378cc40b 17
df5cef82 18/* XXX If this causes problems, set i_unistd=undef in the hint file. */
a0d0e21e
LW
19#ifdef I_UNISTD
20#include <unistd.h>
21#endif
a0d0e21e 22
54310121 23#if !defined(STANDARD_C) && !defined(HAS_GETENV_PROTOTYPE)
24char *getenv _((char *)); /* Usually in <stdlib.h> */
25#endif
26
51fa4eea
JH
27#ifdef I_FCNTL
28#include <fcntl.h>
29#endif
30#ifdef I_SYS_FILE
31#include <sys/file.h>
32#endif
33
a687059c
LW
34#ifdef IAMSUID
35#ifndef DOSUID
36#define DOSUID
37#endif
38#endif
378cc40b 39
a687059c
LW
40#ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
41#ifdef DOSUID
42#undef DOSUID
43#endif
44#endif
8d063cd8 45
873ef191
GS
46#ifdef PERL_OBJECT
47static I32 read_e_script _((CPerlObj* pPerl, int idx, SV *buf_sv, int maxlen));
48#else
a0d0e21e 49static void find_beginning _((void));
bbce6d69 50static void forbid_setid _((char *));
774d564b 51static void incpush _((char *, int));
cb68f92d 52static void init_interp _((void));
748a9306 53static void init_ids _((void));
a0d0e21e
LW
54static void init_debugger _((void));
55static void init_lexer _((void));
56static void init_main_stash _((void));
199100c8 57#ifdef USE_THREADS
52e1cb5e 58static struct perl_thread * init_main_thread _((void));
199100c8 59#endif /* USE_THREADS */
a0d0e21e
LW
60static void init_perllib _((void));
61static void init_postdump_symbols _((int, char **, char **));
62static void init_predump_symbols _((void));
f86702cc 63static void my_exit_jump _((void)) __attribute__((noreturn));
6e72f9df 64static void nuke_stacks _((void));
01f988be 65static void open_script _((char *, bool, SV *, int *fd));
ab821d7f 66static void usage _((char *));
01f988be 67static void validate_suid _((char *, char*, int));
afe37c7d 68static I32 read_e_script _((int idx, SV *buf_sv, int maxlen));
76e3520e 69#endif
96436eeb 70
01f988be
GS
71#ifdef PERL_OBJECT
72CPerlObj* perl_alloc(IPerlMem* ipM, IPerlEnv* ipE, IPerlStdIO* ipStd,
73 IPerlLIO* ipLIO, IPerlDir* ipD, IPerlSock* ipS, IPerlProc* ipP)
74{
75 CPerlObj* pPerl = new(ipM) CPerlObj(ipM, ipE, ipStd, ipLIO, ipD, ipS, ipP);
76 if(pPerl != NULL)
77 pPerl->Init();
79072805 78
01f988be
GS
79 return pPerl;
80}
81#else
93a17b20 82PerlInterpreter *
8ac85365 83perl_alloc(void)
79072805 84{
93a17b20 85 PerlInterpreter *sv_interp;
79072805 86
3280af22 87 PL_curinterp = 0;
93a17b20 88 New(53, sv_interp, 1, PerlInterpreter);
79072805
LW
89 return sv_interp;
90}
01f988be 91#endif /* PERL_OBJECT */
79072805
LW
92
93void
76e3520e
GS
94#ifdef PERL_OBJECT
95CPerlObj::perl_construct(void)
96#else
8ac85365 97perl_construct(register PerlInterpreter *sv_interp)
76e3520e 98#endif
79072805 99{
a863c7d1
MB
100#ifdef USE_THREADS
101 int i;
102#ifndef FAKE_THREADS
52e1cb5e 103 struct perl_thread *thr;
a863c7d1
MB
104#endif /* FAKE_THREADS */
105#endif /* USE_THREADS */
11343788 106
76e3520e 107#ifndef PERL_OBJECT
3280af22 108 if (!(PL_curinterp = sv_interp))
79072805 109 return;
76e3520e 110#endif
79072805 111
8990e307 112#ifdef MULTIPLICITY
8f872242 113 ++PL_ninterps;
93a17b20 114 Zero(sv_interp, 1, PerlInterpreter);
8990e307 115#endif
79072805 116
33f46ff6 117 /* Init the real globals (and main thread)? */
3280af22 118 if (!PL_linestr) {
11343788 119#ifdef USE_THREADS
8023c3ce 120
33f46ff6 121 INIT_THREADS;
d55594ae
GS
122#ifdef ALLOC_THREAD_KEY
123 ALLOC_THREAD_KEY;
124#else
533c011a 125 if (pthread_key_create(&PL_thr_key, 0))
a863c7d1 126 croak("panic: pthread_key_create");
d55594ae 127#endif
533c011a 128 MUTEX_INIT(&PL_sv_mutex);
a863c7d1
MB
129 /*
130 * Safe to use basic SV functions from now on (though
131 * not things like mortals or tainting yet).
132 */
533c011a
NIS
133 MUTEX_INIT(&PL_eval_mutex);
134 COND_INIT(&PL_eval_cond);
135 MUTEX_INIT(&PL_threads_mutex);
136 COND_INIT(&PL_nthreads_cond);
dce16143 137#ifdef EMULATE_ATOMIC_REFCOUNTS
533c011a 138 MUTEX_INIT(&PL_svref_mutex);
dce16143 139#endif /* EMULATE_ATOMIC_REFCOUNTS */
a863c7d1 140
199100c8 141 thr = init_main_thread();
11343788
MB
142#endif /* USE_THREADS */
143
3280af22
NIS
144 PL_linestr = NEWSV(65,79);
145 sv_upgrade(PL_linestr,SVt_PVIV);
79072805 146
3280af22 147 if (!SvREADONLY(&PL_sv_undef)) {
d689ffdd
JP
148 /* set read-only and try to insure than we wont see REFCNT==0
149 very often */
150
3280af22
NIS
151 SvREADONLY_on(&PL_sv_undef);
152 SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
79072805 153
3280af22
NIS
154 sv_setpv(&PL_sv_no,PL_No);
155 SvNV(&PL_sv_no);
156 SvREADONLY_on(&PL_sv_no);
157 SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
79072805 158
3280af22
NIS
159 sv_setpv(&PL_sv_yes,PL_Yes);
160 SvNV(&PL_sv_yes);
161 SvREADONLY_on(&PL_sv_yes);
162 SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
6e72f9df 163 }
79072805 164
76e3520e
GS
165#ifdef PERL_OBJECT
166 /* TODO: */
6b88bc9c 167 /* PL_sighandlerp = sighandler; */
76e3520e 168#else
3280af22 169 PL_sighandlerp = sighandler;
76e3520e 170#endif
3280af22 171 PL_pidstatus = newHV();
44a8e56a 172
79072805
LW
173#ifdef MSDOS
174 /*
175 * There is no way we can refer to them from Perl so close them to save
176 * space. The other alternative would be to provide STDAUX and STDPRN
177 * filehandles.
178 */
179 (void)fclose(stdaux);
180 (void)fclose(stdprn);
181#endif
182 }
183
3280af22
NIS
184 PL_nrs = newSVpv("\n", 1);
185 PL_rs = SvREFCNT_inc(PL_nrs);
dc92893f 186
1a441de9 187 init_stacks(ARGS);
8990e307 188#ifdef MULTIPLICITY
cb68f92d 189 init_interp();
8f872242 190 PL_perl_destruct_level = 1;
8ebc5c01 191#else
3280af22 192 if (PL_perl_destruct_level > 0)
cb68f92d 193 init_interp();
79072805
LW
194#endif
195
748a9306 196 init_ids();
3280af22 197 PL_lex_state = LEX_NOTPARSING;
a5f75d66 198
3280af22
NIS
199 PL_start_env.je_prev = NULL;
200 PL_start_env.je_ret = -1;
201 PL_start_env.je_mustcatch = TRUE;
202 PL_top_env = &PL_start_env;
f86702cc 203 STATUS_ALL_SUCCESS;
204
36477c24 205 SET_NUMERIC_STANDARD();
a5f75d66 206#if defined(SUBVERSION) && SUBVERSION > 0
3280af22 207 sprintf(PL_patchlevel, "%7.5f", (double) 5
e2666263 208 + ((double) PATCHLEVEL / (double) 1000)
209 + ((double) SUBVERSION / (double) 100000));
a5f75d66 210#else
6b88bc9c 211 sprintf(PL_patchlevel, "%5.3f", (double) 5 +
e2666263 212 ((double) PATCHLEVEL / (double) 1000));
a5f75d66 213#endif
79072805 214
ab821d7f 215#if defined(LOCAL_PATCH_COUNT)
3280af22 216 PL_localpatches = local_patches; /* For possible -v */
ab821d7f 217#endif
218
4b556e6c 219 PerlIO_init(); /* Hook to IO system */
760ac839 220
3280af22
NIS
221 PL_fdpid = newAV(); /* for remembering popen pids by fd */
222 PL_modglobal = newHV(); /* pointers to per-interpreter module globals */
8990e307 223
11343788 224 DEBUG( {
3280af22
NIS
225 New(51,PL_debname,128,char);
226 New(52,PL_debdelim,128,char);
11343788
MB
227 } )
228
8990e307 229 ENTER;
79072805
LW
230}
231
232void
76e3520e
GS
233#ifdef PERL_OBJECT
234CPerlObj::perl_destruct(void)
235#else
8ac85365 236perl_destruct(register PerlInterpreter *sv_interp)
76e3520e 237#endif
79072805 238{
11343788 239 dTHR;
748a9306 240 int destruct_level; /* 0=none, 1=full, 2=full with checks */
8990e307 241 I32 last_sv_count;
a0d0e21e 242 HV *hv;
1f2bfc8a 243#ifdef USE_THREADS
33f46ff6 244 Thread t;
1f2bfc8a 245#endif /* USE_THREADS */
8990e307 246
76e3520e 247#ifndef PERL_OBJECT
3280af22 248 if (!(PL_curinterp = sv_interp))
79072805 249 return;
76e3520e 250#endif
748a9306 251
11343788 252#ifdef USE_THREADS
0f15f207 253#ifndef FAKE_THREADS
8023c3ce
MB
254 /* Pass 1 on any remaining threads: detach joinables, join zombies */
255 retry_cleanup:
533c011a 256 MUTEX_LOCK(&PL_threads_mutex);
8b73bbec 257 DEBUG_S(PerlIO_printf(PerlIO_stderr(),
c7848ba1 258 "perl_destruct: waiting for %d threads...\n",
533c011a 259 PL_nthreads - 1));
33f46ff6 260 for (t = thr->next; t != thr; t = t->next) {
605e5515
MB
261 MUTEX_LOCK(&t->mutex);
262 switch (ThrSTATE(t)) {
263 AV *av;
c7848ba1 264 case THRf_ZOMBIE:
8b73bbec 265 DEBUG_S(PerlIO_printf(PerlIO_stderr(),
c7848ba1 266 "perl_destruct: joining zombie %p\n", t));
605e5515
MB
267 ThrSETSTATE(t, THRf_DEAD);
268 MUTEX_UNLOCK(&t->mutex);
533c011a 269 PL_nthreads--;
8023c3ce
MB
270 /*
271 * The SvREFCNT_dec below may take a long time (e.g. av
272 * may contain an object scalar whose destructor gets
273 * called) so we have to unlock threads_mutex and start
274 * all over again.
275 */
533c011a 276 MUTEX_UNLOCK(&PL_threads_mutex);
ea0efc06 277 JOIN(t, &av);
605e5515 278 SvREFCNT_dec((SV*)av);
8b73bbec 279 DEBUG_S(PerlIO_printf(PerlIO_stderr(),
c7848ba1 280 "perl_destruct: joined zombie %p OK\n", t));
8023c3ce 281 goto retry_cleanup;
c7848ba1 282 case THRf_R_JOINABLE:
8b73bbec 283 DEBUG_S(PerlIO_printf(PerlIO_stderr(),
c7848ba1
MB
284 "perl_destruct: detaching thread %p\n", t));
285 ThrSETSTATE(t, THRf_R_DETACHED);
286 /*
287 * We unlock threads_mutex and t->mutex in the opposite order
288 * from which we locked them just so that DETACH won't
289 * deadlock if it panics. It's only a breach of good style
290 * not a bug since they are unlocks not locks.
291 */
533c011a 292 MUTEX_UNLOCK(&PL_threads_mutex);
c7848ba1
MB
293 DETACH(t);
294 MUTEX_UNLOCK(&t->mutex);
8023c3ce 295 goto retry_cleanup;
c7848ba1 296 default:
8b73bbec 297 DEBUG_S(PerlIO_printf(PerlIO_stderr(),
c7848ba1
MB
298 "perl_destruct: ignoring %p (state %u)\n",
299 t, ThrSTATE(t)));
300 MUTEX_UNLOCK(&t->mutex);
c7848ba1 301 /* fall through and out */
33f46ff6
MB
302 }
303 }
8023c3ce
MB
304 /* We leave the above "Pass 1" loop with threads_mutex still locked */
305
306 /* Pass 2 on remaining threads: wait for the thread count to drop to one */
533c011a 307 while (PL_nthreads > 1)
11343788 308 {
8b73bbec 309 DEBUG_S(PerlIO_printf(PerlIO_stderr(),
c7848ba1 310 "perl_destruct: final wait for %d threads\n",
533c011a
NIS
311 PL_nthreads - 1));
312 COND_WAIT(&PL_nthreads_cond, &PL_threads_mutex);
11343788
MB
313 }
314 /* At this point, we're the last thread */
533c011a 315 MUTEX_UNLOCK(&PL_threads_mutex);
8b73bbec 316 DEBUG_S(PerlIO_printf(PerlIO_stderr(), "perl_destruct: armageddon has arrived\n"));
533c011a
NIS
317 MUTEX_DESTROY(&PL_threads_mutex);
318 COND_DESTROY(&PL_nthreads_cond);
0f15f207 319#endif /* !defined(FAKE_THREADS) */
11343788
MB
320#endif /* USE_THREADS */
321
3280af22 322 destruct_level = PL_perl_destruct_level;
4633a7c4
LW
323#ifdef DEBUGGING
324 {
325 char *s;
76e3520e 326 if (s = PerlEnv_getenv("PERL_DESTRUCT_LEVEL")) {
5f05dabc 327 int i = atoi(s);
328 if (destruct_level < i)
329 destruct_level = i;
330 }
4633a7c4
LW
331 }
332#endif
333
8990e307 334 LEAVE;
a0d0e21e
LW
335 FREETMPS;
336
cb68f92d 337#ifdef MULTIPLICITY
8f872242 338 --PL_ninterps;
cb68f92d
GS
339#endif
340
ff0cee69 341 /* We must account for everything. */
342
343 /* Destroy the main CV and syntax tree */
3280af22
NIS
344 if (PL_main_root) {
345 PL_curpad = AvARRAY(PL_comppad);
346 op_free(PL_main_root);
347 PL_main_root = Nullop;
a0d0e21e 348 }
3280af22
NIS
349 PL_curcop = &PL_compiling;
350 PL_main_start = Nullop;
351 SvREFCNT_dec(PL_main_cv);
352 PL_main_cv = Nullcv;
ff0cee69 353
3280af22 354 if (PL_sv_objcount) {
a0d0e21e
LW
355 /*
356 * Try to destruct global references. We do this first so that the
357 * destructors and destructees still exist. Some sv's might remain.
358 * Non-referenced objects are on their own.
359 */
360
3280af22 361 PL_dirty = TRUE;
a0d0e21e 362 sv_clean_objs();
8990e307
LW
363 }
364
5cd24f17 365 /* unhook hooks which will soon be, or use, destroyed data */
3280af22
NIS
366 SvREFCNT_dec(PL_warnhook);
367 PL_warnhook = Nullsv;
368 SvREFCNT_dec(PL_diehook);
369 PL_diehook = Nullsv;
370 SvREFCNT_dec(PL_parsehook);
371 PL_parsehook = Nullsv;
5cd24f17 372
4b556e6c 373 /* call exit list functions */
3280af22
NIS
374 while (PL_exitlistlen-- > 0)
375 PL_exitlist[PL_exitlistlen].fn(PERL_OBJECT_THIS_ PL_exitlist[PL_exitlistlen].ptr);
4b556e6c 376
3280af22 377 Safefree(PL_exitlist);
4b556e6c 378
a0d0e21e 379 if (destruct_level == 0){
8990e307 380
a0d0e21e
LW
381 DEBUG_P(debprofdump());
382
383 /* The exit() function will do everything that needs doing. */
384 return;
385 }
5dd60ef7 386
5f05dabc 387 /* loosen bonds of global variables */
388
3280af22
NIS
389 if(PL_rsfp) {
390 (void)PerlIO_close(PL_rsfp);
391 PL_rsfp = Nullfp;
8ebc5c01 392 }
393
394 /* Filters for program text */
3280af22
NIS
395 SvREFCNT_dec(PL_rsfp_filters);
396 PL_rsfp_filters = Nullav;
8ebc5c01 397
398 /* switches */
3280af22
NIS
399 PL_preprocess = FALSE;
400 PL_minus_n = FALSE;
401 PL_minus_p = FALSE;
402 PL_minus_l = FALSE;
403 PL_minus_a = FALSE;
404 PL_minus_F = FALSE;
405 PL_doswitches = FALSE;
599cee73 406 PL_dowarn = G_WARN_OFF;
3280af22
NIS
407 PL_doextract = FALSE;
408 PL_sawampersand = FALSE; /* must save all match strings */
409 PL_sawstudy = FALSE; /* do fbm_instr on all strings */
410 PL_sawvec = FALSE;
411 PL_unsafe = FALSE;
412
413 Safefree(PL_inplace);
414 PL_inplace = Nullch;
415
416 if (PL_e_script) {
417 SvREFCNT_dec(PL_e_script);
418 PL_e_script = Nullsv;
8ebc5c01 419 }
420
421 /* magical thingies */
422
3280af22
NIS
423 Safefree(PL_ofs); /* $, */
424 PL_ofs = Nullch;
5f05dabc 425
3280af22
NIS
426 Safefree(PL_ors); /* $\ */
427 PL_ors = Nullch;
8ebc5c01 428
3280af22
NIS
429 SvREFCNT_dec(PL_rs); /* $/ */
430 PL_rs = Nullsv;
dc92893f 431
3280af22
NIS
432 SvREFCNT_dec(PL_nrs); /* $/ helper */
433 PL_nrs = Nullsv;
5f05dabc 434
3280af22 435 PL_multiline = 0; /* $* */
5f05dabc 436
3280af22
NIS
437 SvREFCNT_dec(PL_statname);
438 PL_statname = Nullsv;
439 PL_statgv = Nullgv;
5f05dabc 440
8ebc5c01 441 /* defgv, aka *_ should be taken care of elsewhere */
442
8ebc5c01 443 /* clean up after study() */
3280af22
NIS
444 SvREFCNT_dec(PL_lastscream);
445 PL_lastscream = Nullsv;
446 Safefree(PL_screamfirst);
447 PL_screamfirst = 0;
448 Safefree(PL_screamnext);
449 PL_screamnext = 0;
8ebc5c01 450
451 /* startup and shutdown function lists */
3280af22
NIS
452 SvREFCNT_dec(PL_beginav);
453 SvREFCNT_dec(PL_endav);
454 SvREFCNT_dec(PL_initav);
455 PL_beginav = Nullav;
456 PL_endav = Nullav;
457 PL_initav = Nullav;
5618dfe8 458
8ebc5c01 459 /* shortcuts just get cleared */
3280af22
NIS
460 PL_envgv = Nullgv;
461 PL_siggv = Nullgv;
462 PL_incgv = Nullgv;
463 PL_hintgv = Nullgv;
464 PL_errgv = Nullgv;
465 PL_argvgv = Nullgv;
466 PL_argvoutgv = Nullgv;
467 PL_stdingv = Nullgv;
468 PL_last_in_gv = Nullgv;
469 PL_replgv = Nullgv;
8ebc5c01 470
471 /* reset so print() ends up where we expect */
472 setdefout(Nullgv);
473
a0d0e21e 474 /* Prepare to destruct main symbol table. */
5f05dabc 475
3280af22
NIS
476 hv = PL_defstash;
477 PL_defstash = 0;
a0d0e21e
LW
478 SvREFCNT_dec(hv);
479
480 FREETMPS;
481 if (destruct_level >= 2) {
3280af22 482 if (PL_scopestack_ix != 0)
ff0cee69 483 warn("Unbalanced scopes: %ld more ENTERs than LEAVEs\n",
3280af22
NIS
484 (long)PL_scopestack_ix);
485 if (PL_savestack_ix != 0)
ff0cee69 486 warn("Unbalanced saves: %ld more saves than restores\n",
3280af22
NIS
487 (long)PL_savestack_ix);
488 if (PL_tmps_floor != -1)
ff0cee69 489 warn("Unbalanced tmps: %ld more allocs than frees\n",
3280af22 490 (long)PL_tmps_floor + 1);
a0d0e21e 491 if (cxstack_ix != -1)
ff0cee69 492 warn("Unbalanced context: %ld more PUSHes than POPs\n",
493 (long)cxstack_ix + 1);
a0d0e21e 494 }
8990e307
LW
495
496 /* Now absolutely destruct everything, somehow or other, loops or no. */
8990e307 497 last_sv_count = 0;
3280af22
NIS
498 SvFLAGS(PL_strtab) |= SVTYPEMASK; /* don't clean out strtab now */
499 while (PL_sv_count != 0 && PL_sv_count != last_sv_count) {
500 last_sv_count = PL_sv_count;
8990e307
LW
501 sv_clean_all();
502 }
3280af22
NIS
503 SvFLAGS(PL_strtab) &= ~SVTYPEMASK;
504 SvFLAGS(PL_strtab) |= SVt_PVHV;
6e72f9df 505
506 /* Destruct the global string table. */
507 {
508 /* Yell and reset the HeVAL() slots that are still holding refcounts,
509 * so that sv_free() won't fail on them.
510 */
511 I32 riter;
512 I32 max;
513 HE *hent;
514 HE **array;
515
516 riter = 0;
3280af22
NIS
517 max = HvMAX(PL_strtab);
518 array = HvARRAY(PL_strtab);
6e72f9df 519 hent = array[0];
520 for (;;) {
521 if (hent) {
522 warn("Unbalanced string table refcount: (%d) for \"%s\"",
523 HeVAL(hent) - Nullsv, HeKEY(hent));
524 HeVAL(hent) = Nullsv;
525 hent = HeNEXT(hent);
526 }
527 if (!hent) {
528 if (++riter > max)
529 break;
530 hent = array[riter];
531 }
532 }
533 }
3280af22 534 SvREFCNT_dec(PL_strtab);
6e72f9df 535
3280af22
NIS
536 if (PL_sv_count != 0)
537 warn("Scalars leaked: %ld\n", (long)PL_sv_count);
6e72f9df 538
4633a7c4 539 sv_free_arenas();
44a8e56a 540
541 /* No SVs have survived, need to clean out */
3280af22
NIS
542 PL_linestr = NULL;
543 PL_pidstatus = Nullhv;
544 Safefree(PL_origfilename);
545 Safefree(PL_archpat_auto);
546 Safefree(PL_reg_start_tmp);
547 Safefree(HeKEY_hek(&PL_hv_fetch_ent_mh));
548 Safefree(PL_op_mask);
6e72f9df 549 nuke_stacks();
3280af22 550 PL_hints = 0; /* Reset hints. Should hints be per-interpreter ? */
a0d0e21e
LW
551
552 DEBUG_P(debprofdump());
11343788 553#ifdef USE_THREADS
533c011a
NIS
554 MUTEX_DESTROY(&PL_sv_mutex);
555 MUTEX_DESTROY(&PL_eval_mutex);
556 COND_DESTROY(&PL_eval_cond);
fc36a67e 557
8023c3ce 558 /* As the penultimate thing, free the non-arena SV for thrsv */
533c011a
NIS
559 Safefree(SvPVX(PL_thrsv));
560 Safefree(SvANY(PL_thrsv));
561 Safefree(PL_thrsv);
562 PL_thrsv = Nullsv;
8023c3ce
MB
563#endif /* USE_THREADS */
564
fc36a67e 565 /* As the absolutely last thing, free the non-arena SV for mess() */
566
3280af22 567 if (PL_mess_sv) {
9c63abab
GS
568 /* it could have accumulated taint magic */
569 if (SvTYPE(PL_mess_sv) >= SVt_PVMG) {
570 MAGIC* mg;
571 MAGIC* moremagic;
572 for (mg = SvMAGIC(PL_mess_sv); mg; mg = moremagic) {
573 moremagic = mg->mg_moremagic;
574 if (mg->mg_ptr && mg->mg_type != 'g' && mg->mg_len >= 0)
575 Safefree(mg->mg_ptr);
576 Safefree(mg);
577 }
578 }
fc36a67e 579 /* we know that type >= SVt_PV */
3280af22
NIS
580 SvOOK_off(PL_mess_sv);
581 Safefree(SvPVX(PL_mess_sv));
582 Safefree(SvANY(PL_mess_sv));
583 Safefree(PL_mess_sv);
584 PL_mess_sv = Nullsv;
fc36a67e 585 }
79072805
LW
586}
587
588void
76e3520e
GS
589#ifdef PERL_OBJECT
590CPerlObj::perl_free(void)
591#else
8ac85365 592perl_free(PerlInterpreter *sv_interp)
76e3520e 593#endif
79072805 594{
76e3520e 595#ifdef PERL_OBJECT
565764a8 596 Safefree(this);
76e3520e 597#else
3280af22 598 if (!(PL_curinterp = sv_interp))
79072805
LW
599 return;
600 Safefree(sv_interp);
76e3520e 601#endif
79072805
LW
602}
603
4b556e6c 604void
873ef191
GS
605#ifdef PERL_OBJECT
606CPerlObj::perl_atexit(void (*fn) (CPerlObj*,void *), void *ptr)
607#else
4b556e6c 608perl_atexit(void (*fn) (void *), void *ptr)
873ef191 609#endif
4b556e6c 610{
3280af22
NIS
611 Renew(PL_exitlist, PL_exitlistlen+1, PerlExitListEntry);
612 PL_exitlist[PL_exitlistlen].fn = fn;
613 PL_exitlist[PL_exitlistlen].ptr = ptr;
614 ++PL_exitlistlen;
4b556e6c
JD
615}
616
79072805 617int
76e3520e
GS
618#ifdef PERL_OBJECT
619CPerlObj::perl_parse(void (*xsinit) (CPerlObj*), int argc, char **argv, char **env)
620#else
8ac85365 621perl_parse(PerlInterpreter *sv_interp, void (*xsinit) (void), int argc, char **argv, char **env)
76e3520e 622#endif
8d063cd8 623{
11343788 624 dTHR;
6224f72b
GS
625 register SV *sv;
626 register char *s;
627 char *scriptname = NULL;
628 VOL bool dosearch = FALSE;
629 char *validarg = "";
630 I32 oldscope;
631 AV* comppadlist;
632 dJMPENV;
633 int ret;
634 int fdscript = -1;
8d063cd8 635
a687059c
LW
636#ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
637#ifdef IAMSUID
638#undef IAMSUID
463ee0b2 639 croak("suidperl is no longer needed since the kernel can now execute\n\
a687059c
LW
640setuid perl scripts securely.\n");
641#endif
642#endif
643
76e3520e 644#ifndef PERL_OBJECT
3280af22 645 if (!(PL_curinterp = sv_interp))
79072805 646 return 255;
76e3520e 647#endif
79072805 648
6e72f9df 649#if defined(NeXT) && defined(__DYNAMIC__)
650 _dyld_lookup_and_bind
651 ("__environ", (unsigned long *) &environ_pointer, NULL);
652#endif /* environ */
653
3280af22
NIS
654 PL_origargv = argv;
655 PL_origargc = argc;
a0d0e21e 656#ifndef VMS /* VMS doesn't have environ array */
3280af22 657 PL_origenviron = environ;
a0d0e21e
LW
658#endif
659
3280af22 660 if (PL_do_undump) {
a0d0e21e
LW
661
662 /* Come here if running an undumped a.out. */
663
3280af22
NIS
664 PL_origfilename = savepv(argv[0]);
665 PL_do_undump = FALSE;
a0d0e21e 666 cxstack_ix = -1; /* start label stack again */
748a9306 667 init_ids();
a0d0e21e
LW
668 init_postdump_symbols(argc,argv,env);
669 return 0;
670 }
671
3280af22
NIS
672 if (PL_main_root) {
673 PL_curpad = AvARRAY(PL_comppad);
674 op_free(PL_main_root);
675 PL_main_root = Nullop;
ff0cee69 676 }
3280af22
NIS
677 PL_main_start = Nullop;
678 SvREFCNT_dec(PL_main_cv);
679 PL_main_cv = Nullcv;
79072805 680
3280af22
NIS
681 time(&PL_basetime);
682 oldscope = PL_scopestack_ix;
599cee73 683 PL_dowarn = G_WARN_OFF;
f86702cc 684
6224f72b
GS
685 JMPENV_PUSH(ret);
686 switch (ret) {
687 case 1:
688 STATUS_ALL_FAILURE;
689 /* FALL THROUGH */
690 case 2:
691 /* my_exit() was called */
3280af22 692 while (PL_scopestack_ix > oldscope)
6224f72b
GS
693 LEAVE;
694 FREETMPS;
3280af22
NIS
695 PL_curstash = PL_defstash;
696 if (PL_endav)
697 call_list(oldscope, PL_endav);
6224f72b
GS
698 JMPENV_POP;
699 return STATUS_NATIVE_EXPORT;
700 case 3:
701 JMPENV_POP;
702 PerlIO_printf(PerlIO_stderr(), "panic: top_env\n");
703 return 1;
704 }
79072805 705
3280af22 706 sv_setpvn(PL_linestr,"",0);
6224f72b
GS
707 sv = newSVpv("",0); /* first used for -I flags */
708 SAVEFREESV(sv);
709 init_main_stash();
54310121 710
6224f72b
GS
711 for (argc--,argv++; argc > 0; argc--,argv++) {
712 if (argv[0][0] != '-' || !argv[0][1])
713 break;
714#ifdef DOSUID
715 if (*validarg)
716 validarg = " PHOOEY ";
717 else
718 validarg = argv[0];
13281fa4 719#endif
6224f72b
GS
720 s = argv[0]+1;
721 reswitch:
722 switch (*s) {
723 case ' ':
724 case '0':
725 case 'F':
726 case 'a':
727 case 'c':
728 case 'd':
729 case 'D':
730 case 'h':
731 case 'i':
732 case 'l':
733 case 'M':
734 case 'm':
735 case 'n':
736 case 'p':
737 case 's':
738 case 'u':
739 case 'U':
740 case 'v':
599cee73
PM
741 case 'W':
742 case 'X':
6224f72b
GS
743 case 'w':
744 if (s = moreswitches(s))
745 goto reswitch;
746 break;
33b78306 747
6224f72b 748 case 'T':
3280af22 749 PL_tainting = TRUE;
6224f72b
GS
750 s++;
751 goto reswitch;
f86702cc 752
6224f72b 753 case 'e':
3280af22 754 if (PL_euid != PL_uid || PL_egid != PL_gid)
6224f72b 755 croak("No -e allowed in setuid scripts");
3280af22
NIS
756 if (!PL_e_script) {
757 PL_e_script = newSVpv("",0);
6224f72b
GS
758 filter_add(read_e_script, NULL);
759 }
760 if (*++s)
3280af22 761 sv_catpv(PL_e_script, s);
6224f72b 762 else if (argv[1]) {
3280af22 763 sv_catpv(PL_e_script, argv[1]);
6224f72b
GS
764 argc--,argv++;
765 }
766 else
767 croak("No code specified for -e");
3280af22 768 sv_catpv(PL_e_script, "\n");
6224f72b 769 break;
afe37c7d 770
6224f72b
GS
771 case 'I': /* -I handled both here and in moreswitches() */
772 forbid_setid("-I");
773 if (!*++s && (s=argv[1]) != Nullch) {
774 argc--,argv++;
775 }
776 while (s && isSPACE(*s))
777 ++s;
778 if (s && *s) {
779 char *e, *p;
780 for (e = s; *e && !isSPACE(*e); e++) ;
781 p = savepvn(s, e-s);
782 incpush(p, TRUE);
783 sv_catpv(sv,"-I");
784 sv_catpv(sv,p);
785 sv_catpv(sv," ");
786 Safefree(p);
787 } /* XXX else croak? */
788 break;
789 case 'P':
790 forbid_setid("-P");
3280af22 791 PL_preprocess = TRUE;
6224f72b
GS
792 s++;
793 goto reswitch;
794 case 'S':
795 forbid_setid("-S");
796 dosearch = TRUE;
797 s++;
798 goto reswitch;
799 case 'V':
3280af22
NIS
800 if (!PL_preambleav)
801 PL_preambleav = newAV();
802 av_push(PL_preambleav, newSVpv("use Config qw(myconfig config_vars)",0));
6224f72b 803 if (*++s != ':') {
3280af22 804 PL_Sv = newSVpv("print myconfig();",0);
6224f72b 805#ifdef VMS
6b88bc9c 806 sv_catpv(PL_Sv,"print \"\\nCharacteristics of this PERLSHR image: \\n\",");
6224f72b 807#else
3280af22 808 sv_catpv(PL_Sv,"print \"\\nCharacteristics of this binary (from libperl): \\n\",");
6224f72b
GS
809#endif
810#if defined(DEBUGGING) || defined(NO_EMBED) || defined(MULTIPLICITY)
3280af22 811 sv_catpv(PL_Sv,"\" Compile-time options:");
6224f72b 812# ifdef DEBUGGING
3280af22 813 sv_catpv(PL_Sv," DEBUGGING");
6224f72b
GS
814# endif
815# ifdef NO_EMBED
6b88bc9c 816 sv_catpv(PL_Sv," NO_EMBED");
6224f72b
GS
817# endif
818# ifdef MULTIPLICITY
8f872242 819 sv_catpv(PL_Sv," MULTIPLICITY");
6224f72b 820# endif
3280af22 821 sv_catpv(PL_Sv,"\\n\",");
6224f72b
GS
822#endif
823#if defined(LOCAL_PATCH_COUNT)
824 if (LOCAL_PATCH_COUNT > 0) {
825 int i;
3280af22 826 sv_catpv(PL_Sv,"\" Locally applied patches:\\n\",");
6224f72b 827 for (i = 1; i <= LOCAL_PATCH_COUNT; i++) {
3280af22
NIS
828 if (PL_localpatches[i])
829 sv_catpvf(PL_Sv,"\" \\t%s\\n\",",PL_localpatches[i]);
6224f72b
GS
830 }
831 }
832#endif
3280af22 833 sv_catpvf(PL_Sv,"\" Built under %s\\n\"",OSNAME);
6224f72b
GS
834#ifdef __DATE__
835# ifdef __TIME__
3280af22 836 sv_catpvf(PL_Sv,",\" Compiled at %s %s\\n\"",__DATE__,__TIME__);
6224f72b 837# else
6b88bc9c 838 sv_catpvf(PL_Sv,",\" Compiled on %s\\n\"",__DATE__);
6224f72b
GS
839# endif
840#endif
3280af22 841 sv_catpv(PL_Sv, "; \
6224f72b
GS
842$\"=\"\\n \"; \
843@env = map { \"$_=\\\"$ENV{$_}\\\"\" } sort grep {/^PERL/} keys %ENV; \
844print \" \\%ENV:\\n @env\\n\" if @env; \
845print \" \\@INC:\\n @INC\\n\";");
846 }
847 else {
3280af22
NIS
848 PL_Sv = newSVpv("config_vars(qw(",0);
849 sv_catpv(PL_Sv, ++s);
850 sv_catpv(PL_Sv, "))");
6224f72b
GS
851 s += strlen(s);
852 }
3280af22 853 av_push(PL_preambleav, PL_Sv);
6224f72b
GS
854 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
855 goto reswitch;
856 case 'x':
3280af22 857 PL_doextract = TRUE;
6224f72b
GS
858 s++;
859 if (*s)
3280af22 860 PL_cddir = savepv(s);
6224f72b
GS
861 break;
862 case 0:
863 break;
864 case '-':
865 if (!*++s || isSPACE(*s)) {
866 argc--,argv++;
867 goto switch_end;
868 }
869 /* catch use of gnu style long options */
870 if (strEQ(s, "version")) {
871 s = "v";
872 goto reswitch;
873 }
874 if (strEQ(s, "help")) {
875 s = "h";
876 goto reswitch;
877 }
878 s--;
879 /* FALL THROUGH */
880 default:
881 croak("Unrecognized switch: -%s (-h will show valid options)",s);
8d063cd8
LW
882 }
883 }
6224f72b 884 switch_end:
54310121 885
3280af22 886 if (!PL_tainting && (s = PerlEnv_getenv("PERL5OPT"))) {
6224f72b
GS
887 while (s && *s) {
888 while (isSPACE(*s))
889 s++;
890 if (*s == '-') {
891 s++;
892 if (isSPACE(*s))
893 continue;
894 }
895 if (!*s)
896 break;
897 if (!strchr("DIMUdmw", *s))
898 croak("Illegal switch in PERL5OPT: -%c", *s);
899 s = moreswitches(s);
900 }
901 }
a0d0e21e 902
6224f72b
GS
903 if (!scriptname)
904 scriptname = argv[0];
3280af22 905 if (PL_e_script) {
6224f72b
GS
906 argc++,argv--;
907 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
908 }
909 else if (scriptname == Nullch) {
910#ifdef MSDOS
911 if ( PerlLIO_isatty(PerlIO_fileno(PerlIO_stdin())) )
912 moreswitches("h");
913#endif
914 scriptname = "-";
915 }
916
917 init_perllib();
918
919 open_script(scriptname,dosearch,sv,&fdscript);
920
921 validate_suid(validarg, scriptname,fdscript);
922
3280af22 923 if (PL_doextract)
6224f72b
GS
924 find_beginning();
925
3280af22
NIS
926 PL_main_cv = PL_compcv = (CV*)NEWSV(1104,0);
927 sv_upgrade((SV *)PL_compcv, SVt_PVCV);
928 CvUNIQUE_on(PL_compcv);
929
930 PL_comppad = newAV();
931 av_push(PL_comppad, Nullsv);
932 PL_curpad = AvARRAY(PL_comppad);
933 PL_comppad_name = newAV();
934 PL_comppad_name_fill = 0;
935 PL_min_intro_pending = 0;
936 PL_padix = 0;
6224f72b 937#ifdef USE_THREADS
533c011a
NIS
938 av_store(PL_comppad_name, 0, newSVpv("@_", 2));
939 PL_curpad[0] = (SV*)newAV();
940 SvPADMY_on(PL_curpad[0]); /* XXX Needed? */
941 CvOWNER(PL_compcv) = 0;
942 New(666, CvMUTEXP(PL_compcv), 1, perl_mutex);
943 MUTEX_INIT(CvMUTEXP(PL_compcv));
6224f72b
GS
944#endif /* USE_THREADS */
945
946 comppadlist = newAV();
947 AvREAL_off(comppadlist);
3280af22
NIS
948 av_store(comppadlist, 0, (SV*)PL_comppad_name);
949 av_store(comppadlist, 1, (SV*)PL_comppad);
950 CvPADLIST(PL_compcv) = comppadlist;
6224f72b
GS
951
952 boot_core_UNIVERSAL();
953
954 if (xsinit)
955 (*xsinit)(PERL_OBJECT_THIS); /* in case linked C routines want magical variables */
956#if defined(VMS) || defined(WIN32) || defined(DJGPP)
957 init_os_extras();
958#endif
959
960 init_predump_symbols();
961 /* init_postdump_symbols not currently designed to be called */
962 /* more than once (ENV isn't cleared first, for example) */
963 /* But running with -u leaves %ENV & @ARGV undefined! XXX */
3280af22 964 if (!PL_do_undump)
6224f72b
GS
965 init_postdump_symbols(argc,argv,env);
966
967 init_lexer();
968
969 /* now parse the script */
970
971 SETERRNO(0,SS$_NORMAL);
3280af22
NIS
972 PL_error_count = 0;
973 if (yyparse() || PL_error_count) {
974 if (PL_minus_c)
975 croak("%s had compilation errors.\n", PL_origfilename);
6224f72b
GS
976 else {
977 croak("Execution of %s aborted due to compilation errors.\n",
3280af22 978 PL_origfilename);
6224f72b
GS
979 }
980 }
3280af22
NIS
981 PL_curcop->cop_line = 0;
982 PL_curstash = PL_defstash;
983 PL_preprocess = FALSE;
984 if (PL_e_script) {
985 SvREFCNT_dec(PL_e_script);
986 PL_e_script = Nullsv;
6224f72b
GS
987 }
988
989 /* now that script is parsed, we can modify record separator */
3280af22
NIS
990 SvREFCNT_dec(PL_rs);
991 PL_rs = SvREFCNT_inc(PL_nrs);
992 sv_setsv(perl_get_sv("/", TRUE), PL_rs);
993 if (PL_do_undump)
6224f72b
GS
994 my_unexec();
995
599cee73 996 if (ckWARN(WARN_ONCE))
3280af22 997 gv_check(PL_defstash);
6224f72b
GS
998
999 LEAVE;
1000 FREETMPS;
1001
1002#ifdef MYMALLOC
1003 if ((s=PerlEnv_getenv("PERL_DEBUG_MSTATS")) && atoi(s) >= 2)
1004 dump_mstats("after compilation:");
1005#endif
1006
1007 ENTER;
3280af22 1008 PL_restartop = 0;
6224f72b
GS
1009 JMPENV_POP;
1010 return 0;
1011}
1012
1013int
1014#ifdef PERL_OBJECT
1015CPerlObj::perl_run(void)
1016#else
1017perl_run(PerlInterpreter *sv_interp)
1018#endif
1019{
1020 dSP;
1021 I32 oldscope;
1022 dJMPENV;
1023 int ret;
1024
1025#ifndef PERL_OBJECT
3280af22 1026 if (!(PL_curinterp = sv_interp))
6224f72b
GS
1027 return 255;
1028#endif
1029
3280af22 1030 oldscope = PL_scopestack_ix;
6224f72b
GS
1031
1032 JMPENV_PUSH(ret);
1033 switch (ret) {
1034 case 1:
1035 cxstack_ix = -1; /* start context stack again */
1036 break;
1037 case 2:
1038 /* my_exit() was called */
3280af22 1039 while (PL_scopestack_ix > oldscope)
6224f72b
GS
1040 LEAVE;
1041 FREETMPS;
3280af22
NIS
1042 PL_curstash = PL_defstash;
1043 if (PL_endav)
1044 call_list(oldscope, PL_endav);
6224f72b
GS
1045#ifdef MYMALLOC
1046 if (PerlEnv_getenv("PERL_DEBUG_MSTATS"))
1047 dump_mstats("after execution: ");
1048#endif
1049 JMPENV_POP;
1050 return STATUS_NATIVE_EXPORT;
1051 case 3:
3280af22 1052 if (!PL_restartop) {
6224f72b
GS
1053 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
1054 FREETMPS;
1055 JMPENV_POP;
1056 return 1;
1057 }
3280af22 1058 POPSTACK_TO(PL_mainstack);
6224f72b
GS
1059 break;
1060 }
1061
1062 DEBUG_r(PerlIO_printf(Perl_debug_log, "%s $` $& $' support.\n",
3280af22 1063 PL_sawampersand ? "Enabling" : "Omitting"));
6224f72b 1064
3280af22 1065 if (!PL_restartop) {
6224f72b
GS
1066 DEBUG_x(dump_all());
1067 DEBUG(PerlIO_printf(Perl_debug_log, "\nEXECUTING...\n\n"));
8b73bbec 1068 DEBUG_S(PerlIO_printf(Perl_debug_log, "main thread is 0x%lx\n",
6224f72b 1069 (unsigned long) thr));
6224f72b 1070
3280af22
NIS
1071 if (PL_minus_c) {
1072 PerlIO_printf(PerlIO_stderr(), "%s syntax OK\n", PL_origfilename);
6224f72b
GS
1073 my_exit(0);
1074 }
3280af22
NIS
1075 if (PERLDB_SINGLE && PL_DBsingle)
1076 sv_setiv(PL_DBsingle, 1);
1077 if (PL_initav)
1078 call_list(oldscope, PL_initav);
6224f72b
GS
1079 }
1080
1081 /* do it */
1082
3280af22 1083 if (PL_restartop) {
533c011a 1084 PL_op = PL_restartop;
3280af22 1085 PL_restartop = 0;
6224f72b
GS
1086 CALLRUNOPS();
1087 }
3280af22
NIS
1088 else if (PL_main_start) {
1089 CvDEPTH(PL_main_cv) = 1;
533c011a 1090 PL_op = PL_main_start;
6224f72b
GS
1091 CALLRUNOPS();
1092 }
1093
1094 my_exit(0);
1095 /* NOTREACHED */
1096 return 0;
1097}
1098
1099SV*
1100perl_get_sv(char *name, I32 create)
1101{
1102 GV *gv;
1103#ifdef USE_THREADS
1104 if (name[1] == '\0' && !isALPHA(name[0])) {
1105 PADOFFSET tmp = find_threadsv(name);
1106 if (tmp != NOT_IN_PAD) {
1107 dTHR;
1108 return THREADSV(tmp);
1109 }
1110 }
1111#endif /* USE_THREADS */
1112 gv = gv_fetchpv(name, create, SVt_PV);
1113 if (gv)
1114 return GvSV(gv);
1115 return Nullsv;
1116}
1117
1118AV*
1119perl_get_av(char *name, I32 create)
1120{
1121 GV* gv = gv_fetchpv(name, create, SVt_PVAV);
1122 if (create)
1123 return GvAVn(gv);
1124 if (gv)
1125 return GvAV(gv);
1126 return Nullav;
1127}
1128
1129HV*
1130perl_get_hv(char *name, I32 create)
1131{
a0d0e21e
LW
1132 GV* gv = gv_fetchpv(name, create, SVt_PVHV);
1133 if (create)
1134 return GvHVn(gv);
1135 if (gv)
1136 return GvHV(gv);
1137 return Nullhv;
1138}
1139
1140CV*
8ac85365 1141perl_get_cv(char *name, I32 create)
a0d0e21e
LW
1142{
1143 GV* gv = gv_fetchpv(name, create, SVt_PVCV);
8ebc5c01 1144 if (create && !GvCVu(gv))
774d564b 1145 return newSUB(start_subparse(FALSE, 0),
a0d0e21e 1146 newSVOP(OP_CONST, 0, newSVpv(name,0)),
4633a7c4 1147 Nullop,
a0d0e21e
LW
1148 Nullop);
1149 if (gv)
8ebc5c01 1150 return GvCVu(gv);
a0d0e21e
LW
1151 return Nullcv;
1152}
1153
79072805
LW
1154/* Be sure to refetch the stack pointer after calling these routines. */
1155
a0d0e21e 1156I32
22239a37 1157perl_call_argv(char *sub_name, I32 flags, register char **argv)
8ac85365
NIS
1158
1159 /* See G_* flags in cop.h */
1160 /* null terminated arg list */
8990e307 1161{
a0d0e21e 1162 dSP;
8990e307 1163
924508f0 1164 PUSHMARK(SP);
a0d0e21e 1165 if (argv) {
8990e307 1166 while (*argv) {
a0d0e21e 1167 XPUSHs(sv_2mortal(newSVpv(*argv,0)));
8990e307
LW
1168 argv++;
1169 }
a0d0e21e 1170 PUTBACK;
8990e307 1171 }
22239a37 1172 return perl_call_pv(sub_name, flags);
8990e307
LW
1173}
1174
a0d0e21e 1175I32
22239a37 1176perl_call_pv(char *sub_name, I32 flags)
8ac85365
NIS
1177 /* name of the subroutine */
1178 /* See G_* flags in cop.h */
a0d0e21e 1179{
22239a37 1180 return perl_call_sv((SV*)perl_get_cv(sub_name, TRUE), flags);
a0d0e21e
LW
1181}
1182
1183I32
8ac85365
NIS
1184perl_call_method(char *methname, I32 flags)
1185 /* name of the subroutine */
1186 /* See G_* flags in cop.h */
a0d0e21e
LW
1187{
1188 dSP;
1189 OP myop;
533c011a
NIS
1190 if (!PL_op)
1191 PL_op = &myop;
a0d0e21e
LW
1192 XPUSHs(sv_2mortal(newSVpv(methname,0)));
1193 PUTBACK;
11343788 1194 pp_method(ARGS);
533c011a
NIS
1195 if(PL_op == &myop)
1196 PL_op = Nullop;
3280af22 1197 return perl_call_sv(*PL_stack_sp--, flags);
a0d0e21e
LW
1198}
1199
1200/* May be called with any of a CV, a GV, or an SV containing the name. */
1201I32
8ac85365
NIS
1202perl_call_sv(SV *sv, I32 flags)
1203
1204 /* See G_* flags in cop.h */
a0d0e21e 1205{
924508f0 1206 dSP;
a0d0e21e 1207 LOGOP myop; /* fake syntax tree node */
aa689395 1208 I32 oldmark;
a0d0e21e 1209 I32 retval;
a0d0e21e 1210 I32 oldscope;
54310121 1211 bool oldcatch = CATCH_GET;
1212 dJMPENV;
6224f72b 1213 int ret;
533c011a 1214 OP* oldop = PL_op;
1e422769 1215
a0d0e21e
LW
1216 if (flags & G_DISCARD) {
1217 ENTER;
1218 SAVETMPS;
1219 }
1220
aa689395 1221 Zero(&myop, 1, LOGOP);
54310121 1222 myop.op_next = Nullop;
f51d4af5 1223 if (!(flags & G_NOARGS))
aa689395 1224 myop.op_flags |= OPf_STACKED;
54310121 1225 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1226 (flags & G_ARRAY) ? OPf_WANT_LIST :
1227 OPf_WANT_SCALAR);
462e5cf6 1228 SAVEOP();
533c011a 1229 PL_op = (OP*)&myop;
aa689395 1230
3280af22
NIS
1231 EXTEND(PL_stack_sp, 1);
1232 *++PL_stack_sp = sv;
aa689395 1233 oldmark = TOPMARK;
3280af22 1234 oldscope = PL_scopestack_ix;
a0d0e21e 1235
3280af22 1236 if (PERLDB_SUB && PL_curstash != PL_debstash
36477c24 1237 /* Handle first BEGIN of -d. */
3280af22 1238 && (PL_DBcv || (PL_DBcv = GvCV(PL_DBsub)))
36477c24 1239 /* Try harder, since this may have been a sighandler, thus
1240 * curstash may be meaningless. */
3280af22 1241 && (SvTYPE(sv) != SVt_PVCV || CvSTASH((CV*)sv) != PL_debstash)
491527d0 1242 && !(flags & G_NODEBUG))
533c011a 1243 PL_op->op_private |= OPpENTERSUB_DB;
a0d0e21e
LW
1244
1245 if (flags & G_EVAL) {
533c011a 1246 cLOGOP->op_other = PL_op;
3280af22 1247 PL_markstack_ptr--;
4633a7c4
LW
1248 /* we're trying to emulate pp_entertry() here */
1249 {
c09156bb 1250 register PERL_CONTEXT *cx;
54310121 1251 I32 gimme = GIMME_V;
4633a7c4
LW
1252
1253 ENTER;
1254 SAVETMPS;
1255
533c011a 1256 push_return(PL_op->op_next);
3280af22 1257 PUSHBLOCK(cx, CXt_EVAL, PL_stack_sp);
4633a7c4 1258 PUSHEVAL(cx, 0, 0);
533c011a 1259 PL_eval_root = PL_op; /* Only needed so that goto works right. */
4633a7c4 1260
3280af22 1261 PL_in_eval = 1;
4633a7c4 1262 if (flags & G_KEEPERR)
3280af22 1263 PL_in_eval |= 4;
4633a7c4 1264 else
38a03e6e 1265 sv_setpv(ERRSV,"");
4633a7c4 1266 }
3280af22 1267 PL_markstack_ptr++;
a0d0e21e 1268
6224f72b
GS
1269 JMPENV_PUSH(ret);
1270 switch (ret) {
1271 case 0:
a0d0e21e 1272 break;
6224f72b 1273 case 1:
f86702cc 1274 STATUS_ALL_FAILURE;
a0d0e21e 1275 /* FALL THROUGH */
6224f72b 1276 case 2:
a0d0e21e 1277 /* my_exit() was called */
3280af22 1278 PL_curstash = PL_defstash;
a0d0e21e 1279 FREETMPS;
54310121 1280 JMPENV_POP;
3280af22 1281 if (PL_statusvalue)
a0d0e21e 1282 croak("Callback called exit");
f86702cc 1283 my_exit_jump();
a0d0e21e 1284 /* NOTREACHED */
6224f72b 1285 case 3:
3280af22 1286 if (PL_restartop) {
533c011a 1287 PL_op = PL_restartop;
3280af22 1288 PL_restartop = 0;
54310121 1289 break;
a0d0e21e 1290 }
3280af22 1291 PL_stack_sp = PL_stack_base + oldmark;
a0d0e21e
LW
1292 if (flags & G_ARRAY)
1293 retval = 0;
1294 else {
1295 retval = 1;
3280af22 1296 *++PL_stack_sp = &PL_sv_undef;
a0d0e21e
LW
1297 }
1298 goto cleanup;
1299 }
1300 }
1e422769 1301 else
54310121 1302 CATCH_SET(TRUE);
a0d0e21e 1303
533c011a
NIS
1304 if (PL_op == (OP*)&myop)
1305 PL_op = pp_entersub(ARGS);
1306 if (PL_op)
76e3520e 1307 CALLRUNOPS();
3280af22 1308 retval = PL_stack_sp - (PL_stack_base + oldmark);
4633a7c4 1309 if ((flags & G_EVAL) && !(flags & G_KEEPERR))
38a03e6e 1310 sv_setpv(ERRSV,"");
a0d0e21e
LW
1311
1312 cleanup:
1313 if (flags & G_EVAL) {
3280af22 1314 if (PL_scopestack_ix > oldscope) {
a0a2876f
LW
1315 SV **newsp;
1316 PMOP *newpm;
1317 I32 gimme;
c09156bb 1318 register PERL_CONTEXT *cx;
a0a2876f
LW
1319 I32 optype;
1320
1321 POPBLOCK(cx,newpm);
1322 POPEVAL(cx);
1323 pop_return();
3280af22 1324 PL_curpm = newpm;
a0a2876f 1325 LEAVE;
a0d0e21e 1326 }
54310121 1327 JMPENV_POP;
a0d0e21e 1328 }
1e422769 1329 else
54310121 1330 CATCH_SET(oldcatch);
1e422769 1331
a0d0e21e 1332 if (flags & G_DISCARD) {
3280af22 1333 PL_stack_sp = PL_stack_base + oldmark;
a0d0e21e
LW
1334 retval = 0;
1335 FREETMPS;
1336 LEAVE;
1337 }
533c011a 1338 PL_op = oldop;
a0d0e21e
LW
1339 return retval;
1340}
1341
6e72f9df 1342/* Eval a string. The G_EVAL flag is always assumed. */
8990e307 1343
a0d0e21e 1344I32
8ac85365
NIS
1345perl_eval_sv(SV *sv, I32 flags)
1346
1347 /* See G_* flags in cop.h */
a0d0e21e 1348{
924508f0 1349 dSP;
a0d0e21e 1350 UNOP myop; /* fake syntax tree node */
3280af22 1351 I32 oldmark = SP - PL_stack_base;
4633a7c4 1352 I32 retval;
4633a7c4 1353 I32 oldscope;
54310121 1354 dJMPENV;
6224f72b 1355 int ret;
533c011a 1356 OP* oldop = PL_op;
84902520 1357
4633a7c4
LW
1358 if (flags & G_DISCARD) {
1359 ENTER;
1360 SAVETMPS;
1361 }
1362
462e5cf6 1363 SAVEOP();
533c011a
NIS
1364 PL_op = (OP*)&myop;
1365 Zero(PL_op, 1, UNOP);
3280af22
NIS
1366 EXTEND(PL_stack_sp, 1);
1367 *++PL_stack_sp = sv;
1368 oldscope = PL_scopestack_ix;
79072805 1369
4633a7c4
LW
1370 if (!(flags & G_NOARGS))
1371 myop.op_flags = OPf_STACKED;
79072805 1372 myop.op_next = Nullop;
6e72f9df 1373 myop.op_type = OP_ENTEREVAL;
54310121 1374 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1375 (flags & G_ARRAY) ? OPf_WANT_LIST :
1376 OPf_WANT_SCALAR);
6e72f9df 1377 if (flags & G_KEEPERR)
1378 myop.op_flags |= OPf_SPECIAL;
4633a7c4 1379
6224f72b
GS
1380 JMPENV_PUSH(ret);
1381 switch (ret) {
1382 case 0:
4633a7c4 1383 break;
6224f72b 1384 case 1:
f86702cc 1385 STATUS_ALL_FAILURE;
4633a7c4 1386 /* FALL THROUGH */
6224f72b 1387 case 2:
4633a7c4 1388 /* my_exit() was called */
3280af22 1389 PL_curstash = PL_defstash;
4633a7c4 1390 FREETMPS;
54310121 1391 JMPENV_POP;
3280af22 1392 if (PL_statusvalue)
4633a7c4 1393 croak("Callback called exit");
f86702cc 1394 my_exit_jump();
4633a7c4 1395 /* NOTREACHED */
6224f72b 1396 case 3:
3280af22 1397 if (PL_restartop) {
533c011a 1398 PL_op = PL_restartop;
3280af22 1399 PL_restartop = 0;
54310121 1400 break;
4633a7c4 1401 }
3280af22 1402 PL_stack_sp = PL_stack_base + oldmark;
4633a7c4
LW
1403 if (flags & G_ARRAY)
1404 retval = 0;
1405 else {
1406 retval = 1;
3280af22 1407 *++PL_stack_sp = &PL_sv_undef;
4633a7c4
LW
1408 }
1409 goto cleanup;
1410 }
1411
533c011a
NIS
1412 if (PL_op == (OP*)&myop)
1413 PL_op = pp_entereval(ARGS);
1414 if (PL_op)
76e3520e 1415 CALLRUNOPS();
3280af22 1416 retval = PL_stack_sp - (PL_stack_base + oldmark);
6e72f9df 1417 if (!(flags & G_KEEPERR))
38a03e6e 1418 sv_setpv(ERRSV,"");
4633a7c4
LW
1419
1420 cleanup:
54310121 1421 JMPENV_POP;
4633a7c4 1422 if (flags & G_DISCARD) {
3280af22 1423 PL_stack_sp = PL_stack_base + oldmark;
4633a7c4
LW
1424 retval = 0;
1425 FREETMPS;
1426 LEAVE;
1427 }
533c011a 1428 PL_op = oldop;
4633a7c4
LW
1429 return retval;
1430}
1431
137443ea 1432SV*
8ac85365 1433perl_eval_pv(char *p, I32 croak_on_error)
137443ea 1434{
1435 dSP;
1436 SV* sv = newSVpv(p, 0);
1437
924508f0 1438 PUSHMARK(SP);
137443ea 1439 perl_eval_sv(sv, G_SCALAR);
1440 SvREFCNT_dec(sv);
1441
1442 SPAGAIN;
1443 sv = POPs;
1444 PUTBACK;
1445
38a03e6e 1446 if (croak_on_error && SvTRUE(ERRSV))
3280af22 1447 croak(SvPVx(ERRSV, PL_na));
137443ea 1448
1449 return sv;
1450}
1451
4633a7c4
LW
1452/* Require a module. */
1453
1454void
8ac85365 1455perl_require_pv(char *pv)
4633a7c4 1456{
d3acc0f7
JP
1457 SV* sv;
1458 dSP;
e788e7d3 1459 PUSHSTACKi(PERLSI_REQUIRE);
d3acc0f7
JP
1460 PUTBACK;
1461 sv = sv_newmortal();
4633a7c4
LW
1462 sv_setpv(sv, "require '");
1463 sv_catpv(sv, pv);
1464 sv_catpv(sv, "'");
1465 perl_eval_sv(sv, G_DISCARD);
d3acc0f7
JP
1466 SPAGAIN;
1467 POPSTACK;
79072805
LW
1468}
1469
79072805 1470void
8ac85365 1471magicname(char *sym, char *name, I32 namlen)
79072805
LW
1472{
1473 register GV *gv;
1474
85e6fe83 1475 if (gv = gv_fetchpv(sym,TRUE, SVt_PV))
79072805
LW
1476 sv_magic(GvSV(gv), (SV*)gv, 0, name, namlen);
1477}
1478
76e3520e 1479STATIC void
8ac85365
NIS
1480usage(char *name) /* XXX move this out into a module ? */
1481
4633a7c4 1482{
ab821d7f 1483 /* This message really ought to be max 23 lines.
1484 * Removed -h because the user already knows that opton. Others? */
fb73857a 1485
76e3520e 1486 static char *usage_msg[] = {
fb73857a 1487"-0[octal] specify record separator (\\0, if no argument)",
1488"-a autosplit mode with -n or -p (splits $_ into @F)",
1489"-c check syntax only (runs BEGIN and END blocks)",
1490"-d[:debugger] run scripts under debugger",
1491"-D[number/list] set debugging flags (argument is a bit mask or flags)",
1492"-e 'command' one line of script. Several -e's allowed. Omit [programfile].",
1493"-F/pattern/ split() pattern for autosplit (-a). The //'s are optional.",
1494"-i[extension] edit <> files in place (make backup if extension supplied)",
1495"-Idirectory specify @INC/#include directory (may be used more than once)",
1496"-l[octal] enable line ending processing, specifies line terminator",
1497"-[mM][-]module.. executes `use/no module...' before executing your script.",
1498"-n assume 'while (<>) { ... }' loop around your script",
1499"-p assume loop like -n but print line also like sed",
1500"-P run script through C preprocessor before compilation",
1501"-s enable some switch parsing for switches after script name",
1502"-S look for the script using PATH environment variable",
1503"-T turn on tainting checks",
1504"-u dump core after parsing script",
1505"-U allow unsafe operations",
95103687 1506"-v print version number, patchlevel plus VERY IMPORTANT perl info",
fb73857a 1507"-V[:variable] print perl configuration information",
1508"-w TURN WARNINGS ON FOR COMPILATION OF YOUR SCRIPT. Recommended.",
1509"-x[directory] strip off text before #!perl line and perhaps cd to directory",
1510"\n",
1511NULL
1512};
76e3520e 1513 char **p = usage_msg;
fb73857a 1514
ab821d7f 1515 printf("\nUsage: %s [switches] [--] [programfile] [arguments]", name);
fb73857a 1516 while (*p)
1517 printf("\n %s", *p++);
4633a7c4
LW
1518}
1519
79072805
LW
1520/* This routine handles any switches that can be given during run */
1521
1522char *
8ac85365 1523moreswitches(char *s)
79072805
LW
1524{
1525 I32 numlen;
c07a80fd 1526 U32 rschar;
79072805
LW
1527
1528 switch (*s) {
1529 case '0':
a863c7d1
MB
1530 {
1531 dTHR;
c07a80fd 1532 rschar = scan_oct(s, 4, &numlen);
3280af22 1533 SvREFCNT_dec(PL_nrs);
c07a80fd 1534 if (rschar & ~((U8)~0))
3280af22 1535 PL_nrs = &PL_sv_undef;
c07a80fd 1536 else if (!rschar && numlen >= 2)
3280af22 1537 PL_nrs = newSVpv("", 0);
c07a80fd 1538 else {
1539 char ch = rschar;
3280af22 1540 PL_nrs = newSVpv(&ch, 1);
79072805
LW
1541 }
1542 return s + numlen;
a863c7d1 1543 }
2304df62 1544 case 'F':
3280af22
NIS
1545 PL_minus_F = TRUE;
1546 PL_splitstr = savepv(s + 1);
2304df62
AD
1547 s += strlen(s);
1548 return s;
79072805 1549 case 'a':
3280af22 1550 PL_minus_a = TRUE;
79072805
LW
1551 s++;
1552 return s;
1553 case 'c':
3280af22 1554 PL_minus_c = TRUE;
79072805
LW
1555 s++;
1556 return s;
1557 case 'd':
bbce6d69 1558 forbid_setid("-d");
4633a7c4 1559 s++;
c07a80fd 1560 if (*s == ':' || *s == '=') {
46fc3d4c 1561 my_setenv("PERL5DB", form("use Devel::%s;", ++s));
4633a7c4 1562 s += strlen(s);
4633a7c4 1563 }
3280af22
NIS
1564 if (!PL_perldb) {
1565 PL_perldb = PERLDB_ALL;
a0d0e21e
LW
1566 init_debugger();
1567 }
79072805
LW
1568 return s;
1569 case 'D':
1570#ifdef DEBUGGING
bbce6d69 1571 forbid_setid("-D");
79072805 1572 if (isALPHA(s[1])) {
8b73bbec 1573 static char debopts[] = "psltocPmfrxuLHXDS";
79072805
LW
1574 char *d;
1575
93a17b20 1576 for (s++; *s && (d = strchr(debopts,*s)); s++)
3280af22 1577 PL_debug |= 1 << (d - debopts);
79072805
LW
1578 }
1579 else {
3280af22 1580 PL_debug = atoi(s+1);
79072805
LW
1581 for (s++; isDIGIT(*s); s++) ;
1582 }
3280af22 1583 PL_debug |= 0x80000000;
79072805
LW
1584#else
1585 warn("Recompile perl with -DDEBUGGING to use -D switch\n");
a0d0e21e 1586 for (s++; isALNUM(*s); s++) ;
79072805
LW
1587#endif
1588 /*SUPPRESS 530*/
1589 return s;
4633a7c4 1590 case 'h':
3280af22 1591 usage(PL_origargv[0]);
6ad3d225 1592 PerlProc_exit(0);
79072805 1593 case 'i':
3280af22
NIS
1594 if (PL_inplace)
1595 Safefree(PL_inplace);
1596 PL_inplace = savepv(s+1);
79072805 1597 /*SUPPRESS 530*/
3280af22 1598 for (s = PL_inplace; *s && !isSPACE(*s); s++) ;
7b8d334a 1599 if (*s) {
fb73857a 1600 *s++ = '\0';
7b8d334a
GS
1601 if (*s == '-') /* Additional switches on #! line. */
1602 s++;
1603 }
fb73857a 1604 return s;
1605 case 'I': /* -I handled both here and in parse_perl() */
bbce6d69 1606 forbid_setid("-I");
fb73857a 1607 ++s;
1608 while (*s && isSPACE(*s))
1609 ++s;
1610 if (*s) {
774d564b 1611 char *e, *p;
748a9306 1612 for (e = s; *e && !isSPACE(*e); e++) ;
774d564b 1613 p = savepvn(s, e-s);
1614 incpush(p, TRUE);
1615 Safefree(p);
fb73857a 1616 s = e;
79072805
LW
1617 }
1618 else
463ee0b2 1619 croak("No space allowed after -I");
fb73857a 1620 return s;
79072805 1621 case 'l':
3280af22 1622 PL_minus_l = TRUE;
79072805 1623 s++;
3280af22
NIS
1624 if (PL_ors)
1625 Safefree(PL_ors);
79072805 1626 if (isDIGIT(*s)) {
3280af22
NIS
1627 PL_ors = savepv("\n");
1628 PL_orslen = 1;
1629 *PL_ors = scan_oct(s, 3 + (*s == '0'), &numlen);
79072805
LW
1630 s += numlen;
1631 }
1632 else {
a863c7d1 1633 dTHR;
3280af22
NIS
1634 if (RsPARA(PL_nrs)) {
1635 PL_ors = "\n\n";
1636 PL_orslen = 2;
c07a80fd 1637 }
1638 else
3280af22
NIS
1639 PL_ors = SvPV(PL_nrs, PL_orslen);
1640 PL_ors = savepvn(PL_ors, PL_orslen);
79072805
LW
1641 }
1642 return s;
1a30305b 1643 case 'M':
bbce6d69 1644 forbid_setid("-M"); /* XXX ? */
1a30305b 1645 /* FALL THROUGH */
1646 case 'm':
bbce6d69 1647 forbid_setid("-m"); /* XXX ? */
1a30305b 1648 if (*++s) {
a5f75d66 1649 char *start;
11343788 1650 SV *sv;
a5f75d66
AD
1651 char *use = "use ";
1652 /* -M-foo == 'no foo' */
1653 if (*s == '-') { use = "no "; ++s; }
11343788 1654 sv = newSVpv(use,0);
a5f75d66 1655 start = s;
1a30305b 1656 /* We allow -M'Module qw(Foo Bar)' */
c07a80fd 1657 while(isALNUM(*s) || *s==':') ++s;
1658 if (*s != '=') {
11343788 1659 sv_catpv(sv, start);
c07a80fd 1660 if (*(start-1) == 'm') {
1661 if (*s != '\0')
1662 croak("Can't use '%c' after -mname", *s);
11343788 1663 sv_catpv( sv, " ()");
c07a80fd 1664 }
1665 } else {
11343788
MB
1666 sv_catpvn(sv, start, s-start);
1667 sv_catpv(sv, " split(/,/,q{");
1668 sv_catpv(sv, ++s);
1669 sv_catpv(sv, "})");
c07a80fd 1670 }
1a30305b 1671 s += strlen(s);
3280af22
NIS
1672 if (PL_preambleav == NULL)
1673 PL_preambleav = newAV();
1674 av_push(PL_preambleav, sv);
1a30305b 1675 }
1676 else
1677 croak("No space allowed after -%c", *(s-1));
1678 return s;
79072805 1679 case 'n':
3280af22 1680 PL_minus_n = TRUE;
79072805
LW
1681 s++;
1682 return s;
1683 case 'p':
3280af22 1684 PL_minus_p = TRUE;
79072805
LW
1685 s++;
1686 return s;
1687 case 's':
bbce6d69 1688 forbid_setid("-s");
3280af22 1689 PL_doswitches = TRUE;
79072805
LW
1690 s++;
1691 return s;
463ee0b2 1692 case 'T':
3280af22 1693 if (!PL_tainting)
9607fc9c 1694 croak("Too late for \"-T\" option");
463ee0b2
LW
1695 s++;
1696 return s;
79072805 1697 case 'u':
3280af22 1698 PL_do_undump = TRUE;
79072805
LW
1699 s++;
1700 return s;
1701 case 'U':
3280af22 1702 PL_unsafe = TRUE;
79072805
LW
1703 s++;
1704 return s;
1705 case 'v':
a5f75d66 1706#if defined(SUBVERSION) && SUBVERSION > 0
fb73857a 1707 printf("\nThis is perl, version 5.%03d_%02d built for %s",
1708 PATCHLEVEL, SUBVERSION, ARCHNAME);
a5f75d66 1709#else
fb73857a 1710 printf("\nThis is perl, version %s built for %s",
6b88bc9c 1711 PL_patchlevel, ARCHNAME);
fb73857a 1712#endif
1713#if defined(LOCAL_PATCH_COUNT)
1714 if (LOCAL_PATCH_COUNT > 0)
1715 printf("\n(with %d registered patch%s, see perl -V for more detail)",
1716 LOCAL_PATCH_COUNT, (LOCAL_PATCH_COUNT!=1) ? "es" : "");
a5f75d66 1717#endif
1a30305b 1718
a411490c 1719 printf("\n\nCopyright 1987-1998, Larry Wall\n");
79072805 1720#ifdef MSDOS
fb73857a 1721 printf("\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
55497cff 1722#endif
1723#ifdef DJGPP
1724 printf("djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n");
9731c6ca 1725 printf("djgpp v2 port (perl5004+) by Laszlo Molnar, 1997-1998\n");
4633a7c4 1726#endif
79072805 1727#ifdef OS2
5dd60ef7 1728 printf("\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
a411490c 1729 "Version 5 port Copyright (c) 1994-1998, Andreas Kaiser, Ilya Zakharevich\n");
79072805 1730#endif
79072805 1731#ifdef atarist
760ac839 1732 printf("atariST series port, ++jrb bammi@cadence.com\n");
79072805 1733#endif
a3f9223b
GS
1734#ifdef __BEOS__
1735 printf("BeOS port Copyright Tom Spindler, 1997-1998\n");
1736#endif
1d84e8df
JH
1737#ifdef MPE
1738 printf("MPE/iX port Copyright by Mark Klein and Mark Bixby, 1996-1998\n");
1739#endif
9d116dd7
JH
1740#ifdef OEMVS
1741 printf("MVS (OS390) port by Mortice Kern Systems, 1997-1998\n");
1742#endif
baed7233
DL
1743#ifdef BINARY_BUILD_NOTICE
1744 BINARY_BUILD_NOTICE;
1745#endif
760ac839 1746 printf("\n\
79072805 1747Perl may be copied only under the terms of either the Artistic License or the\n\
95103687
GS
1748GNU General Public License, which may be found in the Perl 5.0 source kit.\n\n\
1749Complete documentation for Perl, including FAQ lists, should be found on\n\
1750this system using `man perl' or `perldoc perl'. If you have access to the\n\
1751Internet, point your browser at http://www.perl.com/, the Perl Home Page.\n\n");
6ad3d225 1752 PerlProc_exit(0);
79072805 1753 case 'w':
599cee73
PM
1754 if (! (PL_dowarn & G_WARN_ALL_MASK))
1755 PL_dowarn |= G_WARN_ON;
1756 s++;
1757 return s;
1758 case 'W':
1759 PL_dowarn = G_WARN_ALL_ON|G_WARN_ON;
1760 compiling.cop_warnings = WARN_ALL ;
1761 s++;
1762 return s;
1763 case 'X':
1764 PL_dowarn = G_WARN_ALL_OFF;
1765 compiling.cop_warnings = WARN_NONE ;
79072805
LW
1766 s++;
1767 return s;
a0d0e21e 1768 case '*':
79072805
LW
1769 case ' ':
1770 if (s[1] == '-') /* Additional switches on #! line. */
1771 return s+2;
1772 break;
a0d0e21e 1773 case '-':
79072805 1774 case 0:
a868473f
NIS
1775#ifdef WIN32
1776 case '\r':
1777#endif
79072805
LW
1778 case '\n':
1779 case '\t':
1780 break;
aa689395 1781#ifdef ALTERNATE_SHEBANG
1782 case 'S': /* OS/2 needs -S on "extproc" line. */
1783 break;
1784#endif
a0d0e21e 1785 case 'P':
3280af22 1786 if (PL_preprocess)
a0d0e21e
LW
1787 return s+1;
1788 /* FALL THROUGH */
79072805 1789 default:
a0d0e21e 1790 croak("Can't emulate -%.1s on #! line",s);
79072805
LW
1791 }
1792 return Nullch;
1793}
1794
1795/* compliments of Tom Christiansen */
1796
1797/* unexec() can be found in the Gnu emacs distribution */
ee580363 1798/* Known to work with -DUNEXEC and using unexelf.c from GNU emacs-20.2 */
79072805
LW
1799
1800void
8ac85365 1801my_unexec(void)
79072805
LW
1802{
1803#ifdef UNEXEC
46fc3d4c 1804 SV* prog;
1805 SV* file;
ee580363 1806 int status = 1;
79072805
LW
1807 extern int etext;
1808
ee580363 1809 prog = newSVpv(BIN_EXP, 0);
46fc3d4c 1810 sv_catpv(prog, "/perl");
6b88bc9c 1811 file = newSVpv(PL_origfilename, 0);
46fc3d4c 1812 sv_catpv(file, ".perldump");
79072805 1813
ee580363
GS
1814 unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
1815 /* unexec prints msg to stderr in case of failure */
6ad3d225 1816 PerlProc_exit(status);
79072805 1817#else
a5f75d66
AD
1818# ifdef VMS
1819# include <lib$routines.h>
1820 lib$signal(SS$_DEBUG); /* ssdef.h #included from vmsish.h */
aa689395 1821# else
79072805 1822 ABORT(); /* for use with undump */
aa689395 1823# endif
a5f75d66 1824#endif
79072805
LW
1825}
1826
cb68f92d
GS
1827/* initialize curinterp */
1828STATIC void
1829init_interp(void)
1830{
1831
066ef5b5 1832#ifdef PERL_OBJECT /* XXX kludge */
cb68f92d 1833#define I_REINIT \
6b88bc9c
GS
1834 STMT_START { \
1835 PL_chopset = " \n-"; \
1836 PL_copline = NOLINE; \
1837 PL_curcop = &PL_compiling;\
1838 PL_curcopdb = NULL; \
1839 PL_dbargs = 0; \
1840 PL_dlmax = 128; \
1841 PL_laststatval = -1; \
1842 PL_laststype = OP_STAT; \
1843 PL_maxscream = -1; \
1844 PL_maxsysfd = MAXSYSFD; \
1845 PL_statname = Nullsv; \
1846 PL_tmps_floor = -1; \
1847 PL_tmps_ix = -1; \
1848 PL_op_mask = NULL; \
1849 PL_dlmax = 128; \
1850 PL_laststatval = -1; \
1851 PL_laststype = OP_STAT; \
1852 PL_mess_sv = Nullsv; \
1853 PL_splitstr = " "; \
1854 PL_generation = 100; \
1855 PL_exitlist = NULL; \
1856 PL_exitlistlen = 0; \
1857 PL_regindent = 0; \
1858 PL_in_clean_objs = FALSE; \
1859 PL_in_clean_all = FALSE; \
1860 PL_profiledata = NULL; \
1861 PL_rsfp = Nullfp; \
1862 PL_rsfp_filters = Nullav; \
cb68f92d 1863 } STMT_END
9666903d 1864 I_REINIT;
066ef5b5
GS
1865#else
1866# ifdef MULTIPLICITY
1867# define PERLVAR(var,type)
8f872242
NIS
1868# define PERLVARI(var,type,init) PL_curinterp->var = init;
1869# define PERLVARIC(var,type,init) PL_curinterp->var = init;
066ef5b5
GS
1870# include "intrpvar.h"
1871# ifndef USE_THREADS
1872# include "thrdvar.h"
1873# endif
1874# undef PERLVAR
1875# undef PERLVARI
1876# undef PERLVARIC
1877# else
1878# define PERLVAR(var,type)
533c011a
NIS
1879# define PERLVARI(var,type,init) PL_##var = init;
1880# define PERLVARIC(var,type,init) PL_##var = init;
066ef5b5
GS
1881# include "intrpvar.h"
1882# ifndef USE_THREADS
1883# include "thrdvar.h"
1884# endif
1885# undef PERLVAR
1886# undef PERLVARI
1887# undef PERLVARIC
1888# endif
cb68f92d
GS
1889#endif
1890
cb68f92d
GS
1891}
1892
76e3520e 1893STATIC void
8ac85365 1894init_main_stash(void)
79072805 1895{
11343788 1896 dTHR;
463ee0b2 1897 GV *gv;
6e72f9df 1898
1899 /* Note that strtab is a rather special HV. Assumptions are made
1900 about not iterating on it, and not adding tie magic to it.
1901 It is properly deallocated in perl_destruct() */
3280af22
NIS
1902 PL_strtab = newHV();
1903 HvSHAREKEYS_off(PL_strtab); /* mandatory */
1904 hv_ksplit(PL_strtab, 512);
6e72f9df 1905
3280af22
NIS
1906 PL_curstash = PL_defstash = newHV();
1907 PL_curstname = newSVpv("main",4);
adbc6bb1
LW
1908 gv = gv_fetchpv("main::",TRUE, SVt_PVHV);
1909 SvREFCNT_dec(GvHV(gv));
3280af22 1910 GvHV(gv) = (HV*)SvREFCNT_inc(PL_defstash);
463ee0b2 1911 SvREADONLY_on(gv);
3280af22
NIS
1912 HvNAME(PL_defstash) = savepv("main");
1913 PL_incgv = gv_HVadd(gv_AVadd(gv_fetchpv("INC",TRUE, SVt_PVAV)));
1914 GvMULTI_on(PL_incgv);
1915 PL_hintgv = gv_fetchpv("\010",TRUE, SVt_PV); /* ^H */
1916 GvMULTI_on(PL_hintgv);
1917 PL_defgv = gv_fetchpv("_",TRUE, SVt_PVAV);
1918 PL_errgv = gv_HVadd(gv_fetchpv("@", TRUE, SVt_PV));
1919 GvMULTI_on(PL_errgv);
1920 PL_replgv = gv_fetchpv("\022", TRUE, SVt_PV); /* ^R */
1921 GvMULTI_on(PL_replgv);
84902520 1922 (void)form("%240s",""); /* Preallocate temp - for immediate signals. */
38a03e6e
MB
1923 sv_grow(ERRSV, 240); /* Preallocate - for immediate signals. */
1924 sv_setpvn(ERRSV, "", 0);
3280af22
NIS
1925 PL_curstash = PL_defstash;
1926 PL_compiling.cop_stash = PL_defstash;
1927 PL_debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
1928 PL_globalstash = GvHV(gv_fetchpv("CORE::GLOBAL::", GV_ADDMULTI, SVt_PVHV));
4633a7c4
LW
1929 /* We must init $/ before switches are processed. */
1930 sv_setpvn(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), "\n", 1);
79072805
LW
1931}
1932
76e3520e 1933STATIC void
01f988be 1934open_script(char *scriptname, bool dosearch, SV *sv, int *fdscript)
79072805 1935{
0f15f207 1936 dTHR;
79072805 1937 register char *s;
2a92aaa0 1938
6c4ab083 1939 *fdscript = -1;
79072805 1940
3280af22
NIS
1941 if (PL_e_script) {
1942 PL_origfilename = savepv("-e");
96436eeb 1943 }
6c4ab083
GS
1944 else {
1945 /* if find_script() returns, it returns a malloc()-ed value */
3280af22 1946 PL_origfilename = scriptname = find_script(scriptname, dosearch, NULL, 1);
6c4ab083
GS
1947
1948 if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
1949 char *s = scriptname + 8;
1950 *fdscript = atoi(s);
1951 while (isDIGIT(*s))
1952 s++;
1953 if (*s) {
1954 scriptname = savepv(s + 1);
3280af22
NIS
1955 Safefree(PL_origfilename);
1956 PL_origfilename = scriptname;
6c4ab083
GS
1957 }
1958 }
1959 }
1960
3280af22
NIS
1961 PL_curcop->cop_filegv = gv_fetchfile(PL_origfilename);
1962 if (strEQ(PL_origfilename,"-"))
79072805 1963 scriptname = "";
01f988be 1964 if (*fdscript >= 0) {
3280af22 1965 PL_rsfp = PerlIO_fdopen(*fdscript,PERL_SCRIPT_MODE);
96436eeb 1966#if defined(HAS_FCNTL) && defined(F_SETFD)
3280af22
NIS
1967 if (PL_rsfp)
1968 fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,1); /* ensure close-on-exec */
96436eeb 1969#endif
1970 }
3280af22 1971 else if (PL_preprocess) {
46fc3d4c 1972 char *cpp_cfg = CPPSTDIN;
63bfd3db 1973 SV *cpp = newSVpv("",0);
46fc3d4c 1974 SV *cmd = NEWSV(0,0);
1975
1976 if (strEQ(cpp_cfg, "cppstdin"))
1977 sv_catpvf(cpp, "%s/", BIN_EXP);
1978 sv_catpv(cpp, cpp_cfg);
79072805 1979
79072805 1980 sv_catpv(sv,"-I");
fed7345c 1981 sv_catpv(sv,PRIVLIB_EXP);
46fc3d4c 1982
79072805 1983#ifdef MSDOS
46fc3d4c 1984 sv_setpvf(cmd, "\
79072805
LW
1985sed %s -e \"/^[^#]/b\" \
1986 -e \"/^#[ ]*include[ ]/b\" \
1987 -e \"/^#[ ]*define[ ]/b\" \
1988 -e \"/^#[ ]*if[ ]/b\" \
1989 -e \"/^#[ ]*ifdef[ ]/b\" \
1990 -e \"/^#[ ]*ifndef[ ]/b\" \
1991 -e \"/^#[ ]*else/b\" \
1992 -e \"/^#[ ]*elif[ ]/b\" \
1993 -e \"/^#[ ]*undef[ ]/b\" \
1994 -e \"/^#[ ]*endif/b\" \
1995 -e \"s/^#.*//\" \
fc36a67e 1996 %s | %_ -C %_ %s",
6b88bc9c 1997 (PL_doextract ? "-e \"1,/^#/d\n\"" : ""),
79072805 1998#else
46fc3d4c 1999 sv_setpvf(cmd, "\
79072805
LW
2000%s %s -e '/^[^#]/b' \
2001 -e '/^#[ ]*include[ ]/b' \
2002 -e '/^#[ ]*define[ ]/b' \
2003 -e '/^#[ ]*if[ ]/b' \
2004 -e '/^#[ ]*ifdef[ ]/b' \
2005 -e '/^#[ ]*ifndef[ ]/b' \
2006 -e '/^#[ ]*else/b' \
2007 -e '/^#[ ]*elif[ ]/b' \
2008 -e '/^#[ ]*undef[ ]/b' \
2009 -e '/^#[ ]*endif/b' \
2010 -e 's/^[ ]*#.*//' \
fc36a67e 2011 %s | %_ -C %_ %s",
79072805
LW
2012#ifdef LOC_SED
2013 LOC_SED,
2014#else
2015 "sed",
2016#endif
3280af22 2017 (PL_doextract ? "-e '1,/^#/d\n'" : ""),
79072805 2018#endif
46fc3d4c 2019 scriptname, cpp, sv, CPPMINUS);
3280af22 2020 PL_doextract = FALSE;
79072805 2021#ifdef IAMSUID /* actually, this is caught earlier */
b28d0864 2022 if (PL_euid != PL_uid && !PL_euid) { /* if running suidperl */
79072805 2023#ifdef HAS_SETEUID
b28d0864 2024 (void)seteuid(PL_uid); /* musn't stay setuid root */
79072805
LW
2025#else
2026#ifdef HAS_SETREUID
b28d0864 2027 (void)setreuid((Uid_t)-1, PL_uid);
85e6fe83
LW
2028#else
2029#ifdef HAS_SETRESUID
b28d0864 2030 (void)setresuid((Uid_t)-1, PL_uid, (Uid_t)-1);
79072805 2031#else
b28d0864 2032 PerlProc_setuid(PL_uid);
79072805
LW
2033#endif
2034#endif
85e6fe83 2035#endif
b28d0864 2036 if (PerlProc_geteuid() != PL_uid)
463ee0b2 2037 croak("Can't do seteuid!\n");
79072805
LW
2038 }
2039#endif /* IAMSUID */
3280af22 2040 PL_rsfp = PerlProc_popen(SvPVX(cmd), "r");
46fc3d4c 2041 SvREFCNT_dec(cmd);
2042 SvREFCNT_dec(cpp);
79072805
LW
2043 }
2044 else if (!*scriptname) {
bbce6d69 2045 forbid_setid("program input from stdin");
3280af22 2046 PL_rsfp = PerlIO_stdin();
79072805 2047 }
96436eeb 2048 else {
3280af22 2049 PL_rsfp = PerlIO_open(scriptname,PERL_SCRIPT_MODE);
96436eeb 2050#if defined(HAS_FCNTL) && defined(F_SETFD)
3280af22
NIS
2051 if (PL_rsfp)
2052 fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,1); /* ensure close-on-exec */
96436eeb 2053#endif
2054 }
3280af22 2055 if (!PL_rsfp) {
13281fa4 2056#ifdef DOSUID
a687059c 2057#ifndef IAMSUID /* in case script is not readable before setuid */
6b88bc9c
GS
2058 if (PL_euid &&
2059 PerlLIO_stat(SvPVX(GvSV(PL_curcop->cop_filegv)),&PL_statbuf) >= 0 &&
2060 PL_statbuf.st_mode & (S_ISUID|S_ISGID))
2061 {
46fc3d4c 2062 /* try again */
6b88bc9c 2063 PerlProc_execv(form("%s/sperl%s", BIN_EXP, PL_patchlevel), PL_origargv);
463ee0b2 2064 croak("Can't do setuid\n");
13281fa4
LW
2065 }
2066#endif
2067#endif
463ee0b2 2068 croak("Can't open perl script \"%s\": %s\n",
3280af22 2069 SvPVX(GvSV(PL_curcop->cop_filegv)), Strerror(errno));
13281fa4 2070 }
79072805 2071}
8d063cd8 2072
76e3520e 2073STATIC void
01f988be 2074validate_suid(char *validarg, char *scriptname, int fdscript)
79072805 2075{
96436eeb 2076 int which;
2077
13281fa4
LW
2078 /* do we need to emulate setuid on scripts? */
2079
2080 /* This code is for those BSD systems that have setuid #! scripts disabled
2081 * in the kernel because of a security problem. Merely defining DOSUID
2082 * in perl will not fix that problem, but if you have disabled setuid
2083 * scripts in the kernel, this will attempt to emulate setuid and setgid
2084 * on scripts that have those now-otherwise-useless bits set. The setuid
27e2fb84
LW
2085 * root version must be called suidperl or sperlN.NNN. If regular perl
2086 * discovers that it has opened a setuid script, it calls suidperl with
2087 * the same argv that it had. If suidperl finds that the script it has
2088 * just opened is NOT setuid root, it sets the effective uid back to the
2089 * uid. We don't just make perl setuid root because that loses the
2090 * effective uid we had before invoking perl, if it was different from the
2091 * uid.
13281fa4
LW
2092 *
2093 * DOSUID must be defined in both perl and suidperl, and IAMSUID must
2094 * be defined in suidperl only. suidperl must be setuid root. The
2095 * Configure script will set this up for you if you want it.
2096 */
a687059c 2097
13281fa4 2098#ifdef DOSUID
ea0efc06 2099 dTHR;
6e72f9df 2100 char *s, *s2;
a0d0e21e 2101
b28d0864 2102 if (PerlLIO_fstat(PerlIO_fileno(PL_rsfp),&PL_statbuf) < 0) /* normal stat is insecure */
6b88bc9c 2103 croak("Can't stat script \"%s\"",PL_origfilename);
b28d0864 2104 if (fdscript < 0 && PL_statbuf.st_mode & (S_ISUID|S_ISGID)) {
79072805 2105 I32 len;
13281fa4 2106
a687059c 2107#ifdef IAMSUID
fe14fcc3 2108#ifndef HAS_SETREUID
a687059c
LW
2109 /* On this access check to make sure the directories are readable,
2110 * there is actually a small window that the user could use to make
2111 * filename point to an accessible directory. So there is a faint
2112 * chance that someone could execute a setuid script down in a
2113 * non-accessible directory. I don't know what to do about that.
2114 * But I don't think it's too important. The manual lies when
2115 * it says access() is useful in setuid programs.
2116 */
6b88bc9c 2117 if (PerlLIO_access(SvPVX(GvSV(PL_curcop->cop_filegv)),1)) /*double check*/
463ee0b2 2118 croak("Permission denied");
a687059c
LW
2119#else
2120 /* If we can swap euid and uid, then we can determine access rights
2121 * with a simple stat of the file, and then compare device and
2122 * inode to make sure we did stat() on the same file we opened.
2123 * Then we just have to make sure he or she can execute it.
2124 */
2125 {
2126 struct stat tmpstatbuf;
2127
85e6fe83
LW
2128 if (
2129#ifdef HAS_SETREUID
b28d0864 2130 setreuid(PL_euid,PL_uid) < 0
a0d0e21e
LW
2131#else
2132# if HAS_SETRESUID
b28d0864 2133 setresuid(PL_euid,PL_uid,(Uid_t)-1) < 0
a0d0e21e 2134# endif
85e6fe83 2135#endif
b28d0864 2136 || PerlProc_getuid() != PL_euid || PerlProc_geteuid() != PL_uid)
463ee0b2 2137 croak("Can't swap uid and euid"); /* really paranoid */
6b88bc9c 2138 if (PerlLIO_stat(SvPVX(GvSV(PL_curcop->cop_filegv)),&tmpstatbuf) < 0)
463ee0b2 2139 croak("Permission denied"); /* testing full pathname here */
b28d0864
NIS
2140 if (tmpstatbuf.st_dev != PL_statbuf.st_dev ||
2141 tmpstatbuf.st_ino != PL_statbuf.st_ino) {
2142 (void)PerlIO_close(PL_rsfp);
2143 if (PL_rsfp = PerlProc_popen("/bin/mail root","w")) { /* heh, heh */
2144 PerlIO_printf(PL_rsfp,
ff0cee69 2145"User %ld tried to run dev %ld ino %ld in place of dev %ld ino %ld!\n\
2146(Filename of set-id script was %s, uid %ld gid %ld.)\n\nSincerely,\nperl\n",
b28d0864
NIS
2147 (long)PL_uid,(long)tmpstatbuf.st_dev, (long)tmpstatbuf.st_ino,
2148 (long)PL_statbuf.st_dev, (long)PL_statbuf.st_ino,
6b88bc9c 2149 SvPVX(GvSV(PL_curcop->cop_filegv)),
b28d0864
NIS
2150 (long)PL_statbuf.st_uid, (long)PL_statbuf.st_gid);
2151 (void)PerlProc_pclose(PL_rsfp);
a687059c 2152 }
463ee0b2 2153 croak("Permission denied\n");
a687059c 2154 }
85e6fe83
LW
2155 if (
2156#ifdef HAS_SETREUID
b28d0864 2157 setreuid(PL_uid,PL_euid) < 0
a0d0e21e
LW
2158#else
2159# if defined(HAS_SETRESUID)
b28d0864 2160 setresuid(PL_uid,PL_euid,(Uid_t)-1) < 0
a0d0e21e 2161# endif
85e6fe83 2162#endif
b28d0864 2163 || PerlProc_getuid() != PL_uid || PerlProc_geteuid() != PL_euid)
463ee0b2 2164 croak("Can't reswap uid and euid");
b28d0864 2165 if (!cando(S_IXUSR,FALSE,&PL_statbuf)) /* can real uid exec? */
463ee0b2 2166 croak("Permission denied\n");
a687059c 2167 }
fe14fcc3 2168#endif /* HAS_SETREUID */
a687059c
LW
2169#endif /* IAMSUID */
2170
b28d0864 2171 if (!S_ISREG(PL_statbuf.st_mode))
463ee0b2 2172 croak("Permission denied");
b28d0864 2173 if (PL_statbuf.st_mode & S_IWOTH)
463ee0b2 2174 croak("Setuid/gid script is writable by world");
6b88bc9c
GS
2175 PL_doswitches = FALSE; /* -s is insecure in suid */
2176 PL_curcop->cop_line++;
2177 if (sv_gets(PL_linestr, PL_rsfp, 0) == Nullch ||
2178 strnNE(SvPV(PL_linestr,PL_na),"#!",2) ) /* required even on Sys V */
463ee0b2 2179 croak("No #! line");
6b88bc9c 2180 s = SvPV(PL_linestr,PL_na)+2;
663a0e37 2181 if (*s == ' ') s++;
45d8adaa 2182 while (!isSPACE(*s)) s++;
6b88bc9c 2183 for (s2 = s; (s2 > SvPV(PL_linestr,PL_na)+2 &&
6e72f9df 2184 (isDIGIT(s2[-1]) || strchr("._-", s2[-1]))); s2--) ;
2185 if (strnNE(s2-4,"perl",4) && strnNE(s-9,"perl",4)) /* sanity check */
463ee0b2 2186 croak("Not a perl script");
a687059c 2187 while (*s == ' ' || *s == '\t') s++;
13281fa4
LW
2188 /*
2189 * #! arg must be what we saw above. They can invoke it by
2190 * mentioning suidperl explicitly, but they may not add any strange
2191 * arguments beyond what #! says if they do invoke suidperl that way.
2192 */
2193 len = strlen(validarg);
2194 if (strEQ(validarg," PHOOEY ") ||
45d8adaa 2195 strnNE(s,validarg,len) || !isSPACE(s[len]))
463ee0b2 2196 croak("Args must match #! line");
a687059c
LW
2197
2198#ifndef IAMSUID
b28d0864
NIS
2199 if (PL_euid != PL_uid && (PL_statbuf.st_mode & S_ISUID) &&
2200 PL_euid == PL_statbuf.st_uid)
2201 if (!PL_do_undump)
463ee0b2 2202 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
a687059c
LW
2203FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2204#endif /* IAMSUID */
13281fa4 2205
b28d0864
NIS
2206 if (PL_euid) { /* oops, we're not the setuid root perl */
2207 (void)PerlIO_close(PL_rsfp);
13281fa4 2208#ifndef IAMSUID
46fc3d4c 2209 /* try again */
6b88bc9c 2210 PerlProc_execv(form("%s/sperl%s", BIN_EXP, PL_patchlevel), PL_origargv);
13281fa4 2211#endif
463ee0b2 2212 croak("Can't do setuid\n");
13281fa4
LW
2213 }
2214
b28d0864 2215 if (PL_statbuf.st_mode & S_ISGID && PL_statbuf.st_gid != PL_egid) {
fe14fcc3 2216#ifdef HAS_SETEGID
b28d0864 2217 (void)setegid(PL_statbuf.st_gid);
a687059c 2218#else
fe14fcc3 2219#ifdef HAS_SETREGID
b28d0864 2220 (void)setregid((Gid_t)-1,PL_statbuf.st_gid);
85e6fe83
LW
2221#else
2222#ifdef HAS_SETRESGID
b28d0864 2223 (void)setresgid((Gid_t)-1,PL_statbuf.st_gid,(Gid_t)-1);
a687059c 2224#else
b28d0864 2225 PerlProc_setgid(PL_statbuf.st_gid);
a687059c
LW
2226#endif
2227#endif
85e6fe83 2228#endif
b28d0864 2229 if (PerlProc_getegid() != PL_statbuf.st_gid)
463ee0b2 2230 croak("Can't do setegid!\n");
83025b21 2231 }
b28d0864
NIS
2232 if (PL_statbuf.st_mode & S_ISUID) {
2233 if (PL_statbuf.st_uid != PL_euid)
fe14fcc3 2234#ifdef HAS_SETEUID
b28d0864 2235 (void)seteuid(PL_statbuf.st_uid); /* all that for this */
a687059c 2236#else
fe14fcc3 2237#ifdef HAS_SETREUID
b28d0864 2238 (void)setreuid((Uid_t)-1,PL_statbuf.st_uid);
85e6fe83
LW
2239#else
2240#ifdef HAS_SETRESUID
b28d0864 2241 (void)setresuid((Uid_t)-1,PL_statbuf.st_uid,(Uid_t)-1);
a687059c 2242#else
b28d0864 2243 PerlProc_setuid(PL_statbuf.st_uid);
a687059c
LW
2244#endif
2245#endif
85e6fe83 2246#endif
b28d0864 2247 if (PerlProc_geteuid() != PL_statbuf.st_uid)
463ee0b2 2248 croak("Can't do seteuid!\n");
a687059c 2249 }
b28d0864 2250 else if (PL_uid) { /* oops, mustn't run as root */
fe14fcc3 2251#ifdef HAS_SETEUID
b28d0864 2252 (void)seteuid((Uid_t)PL_uid);
a687059c 2253#else
fe14fcc3 2254#ifdef HAS_SETREUID
b28d0864 2255 (void)setreuid((Uid_t)-1,(Uid_t)PL_uid);
a687059c 2256#else
85e6fe83 2257#ifdef HAS_SETRESUID
b28d0864 2258 (void)setresuid((Uid_t)-1,(Uid_t)PL_uid,(Uid_t)-1);
85e6fe83 2259#else
b28d0864 2260 PerlProc_setuid((Uid_t)PL_uid);
85e6fe83 2261#endif
a687059c
LW
2262#endif
2263#endif
b28d0864 2264 if (PerlProc_geteuid() != PL_uid)
463ee0b2 2265 croak("Can't do seteuid!\n");
83025b21 2266 }
748a9306 2267 init_ids();
b28d0864 2268 if (!cando(S_IXUSR,TRUE,&PL_statbuf))
463ee0b2 2269 croak("Permission denied\n"); /* they can't do this */
13281fa4
LW
2270 }
2271#ifdef IAMSUID
6b88bc9c 2272 else if (PL_preprocess)
463ee0b2 2273 croak("-P not allowed for setuid/setgid script\n");
96436eeb 2274 else if (fdscript >= 0)
2275 croak("fd script not allowed in suidperl\n");
13281fa4 2276 else
463ee0b2 2277 croak("Script is not setuid/setgid in suidperl\n");
96436eeb 2278
2279 /* We absolutely must clear out any saved ids here, so we */
2280 /* exec the real perl, substituting fd script for scriptname. */
2281 /* (We pass script name as "subdir" of fd, which perl will grok.) */
b28d0864
NIS
2282 PerlIO_rewind(PL_rsfp);
2283 PerlLIO_lseek(PerlIO_fileno(PL_rsfp),(Off_t)0,0); /* just in case rewind didn't */
6b88bc9c
GS
2284 for (which = 1; PL_origargv[which] && PL_origargv[which] != scriptname; which++) ;
2285 if (!PL_origargv[which])
96436eeb 2286 croak("Permission denied");
6b88bc9c
GS
2287 PL_origargv[which] = savepv(form("/dev/fd/%d/%s",
2288 PerlIO_fileno(PL_rsfp), PL_origargv[which]));
96436eeb 2289#if defined(HAS_FCNTL) && defined(F_SETFD)
b28d0864 2290 fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,0); /* ensure no close-on-exec */
96436eeb 2291#endif
6b88bc9c 2292 PerlProc_execv(form("%s/perl%s", BIN_EXP, PL_patchlevel), PL_origargv);/* try again */
96436eeb 2293 croak("Can't do setuid\n");
13281fa4 2294#endif /* IAMSUID */
a687059c 2295#else /* !DOSUID */
3280af22 2296 if (PL_euid != PL_uid || PL_egid != PL_gid) { /* (suidperl doesn't exist, in fact) */
a687059c 2297#ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
96827780 2298 dTHR;
b28d0864
NIS
2299 PerlLIO_fstat(PerlIO_fileno(PL_rsfp),&PL_statbuf); /* may be either wrapped or real suid */
2300 if ((PL_euid != PL_uid && PL_euid == PL_statbuf.st_uid && PL_statbuf.st_mode & S_ISUID)
a687059c 2301 ||
b28d0864 2302 (PL_egid != PL_gid && PL_egid == PL_statbuf.st_gid && PL_statbuf.st_mode & S_ISGID)
a687059c 2303 )
b28d0864 2304 if (!PL_do_undump)
463ee0b2 2305 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
a687059c
LW
2306FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2307#endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
2308 /* not set-id, must be wrapped */
a687059c 2309 }
13281fa4 2310#endif /* DOSUID */
79072805 2311}
13281fa4 2312
76e3520e 2313STATIC void
8ac85365 2314find_beginning(void)
79072805 2315{
6e72f9df 2316 register char *s, *s2;
33b78306
LW
2317
2318 /* skip forward in input to the real script? */
2319
bbce6d69 2320 forbid_setid("-x");
3280af22
NIS
2321 while (PL_doextract) {
2322 if ((s = sv_gets(PL_linestr, PL_rsfp, 0)) == Nullch)
463ee0b2 2323 croak("No Perl script found in input\n");
6e72f9df 2324 if (*s == '#' && s[1] == '!' && (s = instr(s,"perl"))) {
3280af22
NIS
2325 PerlIO_ungetc(PL_rsfp, '\n'); /* to keep line count right */
2326 PL_doextract = FALSE;
6e72f9df 2327 while (*s && !(isSPACE (*s) || *s == '#')) s++;
2328 s2 = s;
2329 while (*s == ' ' || *s == '\t') s++;
2330 if (*s++ == '-') {
2331 while (isDIGIT(s2[-1]) || strchr("-._", s2[-1])) s2--;
2332 if (strnEQ(s2-4,"perl",4))
2333 /*SUPPRESS 530*/
2334 while (s = moreswitches(s)) ;
33b78306 2335 }
3280af22
NIS
2336 if (PL_cddir && PerlDir_chdir(PL_cddir) < 0)
2337 croak("Can't chdir to %s",PL_cddir);
83025b21
LW
2338 }
2339 }
2340}
2341
afe37c7d 2342
76e3520e 2343STATIC void
8ac85365 2344init_ids(void)
352d5a3a 2345{
3280af22
NIS
2346 PL_uid = (int)PerlProc_getuid();
2347 PL_euid = (int)PerlProc_geteuid();
2348 PL_gid = (int)PerlProc_getgid();
2349 PL_egid = (int)PerlProc_getegid();
748a9306 2350#ifdef VMS
b28d0864
NIS
2351 PL_uid |= PL_gid << 16;
2352 PL_euid |= PL_egid << 16;
748a9306 2353#endif
3280af22 2354 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
748a9306 2355}
79072805 2356
76e3520e 2357STATIC void
8ac85365 2358forbid_setid(char *s)
bbce6d69 2359{
3280af22 2360 if (PL_euid != PL_uid)
bbce6d69 2361 croak("No %s allowed while running setuid", s);
3280af22 2362 if (PL_egid != PL_gid)
bbce6d69 2363 croak("No %s allowed while running setgid", s);
2364}
2365
76e3520e 2366STATIC void
8ac85365 2367init_debugger(void)
748a9306 2368{
11343788 2369 dTHR;
3280af22
NIS
2370 PL_curstash = PL_debstash;
2371 PL_dbargs = GvAV(gv_AVadd((gv_fetchpv("args", GV_ADDMULTI, SVt_PVAV))));
2372 AvREAL_off(PL_dbargs);
2373 PL_DBgv = gv_fetchpv("DB", GV_ADDMULTI, SVt_PVGV);
2374 PL_DBline = gv_fetchpv("dbline", GV_ADDMULTI, SVt_PVAV);
2375 PL_DBsub = gv_HVadd(gv_fetchpv("sub", GV_ADDMULTI, SVt_PVHV));
2376 PL_DBsingle = GvSV((gv_fetchpv("single", GV_ADDMULTI, SVt_PV)));
2377 sv_setiv(PL_DBsingle, 0);
2378 PL_DBtrace = GvSV((gv_fetchpv("trace", GV_ADDMULTI, SVt_PV)));
2379 sv_setiv(PL_DBtrace, 0);
2380 PL_DBsignal = GvSV((gv_fetchpv("signal", GV_ADDMULTI, SVt_PV)));
2381 sv_setiv(PL_DBsignal, 0);
2382 PL_curstash = PL_defstash;
352d5a3a
LW
2383}
2384
2ce36478
SM
2385#ifndef STRESS_REALLOC
2386#define REASONABLE(size) (size)
2387#else
2388#define REASONABLE(size) (1) /* unreasonable */
2389#endif
2390
11343788 2391void
8ac85365 2392init_stacks(ARGSproto)
79072805 2393{
e336de0d 2394 /* start with 128-item stack and 8K cxstack */
3280af22 2395 PL_curstackinfo = new_stackinfo(REASONABLE(128),
e336de0d 2396 REASONABLE(8192/sizeof(PERL_CONTEXT) - 1));
3280af22
NIS
2397 PL_curstackinfo->si_type = PERLSI_MAIN;
2398 PL_curstack = PL_curstackinfo->si_stack;
2399 PL_mainstack = PL_curstack; /* remember in case we switch stacks */
79072805 2400
3280af22
NIS
2401 PL_stack_base = AvARRAY(PL_curstack);
2402 PL_stack_sp = PL_stack_base;
2403 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
8990e307 2404
3280af22
NIS
2405 New(50,PL_tmps_stack,REASONABLE(128),SV*);
2406 PL_tmps_floor = -1;
2407 PL_tmps_ix = -1;
2408 PL_tmps_max = REASONABLE(128);
8990e307 2409
3280af22
NIS
2410 New(54,PL_markstack,REASONABLE(32),I32);
2411 PL_markstack_ptr = PL_markstack;
2412 PL_markstack_max = PL_markstack + REASONABLE(32);
79072805 2413
e336de0d
GS
2414 SET_MARKBASE;
2415
3280af22
NIS
2416 New(54,PL_scopestack,REASONABLE(32),I32);
2417 PL_scopestack_ix = 0;
2418 PL_scopestack_max = REASONABLE(32);
79072805 2419
3280af22
NIS
2420 New(54,PL_savestack,REASONABLE(128),ANY);
2421 PL_savestack_ix = 0;
2422 PL_savestack_max = REASONABLE(128);
79072805 2423
3280af22
NIS
2424 New(54,PL_retstack,REASONABLE(16),OP*);
2425 PL_retstack_ix = 0;
2426 PL_retstack_max = REASONABLE(16);
378cc40b 2427}
33b78306 2428
2ce36478
SM
2429#undef REASONABLE
2430
76e3520e 2431STATIC void
8ac85365 2432nuke_stacks(void)
6e72f9df 2433{
e858de61 2434 dTHR;
3280af22
NIS
2435 while (PL_curstackinfo->si_next)
2436 PL_curstackinfo = PL_curstackinfo->si_next;
2437 while (PL_curstackinfo) {
2438 PERL_SI *p = PL_curstackinfo->si_prev;
bac4b2ad 2439 /* curstackinfo->si_stack got nuked by sv_free_arenas() */
3280af22
NIS
2440 Safefree(PL_curstackinfo->si_cxstack);
2441 Safefree(PL_curstackinfo);
2442 PL_curstackinfo = p;
e336de0d 2443 }
3280af22
NIS
2444 Safefree(PL_tmps_stack);
2445 Safefree(PL_markstack);
2446 Safefree(PL_scopestack);
2447 Safefree(PL_savestack);
2448 Safefree(PL_retstack);
5f05dabc 2449 DEBUG( {
3280af22
NIS
2450 Safefree(PL_debname);
2451 Safefree(PL_debdelim);
5f05dabc 2452 } )
378cc40b 2453}
33b78306 2454
76e3520e 2455#ifndef PERL_OBJECT
760ac839 2456static PerlIO *tmpfp; /* moved outside init_lexer() because of UNICOS bug */
76e3520e 2457#endif
7aa04957 2458
76e3520e 2459STATIC void
8ac85365 2460init_lexer(void)
8990e307 2461{
76e3520e
GS
2462#ifdef PERL_OBJECT
2463 PerlIO *tmpfp;
2464#endif
3280af22
NIS
2465 tmpfp = PL_rsfp;
2466 PL_rsfp = Nullfp;
2467 lex_start(PL_linestr);
2468 PL_rsfp = tmpfp;
2469 PL_subname = newSVpv("main",4);
8990e307
LW
2470}
2471
76e3520e 2472STATIC void
8ac85365 2473init_predump_symbols(void)
45d8adaa 2474{
11343788 2475 dTHR;
93a17b20 2476 GV *tmpgv;
a0d0e21e 2477 GV *othergv;
79072805 2478
e1c148c2 2479 sv_setpvn(perl_get_sv("\"", TRUE), " ", 1);
3280af22
NIS
2480 PL_stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
2481 GvMULTI_on(PL_stdingv);
2482 IoIFP(GvIOp(PL_stdingv)) = PerlIO_stdin();
adbc6bb1 2483 tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
a5f75d66 2484 GvMULTI_on(tmpgv);
3280af22 2485 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(PL_stdingv));
79072805 2486
85e6fe83 2487 tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
a5f75d66 2488 GvMULTI_on(tmpgv);
760ac839 2489 IoOFP(GvIOp(tmpgv)) = IoIFP(GvIOp(tmpgv)) = PerlIO_stdout();
4633a7c4 2490 setdefout(tmpgv);
adbc6bb1 2491 tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
a5f75d66 2492 GvMULTI_on(tmpgv);
3280af22 2493 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(PL_defoutgv));
79072805 2494
a0d0e21e 2495 othergv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
a5f75d66 2496 GvMULTI_on(othergv);
760ac839 2497 IoOFP(GvIOp(othergv)) = IoIFP(GvIOp(othergv)) = PerlIO_stderr();
adbc6bb1 2498 tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
a5f75d66 2499 GvMULTI_on(tmpgv);
a0d0e21e 2500 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(othergv));
79072805 2501
3280af22 2502 PL_statname = NEWSV(66,0); /* last filename we did stat on */
ab821d7f 2503
3280af22
NIS
2504 if (!PL_osname)
2505 PL_osname = savepv(OSNAME);
79072805 2506}
33b78306 2507
76e3520e 2508STATIC void
8ac85365 2509init_postdump_symbols(register int argc, register char **argv, register char **env)
33b78306 2510{
a863c7d1 2511 dTHR;
79072805
LW
2512 char *s;
2513 SV *sv;
2514 GV* tmpgv;
fe14fcc3 2515
79072805 2516 argc--,argv++; /* skip name of script */
3280af22 2517 if (PL_doswitches) {
79072805
LW
2518 for (; argc > 0 && **argv == '-'; argc--,argv++) {
2519 if (!argv[0][1])
2520 break;
2521 if (argv[0][1] == '-') {
2522 argc--,argv++;
2523 break;
2524 }
93a17b20 2525 if (s = strchr(argv[0], '=')) {
79072805 2526 *s++ = '\0';
85e6fe83 2527 sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),s);
79072805
LW
2528 }
2529 else
85e6fe83 2530 sv_setiv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),1);
fe14fcc3 2531 }
79072805 2532 }
3280af22
NIS
2533 PL_toptarget = NEWSV(0,0);
2534 sv_upgrade(PL_toptarget, SVt_PVFM);
2535 sv_setpvn(PL_toptarget, "", 0);
2536 PL_bodytarget = NEWSV(0,0);
2537 sv_upgrade(PL_bodytarget, SVt_PVFM);
2538 sv_setpvn(PL_bodytarget, "", 0);
2539 PL_formtarget = PL_bodytarget;
79072805 2540
bbce6d69 2541 TAINT;
85e6fe83 2542 if (tmpgv = gv_fetchpv("0",TRUE, SVt_PV)) {
3280af22 2543 sv_setpv(GvSV(tmpgv),PL_origfilename);
79072805
LW
2544 magicname("0", "0", 1);
2545 }
85e6fe83 2546 if (tmpgv = gv_fetchpv("\030",TRUE, SVt_PV))
3280af22
NIS
2547 sv_setpv(GvSV(tmpgv),PL_origargv[0]);
2548 if (PL_argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV)) {
2549 GvMULTI_on(PL_argvgv);
2550 (void)gv_AVadd(PL_argvgv);
2551 av_clear(GvAVn(PL_argvgv));
79072805 2552 for (; argc > 0; argc--,argv++) {
3280af22 2553 av_push(GvAVn(PL_argvgv),newSVpv(argv[0],0));
79072805
LW
2554 }
2555 }
3280af22 2556 if (PL_envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV)) {
79072805 2557 HV *hv;
3280af22
NIS
2558 GvMULTI_on(PL_envgv);
2559 hv = GvHVn(PL_envgv);
2560 hv_magic(hv, PL_envgv, 'E');
a0d0e21e 2561#ifndef VMS /* VMS doesn't have environ array */
4633a7c4
LW
2562 /* Note that if the supplied env parameter is actually a copy
2563 of the global environ then it may now point to free'd memory
2564 if the environment has been modified since. To avoid this
2565 problem we treat env==NULL as meaning 'use the default'
2566 */
2567 if (!env)
2568 env = environ;
5aabfad6 2569 if (env != environ)
79072805
LW
2570 environ[0] = Nullch;
2571 for (; *env; env++) {
93a17b20 2572 if (!(s = strchr(*env,'=')))
79072805
LW
2573 continue;
2574 *s++ = '\0';
60ce6247 2575#if defined(MSDOS)
137443ea 2576 (void)strupr(*env);
2577#endif
79072805
LW
2578 sv = newSVpv(s--,0);
2579 (void)hv_store(hv, *env, s - *env, sv, 0);
2580 *s = '=';
3e3baf6d
TB
2581#if defined(__BORLANDC__) && defined(USE_WIN32_RTL_ENV)
2582 /* Sins of the RTL. See note in my_setenv(). */
76e3520e 2583 (void)PerlEnv_putenv(savepv(*env));
3e3baf6d 2584#endif
fe14fcc3 2585 }
4550b24a 2586#endif
2587#ifdef DYNAMIC_ENV_FETCH
2588 HvNAME(hv) = savepv(ENV_HV_NAME);
2589#endif
79072805 2590 }
bbce6d69 2591 TAINT_NOT;
85e6fe83 2592 if (tmpgv = gv_fetchpv("$",TRUE, SVt_PV))
1e422769 2593 sv_setiv(GvSV(tmpgv), (IV)getpid());
33b78306 2594}
34de22dd 2595
76e3520e 2596STATIC void
8ac85365 2597init_perllib(void)
34de22dd 2598{
85e6fe83 2599 char *s;
3280af22 2600 if (!PL_tainting) {
552a7a9b 2601#ifndef VMS
76e3520e 2602 s = PerlEnv_getenv("PERL5LIB");
85e6fe83 2603 if (s)
774d564b 2604 incpush(s, TRUE);
85e6fe83 2605 else
76e3520e 2606 incpush(PerlEnv_getenv("PERLLIB"), FALSE);
552a7a9b 2607#else /* VMS */
2608 /* Treat PERL5?LIB as a possible search list logical name -- the
2609 * "natural" VMS idiom for a Unix path string. We allow each
2610 * element to be a set of |-separated directories for compatibility.
2611 */
2612 char buf[256];
2613 int idx = 0;
2614 if (my_trnlnm("PERL5LIB",buf,0))
774d564b 2615 do { incpush(buf,TRUE); } while (my_trnlnm("PERL5LIB",buf,++idx));
552a7a9b 2616 else
774d564b 2617 while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE);
552a7a9b 2618#endif /* VMS */
85e6fe83 2619 }
34de22dd 2620
c90c0ff4 2621/* Use the ~-expanded versions of APPLLIB (undocumented),
dfe9444c 2622 ARCHLIB PRIVLIB SITEARCH and SITELIB
df5cef82 2623*/
4633a7c4 2624#ifdef APPLLIB_EXP
43051805 2625 incpush(APPLLIB_EXP, TRUE);
16d20bd9 2626#endif
4633a7c4 2627
fed7345c 2628#ifdef ARCHLIB_EXP
774d564b 2629 incpush(ARCHLIB_EXP, FALSE);
a0d0e21e 2630#endif
fed7345c
AD
2631#ifndef PRIVLIB_EXP
2632#define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
34de22dd 2633#endif
00dc2f4f
GS
2634#if defined(WIN32)
2635 incpush(PRIVLIB_EXP, TRUE);
2636#else
774d564b 2637 incpush(PRIVLIB_EXP, FALSE);
00dc2f4f 2638#endif
4633a7c4
LW
2639
2640#ifdef SITEARCH_EXP
774d564b 2641 incpush(SITEARCH_EXP, FALSE);
4633a7c4
LW
2642#endif
2643#ifdef SITELIB_EXP
00dc2f4f
GS
2644#if defined(WIN32)
2645 incpush(SITELIB_EXP, TRUE);
2646#else
774d564b 2647 incpush(SITELIB_EXP, FALSE);
4633a7c4 2648#endif
00dc2f4f 2649#endif
3280af22 2650 if (!PL_tainting)
774d564b 2651 incpush(".", FALSE);
2652}
2653
2654#if defined(DOSISH)
2655# define PERLLIB_SEP ';'
2656#else
2657# if defined(VMS)
2658# define PERLLIB_SEP '|'
2659# else
2660# define PERLLIB_SEP ':'
2661# endif
2662#endif
2663#ifndef PERLLIB_MANGLE
2664# define PERLLIB_MANGLE(s,n) (s)
2665#endif
2666
76e3520e 2667STATIC void
8ac85365 2668incpush(char *p, int addsubdirs)
774d564b 2669{
2670 SV *subdir = Nullsv;
774d564b 2671
2672 if (!p)
2673 return;
2674
2675 if (addsubdirs) {
00db4c45 2676 subdir = sv_newmortal();
3280af22
NIS
2677 if (!PL_archpat_auto) {
2678 STRLEN len = (sizeof(ARCHNAME) + strlen(PL_patchlevel)
774d564b 2679 + sizeof("//auto"));
3280af22
NIS
2680 New(55, PL_archpat_auto, len, char);
2681 sprintf(PL_archpat_auto, "/%s/%s/auto", ARCHNAME, PL_patchlevel);
aa689395 2682#ifdef VMS
2683 for (len = sizeof(ARCHNAME) + 2;
6b88bc9c
GS
2684 PL_archpat_auto[len] != '\0' && PL_archpat_auto[len] != '/'; len++)
2685 if (PL_archpat_auto[len] == '.') PL_archpat_auto[len] = '_';
aa689395 2686#endif
774d564b 2687 }
2688 }
2689
2690 /* Break at all separators */
2691 while (p && *p) {
8c52afec 2692 SV *libdir = NEWSV(55,0);
774d564b 2693 char *s;
2694
2695 /* skip any consecutive separators */
2696 while ( *p == PERLLIB_SEP ) {
2697 /* Uncomment the next line for PATH semantics */
6b88bc9c 2698 /* av_push(GvAVn(PL_incgv), newSVpv(".", 1)); */
774d564b 2699 p++;
2700 }
2701
2702 if ( (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
2703 sv_setpvn(libdir, PERLLIB_MANGLE(p, (STRLEN)(s - p)),
2704 (STRLEN)(s - p));
2705 p = s + 1;
2706 }
2707 else {
2708 sv_setpv(libdir, PERLLIB_MANGLE(p, 0));
2709 p = Nullch; /* break out */
2710 }
2711
2712 /*
2713 * BEFORE pushing libdir onto @INC we may first push version- and
2714 * archname-specific sub-directories.
2715 */
2716 if (addsubdirs) {
2717 struct stat tmpstatbuf;
aa689395 2718#ifdef VMS
2719 char *unix;
2720 STRLEN len;
774d564b 2721
6b88bc9c 2722 if ((unix = tounixspec_ts(SvPV(libdir,PL_na),Nullch)) != Nullch) {
aa689395 2723 len = strlen(unix);
2724 while (unix[len-1] == '/') len--; /* Cosmetic */
2725 sv_usepvn(libdir,unix,len);
2726 }
2727 else
2728 PerlIO_printf(PerlIO_stderr(),
2729 "Failed to unixify @INC element \"%s\"\n",
6b88bc9c 2730 SvPV(libdir,PL_na));
aa689395 2731#endif
4fdae800 2732 /* .../archname/version if -d .../archname/version/auto */
774d564b 2733 sv_setsv(subdir, libdir);
3280af22 2734 sv_catpv(subdir, PL_archpat_auto);
76e3520e 2735 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
774d564b 2736 S_ISDIR(tmpstatbuf.st_mode))
3280af22 2737 av_push(GvAVn(PL_incgv),
774d564b 2738 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2739
4fdae800 2740 /* .../archname if -d .../archname/auto */
774d564b 2741 sv_insert(subdir, SvCUR(libdir) + sizeof(ARCHNAME),
3280af22 2742 strlen(PL_patchlevel) + 1, "", 0);
76e3520e 2743 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
774d564b 2744 S_ISDIR(tmpstatbuf.st_mode))
3280af22 2745 av_push(GvAVn(PL_incgv),
774d564b 2746 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2747 }
2748
2749 /* finally push this lib directory on the end of @INC */
3280af22 2750 av_push(GvAVn(PL_incgv), libdir);
774d564b 2751 }
34de22dd 2752}
93a17b20 2753
199100c8 2754#ifdef USE_THREADS
76e3520e 2755STATIC struct perl_thread *
199100c8
MB
2756init_main_thread()
2757{
52e1cb5e 2758 struct perl_thread *thr;
199100c8
MB
2759 XPV *xpv;
2760
52e1cb5e 2761 Newz(53, thr, 1, struct perl_thread);
533c011a 2762 PL_curcop = &PL_compiling;
199100c8 2763 thr->cvcache = newHV();
54b9620d 2764 thr->threadsv = newAV();
940cb80d 2765 /* thr->threadsvp is set when find_threadsv is called */
199100c8 2766 thr->specific = newAV();
38a03e6e 2767 thr->errhv = newHV();
199100c8
MB
2768 thr->flags = THRf_R_JOINABLE;
2769 MUTEX_INIT(&thr->mutex);
2770 /* Handcraft thrsv similarly to mess_sv */
533c011a 2771 New(53, PL_thrsv, 1, SV);
199100c8 2772 Newz(53, xpv, 1, XPV);
533c011a
NIS
2773 SvFLAGS(PL_thrsv) = SVt_PV;
2774 SvANY(PL_thrsv) = (void*)xpv;
2775 SvREFCNT(PL_thrsv) = 1 << 30; /* practically infinite */
2776 SvPVX(PL_thrsv) = (char*)thr;
2777 SvCUR_set(PL_thrsv, sizeof(thr));
2778 SvLEN_set(PL_thrsv, sizeof(thr));
2779 *SvEND(PL_thrsv) = '\0'; /* in the trailing_nul field */
2780 thr->oursv = PL_thrsv;
2781 PL_chopset = " \n-";
2782
2783 MUTEX_LOCK(&PL_threads_mutex);
2784 PL_nthreads++;
199100c8
MB
2785 thr->tid = 0;
2786 thr->next = thr;
2787 thr->prev = thr;
533c011a 2788 MUTEX_UNLOCK(&PL_threads_mutex);
199100c8 2789
4b026b9e
GS
2790#ifdef HAVE_THREAD_INTERN
2791 init_thread_intern(thr);
235db74f
GS
2792#endif
2793
2794#ifdef SET_THREAD_SELF
2795 SET_THREAD_SELF(thr);
199100c8
MB
2796#else
2797 thr->self = pthread_self();
235db74f 2798#endif /* SET_THREAD_SELF */
199100c8
MB
2799 SET_THR(thr);
2800
2801 /*
2802 * These must come after the SET_THR because sv_setpvn does
2803 * SvTAINT and the taint fields require dTHR.
2804 */
533c011a
NIS
2805 PL_toptarget = NEWSV(0,0);
2806 sv_upgrade(PL_toptarget, SVt_PVFM);
2807 sv_setpvn(PL_toptarget, "", 0);
2808 PL_bodytarget = NEWSV(0,0);
2809 sv_upgrade(PL_bodytarget, SVt_PVFM);
2810 sv_setpvn(PL_bodytarget, "", 0);
2811 PL_formtarget = PL_bodytarget;
2faa37cc 2812 thr->errsv = newSVpv("", 0);
78857c3c 2813 (void) find_threadsv("@"); /* Ensure $@ is initialised early */
5c0ca799 2814
533c011a
NIS
2815 PL_maxscream = -1;
2816 PL_regcompp = FUNC_NAME_TO_PTR(pregcomp);
2817 PL_regexecp = FUNC_NAME_TO_PTR(regexec_flags);
2818 PL_regindent = 0;
2819 PL_reginterp_cnt = 0;
5c0ca799 2820
199100c8
MB
2821 return thr;
2822}
2823#endif /* USE_THREADS */
2824
93a17b20 2825void
76e3520e 2826call_list(I32 oldscope, AV *paramList)
93a17b20 2827{
11343788 2828 dTHR;
3280af22 2829 line_t oldline = PL_curcop->cop_line;
22921e25
CS
2830 STRLEN len;
2831 dJMPENV;
6224f72b 2832 int ret;
93a17b20 2833
76e3520e
GS
2834 while (AvFILL(paramList) >= 0) {
2835 CV *cv = (CV*)av_shift(paramList);
93a17b20 2836
8990e307 2837 SAVEFREESV(cv);
a0d0e21e 2838
6224f72b
GS
2839 JMPENV_PUSH(ret);
2840 switch (ret) {
2841 case 0: {
38a03e6e 2842 SV* atsv = ERRSV;
3280af22 2843 PUSHMARK(PL_stack_sp);
748a9306 2844 perl_call_sv((SV*)cv, G_EVAL|G_DISCARD);
12f917ad 2845 (void)SvPV(atsv, len);
748a9306 2846 if (len) {
54310121 2847 JMPENV_POP;
3280af22
NIS
2848 PL_curcop = &PL_compiling;
2849 PL_curcop->cop_line = oldline;
2850 if (paramList == PL_beginav)
12f917ad 2851 sv_catpv(atsv, "BEGIN failed--compilation aborted");
748a9306 2852 else
12f917ad 2853 sv_catpv(atsv, "END failed--cleanup aborted");
3280af22 2854 while (PL_scopestack_ix > oldscope)
2ae324a7 2855 LEAVE;
12f917ad 2856 croak("%s", SvPVX(atsv));
748a9306 2857 }
a0d0e21e 2858 }
85e6fe83 2859 break;
6224f72b 2860 case 1:
f86702cc 2861 STATUS_ALL_FAILURE;
85e6fe83 2862 /* FALL THROUGH */
6224f72b 2863 case 2:
85e6fe83 2864 /* my_exit() was called */
3280af22 2865 while (PL_scopestack_ix > oldscope)
2ae324a7 2866 LEAVE;
84902520 2867 FREETMPS;
3280af22
NIS
2868 PL_curstash = PL_defstash;
2869 if (PL_endav)
2870 call_list(oldscope, PL_endav);
54310121 2871 JMPENV_POP;
3280af22
NIS
2872 PL_curcop = &PL_compiling;
2873 PL_curcop->cop_line = oldline;
2874 if (PL_statusvalue) {
2875 if (paramList == PL_beginav)
a0d0e21e 2876 croak("BEGIN failed--compilation aborted");
85e6fe83 2877 else
a0d0e21e 2878 croak("END failed--cleanup aborted");
85e6fe83 2879 }
f86702cc 2880 my_exit_jump();
85e6fe83 2881 /* NOTREACHED */
6224f72b 2882 case 3:
3280af22 2883 if (!PL_restartop) {
760ac839 2884 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
a0d0e21e 2885 FREETMPS;
85e6fe83
LW
2886 break;
2887 }
54310121 2888 JMPENV_POP;
3280af22
NIS
2889 PL_curcop = &PL_compiling;
2890 PL_curcop->cop_line = oldline;
6224f72b 2891 JMPENV_JUMP(3);
8990e307 2892 }
54310121 2893 JMPENV_POP;
93a17b20 2894 }
93a17b20 2895}
93a17b20 2896
f86702cc 2897void
8ac85365 2898my_exit(U32 status)
f86702cc 2899{
5dc0d613
MB
2900 dTHR;
2901
8b73bbec 2902 DEBUG_S(PerlIO_printf(Perl_debug_log, "my_exit: thread %p, status %lu\n",
a863c7d1 2903 thr, (unsigned long) status));
f86702cc 2904 switch (status) {
2905 case 0:
2906 STATUS_ALL_SUCCESS;
2907 break;
2908 case 1:
2909 STATUS_ALL_FAILURE;
2910 break;
2911 default:
2912 STATUS_NATIVE_SET(status);
2913 break;
2914 }
2915 my_exit_jump();
2916}
2917
2918void
8ac85365 2919my_failure_exit(void)
f86702cc 2920{
2921#ifdef VMS
2922 if (vaxc$errno & 1) {
4fdae800 2923 if (STATUS_NATIVE & 1) /* fortuitiously includes "-1" */
2924 STATUS_NATIVE_SET(44);
f86702cc 2925 }
2926 else {
ff0cee69 2927 if (!vaxc$errno && errno) /* unlikely */
4fdae800 2928 STATUS_NATIVE_SET(44);
f86702cc 2929 else
4fdae800 2930 STATUS_NATIVE_SET(vaxc$errno);
f86702cc 2931 }
2932#else
9b599b2a 2933 int exitstatus;
f86702cc 2934 if (errno & 255)
2935 STATUS_POSIX_SET(errno);
9b599b2a
GS
2936 else {
2937 exitstatus = STATUS_POSIX >> 8;
2938 if (exitstatus & 255)
2939 STATUS_POSIX_SET(exitstatus);
2940 else
2941 STATUS_POSIX_SET(255);
2942 }
f86702cc 2943#endif
2944 my_exit_jump();
93a17b20
LW
2945}
2946
76e3520e 2947STATIC void
8ac85365 2948my_exit_jump(void)
f86702cc 2949{
bac4b2ad 2950 dSP;
c09156bb 2951 register PERL_CONTEXT *cx;
f86702cc 2952 I32 gimme;
2953 SV **newsp;
2954
3280af22
NIS
2955 if (PL_e_script) {
2956 SvREFCNT_dec(PL_e_script);
2957 PL_e_script = Nullsv;
f86702cc 2958 }
2959
3280af22 2960 POPSTACK_TO(PL_mainstack);
f86702cc 2961 if (cxstack_ix >= 0) {
2962 if (cxstack_ix > 0)
2963 dounwind(0);
3280af22 2964 POPBLOCK(cx,PL_curpm);
f86702cc 2965 LEAVE;
2966 }
ff0cee69 2967
6224f72b 2968 JMPENV_JUMP(2);
f86702cc 2969}
873ef191 2970
7a5f8e82
DL
2971#ifdef PERL_OBJECT
2972#define NO_XSLOCKS
2973#endif /* PERL_OBJECT */
873ef191
GS
2974
2975#include "XSUB.h"
2976
2977static I32
6224f72b
GS
2978#ifdef PERL_OBJECT
2979read_e_script(CPerlObj *pPerl, int idx, SV *buf_sv, int maxlen)
2980#else
2981read_e_script(int idx, SV *buf_sv, int maxlen)
2982#endif
873ef191
GS
2983{
2984 char *p, *nl;
3280af22 2985 p = SvPVX(PL_e_script);
873ef191 2986 nl = strchr(p, '\n');
3280af22 2987 nl = (nl) ? nl+1 : SvEND(PL_e_script);
7dfe3f66
PM
2988 if (nl-p == 0) {
2989 filter_del(read_e_script);
873ef191 2990 return 0;
7dfe3f66 2991 }
873ef191 2992 sv_catpvn(buf_sv, p, nl-p);
3280af22 2993 sv_chop(PL_e_script, nl);
873ef191
GS
2994 return 1;
2995}
2996
1163b5c4 2997