1 package Xchat::XPI::Net;
8 use lib get_info 'xchatdir';
9 use Xchat::XPI::Utils qw<called_from_script>;
15 our $VERSION = '0.03';
20 $res = Net::DNS::Resolver->new;
23 $res->tcp_timeout($timeout);
24 $res->udp_timeout($timeout);
27 $res->nameservers( [ split ' ', $nameservers ] ) if $nameservers;
31 my ($host, $callback, $args) = @_;
32 return unless $host and $callback;
34 my $sock = $res->bgsend($host);
38 return called_from_script {
39 Xchat::hook_fd($sock, \&_dns_recv, {
41 data => [ $callback, $args ],
48 my ($callback, $args) = @{$_[2]};
50 my $p = $res->bgread($fh);
55 $callback->($p, $args);
62 default => 'whois.internic.net',
63 arpa => 'whois.arin.net',
64 # mil => 'whois.nic.mil',
66 ipv4 => { default => 'whois.ripe.net' },
67 ipv6 => { default => 'whois.6bone.net' },
70 my $ipv4_rx = qr/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/;
71 my $ipv6_rx = qr/[0-9:]+/;
74 my ($host, $callback, $args) = @_;
75 return unless $host and $callback;
78 if ($host =~ /^\s*($ipv4_rx)(?:\/[0-9]{1,2})?[\s\.]*$/o) {
80 $server = $whois_servers{ipv4}{default};
81 } elsif ($host =~ /^\s*($ipv6_rx)(?:\/[0-9]{1,2})?[\s\.]*$/o) {
83 $server = $whois_servers{ipv6}{default};
84 } elsif ($host =~ /([^\.]+)\.+([a-z]+)[\.\s]*$/) {
85 $host = $1 . '.' . $2;
86 $server = $whois_servers{domain}{$2};
87 $server = $whois_servers{domain}{default} unless $server;
89 return unless $server;
93 # resolve($server, \&_whois_send, [ \$hook, $host, $callback, $args ] );
99 # my @a = grep { $_->type eq 'A' && $_->address } $p->answer;
101 # my ($hookref, $host, $callback, $args) = @{$_[1]};
102 # my $server = $a[rand(@a)]->address;
104 my $sock = IO::Socket::INET->new(
112 print $sock "$host\x0D\x0A";
113 $sock->shutdown(1); # stop writing
115 return called_from_script {
116 Xchat::hook_fd($sock, \&_whois_recv, {
118 data => [ $callback, $args ],
125 my ($callback, $args) = @{$_[2]};
127 my $raw = do { local $/; <$fh>; };
132 $callback->($raw, $args);
137 use base qw<Exporter>;
140 our %EXPORT_TAGS = ('funcs' => [ qw<resolve whois> ]);
141 our @EXPORT_OK = map { @$_ } values %EXPORT_TAGS;
142 $EXPORT_TAGS{'all'} = [ @EXPORT_OK ];