added timeout to 3s for librfid tools
authorDobrica Pavlinusic <dpavlin@rot13.org>
Wed, 12 Feb 2014 15:14:38 +0000 (16:14 +0100)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Wed, 12 Feb 2014 15:14:38 +0000 (16:14 +0100)
lib/Biblio/RFID/Reader/librfid.pm

index 0f559fd..a72395e 100644 (file)
@@ -44,6 +44,13 @@ sub init { 1 }
 sub _grep_tool {
        my ( $bin, $param, $coderef, $path ) = @_;
 
 sub _grep_tool {
        my ( $bin, $param, $coderef, $path ) = @_;
 
+       my $timeout = 3; # s
+
+       eval {
+
+       local $SIG{ALRM} = sub { die "timeout\n" };
+       alarm $timeout;
+
        warn "# _grep_tool $bin $param\n";
        open(my $s, '-|', "$bin $param 2>/dev/null") || die $!;
 
        warn "# _grep_tool $bin $param\n";
        open(my $s, '-|', "$bin $param 2>/dev/null") || die $!;
 
@@ -65,8 +72,12 @@ sub _grep_tool {
                $coderef->( $sid, $iso );
        }
 
                $coderef->( $sid, $iso );
        }
 
+       alarm(0);
        close($s);
        close($s);
-       if ( $? >> 8 ) {
+
+       }; # 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";
                my $lsusb = `lsusb -d 076b:`;
                if ( $lsusb =~ m/\S+\s+(\d+)\s+\S+\s+(\d+)/ ) {
                        my $cmd = "usbreset /dev/bus/usb/$1/$2";