File Coverage

blib/lib/File/VirusScan/Engine/Command/ClamAV/Clamscan.pm
Criterion Covered Total %
statement 25 38 65.7
branch 1 12 8.3
condition n/a
subroutine 9 9 100.0
pod 1 2 50.0
total 36 61 59.0


line stmt bran cond sub pod time code
1             package File::VirusScan::Engine::Command::ClamAV::Clamscan;
2 1     1   48630 use strict;
  1         2  
  1         28  
3 1     1   4 use warnings;
  1         2  
  1         31  
4 1     1   5 use Carp;
  1         1  
  1         46  
5              
6 1     1   304 use File::VirusScan::Engine::Command;
  1         2  
  1         5  
7 1     1   34 use vars qw( @ISA );
  1         0  
  1         33  
8             @ISA = qw( File::VirusScan::Engine::Command );
9              
10 1     1   4 use Cwd 'abs_path';
  1         1  
  1         37  
11              
12 1     1   299 use File::VirusScan::Result;
  1         1  
  1         214  
13              
14             sub default_arguments
15             {
16 6     6 0 20 return [qw(--stdout --no-summary --infected)];
17             }
18              
19             sub scan
20             {
21 1     1 1 786 my ($self, $path) = @_;
22              
23 1 50       60 if(abs_path($path) ne $path) {
24 1         14 return File::VirusScan::Result->error("Path $path is not absolute");
25             }
26              
27 0           my ($exitcode, $scan_response) = eval { $self->_run_commandline_scanner(join(' ', $self->{command}, @{ $self->{args} }, $path, '2>&1')); };
  0            
  0            
28              
29 0 0         if($@) {
30 0           return File::VirusScan::Result->error($@);
31             }
32              
33 0 0         if(0 == $exitcode) {
34 0           return File::VirusScan::Result->clean();
35             }
36              
37 0 0         if(1 == $exitcode) {
38              
39             # TODO: what if more than one virus found?
40             # TODO: can/should we capture infected filenames?
41 0 0         if($scan_response =~ m/: (.+) FOUND/) {
    0          
42 0           return File::VirusScan::Result->virus($1);
43             } elsif($scan_response =~ m/: (.+) ERROR/) {
44 0           my $err_detail = $1;
45 0           return File::VirusScan::Result->error("clamscan error: $err_detail");
46             }
47             }
48              
49 0           return File::VirusScan::Result->error("Unknown return code from clamscan: $exitcode");
50             }
51              
52             1;
53             __END__