return @records;
}
-sub spam_score {
+sub spamc_bug {
my ($record,$spamc,$spamc_opts) = @_;
- my ($score,$threshold,$report);
- my $is_spam = 0;
+ my $first_line = '';
+ my $report = '';
+ my $exit_code = 0;
eval {
my ($spamc_in,$spamc_out);
my $old_sig = $SIG{"PIPE"};
};
my $childpid =
open3($spamc_in,$spamc_out,0,
- $spamc,'-E',@{$spamc_opts}) or
+ $spamc,@{$spamc_opts}) or
die "Unable to fork spamc: $!";
if (not $childpid) {
die "Unable to fork spamc";
close($spamc_in) or die "Unable to close spamc_in: $!";
waitpid($childpid,0);
if ($? >> 8) {
- $is_spam = 1;
- }
- my ($first_line,@report) = <$spamc_out>;
- if ($DEBUG) {
- print STDERR "[$?;".($? >> 8)."] ";
- print STDERR $first_line,@report;
- print STDERR " ";
- }
- if (defined $first_line) {
- chomp $first_line;
- ($score,$threshold) = $first_line =~ m{^(-?[\d\.]+)/(-?[\d\.]+)$};
- $report = join('',@report);
+ $exit_code = $? >> 8;
}
+ local $/;
+ $report = <$spamc_out>;
close($spamc_out);
$SIG{"PIPE"} = $old_sig;
};
carp "processing of message failed [$@]\n";
return undef;
}
- return wantarray?($score,$is_spam,$report):$score;
+ return ($exit_code,$report);
+}
+
+sub spam_score {
+ my ($record,$spamc,$spamc_opts) = @_;
+ my ($score,$threshold,$report,$exit_code);
+ ($exit_code,$report) =
+ spamc_bug($record,$spamc,[@{$spamc_opts},'-c']);
+ if (defined $report) {
+ ($score,$threshold) = $report =~ s{^(-?[\d\.]+)/(-?[\d\.]+)\n?}{};
+ }
+ return wantarray?($score,$exit_code,$report):$score;
+}
}
sub foreachmsg {