This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
malloc.c tweaks
[perl5.git] / pp_sys.c
index df2b7ae..2630e05 100644 (file)
--- a/pp_sys.c
+++ b/pp_sys.c
@@ -69,7 +69,9 @@ extern int h_errno;
     struct passwd *getpwnam _((char *));
     struct passwd *getpwuid _((Uid_t));
 # endif
+# ifdef HAS_GETPWENT
   struct passwd *getpwent _((void));
+# endif
 #endif
 
 #ifdef HAS_GROUP
@@ -79,7 +81,9 @@ extern int h_errno;
     struct group *getgrnam _((char *));
     struct group *getgrgid _((Gid_t));
 # endif
+# ifdef HAS_GETGRENT
     struct group *getgrent _((void));
+# endif
 #endif
 
 #ifdef I_UTIME
@@ -238,7 +242,7 @@ PP(pp_glob)
     ENTER;
 
 #ifndef VMS
-    if (tainting) {
+    if (PL_tainting) {
        /*
         * The external globbing program may use things we can't control,
         * so for security reasons we must assume the worst.
@@ -248,14 +252,14 @@ PP(pp_glob)
     }
 #endif /* !VMS */
 
-    SAVESPTR(last_in_gv);      /* We don't want this to be permanent. */
-    last_in_gv = (GV*)*stack_sp--;
+    SAVESPTR(PL_last_in_gv);   /* We don't want this to be permanent. */
+    PL_last_in_gv = (GV*)*PL_stack_sp--;
 
-    SAVESPTR(rs);              /* This is not permanent, either. */
-    rs = sv_2mortal(newSVpv("", 1));
+    SAVESPTR(PL_rs);           /* This is not permanent, either. */
+    PL_rs = sv_2mortal(newSVpv("", 1));
 #ifndef DOSISH
 #ifndef CSH
-    *SvPVX(rs) = '\n';
+    *SvPVX(PL_rs) = '\n';
 #endif /* !CSH */
 #endif /* !DOSISH */
 
@@ -264,15 +268,17 @@ PP(pp_glob)
     return result;
 }
 
+#if 0          /* XXX never used! */
 PP(pp_indread)
 {
-    last_in_gv = gv_fetchpv(SvPVx(GvSV((GV*)(*stack_sp--)), na), TRUE,SVt_PVIO);
+    PL_last_in_gv = gv_fetchpv(SvPVx(GvSV((GV*)(*PL_stack_sp--)), PL_na), TRUE,SVt_PVIO);
     return do_readline();
 }
+#endif
 
 PP(pp_rcatline)
 {
-    last_in_gv = cGVOP->op_gv;
+    PL_last_in_gv = cGVOP->op_gv;
     return do_readline();
 }
 
@@ -282,19 +288,19 @@ PP(pp_warn)
     char *tmps;
     if (SP - MARK != 1) {
        dTARGET;
-       do_join(TARG, &sv_no, MARK, SP);
-       tmps = SvPV(TARG, na);
+       do_join(TARG, &PL_sv_no, MARK, SP);
+       tmps = SvPV(TARG, PL_na);
        SP = MARK + 1;
     }
     else {
-       tmps = SvPV(TOPs, na);
+       tmps = SvPV(TOPs, PL_na);
     }
     if (!tmps || !*tmps) {
        SV *error = ERRSV;
        (void)SvUPGRADE(error, SVt_PV);
        if (SvPOK(error) && SvCUR(error))
            sv_catpv(error, "\t...caught");
-       tmps = SvPV(error, na);
+       tmps = SvPV(error, PL_na);
     }
     if (!tmps || !*tmps)
        tmps = "Warning: something's wrong";
@@ -310,13 +316,13 @@ PP(pp_die)
     char *pat = "%s";
     if (SP - MARK != 1) {
        dTARGET;
-       do_join(TARG, &sv_no, MARK, SP);
-       tmps = SvPV(TARG, na);
+       do_join(TARG, &PL_sv_no, MARK, SP);
+       tmps = SvPV(TARG, PL_na);
        SP = MARK + 1;
     }
     else {
        tmpsv = TOPs;
-       tmps = SvROK(tmpsv) ? Nullch : SvPV(tmpsv, na);
+       tmps = SvROK(tmpsv) ? Nullch : SvPV(tmpsv, PL_na);
     }
     if (!tmps || !*tmps) {
        SV *error = ERRSV;
@@ -328,8 +334,8 @@ PP(pp_die)
                HV *stash = SvSTASH(SvRV(error));
                GV *gv = gv_fetchmethod(stash, "PROPAGATE");
                if (gv) {
-                   SV *file = sv_2mortal(newSVsv(GvSV(curcop->cop_filegv)));
-                   SV *line = sv_2mortal(newSViv(curcop->cop_line));
+                   SV *file = sv_2mortal(newSVsv(GvSV(PL_curcop->cop_filegv)));
+                   SV *line = sv_2mortal(newSViv(PL_curcop->cop_line));
                    EXTEND(SP, 3);
                    PUSHMARK(SP);
                    PUSHs(error);
@@ -338,7 +344,7 @@ PP(pp_die)
                    PUTBACK;
                    perl_call_sv((SV*)GvCV(gv),
                                 G_SCALAR|G_EVAL|G_KEEPERR);
-                   sv_setsv(error,*stack_sp--);
+                   sv_setsv(error,*PL_stack_sp--);
                }
            }
            pat = Nullch;
@@ -346,7 +352,7 @@ PP(pp_die)
        else {
            if (SvPOK(error) && SvCUR(error))
                sv_catpv(error, "\t...propagated");
-           tmps = SvPV(error, na);
+           tmps = SvPV(error, PL_na);
        }
     }
     if (!tmps || !*tmps)
@@ -376,9 +382,9 @@ PP(pp_open)
     if (GvIOp(gv))
        IoFLAGS(GvIOp(gv)) &= ~IOf_UNTAINT;
     tmps = SvPV(sv, len);
-    if (do_open(gv, tmps, len, FALSE, 0, 0, Nullfp))
-       PUSHi( (I32)forkprocess );
-    else if (forkprocess == 0)         /* we are a new child */
+    if (do_open(gv, tmps, len, FALSE, O_RDONLY, 0, Nullfp))
+       PUSHi( (I32)PL_forkprocess );
+    else if (PL_forkprocess == 0)              /* we are a new child */
        PUSHi(0);
     else
        RETPUSHUNDEF;
@@ -392,7 +398,7 @@ PP(pp_close)
     MAGIC *mg;
 
     if (MAXARG == 0)
-       gv = defoutgv;
+       gv = PL_defoutgv;
     else
        gv = (GV*)POPs;
 
@@ -493,7 +499,12 @@ PP(pp_umask)
     TAINT_PROPER("umask");
     XPUSHi(anum);
 #else
-    XPUSHs(&sv_undef);
+    /* Only DIE if trying to restrict permissions on `user' (self).
+     * Otherwise it's harmless and more useful to just return undef
+     * since 'group' and 'other' concepts probably don't exist here. */
+    if (MAXARG >= 1 && (POPi & 0700))
+       DIE("umask not implemented");
+    XPUSHs(&PL_sv_undef);
 #endif
     RETURN;
 }
@@ -529,7 +540,7 @@ PP(pp_tie)
     HV* stash;
     GV *gv;
     SV *sv;
-    I32 markoff = MARK - stack_base;
+    I32 markoff = MARK - PL_stack_base;
     char *methname;
     int how = 'P';
     U32 items;
@@ -554,7 +565,7 @@ PP(pp_tie)
     items = SP - MARK++;
     if (sv_isobject(*MARK)) {
        ENTER;
-       PUSHSTACK(SI_MAGIC);
+       PUSHSTACKi(PERLSI_MAGIC);
        PUSHMARK(SP);
        EXTEND(SP,items);
        while (items--)
@@ -569,10 +580,10 @@ PP(pp_tie)
        stash = gv_stashsv(*MARK, FALSE);
        if (!stash || !(gv = gv_fetchmethod(stash, methname))) {
            DIE("Can't locate object method \"%s\" via package \"%s\"",
-                methname, SvPV(*MARK,na));                   
+                methname, SvPV(*MARK,PL_na));                   
        }
        ENTER;
-       PUSHSTACK(SI_MAGIC);
+       PUSHSTACKi(PERLSI_MAGIC);
        PUSHMARK(SP);
        EXTEND(SP,items);
        while (items--)
@@ -583,13 +594,13 @@ PP(pp_tie)
     SPAGAIN;
 
     sv = TOPs;
-    POPSTACK();
+    POPSTACK;
     if (sv_isobject(sv)) {
        sv_unmagic(varsv, how);            
        sv_magic(varsv, sv, how, Nullch, 0);
     }
     LEAVE;
-    SP = stack_base + markoff;
+    SP = PL_stack_base + markoff;
     PUSHs(sv);
     RETURN;
 }
@@ -601,7 +612,7 @@ PP(pp_untie)
 
     sv = POPs;
 
