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