kill TERM pipe program on timeout
[Biblio-RFID.git] / lib / Biblio / RFID / Reader / librfid.pm
index d665d03..8f6a96d 100644 (file)
@@ -44,8 +44,20 @@ sub init { 1 }
 sub _grep_tool {
        my ( $bin, $param, $coderef, $path ) = @_;
 
+       my $timeout = 3; # s
+
+       eval {
+
        warn "# _grep_tool $bin $param\n";
-       open(my $s, '-|', "$bin $param 2>/dev/null") || die $!;
+#      $param .= ' 2>/dev/null';
+       my $pipe_pid = open(my $s, '-|', "$bin $param") || die $!;
+
+       local $SIG{ALRM} = sub {
+               warn "TIMEOUT!";
+               kill TERM => $pipe_pid;
+               die "timeout\n"
+       };
+       alarm $timeout;
 
        my $sid;
        my $iso;
@@ -65,6 +77,21 @@ sub _grep_tool {
                $coderef->( $sid, $iso );
        }
 
+       alarm(0);
+       close($s);
+
+       }; # eval
+
+       if ( $? >> 8 || $@ ) {
+               my $lsusb = `lsusb -d 076b:`;
+               if ( $lsusb =~ m/\S+\s+(\d+)\s+\S+\s+(\d+)/ ) {
+                       my $cmd = "usbreset /dev/bus/usb/$1/$2";
+                       warn "# $cmd\n";
+                       system $cmd;
+               } else {
+                       warn "can't reset device $lsusb";
+               }
+       }
 
 }
 
@@ -73,10 +100,11 @@ my $sid_iso;
 sub inventory {
 
        my @tags; 
+       $sid_iso = {};
        _grep_tool 'librfid-tool', '--scan' => sub {
                my ( $sid, $iso ) = @_;
-               if ( $sid ) {
-                       push @tags, $sid unless defined $sid_iso->{$sid};
+               if ( $sid && ! exists $sid_iso->{$sid} ) {
+                       push @tags, $sid;
                        $sid_iso->{$sid} = $iso;
                }
        };