Author: Mark
Date: Sun Apr 3 07:03:20 2005
New Revision: 2435
Modified:
trunk/modules/statserv/geoip/GeoIP.c
trunk/modules/statserv/geoip/GeoIP.h
trunk/modules/statserv/geoip/GeoIPCity.c
Log:
merge win32 and *nix geoip code
Modified: trunk/modules/statserv/geoip/GeoIP.c
==============================================================================
--- trunk/modules/statserv/geoip/GeoIP.c (original)
+++ trunk/modules/statserv/geoip/GeoIP.c Sun Apr 3 07:03:20 2005
@@ -20,24 +20,31 @@
#include "GeoIP.h"
+#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#ifndef WIN32
+#ifndef _WIN32
#include <netdb.h>
+#include <sys/socket.h>
+#include <netinet/in.h> /* For ntohl */
+#include <arpa/inet.h>
+#else
+#include <windows.h>
+#define snprintf _snprintf
#endif
#include <assert.h>
#include <sys/types.h> /* for fstat */
#include <sys/stat.h> /* for fstat */
-#ifdef WIN32
-#include <windows.h>
-#endif
-#include <netinet/in.h> /* For ntohl */
#ifdef HAVE_STDINT_H
#include <stdint.h> /* For uint32_t */
#endif
+#ifndef INADDR_NONE
+#define INADDR_NONE -1
+#endif
+
#define COUNTRY_BEGIN 16776960
#define STATE_BEGIN_REV0 16700000
#define STATE_BEGIN_REV1 16000000
@@ -61,54 +68,59 @@
const char GeoIP_country_code3[247][4] = { "--","AP","EU","AND","ARE","AFG","ATG","AIA","ALB","ARM","ANT","AGO","AQ","ARG","ASM","AUT","AUS","ABW","AZE","BIH","BRB","BGD","BEL","BFA","BGR","BHR","BDI","BEN","BMU","BRN","BOL","BRA","BHS","BTN","BV","BWA","BLR","BLZ","CAN","CC","COD","CAF","COG","CHE","CIV","COK","CHL","CMR","CHN","COL","CRI","CUB","CPV","CX","CYP","CZE","DEU","DJI","DNK","DMA","DOM","DZA","ECU","EST","EGY","ESH","ERI","ESP","ETH","FIN","FJI","FLK","FSM","FRO","FRA","FX","GAB","GBR","GRD","GEO","GUF","GHA","GIB","GRL","GMB","GIN","GLP","GNQ","GRC","GS","GTM","GUM","GNB","GUY","HKG","HM","HND","HRV","HTI","HUN","IDN","IRL","ISR","IND","IO","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","MN
P","MTQ","MRT","MSR","MLT","MUS","MDV","MWI","MEX","MYS","MOZ","NAM","NCL","NER","NFK","N!
GA","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","TF","TGO","THA","TJK","TKL","TLS","TKM","TUN","TON","TUR","TTO","TUV","TWN","TZA","UKR","UGA","UM","USA","URY","UZB","VAT","VCT","VEN","VGB","VIR","VNM","VUT","WLF","WSM","YEM","YT","YUG","ZAF","ZMB","ZR","ZWE","A1","A2","O1"};
const char * GeoIP_country_name[247] = {"N/A","Asia/Pacific Region","Europe","Andorra","United Arab Emirates","Afghanistan","Antigua and Barbuda","Anguilla","Albania","Armenia","Netherlands Antilles","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","Weste
rn Sahara","Eritrea","Spain","Ethiopia","Finland","Fiji","Falkland Islands (Malvinas)","M!
icronesia, Federated States of","Faroe Islands","France","France, Metropolitan","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","Libyan Arab Jamahiriya","Morocco","Monaco","Moldova, Republic of","Madagascar","Marshall Islands","Macedonia, the Former Yugoslav Republic of","Mali","Myanmar","Mongolia","Macao","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","Puerto Rico","Palestinian Territory, Occupied","Portugal","Palau","Par
aguay","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","East Timor","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","Yugoslavia","South Africa","Zambia","Zaire","Zimbabwe",
+"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","Libyan Arab Jamahiriya","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, Occupied","Portugal","Palau","Paraguay","Qatar","Reunion",
"Romania","Russian Federation","Rwanda","Saudi Arabia","Solomon Islands","Seychelles","Su!
dan","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","East Timor","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","Yugoslavia","South Africa","Zambia","Zaire","Zimbabwe",
"Anonymous Proxy","Satellite Provider","Other"};
const char GeoIP_country_continent[247][3] = {"--","AS","EU","EU","AS","AS","SA","SA","EU","AS","SA","AF","AN","SA","OC","EU","OC","SA","AS","EU","SA","AS","EU","AF","EU","AS","AF","AF","SA","AS","SA","SA","SA","AS","AF","AF","EU","SA","NA","AS","AF","AF","AF","EU","AF","OC","SA","AF","AS","SA","SA","SA","AF","AS","AS","EU","EU","AF","EU","SA","SA","AF","SA","EU","AF","AF","AF","EU","AF","EU","OC","SA","OC","EU","EU","EU","AF","EU","SA","AS","SA","AF","EU","SA","AF","AF","SA","AF","EU","SA","SA","OC","AF","SA","AS","AF","SA","EU","SA","EU","AS","EU","AS","AS","AS","AS","AS","EU","EU","SA","AS","AS","AF","AS","AS","OC","AF","SA","AS","AS","AS","SA","AS","AS","AS","SA","EU","AS","AF","AF","EU","EU","EU","AF","AF","EU","EU","AF","OC","EU","AF","AS","AS","AS","OC","SA","AF","SA","EU","AF","AS","AF","NA","AS","AF","AF","OC","AF","OC","AF","SA","EU","EU","AS","OC","OC","OC","AS","SA","SA","OC
","OC","AS","AS","EU","SA","OC","SA","AS","EU","OC","SA","AS","AF","EU","AS","AF","AS","O!
C","AF","AF","EU","AS","AF","EU","EU","EU","AF","EU","AF","AF","SA","AF","SA","AS","AF","SA","AF","AF","AF","AS","AS","OC","AS","AF","OC","AS","AS","SA","OC","AS","AF","EU","AF","OC","NA","SA","AS","EU","SA","SA","SA","SA","AS","OC","OC","OC","AS","AF","EU","AF","AF","AF","AF"};
-const char * GeoIPDBDescription[NUM_DB_TYPES] = {NULL, "GeoIP Country Edition", "GeoIP City Edition, Rev 1", "GeoIP Region Edition, Rev 1", "GeoIP ISP Edition", "GeoIP Organization Edition", "GeoIP City Edition, Rev 0", "GeoIP Region Edition, Rev 0","GeoIP Proxy Edition"};
+const char * GeoIPDBDescription[NUM_DB_TYPES] = {NULL, "GeoIP Country Edition", "GeoIP City Edition, Rev 1", "GeoIP Region Edition, Rev 1", "GeoIP ISP Edition", "GeoIP Organization Edition", "GeoIP City Edition, Rev 0", "GeoIP Region Edition, Rev 0","GeoIP Proxy Edition","GeoIP ASNum Edition","GeoIP Netspeed Edition"};
-#ifdef WIN32
-#define GEOIPDATADIR "\\windows\\system32\\"
+char *_full_path_to(const char *file_name) {
+ char *path = malloc(sizeof(char) * 1024);
+
+#ifndef _WIN32
+ memset(path, 0, sizeof(char) * 1024);
+ snprintf(path, sizeof(char) * 1024 - 1, "%s/%s", GEOIPDATADIR, file_name);
+#else
+ char buf[MAX_PATH], *p, *q = NULL;
+ int len;
+ memset(buf, 0, sizeof(buf));
+ len = GetModuleFileName(GetModuleHandle(NULL), buf, sizeof(buf) - 1);
+ for (p = buf + len; p > buf; p--)
+ if (*p == '\\')
+ {
+ if (!q)
+ q = p;
+ else
+ *p = '/';
+ }
+ *q = 0;
+ memset(path, 0, sizeof(char) * 1024);
+ snprintf(path, sizeof(char) * 1024 - 1, "%s/%s", buf, file_name);
#endif
+ return path;
+}
+
char ** GeoIPDBFileName = NULL;
void _setup_dbfilename() {
if (NULL == GeoIPDBFileName) {
GeoIPDBFileName = malloc(sizeof(char *) * NUM_DB_TYPES);
memset(GeoIPDBFileName, 0, sizeof(char *) * NUM_DB_TYPES);
- GeoIPDBFileName[GEOIP_COUNTRY_EDITION] = GEOIPDATADIR "/GeoIP.dat";
- GeoIPDBFileName[GEOIP_REGION_EDITION_REV0] = GEOIPDATADIR "/GeoIPRegion.dat";
- GeoIPDBFileName[GEOIP_REGION_EDITION_REV1] = GEOIPDATADIR "/GeoIPRegion.dat";
- GeoIPDBFileName[GEOIP_CITY_EDITION_REV0] = GEOIPDATADIR "/GeoIPCity.dat";
- GeoIPDBFileName[GEOIP_CITY_EDITION_REV1] = GEOIPDATADIR "/GeoIPCity.dat";
- GeoIPDBFileName[GEOIP_ISP_EDITION] = GEOIPDATADIR "/GeoIPISP.dat";
- GeoIPDBFileName[GEOIP_ORG_EDITION] = GEOIPDATADIR "/GeoIPOrg.dat";
- GeoIPDBFileName[GEOIP_PROXY_EDITION] = GEOIPDATADIR "/GeoIPProxy.dat";
- GeoIPDBFileName[GEOIP_ASNUM_EDITION] = GEOIPDATADIR "/GeoIPASNum.dat";
- }
-}
-int _check_mtime(GeoIP *gi) {
- struct stat buf;
-
- if (gi->flags & GEOIP_CHECK_CACHE) {
- if (fstat(fileno(gi->GeoIPDatabase), &buf) != -1) {
- if (buf.st_mtime > gi->mtime) {
- /* GeoIP Database file updated, reload database into memory cache */
- if (realloc(gi->cache, buf.st_size) != NULL) {
- if (fread(gi->cache, sizeof(unsigned char), buf.st_size, gi->GeoIPDatabase) != (size_t) buf.st_size) {
- fprintf(stderr,"Error reading file %s\n",gi->file_path);
- return -1;
- }
- gi->mtime = buf.st_mtime;
+ GeoIPDBFileName[GEOIP_COUNTRY_EDITION] = _full_path_to("GeoIP.dat");
+ GeoIPDBFileName[GEOIP_REGION_EDITION_REV0] = _full_path_to("GeoIPRegion.dat");
+ GeoIPDBFileName[GEOIP_REGION_EDITION_REV1] = _full_path_to("GeoIPRegion.dat");
+ GeoIPDBFileName[GEOIP_CITY_EDITION_REV0] = _full_path_to("GeoIPCity.dat");
+ GeoIPDBFileName[GEOIP_CITY_EDITION_REV1] = _full_path_to("GeoIPCity.dat");
+ GeoIPDBFileName[GEOIP_ISP_EDITION] = _full_path_to("GeoIPISP.dat");
+ GeoIPDBFileName[GEOIP_ORG_EDITION] = _full_path_to("GeoIPOrg.dat");
+ GeoIPDBFileName[GEOIP_PROXY_EDITION] = _full_path_to("GeoIPProxy.dat");
+ GeoIPDBFileName[GEOIP_ASNUM_EDITION] = _full_path_to("GeoIPASNum.dat");
+ GeoIPDBFileName[GEOIP_NETSPEED_EDITION] = _full_path_to("GeoIPNetSpeed.dat");
}
}
- }
- }
- return 0;
-}
int _file_exists(const char *file_name) {
struct stat file_stat;
@@ -175,12 +187,45 @@
}
}
if (gi->databaseType == GEOIP_COUNTRY_EDITION ||
- gi->databaseType == GEOIP_PROXY_EDITION) {
+ gi->databaseType == GEOIP_PROXY_EDITION ||
+ gi->databaseType == GEOIP_NETSPEED_EDITION) {
gi->databaseSegments = malloc(sizeof(int));
gi->databaseSegments[0] = COUNTRY_BEGIN;
}
}
+int _check_mtime(GeoIP *gi) {
+ struct stat buf;
+
+ if (gi->flags & GEOIP_CHECK_CACHE) {
+ if (fstat(fileno(gi->GeoIPDatabase), &buf) != -1) {
+ if (buf.st_mtime > gi->mtime) {
+ /* GeoIP Database file updated */
+ if (gi->flags & GEOIP_MEMORY_CACHE) {
+ /* reload database into memory cache */
+ if (realloc(gi->cache, buf.st_size) != NULL) {
+ if (fread(gi->cache, sizeof(unsigned char), buf.st_size, gi->GeoIPDatabase) != (size_t) buf.st_size) {
+ fprintf(stderr,"Error reading file %s\n",gi->file_path);
+ return -1;
+ }
+ gi->mtime = buf.st_mtime;
+ }
+ } else {
+ /* refresh filehandle */
+ fclose(gi->GeoIPDatabase);
+ gi->GeoIPDatabase = fopen(gi->file_path,"rb");
+ if (gi->GeoIPDatabase == NULL) {
+ fprintf(stderr,"Error Opening file %s\n",gi->file_path);
+ return -1;
+ }
+ _setup_segments(gi);
+ }
+ }
+ }
+ }
+ return 0;
+}
+
unsigned int _seek_record (GeoIP *gi, unsigned long ipnum) {
int depth;
unsigned int x;
@@ -194,9 +239,11 @@
_check_mtime(gi);
for (depth = 31; depth >= 0; depth--) {
if (gi->cache == NULL) {
+ /* read from disk */
fseek(gi->GeoIPDatabase, (long)gi->record_length * 2 * offset, SEEK_SET);
fread(stack_buffer,gi->record_length,2,gi->GeoIPDatabase);
} else {
+ /* simply point to record in memory */
buf = gi->cache + (long)gi->record_length * 2 *offset;
}
@@ -310,8 +357,14 @@
GeoIP* GeoIP_open (const char * filename, int flags) {
struct stat buf;
+ GeoIP *gi;
+#ifdef _WIN32
+ WSADATA wsa;
+ if (WSAStartup(MAKEWORD(1, 1), &wsa) != 0)
+ return NULL;
+#endif
- GeoIP *gi = (GeoIP *)malloc(sizeof(GeoIP));
+ gi = (GeoIP *)malloc(sizeof(GeoIP));
if (gi == NULL)
return NULL;
gi->file_path = malloc(sizeof(char) * (strlen(filename)+1));
@@ -380,24 +433,56 @@
return (country_id > 0) ? GeoIP_country_name[country_id] : NULL;
}
+unsigned long lookupaddress (const char *host) {
+ unsigned long addr = inet_addr(host);
+ struct hostent phe2;
+ struct hostent * phe = &phe2;
+ char *buf = NULL;
+ int buflength = 16384;
+ int herr = 0;
+ int result = 0;
+ buf = malloc(buflength);
+ if (addr == INADDR_NONE) {
+#ifdef WIN32
+ phe = gethostbyname(host);
+#else
+ while (1) {
+ /* we use gethostbyname_r here because it is thread-safe and gethostbyname is not */
+ result = gethostbyname_r(host,&phe2,buf,buflength,&phe,&herr);
+ if (herr != ERANGE)
+ break;
+ if (result == 0)
+ break;
+ /* double the buffer if the buffer is too small */
+ buflength = buflength * 2;
+ buf = realloc(buf,buflength);
+ }
+#endif
+ if (!phe)
+ return 0;
+ if (result != 0)
+ return 0;
+ addr = *((unsigned long *) phe->h_addr_list[0]);
+ }
+ free(buf);
+ return ntohl(addr);
+}
+
int GeoIP_id_by_name (GeoIP* gi, const char *name) {
unsigned long ipnum;
int ret;
- struct hostent * host;
if (name == NULL) {
return 0;
}
- if (gi->databaseType != GEOIP_COUNTRY_EDITION && gi->databaseType != GEOIP_PROXY_EDITION) {
+ if (gi->databaseType != GEOIP_COUNTRY_EDITION && gi->databaseType != GEOIP_PROXY_EDITION && gi->databaseType != GEOIP_NETSPEED_EDITION) {
printf("Invalid database type %s, expected %s\n", GeoIPDBDescription[(int)gi->databaseType], GeoIPDBDescription[GEOIP_COUNTRY_EDITION]);
return 0;
}
- host = gethostbyname(name);
- if (host == NULL) {
+ if (!(ipnum = lookupaddress(name)))
return 0;
- }
- ipnum = ntohl(*((uint32_t*)host->h_addr_list[0]));
ret = _seek_record(gi, ipnum) - COUNTRY_BEGIN;
return ret;
+
}
const char *GeoIP_country_code_by_addr (GeoIP* gi, const char *addr) {
@@ -420,6 +505,12 @@
return GeoIP_country_name[country_id];
}
+const char *GeoIP_country_code_by_ipnum (GeoIP* gi, unsigned long ipnum) {
+ int country_id;
+ country_id = GeoIP_id_by_ipnum(gi, ipnum);
+ return (country_id > 0) ? GeoIP_country_code[country_id] : NULL;
+}
+
int GeoIP_country_id_by_addr (GeoIP* gi, const char *addr) {
return GeoIP_id_by_addr(gi, addr);
}
@@ -434,8 +525,12 @@
if (addr == NULL) {
return 0;
}
- if (gi->databaseType != GEOIP_COUNTRY_EDITION && gi->databaseType != GEOIP_PROXY_EDITION) {
- printf("Invalid database type %s, expected %s\n", GeoIPDBDescription[(int)gi->databaseType], GeoIPDBDescription[GEOIP_COUNTRY_EDITION]);
+ if (gi->databaseType != GEOIP_COUNTRY_EDITION &&
+ gi->databaseType != GEOIP_PROXY_EDITION &&
+ gi->databaseType != GEOIP_NETSPEED_EDITION) {
+ printf("Invalid database type %s, expected %s\n",
+ GeoIPDBDescription[(int)gi->databaseType],
+ GeoIPDBDescription[GEOIP_COUNTRY_EDITION]);
return 0;
}
ipnum = _addr_to_num(addr);
@@ -443,6 +538,23 @@
return ret;
}
+int GeoIP_id_by_ipnum (GeoIP* gi, unsigned long ipnum) {
+ int ret;
+ if (ipnum == 0) {
+ return 0;
+ }
+ if (gi->databaseType != GEOIP_COUNTRY_EDITION &&
+ gi->databaseType != GEOIP_PROXY_EDITION &&
+ gi->databaseType != GEOIP_NETSPEED_EDITION) {
+ printf("Invalid database type %s, expected %s\n",
+ GeoIPDBDescription[(int)gi->databaseType],
+ GeoIPDBDescription[GEOIP_COUNTRY_EDITION]);
+ return 0;
+ }
+ ret = _seek_record(gi, ipnum) - COUNTRY_BEGIN;
+ return ret;
+}
+
char *GeoIP_database_info (GeoIP* gi) {
int i;
unsigned char buf[3];
@@ -560,7 +672,6 @@
GeoIPRegion * GeoIP_region_by_name (GeoIP* gi, const char *name) {
unsigned long ipnum;
- struct hostent * host;
if (name == NULL) {
return 0;
}
@@ -569,11 +680,8 @@
printf("Invalid database type %s, expected %s\n", GeoIPDBDescription[(int)gi->databaseType], GeoIPDBDescription[GEOIP_REGION_EDITION_REV1]);
return 0;
}
- host = gethostbyname(name);
- if (host == NULL) {
+ if (!(ipnum = lookupaddress(name)))
return 0;
- }
- ipnum = ntohl(*((uint32_t*)host->h_addr_list[0]));
return _get_region(gi, ipnum);
}
@@ -625,15 +733,11 @@
char *GeoIP_name_by_name (GeoIP* gi, const char *name) {
unsigned long ipnum;
- struct hostent * host;
if (name == NULL) {
return 0;
}
- host = gethostbyname(name);
- if (host == NULL) {
+ if (!(ipnum = lookupaddress(name)))
return 0;
- }
- ipnum = ntohl(*((uint32_t*)host->h_addr_list[0]));
return _get_name(gi, ipnum);
}
Modified: trunk/modules/statserv/geoip/GeoIP.h
==============================================================================
--- trunk/modules/statserv/geoip/GeoIP.h (original)
+++ trunk/modules/statserv/geoip/GeoIP.h Sun Apr 3 07:03:20 2005
@@ -70,6 +70,7 @@
GEOIP_REGION_EDITION_REV1 = 3,
GEOIP_PROXY_EDITION = 8,
GEOIP_ASNUM_EDITION = 9,
+ GEOIP_NETSPEED_EDITION = 10,
} GeoIPDBTypes;
typedef enum {
@@ -78,6 +79,13 @@
GEOIP_HTTP_CLIENT_IP_PROXY = 3,
} GeoIPProxyTypes;
+typedef enum {
+ GEOIP_UNKNOWN_SPEED = 0,
+ GEOIP_DIALUP_SPEED = 1,
+ GEOIP_CABLEDSL_SPEED = 2,
+ GEOIP_CORPORATE_SPEED = 3,
+} GeoIPNetspeedValues;
+
extern char **GeoIPDBFileName;
extern const char * GeoIPDBDescription[NUM_DB_TYPES];
extern const char *GeoIPCountryDBFileName;
@@ -108,6 +116,7 @@
GEOIP_API const char *GeoIP_country_code3_by_name (GeoIP* gi, const char *host);
GEOIP_API const char *GeoIP_country_name_by_addr (GeoIP* gi, const char *addr);
GEOIP_API const char *GeoIP_country_name_by_name (GeoIP* gi, const char *host);
+GEOIP_API const char *GeoIP_country_code_by_ipnum (GeoIP* gi, unsigned long ipnum);
/* Deprecated - for backwards compatibility only */
GEOIP_API int GeoIP_country_id_by_addr (GeoIP* gi, const char *addr);
@@ -118,6 +127,7 @@
GEOIP_API int GeoIP_id_by_addr (GeoIP* gi, const char *addr);
GEOIP_API int GeoIP_id_by_name (GeoIP* gi, const char *host);
+GEOIP_API int GeoIP_id_by_ipnum (GeoIP* gi, unsigned long ipnum);
GEOIP_API GeoIPRegion * GeoIP_region_by_addr (GeoIP* gi, const char *addr);
GEOIP_API GeoIPRegion * GeoIP_region_by_name (GeoIP* gi, const char *host);
@@ -137,8 +147,6 @@
GEOIP_API unsigned int _seek_record (GeoIP *gi, unsigned long ipnum);
GEOIP_API unsigned long _addr_to_num (const char *addr);
-GEOIP_API void _setup_dbfilename();
-
#ifdef BSD
#define memcpy(dest, src, n) bcopy(src, dest, n)
#endif
Modified: trunk/modules/statserv/geoip/GeoIPCity.c
==============================================================================
--- trunk/modules/statserv/geoip/GeoIPCity.c (original)
+++ trunk/modules/statserv/geoip/GeoIPCity.c Sun Apr 3 07:03:20 2005
@@ -20,12 +20,14 @@
#include "GeoIP.h"
#include "GeoIPCity.h"
-#ifndef WIN32
+#ifndef _WIN32
#include <netdb.h>
+#include <netinet/in.h> /* For ntohl */
#else
+#include <windows.h>
#include <winsock.h>
+#define uint32_t unsigned int
#endif
-#include <netinet/in.h> /* For ntohl */
#include <sys/types.h> /* For uint32_t */
#ifdef HAVE_STDINT_H
#include <stdint.h> /* For uint32_t */
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.