-    if (dowarn) {
+    if (PL_dowarn) {
         MAGIC * mg ;
         if (SvMAGICAL(sv)) {
             if (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
@@ -654,7 +665,7 @@ PP(pp_dbmopen)
 
     hv = (HV*)POPs;
 
-    sv = sv_mortalcopy(&sv_no);
+    sv = sv_mortalcopy(&PL_sv_no);
     sv_setpv(sv, "AnyDBM_File");
     stash = gv_stashsv(sv, FALSE);
     if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH"))) {
@@ -743,7 +754,8 @@ PP(pp_sselect)
     }
 
 #if BYTEORDER == 0x1234 || BYTEORDER == 0x12345678
-#if defined(__linux__) || defined(OS2)
+/* XXX Configure test needed. */
+#if defined(__linux__) || defined(OS2) || defined(NeXT) || defined(__osf__) || defined(sun)
     growsize = sizeof(fd_set);
 #else
     growsize = maxlen;         /* little endians can use vecs directly */
@@ -782,7 +794,7 @@ PP(pp_sselect)
            continue;
        }
        else if (!SvPOK(sv))
-           SvPV_force(sv,na);  /* force string conversion */
+           SvPV_force(sv,PL_na);       /* force string conversion */
        j = SvLEN(sv);
        if (j < growsize) {
            Sv_Grow(sv, growsize);
@@ -830,7 +842,7 @@ PP(pp_sselect)
     if (GIMME == G_ARRAY && tbuf) {
        value = (double)(timebuf.tv_sec) +
                (double)(timebuf.tv_usec) / 1000000.0;
-       PUSHs(sv = sv_mortalcopy(&sv_no));
+       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
        sv_setnv(sv, value);
     }
     RETURN;
@@ -845,9 +857,9 @@ setdefout(GV *gv)
     dTHR;
     if (gv)
        (void)SvREFCNT_inc(gv);
-    if (defoutgv)
-       SvREFCNT_dec(defoutgv);
-    defoutgv = gv;
+    if (PL_defoutgv)
+       SvREFCNT_dec(PL_defoutgv);
+    PL_defoutgv = gv;
 }
 
 PP(pp_select)
@@ -856,18 +868,18 @@ PP(pp_select)
     GV *newdefout, *egv;
     HV *hv;
 
-    newdefout = (op->op_private > 0) ? ((GV *) POPs) : (GV *) NULL;
+    newdefout = (PL_op->op_private > 0) ? ((GV *) POPs) : (GV *) NULL;
 
-    egv = GvEGV(defoutgv);
+    egv = GvEGV(PL_defoutgv);
     if (!egv)
-       egv = defoutgv;
+       egv = PL_defoutgv;
     hv = GvSTASH(egv);
     if (! hv)
-       XPUSHs(&sv_undef);
+       XPUSHs(&PL_sv_undef);
     else {
        GV **gvp = (GV**)hv_fetch(hv, GvNAME(egv), GvNAMELEN(egv), FALSE);
        if (gvp && *gvp == egv) {
-           gv_efullname3(TARG, defoutgv, Nullch);
+           gv_efullname3(TARG, PL_defoutgv, Nullch);
            XPUSHTARG;
        }
        else {
@@ -891,11 +903,11 @@ PP(pp_getc)
     MAGIC *mg;
 
     if (MAXARG <= 0)
-       gv = stdingv;
+       gv = PL_stdingv;
     else
        gv = (GV*)POPs;
     if (!gv)
-       gv = argvgv;
+       gv = PL_argvgv;
 
     if (SvRMAGICAL(gv) && (mg = mg_find((SV*)gv, 'q'))) {
        I32 gimme = GIMME_V;
@@ -937,10 +949,10 @@ doform(CV *cv, GV *gv, OP *retop)
     SAVETMPS;
 
     push_return(retop);
-    PUSHBLOCK(cx, CXt_SUB, stack_sp);
+    PUSHBLOCK(cx, CXt_SUB, PL_stack_sp);
     PUSHFORMAT(cx);
-    SAVESPTR(curpad);
-    curpad = AvARRAY((AV*)svp[1]);
+    SAVESPTR(PL_curpad);
+    PL_curpad = AvARRAY((AV*)svp[1]);
 
     setdefout(gv);         /* locally select filehandle so $% et al work */
     return CvSTART(cv);
@@ -955,11 +967,11 @@ PP(pp_enterwrite)
     CV *cv;
 
     if (MAXARG == 0)
-       gv = defoutgv;
+       gv = PL_defoutgv;
     else {
        gv = (GV*)POPs;
        if (!gv)
-           gv = defoutgv;
+           gv = PL_defoutgv;
     }
     EXTEND(SP, 1);
     io = GvIO(gv);
@@ -984,7 +996,7 @@ PP(pp_enterwrite)
        cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
 
     IoFLAGS(io) &= ~IOf_DIDTOP;
-    return doform(cv,gv,op->op_next);
+    return doform(cv,gv,PL_op->op_next);
 }
 
 PP(pp_leavewrite)
@@ -999,9 +1011,9 @@ PP(pp_leavewrite)
     register PERL_CONTEXT *cx;
 
     DEBUG_f(PerlIO_printf(Perl_debug_log, "left=%ld, todo=%ld\n",
-         (long)IoLINES_LEFT(io), (long)FmLINES(formtarget)));
-    if (IoLINES_LEFT(io) < FmLINES(formtarget) &&
-       formtarget != toptarget)
+         (long)IoLINES_LEFT(io), (long)FmLINES(PL_formtarget)));
+    if (IoLINES_LEFT(io) < FmLINES(PL_formtarget) &&
+       PL_formtarget != PL_toptarget)
     {
        GV *fgv;
        CV *cv;
@@ -1029,7 +1041,7 @@ PP(pp_leavewrite)
        }
        if (IoFLAGS(io) & IOf_DIDTOP) { /* Oh dear.  It still doesn't fit. */
            I32 lines = IoLINES_LEFT(io);
-           char *s = SvPVX(formtarget);
+           char *s = SvPVX(PL_formtarget);
            if (lines <= 0)             /* Yow, header didn't even fit!!! */
                goto forget_top;
            while (lines-- > 0) {
@@ -1039,16 +1051,16 @@ PP(pp_leavewrite)
                s++;
            }
            if (s) {
-               PerlIO_write(ofp, SvPVX(formtarget), s - SvPVX(formtarget));
-               sv_chop(formtarget, s);
-               FmLINES(formtarget) -= IoLINES_LEFT(io);
+               PerlIO_write(ofp, SvPVX(PL_formtarget), s - SvPVX(PL_formtarget));
+               sv_chop(PL_formtarget, s);
+               FmLINES(PL_formtarget) -= IoLINES_LEFT(io);
            }
        }
        if (IoLINES_LEFT(io) >= 0 && IoPAGE(io) > 0)
-           PerlIO_write(ofp, SvPVX(formfeed), SvCUR(formfeed));
+           PerlIO_write(ofp, SvPVX(PL_formfeed), SvCUR(PL_formfeed));
        IoLINES_LEFT(io) = IoPAGE_LEN(io);
        IoPAGE(io)++;
-       formtarget = toptarget;
+       PL_formtarget = PL_toptarget;
        IoFLAGS(io) |= IOf_DIDTOP;
        fgv = IoTOP_GV(io);
        if (!fgv)
@@ -1061,42 +1073,42 @@ PP(pp_leavewrite)
        }
        if (CvCLONE(cv))
            cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
-       return doform(cv,gv,op);
+       return doform(cv,gv,PL_op);
     }
 
   forget_top:
