Metabrik-Repository
view release on metacpan or search on metacpan
lib/Metabrik/Network/Dns.pm view on Meta::CPAN
$h->{target} = $rr->target;
}
push @res, $h;
}
return \@res;
}
sub background_lookup {
my $self = shift;
my ($host, $type, $nameserver, $port) = @_;
$type ||= $self->type;
$nameserver ||= $self->nameserver;
$port ||= $self->port;
$self->brik_help_run_undef_arg('background_lookup', $host) or return;
$self->brik_help_run_undef_arg('background_lookup', $nameserver) or return;
my $resolver = $self->resolver;
if (! defined($resolver)) {
$self->create_resolver($nameserver, $port) or return;
$resolver = $self->resolver;
}
$self->log->debug("background_lookup: host [$host] for type [$type]");
my $handle;
eval {
$handle = $resolver->bgsend($host, $type);
};
if ($@ && $@ !~ m{long domain label}) {
chomp($@);
my $ns = ref($nameserver) eq 'ARRAY' ? join('|', @$nameserver)
: $nameserver;
return $self->log->error("background_lookup: bgsend exception [$@], ".
"with nameservers [$ns] and port [$port]");
}
elsif (! defined($handle)) {
my $ns = ref($nameserver) eq 'ARRAY' ? join('|', @$nameserver)
: $nameserver;
return $self->log->error("background_lookup: query failed [".
$resolver->errorstring."], with nameservers [$ns] and ".
"port [$port]");
}
return $handle;
}
sub background_read {
my $self = shift;
my ($handle) = @_;
my $resolver = $self->resolver;
$self->brik_help_set_undef_arg('resolver', $resolver) or return;
$self->brik_help_run_undef_arg('background_read', $handle) or return;
$self->brik_help_run_invalid_arg('background_read', $handle, 'IO::Socket::IP')
or return;
#Â Answer not ready
if ($resolver->bgbusy($handle)) {
return 0;
}
my $packet;
eval {
$packet = $resolver->bgread($handle);
};
if ($@) {
chomp($@);
return $self->log->error("background_read: bgread exception [$@]");
}
elsif (! defined($packet)) {
return []; #Â No error checking possible, undef means no response or timeout.
}
$self->log->debug("background_read: ".$packet->string);
my @res = ();
my @answers = $packet->answer;
for my $rr (@answers) {
$self->log->debug("background_read: ".$rr->string);
my $h = {
type => $rr->type,
ttl => $rr->ttl,
name => $rr->name,
string => $rr->string,
raw => $rr,
};
if ($rr->can('address')) {
$h->{address} = $rr->address;
}
if ($rr->can('cname')) {
$h->{cname} = $rr->cname;
}
if ($rr->can('exchange')) {
$h->{exchange} = $rr->exchange;
}
if ($rr->can('nsdname')) {
$h->{nsdname} = $rr->nsdname;
}
if ($rr->can('ptrdname')) {
$h->{ptrdname} = $rr->ptrdname;
}
if ($rr->can('rdatastr')) {
$h->{rdatastr} = $rr->rdatastr;
}
if ($rr->can('dummy')) {
$h->{dummy} = $rr->dummy;
}
if ($rr->can('target')) {
$h->{target} = $rr->target;
}
push @res, $h;
}
return \@res;
}
( run in 1.532 second using v1.01-cache-2.11-cpan-39bf76dae61 )