summaryrefslogtreecommitdiff
path: root/geoip.inc
diff options
context:
space:
mode:
authorJano Slota <jano@alokal.eu>2014-02-18 18:31:09 +0100
committerczaks <marcin@6irc.net>2014-02-18 23:50:01 +0100
commit9dad842c2471602dbcfad0de0291bfd54d39f852 (patch)
treedf8b26f9d5288c96d6c1d3dadadb47cffb0fb8d7 /geoip.inc
parentada45312a4b1ddc4f975dcd9c1d272a73a701ffd (diff)
Moved the external geoip files to inc/lib/geoip and made the geoip code a bit prettier
Diffstat (limited to 'geoip.inc')
-rw-r--r--geoip.inc720
1 files changed, 0 insertions, 720 deletions
diff --git a/geoip.inc b/geoip.inc
deleted file mode 100644
index 99eb244e..00000000
--- a/geoip.inc
+++ /dev/null
@@ -1,720 +0,0 @@
-<?php
-
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */
-/* geoip.inc
- *
- * Copyright (C) 2007 MaxMind LLC
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-define("GEOIP_COUNTRY_BEGIN", 16776960);
-define("GEOIP_STATE_BEGIN_REV0", 16700000);
-define("GEOIP_STATE_BEGIN_REV1", 16000000);
-define("GEOIP_STANDARD", 0);
-define("GEOIP_MEMORY_CACHE", 1);
-define("GEOIP_SHARED_MEMORY", 2);
-define("STRUCTURE_INFO_MAX_SIZE", 20);
-define("DATABASE_INFO_MAX_SIZE", 100);
-define("GEOIP_COUNTRY_EDITION", 1);
-define("GEOIP_PROXY_EDITION", 8);
-define("GEOIP_ASNUM_EDITION", 9);
-define("GEOIP_NETSPEED_EDITION", 10);
-define("GEOIP_REGION_EDITION_REV0", 7);
-define("GEOIP_REGION_EDITION_REV1", 3);
-define("GEOIP_CITY_EDITION_REV0", 6);
-define("GEOIP_CITY_EDITION_REV1", 2);
-define("GEOIP_ORG_EDITION", 5);
-define("GEOIP_ISP_EDITION", 4);
-define("SEGMENT_RECORD_LENGTH", 3);
-define("STANDARD_RECORD_LENGTH", 3);
-define("ORG_RECORD_LENGTH", 4);
-define("MAX_RECORD_LENGTH", 4);
-define("MAX_ORG_RECORD_LENGTH", 300);
-define("GEOIP_SHM_KEY", 0x4f415401);
-define("US_OFFSET", 1);
-define("CANADA_OFFSET", 677);
-define("WORLD_OFFSET", 1353);
-define("FIPS_RANGE", 360);
-define("GEOIP_UNKNOWN_SPEED", 0);
-define("GEOIP_DIALUP_SPEED", 1);
-define("GEOIP_CABLEDSL_SPEED", 2);
-define("GEOIP_CORPORATE_SPEED", 3);
-define("GEOIP_DOMAIN_EDITION", 11);
-define("GEOIP_COUNTRY_EDITION_V6", 12);
-define("GEOIP_LOCATIONA_EDITION", 13);
-define("GEOIP_ACCURACYRADIUS_EDITION", 14);
-define("GEOIP_CITYCOMBINED_EDITION", 15);
-define("GEOIP_CITY_EDITION_REV1_V6", 30);
-define("GEOIP_CITY_EDITION_REV0_V6",31);
-define("GEOIP_NETSPEED_EDITION_REV1",32);
-define("GEOIP_NETSPEED_EDITION_REV1_V6",33);
-define("GEOIP_USERTYPE_EDITION",28);
-define("GEOIP_USERTYPE_EDITION_V6",29);
-define("GEOIP_ASNUM_EDITION_V6",21);
-define("GEOIP_ISP_EDITION_V6",22);
-define("GEOIP_ORG_EDITION_V6",23);
-define("GEOIP_DOMAIN_EDITION_V6",24);
-
-define("CITYCOMBINED_FIXED_RECORD", 7 );
-
-class GeoIP {
- var $flags;
- var $filehandle;
- var $memory_buffer;
- var $databaseType;
- var $databaseSegments;
- var $record_length;
- var $shmid;
- var $GEOIP_COUNTRY_CODE_TO_NUMBER = array(
- "" => 0, "AP" => 1, "EU" => 2, "AD" => 3, "AE" => 4, "AF" => 5,
- "AG" => 6, "AI" => 7, "AL" => 8, "AM" => 9, "CW" => 10, "AO" => 11,
- "AQ" => 12, "AR" => 13, "AS" => 14, "AT" => 15, "AU" => 16, "AW" => 17,
- "AZ" => 18, "BA" => 19, "BB" => 20, "BD" => 21, "BE" => 22, "BF" => 23,
- "BG" => 24, "BH" => 25, "BI" => 26, "BJ" => 27, "BM" => 28, "BN" => 29,
- "BO" => 30, "BR" => 31, "BS" => 32, "BT" => 33, "BV" => 34, "BW" => 35,
- "BY" => 36, "BZ" => 37, "CA" => 38, "CC" => 39, "CD" => 40, "CF" => 41,
- "CG" => 42, "CH" => 43, "CI" => 44, "CK" => 45, "CL" => 46, "CM" => 47,
- "CN" => 48, "CO" => 49, "CR" => 50, "CU" => 51, "CV" => 52, "CX" => 53,
- "CY" => 54, "CZ" => 55, "DE" => 56, "DJ" => 57, "DK" => 58, "DM" => 59,
- "DO" => 60, "DZ" => 61, "EC" => 62, "EE" => 63, "EG" => 64, "EH" => 65,
- "ER" => 66, "ES" => 67, "ET" => 68, "FI" => 69, "FJ" => 70, "FK" => 71,
- "FM" => 72, "FO" => 73, "FR" => 74, "SX" => 75, "GA" => 76, "GB" => 77,
- "GD" => 78, "GE" => 79, "GF" => 80, "GH" => 81, "GI" => 82, "GL" => 83,
- "GM" => 84, "GN" => 85, "GP" => 86, "GQ" => 87, "GR" => 88, "GS" => 89,
- "GT" => 90, "GU" => 91, "GW" => 92, "GY" => 93, "HK" => 94, "HM" => 95,
- "HN" => 96, "HR" => 97, "HT" => 98, "HU" => 99, "ID" => 100, "IE" => 101,
- "IL" => 102, "IN" => 103, "IO" => 104, "IQ" => 105, "IR" => 106, "IS" => 107,
- "IT" => 108, "JM" => 109, "JO" => 110, "JP" => 111, "KE" => 112, "KG" => 113,
- "KH" => 114, "KI" => 115, "KM" => 116, "KN" => 117, "KP" => 118, "KR" => 119,
- "KW" => 120, "KY" => 121, "KZ" => 122, "LA" => 123, "LB" => 124, "LC" => 125,
- "LI" => 126, "LK" => 127, "LR" => 128, "LS" => 129, "LT" => 130, "LU" => 131,
- "LV" => 132, "LY" => 133, "MA" => 134, "MC" => 135, "MD" => 136, "MG" => 137,
- "MH" => 138, "MK" => 139, "ML" => 140, "MM" => 141, "MN" => 142, "MO" => 143,
- "MP" => 144, "MQ" => 145, "MR" => 146, "MS" => 147, "MT" => 148, "MU" => 149,
- "MV" => 150, "MW" => 151, "MX" => 152, "MY" => 153, "MZ" => 154, "NA" => 155,
- "NC" => 156, "NE" => 157, "NF" => 158, "NG" => 159, "NI" => 160, "NL" => 161,
- "NO" => 162, "NP" => 163, "NR" => 164, "NU" => 165, "NZ" => 166, "OM" => 167,
- "PA" => 168, "PE" => 169, "PF" => 170, "PG" => 171, "PH" => 172, "PK" => 173,
- "PL" => 174, "PM" => 175, "PN" => 176, "PR" => 177, "PS" => 178, "PT" => 179,
- "PW" => 180, "PY" => 181, "QA" => 182, "RE" => 183, "RO" => 184, "RU" => 185,
- "RW" => 186, "SA" => 187, "SB" => 188, "SC" => 189, "SD" => 190, "SE" => 191,
- "SG" => 192, "SH" => 193, "SI" => 194, "SJ" => 195, "SK" => 196, "SL" => 197,
- "SM" => 198, "SN" => 199, "SO" => 200, "SR" => 201, "ST" => 202, "SV" => 203,
- "SY" => 204, "SZ" => 205, "TC" => 206, "TD" => 207, "TF" => 208, "TG" => 209,
- "TH" => 210, "TJ" => 211, "TK" => 212, "TM" => 213, "TN" => 214, "TO" => 215,
- "TL" => 216, "TR" => 217, "TT" => 218, "TV" => 219, "TW" => 220, "TZ" => 221,
- "UA" => 222, "UG" => 223, "UM" => 224, "US" => 225, "UY" => 226, "UZ" => 227,
- "VA" => 228, "VC" => 229, "VE" => 230, "VG" => 231, "VI" => 232, "VN" => 233,
- "VU" => 234, "WF" => 235, "WS" => 236, "YE" => 237, "YT" => 238, "RS" => 239,
- "ZA" => 240, "ZM" => 241, "ME" => 242, "ZW" => 243, "A1" => 244, "A2" => 245,
- "O1" => 246, "AX" => 247, "GG" => 248, "IM" => 249, "JE" => 250, "BL" => 251,
- "MF" => 252, "BQ" => 253, "SS" => 254
- );
- var $GEOIP_COUNTRY_CODES = array(
- "","AP","EU","AD","AE","AF","AG","AI","AL","AM","CW",
- "AO","AQ","AR","AS","AT","AU","AW","AZ","BA","BB",
- "BD","BE","BF","BG","BH","BI","BJ","BM","BN","BO",
- "BR","BS","BT","BV","BW","BY","BZ","CA","CC","CD",
- "CF","CG","CH","CI","CK","CL","CM","CN","CO","CR",
- "CU","CV","CX","CY","CZ","DE","DJ","DK","DM","DO",
- "DZ","EC","EE","EG","EH","ER","ES","ET","FI","FJ",
- "FK","FM","FO","FR","SX","GA","GB","GD","GE","GF",
- "GH","GI","GL","GM","GN","GP","GQ","GR","GS","GT",
- "GU","GW","GY","HK","HM","HN","HR","HT","HU","ID",
- "IE","IL","IN","IO","IQ","IR","IS","IT","JM","JO",
- "JP","KE","KG","KH","KI","KM","KN","KP","KR","KW",
- "KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT",
- "LU","LV","LY","MA","MC","MD","MG","MH","MK","ML",
- "MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV",
- "MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI",
- "NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF",
- "PG","PH","PK","PL","PM","PN","PR","PS","PT","PW",
- "PY","QA","RE","RO","RU","RW","SA","SB","SC","SD",
- "SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO",
- "SR","ST","SV","SY","SZ","TC","TD","TF","TG","TH",
- "TJ","TK","TM","TN","TO","TL","TR","TT","TV","TW",
- "TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE",
- "VG","VI","VN","VU","WF","WS","YE","YT","RS","ZA",
- "ZM","ME","ZW","A1","A2","O1","AX","GG","IM","JE",
- "BL","MF", "BQ", "SS", "O1" );
- var $GEOIP_COUNTRY_CODES3 = array(
- "","AP","EU","AND","ARE","AFG","ATG","AIA","ALB","ARM","CUW",
- "AGO","ATA","ARG","ASM","AUT","AUS","ABW","AZE","BIH","BRB",
- "BGD","BEL","BFA","BGR","BHR","BDI","BEN","BMU","BRN","BOL",
- "BRA","BHS","BTN","BVT","BWA","BLR","BLZ","CAN","CCK","COD",
- "CAF","COG","CHE","CIV","COK","CHL","CMR","CHN","COL","CRI",
- "CUB","CPV","CXR","CYP","CZE","DEU","DJI","DNK","DMA","DOM",
- "DZA","ECU","EST","EGY","ESH","ERI","ESP","ETH","FIN","FJI",
- "FLK","FSM","FRO","FRA","SXM","GAB","GBR","GRD","GEO","GUF",
- "GHA","GIB","GRL","GMB","GIN","GLP","GNQ","GRC","SGS","GTM",
- "GUM","GNB","GUY","HKG","HMD","HND","HRV","HTI","HUN","IDN",
- "IRL","ISR","IND","IOT","IRQ","IRN","ISL","ITA","JAM","JOR",
- "JPN","KEN","KGZ","KHM","KIR","COM","KNA","PRK","KOR","KWT",
- "CYM","KAZ","LAO","LBN","LCA","LIE","LKA","LBR","LSO","LTU",
- "LUX","LVA","LBY","MAR","MCO","MDA","MDG","MHL","MKD","MLI",
- "MMR","MNG","MAC","MNP","MTQ","MRT","MSR","MLT","MUS","MDV",
- "MWI","MEX","MYS","MOZ","NAM","NCL","NER","NFK","NGA","NIC",
- "NLD","NOR","NPL","NRU","NIU","NZL","OMN","PAN","PER","PYF",
- "PNG","PHL","PAK","POL","SPM","PCN","PRI","PSE","PRT","PLW",
- "PRY","QAT","REU","ROU","RUS","RWA","SAU","SLB","SYC","SDN",
- "SWE","SGP","SHN","SVN","SJM","SVK","SLE","SMR","SEN","SOM",
- "SUR","STP","SLV","SYR","SWZ","TCA","TCD","ATF","TGO","THA",
- "TJK","TKL","TKM","TUN","TON","TLS","TUR","TTO","TUV","TWN",
- "TZA","UKR","UGA","UMI","USA","URY","UZB","VAT","VCT","VEN",
- "VGB","VIR","VNM","VUT","WLF","WSM","YEM","MYT","SRB","ZAF",
- "ZMB","MNE","ZWE","A1","A2","O1","ALA","GGY","IMN","JEY",
- "BLM","MAF", "BES", "SSD", "O1"
- );
- var $GEOIP_COUNTRY_NAMES = array(
- "","Asia/Pacific Region","Europe","Andorra","United Arab Emirates","Afghanistan","Antigua and Barbuda","Anguilla","Albania","Armenia","Curacao",
- "Angola","Antarctica","Argentina","American Samoa","Austria","Australia","Aruba","Azerbaijan","Bosnia and Herzegovina","Barbados",
- "Bangladesh","Belgium","Burkina Faso","Bulgaria","Bahrain","Burundi","Benin","Bermuda","Brunei Darussalam","Bolivia",
- "Brazil","Bahamas","Bhutan","Bouvet Island","Botswana","Belarus","Belize","Canada","Cocos (Keeling) Islands","Congo, The Democratic Republic of the",
- "Central African Republic","Congo","Switzerland","Cote D'Ivoire","Cook Islands","Chile","Cameroon","China","Colombia","Costa Rica",
- "Cuba","Cape Verde","Christmas Island","Cyprus","Czech Republic","Germany","Djibouti","Denmark","Dominica","Dominican Republic",
- "Algeria","Ecuador","Estonia","Egypt","Western Sahara","Eritrea","Spain","Ethiopia","Finland","Fiji",
- "Falkland Islands (Malvinas)","Micronesia, Federated States of","Faroe Islands","France","Sint Maarten (Dutch part)","Gabon","United Kingdom","Grenada","Georgia","French Guiana",
- "Ghana","Gibraltar","Greenland","Gambia","Guinea","Guadeloupe","Equatorial Guinea","Greece","South Georgia and the South Sandwich Islands","Guatemala",
- "Guam","Guinea-Bissau","Guyana","Hong Kong","Heard Island and McDonald Islands","Honduras","Croatia","Haiti","Hungary","Indonesia",
- "Ireland","Israel","India","British Indian Ocean Territory","Iraq","Iran, Islamic Republic of","Iceland","Italy","Jamaica","Jordan",
- "Japan","Kenya","Kyrgyzstan","Cambodia","Kiribati","Comoros","Saint Kitts and Nevis","Korea, Democratic People's Republic of","Korea, Republic of","Kuwait",
- "Cayman Islands","Kazakhstan","Lao People's Democratic Republic","Lebanon","Saint Lucia","Liechtenstein","Sri Lanka","Liberia","Lesotho","Lithuania",
- "Luxembourg","Latvia","Libya","Morocco","Monaco","Moldova, Republic of","Madagascar","Marshall Islands","Macedonia","Mali",
- "Myanmar","Mongolia","Macau","Northern Mariana Islands","Martinique","Mauritania","Montserrat","Malta","Mauritius","Maldives",
- "Malawi","Mexico","Malaysia","Mozambique","Namibia","New Caledonia","Niger","Norfolk Island","Nigeria","Nicaragua",
- "Netherlands","Norway","Nepal","Nauru","Niue","New Zealand","Oman","Panama","Peru","French Polynesia",
- "Papua New Guinea","Philippines","Pakistan","Poland","Saint Pierre and Miquelon","Pitcairn Islands","Puerto Rico","Palestinian Territory","Portugal","Palau",
- "Paraguay","Qatar","Reunion","Romania","Russian Federation","Rwanda","Saudi Arabia","Solomon Islands","Seychelles","Sudan",
- "Sweden","Singapore","Saint Helena","Slovenia","Svalbard and Jan Mayen","Slovakia","Sierra Leone","San Marino","Senegal","Somalia","Suriname",
- "Sao Tome and Principe","El Salvador","Syrian Arab Republic","Swaziland","Turks and Caicos Islands","Chad","French Southern Territories","Togo","Thailand",
- "Tajikistan","Tokelau","Turkmenistan","Tunisia","Tonga","Timor-Leste","Turkey","Trinidad and Tobago","Tuvalu","Taiwan",
- "Tanzania, United Republic of","Ukraine","Uganda","United States Minor Outlying Islands","United States","Uruguay","Uzbekistan","Holy See (Vatican City State)","Saint Vincent and the Grenadines","Venezuela",
- "Virgin Islands, British","Virgin Islands, U.S.","Vietnam","Vanuatu","Wallis and Futuna","Samoa","Yemen","Mayotte","Serbia","South Africa",
- "Zambia","Montenegro","Zimbabwe","Anonymous Proxy","Satellite Provider","Other","Aland Islands","Guernsey","Isle of Man","Jersey",
- "Saint Barthelemy","Saint Martin", "Bonaire, Saint Eustatius and Saba",
- "South Sudan", "Other"
- );
-
- var $GEOIP_CONTINENT_CODES = array(
- "--", "AS","EU","EU","AS","AS","NA","NA","EU","AS","NA",
- "AF","AN","SA","OC","EU","OC","NA","AS","EU","NA",
- "AS","EU","AF","EU","AS","AF","AF","NA","AS","SA",
- "SA","NA","AS","AN","AF","EU","NA","NA","AS","AF",
- "AF","AF","EU","AF","OC","SA","AF","AS","SA","NA",
- "NA","AF","AS","AS","EU","EU","AF","EU","NA","NA",
- "AF","SA","EU","AF","AF","AF","EU","AF","EU","OC",
- "SA","OC","EU","EU","NA","AF","EU","NA","AS","SA",
- "AF","EU","NA","AF","AF","NA","AF","EU","AN","NA",
- "OC","AF","SA","AS","AN","NA","EU","NA","EU","AS",
- "EU","AS","AS","AS","AS","AS","EU","EU","NA","AS",
- "AS","AF","AS","AS","OC","AF","NA","AS","AS","AS",
- "NA","AS","AS","AS","NA","EU","AS","AF","AF","EU",
- "EU","EU","AF","AF","EU","EU","AF","OC","EU","AF",
- "AS","AS","AS","OC","NA","AF","NA","EU","AF","AS",
- "AF","NA","AS","AF","AF","OC","AF","OC","AF","NA",
- "EU","EU","AS","OC","OC","OC","AS","NA","SA","OC",
- "OC","AS","AS","EU","NA","OC","NA","AS","EU","OC",
- "SA","AS","AF","EU","EU","AF","AS","OC","AF","AF",
- "EU","AS","AF","EU","EU","EU","AF","EU","AF","AF",
- "SA","AF","NA","AS","AF","NA","AF","AN","AF","AS",
- "AS","OC","AS","AF","OC","AS","EU","NA","OC","AS",
- "AF","EU","AF","OC","NA","SA","AS","EU","NA","SA",
- "NA","NA","AS","OC","OC","OC","AS","AF","EU","AF",
- "AF","EU","AF","--","--","--","EU","EU","EU","EU",
- "NA","NA","NA", "AF", "--"
- );
-
-}
-function geoip_load_shared_mem ($file) {
-
- $fp = fopen($file, "rb");
- if (!$fp) {
- print "error opening $file: $php_errormsg\n";
- exit;
- }
- $s_array = fstat($fp);
- $size = $s_array['size'];
- if ($shmid = @shmop_open (GEOIP_SHM_KEY, "w", 0, 0)) {
- shmop_delete ($shmid);
- shmop_close ($shmid);
- }
- $shmid = shmop_open (GEOIP_SHM_KEY, "c", 0644, $size);
- shmop_write ($shmid, fread($fp, $size), 0);
- shmop_close ($shmid);
-}
-
-function _setup_segments($gi){
- $gi->databaseType = GEOIP_COUNTRY_EDITION;
- $gi->record_length = STANDARD_RECORD_LENGTH;
- if ($gi->flags & GEOIP_SHARED_MEMORY) {
- $offset = @shmop_size ($gi->shmid) - 3;
- for ($i = 0; $i < STRUCTURE_INFO_MAX_SIZE; $i++) {
- $delim = @shmop_read ($gi->shmid, $offset, 3);
- $offset += 3;
- if ($delim == (chr(255).chr(255).chr(255))) {
- $gi->databaseType = ord(@shmop_read ($gi->shmid, $offset, 1));
- if ( $gi->databaseType >= 106 ){
- $gi->databaseType -= 105;
- }
- $offset++;
-
- if ($gi->databaseType == GEOIP_REGION_EDITION_REV0){
- $gi->databaseSegments = GEOIP_STATE_BEGIN_REV0;
- } else if ($gi->databaseType == GEOIP_REGION_EDITION_REV1){
- $gi->databaseSegments = GEOIP_STATE_BEGIN_REV1;
- } else if (($gi->databaseType == GEOIP_CITY_EDITION_REV0)||
- ($gi->databaseType == GEOIP_CITY_EDITION_REV1)
- || ($gi->databaseType == GEOIP_ORG_EDITION)
- || ($gi->databaseType == GEOIP_ORG_EDITION_V6)
- || ($gi->databaseType == GEOIP_DOMAIN_EDITION)
- || ($gi->databaseType == GEOIP_DOMAIN_EDITION_V6)
- || ($gi->databaseType == GEOIP_ISP_EDITION)
- || ($gi->databaseType == GEOIP_ISP_EDITION_V6)
- || ($gi->databaseType == GEOIP_USERTYPE_EDITION)
- || ($gi->databaseType == GEOIP_USERTYPE_EDITION_V6)
- || ($gi->databaseType == GEOIP_LOCATIONA_EDITION)
- || ($gi->databaseType == GEOIP_ACCURACYRADIUS_EDITION)
- || ($gi->databaseType == GEOIP_CITY_EDITION_REV0_V6)
- || ($gi->databaseType == GEOIP_CITY_EDITION_REV1_V6)
- || ($gi->databaseType == GEOIP_NETSPEED_EDITION_REV1)
- || ($gi->databaseType == GEOIP_NETSPEED_EDITION_REV1_V6)
- || ($gi->databaseType == GEOIP_ASNUM_EDITION)
- || ($gi->databaseType == GEOIP_ASNUM_EDITION_V6)){
- $gi->databaseSegments = 0;
- $buf = @shmop_read ($gi->shmid, $offset, SEGMENT_RECORD_LENGTH);
- for ($j = 0;$j < SEGMENT_RECORD_LENGTH;$j++){
- $gi->databaseSegments += (ord($buf[$j]) << ($j * 8));
- }
- if (($gi->databaseType == GEOIP_ORG_EDITION)
- || ($gi->databaseType == GEOIP_ORG_EDITION_V6)
- || ($gi->databaseType == GEOIP_DOMAIN_EDITION)
- || ($gi->databaseType == GEOIP_DOMAIN_EDITION_V6)
- || ($gi->databaseType == GEOIP_ISP_EDITION)
- || ($gi->databaseType == GEOIP_ISP_EDITION_V6)) {
- $gi->record_length = ORG_RECORD_LENGTH;
- }
- }
- break;
- } else {
- $offset -= 4;
- }
- }
- if (($gi->databaseType == GEOIP_COUNTRY_EDITION)||
- ($gi->databaseType == GEOIP_COUNTRY_EDITION_V6)||
- ($gi->databaseType == GEOIP_PROXY_EDITION)||
- ($gi->databaseType == GEOIP_NETSPEED_EDITION)){
- $gi->databaseSegments = GEOIP_COUNTRY_BEGIN;
- }
- } else {
- $filepos = ftell($gi->filehandle);
- fseek($gi->filehandle, -3, SEEK_END);
- for ($i = 0; $i < STRUCTURE_INFO_MAX_SIZE; $i++) {
- $delim = fread($gi->filehandle,3);
- if ($delim == (chr(255).chr(255).chr(255))){
- $gi->databaseType = ord(fread($gi->filehandle,1));
- if ( $gi->databaseType >= 106 ){
- $gi->databaseType -= 105;
- }
- if ($gi->databaseType == GEOIP_REGION_EDITION_REV0){
- $gi->databaseSegments = GEOIP_STATE_BEGIN_REV0;
- }
- else if ($gi->databaseType == GEOIP_REGION_EDITION_REV1){
- $gi->databaseSegments = GEOIP_STATE_BEGIN_REV1;
- } else if (($gi->databaseType == GEOIP_CITY_EDITION_REV0)
- || ($gi->databaseType == GEOIP_CITY_EDITION_REV1)
- || ($gi->databaseType == GEOIP_CITY_EDITION_REV0_V6)
- || ($gi->databaseType == GEOIP_CITY_EDITION_REV1_V6)
- || ($gi->databaseType == GEOIP_ORG_EDITION)
- || ($gi->databaseType == GEOIP_DOMAIN_EDITION)
- || ($gi->databaseType == GEOIP_ISP_EDITION)
- || ($gi->databaseType == GEOIP_ORG_EDITION_V6)
- || ($gi->databaseType == GEOIP_DOMAIN_EDITION_V6)
- || ($gi->databaseType == GEOIP_ISP_EDITION_V6)
- || ($gi->databaseType == GEOIP_LOCATIONA_EDITION)
- || ($gi->databaseType == GEOIP_ACCURACYRADIUS_EDITION)
- || ($gi->databaseType == GEOIP_CITY_EDITION_REV0_V6)
- || ($gi->databaseType == GEOIP_CITY_EDITION_REV1_V6)
- || ($gi->databaseType == GEOIP_NETSPEED_EDITION_REV1)
- || ($gi->databaseType == GEOIP_NETSPEED_EDITION_REV1_V6)
- || ($gi->databaseType == GEOIP_USERTYPE_EDITION)
- || ($gi->databaseType == GEOIP_USERTYPE_EDITION_V6)
- || ($gi->databaseType == GEOIP_ASNUM_EDITION)
- || ($gi->databaseType == GEOIP_ASNUM_EDITION_V6)){
- $gi->databaseSegments = 0;
- $buf = fread($gi->filehandle,SEGMENT_RECORD_LENGTH);
- for ($j = 0;$j < SEGMENT_RECORD_LENGTH;$j++){
- $gi->databaseSegments += (ord($buf[$j]) << ($j * 8));
- }
- if ( ( $gi->databaseType == GEOIP_ORG_EDITION )
- || ( $gi->databaseType == GEOIP_DOMAIN_EDITION )
- || ( $gi->databaseType == GEOIP_ISP_EDITION )
- || ( $gi->databaseType == GEOIP_ORG_EDITION_V6 )
- || ( $gi->databaseType == GEOIP_DOMAIN_EDITION_V6 )
- || ( $gi->databaseType == GEOIP_ISP_EDITION_V6 )) {
- $gi->record_length = ORG_RECORD_LENGTH;
- }
- }
- break;
- } else {
- fseek($gi->filehandle, -4, SEEK_CUR);
- }
- }
- if (($gi->databaseType == GEOIP_COUNTRY_EDITION)||
- ($gi->databaseType == GEOIP_COUNTRY_EDITION_V6)||
- ($gi->databaseType == GEOIP_PROXY_EDITION)||
- ($gi->databaseType == GEOIP_NETSPEED_EDITION)){
- $gi->databaseSegments = GEOIP_COUNTRY_BEGIN;
- }
- fseek($gi->filehandle,$filepos,SEEK_SET);
- }
- return $gi;
-}
-
-function geoip_open($filename, $flags) {
- $gi = new GeoIP;
- $gi->flags = $flags;
- if ($gi->flags & GEOIP_SHARED_MEMORY) {
- $gi->shmid = @shmop_open (GEOIP_SHM_KEY, "a", 0, 0);
- } else {
- $gi->filehandle = fopen($filename,"rb") or die( "Can not open $filename\n" );
- if ($gi->flags & GEOIP_MEMORY_CACHE) {
- $s_array = fstat($gi->filehandle);
- $gi->memory_buffer = fread($gi->filehandle, $s_array['size']);
- }
- }
-
- $gi = _setup_segments($gi);
- return $gi;
-}
-
-function geoip_close($gi) {
- if ($gi->flags & GEOIP_SHARED_MEMORY) {
- return true;
- }
-
- return fclose($gi->filehandle);
-}
-
-function geoip_country_id_by_name_v6($gi, $name) {
- $rec = dns_get_record($name, DNS_AAAA);
- if ( !$rec ) {
- return false;
- }
- $addr = $rec[0]["ipv6"];
- if (!$addr || $addr == $name) {
- return false;
- }
- return geoip_country_id_by_addr_v6($gi, $addr);
-}
-
-function geoip_country_id_by_name($gi, $name) {
- $addr = gethostbyname($name);
- if (!$addr || $addr == $name) {
- return false;
- }
- return geoip_country_id_by_addr($gi, $addr);
-}
-
-function geoip_country_code_by_name_v6($gi, $name) {
- $country_id = geoip_country_id_by_name_v6($gi,$name);
- if ($country_id !== false) {
- return $gi->GEOIP_COUNTRY_CODES[$country_id];
- }
- return false;
-}
-
-function geoip_country_code_by_name($gi, $name) {
- $country_id = geoip_country_id_by_name($gi,$name);
- if ($country_id !== false) {
- return $gi->GEOIP_COUNTRY_CODES[$country_id];
- }
- return false;
-}
-
-function geoip_country_name_by_name_v6($gi, $name) {
- $country_id = geoip_country_id_by_name_v6($gi,$name);
- if ($country_id !== false) {
- return $gi->GEOIP_COUNTRY_NAMES[$country_id];
- }
- return false;
-}
-
-function geoip_country_name_by_name($gi, $name) {
- $country_id = geoip_country_id_by_name($gi,$name);
- if ($country_id !== false) {
- return $gi->GEOIP_COUNTRY_NAMES[$country_id];
- }
- return false;
-}
-
-function geoip_country_id_by_addr_v6($gi, $addr) {
- $ipnum = inet_pton($addr);
- return _geoip_seek_country_v6($gi, $ipnum) - GEOIP_COUNTRY_BEGIN;
-}
-
-function geoip_country_id_by_addr($gi, $addr) {
- $ipnum = ip2long($addr);
- return _geoip_seek_country($gi, $ipnum) - GEOIP_COUNTRY_BEGIN;
-}
-
-function geoip_country_code_by_addr_v6($gi, $addr) {
- $country_id = geoip_country_id_by_addr_v6($gi,$addr);
- if ($country_id !== false) {
- return $gi->GEOIP_COUNTRY_CODES[$country_id];
- }
- return false;
-}
-
-function geoip_country_code_by_addr($gi, $addr) {
- if ($gi->databaseType == GEOIP_CITY_EDITION_REV1) {
- $record = geoip_record_by_addr($gi,$addr);
- if ( $record !== false ) {
- return $record->country_code;
- }
- } else {
- $country_id = geoip_country_id_by_addr($gi,$addr);
- if ($country_id !== false) {
- return $gi->GEOIP_COUNTRY_CODES[$country_id];
- }
- }
- return false;
-}
-
-function geoip_country_name_by_addr_v6($gi, $addr) {
- $country_id = geoip_country_id_by_addr_v6($gi,$addr);
- if ($country_id !== false) {
- return $gi->GEOIP_COUNTRY_NAMES[$country_id];
- }
- return false;
-}
-
-function geoip_country_name_by_addr($gi, $addr) {
- if ($gi->databaseType == GEOIP_CITY_EDITION_REV1) {
- $record = geoip_record_by_addr($gi,$addr);
- return $record->country_name;
- } else {
- $country_id = geoip_country_id_by_addr($gi,$addr);
- if ($country_id !== false) {
- return $gi->GEOIP_COUNTRY_NAMES[$country_id];
- }
- }
- return false;
-}
-
-function _geoip_seek_country_v6($gi, $ipnum) {
-
-# arrays from unpack start with offset 1
-# yet another php mystery. array_merge work around
-# this broken behaviour
- $v6vec = array_merge(unpack( "C16", $ipnum));
-
- $offset = 0;
- for ($depth = 127; $depth >= 0; --$depth) {
- if ($gi->flags & GEOIP_MEMORY_CACHE) {
- // workaround php's broken substr, strpos, etc handling with
- // mbstring.func_overload and mbstring.internal_encoding
- $enc = mb_internal_encoding();
- mb_internal_encoding('ISO-8859-1');
-
- $buf = substr($gi->memory_buffer,
- 2 * $gi->record_length * $offset,
- 2 * $gi->record_length);
-
- mb_internal_encoding($enc);
- } elseif ($gi->flags & GEOIP_SHARED_MEMORY) {
- $buf = @shmop_read ($gi->shmid,
- 2 * $gi->record_length * $offset,
- 2 * $gi->record_length );
- } else {
- fseek($gi->filehandle, 2 * $gi->record_length * $offset, SEEK_SET) == 0
- or die("fseek failed");
- $buf = fread($gi->filehandle, 2 * $gi->record_length);
- }
- $x = array(0,0);
- for ($i = 0; $i < 2; ++$i) {
- for ($j = 0; $j < $gi->record_length; ++$j) {
- $x[$i] += ord($buf[$gi->record_length * $i + $j]) << ($j * 8);
- }
- }
-
- $bnum = 127 - $depth;
- $idx = $bnum >> 3;
- $b_mask = 1 << ( $bnum & 7 ^ 7 );
- if (($v6vec[$idx] & $b_mask) > 0) {
- if ($x[1] >= $gi->databaseSegments) {
- return $x[1];
- }
- $offset = $x[1];
- } else {
- if ($x[0] >= $gi->databaseSegments) {
- return $x[0];
- }
- $offset = $x[0];
- }
- }
- trigger_error("error traversing database - perhaps it is corrupt?", E_USER_ERROR);
- return false;
-}
-
-function _geoip_seek_country($gi, $ipnum) {
- $offset = 0;
- for ($depth = 31; $depth >= 0; --$depth) {
- if ($gi->flags & GEOIP_MEMORY_CACHE) {
- // workaround php's broken substr, strpos, etc handling with
- // mbstring.func_overload and mbstring.internal_encoding
- $enc = mb_internal_encoding();
- mb_internal_encoding('ISO-8859-1');
-
- $buf = substr($gi->memory_buffer,
- 2 * $gi->record_length * $offset,
- 2 * $gi->record_length);
-
- mb_internal_encoding($enc);
- } elseif ($gi->flags & GEOIP_SHARED_MEMORY) {
- $buf = @shmop_read ($gi->shmid,
- 2 * $gi->record_length * $offset,
- 2 * $gi->record_length );
- } else {
- fseek($gi->filehandle, 2 * $gi->record_length * $offset, SEEK_SET) == 0
- or die("fseek failed");
- $buf = fread($gi->filehandle, 2 * $gi->record_length);
- }
- $x = array(0,0);
- for ($i = 0; $i < 2; ++$i) {
- for ($j = 0; $j < $gi->record_length; ++$j) {
- $x[$i] += ord($buf[$gi->record_length * $i + $j]) << ($j * 8);
- }
- }
- if ($ipnum & (1 << $depth)) {
- if ($x[1] >= $gi->databaseSegments) {
- return $x[1];
- }
- $offset = $x[1];
- } else {
- if ($x[0] >= $gi->databaseSegments) {
- return $x[0];
- }
- $offset = $x[0];
- }
- }
- trigger_error("error traversing database - perhaps it is corrupt?", E_USER_ERROR);
- return false;
-}
-
-function _common_get_org($gi, $seek_org){
- $record_pointer = $seek_org + (2 * $gi->record_length - 1) * $gi->databaseSegments;
- if ($gi->flags & GEOIP_SHARED_MEMORY) {
- $org_buf = @shmop_read ($gi->shmid, $record_pointer, MAX_ORG_RECORD_LENGTH);
- } else {
- fseek($gi->filehandle, $record_pointer, SEEK_SET);
- $org_buf = fread($gi->filehandle,MAX_ORG_RECORD_LENGTH);
- }
- // workaround php's broken substr, strpos, etc handling with
- // mbstring.func_overload and mbstring.internal_encoding
- $enc = mb_internal_encoding();
- mb_internal_encoding('ISO-8859-1');
- $org_buf = substr($org_buf, 0, strpos($org_buf, "\0"));
- mb_internal_encoding($enc);
- return $org_buf;
-}
-
-function _get_org_v6($gi,$ipnum){
- $seek_org = _geoip_seek_country_v6($gi,$ipnum);
- if ($seek_org == $gi->databaseSegments) {
- return NULL;
- }
- return _common_get_org($gi, $seek_org);
-}
-
-function _get_org($gi,$ipnum){
- $seek_org = _geoip_seek_country($gi,$ipnum);
- if ($seek_org == $gi->databaseSegments) {
- return NULL;
- }
- return _common_get_org($gi, $seek_org);
-}
-
-
-
-function geoip_name_by_addr_v6 ($gi,$addr) {
- if ($addr == NULL) {
- return 0;
- }
- $ipnum = inet_pton($addr);
- return _get_org_v6($gi, $ipnum);
-}
-
-function geoip_name_by_addr ($gi,$addr) {
- if ($addr == NULL) {
- return 0;
- }
- $ipnum = ip2long($addr);
- return _get_org($gi, $ipnum);
-}
-
-function geoip_org_by_addr ($gi,$addr) {
- return geoip_name_by_addr($gi, $addr);
-}
-
-function _get_region($gi,$ipnum){
- if ($gi->databaseType == GEOIP_REGION_EDITION_REV0){
- $seek_region = _geoip_seek_country($gi,$ipnum) - GEOIP_STATE_BEGIN_REV0;
- if ($seek_region >= 1000){
- $country_code = "US";
- $region = chr(($seek_region - 1000)/26 + 65) . chr(($seek_region - 1000)%26 + 65);
- } else {
- $country_code = $gi->GEOIP_COUNTRY_CODES[$seek_region];
- $region = "";
- }
- return array ($country_code,$region);
- } else if ($gi->databaseType == GEOIP_REGION_EDITION_REV1) {
- $seek_region = _geoip_seek_country($gi,$ipnum) - GEOIP_STATE_BEGIN_REV1;
- //print $seek_region;
- if ($seek_region < US_OFFSET){
- $country_code = "";
- $region = "";
- } else if ($seek_region < CANADA_OFFSET) {
- $country_code = "US";
- $region = chr(($seek_region - US_OFFSET)/26 + 65) . chr(($seek_region - US_OFFSET)%26 + 65);
- } else if ($seek_region < WORLD_OFFSET) {
- $country_code = "CA";
- $region = chr(($seek_region - CANADA_OFFSET)/26 + 65) . chr(($seek_region - CANADA_OFFSET)%26 + 65);
- } else {
- $country_code = $gi->GEOIP_COUNTRY_CODES[($seek_region - WORLD_OFFSET) / FIPS_RANGE];
- $region = "";
- }
- return array ($country_code,$region);
- }
-}
-
-function geoip_region_by_addr ($gi,$addr) {
- if ($addr == NULL) {
- return 0;
- }
- $ipnum = ip2long($addr);
- return _get_region($gi, $ipnum);
-}
-
-function getdnsattributes ($l,$ip){
- $r = new Net_DNS_Resolver();
- $r->nameservers = array("ws1.maxmind.com");
- $p = $r->search($l."." . $ip .".s.maxmind.com","TXT","IN");
- $str = is_object($p->answer[0])?$p->answer[0]->string():'';
- $str = substr( $str, 1, -1 );
- return $str;
-}
-
-?>