… | |
… | |
6 | use Fcntl; |
6 | use Fcntl; |
7 | |
7 | |
8 | use Coro; |
8 | use Coro; |
9 | use Coro::Event; |
9 | use Coro::Event; |
10 | use Coro::Semaphore; |
10 | use Coro::Semaphore; |
|
|
11 | use Coro::SemaphoreSet; |
11 | use Coro::Socket; |
12 | use Coro::Socket; |
|
|
13 | |
|
|
14 | use BerkeleyDB; |
12 | |
15 | |
13 | $Event::DIED = sub { |
16 | $Event::DIED = sub { |
14 | Event::verbose_exception_handler(@_); |
17 | Event::verbose_exception_handler(@_); |
15 | #Event::unloop_all(); |
18 | #Event::unloop_all(); |
16 | }; |
19 | }; |
… | |
… | |
201 | $whois; |
204 | $whois; |
202 | } |
205 | } |
203 | |
206 | |
204 | package netgeo; |
207 | package netgeo; |
205 | |
208 | |
|
|
209 | use Socket; |
206 | use BerkeleyDB; |
210 | use BerkeleyDB; |
207 | use Socket; |
|
|
208 | |
211 | |
209 | sub ip2int($) { |
212 | sub ip2int($) { |
210 | unpack "N", inet_aton $_[0]; |
213 | unpack "N", inet_aton $_[0]; |
211 | } |
214 | } |
212 | |
215 | |
… | |
… | |
218 | |
221 | |
219 | $WHOIS{ARIN} = new Whois::ARIN ARIN => "whois.arin.net", maxjobs => 12; |
222 | $WHOIS{ARIN} = new Whois::ARIN ARIN => "whois.arin.net", maxjobs => 12; |
220 | $WHOIS{RIPE} = new Whois::RIPE RIPE => "whois.ripe.net", maxjobs => 20; |
223 | $WHOIS{RIPE} = new Whois::RIPE RIPE => "whois.ripe.net", maxjobs => 20; |
221 | $WHOIS{APNIC} = new Whois::RIPE APNIC => "whois.apnic.net", maxjobs => 20; |
224 | $WHOIS{APNIC} = new Whois::RIPE APNIC => "whois.apnic.net", maxjobs => 20; |
222 | |
225 | |
|
|
226 | $whoislock = new Coro::SemaphoreSet; |
|
|
227 | |
223 | sub ip_request { |
228 | sub ip_request { |
224 | my $ip = $_[0]; |
229 | my $ip = $_[0]; |
|
|
230 | |
|
|
231 | my $guard = $whoislock->guard($ip); |
225 | |
232 | |
226 | my $c = $iprange->db_cursor; |
233 | my $c = $iprange->db_cursor; |
227 | my $v; |
234 | my $v; |
228 | |
235 | |
229 | if (!$c->c_get((inet_aton $ip), $v, DB_SET_RANGE)) { |
236 | if (!$c->c_get((inet_aton $ip), $v, DB_SET_RANGE)) { |