the resolved hostnames indeed point to the address, which makes spoofing
harder.
If you want to resolve an address into a hostname, this is the preferred
method: The DNS records could still change, but at least this function
verified that the hostname, at one point in the past, pointed at the IP
address you originally resolved.
Example:
AnyEvent::DNS::ptr "2001:500:2f::f", sub { print shift };
# => f.root-servers.net
=cut
sub MAX_PKT() { 4096 } # max packet size we advertise and accept
sub DOMAIN_PORT() { 53 } # if this changes drop me a note
sub resolver;
sub a($$) {
my ($domain, $cb) = @_;
resolver->resolve ($domain => "a", sub {
$cb->(map $_->[3], @_);
});
}
sub aaaa($$) {
my ($domain, $cb) = @_;
resolver->resolve ($domain => "aaaa", sub {
$cb->(map $_->[3], @_);
});
}
sub mx($$) {
my ($domain, $cb) = @_;
resolver->resolve ($domain => "mx", sub {
$cb->(map $_->[4], sort { $a->[3] <=> $b->[3] } @_);
});
}
sub ns($$) {
my ($domain, $cb) = @_;
resolver->resolve ($domain => "ns", sub {
$cb->(map $_->[3], @_);
});
}
sub txt($$) {
my ($domain, $cb) = @_;
resolver->resolve ($domain => "txt", sub {
$cb->(map $_->[3], @_);
});
}
sub srv($$$$) {
my ($service, $proto, $domain, $cb) = @_;
# todo, ask for any and check glue records
resolver->resolve ("_$service._$proto.$domain" => "srv", sub {
my @res;
# classify by priority
my %pri;
push @{ $pri{$_->[3]} }, [ @$_[3,4,5,6] ]
for @_;
# order by priority
for my $pri (sort { $a <=> $b } keys %pri) {
# order by weight
my @rr = sort { $a->[1] <=> $b->[1] } @{ delete $pri{$pri} };
my $sum; $sum += $_->[1] for @rr;
while (@rr) {
my $w = int rand $sum + 1;
for (0 .. $#rr) {
if (($w -= $rr[$_][1]) <= 0) {
$sum -= $rr[$_][1];
push @res, splice @rr, $_, 1, ();
last;
}
}
}
}
$cb->(@res);
});
}
sub ptr($$) {
my ($domain, $cb) = @_;
resolver->resolve ($domain => "ptr", sub {
=2= |