diff --git a/deep_fixitycheck.pl b/deep_fixitycheck.pl index bd554f5e00104a0e82a534fcaf1a994ae652e061..694b9217b3cfc39cd3c3a7b44209a7fd93269676 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); + } + } } } }