X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=lib%2FBiblio%2FRFID%2FReader%2Flibrfid.pm;h=8f6a96da6e9ab56b8e393049f0b282198b6f2a73;hb=f0440178e57e4a3fc985fc6670bda920600f78c6;hp=d665d03bb7761ff160aa7c5ef0c227b622ce58f8;hpb=8d89c81fa6ce38b01b736926c2470c9ff12e98c2;p=Biblio-RFID.git diff --git a/lib/Biblio/RFID/Reader/librfid.pm b/lib/Biblio/RFID/Reader/librfid.pm index d665d03..8f6a96d 100644 --- a/lib/Biblio/RFID/Reader/librfid.pm +++ b/lib/Biblio/RFID/Reader/librfid.pm @@ -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; } };