PluginProbe ʕ •ᴥ•ʔ
Wordfence Security – Firewall, Malware Scan, and Login Security / 5.1.2
Wordfence Security – Firewall, Malware Scan, and Login Security v5.1.2
8.2.2 8.2.1 8.2.0 3.7.1 3.7.2 3.8.1 3.8.2 3.8.3 3.8.4 3.8.5 3.8.6 3.8.7 3.8.8 3.8.9 3.9.1 4.0.1 4.0.2 4.0.3 5.0.1 5.0.2 5.0.3 5.0.4 5.0.5 5.0.6 5.0.7 5.0.8 5.0.9 5.1.1 5.1.2 5.1.4 5.1.5 5.1.6 5.1.7 5.1.8 5.1.9 5.2.1 5.2.2 5.2.3 5.2.4 5.2.5 5.2.6 5.2.7 5.2.8 5.2.9 5.3.1 5.3.10 5.3.11 5.3.12 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 5.3.8 5.3.9 6.0.1 6.0.10 6.0.11 6.0.12 6.0.14 6.0.15 6.0.16 6.0.17 6.0.18 6.0.19 6.0.2 6.0.20 6.0.21 6.0.22 6.0.23 6.0.24 6.0.25 6.0.3 6.0.4 6.0.5 6.0.6 6.0.7 6.0.8 6.0.9 6.1.1 6.1.10 6.1.11 6.1.12 6.1.14 6.1.15 6.1.16 6.1.17 6.1.2 6.1.3 6.1.4 6.1.5 6.1.6 6.1.7 6.1.8 6.1.9 6.2.0 6.2.1 6.2.10 6.2.2 6.2.3 6.2.4 6.2.5 6.2.6 6.2.7 6.2.8 6.2.9 6.3.0 6.3.1 6.3.10 6.3.11 6.3.12 6.3.14 6.3.15 6.3.16 6.3.17 6.3.18 6.3.19 6.3.2 6.3.20 6.3.21 6.3.22 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.3.8 6.3.9 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1.0 7.1.1 7.1.10 7.1.11 7.1.12 7.1.14 7.1.15 7.1.16 7.1.17 7.1.18 7.1.19 7.1.2 7.1.20 7.1.3 7.1.4 7.1.5 7.1.6 7.1.7 7.1.8 7.1.9 7.10.0 7.10.1 7.10.2 7.10.3 7.10.4 7.10.5 7.10.6 7.10.7 7.11.0 7.11.1 7.11.2 7.11.3 7.11.4 7.11.5 7.11.6 7.11.7 7.2.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3.1 7.3.2 7.3.3 7.3.4 7.3.5 7.3.6 7.4.0 7.4.1 7.4.10 7.4.11 7.4.12 7.4.14 7.4.2 7.4.3 trunk 7.4.4 1.1 7.4.5 1.2 7.4.6 1.3 7.4.7 1.3.1 7.4.8 1.3.2 7.4.9 1.3.3 7.5.0 1.4.2 7.5.1 1.4.3 7.5.10 1.4.4 7.5.11 1.4.5 7.5.2 1.4.6 7.5.3 1.4.7 7.5.4 1.4.8 7.5.5 1.5.1 7.5.6 1.5.2 7.5.7 1.5.3 7.5.8 1.5.4 7.5.9 1.5.5 7.6.0 1.5.6 7.6.1 2.0.1 7.6.2 2.0.2 7.7.0 2.0.3 7.7.1 2.0.5 7.8.0 2.0.6 7.8.1 2.0.7 7.8.2 2.1.0 7.9.0 2.1.1 7.9.1 2.1.2 7.9.2 2.1.3 7.9.3 2.1.4 8.0.0 2.1.5 8.0.1 3.0.2 8.0.2 3.0.3 8.0.3 3.0.4 8.0.4 3.0.5 8.0.5 3.0.6 8.1.0 3.0.7 8.1.1 3.0.8 8.1.2 3.0.9 8.1.3 3.1.0 8.1.4 3.1.1 v1.4.1 3.1.2 3.1.4 3.1.6 3.2.1 3.2.3 3.2.4 3.2.5 3.2.6 3.2.7 3.3.2 3.3.3 3.3.4 3.3.5 3.3.6 3.3.7 3.4.1 3.4.4 3.4.5 3.5.1 3.5.2 3.6.1 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.6.8 3.6.9
wordfence / lib / wfGeoIP.php
wordfence / lib Last commit date
Diff 14 years ago whois 12 years ago .htaccess 14 years ago Diff.php 14 years ago GeoIP.dat 11 years ago IPTraf.php 11 years ago conntest.php 11 years ago dashboard.php 11 years ago diffResult.php 14 years ago email_genericAlert.php 11 years ago email_newIssues.php 11 years ago email_unlockRequest.php 11 years ago menuHeader.php 11 years ago menu_activity.php 11 years ago menu_blockedIPs.php 11 years ago menu_countryBlocking.php 11 years ago menu_options.php 11 years ago menu_rangeBlocking.php 11 years ago menu_scan.php 11 years ago menu_scanSchedule.php 11 years ago menu_sitePerf.php 11 years ago menu_sitePerfStats.php 11 years ago menu_twoFactor.php 11 years ago menu_whois.php 11 years ago pageTitle.php 13 years ago schedWeekEntry.php 12 years ago sysinfo.php 14 years ago unknownFiles.php 13 years ago viewFullActivityLog.php 13 years ago wf503.php 12 years ago wfAPI.php 11 years ago wfAction.php 14 years ago wfArray.php 13 years ago wfBrowscap.php 11 years ago wfBrowscapCache.php 11 years ago wfBulkCountries.php 13 years ago wfCache.php 11 years ago wfConfig.php 11 years ago wfCountryMap.php 13 years ago wfCrawl.php 12 years ago wfDB.php 11 years ago wfDict.php 14 years ago wfGeoIP.php 13 years ago wfIssues.php 11 years ago wfLockedOut.php 13 years ago wfLog.php 11 years ago wfRate.php 14 years ago wfScan.php 11 years ago wfScanEngine.php 11 years ago wfSchema.php 11 years ago wfUnlockMsg.php 13 years ago wfUtils.php 11 years ago wfViewResult.php 14 years ago wordfenceClass.php 11 years ago wordfenceConstants.php 11 years ago wordfenceHash.php 11 years ago wordfenceScanner.php 11 years ago wordfenceURLHoover.php 11 years ago
wfGeoIP.php
766 lines
1 <?php
2
3 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */
4 /* geoip.inc
5 *
6 * Copyright (C) 2007 MaxMind LLC
7 *
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 */
22 if(! class_exists('wfGeoIP')){
23 define("GEOIP_COUNTRY_BEGIN", 16776960);
24 define("GEOIP_STATE_BEGIN_REV0", 16700000);
25 define("GEOIP_STATE_BEGIN_REV1", 16000000);
26 define("GEOIP_STANDARD", 0);
27 define("GEOIP_MEMORY_CACHE", 1);
28 define("GEOIP_SHARED_MEMORY", 2);
29 define("STRUCTURE_INFO_MAX_SIZE", 20);
30 define("DATABASE_INFO_MAX_SIZE", 100);
31 define("GEOIP_COUNTRY_EDITION", 106);
32 define("GEOIP_PROXY_EDITION", 8);
33 define("GEOIP_ASNUM_EDITION", 9);
34 define("GEOIP_NETSPEED_EDITION", 10);
35 define("GEOIP_REGION_EDITION_REV0", 112);
36 define("GEOIP_REGION_EDITION_REV1", 3);
37 define("GEOIP_CITY_EDITION_REV0", 111);
38 define("GEOIP_CITY_EDITION_REV1", 2);
39 define("GEOIP_ORG_EDITION", 110);
40 define("GEOIP_ISP_EDITION", 4);
41 define("SEGMENT_RECORD_LENGTH", 3);
42 define("STANDARD_RECORD_LENGTH", 3);
43 define("ORG_RECORD_LENGTH", 4);
44 define("MAX_RECORD_LENGTH", 4);
45 define("MAX_ORG_RECORD_LENGTH", 300);
46 define("GEOIP_SHM_KEY", 0x4f415401);
47 define("US_OFFSET", 1);
48 define("CANADA_OFFSET", 677);
49 define("WORLD_OFFSET", 1353);
50 define("FIPS_RANGE", 360);
51 define("GEOIP_UNKNOWN_SPEED", 0);
52 define("GEOIP_DIALUP_SPEED", 1);
53 define("GEOIP_CABLEDSL_SPEED", 2);
54 define("GEOIP_CORPORATE_SPEED", 3);
55 define("GEOIP_DOMAIN_EDITION", 11);
56 define("GEOIP_COUNTRY_EDITION_V6", 12);
57 define("GEOIP_LOCATIONA_EDITION", 13);
58 define("GEOIP_ACCURACYRADIUS_EDITION", 14);
59 define("GEOIP_CITYCOMBINED_EDITION", 15);
60 define("GEOIP_CITY_EDITION_REV1_V6", 30);
61 define("GEOIP_CITY_EDITION_REV0_V6",31);
62 define("GEOIP_NETSPEED_EDITION_REV1",32);
63 define("GEOIP_NETSPEED_EDITION_REV1_V6",33);
64 define("GEOIP_USERTYPE_EDITION",28);
65 define("GEOIP_USERTYPE_EDITION_V6",29);
66 define("GEOIP_ASNUM_EDITION_V6",21);
67 define("GEOIP_ISP_EDITION_V6",22);
68 define("GEOIP_ORG_EDITION_V6",23);
69 define("GEOIP_DOMAIN_EDITION_V6",24);
70
71 define("CITYCOMBINED_FIXED_RECORD", 7 );
72
73 class wfGeoIP {
74 var $flags;
75 var $filehandle;
76 var $memory_buffer;
77 var $databaseType;
78 var $databaseSegments;
79 var $record_length;
80 var $shmid;
81 var $GEOIP_COUNTRY_CODE_TO_NUMBER = array(
82 "" => 0, "AP" => 1, "EU" => 2, "AD" => 3, "AE" => 4, "AF" => 5,
83 "AG" => 6, "AI" => 7, "AL" => 8, "AM" => 9, "CW" => 10, "AO" => 11,
84 "AQ" => 12, "AR" => 13, "AS" => 14, "AT" => 15, "AU" => 16, "AW" => 17,
85 "AZ" => 18, "BA" => 19, "BB" => 20, "BD" => 21, "BE" => 22, "BF" => 23,
86 "BG" => 24, "BH" => 25, "BI" => 26, "BJ" => 27, "BM" => 28, "BN" => 29,
87 "BO" => 30, "BR" => 31, "BS" => 32, "BT" => 33, "BV" => 34, "BW" => 35,
88 "BY" => 36, "BZ" => 37, "CA" => 38, "CC" => 39, "CD" => 40, "CF" => 41,
89 "CG" => 42, "CH" => 43, "CI" => 44, "CK" => 45, "CL" => 46, "CM" => 47,
90 "CN" => 48, "CO" => 49, "CR" => 50, "CU" => 51, "CV" => 52, "CX" => 53,
91 "CY" => 54, "CZ" => 55, "DE" => 56, "DJ" => 57, "DK" => 58, "DM" => 59,
92 "DO" => 60, "DZ" => 61, "EC" => 62, "EE" => 63, "EG" => 64, "EH" => 65,
93 "ER" => 66, "ES" => 67, "ET" => 68, "FI" => 69, "FJ" => 70, "FK" => 71,
94 "FM" => 72, "FO" => 73, "FR" => 74, "SX" => 75, "GA" => 76, "GB" => 77,
95 "GD" => 78, "GE" => 79, "GF" => 80, "GH" => 81, "GI" => 82, "GL" => 83,
96 "GM" => 84, "GN" => 85, "GP" => 86, "GQ" => 87, "GR" => 88, "GS" => 89,
97 "GT" => 90, "GU" => 91, "GW" => 92, "GY" => 93, "HK" => 94, "HM" => 95,
98 "HN" => 96, "HR" => 97, "HT" => 98, "HU" => 99, "ID" => 100, "IE" => 101,
99 "IL" => 102, "IN" => 103, "IO" => 104, "IQ" => 105, "IR" => 106, "IS" => 107,
100 "IT" => 108, "JM" => 109, "JO" => 110, "JP" => 111, "KE" => 112, "KG" => 113,
101 "KH" => 114, "KI" => 115, "KM" => 116, "KN" => 117, "KP" => 118, "KR" => 119,
102 "KW" => 120, "KY" => 121, "KZ" => 122, "LA" => 123, "LB" => 124, "LC" => 125,
103 "LI" => 126, "LK" => 127, "LR" => 128, "LS" => 129, "LT" => 130, "LU" => 131,
104 "LV" => 132, "LY" => 133, "MA" => 134, "MC" => 135, "MD" => 136, "MG" => 137,
105 "MH" => 138, "MK" => 139, "ML" => 140, "MM" => 141, "MN" => 142, "MO" => 143,
106 "MP" => 144, "MQ" => 145, "MR" => 146, "MS" => 147, "MT" => 148, "MU" => 149,
107 "MV" => 150, "MW" => 151, "MX" => 152, "MY" => 153, "MZ" => 154, "NA" => 155,
108 "NC" => 156, "NE" => 157, "NF" => 158, "NG" => 159, "NI" => 160, "NL" => 161,
109 "NO" => 162, "NP" => 163, "NR" => 164, "NU" => 165, "NZ" => 166, "OM" => 167,
110 "PA" => 168, "PE" => 169, "PF" => 170, "PG" => 171, "PH" => 172, "PK" => 173,
111 "PL" => 174, "PM" => 175, "PN" => 176, "PR" => 177, "PS" => 178, "PT" => 179,
112 "PW" => 180, "PY" => 181, "QA" => 182, "RE" => 183, "RO" => 184, "RU" => 185,
113 "RW" => 186, "SA" => 187, "SB" => 188, "SC" => 189, "SD" => 190, "SE" => 191,
114 "SG" => 192, "SH" => 193, "SI" => 194, "SJ" => 195, "SK" => 196, "SL" => 197,
115 "SM" => 198, "SN" => 199, "SO" => 200, "SR" => 201, "ST" => 202, "SV" => 203,
116 "SY" => 204, "SZ" => 205, "TC" => 206, "TD" => 207, "TF" => 208, "TG" => 209,
117 "TH" => 210, "TJ" => 211, "TK" => 212, "TM" => 213, "TN" => 214, "TO" => 215,
118 "TL" => 216, "TR" => 217, "TT" => 218, "TV" => 219, "TW" => 220, "TZ" => 221,
119 "UA" => 222, "UG" => 223, "UM" => 224, "US" => 225, "UY" => 226, "UZ" => 227,
120 "VA" => 228, "VC" => 229, "VE" => 230, "VG" => 231, "VI" => 232, "VN" => 233,
121 "VU" => 234, "WF" => 235, "WS" => 236, "YE" => 237, "YT" => 238, "RS" => 239,
122 "ZA" => 240, "ZM" => 241, "ME" => 242, "ZW" => 243, "A1" => 244, "A2" => 245,
123 "O1" => 246, "AX" => 247, "GG" => 248, "IM" => 249, "JE" => 250, "BL" => 251,
124 "MF" => 252, "BQ" => 253,
125 );
126 var $GEOIP_COUNTRY_CODES = array(
127 "","AP","EU","AD","AE","AF","AG","AI","AL","AM","CW",
128 "AO","AQ","AR","AS","AT","AU","AW","AZ","BA","BB",
129 "BD","BE","BF","BG","BH","BI","BJ","BM","BN","BO",
130 "BR","BS","BT","BV","BW","BY","BZ","CA","CC","CD",
131 "CF","CG","CH","CI","CK","CL","CM","CN","CO","CR",
132 "CU","CV","CX","CY","CZ","DE","DJ","DK","DM","DO",
133 "DZ","EC","EE","EG","EH","ER","ES","ET","FI","FJ",
134 "FK","FM","FO","FR","SX","GA","GB","GD","GE","GF",
135 "GH","GI","GL","GM","GN","GP","GQ","GR","GS","GT",
136 "GU","GW","GY","HK","HM","HN","HR","HT","HU","ID",
137 "IE","IL","IN","IO","IQ","IR","IS","IT","JM","JO",
138 "JP","KE","KG","KH","KI","KM","KN","KP","KR","KW",
139 "KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT",
140 "LU","LV","LY","MA","MC","MD","MG","MH","MK","ML",
141 "MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV",
142 "MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI",
143 "NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF",
144 "PG","PH","PK","PL","PM","PN","PR","PS","PT","PW",
145 "PY","QA","RE","RO","RU","RW","SA","SB","SC","SD",
146 "SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO",
147 "SR","ST","SV","SY","SZ","TC","TD","TF","TG","TH",
148 "TJ","TK","TM","TN","TO","TL","TR","TT","TV","TW",
149 "TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE",
150 "VG","VI","VN","VU","WF","WS","YE","YT","RS","ZA",
151 "ZM","ME","ZW","A1","A2","O1","AX","GG","IM","JE",
152 "BL","MF", "BQ");
153 var $GEOIP_COUNTRY_CODES3 = array(
154 "","AP","EU","AND","ARE","AFG","ATG","AIA","ALB","ARM","CUW",
155 "AGO","ATA","ARG","ASM","AUT","AUS","ABW","AZE","BIH","BRB",
156 "BGD","BEL","BFA","BGR","BHR","BDI","BEN","BMU","BRN","BOL",
157 "BRA","BHS","BTN","BVT","BWA","BLR","BLZ","CAN","CCK","COD",
158 "CAF","COG","CHE","CIV","COK","CHL","CMR","CHN","COL","CRI",
159 "CUB","CPV","CXR","CYP","CZE","DEU","DJI","DNK","DMA","DOM",
160 "DZA","ECU","EST","EGY","ESH","ERI","ESP","ETH","FIN","FJI",
161 "FLK","FSM","FRO","FRA","SXM","GAB","GBR","GRD","GEO","GUF",
162 "GHA","GIB","GRL","GMB","GIN","GLP","GNQ","GRC","SGS","GTM",
163 "GUM","GNB","GUY","HKG","HMD","HND","HRV","HTI","HUN","IDN",
164 "IRL","ISR","IND","IOT","IRQ","IRN","ISL","ITA","JAM","JOR",
165 "JPN","KEN","KGZ","KHM","KIR","COM","KNA","PRK","KOR","KWT",
166 "CYM","KAZ","LAO","LBN","LCA","LIE","LKA","LBR","LSO","LTU",
167 "LUX","LVA","LBY","MAR","MCO","MDA","MDG","MHL","MKD","MLI",
168 "MMR","MNG","MAC","MNP","MTQ","MRT","MSR","MLT","MUS","MDV",
169 "MWI","MEX","MYS","MOZ","NAM","NCL","NER","NFK","NGA","NIC",
170 "NLD","NOR","NPL","NRU","NIU","NZL","OMN","PAN","PER","PYF",
171 "PNG","PHL","PAK","POL","SPM","PCN","PRI","PSE","PRT","PLW",
172 "PRY","QAT","REU","ROU","RUS","RWA","SAU","SLB","SYC","SDN",
173 "SWE","SGP","SHN","SVN","SJM","SVK","SLE","SMR","SEN","SOM",
174 "SUR","STP","SLV","SYR","SWZ","TCA","TCD","ATF","TGO","THA",
175 "TJK","TKL","TKM","TUN","TON","TLS","TUR","TTO","TUV","TWN",
176 "TZA","UKR","UGA","UMI","USA","URY","UZB","VAT","VCT","VEN",
177 "VGB","VIR","VNM","VUT","WLF","WSM","YEM","MYT","SRB","ZAF",
178 "ZMB","MNE","ZWE","A1","A2","O1","ALA","GGY","IMN","JEY",
179 "BLM","MAF", "BES"
180 );
181 var $GEOIP_COUNTRY_NAMES = array(
182 "","Asia/Pacific Region","Europe","Andorra","United Arab Emirates","Afghanistan","Antigua and Barbuda","Anguilla","Albania","Armenia","Curacao",
183 "Angola","Antarctica","Argentina","American Samoa","Austria","Australia","Aruba","Azerbaijan","Bosnia and Herzegovina","Barbados",
184 "Bangladesh","Belgium","Burkina Faso","Bulgaria","Bahrain","Burundi","Benin","Bermuda","Brunei Darussalam","Bolivia",
185 "Brazil","Bahamas","Bhutan","Bouvet Island","Botswana","Belarus","Belize","Canada","Cocos (Keeling) Islands","Congo, The Democratic Republic of the",
186 "Central African Republic","Congo","Switzerland","Cote D'Ivoire","Cook Islands","Chile","Cameroon","China","Colombia","Costa Rica",
187 "Cuba","Cape Verde","Christmas Island","Cyprus","Czech Republic","Germany","Djibouti","Denmark","Dominica","Dominican Republic",
188 "Algeria","Ecuador","Estonia","Egypt","Western Sahara","Eritrea","Spain","Ethiopia","Finland","Fiji",
189 "Falkland Islands (Malvinas)","Micronesia, Federated States of","Faroe Islands","France","Sint Maarten (Dutch part)","Gabon","United Kingdom","Grenada","Georgia","French Guiana",
190 "Ghana","Gibraltar","Greenland","Gambia","Guinea","Guadeloupe","Equatorial Guinea","Greece","South Georgia and the South Sandwich Islands","Guatemala",
191 "Guam","Guinea-Bissau","Guyana","Hong Kong","Heard Island and McDonald Islands","Honduras","Croatia","Haiti","Hungary","Indonesia",
192 "Ireland","Israel","India","British Indian Ocean Territory","Iraq","Iran, Islamic Republic of","Iceland","Italy","Jamaica","Jordan",
193 "Japan","Kenya","Kyrgyzstan","Cambodia","Kiribati","Comoros","Saint Kitts and Nevis","Korea, Democratic People's Republic of","Korea, Republic of","Kuwait",
194 "Cayman Islands","Kazakhstan","Lao People's Democratic Republic","Lebanon","Saint Lucia","Liechtenstein","Sri Lanka","Liberia","Lesotho","Lithuania",
195 "Luxembourg","Latvia","Libya","Morocco","Monaco","Moldova, Republic of","Madagascar","Marshall Islands","Macedonia","Mali",
196 "Myanmar","Mongolia","Macau","Northern Mariana Islands","Martinique","Mauritania","Montserrat","Malta","Mauritius","Maldives",
197 "Malawi","Mexico","Malaysia","Mozambique","Namibia","New Caledonia","Niger","Norfolk Island","Nigeria","Nicaragua",
198 "Netherlands","Norway","Nepal","Nauru","Niue","New Zealand","Oman","Panama","Peru","French Polynesia",
199 "Papua New Guinea","Philippines","Pakistan","Poland","Saint Pierre and Miquelon","Pitcairn Islands","Puerto Rico","Palestinian Territory","Portugal","Palau",
200 "Paraguay","Qatar","Reunion","Romania","Russian Federation","Rwanda","Saudi Arabia","Solomon Islands","Seychelles","Sudan",
201 "Sweden","Singapore","Saint Helena","Slovenia","Svalbard and Jan Mayen","Slovakia","Sierra Leone","San Marino","Senegal","Somalia","Suriname",
202 "Sao Tome and Principe","El Salvador","Syrian Arab Republic","Swaziland","Turks and Caicos Islands","Chad","French Southern Territories","Togo","Thailand",
203 "Tajikistan","Tokelau","Turkmenistan","Tunisia","Tonga","Timor-Leste","Turkey","Trinidad and Tobago","Tuvalu","Taiwan",
204 "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",
205 "Virgin Islands, British","Virgin Islands, U.S.","Vietnam","Vanuatu","Wallis and Futuna","Samoa","Yemen","Mayotte","Serbia","South Africa",
206 "Zambia","Montenegro","Zimbabwe","Anonymous Proxy","Satellite Provider","Other","Aland Islands","Guernsey","Isle of Man","Jersey",
207 "Saint Barthelemy","Saint Martin", "Bonaire, Saint Eustatius and Saba"
208 );
209
210 var $GEOIP_CONTINENT_CODES = array(
211 "--", "AS","EU","EU","AS","AS","NA","NA","EU","AS","NA",
212 "AF","AN","SA","OC","EU","OC","NA","AS","EU","NA",
213 "AS","EU","AF","EU","AS","AF","AF","NA","AS","SA",
214 "SA","NA","AS","AN","AF","EU","NA","NA","AS","AF",
215 "AF","AF","EU","AF","OC","SA","AF","AS","SA","NA",
216 "NA","AF","AS","AS","EU","EU","AF","EU","NA","NA",
217 "AF","SA","EU","AF","AF","AF","EU","AF","EU","OC",
218 "SA","OC","EU","EU","NA","AF","EU","NA","AS","SA",
219 "AF","EU","NA","AF","AF","NA","AF","EU","AN","NA",
220 "OC","AF","SA","AS","AN","NA","EU","NA","EU","AS",
221 "EU","AS","AS","AS","AS","AS","EU","EU","NA","AS",
222 "AS","AF","AS","AS","OC","AF","NA","AS","AS","AS",
223 "NA","AS","AS","AS","NA","EU","AS","AF","AF","EU",
224 "EU","EU","AF","AF","EU","EU","AF","OC","EU","AF",
225 "AS","AS","AS","OC","NA","AF","NA","EU","AF","AS",
226 "AF","NA","AS","AF","AF","OC","AF","OC","AF","NA",
227 "EU","EU","AS","OC","OC","OC","AS","NA","SA","OC",
228 "OC","AS","AS","EU","NA","OC","NA","AS","EU","OC",
229 "SA","AS","AF","EU","EU","AF","AS","OC","AF","AF",
230 "EU","AS","AF","EU","EU","EU","AF","EU","AF","AF",
231 "SA","AF","NA","AS","AF","NA","AF","AN","AF","AS",
232 "AS","OC","AS","AF","OC","AS","EU","NA","OC","AS",
233 "AF","EU","AF","OC","NA","SA","AS","EU","NA","SA",
234 "NA","NA","AS","OC","OC","OC","AS","AF","EU","AF",
235 "AF","EU","AF","--","--","--","EU","EU","EU","EU",
236 "NA","NA","NA"
237 );
238
239 }
240 if(! function_exists('geoip_load_shared_mem')){
241 function geoip_load_shared_mem ($file) {
242
243 $fp = fopen($file, "rb");
244 if (!$fp) {
245 print "error opening $file: $php_errormsg\n";
246 exit;
247 }
248 $s_array = fstat($fp);
249 $size = $s_array['size'];
250 if ($shmid = @shmop_open (GEOIP_SHM_KEY, "w", 0, 0)) {
251 shmop_delete ($shmid);
252 shmop_close ($shmid);
253 }
254 $shmid = shmop_open (GEOIP_SHM_KEY, "c", 0644, $size);
255 shmop_write ($shmid, fread($fp, $size), 0);
256 shmop_close ($shmid);
257 }
258 }
259
260 if(! function_exists('')){
261 function _setup_segments($gi){
262 $gi->databaseType = GEOIP_COUNTRY_EDITION;
263 $gi->record_length = STANDARD_RECORD_LENGTH;
264 if ($gi->flags & GEOIP_SHARED_MEMORY) {
265 $offset = @shmop_size ($gi->shmid) - 3;
266 for ($i = 0; $i < STRUCTURE_INFO_MAX_SIZE; $i++) {
267 $delim = @shmop_read ($gi->shmid, $offset, 3);
268 $offset += 3;
269 if ($delim == (chr(255).chr(255).chr(255))) {
270 $gi->databaseType = ord(@shmop_read ($gi->shmid, $offset, 1));
271 $offset++;
272
273 if ($gi->databaseType == GEOIP_REGION_EDITION_REV0){
274 $gi->databaseSegments = GEOIP_STATE_BEGIN_REV0;
275 } else if ($gi->databaseType == GEOIP_REGION_EDITION_REV1){
276 $gi->databaseSegments = GEOIP_STATE_BEGIN_REV1;
277 } else if (($gi->databaseType == GEOIP_CITY_EDITION_REV0)||
278 ($gi->databaseType == GEOIP_CITY_EDITION_REV1)
279 || ($gi->databaseType == GEOIP_ORG_EDITION)
280 || ($gi->databaseType == GEOIP_ORG_EDITION_V6)
281 || ($gi->databaseType == GEOIP_DOMAIN_EDITION)
282 || ($gi->databaseType == GEOIP_DOMAIN_EDITION_V6)
283 || ($gi->databaseType == GEOIP_ISP_EDITION)
284 || ($gi->databaseType == GEOIP_ISP_EDITION_V6)
285 || ($gi->databaseType == GEOIP_USERTYPE_EDITION)
286 || ($gi->databaseType == GEOIP_USERTYPE_EDITION_V6)
287 || ($gi->databaseType == GEOIP_LOCATIONA_EDITION)
288 || ($gi->databaseType == GEOIP_ACCURACYRADIUS_EDITION)
289 || ($gi->databaseType == GEOIP_CITY_EDITION_REV0_V6)
290 || ($gi->databaseType == GEOIP_CITY_EDITION_REV1_V6)
291 || ($gi->databaseType == GEOIP_NETSPEED_EDITION_REV1)
292 || ($gi->databaseType == GEOIP_NETSPEED_EDITION_REV1_V6)
293 || ($gi->databaseType == GEOIP_ASNUM_EDITION)
294 || ($gi->databaseType == GEOIP_ASNUM_EDITION_V6)){
295 $gi->databaseSegments = 0;
296 $buf = @shmop_read ($gi->shmid, $offset, SEGMENT_RECORD_LENGTH);
297 for ($j = 0;$j < SEGMENT_RECORD_LENGTH;$j++){
298 $gi->databaseSegments += (ord($buf[$j]) << ($j * 8));
299 }
300 if (($gi->databaseType == GEOIP_ORG_EDITION)
301 || ($gi->databaseType == GEOIP_ORG_EDITION_V6)
302 || ($gi->databaseType == GEOIP_DOMAIN_EDITION)
303 || ($gi->databaseType == GEOIP_DOMAIN_EDITION_V6)
304 || ($gi->databaseType == GEOIP_ISP_EDITION)
305 || ($gi->databaseType == GEOIP_ISP_EDITION_V6)) {
306 $gi->record_length = ORG_RECORD_LENGTH;
307 }
308 }
309 break;
310 } else {
311 $offset -= 4;
312 }
313 }
314 if (($gi->databaseType == GEOIP_COUNTRY_EDITION)||
315 ($gi->databaseType == GEOIP_COUNTRY_EDITION_V6)||
316 ($gi->databaseType == GEOIP_PROXY_EDITION)||
317 ($gi->databaseType == GEOIP_NETSPEED_EDITION)){
318 $gi->databaseSegments = GEOIP_COUNTRY_BEGIN;
319 }
320 } else {
321 $filepos = ftell($gi->filehandle);
322 fseek($gi->filehandle, -3, SEEK_END);
323 for ($i = 0; $i < STRUCTURE_INFO_MAX_SIZE; $i++) {
324 $delim = fread($gi->filehandle,3);
325 if ($delim == (chr(255).chr(255).chr(255))){
326 $gi->databaseType = ord(fread($gi->filehandle,1));
327 if ($gi->databaseType == GEOIP_REGION_EDITION_REV0){
328 $gi->databaseSegments = GEOIP_STATE_BEGIN_REV0;
329 }
330 else if ($gi->databaseType == GEOIP_REGION_EDITION_REV1){
331 $gi->databaseSegments = GEOIP_STATE_BEGIN_REV1;
332 } else if (($gi->databaseType == GEOIP_CITY_EDITION_REV0)
333 || ($gi->databaseType == GEOIP_CITY_EDITION_REV1)
334 || ($gi->databaseType == GEOIP_CITY_EDITION_REV0_V6)
335 || ($gi->databaseType == GEOIP_CITY_EDITION_REV1_V6)
336 || ($gi->databaseType == GEOIP_ORG_EDITION)
337 || ($gi->databaseType == GEOIP_DOMAIN_EDITION)
338 || ($gi->databaseType == GEOIP_ISP_EDITION)
339 || ($gi->databaseType == GEOIP_ORG_EDITION_V6)
340 || ($gi->databaseType == GEOIP_DOMAIN_EDITION_V6)
341 || ($gi->databaseType == GEOIP_ISP_EDITION_V6)
342 || ($gi->databaseType == GEOIP_LOCATIONA_EDITION)
343 || ($gi->databaseType == GEOIP_ACCURACYRADIUS_EDITION)
344 || ($gi->databaseType == GEOIP_CITY_EDITION_REV0_V6)
345 || ($gi->databaseType == GEOIP_CITY_EDITION_REV1_V6)
346 || ($gi->databaseType == GEOIP_NETSPEED_EDITION_REV1)
347 || ($gi->databaseType == GEOIP_NETSPEED_EDITION_REV1_V6)
348 || ($gi->databaseType == GEOIP_USERTYPE_EDITION)
349 || ($gi->databaseType == GEOIP_USERTYPE_EDITION_V6)
350 || ($gi->databaseType == GEOIP_ASNUM_EDITION)
351 || ($gi->databaseType == GEOIP_ASNUM_EDITION_V6)){
352 $gi->databaseSegments = 0;
353 $buf = fread($gi->filehandle,SEGMENT_RECORD_LENGTH);
354 for ($j = 0;$j < SEGMENT_RECORD_LENGTH;$j++){
355 $gi->databaseSegments += (ord($buf[$j]) << ($j * 8));
356 }
357 if ( ( $gi->databaseType == GEOIP_ORG_EDITION )
358 || ( $gi->databaseType == GEOIP_DOMAIN_EDITION )
359 || ( $gi->databaseType == GEOIP_ISP_EDITION )
360 || ( $gi->databaseType == GEOIP_ORG_EDITION_V6 )
361 || ( $gi->databaseType == GEOIP_DOMAIN_EDITION_V6 )
362 || ( $gi->databaseType == GEOIP_ISP_EDITION_V6 )) {
363 $gi->record_length = ORG_RECORD_LENGTH;
364 }
365 }
366 break;
367 } else {
368 fseek($gi->filehandle, -4, SEEK_CUR);
369 }
370 }
371 if (($gi->databaseType == GEOIP_COUNTRY_EDITION)||
372 ($gi->databaseType == GEOIP_COUNTRY_EDITION_V6)||
373 ($gi->databaseType == GEOIP_PROXY_EDITION)||
374 ($gi->databaseType == GEOIP_NETSPEED_EDITION)){
375 $gi->databaseSegments = GEOIP_COUNTRY_BEGIN;
376 }
377 fseek($gi->filehandle,$filepos,SEEK_SET);
378 }
379 return $gi;
380 }
381 }
382
383 if(! function_exists('geoip_open')){
384 function geoip_open($filename, $flags) {
385 $gi = new wfGeoIP;
386 $gi->flags = $flags;
387 if ($gi->flags & GEOIP_SHARED_MEMORY) {
388 $gi->shmid = @shmop_open (GEOIP_SHM_KEY, "a", 0, 0);
389 } else {
390 $gi->filehandle = fopen($filename,"rb") or die( "Can not open $filename\n" );
391 if ($gi->flags & GEOIP_MEMORY_CACHE) {
392 $s_array = fstat($gi->filehandle);
393 $gi->memory_buffer = fread($gi->filehandle, $s_array['size']);
394 }
395 }
396
397 $gi = _setup_segments($gi);
398 return $gi;
399 }
400 }
401
402 if(! function_exists('geoip_close')){
403 function geoip_close($gi) {
404 if ($gi->flags & GEOIP_SHARED_MEMORY) {
405 return true;
406 }
407
408 return fclose($gi->filehandle);
409 }
410 }
411
412 if(! function_exists('geoip_country_id_by_name_v6')){
413 function geoip_country_id_by_name_v6($gi, $name) {
414 $rec = dns_get_record($name, DNS_AAAA);
415 if ( !$rec ) {
416 return false;
417 }
418 $addr = $rec[0]["ipv6"];
419 if (!$addr || $addr == $name) {
420 return false;
421 }
422 return geoip_country_id_by_addr_v6($gi, $addr);
423 }
424 }
425
426 if(! function_exists('geoip_country_id_by_name')){
427 function geoip_country_id_by_name($gi, $name) {
428 $addr = gethostbyname($name);
429 if (!$addr || $addr == $name) {
430 return false;
431 }
432 return geoip_country_id_by_addr($gi, $addr);
433 }
434 }
435
436 if(! function_exists('geoip_country_id_by_name')){
437 function geoip_country_code_by_name_v6($gi, $name) {
438 $country_id = geoip_country_id_by_name_v6($gi,$name);
439 if ($country_id !== false) {
440 return $gi->GEOIP_COUNTRY_CODES[$country_id];
441 }
442 return false;
443 }
444 }
445
446 if(! function_exists('geoip_country_code_by_name')){
447 function geoip_country_code_by_name($gi, $name) {
448 $country_id = geoip_country_id_by_name($gi,$name);
449 if ($country_id !== false) {
450 return $gi->GEOIP_COUNTRY_CODES[$country_id];
451 }
452 return false;
453 }
454 }
455
456 if(! function_exists('geoip_country_name_by_name_v6')){
457 function geoip_country_name_by_name_v6($gi, $name) {
458 $country_id = geoip_country_id_by_name_v6($gi,$name);
459 if ($country_id !== false) {
460 return $gi->GEOIP_COUNTRY_NAMES[$country_id];
461 }
462 return false;
463 }
464 }
465
466 if(! function_exists('geoip_country_name_by_name')){
467 function geoip_country_name_by_name($gi, $name) {
468 $country_id = geoip_country_id_by_name($gi,$name);
469 if ($country_id !== false) {
470 return $gi->GEOIP_COUNTRY_NAMES[$country_id];
471 }
472 return false;
473 }
474 }
475
476 if(! function_exists('geoip_country_id_by_addr_v6')){
477 function geoip_country_id_by_addr_v6($gi, $addr) {
478 $ipnum = inet_pton($addr);
479 return _geoip_seek_country_v6($gi, $ipnum) - GEOIP_COUNTRY_BEGIN;
480 }
481 }
482
483 if(! function_exists('geoip_country_id_by_addr')){
484 function geoip_country_id_by_addr($gi, $addr) {
485 $ipnum = ip2long($addr);
486 return _geoip_seek_country($gi, $ipnum) - GEOIP_COUNTRY_BEGIN;
487 }
488 }
489
490 if(! function_exists('geoip_country_code_by_addr_v6')){
491 function geoip_country_code_by_addr_v6($gi, $addr) {
492 $country_id = geoip_country_id_by_addr_v6($gi,$addr);
493 if ($country_id !== false) {
494 return $gi->GEOIP_COUNTRY_CODES[$country_id];
495 }
496 return false;
497 }
498 }
499
500 if(! function_exists('geoip_country_code_by_addr')){
501 function geoip_country_code_by_addr($gi, $addr) {
502 if ($gi->databaseType == GEOIP_CITY_EDITION_REV1) {
503 $record = geoip_record_by_addr($gi,$addr);
504 if ( $record !== false ) {
505 return $record->country_code;
506 }
507 } else {
508 $country_id = geoip_country_id_by_addr($gi,$addr);
509 if ($country_id !== false) {
510 return $gi->GEOIP_COUNTRY_CODES[$country_id];
511 }
512 }
513 return false;
514 }
515 }
516
517 if(! function_exists('geoip_country_name_by_addr_v6')){
518 function geoip_country_name_by_addr_v6($gi, $addr) {
519 $country_id = geoip_country_id_by_addr_v6($gi,$addr);
520 if ($country_id !== false) {
521 return $gi->GEOIP_COUNTRY_NAMES[$country_id];
522 }
523 return false;
524 }
525 }
526
527 if(! function_exists('geoip_country_name_by_addr')){
528 function geoip_country_name_by_addr($gi, $addr) {
529 if ($gi->databaseType == GEOIP_CITY_EDITION_REV1) {
530 $record = geoip_record_by_addr($gi,$addr);
531 return $record->country_name;
532 } else {
533 $country_id = geoip_country_id_by_addr($gi,$addr);
534 if ($country_id !== false) {
535 return $gi->GEOIP_COUNTRY_NAMES[$country_id];
536 }
537 }
538 return false;
539 }
540 }
541
542 if(! function_exists('_geoip_seek_country_v6')){
543 function _geoip_seek_country_v6($gi, $ipnum) {
544
545 # arrays from unpack start with offset 1
546 # yet another php mystery. array_merge work around
547 # this broken behaviour
548 $v6vec = array_merge(unpack( "C16", $ipnum));
549
550 $offset = 0;
551 for ($depth = 127; $depth >= 0; --$depth) {
552 if ($gi->flags & GEOIP_MEMORY_CACHE) {
553 // workaround php's broken substr, strpos, etc handling with
554 // mbstring.func_overload and mbstring.internal_encoding
555 $enc = mb_internal_encoding();
556 mb_internal_encoding('ISO-8859-1');
557
558 $buf = substr($gi->memory_buffer,
559 2 * $gi->record_length * $offset,
560 2 * $gi->record_length);
561
562 mb_internal_encoding($enc);
563 } elseif ($gi->flags & GEOIP_SHARED_MEMORY) {
564 $buf = @shmop_read ($gi->shmid,
565 2 * $gi->record_length * $offset,
566 2 * $gi->record_length );
567 } else {
568 fseek($gi->filehandle, 2 * $gi->record_length * $offset, SEEK_SET) == 0
569 or die("fseek failed");
570 $buf = fread($gi->filehandle, 2 * $gi->record_length);
571 }
572 $x = array(0,0);
573 for ($i = 0; $i < 2; ++$i) {
574 for ($j = 0; $j < $gi->record_length; ++$j) {
575 $x[$i] += ord($buf[$gi->record_length * $i + $j]) << ($j * 8);
576 }
577 }
578
579 $bnum = 127 - $depth;
580 $idx = $bnum >> 3;
581 $b_mask = 1 << ( $bnum & 7 ^ 7 );
582 if (($v6vec[$idx] & $b_mask) > 0) {
583 if ($x[1] >= $gi->databaseSegments) {
584 return $x[1];
585 }
586 $offset = $x[1];
587 } else {
588 if ($x[0] >= $gi->databaseSegments) {
589 return $x[0];
590 }
591 $offset = $x[0];
592 }
593 }
594 trigger_error("error traversing database - perhaps it is corrupt?", E_USER_ERROR);
595 return false;
596 }
597 }
598
599 if(! function_exists('_geoip_seek_country')){
600 function _geoip_seek_country($gi, $ipnum) {
601 $offset = 0;
602 for ($depth = 31; $depth >= 0; --$depth) {
603 if ($gi->flags & GEOIP_MEMORY_CACHE) {
604 // workaround php's broken substr, strpos, etc handling with
605 // mbstring.func_overload and mbstring.internal_encoding
606 $enc = mb_internal_encoding();
607 mb_internal_encoding('ISO-8859-1');
608
609 $buf = substr($gi->memory_buffer,
610 2 * $gi->record_length * $offset,
611 2 * $gi->record_length);
612
613 mb_internal_encoding($enc);
614 } elseif ($gi->flags & GEOIP_SHARED_MEMORY) {
615 $buf = @shmop_read ($gi->shmid,
616 2 * $gi->record_length * $offset,
617 2 * $gi->record_length );
618 } else {
619 fseek($gi->filehandle, 2 * $gi->record_length * $offset, SEEK_SET) == 0
620 or die("fseek failed");
621 $buf = fread($gi->filehandle, 2 * $gi->record_length);
622 }
623 $x = array(0,0);
624 for ($i = 0; $i < 2; ++$i) {
625 for ($j = 0; $j < $gi->record_length; ++$j) {
626 $x[$i] += ord($buf[$gi->record_length * $i + $j]) << ($j * 8);
627 }
628 }
629 if ($ipnum & (1 << $depth)) {
630 if ($x[1] >= $gi->databaseSegments) {
631 return $x[1];
632 }
633 $offset = $x[1];
634 } else {
635 if ($x[0] >= $gi->databaseSegments) {
636 return $x[0];
637 }
638 $offset = $x[0];
639 }
640 }
641 trigger_error("error traversing database - perhaps it is corrupt?", E_USER_ERROR);
642 return false;
643 }
644 }
645
646 if(! function_exists('_common_get_org')){
647 function _common_get_org($gi, $seek_org){
648 $record_pointer = $seek_org + (2 * $gi->record_length - 1) * $gi->databaseSegments;
649 if ($gi->flags & GEOIP_SHARED_MEMORY) {
650 $org_buf = @shmop_read ($gi->shmid, $record_pointer, MAX_ORG_RECORD_LENGTH);
651 } else {
652 fseek($gi->filehandle, $record_pointer, SEEK_SET);
653 $org_buf = fread($gi->filehandle,MAX_ORG_RECORD_LENGTH);
654 }
655 // workaround php's broken substr, strpos, etc handling with
656 // mbstring.func_overload and mbstring.internal_encoding
657 $enc = mb_internal_encoding();
658 mb_internal_encoding('ISO-8859-1');
659 $org_buf = substr($org_buf, 0, strpos($org_buf, "\0"));
660 mb_internal_encoding($enc);
661 return $org_buf;
662 }
663 }
664
665 if(! function_exists('_get_org_v6')){
666 function _get_org_v6($gi,$ipnum){
667 $seek_org = _geoip_seek_country_v6($gi,$ipnum);
668 if ($seek_org == $gi->databaseSegments) {
669 return NULL;
670 }
671 return _common_get_org($gi, $seek_org);
672 }
673 }
674
675 if(! function_exists('_get_org')){
676 function _get_org($gi,$ipnum){
677 $seek_org = _geoip_seek_country($gi,$ipnum);
678 if ($seek_org == $gi->databaseSegments) {
679 return NULL;
680 }
681 return _common_get_org($gi, $seek_org);
682 }
683 }
684
685 if(! function_exists('geoip_name_by_addr_v6')){
686 function geoip_name_by_addr_v6 ($gi,$addr) {
687 if ($addr == NULL) {
688 return 0;
689 }
690 $ipnum = inet_pton($addr);
691 return _get_org_v6($gi, $ipnum);
692 }
693 }
694
695 if(! function_exists('geoip_name_by_addr')){
696 function geoip_name_by_addr ($gi,$addr) {
697 if ($addr == NULL) {
698 return 0;
699 }
700 $ipnum = ip2long($addr);
701 return _get_org($gi, $ipnum);
702 }
703 }
704
705 if(! function_exists('geoip_org_by_addr')){
706 function geoip_org_by_addr ($gi,$addr) {
707 return geoip_name_by_addr($gi, $addr);
708 }
709 }
710
711 if(! function_exists('_get_region')){
712 function _get_region($gi,$ipnum){
713 if ($gi->databaseType == GEOIP_REGION_EDITION_REV0){
714 $seek_region = _geoip_seek_country($gi,$ipnum) - GEOIP_STATE_BEGIN_REV0;
715 if ($seek_region >= 1000){
716 $country_code = "US";
717 $region = chr(($seek_region - 1000)/26 + 65) . chr(($seek_region - 1000)%26 + 65);
718 } else {
719 $country_code = $gi->GEOIP_COUNTRY_CODES[$seek_region];
720 $region = "";
721 }
722 return array ($country_code,$region);
723 } else if ($gi->databaseType == GEOIP_REGION_EDITION_REV1) {
724 $seek_region = _geoip_seek_country($gi,$ipnum) - GEOIP_STATE_BEGIN_REV1;
725 //print $seek_region;
726 if ($seek_region < US_OFFSET){
727 $country_code = "";
728 $region = "";
729 } else if ($seek_region < CANADA_OFFSET) {
730 $country_code = "US";
731 $region = chr(($seek_region - US_OFFSET)/26 + 65) . chr(($seek_region - US_OFFSET)%26 + 65);
732 } else if ($seek_region < WORLD_OFFSET) {
733 $country_code = "CA";
734 $region = chr(($seek_region - CANADA_OFFSET)/26 + 65) . chr(($seek_region - CANADA_OFFSET)%26 + 65);
735 } else {
736 $country_code = $gi->GEOIP_COUNTRY_CODES[($seek_region - WORLD_OFFSET) / FIPS_RANGE];
737 $region = "";
738 }
739 return array ($country_code,$region);
740 }
741 }
742 }
743
744 if(! function_exists('geoip_region_by_addr')){
745 function geoip_region_by_addr ($gi,$addr) {
746 if ($addr == NULL) {
747 return 0;
748 }
749 $ipnum = ip2long($addr);
750 return _get_region($gi, $ipnum);
751 }
752 }
753
754 if(! function_exists('getdnsattributes')){
755 function getdnsattributes ($l,$ip){
756 $r = new Net_DNS_Resolver();
757 $r->nameservers = array("ws1.maxmind.com");
758 $p = $r->search($l."." . $ip .".s.maxmind.com","TXT","IN");
759 $str = is_object($p->answer[0])?$p->answer[0]->string():'';
760 $str = substr( $str, 1, -1 );
761 return $str;
762 }
763 }
764 }
765 ?>
766