[perl #64772] check both input and output file handles for sync
authorEvan Miller <eam@frap.net>
Thu, 31 May 2012 13:52:26 +0000 (23:52 +1000)
committerTony Cook <tony@develop-help.com>
Fri, 1 Jun 2012 11:21:32 +0000 (21:21 +1000)
This allows sync() to be called on directory handles.

Originally supplied as a diff, applied and updated to pass tests by
Tony Cook.

dist/IO/IO.pm
dist/IO/IO.xs
dist/IO/t/io_xs.t

index e6f5567..011603f 100644 (file)
@@ -7,7 +7,7 @@ use Carp;
 use strict;
 use warnings;
 
-our $VERSION = "1.25_06";
+our $VERSION = "1.25_07";
 XSLoader::load 'IO', $VERSION;
 
 sub import {
index 0501567..085db54 100644 (file)
@@ -466,10 +466,15 @@ setvbuf(...)
 
 
 SysRet
-fsync(handle)
-       OutputStream handle
+fsync(arg)
+       SV * arg
+    PREINIT:
+       OutputStream handle = NULL;
     CODE:
 #ifdef HAS_FSYNC
+       handle = IoOFP(sv_2io(arg));
+       if (!handle)
+           handle = IoIFP(sv_2io(arg));
        if(handle)
            RETVAL = fsync(PerlIO_fileno(handle));
        else {
index a86ee7e..968b3f5 100644 (file)
@@ -45,6 +45,5 @@ SKIP:
        and skip "directory sync doesn't apply to MSWin32", 1;
     open my $dh, "<", "."
        or skip "Cannot open the cwd", 1;
-    local $TODO = "[perl #64772] IO::Handle->sync fails on an O_RDONLY descriptor";
     ok($dh->sync, "sync to a read only directory handle");
 }