|
Lines 725-730
Link Here
|
| 725 |
|
725 |
|
| 726 |
########################################################################### |
726 |
########################################################################### |
| 727 |
|
727 |
|
|
|
728 |
=item $id = $res->bgread() |
| 729 |
|
| 730 |
Similar to C<Net::DNS::Resolver::bgread>. Reads a DNS packet from |
| 731 |
a supplied socket, decodes it, and returns a Net::DNS::Packet object |
| 732 |
if successful. Dies on error. |
| 733 |
|
| 734 |
=cut |
| 735 |
|
| 736 |
sub bgread() { |
| 737 |
my ($self) = @_; |
| 738 |
my $sock = $self->{sock}; |
| 739 |
my $packetsize = $self->{res}->udppacketsize; |
| 740 |
$packetsize = 512 if $packetsize < 512; # just in case |
| 741 |
my $data = ''; |
| 742 |
my $peeraddr = $sock->recv($data, $packetsize+256); # with some size margin for troubleshooting |
| 743 |
defined $peeraddr or die "bgread: recv() failed: $!"; |
| 744 |
my $peerhost = $sock->peerhost; |
| 745 |
$data ne '' or die "bgread: received empty packet from $peerhost"; |
| 746 |
dbg("dns: bgread: received %d bytes from %s", length($data), $peerhost); |
| 747 |
my($answerpkt, $decoded_length) = Net::DNS::Packet->new(\$data); |
| 748 |
$answerpkt or die "bgread: decoding DNS packet failed: $@"; |
| 749 |
$answerpkt->answerfrom($peerhost); |
| 750 |
if ($decoded_length ne length($data)) { |
| 751 |
warn sprintf("bgread: received a %d bytes packet from %s, decoded %d bytes\n", |
| 752 |
length($data), $peerhost, $decoded_length); |
| 753 |
} |
| 754 |
return $answerpkt; |
| 755 |
} |
| 756 |
|
| 757 |
########################################################################### |
| 758 |
|
| 728 |
=item $nfound = $res->poll_responses() |
759 |
=item $nfound = $res->poll_responses() |
| 729 |
|
760 |
|
| 730 |
See if there are any C<bgsend> reply packets ready, and return |
761 |
See if there are any C<bgsend> reply packets ready, and return |
|
Lines 772-784
Link Here
|
| 772 |
$timeout = 0; # next time around collect whatever is available, then exit |
803 |
$timeout = 0; # next time around collect whatever is available, then exit |
| 773 |
last if $nfound == 0; |
804 |
last if $nfound == 0; |
| 774 |
|
805 |
|
| 775 |
my $packet = $self->{res}->bgread($self->{sock}); |
806 |
my $packet; |
|
|
807 |
eval { |
| 808 |
$packet = $self->bgread(); |
| 809 |
} or do { |
| 810 |
undef $packet; |
| 811 |
my $eval_stat = $@ ne '' ? $@ : "errno=$!"; chomp $eval_stat; |
| 812 |
# resignal if alarm went off |
| 813 |
die $eval_stat if $eval_stat =~ /__alarm__ignore__\(.*\)/s; |
| 814 |
info("dns: bad dns reply: %s", $eval_stat); |
| 815 |
}; |
| 776 |
|
816 |
|
|
|
817 |
# Bug 7265, use our own bgread() |
| 818 |
# my $packet = $self->{res}->bgread($self->{sock}); |
| 819 |
|
| 777 |
if (!$packet) { |
820 |
if (!$packet) { |
| 778 |
my $dns_err = $self->{res}->errorstring; |
821 |
# error already reported above |
| 779 |
# resignal if alarm went off |
822 |
# my $dns_err = $self->{res}->errorstring; |
| 780 |
die "dns (3) $dns_err\n" if $dns_err =~ /__alarm__ignore__\(.*\)/s; |
823 |
# die "dns (3) $dns_err\n" if $dns_err =~ /__alarm__ignore__\(.*\)/s; |
| 781 |
info("dns: bad dns reply: $dns_err"); |
824 |
# info("dns: bad dns reply: $dns_err"); |
| 782 |
} else { |
825 |
} else { |
| 783 |
my $header = $packet->header; |
826 |
my $header = $packet->header; |
| 784 |
if (!$header) { |
827 |
if (!$header) { |