#! /usr/bin/perl # Copyright (c) 2006 NAKAMURA Minoru. This code is free soft. # ipaddr_to_cctld.txt のパスを指定 $counter_data='ipaddr_to_cctld.txt'; ######################################################################## %ClassA_map =(); %ClassB_map =(); @ip_start_tab = (); @ip_end_tab = (); @cctld_tab = (); $index = 1; # Load IP list. open(FILE, "<$counter_data" ); while(){ local ($code, $ip_start_str, $ip_end_str, $ip_start, $ip_end ); ($ip_start_str, $ip_end_str, $code) = /^(\S+)\s+(\S+)\s+(\S+)/; ($ip1, $ip2, $ip3, $ip4) = ($ip_start_str =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)/); $ip_start = ($ip1<<24) + ($ip2<<16) + ($ip3<<8) + $ip4; ($ip5, $ip6, $ip7, $ip8) = ($ip_end_str =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)/); $ip_end = ($ip5<<24) + ($ip6<<16) + ($ip7<<8) + $ip8; if( $ip_start > 0 && $ip_end > 0 ){ if( ($ip2|$ip3|$ip4) == 0 && ($ip6 & $ip7 & $ip8) == 255) { for($i=$ip1 ; $i<=$ip5 ; $i++){ $ClassA_map{ $i } = $code ; } } elsif( ($ip3|$ip4) == 0 && ($ip7 & $ip8) == 255) { for($i=(($ip1<<8)+$ip2) ; $i<=(($ip5<<8)+$ip6) ; $i++){ $ClassB_map{ $i } = $code ; } } else { $ip_start_tab[ $index ] = $ip_start ; $ip_end_tab[ $index ] = $ip_end ; $cctld_tab[ $index ] = $code ; $index++; } } } close(FILE); main_loop: while(<>){ local $line = $_ ; local ($ip1, $ip2, $ip3, $ip4) = /^(\d+)\.(\d+)\.(\d+)\.(\d+)/; local $ip = ($ip1<<24) + ($ip2<<16) + ($ip3<<8) + $ip4; if( $ip > 0 ){ $value = $ClassA_map{ $ip1 }; if( $value ){ # print "$value\t$line"; print "$value\n"; next main_loop; } $value = $ClassB_map{ ($ip1<<8) + $ip2 }; if( $value ){ # print "$value\t$line"; print "$value\n"; next main_loop; } for( $i = 1 ; $i < $index ; $i++ ){ if( $ip < $ip_start_tab[$i] ){ last; } if( $ip <= $ip_end_tab[$i] ){ # print "$cctld_tab[$i]\t$line"; print "$cctld_tab[$i]\n"; next main_loop; } } print "unknown\t$line"; } }