|
Packit Service |
ab31fe |
#!/usr/bin/perl -w
|
|
Packit Service |
f6e53a |
# $Id: mresolv 264 2005-04-06 09:16:15Z olaf $
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
=head1 NAME
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
mresolv - Perform multiple DNS lookups in parallel
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
=head1 SYNOPSIS
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
B<mresolv> S<[ B<-d> ]> S<[ B<-n> I<number> ]> S<[ B<-t> I<timeout> ]>
|
|
Packit Service |
f6e53a |
S<[ I<filename>... ]>
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
=head1 DESCRIPTION
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
B<mresolv> performs multiple DNS lookups in parallel. Names to query
|
|
Packit Service |
f6e53a |
are read from the list of files given on the command line, or from the
|
|
Packit Service |
f6e53a |
standard input.
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
=head1 OPTIONS
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
=over 4
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
=item B<-d>
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
Turn on debugging output.
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
=item B<-n> I<number>
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
Set the number of queries to have outstanding at any time.
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
=item B<-t> I<timeout>
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
Set the timeout in seconds. If no replies are received for this
|
|
Packit Service |
f6e53a |
amount of time, all outstanding queries will be flushed and new
|
|
Packit Service |
f6e53a |
names will be read from the input stream.
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
=back
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
=head1 COPYRIGHT
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
Copyright (c) 1997-2000 Michael Fuhr. All rights reserved. This
|
|
Packit Service |
f6e53a |
program is free software; you can redistribute it and/or modify it
|
|
Packit Service |
f6e53a |
under the same terms as Perl itself.
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
=head1 SEE ALSO
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
L<perl(1)>, L<axfr>, L<check_soa>, L<check_zone>, L<mx>, L<perldig>,
|
|
Packit Service |
f6e53a |
L<Net::DNS>
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
=cut
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
use Net::DNS;
|
|
Packit Service |
f6e53a |
use IO::Select;
|
|
Packit Service |
f6e53a |
use Getopt::Std;
|
|
Packit Service |
f6e53a |
use strict;
|
|
Packit Service |
f6e53a |
use vars qw($opt_d $opt_n $opt_t);
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
$| = 1;
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
$opt_n = 32; # number of requests to have outstanding at any time
|
|
Packit Service |
f6e53a |
$opt_t = 15; # timeout (seconds)
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
getopts("dn:t:");
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
my $res = Net::DNS::Resolver->new;
|
|
Packit Service |
f6e53a |
my $sel = IO::Select->new;
|
|
Packit Service |
f6e53a |
my $eof = 0;
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
while (1) {
|
|
Packit Service |
f6e53a |
my $name;
|
|
Packit Service |
f6e53a |
my $sock;
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
#----------------------------------------------------------------------
|
|
Packit Service |
f6e53a |
# Read names until we've filled our quota of outstanding requests.
|
|
Packit Service |
f6e53a |
#----------------------------------------------------------------------
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
while (!$eof && $sel->count < $opt_n) {
|
|
Packit Service |
f6e53a |
print "DEBUG: reading..." if defined $opt_d;
|
|
Packit Service |
f6e53a |
$name = <>;
|
|
Packit Service |
f6e53a |
unless ($name) {
|
|
Packit Service |
f6e53a |
print "EOF.\n" if defined $opt_d;
|
|
Packit Service |
f6e53a |
$eof = 1;
|
|
Packit Service |
f6e53a |
last;
|
|
Packit Service |
f6e53a |
}
|
|
Packit Service |
f6e53a |
chomp $name;
|
|
Packit Service |
f6e53a |
$sock = $res->bgsend($name);
|
|
Packit Service |
f6e53a |
$sel->add($sock);
|
|
Packit Service |
f6e53a |
print "name = $name, outstanding = ", $sel->count, "\n"
|
|
Packit Service |
f6e53a |
if defined $opt_d;
|
|
Packit Service |
f6e53a |
}
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
#----------------------------------------------------------------------
|
|
Packit Service |
f6e53a |
# Wait for any replies. Remove any replies from the outstanding pool.
|
|
Packit Service |
f6e53a |
#----------------------------------------------------------------------
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
my @ready;
|
|
Packit Service |
f6e53a |
my $timed_out = 1;
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
print "DEBUG: waiting for replies\n" if defined $opt_d;
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
for (@ready = $sel->can_read($opt_t);
|
|
Packit Service |
f6e53a |
@ready;
|
|
Packit Service |
f6e53a |
@ready = $sel->can_read(0)) {
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
$timed_out = 0;
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
print "DEBUG: replies received: ", scalar @ready, "\n"
|
|
Packit Service |
f6e53a |
if defined $opt_d;
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
foreach $sock (@ready) {
|
|
Packit Service |
f6e53a |
print "DEBUG: handling a reply\n" if defined $opt_d;
|
|
Packit Service |
f6e53a |
$sel->remove($sock);
|
|
Packit Service |
f6e53a |
my $ans = $res->bgread($sock);
|
|
Packit Service |
f6e53a |
next unless $ans;
|
|
Packit Service |
f6e53a |
my $rr;
|
|
Packit Service |
f6e53a |
foreach $rr ($ans->answer) {
|
|
Packit Service |
f6e53a |
$rr->print;
|
|
Packit Service |
f6e53a |
}
|
|
Packit Service |
f6e53a |
}
|
|
Packit Service |
f6e53a |
}
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
#----------------------------------------------------------------------
|
|
Packit Service |
f6e53a |
# If we timed out waiting for replies, remove all entries from the
|
|
Packit Service |
f6e53a |
# outstanding pool.
|
|
Packit Service |
f6e53a |
#----------------------------------------------------------------------
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
if ($timed_out) {
|
|
Packit Service |
f6e53a |
print "DEBUG: timeout: clearing the outstanding pool.\n"
|
|
Packit Service |
f6e53a |
if defined $opt_d;
|
|
Packit Service |
f6e53a |
my $sock;
|
|
Packit Service |
f6e53a |
foreach $sock ($sel->handles) {
|
|
Packit Service |
f6e53a |
$sel->remove($sock);
|
|
Packit Service |
f6e53a |
}
|
|
Packit Service |
f6e53a |
}
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
print "DEBUG: outstanding = ", $sel->count, ", eof = $eof\n"
|
|
Packit Service |
f6e53a |
if defined $opt_d;
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
#----------------------------------------------------------------------
|
|
Packit Service |
f6e53a |
# We're done if there are no outstanding queries and we've read EOF.
|
|
Packit Service |
f6e53a |
#----------------------------------------------------------------------
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
last if ($sel->count == 0) && $eof;
|
|
Packit Service |
f6e53a |
}
|