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