/usr/local/CPAN/Net-SenderBase/Net/SenderBase/Query/DNS.pm
# $Id: DNS.pm,v 1.3 2003/07/03 15:11:04 matt Exp $
package Net::SenderBase::Query::DNS;
use strict;
use vars qw($HOST);
$HOST = 'test.senderbase.org';
use Net::DNS;
use IO::Select;
use Net::SenderBase::Results;
sub new {
my $class = shift;
my %attrs = @_;
$attrs{Address} || die "No address";
$attrs{Host} ||= $HOST;
$attrs{Timeout} || die "No timeout";
my $self = bless { %attrs }, $class;
my $res = Net::DNS::Resolver->new();
my $sel = IO::Select->new();
my $reversed_ip = join('.', reverse(split(/\./,$attrs{Address})));
my $mask = $attrs{Mask} ? ".$attrs{Mask}" : '';
$sel->add($res->bgsend("$reversed_ip$mask.$attrs{Host}", "TXT"));
$self->{_sel} = $sel;
return $self;
}
sub results {
my $self = shift;
my $res = Net::DNS::Resolver->new();
my $sel = $self->{_sel};
my @ready = $sel->can_read($self->{Timeout});
@ready || die "Timeout occurred getting results";
my @lines;
for my $socket (@ready) {
my $query = $res->bgread($socket);
$sel->remove($socket);
undef($socket);
if (!$query) {
die $res->errorstring;
}
foreach my $rr ($query->answer) {
next unless $rr->type eq 'TXT';
my $line = $rr->txtdata;
if ($line =~ s/^(\d+)-//) {
my $id = $1;
$lines[$id] = $line;
}
else {
die "Unable to parse TXT record: $line";
}
}
}
@lines || die "No results came back for $self->{Address}";
return Net::SenderBase::Results->cons($self->{Address}, join('', @lines));
}
1;