-    POPBLOCK(cx,curpm);
+    POPBLOCK(cx,PL_curpm);
     POPFORMAT(cx);
     LEAVE;
 
     fp = IoOFP(io);
     if (!fp) {
-       if (dowarn) {
+       if (PL_dowarn) {
            if (IoIFP(io))
                warn("Filehandle only opened for input");
            else
                warn("Write on closed filehandle");
        }
-       PUSHs(&sv_no);
+       PUSHs(&PL_sv_no);
     }
     else {
-       if ((IoLINES_LEFT(io) -= FmLINES(formtarget)) < 0) {
-           if (dowarn)
+       if ((IoLINES_LEFT(io) -= FmLINES(PL_formtarget)) < 0) {
+           if (PL_dowarn)
                warn("page overflow");
        }
-       if (!PerlIO_write(ofp, SvPVX(formtarget), SvCUR(formtarget)) ||
+       if (!PerlIO_write(ofp, SvPVX(PL_formtarget), SvCUR(PL_formtarget)) ||
                PerlIO_error(fp))
-           PUSHs(&sv_no);
+           PUSHs(&PL_sv_no);
        else {
-           FmLINES(formtarget) = 0;
-           SvCUR_set(formtarget, 0);
-           *SvEND(formtarget) = '\0';
+           FmLINES(PL_formtarget) = 0;
+           SvCUR_set(PL_formtarget, 0);
+           *SvEND(PL_formtarget) = '\0';
            if (IoFLAGS(io) & IOf_FLUSH)
                (void)PerlIO_flush(fp);
-           PUSHs(&sv_yes);
+           PUSHs(&PL_sv_yes);
        }
     }
-    formtarget = bodytarget;
+    PL_formtarget = PL_bodytarget;
     PUTBACK;
     return pop_return();
 }
@@ -1110,10 +1122,10 @@ PP(pp_prtf)
     SV *sv;
     MAGIC *mg;
 
-    if (op->op_flags & OPf_STACKED)
+    if (PL_op->op_flags & OPf_STACKED)
        gv = (GV*)*++MARK;
     else
-       gv = defoutgv;
+       gv = PL_defoutgv;
 
     if (SvRMAGICAL(gv) && (mg = mg_find((SV*)gv, 'q'))) {
        if (MARK == ORIGMARK) {
@@ -1137,27 +1149,27 @@ PP(pp_prtf)
 
     sv = NEWSV(0,0);
     if (!(io = GvIO(gv))) {
-       if (dowarn) {
+       if (PL_dowarn) {
            gv_fullname3(sv, gv, Nullch);
-           warn("Filehandle %s never opened", SvPV(sv,na));
+           warn("Filehandle %s never opened", SvPV(sv,PL_na));
        }
        SETERRNO(EBADF,RMS$_IFI);
        goto just_say_no;
     }
     else if (!(fp = IoOFP(io))) {
-       if (dowarn)  {
+       if (PL_dowarn)  {
            gv_fullname3(sv, gv, Nullch);
            if (IoIFP(io))
-               warn("Filehandle %s opened only for input", SvPV(sv,na));
+               warn("Filehandle %s opened only for input", SvPV(sv,PL_na));
            else
-               warn("printf on closed filehandle %s", SvPV(sv,na));
+               warn("printf on closed filehandle %s", SvPV(sv,PL_na));
        }
        SETERRNO(EBADF,IoIFP(io)?RMS$_FAC:RMS$_IFI);
        goto just_say_no;
     }
     else {
 #ifdef USE_LOCALE_NUMERIC
-       if (op->op_private & OPpLOCALE)
+       if (PL_op->op_private & OPpLOCALE)
            SET_NUMERIC_LOCAL();
        else
            SET_NUMERIC_STANDARD();
@@ -1172,13 +1184,13 @@ PP(pp_prtf)
     }
     SvREFCNT_dec(sv);
     SP = ORIGMARK;
-    PUSHs(&sv_yes);
+    PUSHs(&PL_sv_yes);
     RETURN;
 
   just_say_no:
     SvREFCNT_dec(sv);
     SP = ORIGMARK;
-    PUSHs(&sv_undef);
+    PUSHs(&PL_sv_undef);
     RETURN;
 }
 
@@ -1202,10 +1214,10 @@ PP(pp_sysopen)
     tmps = SvPV(sv, len);
     if (do_open(gv, tmps, len, TRUE, mode, perm, Nullfp)) {
        IoLINES(GvIOp(gv)) = 0;
-       PUSHs(&sv_yes);
+       PUSHs(&PL_sv_yes);
     }
     else {
-       PUSHs(&sv_undef);
+       PUSHs(&PL_sv_undef);
     }
     RETURN;
 }
@@ -1224,7 +1236,7 @@ PP(pp_sysread)
     MAGIC *mg;
 
     gv = (GV*)*++MARK;
-    if ((op->op_type == OP_READ || op->op_type == OP_SYSREAD) &&
+    if ((PL_op->op_type == OP_READ || PL_op->op_type == OP_SYSREAD) &&
        SvRMAGICAL(gv) && (mg = mg_find((SV*)gv, 'q')))
     {
        SV *sv;
@@ -1259,9 +1271,9 @@ PP(pp_sysread)
     if (!io || !IoIFP(io))
        goto say_undef;
 #ifdef HAS_SOCKET
-    if (op->op_type == OP_RECV) {
+    if (PL_op->op_type == OP_RECV) {
        char namebuf[MAXPATHLEN];
-#if defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)
+#if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(MPE)
        bufsize = sizeof (struct sockaddr_in);
 #else
        bufsize = sizeof namebuf;
@@ -1285,7 +1297,7 @@ PP(pp_sysread)
        RETURN;
     }
 #else
-    if (op->op_type == OP_RECV)
+    if (PL_op->op_type == OP_RECV)
        DIE(no_sock_func, "recv");
 #endif
     if (offset < 0) {
@@ -1298,7 +1310,7 @@ PP(pp_sysread)
     if (offset > bufsize) { /* Zero any newly allocated space */
        Zero(buffer+bufsize, offset-bufsize, char);
     }
-    if (op->op_type == OP_SYSREAD) {
+    if (PL_op->op_type == OP_SYSREAD) {
        length = PerlLIO_read(PerlIO_fileno(IoIFP(io)), buffer+offset, length);
     }
     else
@@ -1315,7 +1327,12 @@ PP(pp_sysread)
     }
     else
 #endif
+    {
        length = PerlIO_read(IoIFP(io), buffer+offset, length);
+       /* fread() returns 0 on both error and EOF */
+       if (length == 0 && PerlIO_error(IoIFP(io)))
+           length = -1;
+    }
     if (length < 0)
        goto say_undef;
     SvCUR_set(bufsv, length+offset);
@@ -1352,7 +1369,7 @@ PP(pp_send)
     MAGIC *mg;
 
     gv = (GV*)*++MARK;
-    if (op->op_type == OP_SYSWRITE &&
+    if (PL_op->op_type == OP_SYSWRITE &&
        SvRMAGICAL(gv) && (mg = mg_find((SV*)gv, 'q')))
     {
        SV *sv;
@@ -1379,14 +1396,14 @@ PP(pp_send)
     io = GvIO(gv);
     if (!io || !IoIFP(io)) {
        length = -1;
-       if (dowarn) {
-           if (op->op_type == OP_SYSWRITE)
+       if (PL_dowarn) {
+           if (PL_op->op_type == OP_SYSWRITE)
                warn("Syswrite on closed filehandle");
            else
                warn("Send on closed socket");
        }
     }
-    else if (op->op_type == OP_SYSWRITE) {
+    else if (PL_op->op_type == OP_SYSWRITE) {
        if (MARK < SP) {
            offset = SvIVx(*++MARK);
            if (offset < 0) {
@@ -1438,9 +1455,9 @@ PP(pp_eof)
     GV *gv;
 
     if (MAXARG <= 0)
-       gv = last_in_gv;
+       gv = PL_last_in_gv;
     else
-       gv = last_in_gv = (GV*)POPs;
+       gv = PL_last_in_gv = (GV*)POPs;
     PUSHs(boolSV(!gv || do_eof(gv)));
     RETURN;
 }
@@ -1451,9 +1468,9 @@ PP(pp_tell)
     GV *gv;
 
     if (MAXARG <= 0)
-       gv = last_in_gv;
+       gv = PL_last_in_gv;
     else
-       gv = last_in_gv = (GV*)POPs;
+       gv = PL_last_in_gv = (GV*)POPs;
     PUSHi( do_tell(gv) );
     RETURN;
 }
@@ -1470,12 +1487,12 @@ PP(pp_sysseek)
     int whence = POPi;
     long offset = POPl;
 
-    gv = last_in_gv = (GV*)POPs;
-    if (op->op_type == OP_SEEK)
+    gv = PL_last_in_gv = (GV*)POPs;
+    if (PL_op->op_type == OP_SEEK)
        PUSHs(boolSV(do_seek(gv, offset, whence)));
     else {
        long n = do_sysseek(gv, offset, whence);
-       PUSHs((n < 0) ? &sv_undef
+       PUSHs((n < 0) ? &PL_sv_undef
              : sv_2mortal(n ? newSViv((IV)n)
                           : newSVpv(zero_but_true, ZBTLEN)));
     }
@@ -1491,7 +1508,7 @@ PP(pp_truncate)
 
     SETERRNO(0,0);
 #if defined(HAS_TRUNCATE) || defined(HAS_CHSIZE) || defined(F_FREESP)
-    if (op->op_flags & OPf_SPECIAL) {
+    if (PL_op->op_flags & OPf_SPECIAL) {
        tmpgv = gv_fetchpv(POPp, FALSE, SVt_PVIO);
     do_ftruncate:
        TAINT_PROPER("truncate");
@@ -1516,7 +1533,7 @@ PP(pp_truncate)
            goto do_ftruncate;
        }
 
-       name = SvPV(sv, na);
+       name = SvPV(sv, PL_na);
        TAINT_PROPER("truncate");
 #ifdef HAS_TRUNCATE
        if (truncate(name, len) < 0)
@@ -1555,7 +1572,7 @@ PP(pp_ioctl)
     djSP; dTARGET;
     SV *argsv = POPs;
     unsigned int func = U_I(POPn);
-    int optype = op->op_type;
+    int optype = PL_op->op_type;
     char *s;
     IV retval;
     GV *gv = (GV*)POPs;
@@ -1632,7 +1649,7 @@ PP(pp_flock)
 #ifdef FLOCK
     argtype = POPi;
     if (MAXARG <= 0)
-       gv = last_in_gv;
+       gv = PL_last_in_gv;
     else
        gv = (GV*)POPs;
     if (gv && GvIO(gv))
@@ -1750,24 +1767,53 @@ PP(pp_bind)
 {
     djSP;
 #ifdef HAS_SOCKET
+#ifdef MPE /* Requires PRIV mode to bind() to ports < 1024 */
+    extern GETPRIVMODE();
+    extern GETUSERMODE();
+#endif
     SV *addrsv = POPs;
     char *addr;
     GV *gv = (GV*)POPs;
     register IO *io = GvIOn(gv);
     STRLEN len;
+    int bind_ok = 0;
+#ifdef MPE
+    int mpeprivmode = 0;
+#endif
 
     if (!io || !IoIFP(io))
        goto nuts;
 
     addr = SvPV(addrsv, len);
     TAINT_PROPER("bind");
-    if (PerlSock_bind(PerlIO_fileno(IoIFP(io)), (struct sockaddr *)addr, len) >= 0)
+#ifdef MPE /* Deal with MPE bind() peculiarities */
+    if (((struct sockaddr *)addr)->sa_family == AF_INET) {
+        /* The address *MUST* stupidly be zero. */
+        ((struct sockaddr_in *)addr)->sin_addr.s_addr = INADDR_ANY;
+        /* PRIV mode is required to bind() to ports < 1024. */
+        if (((struct sockaddr_in *)addr)->sin_port < 1024 &&
+            ((struct sockaddr_in *)addr)->sin_port > 0) {
+            GETPRIVMODE(); /* If this fails, we are aborted by MPE/iX. */
+           mpeprivmode = 1;
+       }
+    }
+#endif /* MPE */
+    if (PerlSock_bind(PerlIO_fileno(IoIFP(io)),
+                     (struct sockaddr *)addr, len) >= 0)
+       bind_ok = 1;
+
+#ifdef MPE /* Switch back to USER mode */
+    if (mpeprivmode)
+       GETUSERMODE();
+#endif /* MPE */
+
+    if (bind_ok)
        RETPUSHYES;
     else
        RETPUSHUNDEF;
 
 nuts:
-    if (dowarn)
+    if (PL_dowarn)
        warn("bind() on closed fd");
     SETERRNO(EBADF,SS$_IVCHAN);
     RETPUSHUNDEF;
@@ -1797,7 +1843,7 @@ PP(pp_connect)
        RETPUSHUNDEF;
 
 nuts:
-    if (dowarn)
+    if (PL_dowarn)
        warn("connect() on closed fd");
     SETERRNO(EBADF,SS$_IVCHAN);
     RETPUSHUNDEF;
@@ -1823,7 +1869,7 @@ PP(pp_listen)
        RETPUSHUNDEF;
 
 nuts:
-    if (dowarn)
+    if (PL_dowarn)
        warn("listen() on closed fd");
     SETERRNO(EBADF,SS$_IVCHAN);
     RETPUSHUNDEF;
@@ -1877,7 +1923,7 @@ PP(pp_accept)
     RETURN;
 
 nuts:
-    if (dowarn)
+    if (PL_dowarn)
        warn("accept() on closed fd");
     SETERRNO(EBADF,SS$_IVCHAN);
 
@@ -1904,7 +1950,7 @@ PP(pp_shutdown)
     RETURN;
 
 nuts:
-    if (dowarn)
+    if (PL_dowarn)
        warn("shutdown() on closed fd");
     SETERRNO(EBADF,SS$_IVCHAN);
     RETPUSHUNDEF;
@@ -1926,7 +1972,7 @@ PP(pp_ssockopt)
 {
     djSP;
 #ifdef HAS_SOCKET
-    int optype = op->op_type;
+    int optype = PL_op->op_type;
     SV *sv;
     int fd;
     unsigned int optname;
@@ -1965,8 +2011,8 @@ PP(pp_ssockopt)
            char *buf;
            int aint;
            if (SvPOKp(sv)) {
-               buf = SvPV(sv, na);
-               len = na;
+               buf = SvPV(sv, PL_na);
+               len = PL_na;
            }
            else {
                aint = (int)SvIV(sv);
@@ -1975,14 +2021,14 @@ PP(pp_ssockopt)
            }
            if (PerlSock_setsockopt(fd, lvl, optname, buf, len) < 0)
                goto nuts2;
-           PUSHs(&sv_yes);
+           PUSHs(&PL_sv_yes);
        }
        break;
     }
     RETURN;
 
 nuts:
-    if (dowarn)
+    if (PL_dowarn)
        warn("[gs]etsockopt() on closed fd");
     SETERRNO(EBADF,SS$_IVCHAN);
 nuts2:
@@ -2006,7 +2052,7 @@ PP(pp_getpeername)
 {
     djSP;
 #ifdef HAS_SOCKET
-    int optype = op->op_type;
+    int optype = PL_op->op_type;
     SV *sv;
     int fd;
     GV *gv = (GV*)POPs;
@@ -2055,7 +2101,7 @@ PP(pp_getpeername)
     RETURN;
 
 nuts:
-    if (dowarn)
+    if (PL_dowarn)
        warn("get{sock, peer}name() on closed fd");
     SETERRNO(EBADF,SS$_IVCHAN);
 nuts2:
@@ -2080,17 +2126,17 @@ PP(pp_stat)
     I32 gimme;
     I32 max = 13;
 
-    if (op->op_flags & OPf_REF) {
+    if (PL_op->op_flags & OPf_REF) {
        tmpgv = cGVOP->op_gv;
       do_fstat:
-       if (tmpgv != defgv) {
-           laststype = OP_STAT;
-           statgv = tmpgv;
-           sv_setpv(statname, "");
-           laststatval = (GvIO(tmpgv) && IoIFP(GvIOp(tmpgv))
-               ? PerlLIO_fstat(PerlIO_fileno(IoIFP(GvIOn(tmpgv))), &statcache) : -1);
+       if (tmpgv != PL_defgv) {
+           PL_laststype = OP_STAT;
+           PL_statgv = tmpgv;
+           sv_setpv(PL_statname, "");
+           PL_laststatval = (GvIO(tmpgv) && IoIFP(GvIOp(tmpgv))
+               ? PerlLIO_fstat(PerlIO_fileno(IoIFP(GvIOn(tmpgv))), &PL_statcache) : -1);
        }
-       if (laststatval < 0)
+       if (PL_laststatval < 0)
            max = 0;
     }
     else {
@@ -2103,17 +2149,17 @@ PP(pp_stat)
            tmpgv = (GV*)SvRV(sv);
            goto do_fstat;
        }
-       sv_setpv(statname, SvPV(sv,na));
-       statgv = Nullgv;
+       sv_setpv(PL_statname, SvPV(sv,PL_na));
+       PL_statgv = Nullgv;
 #ifdef HAS_LSTAT
-       laststype = op->op_type;
-       if (op->op_type == OP_LSTAT)
-           laststatval = PerlLIO_lstat(SvPV(statname, na), &statcache);
+       PL_laststype = PL_op->op_type;
+       if (PL_op->op_type == OP_LSTAT)
+           PL_laststatval = PerlLIO_lstat(SvPV(PL_statname, PL_na), &PL_statcache);
        else
 #endif
-           laststatval = PerlLIO_stat(SvPV(statname, na), &statcache);
-       if (laststatval < 0) {
-           if (dowarn && strchr(SvPV(statname, na), '\n'))
+           PL_laststatval = PerlLIO_stat(SvPV(PL_statname, PL_na), &PL_statcache);
+       if (PL_laststatval < 0) {
+           if (PL_dowarn && strchr(SvPV(PL_statname, PL_na), '\n'))
                warn(warn_nl, "stat");
            max = 0;
        }
@@ -2128,30 +2174,30 @@ PP(pp_stat)
     if (max) {
        EXTEND(SP, max);
        EXTEND_MORTAL(max);
-       PUSHs(sv_2mortal(newSViv((I32)statcache.st_dev)));
-       PUSHs(sv_2mortal(newSViv((I32)statcache.st_ino)));
-       PUSHs(sv_2mortal(newSViv((I32)statcache.st_mode)));
-       PUSHs(sv_2mortal(newSViv((I32)statcache.st_nlink)));
-       PUSHs(sv_2mortal(newSViv((I32)statcache.st_uid)));
-       PUSHs(sv_2mortal(newSViv((I32)statcache.st_gid)));
+       PUSHs(sv_2mortal(newSViv((I32)PL_statcache.st_dev)));
+       PUSHs(sv_2mortal(newSViv((I32)PL_statcache.st_ino)));
+       PUSHs(sv_2mortal(newSViv((I32)PL_statcache.st_mode)));
+       PUSHs(sv_2mortal(newSViv((I32)PL_statcache.st_nlink)));
+       PUSHs(sv_2mortal(newSViv((I32)PL_statcache.st_uid)));
+       PUSHs(sv_2mortal(newSViv((I32)PL_statcache.st_gid)));
 #ifdef USE_STAT_RDEV
-       PUSHs(sv_2mortal(newSViv((I32)statcache.st_rdev)));
+       PUSHs(sv_2mortal(newSViv((I32)PL_statcache.st_rdev)));
 #else
        PUSHs(sv_2mortal(newSVpv("", 0)));
 #endif
-       PUSHs(sv_2mortal(newSViv((I32)statcache.st_size)));
+       PUSHs(sv_2mortal(newSViv((I32)PL_statcache.st_size)));
 #ifdef BIG_TIME
-       PUSHs(sv_2mortal(newSVnv((U32)statcache.st_atime)));
-       PUSHs(sv_2mortal(newSVnv((U32)statcache.st_mtime)));
-       PUSHs(sv_2mortal(newSVnv((U32)statcache.st_ctime)));
+       PUSHs(sv_2mortal(newSVnv((U32)PL_statcache.st_atime)));
+       PUSHs(sv_2mortal(newSVnv((U32)PL_statcache.st_mtime)));
+       PUSHs(sv_2mortal(newSVnv((U32)PL_statcache.st_ctime)));
 #else
-       PUSHs(sv_2mortal(newSViv((I32)statcache.st_atime)));
-       PUSHs(sv_2mortal(newSViv((I32)statcache.st_mtime)));
-       PUSHs(sv_2mortal(newSViv((I32)statcache.st_ctime)));
+       PUSHs(sv_2mortal(newSViv((I32)PL_statcache.st_atime)));
+       PUSHs(sv_2mortal(newSViv((I32)PL_statcache.st_mtime)));
+       PUSHs(sv_2mortal(newSViv((I32)PL_statcache.st_ctime)));
 #endif
 #ifdef USE_STAT_BLOCKS
-       PUSHs(sv_2mortal(newSViv((I32)statcache.st_blksize)));
-       PUSHs(sv_2mortal(newSViv((I32)statcache.st_blocks)));
+       PUSHs(sv_2mortal(newSViv((I32)PL_statcache.st_blksize)));
+       PUSHs(sv_2mortal(newSViv((I32)PL_statcache.st_blocks)));
 #else
        PUSHs(sv_2mortal(newSVpv("", 0)));
        PUSHs(sv_2mortal(newSVpv("", 0)));
@@ -2166,7 +2212,7 @@ PP(pp_ftrread)
     djSP;
     if (result < 0)
        RETPUSHUNDEF;
-    if (cando(S_IRUSR, 0, &statcache))
+    if (cando(S_IRUSR, 0, &PL_statcache))
        RETPUSHYES;
     RETPUSHNO;
 }
@@ -2177,7 +2223,7 @@ PP(pp_ftrwrite)
     djSP;
     if (result < 0)
        RETPUSHUNDEF;
-    if (cando(S_IWUSR, 0, &statcache))
+    if (cando(S_IWUSR, 0, &PL_statcache))
        RETPUSHYES;
     RETPUSHNO;
 }
@@ -2188,7 +2234,7 @@ PP(pp_ftrexec)
     djSP;
     if (result < 0)
        RETPUSHUNDEF;
-    if (cando(S_IXUSR, 0, &statcache))
+    if (cando(S_IXUSR, 0, &PL_statcache))
        RETPUSHYES;
     RETPUSHNO;
 }
@@ -2199,7 +2245,7 @@ PP(pp_fteread)
     djSP;
     if (result < 0)
        RETPUSHUNDEF;
-    if (cando(S_IRUSR, 1, &statcache))
+    if (cando(S_IRUSR, 1, &PL_statcache))
        RETPUSHYES;
     RETPUSHNO;
 }
@@ -2210,7 +2256,7 @@ PP(pp_ftewrite)
     djSP;
     if (result < 0)
        RETPUSHUNDEF;
-    if (cando(S_IWUSR, 1, &statcache))
+    if (cando(S_IWUSR, 1, &PL_statcache))
        RETPUSHYES;
     RETPUSHNO;
 }
@@ -2221,7 +2267,7 @@ PP(pp_fteexec)
     djSP;
     if (result < 0)
        RETPUSHUNDEF;
-    if (cando(S_IXUSR, 1, &statcache))
+    if (cando(S_IXUSR, 1, &PL_statcache))
        RETPUSHYES;
     RETPUSHNO;
 }
@@ -2246,7 +2292,7 @@ PP(pp_ftrowned)
     djSP;
     if (result < 0)
        RETPUSHUNDEF;
-    if (statcache.st_uid == (op->op_type == OP_FTEOWNED ? euid : uid) )
+    if (PL_statcache.st_uid == (PL_op->op_type == OP_FTEOWNED ? PL_euid : PL_uid) )
        RETPUSHYES;
     RETPUSHNO;
 }
@@ -2257,7 +2303,7 @@ PP(pp_ftzero)
     djSP;
     if (result < 0)
        RETPUSHUNDEF;
-    if (!statcache.st_size)
+    if (!PL_statcache.st_size)
        RETPUSHYES;
     RETPUSHNO;
 }
@@ -2268,7 +2314,7 @@ PP(pp_ftsize)
     djSP; dTARGET;
     if (result < 0)
        RETPUSHUNDEF;
-    PUSHi(statcache.st_size);
+    PUSHi(PL_statcache.st_size);
     RETURN;
 }
 
@@ -2278,7 +2324,7 @@ PP(pp_ftmtime)
     djSP; dTARGET;
     if (result < 0)
        RETPUSHUNDEF;
-    PUSHn( ((I32)basetime - (I32)statcache.st_mtime) / 86400.0 );
+    PUSHn( ((I32)PL_basetime - (I32)PL_statcache.st_mtime) / 86400.0 );
     RETURN;
 }
 
@@ -2288,7 +2334,7 @@ PP(pp_ftatime)
     djSP; dTARGET;
     if (result < 0)
        RETPUSHUNDEF;
-    PUSHn( ((I32)basetime - (I32)statcache.st_atime) / 86400.0 );
+    PUSHn( ((I32)PL_basetime - (I32)PL_statcache.st_atime) / 86400.0 );
     RETURN;
 }
 
@@ -2298,7 +2344,7 @@ PP(pp_ftctime)
     djSP; dTARGET;
     if (result < 0)
        RETPUSHUNDEF;
-    PUSHn( ((I32)basetime - (I32)statcache.st_ctime) / 86400.0 );
+    PUSHn( ((I32)PL_basetime - (I32)PL_statcache.st_ctime) / 86400.0 );
     RETURN;
 }
 
@@ -2308,7 +2354,7 @@ PP(pp_ftsock)
     djSP;
     if (result < 0)
        RETPUSHUNDEF;
-    if (S_ISSOCK(statcache.st_mode))
+    if (S_ISSOCK(PL_statcache.st_mode))
        RETPUSHYES;
     RETPUSHNO;
 }
@@ -2319,7 +2365,7 @@ PP(pp_ftchr)
     djSP;
     if (result < 0)
        RETPUSHUNDEF;
-    if (S_ISCHR(statcache.st_mode))
+    if (S_ISCHR(PL_statcache.st_mode))
        RETPUSHYES;
     RETPUSHNO;
 }
@@ -2330,7 +2376,7 @@ PP(pp_ftblk)
     djSP;
     if (result < 0)
        RETPUSHUNDEF;
-    if (S_ISBLK(statcache.st_mode))
+    if (S_ISBLK(PL_statcache.st_mode))
        RETPUSHYES;
     RETPUSHNO;
 }
@@ -2341,7 +2387,7 @@ PP(pp_ftfile)
     djSP;
     if (result < 0)
        RETPUSHUNDEF;
-    if (S_ISREG(statcache.st_mode))
+    if (S_ISREG(PL_statcache.st_mode))
        RETPUSHYES;
     RETPUSHNO;
 }
@@ -2352,7 +2398,7 @@ PP(pp_ftdir)
     djSP;
     if (result < 0)
        RETPUSHUNDEF;
-    if (S_ISDIR(statcache.st_mode))
+    if (S_ISDIR(PL_statcache.st_mode))
        RETPUSHYES;
     RETPUSHNO;
 }
@@ -2363,7 +2409,7 @@ PP(pp_ftpipe)
     djSP;
     if (result < 0)
        RETPUSHUNDEF;
-    if (S_ISFIFO(statcache.st_mode))
+    if (S_ISFIFO(PL_statcache.st_mode))
        RETPUSHYES;
     RETPUSHNO;
 }
@@ -2374,7 +2420,7 @@ PP(pp_ftlink)
     djSP;
     if (result < 0)
        RETPUSHUNDEF;
-    if (S_ISLNK(statcache.st_mode))
+    if (S_ISLNK(PL_statcache.st_mode))
        RETPUSHYES;
     RETPUSHNO;
 }
@@ -2387,7 +2433,7 @@ PP(pp_ftsuid)
     SPAGAIN;
     if (result < 0)
        RETPUSHUNDEF;
-    if (statcache.st_mode & S_ISUID)
+    if (PL_statcache.st_mode & S_ISUID)
        RETPUSHYES;
 #endif
     RETPUSHNO;
@@ -2401,7 +2447,7 @@ PP(pp_ftsgid)
     SPAGAIN;
     if (result < 0)
        RETPUSHUNDEF;
-    if (statcache.st_mode & S_ISGID)
+    if (PL_statcache.st_mode & S_ISGID)
        RETPUSHYES;
 #endif
     RETPUSHNO;
@@ -2415,7 +2461,7 @@ PP(pp_ftsvtx)
     SPAGAIN;
     if (result < 0)
        RETPUSHUNDEF;
-    if (statcache.st_mode & S_ISVTX)
+    if (PL_statcache.st_mode & S_ISVTX)
        RETPUSHYES;
 #endif
     RETPUSHNO;
@@ -2428,7 +2474,7 @@ PP(pp_fttty)
     GV *gv;
     char *tmps = Nullch;
 
-    if (op->op_flags & OPf_REF)
+    if (PL_op->op_flags & OPf_REF)
        gv = cGVOP->op_gv;
     else if (isGV(TOPs))
        gv = (GV*)POPs;
@@ -2468,7 +2514,7 @@ PP(pp_fttext)
     register SV *sv;
     GV *gv;
 
-    if (op->op_flags & OPf_REF)
+    if (PL_op->op_flags & OPf_REF)
        gv = cGVOP->op_gv;
     else if (isGV(TOPs))
        gv = (GV*)POPs;
@@ -2479,28 +2525,28 @@ PP(pp_fttext)
 
     if (gv) {
        EXTEND(SP, 1);
-       if (gv == defgv) {
-           if (statgv)
-               io = GvIO(statgv);
+       if (gv == PL_defgv) {
+           if (PL_statgv)
+               io = GvIO(PL_statgv);
            else {
-               sv = statname;
+               sv = PL_statname;
                goto really_filename;
            }
        }
        else {
-           statgv = gv;
-           laststatval = -1;
-           sv_setpv(statname, "");
-           io = GvIO(statgv);
+           PL_statgv = gv;
+           PL_laststatval = -1;
+           sv_setpv(PL_statname, "");
+           io = GvIO(PL_statgv);
        }
        if (io && IoIFP(io)) {
            if (! PerlIO_has_base(IoIFP(io)))
                DIE("-T and -B not implemented on filehandles");
-           laststatval = PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &statcache);
-           if (laststatval < 0)
+           PL_laststatval = PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
+           if (PL_laststatval < 0)
                RETPUSHUNDEF;
-           if (S_ISDIR(statcache.st_mode))     /* handle NFS glitch */
-               if (op->op_type == OP_FTTEXT)
+           if (S_ISDIR(PL_statcache.st_mode))  /* handle NFS glitch */
+               if (PL_op->op_type == OP_FTTEXT)
                    RETPUSHNO;
                else
                    RETPUSHYES;
@@ -2518,7 +2564,7 @@ PP(pp_fttext)
                len = 512;
        }
        else {
-           if (dowarn)
+           if (PL_dowarn)
                warn("Test on unopened file <%s>",
                  GvENAME(cGVOP->op_gv));
            SETERRNO(EBADF,RMS$_IFI);
@@ -2528,26 +2574,26 @@ PP(pp_fttext)
     else {
        sv = POPs;
       really_filename:
-       statgv = Nullgv;
-       laststatval = -1;
-       sv_setpv(statname, SvPV(sv, na));
+       PL_statgv = Nullgv;
+       PL_laststatval = -1;
+       sv_setpv(PL_statname, SvPV(sv, PL_na));
 #ifdef HAS_OPEN3
-       i = PerlLIO_open3(SvPV(sv, na), O_RDONLY, 0);
+       i = PerlLIO_open3(SvPV(sv, PL_na), O_RDONLY, 0);
 #else
-       i = PerlLIO_open(SvPV(sv, na), 0);
+       i = PerlLIO_open(SvPV(sv, PL_na), 0);
 #endif
        if (i < 0) {
-           if (dowarn && strchr(SvPV(sv, na), '\n'))
+           if (PL_dowarn && strchr(SvPV(sv, PL_na), '\n'))
                warn(warn_nl, "open");
            RETPUSHUNDEF;
        }
-       laststatval = PerlLIO_fstat(i, &statcache);
-       if (laststatval < 0)
+       PL_laststatval = PerlLIO_fstat(i, &PL_statcache);
+       if (PL_laststatval < 0)
            RETPUSHUNDEF;
        len = PerlLIO_read(i, tbuf, 512);
        (void)PerlLIO_close(i);
        if (len <= 0) {
-           if (S_ISDIR(statcache.st_mode) && op->op_type == OP_FTTEXT)
+           if (S_ISDIR(PL_statcache.st_mode) && PL_op->op_type == OP_FTTEXT)
                RETPUSHNO;              /* special case NFS directories */
            RETPUSHYES;         /* null file is anything */
        }
@@ -2562,15 +2608,20 @@ PP(pp_fttext)
            odd += len;
            break;
        }
+#ifdef EBCDIC
+        else if (!(isPRINT(*s) || isSPACE(*s))) 
+            odd++;
+#else
        else if (*s & 128)
            odd++;
        else if (*s < 32 &&
          *s != '\n' && *s != '\r' && *s != '\b' &&
          *s != '\t' && *s != '\f' && *s != 27)
            odd++;
+#endif
     }
 
-    if ((odd * 3 > len) == (op->op_type == OP_FTTEXT)) /* allow 1/3 odd */
+    if ((odd * 3 > len) == (PL_op->op_type == OP_FTTEXT)) /* allow 1/3 odd */
        RETPUSHNO;
     else
        RETPUSHYES;
@@ -2594,20 +2645,20 @@ PP(pp_chdir)
     else
        tmps = POPp;
     if (!tmps || !*tmps) {
-       svp = hv_fetch(GvHVn(envgv), "HOME", 4, FALSE);
+       svp = hv_fetch(GvHVn(PL_envgv), "HOME", 4, FALSE);
        if (svp)
-           tmps = SvPV(*svp, na);
+           tmps = SvPV(*svp, PL_na);
     }
     if (!tmps || !*tmps) {
-       svp = hv_fetch(GvHVn(envgv), "LOGDIR", 6, FALSE);
+       svp = hv_fetch(GvHVn(PL_envgv), "LOGDIR", 6, FALSE);
        if (svp)
-           tmps = SvPV(*svp, na);
+           tmps = SvPV(*svp, PL_na);
     }
 #ifdef VMS
     if (!tmps || !*tmps) {
-       svp = hv_fetch(GvHVn(envgv), "SYS$LOGIN", 9, FALSE);
+       svp = hv_fetch(GvHVn(PL_envgv), "SYS$LOGIN", 9, FALSE);
        if (svp)
-           tmps = SvPV(*svp, na);
+           tmps = SvPV(*svp, PL_na);
     }
 #endif
     TAINT_PROPER("chdir");
@@ -2615,7 +2666,7 @@ PP(pp_chdir)
 #ifdef VMS
     /* Clear the DEFAULT element of ENV so we'll get the new value
      * in the future. */
-    hv_delete(GvHVn(envgv),"DEFAULT",7,G_DISCARD);
+    hv_delete(GvHVn(PL_envgv),"DEFAULT",7,G_DISCARD);
 #endif
     RETURN;
 }
@@ -2625,7 +2676,7 @@ PP(pp_chown)
     djSP; dMARK; dTARGET;
     I32 value;
 #ifdef HAS_CHOWN
-    value = (I32)apply(op->op_type, MARK, SP);
+    value = (I32)apply(PL_op->op_type, MARK, SP);
     SP = MARK;
     PUSHi(value);
     RETURN;
@@ -2652,7 +2703,7 @@ PP(pp_unlink)
 {
     djSP; dMARK; dTARGET;
     I32 value;
-    value = (I32)apply(op->op_type, MARK, SP);
+    value = (I32)apply(PL_op->op_type, MARK, SP);
     SP = MARK;
     PUSHi(value);
     RETURN;
@@ -2662,7 +2713,7 @@ PP(pp_chmod)
 {
     djSP; dMARK; dTARGET;
     I32 value;
-    value = (I32)apply(op->op_type, MARK, SP);
+    value = (I32)apply(PL_op->op_type, MARK, SP);
     SP = MARK;
     PUSHi(value);
     RETURN;
@@ -2672,7 +2723,7 @@ PP(pp_utime)
 {
     djSP; dMARK; dTARGET;
     I32 value;
-    value = (I32)apply(op->op_type, MARK, SP);
+    value = (I32)apply(PL_op->op_type, MARK, SP);
     SP = MARK;
     PUSHi(value);
     RETURN;
@@ -2684,16 +2735,16 @@ PP(pp_rename)
     int anum;
 
     char *tmps2 = POPp;
-    char *tmps = SvPV(TOPs, na);
+    char *tmps = SvPV(TOPs, PL_na);
     TAINT_PROPER("rename");
 #ifdef HAS_RENAME
-    anum = rename(tmps, tmps2);
+    anum = PerlLIO_rename(tmps, tmps2);
 #else
-    if (!(anum = PerlLIO_stat(tmps, &statbuf))) {
+    if (!(anum = PerlLIO_stat(tmps, &PL_statbuf))) {
        if (same_dirent(tmps2, tmps))   /* can always rename to same name */
            anum = 1;
        else {
-           if (euid || PerlLIO_stat(tmps2, &statbuf) < 0 || !S_ISDIR(statbuf.st_mode))
+           if (PL_euid || PerlLIO_stat(tmps2, &PL_statbuf) < 0 || !S_ISDIR(PL_statbuf.st_mode))
                (void)UNLINK(tmps2);
            if (!(anum = link(tmps, tmps2)))
                anum = UNLINK(tmps);
@@ -2709,7 +2760,7 @@ PP(pp_link)
     djSP; dTARGET;
 #ifdef HAS_LINK
     char *tmps2 = POPp;
-    char *tmps = SvPV(TOPs, na);
+    char *tmps = SvPV(TOPs, PL_na);
     TAINT_PROPER("link");
     SETi( link(tmps, tmps2) >= 0 );
 #else
@@ -2723,7 +2774,7 @@ PP(pp_symlink)
     djSP; dTARGET;
 #ifdef HAS_SYMLINK
     char *tmps2 = POPp;
-    char *tmps = SvPV(TOPs, na);
+    char *tmps = SvPV(TOPs, PL_na);
     TAINT_PROPER("symlink");
     SETi( symlink(tmps, tmps2) >= 0 );
     RETURN;
@@ -2781,7 +2832,7 @@ char *filename;
 
     if (myfp) {
        SV *tmpsv = sv_newmortal();
-       /* Need to save/restore 'rs' ?? */
+       /* Need to save/restore 'PL_rs' ?? */
        s = sv_gets(tmpsv, myfp, 0);
        (void)PerlProc_pclose(myfp);
        if (s != Nullch) {
@@ -2830,8 +2881,8 @@ char *filename;
            return 0;
        }
        else {  /* some mkdirs return no failure indication */
-           anum = (PerlLIO_stat(save_filename, &statbuf) >= 0);
-           if (op->op_type == OP_RMDIR)
+           anum = (PerlLIO_stat(save_filename, &PL_statbuf) >= 0);
+           if (PL_op->op_type == OP_RMDIR)
                anum = !anum;
            if (anum)
                SETERRNO(0,0);
@@ -2852,7 +2903,7 @@ PP(pp_mkdir)
 #ifndef HAS_MKDIR
     int oldumask;
 #endif
-    char *tmps = SvPV(TOPs, na);
+    char *tmps = SvPV(TOPs, PL_na);
 
     TAINT_PROPER("mkdir");
 #ifdef HAS_MKDIR
@@ -3080,7 +3131,7 @@ PP(pp_fork)
        /*SUPPRESS 560*/
        if (tmpgv = gv_fetchpv("$", TRUE, SVt_PV))
            sv_setiv(GvSV(tmpgv), (IV)getpid());
-       hv_clear(pidstatus);    /* no kids, so don't wait for 'em */
+       hv_clear(PL_pidstatus); /* no kids, so don't wait for 'em */
     }
     PUSHi(childpid);
     RETURN;
@@ -3134,8 +3185,8 @@ PP(pp_system)
     Sigsave_t ihand,qhand;     /* place to save signals during system() */
 
     if (SP - MARK == 1) {
-       if (tainting) {
-           char *junk = SvPV(TOPs, na);
+       if (PL_tainting) {
+           char *junk = SvPV(TOPs, PL_na);
            TAINT_ENV();
            TAINT_PROPER("system");
        }
@@ -3164,25 +3215,25 @@ PP(pp_system)
        PUSHi(STATUS_CURRENT);
        RETURN;
     }
-    if (op->op_flags & OPf_STACKED) {
+    if (PL_op->op_flags & OPf_STACKED) {
        SV *really = *++MARK;
        value = (I32)do_aexec(really, MARK, SP);
     }
     else if (SP - MARK != 1)
        value = (I32)do_aexec(Nullsv, MARK, SP);
     else {
-       value = (I32)do_exec(SvPVx(sv_mortalcopy(*SP), na));
+       value = (I32)do_exec(SvPVx(sv_mortalcopy(*SP), PL_na));
     }
     PerlProc__exit(-1);
 #else /* ! FORK or VMS or OS/2 */
-    if (op->op_flags & OPf_STACKED) {
+    if (PL_op->op_flags & OPf_STACKED) {
        SV *really = *++MARK;
        value = (I32)do_aspawn(really, (void **)MARK, (void **)SP);
     }
     else if (SP - MARK != 1)
        value = (I32)do_aspawn(Nullsv, (void **)MARK, (void **)SP);
     else {
-       value = (I32)do_spawn(SvPVx(sv_mortalcopy(*SP), na));
+       value = (I32)do_spawn(SvPVx(sv_mortalcopy(*SP), PL_na));
     }
     STATUS_NATIVE_SET(value);
     do_execfree();
@@ -3197,7 +3248,7 @@ PP(pp_exec)
     djSP; dMARK; dORIGMARK; dTARGET;
     I32 value;
 
-    if (op->op_flags & OPf_STACKED) {
+    if (PL_op->op_flags & OPf_STACKED) {
        SV *really = *++MARK;
        value = (I32)do_aexec(really, MARK, SP);
     }
@@ -3208,15 +3259,15 @@ PP(pp_exec)
        value = (I32)do_aexec(Nullsv, MARK, SP);
 #endif
     else {
-       if (tainting) {
-           char *junk = SvPV(*SP, na);
+       if (PL_tainting) {
+           char *junk = SvPV(*SP, PL_na);
            TAINT_ENV();
            TAINT_PROPER("exec");
        }
 #ifdef VMS
-       value = (I32)vms_do_exec(SvPVx(sv_mortalcopy(*SP), na));
+       value = (I32)vms_do_exec(SvPVx(sv_mortalcopy(*SP), PL_na));
 #else
-       value = (I32)do_exec(SvPVx(sv_mortalcopy(*SP), na));
+       value = (I32)do_exec(SvPVx(sv_mortalcopy(*SP), PL_na));
 #endif
     }
     SP = ORIGMARK;
@@ -3229,7 +3280,7 @@ PP(pp_kill)
     djSP; dMARK; dTARGET;
     I32 value;
 #ifdef HAS_KILL
-    value = (I32)apply(op->op_type, MARK, SP);
+    value = (I32)apply(PL_op->op_type, MARK, SP);
     SP = MARK;
     PUSHi(value);
     RETURN;
@@ -3375,18 +3426,18 @@ PP(pp_tms)
     EXTEND(SP, 4);
 
 #ifndef VMS
-    (void)PerlProc_times(&timesbuf);
+    (void)PerlProc_times(&PL_timesbuf);
 #else
-    (void)PerlProc_times((tbuffer_t *)&timesbuf);  /* time.h uses different name for */
+    (void)PerlProc_times((tbuffer_t *)&PL_timesbuf);  /* time.h uses different name for */
                                                    /* struct tms, though same data   */
                                                    /* is returned.                   */
 #endif
 
-    PUSHs(sv_2mortal(newSVnv(((double)timesbuf.tms_utime)/HZ)));
+    PUSHs(sv_2mortal(newSVnv(((double)PL_timesbuf.tms_utime)/HZ)));
     if (GIMME == G_ARRAY) {
-       PUSHs(sv_2mortal(newSVnv(((double)timesbuf.tms_stime)/HZ)));
-       PUSHs(sv_2mortal(newSVnv(((double)timesbuf.tms_cutime)/HZ)));
-       PUSHs(sv_2mortal(newSVnv(((double)timesbuf.tms_cstime)/HZ)));
+       PUSHs(sv_2mortal(newSVnv(((double)PL_timesbuf.tms_stime)/HZ)));
+       PUSHs(sv_2mortal(newSVnv(((double)PL_timesbuf.tms_cutime)/HZ)));
+       PUSHs(sv_2mortal(newSVnv(((double)PL_timesbuf.tms_cstime)/HZ)));
     }
     RETURN;
 #endif /* HAS_TIMES */
@@ -3415,7 +3466,7 @@ PP(pp_gmtime)
        when = (Time_t)SvIVx(POPs);
 #endif
 
-    if (op->op_type == OP_LOCALTIME)
+    if (PL_op->op_type == OP_LOCALTIME)
        tmbuf = localtime(&when);
     else
        tmbuf = gmtime(&when);
@@ -3508,7 +3559,7 @@ PP(pp_shmwrite)
 {
 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
     djSP; dMARK; dTARGET;
-    I32 value = (I32)(do_shmio(op->op_type, MARK, SP) >= 0);
+    I32 value = (I32)(do_shmio(PL_op->op_type, MARK, SP) >= 0);
     SP = MARK;
     PUSHi(value);
     RETURN;
@@ -3561,7 +3612,7 @@ PP(pp_semget)
 {
 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
     djSP; dMARK; dTARGET;
-    int anum = do_ipcget(op->op_type, MARK, SP);
+    int anum = do_ipcget(PL_op->op_type, MARK, SP);
     SP = MARK;
     if (anum == -1)
        RETPUSHUNDEF;
@@ -3576,7 +3627,7 @@ PP(pp_semctl)
 {
 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
     djSP; dMARK; dTARGET;
-    int anum = do_ipcctl(op->op_type, MARK, SP);
+    int anum = do_ipcctl(PL_op->op_type, MARK, SP);
     SP = MARK;
     if (anum == -1)
        RETSETUNDEF;
@@ -3629,7 +3680,7 @@ PP(pp_ghostent)
 {
     djSP;
 #if defined(HAS_GETHOSTBYNAME) || defined(HAS_GETHOSTBYADDR) || defined(HAS_GETHOSTENT)
-    I32 which = op->op_type;
+    I32 which = PL_op->op_type;
     register char **elem;
     register SV *sv;
 #ifndef HAS_GETHOST_PROTOS /* XXX Do we need individual probes? */
@@ -3685,26 +3736,26 @@ PP(pp_ghostent)
     }
 
     if (hent) {
-       PUSHs(sv = sv_mortalcopy(&sv_no));
+       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
        sv_setpv(sv, (char*)hent->h_name);
-       PUSHs(sv = sv_mortalcopy(&sv_no));
+       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
        for (elem = hent->h_aliases; elem && *elem; elem++) {
            sv_catpv(sv, *elem);
            if (elem[1])
                sv_catpvn(sv, " ", 1);
        }
-       PUSHs(sv = sv_mortalcopy(&sv_no));
+       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
        sv_setiv(sv, (IV)hent->h_addrtype);
-       PUSHs(sv = sv_mortalcopy(&sv_no));
+       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
        len = hent->h_length;
        sv_setiv(sv, (IV)len);
 #ifdef h_addr
        for (elem = hent->h_addr_list; elem && *elem; elem++) {
-           XPUSHs(sv = sv_mortalcopy(&sv_no));
+           XPUSHs(sv = sv_mortalcopy(&PL_sv_no));
            sv_setpvn(sv, *elem, len);
        }
 #else
-       PUSHs(sv = sv_mortalcopy(&sv_no));
+       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
        if (hent->h_addr)
            sv_setpvn(sv, hent->h_addr, len);
 #endif /* h_addr */
@@ -3737,7 +3788,7 @@ PP(pp_gnetent)
 {
     djSP;
 #if defined(HAS_GETNETBYNAME) || defined(HAS_GETNETBYADDR) || defined(HAS_GETNETENT)
-    I32 which = op->op_type;
+    I32 which = PL_op->op_type;
     register char **elem;
     register SV *sv;
 #ifndef HAS_GETNET_PROTOS /* XXX Do we need individual probes? */
@@ -3782,17 +3833,17 @@ PP(pp_gnetent)
     }
 
     if (nent) {
-       PUSHs(sv = sv_mortalcopy(&sv_no));
+       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
        sv_setpv(sv, nent->n_name);
-       PUSHs(sv = sv_mortalcopy(&sv_no));
+       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
        for (elem = nent->n_aliases; elem && *elem; elem++) {
            sv_catpv(sv, *elem);
            if (elem[1])
                sv_catpvn(sv, " ", 1);
        }
-       PUSHs(sv = sv_mortalcopy(&sv_no));
+       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
        sv_setiv(sv, (IV)nent->n_addrtype);
-       PUSHs(sv = sv_mortalcopy(&sv_no));
+       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
        sv_setiv(sv, (IV)nent->n_net);
     }
 
@@ -3824,7 +3875,7 @@ PP(pp_gprotoent)
 {
     djSP;
 #if defined(HAS_GETPROTOBYNAME) || defined(HAS_GETPROTOBYNUMBER) || defined(HAS_GETPROTOENT)
-    I32 which = op->op_type;
+    I32 which = PL_op->op_type;
     register char **elem;
     register SV *sv;  
 #ifndef HAS_GETPROTO_PROTOS /* XXX Do we need individual probes? */
@@ -3866,15 +3917,15 @@ PP(pp_gprotoent)
     }
 
     if (pent) {
-       PUSHs(sv = sv_mortalcopy(&sv_no));
+       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
        sv_setpv(sv, pent->p_name);
-       PUSHs(sv = sv_mortalcopy(&sv_no));
+       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
        for (elem = pent->p_aliases; elem && *elem; elem++) {
            sv_catpv(sv, *elem);
            if (elem[1])
                sv_catpvn(sv, " ", 1);
        }
-       PUSHs(sv = sv_mortalcopy(&sv_no));
+       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
        sv_setiv(sv, (IV)pent->p_proto);
     }
 
@@ -3906,7 +3957,7 @@ PP(pp_gservent)
 {
     djSP;
 #if defined(HAS_GETSERVBYNAME) || defined(HAS_GETSERVBYPORT) || defined(HAS_GETSERVENT)
-    I32 which = op->op_type;
+    I32 which = PL_op->op_type;
     register char **elem;
     register SV *sv;
 #ifndef HAS_GETSERV_PROTOS /* XXX Do we need individual probes? */
@@ -3967,21 +4018,21 @@ PP(pp_gservent)
     }
 
     if (sent) {
-       PUSHs(sv = sv_mortalcopy(&sv_no));
+       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
        sv_setpv(sv, sent->s_name);
-       PUSHs(sv = sv_mortalcopy(&sv_no));
+       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
        for (elem = sent->s_aliases; elem && *elem; elem++) {
            sv_catpv(sv, *elem);
            if (elem[1])
                sv_catpvn(sv, " ", 1);
        }
-       PUSHs(sv = sv_mortalcopy(&sv_no));
+       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
 #ifdef HAS_NTOHS
        sv_setiv(sv, (IV)PerlSock_ntohs(sent->s_port));
 #else
        sv_setiv(sv, (IV)(sent->s_port));
 #endif
-       PUSHs(sv = sv_mortalcopy(&sv_no));
+       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
        sv_setpv(sv, sent->s_proto);
     }
 
@@ -4104,8 +4155,8 @@ PP(pp_gpwuid)
 PP(pp_gpwent)
 {
     djSP;
-#ifdef HAS_PASSWD
-    I32 which = op->op_type;
+#if defined(HAS_PASSWD) && defined(HAS_GETPWENT)
+    I32 which = PL_op->op_type;
     register SV *sv;
     struct passwd *pwent;
 
@@ -4129,20 +4180,22 @@ PP(pp_gpwent)
     }
 
     if (pwent) {
-       PUSHs(sv = sv_mortalcopy(&sv_no));
+       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
        sv_setpv(sv, pwent->pw_name);
 
-       PUSHs(sv = sv_mortalcopy(&sv_no));
+       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
+#ifdef PWPASSWD
        sv_setpv(sv, pwent->pw_passwd);
+#endif
 
-       PUSHs(sv = sv_mortalcopy(&sv_no));
+       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
        sv_setiv(sv, (IV)pwent->pw_uid);
 
-       PUSHs(sv = sv_mortalcopy(&sv_no));
+       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
        sv_setiv(sv, (IV)pwent->pw_gid);
 
        /* pw_change, pw_quota, and pw_age are mutually exclusive. */
-       PUSHs(sv = sv_mortalcopy(&sv_no));
+       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
 #ifdef PWCHANGE
        sv_setiv(sv, (IV)pwent->pw_change);
 #else
@@ -4156,7 +4209,7 @@ PP(pp_gpwent)
 #endif
 
        /* pw_class and pw_comment are mutually exclusive. */
-       PUSHs(sv = sv_mortalcopy(&sv_no));
+       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
 #ifdef PWCLASS
        sv_setpv(sv, pwent->pw_class);
 #else
@@ -4165,7 +4218,7 @@ PP(pp_gpwent)
 #   endif
 #endif
 
-       PUSHs(sv = sv_mortalcopy(&sv_no));
+       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
 #ifdef PWGECOS
        sv_setpv(sv, pwent->pw_gecos);
 #endif
@@ -4174,14 +4227,14 @@ PP(pp_gpwent)
        SvTAINTED_on(sv);
 #endif
 
-       PUSHs(sv = sv_mortalcopy(&sv_no));
+       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
        sv_setpv(sv, pwent->pw_dir);
 
-       PUSHs(sv = sv_mortalcopy(&sv_no));
+       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
        sv_setpv(sv, pwent->pw_shell);
 
 #ifdef PWEXPIRE
-       PUSHs(sv = sv_mortalcopy(&sv_no));
+       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
        sv_setiv(sv, (IV)pwent->pw_expire);
 #endif
     }
@@ -4194,7 +4247,7 @@ PP(pp_gpwent)
 PP(pp_spwent)
 {
     djSP;
-#if defined(HAS_PASSWD) && !defined(CYGWIN32)
+#if defined(HAS_PASSWD) && defined(HAS_SETPWENT) && !defined(CYGWIN32)
     setpwent();
     RETPUSHYES;
 #else
@@ -4205,7 +4258,7 @@ PP(pp_spwent)
 PP(pp_epwent)
 {
     djSP;
-#ifdef HAS_PASSWD
+#if defined(HAS_PASSWD) && defined(HAS_ENDPWENT)
     endpwent();
     RETPUSHYES;
 #else
@@ -4234,8 +4287,8 @@ PP(pp_ggrgid)
 PP(pp_ggrent)
 {
     djSP;
-#ifdef HAS_GROUP
-    I32 which = op->op_type;
+#if defined(HAS_GROUP) && defined(HAS_GETGRENT)
+    I32 which = PL_op->op_type;
     register char **elem;
     register SV *sv;
     struct group *grent;
@@ -4260,13 +4313,18 @@ PP(pp_ggrent)
     }
 
     if (grent) {
-       PUSHs(sv = sv_mortalcopy(&sv_no));
+       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
        sv_setpv(sv, grent->gr_name);
-       PUSHs(sv = sv_mortalcopy(&sv_no));
+
+       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
+#ifdef GRPASSWD
        sv_setpv(sv, grent->gr_passwd);
-       PUSHs(sv = sv_mortalcopy(&sv_no));
+#endif
+
+       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
        sv_setiv(sv, (IV)grent->gr_gid);
-       PUSHs(sv = sv_mortalcopy(&sv_no));
+
+       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
        for (elem = grent->gr_mem; elem && *elem; elem++) {
            sv_catpv(sv, *elem);
            if (elem[1])
@@ -4283,7 +4341,7 @@ PP(pp_ggrent)
 PP(pp_sgrent)
 {
     djSP;
-#ifdef HAS_GROUP
+#if defined(HAS_GROUP) && defined(HAS_SETGRENT)
     setgrent();
     RETPUSHYES;
 #else
@@ -4294,7 +4352,7 @@ PP(pp_sgrent)
 PP(pp_egrent)
 {
     djSP;
-#ifdef HAS_GROUP
+#if defined(HAS_GROUP) && defined(HAS_ENDGRENT)
     endgrent();
     RETPUSHYES;
 #else
@@ -4329,7 +4387,7 @@ PP(pp_syscall)
     I32 retval = -1;
     MAGIC *mg;
 
-    if (tainting) {
+    if (PL_tainting) {
        while (++MARK <= SP) {
            if (SvTAINTED(*MARK)) {
                TAINT;
@@ -4347,10 +4405,10 @@ PP(pp_syscall)
     while (++MARK <= SP) {
        if (SvNIOK(*MARK) || !i)
            a[i++] = SvIV(*MARK);
-       else if (*MARK == &sv_undef)
+       else if (*MARK == &PL_sv_undef)
            a[i++] = 0;
        else 
-           a[i++] = (unsigned long)SvPV_force(*MARK, na);
+           a[i++] = (unsigned long)SvPV_force(*MARK, PL_na);
        if (i > 15)
            break;
     }