X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FSpamcheck%2FSpamc.pm;h=ba8e44a489c031b8b237bec466fc2dfccb72943b;hb=d9c9dc5af637e097d545a828d887aae99ddcd2a7;hp=312e52df92fd454274ed0fdf621b71a834b69dfa;hpb=c515264dd69156fc89c59685f788b1093afb8731;p=public-inbox.git diff --git a/lib/PublicInbox/Spamcheck/Spamc.pm b/lib/PublicInbox/Spamcheck/Spamc.pm index 312e52df..ba8e44a4 100644 --- a/lib/PublicInbox/Spamcheck/Spamc.pm +++ b/lib/PublicInbox/Spamcheck/Spamc.pm @@ -4,7 +4,7 @@ package PublicInbox::Spamcheck::Spamc; use strict; use warnings; use PublicInbox::Spawn qw(popen_rd spawn); -use IO::File; +use IO::Handle; use Fcntl qw(:DEFAULT SEEK_SET); sub new { @@ -29,10 +29,14 @@ sub spamcheck { my $buf = ''; $out = \$buf; } +again: do { $r = sysread($fh, $$out, 65536, length($$out)); } while (defined($r) && $r != 0); - defined $r or die "read failed: $!"; + unless (defined $r) { + goto again if $!{EINTR}; + die "read failed: $!"; + } close $fh or die "close failed: $!"; waitpid($pid, 0); ($? || $$out eq '') ? 0 : 1; @@ -72,13 +76,12 @@ sub _devnull { sub _msg_to_fd { my ($self, $msg, $tmpref) = @_; - my $tmpfh; my $fd; if (my $ref = ref($msg)) { + my $fileno = eval { fileno($msg) }; + return $fileno if defined $fileno; - return $msg->fileno if $ref ne 'SCALAR' && $msg->can('fileno'); - - $tmpfh = IO::File->new_tmpfile; + open(my $tmpfh, '+>', undef) or die "failed to open: $!"; $tmpfh->autoflush(1); $msg = \($msg->as_string) if $ref ne 'SCALAR'; print $tmpfh $$msg or die "failed to print: $!";