]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/Spamcheck/Spamc.pm
spamc: retry on EINTR
[public-inbox.git] / lib / PublicInbox / Spamcheck / Spamc.pm
index 312e52df92fd454274ed0fdf621b71a834b69dfa..ba8e44a489c031b8b237bec466fc2dfccb72943b 100644 (file)
@@ -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: $!";