1 package Xchat::XPI::Net;
12 our $VERSION = '0.03';
17 $res = Net::DNS::Resolver->new;
20 $res->tcp_timeout($timeout);
21 $res->udp_timeout($timeout);
24 $res->nameservers( [ split ' ', $nameservers ] ) if $nameservers;
28 my ($host, $callback, $args) = @_;
29 return unless $host and $callback;
31 my $sock = $res->bgsend($host);
35 return Xchat::hook_fd($sock, \&_dns_recv, {
37 data => [ $callback, $args ],
43 my ($callback, $args) = @{$_[2]};
45 my $p = $res->bgread($fh);
50 $callback->($p, $args);
57 default => 'whois.internic.net',
58 arpa => 'whois.arin.net',
59 # mil => 'whois.nic.mil',
61 ipv4 => { default => 'whois.ripe.net' },
62 ipv6 => { default => 'whois.6bone.net' },
66 my ($host, $callback, $args) = @_;
67 return unless $host and $callback;
70 if ($host =~ /^\s*\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(\/\d{1,2})?$/) {
71 $server = $whois_servers{ipv4}{default};
72 } elsif ($host =~ /^\s*[\d:]*(\/\d{1,2})?\s*$/) {
73 $server = $whois_servers{ipv6}{default};
74 } elsif ($host =~ /([^\.]+)\.+([a-z]+)\.*$/) {
75 $host = $1 . '.' . $2;
76 $server = $whois_servers{domain}{$2};
77 $server = $whois_servers{domain}{default} unless $server;
79 return unless $server;
83 # resolve($server, \&_whois_send, [ \$hook, $host, $callback, $args ] );
89 # my @a = grep { $_->type eq 'A' && $_->address } $p->answer;
91 # my ($hookref, $host, $callback, $args) = @{$_[1]};
92 # my $server = $a[rand(@a)]->address;
94 my $sock = IO::Socket::INET->new(
102 print $sock "$host\x0D\x0A";
103 $sock->shutdown(1); # stop writing
105 return Xchat::hook_fd($sock, \&_whois_recv, {
107 data => [ $callback, $args ],
113 my ($callback, $args) = @{$_[2]};
115 my $raw = do { local $/; <$fh>; };
120 $callback->($raw, $args);
125 use base qw<Exporter>;
128 our %EXPORT_TAGS = ('funcs' => [ qw<resolve whois> ]);
129 our @EXPORT_OK = map { @$_ } values %EXPORT_TAGS;
130 $EXPORT_TAGS{'all'} = [ @EXPORT_OK ];