# Copyright (c) 2006 NAKAMURA Minoru. This code is free soft.
# Arranged by CGI-RESCUE 2006/6

sub check_country {

# 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(<FILE>){
    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);


    local ($line) = @_ ;
    ($ip1, $ip2, $ip3, $ip4) = split(/\./,$line,4);
    local $ip = ($ip1<<24) + ($ip2<<16) + ($ip3<<8) + $ip4;
    
    if( $ip > 0 ){
	$value = $ClassA_map{ $ip1 };
	if( $value ){
	    # print "$value\t$line";
	    return "$value";
	}

	$value = $ClassB_map{ ($ip1<<8) + $ip2 };
	if( $value ){
	    # print "$value\t$line";
	    return "$value";
	}

	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";
		return "$cctld_tab[$i]";
	    }
	}
	return "unknown\t$line";
    }
}

1;
