return -1;
}
}
- else
+ else {
Perl_warn(aTHX_ "perlio: unknown layer \"%.*s\"",(int)llen,s);
+ return -1;
+ }
}
s = e;
}
IV
PerlIOStdio_pushed(PerlIO *f, const char *mode, const char *arg, STRLEN len)
{
+ dTHX;
if (*PerlIONext(f))
{
PerlIOStdio *s = PerlIOSelf(f,PerlIOStdio);
PerlIOStdio_close(PerlIO *f)
{
dTHX;
-#ifdef HAS_SOCKET
+#ifdef HAS_SOCKS5_INIT
int optval, optlen = sizeof(int);
#endif
FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
return(
-#ifdef HAS_SOCKET
+#ifdef HAS_SOCKS5_INIT
(getsockopt(PerlIO_fileno(f), SOL_SOCKET, SO_TYPE, (char *)&optval, &optlen) < 0) ?
PerlSIO_fclose(stdio) :
close(PerlIO_fileno(f))
PerlIOBuf_pushed(PerlIO *f, const char *mode, const char *arg, STRLEN len)
{
PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
- b->posn = PerlIO_tell(PerlIONext(f));
+ int fd = PerlIO_fileno(f);
+ Off_t posn;
+ if (fd >= 0 && PerlLIO_isatty(fd))
+ {
+ PerlIOBase(f)->flags |= PERLIO_F_LINEBUF;
+ }
+ posn = PerlIO_tell(PerlIONext(f));
+ if (posn != (Off_t) -1)
+ {
+ b->posn = posn;
+ }
return PerlIOBase_pushed(f,mode,arg,len);
}
avail = count;
if (avail > 0)
got = PerlIOBuf_read(f,vbuf,avail);
- if (got < count)
- got += PerlIO_read(f,((STDCHAR *) vbuf)+got,count-got);
+ if (got >= 0 && got < count)
+ {
+ SSize_t more = PerlIO_read(f,((STDCHAR *) vbuf)+got,count-got);
+ if (more >= 0 || got == 0)
+ got += more;
+ }
return got;
}
SV *sv = newSVpvn("",0);
char *s;
STRLEN len;
+ SSize_t wrote;
#ifdef NEED_VA_COPY
va_list apc;
Perl_va_copy(ap, apc);
sv_vcatpvf(sv, fmt, &ap);
#endif
s = SvPV(sv,len);
- return PerlIO_write(f,s,len);
+ wrote = PerlIO_write(f,s,len);
+ SvREFCNT_dec(sv);
+ return wrote;
}
#undef PerlIO_printf