Use native methods to open input in TestLib::slurp_file on Windows.
authorAndrew Dunstan <[email protected]>
Tue, 15 Dec 2020 15:00:18 +0000 (10:00 -0500)
committerAndrew Dunstan <[email protected]>
Tue, 15 Dec 2020 15:29:33 +0000 (10:29 -0500)
This is a backport of commits 114541d58e and 6f59826f0 to the remaining
live branches.

src/test/perl/TestLib.pm

index b606e1b173f5d23314dedd9a1b416d4b207581dd..6dbf3e6fc3b61a0330ccf0bb3be98bed142585dc 100644 (file)
@@ -44,7 +44,17 @@ use SimpleTee;
 
 use Test::More;
 
-our $windows_os = $Config{osname} eq 'MSWin32' || $Config{osname} eq 'msys';
+our $windows_os;
+
+BEGIN
+{
+   $windows_os = $Config{osname} eq 'MSWin32' || $Config{osname} eq 'msys';
+   if ($windows_os)
+   {
+       require Win32API::File;
+       Win32API::File->import(qw(createFile OsFHandleOpen CloseHandle));
+   }
+}
 
 # Open log file. For each test, the log file name uses the name of the
 # file launching this module, without the .pl suffix.
@@ -277,10 +287,24 @@ sub slurp_file
 {
    my ($filename) = @_;
    local $/;
-   open(my $in, '<', $filename)
-     or die "could not read \"$filename\": $!";
-   my $contents = <$in>;
-   close $in;
+   my $contents;
+   if ($Config{osname} ne 'MSWin32')
+   {
+       open(my $in, '<', $filename)
+         or die "could not read \"$filename\": $!";
+       $contents = <$in>;
+       close $in;
+   }
+   else
+   {
+       my $fHandle = createFile($filename, "r", "rwd")
+         or die "could not open \"$filename\": $^E";
+       OsFHandleOpen(my $fh = IO::Handle->new(), $fHandle, 'r')
+         or die "could not read \"$filename\": $^E\n";
+       $contents = <$fh>;
+       CloseHandle($fHandle)
+         or die "could not close \"$filename\": $^E\n";
+   }
    $contents =~ s/\r\n/\n/g if $Config{osname} eq 'msys';
    return $contents;
 }