X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=lib%2FZOOM%2FIRSpy.pm;h=a496c67e78bf2115dc3e4fb63142d2fa953ec0ba;hb=9a2899855f877172facc65a396ce5f6157d3ecd3;hp=fa7606a41b5463fa16c69f54edad49363a199af7;hpb=34690ce5321cbcf1cec5f264f4302c2f2208997b;p=irspy-moved-to-github.git diff --git a/lib/ZOOM/IRSpy.pm b/lib/ZOOM/IRSpy.pm index fa7606a..a496c67 100644 --- a/lib/ZOOM/IRSpy.pm +++ b/lib/ZOOM/IRSpy.pm @@ -1,4 +1,4 @@ -# $Id: IRSpy.pm,v 1.61 2007-02-21 17:57:59 mike Exp $ +# $Id: IRSpy.pm,v 1.66 2007-02-23 13:18:43 mike Exp $ package ZOOM::IRSpy; @@ -364,6 +364,7 @@ sub check { } if (!defined $nextaddr) { $conn->log("irspy", "has no more tests: removing"); + ### Does this go wrong if two connections are exhausted? splice @conn, $i0, 1; $this->_rewrite_record($conn); $conn->option(rewrote_record => 1); @@ -397,18 +398,24 @@ sub check { $conn->current_task($task); $task->run(); } - - # Do we need to test $conn->is_idle()? I don't think so! } my $i0 = ZOOM::event(\@conn); $this->log("irspy_event", "ZOOM_event(", scalar(@conn), " connections) = $i0"); - if ($i0 == -3 || $i0 == 0) { - # no connections left, or no events on those that remain - $this->log("irspy", "no events remain"); + if ($i0 < 1) { + my %messages = ( + 0 => "no events remain", + -1 => "ZOOM::event() argument not a reference", + -2 => "ZOOM::event() reference not an array", + -3 => "no connections remain", + -4 => "too many connections for ZOOM::event()", + ); + my $message = $messages{$i0} || "ZOOM::event() returned $i0"; + $this->log("irspy", $message); last; } + my $conn = $conn[$i0-1]; my $ev = $conn->last_event(); my $evstr = ZOOM::event_str($ev); @@ -419,14 +426,19 @@ sub check { eval { $conn->_check() }; if ($@ && ($ev == ZOOM::Event::RECV_DATA || - $ev == ZOOM::Event::ZEND)) { + $ev == ZOOM::Event::ZEND || + ($ev == ZOOM::Event::RECV_APDU && + !$task->isa("ZOOM::IRSpy::Task::Connect")))) { # An error in, say, a search response, becomes visible to # ZOOM before the Receive Data event is sent and persists # until after the End, which means that successive events # each report the same error. So we just ignore errors on - # "unimportant" events. ### But this doesn't work for, - # say, a Connection Refused, as the only event that shows - # us this error is the ZEND. + # "unimportant" events. We can also ignore errors on + # RECV_APDU in most cases, but since there is no RECV_INIT + # event, we need to avoid doing this if the task is + # Connect. Yuck -- special cases. + # ### But this doesn't work for, say, a Connection Refused, + # as the only event that shows us this error is the ZEND. $conn->log("irspy_event", "ignoring error ", "on event $ev ($evstr): $@"); next; @@ -489,11 +501,13 @@ sub check { $this->log("irspy", "exiting main loop"); # Sanity checks: none of the following should ever happen my $finished = 1; - foreach my $conn (@{ $this->{connections} }) { + @conn = @{ $this->{connections} }; + foreach my $conn (@conn) { my $test = $conn->option("current_test_address"); my $next = $this->_next_test($test); if (defined $next) { - $this->log("irspy", "$conn (in test '$test') has queued test '$next'"); + $this->log("irspy", + "$conn (in test '$test') has queued test '$next'"); $finished = 0; } if (my $task = $conn->current_task()) { @@ -505,7 +519,8 @@ sub check { $finished = 0; } if (!$conn->is_idle()) { - $this->log("irspy", "$conn still has ZOOM-C level tasks queued: see below"); + $this->log("irspy", + "$conn still has ZOOM-C level tasks queued: see below"); $finished = 0; } my $ev = $conn->peek_event(); @@ -521,9 +536,10 @@ sub check { } # This really shouldn't be necessary, and in practice it rarely - # helps, but it's belt and braces + # helps, but it's belt and braces. (For now, we don't do this + # hence the zero in the $nruns check). if (!$finished) { - if (++$nruns < 3) { + if (++$nruns < 0) { $this->log("irspy", "back into main loop, ${nruns}th time"); goto ROUND_AND_ROUND_WE_GO; } else { @@ -532,12 +548,12 @@ sub check { } # This shouldn't happen emit anything either: - @conn = @{ $this->{connections} }; - while (my $i1 = ZOOM::event(\@conn)) { + while ((my $i1 = ZOOM::event(\@conn)) > 0) { my $conn = $conn[$i1-1]; my $ev = $conn->last_event(); my $evstr = ZOOM::event_str($ev); - warn "$conn still has ZOOM-C level task queued: $ev ($evstr)" + $this->log("irspy", + "$conn still has ZOOM-C level task queued: $ev ($evstr)") if $ev != ZOOM::Event::ZEND; }