Blame demo/mresolv

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
}