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;
$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";
+ }
+ }
}
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;
}
};