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' },
65 my $ipv4_rx = qr/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/;
66 my $ipv6_rx = qr/[0-9:]+/;
69 my ($host, $callback, $args) = @_;
70 return unless $host and $callback;
73 if ($host =~ /^\s*($ipv4_rx)(?:\/[0-9]{1,2})?[\s\.]*$/o) {
75 $server = $whois_servers{ipv4}{default};
76 } elsif ($host =~ /^\s*($ipv6_rx)(?:\/[0-9]{1,2})?[\s\.]*$/o) {
78 $server = $whois_servers{ipv6}{default};
79 } elsif ($host =~ /([^\.]+)\.+([a-z]+)[\.\s]*$/) {
80 $host = $1 . '.' . $2;
81 $server = $whois_servers{domain}{$2};
82 $server = $whois_servers{domain}{default} unless $server;
84 return unless $server;
88 # resolve($server, \&_whois_send, [ \$hook, $host, $callback, $args ] );
94 # my @a = grep { $_->type eq 'A' && $_->address } $p->answer;
96 # my ($hookref, $host, $callback, $args) = @{$_[1]};
97 # my $server = $a[rand(@a)]->address;
99 my $sock = IO::Socket::INET->new(
107 print $sock "$host\x0D\x0A";
108 $sock->shutdown(1); # stop writing
110 return Xchat::hook_fd($sock, \&_whois_recv, {
112 data => [ $callback, $args ],
118 my ($callback, $args) = @{$_[2]};
120 my $raw = do { local $/; <$fh>; };
125 $callback->($raw, $args);
130 use base qw<Exporter>;
133 our %EXPORT_TAGS = ('funcs' => [ qw<resolve whois> ]);
134 our @EXPORT_OK = map { @$_ } values %EXPORT_TAGS;
135 $EXPORT_TAGS{'all'} = [ @EXPORT_OK ];