The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/local/bin/perl -w

use SAVI;
use strict;

my $savi = new SAVI();

ref $savi or print "Error initializing savi: " . SAVI->error_string($savi) . " ($savi)\n" and die;

my $version = $savi->version();

ref $version or print "Error getting version: " . $savi->error_string($version) . " ($version)\n" and die;

printf("Version %s (engine %d.%d) recognizing %d viruses\n", $version->string, $version->major,
       $version->minor, $version->count);

foreach ($version->ide_list) {
    printf("\tIDE %s released %s\n", $_->name, $_->date);
}

set_options();

print "\n";

foreach (@ARGV) {
    print "Scanning $_ - ";
    
    my $results = $savi->scan($_);
    ref $results or print "error: " . $savi->error_string($results) . " ($results)\n" and next;
    
    print "clean\n" and next if ! $results->infected;

    print "infected by";
    
    foreach ($results->viruses) {
	print " $_";
    }
    print "\n";
}

sub set_options {

    my @options = qw(
	GrpArchiveUnpack GrpSelfExtract GrpExecutable GrpInternet GrpMSOffice
        GrpMisc !GrpDisinfect !GrpClean
        EnableAutoStop FullSweep FullPdf Xml
      );


    my $error = $savi->set('MaxRecursionDepth', 32);
    defined($error) and print "Error setting MaxRecursionDepth: " . $savi->error_string($error) . " ($error)\n";

    foreach (@options) {
        my $value = ($_ =~ s/^!//) ? 0 : 1;

        $error = $savi->set($_, $value);
	defined($error) and print "Error setting $_: " . $savi->error_string($error) . " ($error)\n";
    }
}