From 88d1b20dddc19244c02eed285926d0ab9db27d64 Mon Sep 17 00:00:00 2001
From: Andreas Romeyke <art1@andreas-romeyke.de>
Date: Mon, 12 Oct 2020 11:13:17 +0200
Subject: [PATCH] =?UTF-8?q?-=20added=20sysseek=20check=20to=20end,=20to=20?=
 =?UTF-8?q?detect=20if=20there=20is=20an=20GPFS=20problem=E2=80=A6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 deep_fixitycheck.pl | 26 ++++++++++++++++++++++----
 1 file changed, 22 insertions(+), 4 deletions(-)

diff --git a/deep_fixitycheck.pl b/deep_fixitycheck.pl
index bd554f5..694b921 100644
--- a/deep_fixitycheck.pl
+++ b/deep_fixitycheck.pl
@@ -30,6 +30,7 @@ use Getopt::Long;
 use constant DEBUG => 0; # no debug
 use Pod::Usage;
 use IO::Handle;
+use Fcntl qw(SEEK_END SEEK_SET);
 STDOUT->autoflush(1);
 # guarantee, that output will be UTF8
 binmode(STDOUT, ":encoding(UTF-8)");
@@ -236,6 +237,17 @@ sub check_file_size($$) {
   return $result;
 }
 
+sub check_file_seekable($$) {
+  my $fileobj = shift;
+  my $result = shift;
+  my $fh = path($fileobj->{file_mounted})->openr_raw();
+  $result->{seekable} = sysseek( $fh, 0, SEEK_END );
+  if (!$result->{seekable}) {
+    add_error($fileobj, $result, "is not seekable, $!");
+  }
+  return $result;
+}
+
 # check if referenced file has correct checksum for given algorithm
 sub check_file_fixity($$$) {
   my $fileobj = shift;
@@ -322,11 +334,17 @@ if (defined $search_dir && -d "$search_dir") {
         my $result;
         $result->{errors} = 0;
         $result = check_if_file_exist($fileobj, $result);
-        if ($result->{exist}) { # only if file exists, do additional checks
+        if ($result->{exist}) {
+          # only if file exists, do additional checks
           $result = check_file_size($fileobj, $result);
-          foreach my $fixity_algorithm (@algorithms) {
-            if ($fileobj->{fixity}->{$fixity_algorithm}) {
-              $result = check_file_fixity($fileobj, $result, $fixity_algorithm);
+          if ($result->{size}) {
+            $result = check_file_seekable($fileobj, $result);
+            if ($result->{seekable}) {
+              foreach my $fixity_algorithm (@algorithms) {
+                if ($fileobj->{fixity}->{$fixity_algorithm}) {
+                  $result = check_file_fixity($fileobj, $result, $fixity_algorithm);
+                }
+              }
             }
           }
         }
-- 
GitLab