=item reuse => $seconds
The number of seconds (default: C<300>) that a query id cannot be re-used
after a timeout. If there was no time-out then query ids can be reused
immediately.
=back
=cut
sub new {
my ($class, %arg) = @_;
my $self = bless {
server => [],
timeout => [2, 5, 5],
search => [],
ndots => 1,
max_outstanding => 10,
reuse => 300,
%arg,
reuse_q => [],
}, $class;
# search should default to gethostname's domain
# but perl lacks a good posix module
# try to create an ipv4 and an ipv6 socket
# only fail when we cannot create either
my $got_socket;
Scalar::Util::weaken (my $wself = $self);
if (socket my $fh4, AF_INET , &Socket::SOCK_DGRAM, 0) {
++$got_socket;
AnyEvent::Util::fh_nonblocking $fh4, 1;
$self->{fh4} = $fh4;
$self->{rw4} = AnyEvent->io (fh => $fh4, poll => "r", cb => sub {
if (my $peer = recv $fh4, my $pkt, MAX_PKT, 0) {
$wself->_recv ($pkt, $peer);
}
});
}
if (AF_INET6 && socket my $fh6, AF_INET6, &Socket::SOCK_DGRAM, 0) {
++$got_socket;
$self->{fh6} = $fh6;
AnyEvent::Util::fh_nonblocking $fh6, 1;
$self->{rw6} = AnyEvent->io (fh => $fh6, poll => "r", cb => sub {
if (my $peer = recv $fh6, my $pkt, MAX_PKT, 0) {
$wself->_recv ($pkt, $peer);
}
});
}
$got_socket
or Carp::croak "unable to create either an IPv4 or an IPv6 socket";
$self->_compile;
$self
}
=item $resolver->parse_resolv_conv ($string)
Parses the given string as if it were a F<resolv.conf> file. The following
directives are supported (but not necessarily implemented).
C<#>-style comments, C<nameserver>, C<domain>, C<search>, C<sortlist>,
C<options> (C<timeout>, C<attempts>, C<ndots>).
Everything else is silently ignored.
=cut
sub parse_resolv_conf {
my ($self, $resolvconf) = @_;
$self->{server} = [];
$self->{search} = [];
my $attempts;
for (split /\n/, $resolvconf) {
if (/^\s*#/) {
# comment
} elsif (/^\s*nameserver\s+(\S+)\s*$/i) {
my $ip = $1;
if (my $ipn = AnyEvent::Socket::parse_address ($ip)) {
push @{ $self->{server} }, $ipn;
} else {
warn "nameserver $ip invalid and ignored\n";
}
} elsif (/^\s*domain\s+(\S*)\s+$/i) {
$self->{search} = [$1];
} elsif (/^\s*search\s+(.*?)\s*$/i) {
$self->{search} = [split /\s+/, $1];
} elsif (/^\s*sortlist\s+(.*?)\s*$/i) {
=8= |