ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Coro/myhttpd/netgeo.pl
(Generate patch)

Comparing Coro/myhttpd/netgeo.pl (file contents):
Revision 1.4 by root, Tue Aug 28 02:30:49 2001 UTC vs.
Revision 1.7 by root, Sat Sep 15 13:58:27 2001 UTC

6use Fcntl; 6use Fcntl;
7 7
8use Coro; 8use Coro;
9use Coro::Event; 9use Coro::Event;
10use Coro::Semaphore; 10use Coro::Semaphore;
11use Coro::SemaphoreSet;
11use Coro::Socket; 12use Coro::Socket;
13
14use 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
204package netgeo; 207package netgeo;
205 208
206use BerkeleyDB;
207use Socket; 209use Socket;
208 210
209sub ip2int($) { 211sub ip2int($) {
210 unpack "N", inet_aton $_[0]; 212 unpack "N", inet_aton $_[0];
211} 213}
218 220
219$WHOIS{ARIN} = new Whois::ARIN ARIN => "whois.arin.net", maxjobs => 12; 221$WHOIS{ARIN} = new Whois::ARIN ARIN => "whois.arin.net", maxjobs => 12;
220$WHOIS{RIPE} = new Whois::RIPE RIPE => "whois.ripe.net", maxjobs => 20; 222$WHOIS{RIPE} = new Whois::RIPE RIPE => "whois.ripe.net", maxjobs => 20;
221$WHOIS{APNIC} = new Whois::RIPE APNIC => "whois.apnic.net", maxjobs => 20; 223$WHOIS{APNIC} = new Whois::RIPE APNIC => "whois.apnic.net", maxjobs => 20;
222 224
225$whoislock = new Coro::SemaphoreSet;
226
223sub ip_request { 227sub ip_request {
224 my $ip = $_[0]; 228 my $ip = $_[0];
229
230 my $guard = $whoislock->guard($ip);
225 231
226 my $c = $iprange->db_cursor; 232 my $c = $iprange->db_cursor;
227 my $v; 233 my $v;
228 234
229 if (!$c->c_get((inet_aton $ip), $v, DB_SET_RANGE)) { 235 if (!$c->c_get((inet_aton $ip), $v, DB_SET_RANGE)) {
230 my ($ip0, $ip1, $whois) = split /\x0/, $v; 236 my ($ip0, $ip1, $whois) = split /\x0/, $v;
231 my $_ip = ip2int $ip; 237 my $_ip = ip2int $ip;
232 print "looked for $_ip, found $ip0, $ip1 ", length($v),"\n";
233 if ($ip0 <= $_ip && $_ip <= $ip1) { 238 if ($ip0 <= $_ip && $_ip <= $ip1) {
234 return $whois; 239 return $whois;
235 } 240 }
236 } 241 }
237 242
238 print "looked for $ip, ONLY found $v->[0], $v->[1]\n";
239
240 my ($arin, $ripe, $apnic); 243 my ($arin, $ripe, $apnic);
241 244
242 $whois = $WHOIS{APNIC}->ip_request($ip) 245 $whois = $WHOIS{APNIC}->ip_request($ip)
243 || $WHOIS{RIPE} ->ip_request($ip) 246 || $WHOIS{RIPE} ->ip_request($ip)
244 || $WHOIS{ARIN} ->ip_request($ip); 247 || $WHOIS{ARIN} ->ip_request($ip);
256 $_ip = $_ip & 0xffffff00; 259 $_ip = $_ip & 0xffffff00;
257 $_ip0 = $_ip if $_ip0 < $_ip; 260 $_ip0 = $_ip if $_ip0 < $_ip;
258 $_ip1 = $_ip + 255 if $_ip1 > $_ip + 255; 261 $_ip1 = $_ip + 255 if $_ip1 > $_ip + 255;
259 } 262 }
260 263
261 print "setting entry ($_ip0, $_ip, $_ip1)\n";
262 $iprange->db_put((pack "N", $_ip1), (join "\x0", $_ip0, $_ip1, $whois)); 264 $iprange->db_put((pack "N", $_ip1), (join "\x0", $_ip0, $_ip1, $whois));
263 (tied %whois)->db_sync; 265 (tied %whois)->db_sync;
264 $iprange->db_sync; 266 $iprange->db_sync;
265 267
266 $whois; 268 $whois;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines