The problem described in 20010514.031 still wasn't
[p5sagit/p5-mst-13.2.git] / pp_sys.c
index e4640be..826a588 100644 (file)
--- a/pp_sys.c
+++ b/pp_sys.c
@@ -1,6 +1,6 @@
 /*    pp_sys.c
  *
- *    Copyright (c) 1991-2000, Larry Wall
+ *    Copyright (c) 1991-2001, Larry Wall
  *
  *    You may distribute under the terms of either the GNU General Public
  *    License or the Artistic License, as specified in the README file.
@@ -70,8 +70,10 @@ extern int h_errno;
 # ifdef I_PWD
 #  include <pwd.h>
 # else
+#  if !defined(VMS)
     struct passwd *getpwnam (char *);
     struct passwd *getpwuid (Uid_t);
+#  endif
 # endif
 # ifdef HAS_GETPWENT
   struct passwd *getpwent (void);
@@ -283,7 +285,7 @@ S_emulate_eaccess(pTHX_ const char* path, Mode_t mode)
 
 PP(pp_backtick)
 {
-    djSP; dTARGET;
+    dSP; dTARGET;
     PerlIO *fp;
     STRLEN n_a;
     char *tmps = POPpx;
@@ -402,7 +404,7 @@ PP(pp_rcatline)
 
 PP(pp_warn)
 {
-    djSP; dMARK;
+    dSP; dMARK;
     SV *tmpsv;
     char *tmps;
     STRLEN len;
@@ -433,7 +435,7 @@ PP(pp_warn)
 
 PP(pp_die)
 {
-    djSP; dMARK;
+    dSP; dMARK;
     char *tmps;
     SV *tmpsv;
     STRLEN len;
@@ -448,7 +450,7 @@ PP(pp_die)
     }
     else {
        tmpsv = TOPs;
-       tmps = SvROK(tmpsv) ? Nullch : SvPV(tmpsv, len);
+        tmps = (SvROK(tmpsv) && PL_in_eval) ? Nullch : SvPV(tmpsv, len);
     }
     if (!tmps || !len) {
        SV *error = ERRSV;
@@ -492,37 +494,27 @@ PP(pp_die)
 
 PP(pp_open)
 {
-    djSP; dTARGET;
+    dSP;
+    dMARK; dORIGMARK;
+    dTARGET;
     GV *gv;
     SV *sv;
-    SV *name = Nullsv;
-    I32 have_name = 0;
     char *tmps;
     STRLEN len;
     MAGIC *mg;
+    bool  ok;
 
-    if (MAXARG > 2) {
-       name = POPs;
-       have_name = 1;
-    }
-    if (MAXARG > 1)
-       sv = POPs;
-    if (!isGV(TOPs))
-       DIE(aTHX_ PL_no_usym, "filehandle");
-    if (MAXARG <= 1)
-       sv = GvSV(TOPs);
-    gv = (GV*)POPs;
+    gv = (GV *)*++MARK;
     if (!isGV(gv))
        DIE(aTHX_ PL_no_usym, "filehandle");
     if (GvIOp(gv))
        IoFLAGS(GvIOp(gv)) &= ~IOf_UNTAINT;
 
     if ((mg = SvTIED_mg((SV*)gv, 'q'))) {
-       PUSHMARK(SP);
-       XPUSHs(SvTIED_obj((SV*)gv, mg));
-       XPUSHs(sv);
-       if (have_name)
-           XPUSHs(name);
+       /* Method's args are same as ours ... */
+       /* ... except handle is replaced by the object */
+       *MARK-- = SvTIED_obj((SV*)gv, mg);
+       PUSHMARK(MARK);
        PUTBACK;
        ENTER;
        call_method("OPEN", G_SCALAR);
@@ -531,8 +523,17 @@ PP(pp_open)
        RETURN;
     }
 
+    if (MARK < SP) {
+       sv = *++MARK;
+    }
+    else {
+       sv = GvSV(gv);
+    }
+
     tmps = SvPV(sv, len);
-    if (do_open9(gv, tmps, len, FALSE, O_RDONLY, 0, Nullfp, name, have_name))
+    ok = do_openn(gv, tmps, len, FALSE, O_RDONLY, 0, Nullfp, MARK+1, (SP-MARK));
+    SP = ORIGMARK;
+    if (ok)
        PUSHi( (I32)PL_forkprocess );
     else if (PL_forkprocess == 0)              /* we are a new child */
        PUSHi(0);
