PUTBACK;
if (PerlIO_binmode(aTHX_ fp,IoTYPE(io),mode_from_discipline(discp),
(discp) ? SvPV_nolen(discp) : Nullch)) {
+ if (IoOFP(io) && IoOFP(io) != IoIFP(io)) {
+ if (!PerlIO_binmode(aTHX_ IoOFP(io),IoTYPE(io),
+ mode_from_discipline(discp),
+ (discp) ? SvPV_nolen(discp) : Nullch)) {
+ SPAGAIN;
+ RETPUSHUNDEF;
+ }
+ }
SPAGAIN;
RETPUSHYES;
}
bool charstart = FALSE;
STRLEN charskip = 0;
STRLEN skip = 0;
- PerlIO *pio;
gv = (GV*)*++MARK;
if ((PL_op->op_type == OP_READ || PL_op->op_type == OP_SYSREAD)
SETERRNO(EBADF,RMS_IFI);
goto say_undef;
}
- pio = IoIFP(io);
-#ifdef PERLIO_LAYERS
- if (PL_op->op_type == OP_SYSREAD) {
- /* sysread happens further down the stack
- and we need isutf8 of that layer
- */
- pio = PerlIO_syslayer(aTHX_ pio);
- if (!pio) {
- goto say_undef;
- }
- }
-#endif
- if ((fp_utf8 = PerlIO_isutf8(pio)) && !IN_BYTES) {
+ if ((fp_utf8 = PerlIO_isutf8(IoIFP(io))) && !IN_BYTES) {
buffer = SvPVutf8_force(bufsv, blen);
/* UTF8 may not have been set if they are all low bytes */
SvUTF8_on(bufsv);
#endif
buffer = SvGROW(bufsv, (STRLEN)(length+1));
/* 'offset' means 'flags' here */
- count = PerlSock_recvfrom(PerlIO_fileno(pio), buffer, length, offset,
+ count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, offset,
(struct sockaddr *)namebuf, &bufsize);
if (count < 0)
RETPUSHUNDEF;
}
buffer = buffer + offset;
-#ifndef PERLIO_LAYERS
if (PL_op->op_type == OP_SYSREAD) {
#ifdef PERL_SOCK_SYSREAD_IS_RECV
if (IoTYPE(io) == IoTYPE_SOCKET) {
- count = PerlSock_recv(PerlIO_fileno(pio),
+ count = PerlSock_recv(PerlIO_fileno(IoIFP(io)),
buffer, length, 0);
}
else
#endif
{
- count = PerlLIO_read(PerlIO_fileno(pio),
+ count = PerlLIO_read(PerlIO_fileno(IoIFP(io)),
buffer, length);
}
}
else
-#endif
#ifdef HAS_SOCKET__bad_code_maybe
if (IoTYPE(io) == IoTYPE_SOCKET) {
char namebuf[MAXPATHLEN];
#else
bufsize = sizeof namebuf;
#endif
- count = PerlSock_recvfrom(PerlIO_fileno(pio), buffer, length, 0,
+ count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, 0,
(struct sockaddr *)namebuf, &bufsize);
}
else
#endif
{
- count = PerlIO_read(pio, buffer, length);
+ count = PerlIO_read(IoIFP(io), buffer, length);
/* PerlIO_read() - like fread() returns 0 on both error and EOF */
- if (count == 0 && PerlIO_error(pio))
+ if (count == 0 && PerlIO_error(IoIFP(io)))
count = -1;
}
if (count < 0) {