(perl #133604) fix binmode on Win32 :crlf layers tonyc/133604-crlf-binmode-utf8
authorTony Cook <tony@develop-help.com>
Mon, 22 Oct 2018 04:22:47 +0000 (15:22 +1100)
committerTony Cook <tony@develop-help.com>
Mon, 22 Oct 2018 04:22:47 +0000 (15:22 +1100)
On Win32 the :crlf layer is special - it replaces the use of the normal
:perlio buffering layer.

So while binmode :raw with :crlf present on non-Win32 removes the
CRLF layer, on Win32 it simply switches the :crlf layer's CRLF flag off
to prevent translation.

Unfortunately the :crlf skipped doing something else expected by :raw -
it didn't turn off the layer UTF8 flag.  This broke the tests I added
in 9704d779004.

perlio.c
t/io/crlf.t
t/io/socket.t

index ba934ff..904d47a 100644 (file)
--- a/perlio.c
+++ b/perlio.c
@@ -4825,7 +4825,7 @@ PerlIOCrlf_binmode(pTHX_ PerlIO *f)
        PerlIO_pop(aTHX_ f);
 #endif
     }
-    return 0;
+    return PerlIOBase_binmode(aTHX_ f);
 }
 
 PERLIO_FUNCS_DECL(PerlIO_crlf) = {
index aa20f0e..d0275af 100644 (file)
@@ -98,7 +98,6 @@ my $ungetc_count = 8200;    # Somewhat over the likely buffer size
         ok((() = grep($_ eq "utf8", PerlIO::get_layers($fh))),
            "check :utf8 set");
         ok(binmode($fh), "remove :utf8");
-        local $TODO = "this fails without the fix";
         ok(!(() = grep($_ eq "utf8", PerlIO::get_layers($fh))),
            "check :utf8 removed");
         close $fh;
index 10c9ef3..be3abc0 100644 (file)
@@ -141,8 +141,6 @@ SKIP: {
     # separate to avoid interfering with the data expected above
     $local or skip("No localhost", 1);
     $fork or skip("No fork", 1);
-    $^O eq "MSWin32"
-      and skip("binmode acting strangely here on Win32", 1);
 
     note "recv/send :utf8 tests";
     ok(socket(my $serv, PF_INET, SOCK_STREAM, $tcp), "make a tcp socket (recv/send :utf8 handling)");