@@ -543,7 +544,7 @@ PP(pp_open)
 
 PP(pp_close)
 {
-    djSP;
+    dSP;
     GV *gv;
     MAGIC *mg;
 
@@ -569,7 +570,7 @@ PP(pp_close)
 
 PP(pp_pipe_op)
 {
-    djSP;
+    dSP;
 #ifdef HAS_PIPE
     GV *rgv;
     GV *wgv;
@@ -624,7 +625,7 @@ badexit:
 
 PP(pp_fileno)
 {
-    djSP; dTARGET;
+    dSP; dTARGET;
     GV *gv;
     IO *io;
     PerlIO *fp;
@@ -645,15 +646,22 @@ PP(pp_fileno)
        RETURN;
     }
 
-    if (!gv || !(io = GvIO(gv)) || !(fp = IoIFP(io)))
+    if (!gv || !(io = GvIO(gv)) || !(fp = IoIFP(io))) {
+       /* Can't do this because people seem to do things like
+          defined(fileno($foo)) to check whether $foo is a valid fh.
+         if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
+             report_evil_fh(gv, io, PL_op->op_type);
+           */
        RETPUSHUNDEF;
+    }
+
     PUSHi(PerlIO_fileno(fp));
     RETURN;
 }
 
 PP(pp_umask)
 {
-    djSP; dTARGET;
+    dSP; dTARGET;
     Mode_t anum;
 
 #ifdef HAS_UMASK
@@ -678,7 +686,7 @@ PP(pp_umask)
 
 PP(pp_binmode)
 {
-    djSP;
+    dSP;
     GV *gv;
     IO *io;
     PerlIO *fp;
@@ -709,8 +717,11 @@ PP(pp_binmode)
     }
 
     EXTEND(SP, 1);
-    if (!(io = GvIO(gv)) || !(fp = IoIFP(io)))
-       RETPUSHUNDEF;
+    if (!(io = GvIO(gv)) || !(fp = IoIFP(io))) {
+       if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
+           report_evil_fh(gv, io, PL_op->op_type);
+        RETPUSHUNDEF;
+    }
 
     if (discp) {
        names = SvPV(discp,len);
@@ -725,7 +736,7 @@ PP(pp_binmode)
 
 PP(pp_tie)
 {
-    djSP;
+    dSP;
     dMARK;
     SV *varsv;
     HV* stash;
@@ -746,6 +757,11 @@ PP(pp_tie)
            methname = "TIEARRAY";
            break;
        case SVt_PVGV:
+#ifdef GV_SHARED_CHECK
+           if (GvSHARED((GV*)varsv)) {
+                Perl_croak(aTHX_ "Attempt to tie shared GV");
+           }
+#endif
            methname = "TIEHANDLE";
            how = 'q';
            break;
@@ -805,7 +821,7 @@ PP(pp_tie)
 
 PP(pp_untie)
 {
-    djSP;
+    dSP;
     SV *sv = POPs;
     char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV) ? 'P' : 'q';
 
@@ -838,7 +854,7 @@ PP(pp_untie)
 
 PP(pp_tied)
 {
-    djSP;
+    dSP;
     SV *sv = POPs;
     char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV) ? 'P' : 'q';
     MAGIC *mg;
@@ -855,7 +871,7 @@ PP(pp_tied)
 
 PP(pp_dbmopen)
 {
-    djSP;
+    dSP;
     HV *hv;
     dPOPPOPssrl;
     HV* stash;
@@ -917,7 +933,7 @@ PP(pp_dbmclose)
 
 PP(pp_sselect)
 {
-    djSP; dTARGET;
+    dSP; dTARGET;
 #ifdef HAS_SELECT
     register I32 i;
     register I32 j;
@@ -1068,7 +1084,7 @@ Perl_setdefout(pTHX_ GV *gv)
 
 PP(pp_select)
 {
-    djSP; dTARGET;
+    dSP; dTARGET;
     GV *newdefout, *egv;
     HV *hv;
 
@@ -1102,7 +1118,7 @@ PP(pp_select)
 
 PP(pp_getc)
 {
-    djSP; dTARGET;
+    dSP; dTARGET;
     GV *gv;
     MAGIC *mg;
 
@@ -1171,7 +1187,7 @@ S_doform(pTHX_ CV *cv, GV *gv, OP *retop)
 
 PP(pp_enterwrite)
 {
-    djSP;
+    dSP;
     register GV *gv;
     register IO *io;
     GV *fgv;
@@ -1215,7 +1231,7 @@ PP(pp_enterwrite)
 
 PP(pp_leavewrite)
 {
-    djSP;
+    dSP;
     GV *gv = cxstack[cxstack_ix].blk_sub.gv;
     register IO *io = GvIOp(gv);
     PerlIO *ofp = IoOFP(io);
@@ -1226,6 +1242,8 @@ PP(pp_leavewrite)
 
     DEBUG_f(PerlIO_printf(Perl_debug_log, "left=%ld, todo=%ld\n",
          (long)IoLINES_LEFT(io), (long)FmLINES(PL_formtarget)));
+    if (!io || !ofp)
+       goto forget_top;
     if (IoLINES_LEFT(io) < FmLINES(PL_formtarget) &&
        PL_formtarget != PL_toptarget)
     {
@@ -1265,13 +1283,16 @@ PP(pp_leavewrite)
                s++;
            }
            if (s) {
-               PerlIO_write(ofp, SvPVX(PL_formtarget), s - SvPVX(PL_formtarget));
+               STRLEN save = SvCUR(PL_formtarget);
+               SvCUR_set(PL_formtarget, s - SvPVX(PL_formtarget));
+               do_print(PL_formtarget, ofp);
+               SvCUR_set(PL_formtarget, save);
                sv_chop(PL_formtarget, s);
                FmLINES(PL_formtarget) -= IoLINES_LEFT(io);
            }
        }
        if (IoLINES_LEFT(io) >= 0 && IoPAGE(io) > 0)
-           PerlIO_write(ofp, SvPVX(PL_formfeed), SvCUR(PL_formfeed));
+           do_print(PL_formfeed, ofp);
        IoLINES_LEFT(io) = IoPAGE_LEN(io);
        IoPAGE(io)++;
        PL_formtarget = PL_toptarget;
@@ -1332,8 +1353,7 @@ PP(pp_leavewrite)
            if (ckWARN(WARN_IO))
                Perl_warner(aTHX_ WARN_IO, "page overflow");
        }
-       if (!PerlIO_write(ofp, SvPVX(PL_formtarget), SvCUR(PL_formtarget)) ||
-               PerlIO_error(fp))
+       if (!do_print(PL_formtarget, fp))
            PUSHs(&PL_sv_no);
        else {
            FmLINES(PL_formtarget) = 0;
@@ -1344,6 +1364,7 @@ PP(pp_leavewrite)
            PUSHs(&PL_sv_yes);
        }
     }
+    /* bad_ofp: */
     PL_formtarget = PL_bodytarget;
     PUTBACK;
     return pop_return();
@@ -1351,13 +1372,12 @@ PP(pp_leavewrite)
 
 PP(pp_prtf)
 {
-    djSP; dMARK; dORIGMARK;
+    dSP; dMARK; dORIGMARK;
     GV *gv;
     IO *io;
     PerlIO *fp;
     SV *sv;
     MAGIC *mg;
-    STRLEN n_a;
 
     if (PL_op->op_flags & OPf_STACKED)
        gv = (GV*)*++MARK;
@@ -1436,7 +1456,7 @@ PP(pp_prtf)
 
 PP(pp_sysopen)
 {
-    djSP;
+    dSP;
     GV *gv;
     SV *sv;
     char *tmps;
@@ -1466,16 +1486,20 @@ PP(pp_sysopen)
 
 PP(pp_sysread)
 {
-    djSP; dMARK; dORIGMARK; dTARGET;
+    dSP; dMARK; dORIGMARK; dTARGET;
     int offset;
     GV *gv;
     IO *io;
     char *buffer;
     SSize_t length;
+    SSize_t count;
     Sock_size_t bufsize;
     SV *bufsv;
     STRLEN blen;
     MAGIC *mg;
+    int fp_utf8;
+    Size_t got = 0;
+    Size_t wanted;
 
     gv = (GV*)*++MARK;
     if ((PL_op->op_type == OP_READ || PL_op->op_type == OP_SYSREAD) &&
@@ -1509,14 +1533,17 @@ PP(pp_sysread)
     io = GvIO(gv);
     if (!io || !IoIFP(io))
        goto say_undef;
-    if (PerlIO_isutf8(IoIFP(io))) {
+    if ((fp_utf8 = PerlIO_isutf8(IoIFP(io))) && !IN_BYTE) {
        buffer = SvPVutf8_force(bufsv, blen);
+       /* UTF8 may not have been set if they are all low bytes */
+       SvUTF8_on(bufsv);
     }
     else {
        buffer = SvPV_force(bufsv, blen);
     }
     if (length < 0)
        DIE(aTHX_ "Negative length");
+    wanted = length;
 
 #ifdef HAS_SOCKET
     if (PL_op->op_type == OP_RECV) {
@@ -1532,13 +1559,19 @@ PP(pp_sysread)
 #endif
        buffer = SvGROW(bufsv, length+1);
        /* 'offset' means 'flags' here */
-       length = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, offset,
+       count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, offset,
                          (struct sockaddr *)namebuf, &bufsize);
-       if (length < 0)
+       if (count < 0)
            RETPUSHUNDEF;
-       SvCUR_set(bufsv, length);
+#ifdef EPOC
+        /* Bogus return without padding */
+       bufsize = sizeof (struct sockaddr_in);
+#endif
+       SvCUR_set(bufsv, count);
        *SvEND(bufsv) = '\0';
        (void)SvPOK_only(bufsv);
+       if (fp_utf8)
+           SvUTF8_on(bufsv);
        SvSETMAGIC(bufsv);
        /* This should not be marked tainted if the fp is marked clean */
        if (!(IoFLAGS(io) & IOf_UNTAINT))
@@ -1552,31 +1585,38 @@ PP(pp_sysread)
     if (PL_op->op_type == OP_RECV)
        DIE(aTHX_ PL_no_sock_func, "recv");
 #endif
-    if (SvUTF8(bufsv) && offset) {
-       /* FIXME ! */
-       Perl_croak(aTHX_ "Non zero offset not supported yet for utf8");
+    if (DO_UTF8(bufsv)) {
+       /* offset adjust in characters not bytes */
+       blen = sv_len_utf8(bufsv);
     }
     if (offset < 0) {
        if (-offset > blen)
            DIE(aTHX_ "Offset outside string");
        offset += blen;
     }
+    if (DO_UTF8(bufsv)) {
+       /* convert offset-as-chars to offset-as-bytes */
+       offset = utf8_hop((U8 *)buffer,offset) - (U8 *) buffer;
+    }
+ more_bytes:
     bufsize = SvCUR(bufsv);
-    buffer = SvGROW(bufsv, length+offset+1);
+    buffer  = SvGROW(bufsv, length+offset+1);
     if (offset > bufsize) { /* Zero any newly allocated space */
        Zero(buffer+bufsize, offset-bufsize, char);
     }
+    buffer = buffer + offset;
+
     if (PL_op->op_type == OP_SYSREAD) {
 #ifdef PERL_SOCK_SYSREAD_IS_RECV
        if (IoTYPE(io) == IoTYPE_SOCKET) {
-           length = PerlSock_recv(PerlIO_fileno(IoIFP(io)),
-                                  buffer+offset, length, 0);
+           count = PerlSock_recv(PerlIO_fileno(IoIFP(io)),
+                                  buffer, length, 0);
        }
        else
 #endif
        {
-           length = PerlLIO_read(PerlIO_fileno(IoIFP(io)),
-                                 buffer+offset, length);
+           count = PerlLIO_read(PerlIO_fileno(IoIFP(io)),
+                                 buffer, length);
        }
     }
     else
@@ -1588,20 +1628,19 @@ PP(pp_sysread)
 #else
        bufsize = sizeof namebuf;
 #endif
-       length = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer+offset, length, 0,
+       count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, 0,
                          (struct sockaddr *)namebuf, &bufsize);
     }
     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) {
-       if ((IoTYPE(io) == IoTYPE_WRONLY || IoIFP(io) == PerlIO_stdout()
-           || IoIFP(io) == PerlIO_stderr()) && ckWARN(WARN_IO))
+       count = PerlIO_read(IoIFP(io), buffer, length);
+       /* PerlIO_read() - like fread() returns 0 on both error and EOF */
+       if (count == 0 && PerlIO_error(IoIFP(io)))
+           count = -1;
+    }
+    if (count < 0) {
+       if ((IoTYPE(io) == IoTYPE_WRONLY) && ckWARN(WARN_IO))
        {
            /* integrate with report_evil_fh()? */
            char *name = NULL;
@@ -1619,15 +1658,43 @@ PP(pp_sysread)
        }
        goto say_undef;
     }
-    SvCUR_set(bufsv, length+offset);
+    SvCUR_set(bufsv, count+(buffer - SvPVX(bufsv)));
     *SvEND(bufsv) = '\0';
     (void)SvPOK_only(bufsv);
+    if (fp_utf8 && !IN_BYTE) {
+       /* Look at utf8 we got back and count the characters */
+       char *bend = buffer + count;
+       while (buffer < bend) {
+           STRLEN skip = UTF8SKIP(buffer);
+           if (buffer+skip > bend) {
+               /* partial character - try for rest of it */
+               length = skip - (bend-buffer);
+               offset = bend - SvPVX(bufsv);
+               goto more_bytes;
+           }
+           else {
+               got++;
+               buffer += skip;
+           }
+        }
+       /* If we have not 'got' the number of _characters_ we 'wanted' get some more
+          provided amount read (count) was what was requested (length)
+        */
+       if (got < wanted && count == length) {
+           length = (wanted-got);
+           offset = bend - SvPVX(bufsv);
+           goto more_bytes;
+       }
+       /* return value is character count */
+       count = got;
+       SvUTF8_on(bufsv);
+    }
     SvSETMAGIC(bufsv);
     /* This should not be marked tainted if the fp is marked clean */
     if (!(IoFLAGS(io) & IOf_UNTAINT))
        SvTAINTED_on(bufsv);
     SP = ORIGMARK;
-    PUSHi(length);
+    PUSHi(count);
     RETURN;
 
   say_undef:
@@ -1637,7 +1704,7 @@ PP(pp_sysread)
 
 PP(pp_syswrite)
 {
-    djSP;
+    dSP;
     int items = (SP - PL_stack_base) - TOPMARK;
     if (items == 2) {
        SV *sv;
@@ -1651,7 +1718,7 @@ PP(pp_syswrite)
 
 PP(pp_send)
 {
-    djSP; dMARK; dORIGMARK; dTARGET;
+    dSP; dMARK; dORIGMARK; dTARGET;
     GV *gv;
     IO *io;
     SV *bufsv;
@@ -1723,7 +1790,7 @@ PP(pp_send)
        if (length > blen - offset)
            length = blen - offset;
        if (DO_UTF8(bufsv)) {
-           buffer = utf8_hop((U8 *)buffer, offset);
+           buffer = (char*)utf8_hop((U8 *)buffer, offset);
            length = utf8_hop((U8 *)buffer, length) - (U8 *)buffer;
        }
        else {
@@ -1780,7 +1847,7 @@ PP(pp_recv)
 
 PP(pp_eof)
 {
-    djSP;
+    dSP;
     GV *gv;
     MAGIC *mg;
 
@@ -1824,7 +1891,7 @@ PP(pp_eof)
 
 PP(pp_tell)
 {
-    djSP; dTARGET;
+    dSP; dTARGET;
     GV *gv;
     MAGIC *mg;
 
@@ -1859,7 +1926,7 @@ PP(pp_seek)
 
 PP(pp_sysseek)
 {
-    djSP;
+    dSP;
     GV *gv;
     int whence = POPi;
 #if LSEEKSIZE > IVSIZE
@@ -1910,7 +1977,7 @@ PP(pp_sysseek)
 
 PP(pp_truncate)
 {
-    djSP;
+    dSP;
     /* There seems to be no consensus on the length type of truncate()
      * and ftruncate(), both off_t and size_t have supporters. In
      * general one would think that when using large files, off_t is
@@ -1997,16 +2064,18 @@ PP(pp_fcntl)
 
 PP(pp_ioctl)
 {
-    djSP; dTARGET;
+    dSP; dTARGET;
     SV *argsv = POPs;
     unsigned int func = U_I(POPn);
     int optype = PL_op->op_type;
     char *s;
     IV retval;
     GV *gv = (GV*)POPs;
-    IO *io = GvIOn(gv);
+    IO *io = gv ? GvIOn(gv) : 0;
 
     if (!io || !argsv || !IoIFP(io)) {
+       if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
+           report_evil_fh(gv, io, PL_op->op_type);
        SETERRNO(EBADF,RMS$_IFI);       /* well, sort of... */
        RETPUSHUNDEF;
     }
@@ -2068,7 +2137,7 @@ PP(pp_ioctl)
 
 PP(pp_flock)
 {
-    djSP; dTARGET;
+    dSP; dTARGET;
     I32 value;
     int argtype;
     GV *gv;
@@ -2108,7 +2177,7 @@ PP(pp_flock)
 
 PP(pp_socket)
 {
-    djSP;
+    dSP;
 #ifdef HAS_SOCKET
     GV *gv;
     register IO *io;
@@ -2118,13 +2187,17 @@ PP(pp_socket)
     int fd;
 
     gv = (GV*)POPs;
+    io = gv ? GvIOn(gv) : NULL;
 
-    if (!gv) {
+    if (!gv || !io) {
+       if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
+           report_evil_fh(gv, io, PL_op->op_type);
+       if (IoIFP(io))
+           do_close(gv, FALSE);
        SETERRNO(EBADF,LIB$_INVARG);
        RETPUSHUNDEF;
     }
 
-    io = GvIOn(gv);
     if (IoIFP(io))
        do_close(gv, FALSE);
 
@@ -2145,6 +2218,10 @@ PP(pp_socket)
     fcntl(fd, F_SETFD, fd > PL_maxsysfd);      /* ensure close-on-exec */
 #endif
 
+#ifdef EPOC
+    setbuf( IoIFP(io), NULL); /* EPOC gets confused about sockets */
+#endif
+
     RETPUSHYES;
 #else
     DIE(aTHX_ PL_no_sock_func, "socket");
@@ -2153,7 +2230,7 @@ PP(pp_socket)
 
 PP(pp_sockpair)
 {
-    djSP;
+    dSP;
 #ifdef HAS_SOCKETPAIR
     GV *gv1;
     GV *gv2;
@@ -2166,11 +2243,22 @@ PP(pp_sockpair)
 
     gv2 = (GV*)POPs;
     gv1 = (GV*)POPs;
-    if (!gv1 || !gv2)
+    io1 = gv1 ? GvIOn(gv1) : NULL;
+    io2 = gv2 ? GvIOn(gv2) : NULL;
+    if (!gv1 || !gv2 || !io1 || !io2) {
+       if (ckWARN2(WARN_UNOPENED,WARN_CLOSED)) {
+           if (!gv1 || !io1)
+               report_evil_fh(gv1, io1, PL_op->op_type);
+           if (!gv2 || !io2)
+               report_evil_fh(gv1, io2, PL_op->op_type);
+       }
+       if (IoIFP(io1))
+           do_close(gv1, FALSE);
+       if (IoIFP(io2))
+           do_close(gv2, FALSE);
        RETPUSHUNDEF;
+    }
 
-    io1 = GvIOn(gv1);
-    io2 = GvIOn(gv2);
     if (IoIFP(io1))
        do_close(gv1, FALSE);
     if (IoIFP(io2))
@@ -2207,7 +2295,7 @@ PP(pp_sockpair)
 
 PP(pp_bind)
 {
-    djSP;
+    dSP;
 #ifdef HAS_SOCKET
 #ifdef MPE /* Requires PRIV mode to bind() to ports < 1024 */
     extern GETPRIVMODE();
@@ -2266,7 +2354,7 @@ nuts:
 
 PP(pp_connect)
 {
-    djSP;
+    dSP;
 #ifdef HAS_SOCKET
     SV *addrsv = POPs;
     char *addr;
@@ -2296,13 +2384,13 @@ nuts:
 
 PP(pp_listen)
 {
-    djSP;
+    dSP;
 #ifdef HAS_SOCKET
     int backlog = POPi;
     GV *gv = (GV*)POPs;
-    register IO *io = GvIOn(gv);
+    register IO *io = gv ? GvIOn(gv) : NULL;
 
-    if (!io || !IoIFP(io))
+    if (!gv || !io || !IoIFP(io))
        goto nuts;
 
     if (PerlSock_listen(PerlIO_fileno(IoIFP(io)), backlog) >= 0)
@@ -2322,7 +2410,7 @@ nuts:
 
 PP(pp_accept)
 {
-    djSP; dTARGET;
+    dSP; dTARGET;
 #ifdef HAS_SOCKET
     GV *ngv;
     GV *ggv;
@@ -2365,7 +2453,8 @@ PP(pp_accept)
 #endif
 
 #ifdef EPOC
-    len = sizeof saddr;  /* EPOC somehow truncates info */
+    len = sizeof saddr;          /* EPOC somehow truncates info */
+    setbuf( IoIFP(nstio), NULL); /* EPOC gets confused about sockets */
 #endif
 
     PUSHp((char *)&saddr, len);
@@ -2386,7 +2475,7 @@ badexit:
 
 PP(pp_shutdown)
 {
-    djSP; dTARGET;
+    dSP; dTARGET;
 #ifdef HAS_SOCKET
     int how = POPi;
     GV *gv = (GV*)POPs;
@@ -2419,7 +2508,7 @@ PP(pp_gsockopt)
 
 PP(pp_ssockopt)
 {
-    djSP;
+    dSP;
 #ifdef HAS_SOCKET
     int optype = PL_op->op_type;
     SV *sv;
@@ -2500,7 +2589,7 @@ PP(pp_getsockname)
 
 PP(pp_getpeername)
 {
-    djSP;
+    dSP;
 #ifdef HAS_SOCKET
     int optype = PL_op->op_type;
     SV *sv;
@@ -2571,7 +2660,7 @@ PP(pp_lstat)
 
 PP(pp_stat)
 {
-    djSP;
+    dSP;
     GV *gv;
     I32 gimme;
     I32 max = 13;
@@ -2692,7 +2781,7 @@ PP(pp_stat)
 PP(pp_ftrread)
 {
     I32 result;
-    djSP;
+    dSP;
 #if defined(HAS_ACCESS) && defined(R_OK)
     STRLEN n_a;
     if ((PL_hints & HINT_FILETEST_ACCESS) && SvPOK(TOPs)) {
@@ -2719,7 +2808,7 @@ PP(pp_ftrread)
 PP(pp_ftrwrite)
 {
     I32 result;
-    djSP;
+    dSP;
 #if defined(HAS_ACCESS) && defined(W_OK)
     STRLEN n_a;
     if ((PL_hints & HINT_FILETEST_ACCESS) && SvPOK(TOPs)) {
@@ -2746,7 +2835,7 @@ PP(pp_ftrwrite)
 PP(pp_ftrexec)
 {
     I32 result;
-    djSP;
+    dSP;
 #if defined(HAS_ACCESS) && defined(X_OK)
     STRLEN n_a;
     if ((PL_hints & HINT_FILETEST_ACCESS) && SvPOK(TOPs)) {
@@ -2773,7 +2862,7 @@ PP(pp_ftrexec)
 PP(pp_fteread)
 {
     I32 result;
-    djSP;
+    dSP;
 #ifdef PERL_EFF_ACCESS_R_OK
     STRLEN n_a;
     if ((PL_hints & HINT_FILETEST_ACCESS) && SvPOK(TOPs)) {
@@ -2800,7 +2889,7 @@ PP(pp_fteread)
 PP(pp_ftewrite)
 {
     I32 result;
-    djSP;
+    dSP;
 #ifdef PERL_EFF_ACCESS_W_OK
     STRLEN n_a;
     if ((PL_hints & HINT_FILETEST_ACCESS) && SvPOK(TOPs)) {
@@ -2827,7 +2916,7 @@ PP(pp_ftewrite)
 PP(pp_fteexec)
 {
     I32 result;
-    djSP;
+    dSP;
 #ifdef PERL_EFF_ACCESS_X_OK
     STRLEN n_a;
     if ((PL_hints & HINT_FILETEST_ACCESS) && SvPOK(TOPs)) {
@@ -2854,7 +2943,7 @@ PP(pp_fteexec)
 PP(pp_ftis)
 {
     I32 result = my_stat();
-    djSP;
+    dSP;
     if (result < 0)
        RETPUSHUNDEF;
     RETPUSHYES;
@@ -2868,7 +2957,7 @@ PP(pp_fteowned)
 PP(pp_ftrowned)
 {
     I32 result = my_stat();
-    djSP;
+    dSP;
     if (result < 0)
        RETPUSHUNDEF;
     if (PL_statcache.st_uid == (PL_op->op_type == OP_FTEOWNED ?
@@ -2880,7 +2969,7 @@ PP(pp_ftrowned)
 PP(pp_ftzero)
 {
     I32 result = my_stat();
-    djSP;
+    dSP;
     if (result < 0)
        RETPUSHUNDEF;
     if (PL_statcache.st_size == 0)
@@ -2891,7 +2980,7 @@ PP(pp_ftzero)
 PP(pp_ftsize)
 {
     I32 result = my_stat();
-    djSP; dTARGET;
+    dSP; dTARGET;
     if (result < 0)
        RETPUSHUNDEF;
 #if Off_t_size > IVSIZE
@@ -2905,7 +2994,7 @@ PP(pp_ftsize)
 PP(pp_ftmtime)
 {
     I32 result = my_stat();
-    djSP; dTARGET;
+    dSP; dTARGET;
     if (result < 0)
        RETPUSHUNDEF;
     PUSHn( (PL_basetime - PL_statcache.st_mtime) / 86400.0 );
@@ -2915,7 +3004,7 @@ PP(pp_ftmtime)
 PP(pp_ftatime)
 {
     I32 result = my_stat();
-    djSP; dTARGET;
+    dSP; dTARGET;
     if (result < 0)
        RETPUSHUNDEF;
     PUSHn( (PL_basetime - PL_statcache.st_atime) / 86400.0 );
@@ -2925,7 +3014,7 @@ PP(pp_ftatime)
 PP(pp_ftctime)
 {
     I32 result = my_stat();
-    djSP; dTARGET;
+    dSP; dTARGET;
     if (result < 0)
        RETPUSHUNDEF;
     PUSHn( (PL_basetime - PL_statcache.st_ctime) / 86400.0 );
@@ -2935,7 +3024,7 @@ PP(pp_ftctime)
 PP(pp_ftsock)
 {
     I32 result = my_stat();
-    djSP;
+    dSP;
     if (result < 0)
        RETPUSHUNDEF;
     if (S_ISSOCK(PL_statcache.st_mode))
@@ -2946,7 +3035,7 @@ PP(pp_ftsock)
 PP(pp_ftchr)
 {
     I32 result = my_stat();
-    djSP;
+    dSP;
     if (result < 0)
        RETPUSHUNDEF;
     if (S_ISCHR(PL_statcache.st_mode))
@@ -2957,7 +3046,7 @@ PP(pp_ftchr)
 PP(pp_ftblk)
 {
     I32 result = my_stat();
-    djSP;
+    dSP;
     if (result < 0)
        RETPUSHUNDEF;
     if (S_ISBLK(PL_statcache.st_mode))
@@ -2968,7 +3057,7 @@ PP(pp_ftblk)
 PP(pp_ftfile)
 {
     I32 result = my_stat();
-    djSP;
+    dSP;
     if (result < 0)
        RETPUSHUNDEF;
     if (S_ISREG(PL_statcache.st_mode))
@@ -2979,7 +3068,7 @@ PP(pp_ftfile)
 PP(pp_ftdir)
 {
     I32 result = my_stat();
-    djSP;
+    dSP;
     if (result < 0)
        RETPUSHUNDEF;
     if (S_ISDIR(PL_statcache.st_mode))
@@ -2990,7 +3079,7 @@ PP(pp_ftdir)
 PP(pp_ftpipe)
 {
     I32 result = my_stat();
-    djSP;
+    dSP;
     if (result < 0)
        RETPUSHUNDEF;
     if (S_ISFIFO(PL_statcache.st_mode))
@@ -3001,7 +3090,7 @@ PP(pp_ftpipe)
 PP(pp_ftlink)
 {
     I32 result = my_lstat();
-    djSP;
+    dSP;
     if (result < 0)
        RETPUSHUNDEF;
     if (S_ISLNK(PL_statcache.st_mode))
@@ -3011,7 +3100,7 @@ PP(pp_ftlink)
 
 PP(pp_ftsuid)
 {
-    djSP;
+    dSP;
 #ifdef S_ISUID
     I32 result = my_stat();
     SPAGAIN;
@@ -3025,7 +3114,7 @@ PP(pp_ftsuid)
 
 PP(pp_ftsgid)
 {
-    djSP;
+    dSP;
 #ifdef S_ISGID
     I32 result = my_stat();
     SPAGAIN;
@@ -3039,7 +3128,7 @@ PP(pp_ftsgid)
 
 PP(pp_ftsvtx)
 {
-    djSP;
+    dSP;
 #ifdef S_ISVTX
     I32 result = my_stat();
     SPAGAIN;
@@ -3053,7 +3142,7 @@ PP(pp_ftsvtx)
 
 PP(pp_fttty)
 {
-    djSP;
+    dSP;
     int fd;
     GV *gv;
     char *tmps = Nullch;
@@ -3089,7 +3178,7 @@ PP(pp_fttty)
 
 PP(pp_fttext)
 {
-    djSP;
+    dSP;
     I32 i;
     I32 len;
     I32 odd = 0;
@@ -3132,11 +3221,12 @@ PP(pp_fttext)
            PL_laststatval = PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
            if (PL_laststatval < 0)
                RETPUSHUNDEF;
-           if (S_ISDIR(PL_statcache.st_mode))  /* handle NFS glitch */
+           if (S_ISDIR(PL_statcache.st_mode)) { /* handle NFS glitch */
                if (PL_op->op_type == OP_FTTEXT)
                    RETPUSHNO;
                else
                    RETPUSHYES;
+            }
            if (PerlIO_get_cnt(IoIFP(io)) <= 0) {
                i = PerlIO_getc(IoIFP(io));
                if (i != EOF)
@@ -3210,12 +3300,12 @@ PP(pp_fttext)
                continue;
 #endif
            /* utf8 characters don't count as odd */
-           if (*s & 0x40) {
+           if (UTF8_IS_START(*s)) {
                int ulen = UTF8SKIP(s);
                if (ulen < len - i) {
                    int j;
                    for (j = 1; j < ulen; j++) {
-                       if ((s[j] & 0xc0) != 0x80)
+                       if (!UTF8_IS_CONTINUATION(s[j]))
                            goto not_utf8;
                    }
                    --ulen;     /* loop does extra increment */
@@ -3249,7 +3339,7 @@ PP(pp_ftbinary)
 
 PP(pp_chdir)
 {
-    djSP; dTARGET;
+    dSP; dTARGET;
     char *tmps;
     SV **svp;
     STRLEN n_a;
@@ -3287,7 +3377,7 @@ PP(pp_chdir)
 
 PP(pp_chown)
 {
-    djSP; dMARK; dTARGET;
+    dSP; dMARK; dTARGET;
     I32 value;
 #ifdef HAS_CHOWN
     value = (I32)apply(PL_op->op_type, MARK, SP);
@@ -3301,7 +3391,7 @@ PP(pp_chown)
 
 PP(pp_chroot)
 {
-    djSP; dTARGET;
+    dSP; dTARGET;
     char *tmps;
 #ifdef HAS_CHROOT
     STRLEN n_a;
@@ -3316,7 +3406,7 @@ PP(pp_chroot)
 
 PP(pp_unlink)
 {
-    djSP; dMARK; dTARGET;
+    dSP; dMARK; dTARGET;
     I32 value;
     value = (I32)apply(PL_op->op_type, MARK, SP);
     SP = MARK;
@@ -3326,7 +3416,7 @@ PP(pp_unlink)
 
 PP(pp_chmod)
 {
-    djSP; dMARK; dTARGET;
+    dSP; dMARK; dTARGET;
     I32 value;
     value = (I32)apply(PL_op->op_type, MARK, SP);
     SP = MARK;
@@ -3336,7 +3426,7 @@ PP(pp_chmod)
 
 PP(pp_utime)
 {
-    djSP; dMARK; dTARGET;
+    dSP; dMARK; dTARGET;
     I32 value;
     value = (I32)apply(PL_op->op_type, MARK, SP);
     SP = MARK;
@@ -3346,7 +3436,7 @@ PP(pp_utime)
 
 PP(pp_rename)
 {
-    djSP; dTARGET;
+    dSP; dTARGET;
     int anum;
     STRLEN n_a;
 
@@ -3373,7 +3463,7 @@ PP(pp_rename)
 
 PP(pp_link)
 {
-    djSP; dTARGET;
+    dSP; dTARGET;
 #ifdef HAS_LINK
     STRLEN n_a;
     char *tmps2 = POPpx;
@@ -3388,7 +3478,7 @@ PP(pp_link)
 
 PP(pp_symlink)
 {
-    djSP; dTARGET;
+    dSP; dTARGET;
 #ifdef HAS_SYMLINK
     STRLEN n_a;
     char *tmps2 = POPpx;
@@ -3403,7 +3493,7 @@ PP(pp_symlink)
 
 PP(pp_readlink)
 {
-    djSP; dTARGET;
+    dSP; dTARGET;
 #ifdef HAS_SYMLINK
     char *tmps;
     char buf[MAXPATHLEN];
@@ -3515,20 +3605,36 @@ S_dooneliner(pTHX_ char *cmd, char *filename)
 
 PP(pp_mkdir)
 {
-    djSP; dTARGET;
+    dSP; dTARGET;
     int mode;
 #ifndef HAS_MKDIR
     int oldumask;
 #endif
-    STRLEN n_a;
+    STRLEN len;
     char *tmps;
+    bool copy = FALSE;
 
     if (MAXARG > 1)
        mode = POPi;
     else
        mode = 0777;
 
-    tmps = SvPV(TOPs, n_a);
+    tmps = SvPV(TOPs, len);
+    /* Different operating and file systems take differently to
+     * trailing slashes.  According to POSIX 1003.1 1996 Edition
+     * any number of trailing slashes should be allowed.
+     * Thusly we snip them away so that even non-conforming
+     * systems are happy. */
+    /* We should probably do this "filtering" for all
+     * the functions that expect (potentially) directory names:
+     * -d, chdir(), chmod(), chown(), chroot(), fcntl()?,
+     * (mkdir()), opendir(), rename(), rmdir(), stat(). --jhi */
+    if (len > 1 && tmps[len-1] == '/') {
+       while (tmps[len] == '/' && len > 1)
+           len--;
+       tmps = savepvn(tmps, len);
+       copy = TRUE;
+    }
 
     TAINT_PROPER("mkdir");
 #ifdef HAS_MKDIR
@@ -3539,12 +3645,14 @@ PP(pp_mkdir)
     PerlLIO_umask(oldumask);
     PerlLIO_chmod(tmps, (mode & ~oldumask) & 0777);
 #endif
+    if (copy)
+       Safefree(tmps);
     RETURN;
 }
 
 PP(pp_rmdir)
 {
-    djSP; dTARGET;
+    dSP; dTARGET;
     char *tmps;
     STRLEN n_a;
 
@@ -3562,7 +3670,7 @@ PP(pp_rmdir)
 
 PP(pp_open_dir)
 {
-    djSP;
+    dSP;
 #if defined(Direntry_t) && defined(HAS_READDIR)
     STRLEN n_a;
     char *dirname = POPpx;
@@ -3589,9 +3697,9 @@ nope:
 
 PP(pp_readdir)
 {
-    djSP;
+    dSP;
 #if defined(Direntry_t) && defined(HAS_READDIR)
-#ifndef I_DIRENT
+#if !defined(I_DIRENT) && !defined(VMS)
     Direntry_t *readdir (DIR *);
 #endif
     register Direntry_t *dp;
@@ -3647,7 +3755,7 @@ nope:
 
 PP(pp_telldir)
 {
-    djSP; dTARGET;
+    dSP; dTARGET;
 #if defined(HAS_TELLDIR) || defined(telldir)
  /* XXX does _anyone_ need this? --AD 2/20/1998 */
  /* XXX netbsd still seemed to.
@@ -3675,7 +3783,7 @@ nope:
 
 PP(pp_seekdir)
 {
-    djSP;
+    dSP;
 #if defined(HAS_SEEKDIR) || defined(seekdir)
     long along = POPl;
     GV *gv = (GV*)POPs;
@@ -3698,7 +3806,7 @@ nope:
 
 PP(pp_rewinddir)
 {
-    djSP;
+    dSP;
 #if defined(HAS_REWINDDIR) || defined(rewinddir)
     GV *gv = (GV*)POPs;
     register IO *io = GvIOn(gv);
@@ -3719,7 +3827,7 @@ nope:
 
 PP(pp_closedir)
 {
-    djSP;
+    dSP;
 #if defined(Direntry_t) && defined(HAS_READDIR)
     GV *gv = (GV*)POPs;
     register IO *io = GvIOn(gv);
@@ -3752,7 +3860,7 @@ nope:
 PP(pp_fork)
 {
 #ifdef HAS_FORK
-    djSP; dTARGET;
+    dSP; dTARGET;
     Pid_t childpid;
     GV *tmpgv;
 
@@ -3762,9 +3870,6 @@ PP(pp_fork)
     if (childpid < 0)
        RETSETUNDEF;
     if (!childpid) {
-#ifdef SOCKS_64BIT_BUG
-       Perl_do_s64_init_buffer();
-#endif
        /*SUPPRESS 560*/
        if ((tmpgv = gv_fetchpv("$", TRUE, SVt_PV)))
            sv_setiv(GvSV(tmpgv), (IV)PerlProc_getpid());
@@ -3774,7 +3879,7 @@ PP(pp_fork)
     RETURN;
 #else
 #  if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
-    djSP; dTARGET;
+    dSP; dTARGET;
     Pid_t childpid;
 
     EXTEND(SP, 1);
@@ -3793,11 +3898,17 @@ PP(pp_fork)
 PP(pp_wait)
 {
 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(MACOS_TRADITIONAL)
-    djSP; dTARGET;
+    dSP; dTARGET;
     Pid_t childpid;
     int argflags;
 
+#ifdef PERL_OLD_SIGNALS
     childpid = wait4pid(-1, &argflags, 0);
+#else
+    while ((childpid = wait4pid(-1, &argflags, 0)) == -1 && errno == EINTR) {
+       PERL_ASYNC_CHECK();
+    }
+#endif
 #  if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
     /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
     STATUS_NATIVE_SET((childpid && childpid != -1) ? argflags : -1);
@@ -3814,14 +3925,20 @@ PP(pp_wait)
 PP(pp_waitpid)
 {
 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(MACOS_TRADITIONAL)
-    djSP; dTARGET;
+    dSP; dTARGET;
     Pid_t childpid;
     int optype;
     int argflags;
 
     optype = POPi;
     childpid = TOPi;
+#ifdef PERL_OLD_SIGNALS
     childpid = wait4pid(childpid, &argflags, optype);
+#else
+    while ((childpid = wait4pid(childpid, &argflags, optype)) == -1 && errno == EINTR) {
+       PERL_ASYNC_CHECK();
+    }
+#endif
 #  if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
     /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
     STATUS_NATIVE_SET((childpid && childpid != -1) ? argflags : -1);
@@ -3837,7 +3954,7 @@ PP(pp_waitpid)
 
 PP(pp_system)
 {
-    djSP; dMARK; dORIGMARK; dTARGET;
+    dSP; dMARK; dORIGMARK; dTARGET;
     I32 value;
     Pid_t childpid;
     int result;
@@ -3951,7 +4068,7 @@ PP(pp_system)
 
 PP(pp_exec)
 {
-    djSP; dMARK; dORIGMARK; dTARGET;
+    dSP; dMARK; dORIGMARK; dTARGET;
     I32 value;
     STRLEN n_a;
 
@@ -4003,7 +4120,7 @@ PP(pp_exec)
 
 PP(pp_kill)
 {
-    djSP; dMARK; dTARGET;
+    dSP; dMARK; dTARGET;
     I32 value;
 #ifdef HAS_KILL
     value = (I32)apply(PL_op->op_type, MARK, SP);
@@ -4018,7 +4135,7 @@ PP(pp_kill)
 PP(pp_getppid)
 {
 #ifdef HAS_GETPPID
-    djSP; dTARGET;
+    dSP; dTARGET;
     XPUSHi( getppid() );
     RETURN;
 #else
@@ -4029,7 +4146,7 @@ PP(pp_getppid)
 PP(pp_getpgrp)
 {
 #ifdef HAS_GETPGRP
-    djSP; dTARGET;
+    dSP; dTARGET;
     Pid_t pid;
     Pid_t pgrp;
 
@@ -4054,7 +4171,7 @@ PP(pp_getpgrp)
 PP(pp_setpgrp)
 {
 #ifdef HAS_SETPGRP
-    djSP; dTARGET;
+    dSP; dTARGET;
     Pid_t pgrp;
     Pid_t pid;
     if (MAXARG < 2) {
@@ -4085,7 +4202,7 @@ PP(pp_setpgrp)
 
 PP(pp_getpriority)
 {
-    djSP; dTARGET;
+    dSP; dTARGET;
     int which;
     int who;
 #ifdef HAS_GETPRIORITY
@@ -4100,7 +4217,7 @@ PP(pp_getpriority)
 
 PP(pp_setpriority)
 {
-    djSP; dTARGET;
+    dSP; dTARGET;
     int which;
     int who;
     int niceval;
@@ -4120,7 +4237,7 @@ PP(pp_setpriority)
 
 PP(pp_time)
 {
-    djSP; dTARGET;
+    dSP; dTARGET;
 #ifdef BIG_TIME
     XPUSHn( time(Null(Time_t*)) );
 #else
@@ -4147,7 +4264,7 @@ PP(pp_time)
 
 PP(pp_tms)
 {
-    djSP;
+    dSP;
 
 #ifndef HAS_TIMES
     DIE(aTHX_ "times not implemented");
@@ -4179,7 +4296,7 @@ PP(pp_localtime)
 
 PP(pp_gmtime)
 {
-    djSP;
+    dSP;
     Time_t when;
     struct tm *tmbuf;
     static char *dayname[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
@@ -4232,7 +4349,7 @@ PP(pp_gmtime)
 
 PP(pp_alarm)
 {
-    djSP; dTARGET;
+    dSP; dTARGET;
     int anum;
 #ifdef HAS_ALARM
     anum = POPi;
@@ -4249,7 +4366,7 @@ PP(pp_alarm)
 
 PP(pp_sleep)
 {
-    djSP; dTARGET;
+    dSP; dTARGET;
     I32 duration;
     Time_t lasttime;
     Time_t when;
@@ -4286,7 +4403,7 @@ PP(pp_shmread)
 PP(pp_shmwrite)
 {
 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
-    djSP; dMARK; dTARGET;
+    dSP; dMARK; dTARGET;
     I32 value = (I32)(do_shmio(PL_op->op_type, MARK, SP) >= 0);
     SP = MARK;
     PUSHi(value);
@@ -4311,7 +4428,7 @@ PP(pp_msgctl)
 PP(pp_msgsnd)
 {
 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
-    djSP; dMARK; dTARGET;
+    dSP; dMARK; dTARGET;
     I32 value = (I32)(do_msgsnd(MARK, SP) >= 0);
     SP = MARK;
     PUSHi(value);
@@ -4324,7 +4441,7 @@ PP(pp_msgsnd)
 PP(pp_msgrcv)
 {
 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
-    djSP; dMARK; dTARGET;
+    dSP; dMARK; dTARGET;
     I32 value = (I32)(do_msgrcv(MARK, SP) >= 0);
     SP = MARK;
     PUSHi(value);
@@ -4339,7 +4456,7 @@ PP(pp_msgrcv)
 PP(pp_semget)
 {
 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
-    djSP; dMARK; dTARGET;
+    dSP; dMARK; dTARGET;
     int anum = do_ipcget(PL_op->op_type, MARK, SP);
     SP = MARK;
     if (anum == -1)
@@ -4354,7 +4471,7 @@ PP(pp_semget)
 PP(pp_semctl)
 {
 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
-    djSP; dMARK; dTARGET;
+    dSP; dMARK; dTARGET;
     int anum = do_ipcctl(PL_op->op_type, MARK, SP);
     SP = MARK;
     if (anum == -1)
@@ -4374,7 +4491,7 @@ PP(pp_semctl)
 PP(pp_semop)
 {
 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
-    djSP; dMARK; dTARGET;
+    dSP; dMARK; dTARGET;
     I32 value = (I32)(do_semop(MARK, SP) >= 0);
     SP = MARK;
     PUSHi(value);
@@ -4406,7 +4523,7 @@ PP(pp_ghbyaddr)
 
 PP(pp_ghostent)
 {
-    djSP;
+    dSP;
 #if defined(HAS_GETHOSTBYNAME) || defined(HAS_GETHOSTBYADDR) || defined(HAS_GETHOSTENT)
     I32 which = PL_op->op_type;
     register char **elem;
@@ -4423,7 +4540,7 @@ PP(pp_ghostent)
     EXTEND(SP, 10);
     if (which == OP_GHBYNAME)
 #ifdef HAS_GETHOSTBYNAME
-       hent = PerlSock_gethostbyname(POPpx);
+       hent = PerlSock_gethostbyname(POPpbytex);
 #else
        DIE(aTHX_ PL_no_sock_func, "gethostbyname");
 #endif
@@ -4432,7 +4549,7 @@ PP(pp_ghostent)
        int addrtype = POPi;
        SV *addrsv = POPs;
        STRLEN addrlen;
-       Netdb_host_t addr = (Netdb_host_t) SvPV(addrsv, addrlen);
+       Netdb_host_t addr = (Netdb_host_t) SvPVbyte(addrsv, addrlen);
 
        hent = PerlSock_gethostbyaddr(addr, (Netdb_hlen_t) addrlen, addrtype);
 #else
@@ -4515,7 +4632,7 @@ PP(pp_gnbyaddr)
 
 PP(pp_gnetent)
 {
-    djSP;
+    dSP;
 #if defined(HAS_GETNETBYNAME) || defined(HAS_GETNETBYADDR) || defined(HAS_GETNETENT)
     I32 which = PL_op->op_type;
     register char **elem;
@@ -4530,7 +4647,7 @@ PP(pp_gnetent)
 
     if (which == OP_GNBYNAME)
 #ifdef HAS_GETNETBYNAME
-       nent = PerlSock_getnetbyname(POPpx);
+       nent = PerlSock_getnetbyname(POPpbytex);
 #else
         DIE(aTHX_ PL_no_sock_func, "getnetbyname");
 #endif
@@ -4603,7 +4720,7 @@ PP(pp_gpbynumber)
 
 PP(pp_gprotoent)
 {
-    djSP;
+    dSP;
 #if defined(HAS_GETPROTOBYNAME) || defined(HAS_GETPROTOBYNUMBER) || defined(HAS_GETPROTOENT)
     I32 which = PL_op->op_type;
     register char **elem;
@@ -4618,7 +4735,7 @@ PP(pp_gprotoent)
 
     if (which == OP_GPBYNAME)
 #ifdef HAS_GETPROTOBYNAME
-       pent = PerlSock_getprotobyname(POPpx);
+       pent = PerlSock_getprotobyname(POPpbytex);
 #else
        DIE(aTHX_ PL_no_sock_func, "getprotobyname");
 #endif
@@ -4686,7 +4803,7 @@ PP(pp_gsbyport)
 
 PP(pp_gservent)
 {
-    djSP;
+    dSP;
 #if defined(HAS_GETSERVBYNAME) || defined(HAS_GETSERVBYPORT) || defined(HAS_GETSERVENT)
     I32 which = PL_op->op_type;
     register char **elem;
@@ -4701,8 +4818,8 @@ PP(pp_gservent)
 
     if (which == OP_GSBYNAME) {
 #ifdef HAS_GETSERVBYNAME
-       char *proto = POPpx;
-       char *name = POPpx;
+       char *proto = POPpbytex;
+       char *name = POPpbytex;
 
        if (proto && !*proto)
            proto = Nullch;
@@ -4714,7 +4831,7 @@ PP(pp_gservent)
     }
     else if (which == OP_GSBYPORT) {
 #ifdef HAS_GETSERVBYPORT
-       char *proto = POPpx;
+       char *proto = POPpbytex;
        unsigned short port = POPu;
 
 #ifdef HAS_HTONS
@@ -4776,7 +4893,7 @@ PP(pp_gservent)
 
 PP(pp_shostent)
 {
-    djSP;
+    dSP;
 #ifdef HAS_SETHOSTENT
     PerlSock_sethostent(TOPi);
     RETSETYES;
@@ -4787,7 +4904,7 @@ PP(pp_shostent)
 
 PP(pp_snetent)
 {
-    djSP;
+    dSP;
 #ifdef HAS_SETNETENT
     PerlSock_setnetent(TOPi);
     RETSETYES;
@@ -4798,7 +4915,7 @@ PP(pp_snetent)
 
 PP(pp_sprotoent)
 {
-    djSP;
+    dSP;
 #ifdef HAS_SETPROTOENT
     PerlSock_setprotoent(TOPi);
     RETSETYES;
@@ -4809,7 +4926,7 @@ PP(pp_sprotoent)
 
 PP(pp_sservent)
 {
-    djSP;
+    dSP;
 #ifdef HAS_SETSERVENT
     PerlSock_setservent(TOPi);
     RETSETYES;
@@ -4820,7 +4937,7 @@ PP(pp_sservent)
 
 PP(pp_ehostent)
 {
-    djSP;
+    dSP;
 #ifdef HAS_ENDHOSTENT
     PerlSock_endhostent();
     EXTEND(SP,1);
@@ -4832,7 +4949,7 @@ PP(pp_ehostent)
 
 PP(pp_enetent)
 {
-    djSP;
+    dSP;
 #ifdef HAS_ENDNETENT
     PerlSock_endnetent();
     EXTEND(SP,1);
@@ -4844,7 +4961,7 @@ PP(pp_enetent)
 
 PP(pp_eprotoent)
 {
-    djSP;
+    dSP;
 #ifdef HAS_ENDPROTOENT
     PerlSock_endprotoent();
     EXTEND(SP,1);
@@ -4856,7 +4973,7 @@ PP(pp_eprotoent)
 
 PP(pp_eservent)
 {
-    djSP;
+    dSP;
 #ifdef HAS_ENDSERVENT
     PerlSock_endservent();
     EXTEND(SP,1);
@@ -4886,7 +5003,7 @@ PP(pp_gpwuid)
 
 PP(pp_gpwent)
 {
-    djSP;
+    dSP;
 #ifdef HAS_PASSWD
     I32 which = PL_op->op_type;
     register SV *sv;
@@ -4948,7 +5065,7 @@ PP(pp_gpwent)
 
     switch (which) {
     case OP_GPWNAM:
-       pwent  = getpwnam(POPpx);
+       pwent  = getpwnam(POPpbytex);
        break;
     case OP_GPWUID:
        pwent = getpwuid((Uid_t)POPi);
@@ -5100,7 +5217,7 @@ PP(pp_gpwent)
 
 PP(pp_spwent)
 {
-    djSP;
+    dSP;
 #if defined(HAS_PASSWD) && defined(HAS_SETPWENT)
     setpwent();
     RETPUSHYES;
@@ -5111,7 +5228,7 @@ PP(pp_spwent)
 
 PP(pp_epwent)
 {
-    djSP;
+    dSP;
 #if defined(HAS_PASSWD) && defined(HAS_ENDPWENT)
     endpwent();
     RETPUSHYES;
@@ -5140,7 +5257,7 @@ PP(pp_ggrgid)
 
 PP(pp_ggrent)
 {
-    djSP;
+    dSP;
 #ifdef HAS_GROUP
     I32 which = PL_op->op_type;
     register char **elem;
@@ -5149,7 +5266,7 @@ PP(pp_ggrent)
     STRLEN n_a;
 
     if (which == OP_GGRNAM)
-       grent = (struct group *)getgrnam(POPpx);
+       grent = (struct group *)getgrnam(POPpbytex);
     else if (which == OP_GGRGID)
        grent = (struct group *)getgrgid(POPi);
     else
@@ -5199,7 +5316,7 @@ PP(pp_ggrent)
 
 PP(pp_sgrent)
 {
-    djSP;
+    dSP;
 #if defined(HAS_GROUP) && defined(HAS_SETGRENT)
     setgrent();
     RETPUSHYES;
@@ -5210,7 +5327,7 @@ PP(pp_sgrent)
 
 PP(pp_egrent)
 {
-    djSP;
+    dSP;
 #if defined(HAS_GROUP) && defined(HAS_ENDGRENT)
     endgrent();
     RETPUSHYES;
@@ -5221,7 +5338,7 @@ PP(pp_egrent)
 
 PP(pp_getlogin)
 {
-    djSP; dTARGET;
+    dSP; dTARGET;
 #ifdef HAS_GETLOGIN
     char *tmps;
     EXTEND(SP, 1);
@@ -5239,7 +5356,7 @@ PP(pp_getlogin)
 PP(pp_syscall)
 {
 #ifdef HAS_SYSCALL
-    djSP; dMARK; dORIGMARK; dTARGET;
+    dSP; dMARK; dORIGMARK; dTARGET;
     register I32 items = SP - MARK;
     unsigned long a[20];
     register I32 i = 0;