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) = @_[0, 1];
29 return unless $host && $callback;
31 my $sock = $res->bgsend($host);
34 my $hook = Xchat::hook_fd($sock, \&_dns_recv, { flags => FD_READ, data => [ $callback, $args ] } );
40 my ($callback, $args) = @{$_[2]};
41 my $p = $res->bgread($fd);
45 &$callback($p, $args);
51 default => 'whois.internic.net',
52 arpa => 'whois.arin.net',
53 # mil => 'whois.nic.mil',
55 ipv4 => { default => 'whois.ripe.net' },
56 ipv6 => { default => 'whois.6bone.net' }
60 my ($host, $callback) = @_[0, 1];
61 return unless $host && $callback;
64 if ($host =~ /^\s*\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(\/\d{1,2})?$/) {
65 $server = $whois_servers{ipv4}{default};
66 } elsif ($host =~ /^\s*[\d:]*(\/\d{1,2})?\s*$/) {
67 $server = $whois_servers{ipv6}{default};
68 } elsif ($host =~ /([^\.]+)\.+([a-z]+)\.*$/) {
70 $server = $whois_servers{domain}{$2};
71 $server = $whois_servers{domain}{default} if !$server;
73 return unless $server;
76 # resolve($server, \&_whois_send, [ \$hook, $host, $callback, $args ] );
82 # my @a = grep { $_->type eq 'A' && $_->address } $p->answer;
84 # my ($hookref, $host, $callback, $args) = @{$_[1]};
85 # my $server = $a[rand(@a)]->address;
87 my $sock = IO::Socket::INET->new(
93 print $sock "$host\x0D\x0A";
94 $sock->shutdown(1); # stop writing
95 $hook = Xchat::hook_fd($sock, \&_whois_recv, { flags => FD_READ, data => [ $callback, $args ] } );
101 my ($callback, $args) = @{$_[2]};
102 my $raw = do { local $/; <$fd>; };
106 &$callback($raw, $args);
110 use base qw<Exporter>;
113 our %EXPORT_TAGS = ('funcs' => [ qw<resolve whois> ]);
114 our @EXPORT_OK = map { @$_ } values %EXPORT_TAGS;
115 $EXPORT_TAGS{'all'} = [ @EXPORT_OK ];