X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=perlio.c;h=0a086a8b4f2ef84f7b85ea2bdcb225338f1ee813;hb=8177d4d97c5035e1ca045371b1be47a2ef66ec1d;hp=436bb85a68e4e2d4a21e14fdf59280900654bfad;hpb=2556f95e0f4f5e8e95c9766374614ab52edefe3d;p=p5sagit%2Fp5-mst-13.2.git diff --git a/perlio.c b/perlio.c index 436bb85..0a086a8 100644 --- a/perlio.c +++ b/perlio.c @@ -807,7 +807,7 @@ PerlIO_find_layer(pTHX_ const char *name, STRLEN len, int load) } else { SV * const pkgsv = newSVpvs("PerlIO"); SV * const layer = newSVpvn(name, len); - CV * const cv = Perl_get_cvn_flags(aTHX_ STR_WITH_LEN("PerlIO::Layer::NoWarnings"), 0); + CV * const cv = get_cvs("PerlIO::Layer::NoWarnings", 0); ENTER; SAVEINT(PL_in_load_module); if (cv) { @@ -2736,14 +2736,9 @@ PerlIOUnix_tell(pTHX_ PerlIO *f) return PerlLIO_lseek(PerlIOSelf(f, PerlIOUnix)->fd, 0, SEEK_CUR); } -IV -PerlIOUnix_close(pTHX_ PerlIO *f) -{ - return PerlIOBase_noop_ok(aTHX_ f); -} IV -PerlIOUnix_popped(pTHX_ PerlIO *f) +PerlIOUnix_close(pTHX_ PerlIO *f) { dVAR; const int fd = PerlIOSelf(f, PerlIOUnix)->fd; @@ -2777,7 +2772,7 @@ PERLIO_FUNCS_DECL(PerlIO_unix) = { sizeof(PerlIOUnix), PERLIO_K_RAW, PerlIOUnix_pushed, - PerlIOUnix_popped, + PerlIOBase_popped, PerlIOUnix_open, PerlIOBase_binmode, /* binmode */ NULL, @@ -3038,7 +3033,9 @@ PerlIOStdio_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags) stdio = PerlSIO_fdopen(fd, PerlIO_modestr(o,mode)); set_this: PerlIOSelf(f, PerlIOStdio)->stdio = stdio; - PerlIOUnix_refcnt_inc(fileno(stdio)); + if(stdio) { + PerlIOUnix_refcnt_inc(fileno(stdio)); + } } return f; } @@ -3127,12 +3124,6 @@ PerlIOStdio_invalidate_fileno(pTHX_ FILE *f) IV PerlIOStdio_close(pTHX_ PerlIO *f) { - return PerlIOBase_noop_ok(aTHX_ f); -} - -IV -PerlIOStdio_popped(pTHX_ PerlIO *f) -{ FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio; if (!stdio) { errno = EBADF; @@ -3142,8 +3133,8 @@ PerlIOStdio_popped(pTHX_ PerlIO *f) const int fd = fileno(stdio); int invalidate = 0; IV result = 0; - int saveerr = 0; int dupfd = -1; + dSAVEDERRNO; #ifdef USE_ITHREADS dVAR; #endif @@ -3177,7 +3168,7 @@ PerlIOStdio_popped(pTHX_ PerlIO *f) fileno slot of the FILE * */ result = PerlIO_flush(f); - saveerr = errno; + SAVE_ERRNO; invalidate = PerlIOStdio_invalidate_fileno(aTHX_ stdio); if (!invalidate) { #ifdef USE_ITHREADS @@ -3210,13 +3201,15 @@ PerlIOStdio_popped(pTHX_ PerlIO *f) } #endif } + } else { + SAVE_ERRNO; /* This is here only to silence compiler warnings */ } result = PerlSIO_fclose(stdio); /* We treat error from stdio as success if we invalidated errno may NOT be expected EBADF */ if (invalidate && result != 0) { - errno = saveerr; + RESTORE_ERRNO; result = 0; } #ifdef SOCKS5_VERSION_NAME @@ -3378,9 +3371,9 @@ PerlIOStdio_flush(pTHX_ PerlIO *f) /* * Not writeable - sync by attempting a seek */ - const int err = errno; + dSAVE_ERRNO; if (PerlSIO_fseek(stdio, (Off_t) 0, SEEK_CUR) != 0) - errno = err; + RESTORE_ERRNO; #endif } return 0; @@ -3569,7 +3562,7 @@ PERLIO_FUNCS_DECL(PerlIO_stdio) = { sizeof(PerlIOStdio), PERLIO_K_BUFFERED|PERLIO_K_RAW, PerlIOStdio_pushed, - PerlIOStdio_popped, + PerlIOBase_popped, PerlIOStdio_open, PerlIOBase_binmode, /* binmode */ NULL,