# ClamAV filter for Courier perlfitler. See the perlfilter-example that
# comes with Courier for the comments.

use IO::File;

my $filedesc=shift @ARGV;
my $socket=new IO::File "+<&$filedesc";
die "$!" unless defined $socket;

my $line;
my $first=1;
my $errmsg="200 Ok";

while (defined ($line=<$socket>)) {
	my $msg;
	chomp $line;
	last unless $line;
	if ($first) {
		$msg=filterdata($line);
	}
	else {
		$msg=filtercontrol($line);
	}
	$first=0;
	$errmsg=$msg if $msg;
}

$errmsg .= "\n" unless $errmsg =~ /\n$/;
print $socket $errmsg;

$socket->close;

sub filterdata {
	my $filename=shift;
	open(CLAMOUT, "cat ${filename} | clamdscan --stdout - |");
	my $clamout = <CLAMOUT>;
	close(CLAMOUT);
	if ( $clamout =~ m/ FOUND$/ ) {
		$clamout =~ s/.*stream: (.*) FOUND/$1/;
		return "500 Virus Detected: ${clamout}";
	}
	return "";
}

sub filtercontrol {
	my $filename=shift;
	return "";
}
