diff --git a/CMake/GeoIP.cmake b/CMake/GeoIP.cmake index 0f29bd5..5961a0e 100644 --- a/CMake/GeoIP.cmake +++ b/CMake/GeoIP.cmake @@ -10,7 +10,7 @@ CHECK_LIBRARY_EXISTS(GeoIP GeoIP_open /usr/lib HAVE_LIBGEOIP) if(${HAVE_LIBGEOIP}) # Find library that contains version number in the file name. execute_process( - COMMAND find /usr/lib -name "xlibGeoIP.*.*.*.*" + COMMAND find /usr/lib -name "libGeoIP.*.*.*.*" COMMAND cut -d . -f 2-5 COMMAND sort COMMAND tail -1 diff --git a/constants.h b/constants.h new file mode 100644 index 0000000..05dac5e --- /dev/null +++ b/constants.h @@ -0,0 +1,28 @@ +GEOIP_CONST(GEOIP_COUNTRY_EDITION) +GEOIP_CONST(GEOIP_REGION_EDITION_REV0) +GEOIP_CONST(GEOIP_CITY_EDITION_REV0) +GEOIP_CONST(GEOIP_ORG_EDITION) +GEOIP_CONST(GEOIP_ISP_EDITION) +GEOIP_CONST(GEOIP_CITY_EDITION_REV1) +GEOIP_CONST(GEOIP_REGION_EDITION_REV1) +GEOIP_CONST(GEOIP_PROXY_EDITION) +GEOIP_CONST(GEOIP_ASNUM_EDITION) +GEOIP_CONST(GEOIP_NETSPEED_EDITION) +GEOIP_CONST(GEOIP_NETSPEED_EDITION_REV1) +GEOIP_CONST(GEOIP_DOMAIN_EDITION) + +#if LIBGEOIP_VERSION >= 1004005 +GEOIP_CONST(GEOIP_COUNTRY_EDITION_V6) +GEOIP_CONST(GEOIP_CITY_EDITION_REV0_V6) +GEOIP_CONST(GEOIP_ORG_EDITION_V6) +GEOIP_CONST(GEOIP_ISP_EDITION_V6) +GEOIP_CONST(GEOIP_CITY_EDITION_REV1_V6) +GEOIP_CONST(GEOIP_ASNUM_EDITION_V6) +GEOIP_CONST(GEOIP_DOMAIN_EDITION_V6) +GEOIP_CONST(GEOIP_NETSPEED_EDITION_REV1_V6) +#endif + +GEOIP_CONST(GEOIP_UNKNOWN_SPEED) +GEOIP_CONST(GEOIP_DIALUP_SPEED) +GEOIP_CONST(GEOIP_CABLEDSL_SPEED) +GEOIP_CONST(GEOIP_CORPORATE_SPEED) diff --git a/ext_geoip.cpp b/ext_geoip.cpp index bce43ff..f76bddc 100644 --- a/ext_geoip.cpp +++ b/ext_geoip.cpp @@ -14,7 +14,7 @@ | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ - | Authors: Matthew Fonda, Olivier Hill, Anthon Pang | + | Authors: Matthew Fonda, Olivier Hill, Anthon Pang, Adam Saponara | +----------------------------------------------------------------------+ */ @@ -27,665 +27,280 @@ namespace HPHP { // Database types recognized by geoip_database_info() geoip_db_avail(), and geoip_db_filename() -const int64_t k_GEOIP_COUNTRY_EDITION = GEOIP_COUNTRY_EDITION; -const StaticString s_GEOIP_COUNTRY_EDITION("GEOIP_COUNTRY_EDITION"); -const int64_t k_GEOIP_REGION_EDITION_REV0 = GEOIP_REGION_EDITION_REV0; -const StaticString s_GEOIP_REGION_EDITION_REV0("GEOIP_REGION_EDITION_REV0"); -const int64_t k_GEOIP_CITY_EDITION_REV0 = GEOIP_CITY_EDITION_REV0; -const StaticString s_GEOIP_CITY_EDITION_REV0("GEOIP_CITY_EDITION_REV0"); -const int64_t k_GEOIP_ORG_EDITION = GEOIP_ORG_EDITION; -const StaticString s_GEOIP_ORG_EDITION("GEOIP_ORG_EDITION"); -const int64_t k_GEOIP_ISP_EDITION = GEOIP_ISP_EDITION; -const StaticString s_GEOIP_ISP_EDITION("GEOIP_ISP_EDITION"); -const int64_t k_GEOIP_CITY_EDITION_REV1 = GEOIP_CITY_EDITION_REV1; -const StaticString s_GEOIP_CITY_EDITION_REV1("GEOIP_CITY_EDITION_REV1"); -const int64_t k_GEOIP_REGION_EDITION_REV1 = GEOIP_REGION_EDITION_REV1; -const StaticString s_GEOIP_REGION_EDITION_REV1("GEOIP_REGION_EDITION_REV1"); -const int64_t k_GEOIP_PROXY_EDITION = GEOIP_PROXY_EDITION; -const StaticString s_GEOIP_PROXY_EDITION("GEOIP_PROXY_EDITION"); -const int64_t k_GEOIP_ASNUM_EDITION = GEOIP_ASNUM_EDITION; -const StaticString s_GEOIP_ASNUM_EDITION("GEOIP_ASNUM_EDITION"); -const int64_t k_GEOIP_NETSPEED_EDITION = GEOIP_NETSPEED_EDITION; -const StaticString s_GEOIP_NETSPEED_EDITION("GEOIP_NETSPEED_EDITION"); -const int64_t k_GEOIP_NETSPEED_EDITION_REV1 = GEOIP_NETSPEED_EDITION_REV1; -const StaticString s_GEOIP_NETSPEED_EDITION_REV1("GEOIP_NETSPEED_EDITION_REV1"); -const int64_t k_GEOIP_DOMAIN_EDITION = GEOIP_DOMAIN_EDITION; -const StaticString s_GEOIP_DOMAIN_EDITION("GEOIP_DOMAIN_EDITION"); - -// Internet connection speed constants returned by geoip_id_by_name() -const int64_t k_GEOIP_UNKNOWN_SPEED = GEOIP_UNKNOWN_SPEED; -const StaticString s_GEOIP_UNKNOWN_SPEED("GEOIP_UNKNOWN_SPEED"); -const int64_t k_GEOIP_DIALUP_SPEED = GEOIP_DIALUP_SPEED; -const StaticString s_GEOIP_DIALUP_SPEED("GEOIP_DIALUP_SPEED"); -const int64_t k_GEOIP_CABLEDSL_SPEED = GEOIP_CABLEDSL_SPEED; -const StaticString s_GEOIP_CABLEDSL_SPEED("GEOIP_CABLEDSL_SPEED"); -const int64_t k_GEOIP_CORPORATE_SPEED = GEOIP_CORPORATE_SPEED; -const StaticString s_GEOIP_CORPORATE_SPEED("GEOIP_CORPORATE_SPEED"); +#define GEOIP_CONST(c) \ + const int64_t k_ ## c = c; \ + const StaticString s_ ## c (#c); +#include "constants.h" +#undef GEOIP_CONST static Mutex filename_mutex; -static Variant HHVM_FUNCTION(geoip_asnum_by_name, const String& hostname) { - Lock lock(filename_mutex); - GeoIP *gi; - char *asnum; - - if ( ! GeoIP_db_avail(GEOIP_ASNUM_EDITION)) { - if (NULL != GeoIPDBFileName[GEOIP_ASNUM_EDITION]) { - raise_warning("geoip_asnum_by_name(): Required database not available at %s.", GeoIPDBFileName[GEOIP_ASNUM_EDITION]); - } else { - raise_warning("geoip_asnum_by_name(): Required database not available."); - } - - return null_variant; - } - - gi = GeoIP_open_type(GEOIP_ASNUM_EDITION, GEOIP_STANDARD); - - if (NULL == gi) { - if (NULL != GeoIPDBFileName[GEOIP_ASNUM_EDITION]) { - raise_warning("geoip_asnum_by_name(): Unable to open database %s.", GeoIPDBFileName[GEOIP_ASNUM_EDITION]); - } else { - raise_warning("geoip_asnum_by_name(): Unable to open database."); - } - - return null_variant; - } - - asnum = GeoIP_name_by_name(gi, hostname.c_str()); - - GeoIP_delete(gi); - - if (NULL == asnum) { - return Variant(false); - } - - Variant value = Variant(String(asnum)); - - free(asnum); - - return value; +// Return true if db_type is a valid geoip db type +static bool geoip_is_db_valid(int db_type) { + return db_type >= 0 && db_type < NUM_DB_TYPES ? true : false; } -static Variant HHVM_FUNCTION(geoip_continent_code_by_name, const String& hostname) { - Lock lock(filename_mutex); - GeoIP *gi; - int id; - - if ( ! GeoIP_db_avail(GEOIP_COUNTRY_EDITION)) { - if (NULL != GeoIPDBFileName[GEOIP_COUNTRY_EDITION]) { - raise_warning("geoip_continent_code_by_name(): Required database not available at %s.", GeoIPDBFileName[GEOIP_COUNTRY_EDITION]); - } else { - raise_warning("geoip_continent_code_by_name(): Required database not available."); - } - - return null_variant; - } - - gi = GeoIP_open_type(GEOIP_COUNTRY_EDITION, GEOIP_STANDARD); - - if (NULL == gi) { - if (NULL != GeoIPDBFileName[GEOIP_COUNTRY_EDITION]) { - raise_warning("geoip_continent_code_by_name(): Unable to open database %s.", GeoIPDBFileName[GEOIP_COUNTRY_EDITION]); +// Safe wrapper for GeoIP_open_type +static GeoIP* geoip_open_db(int db_type, int db_type_fallback, int use_fallback) { + GeoIP* gi; + int db_used; + gi = nullptr; + if (!geoip_is_db_valid(db_type) + || (use_fallback && !geoip_is_db_valid(db_type_fallback)) + ) { + raise_warning("Database type given is out of bound."); + return nullptr; + } else if (GeoIP_db_avail(db_type)) { + db_used = db_type; + gi = GeoIP_open_type(db_type, GEOIP_STANDARD); + } else if (use_fallback && GeoIP_db_avail(db_type_fallback)) { + db_used = db_type_fallback; + gi = GeoIP_open_type(db_type_fallback, GEOIP_STANDARD); + } else { + if (GeoIPDBFileName[db_type]) { + raise_warning("Required database not available at %s.", GeoIPDBFileName[db_type]); } else { - raise_warning("geoip_continent_code_by_name(): Unable to open database."); + raise_warning("Required database not available."); } - - return null_variant; + return nullptr; } - - id = GeoIP_id_by_name(gi, hostname.c_str()); - GeoIP_delete(gi); - - if (id == 0) { - return Variant(false); + if (!gi) { + raise_warning("Unable to open database %s.", GeoIPDBFileName[db_used]); } - - return Variant(String(GeoIP_country_continent[id])); + return gi; } -static Variant HHVM_FUNCTION(geoip_country_code_by_name, const String& hostname) { +// Generic pattern for most functions: open db, callback, close db +static Variant geoip_generic( + int db_type, + int db_type_fallback, + int use_fallback, + std::function callback_func +) { Lock lock(filename_mutex); - GeoIP *gi; - const char *country_code; - - if ( ! GeoIP_db_avail(GEOIP_COUNTRY_EDITION)) { - if (NULL != GeoIPDBFileName[GEOIP_COUNTRY_EDITION]) { - raise_warning("geoip_country_code_by_name(): Required database not available at %s.", GeoIPDBFileName[GEOIP_COUNTRY_EDITION]); - } else { - raise_warning("geoip_country_code_by_name(): Required database not available."); - } - - return null_variant; - } - - gi = GeoIP_open_type(GEOIP_COUNTRY_EDITION, GEOIP_STANDARD); - - if (NULL == gi) { - if (NULL != GeoIPDBFileName[GEOIP_COUNTRY_EDITION]) { - raise_warning("geoip_country_code_by_name(): Unable to open database %s.", GeoIPDBFileName[GEOIP_COUNTRY_EDITION]); - } else { - raise_warning("geoip_country_code_by_name(): Unable to open database."); - } - + GeoIP* gi; + Variant retval; + if (!(gi = geoip_open_db(db_type, db_type_fallback, use_fallback))) { return null_variant; } - - country_code = GeoIP_country_code_by_name(gi, hostname.c_str()); + retval = callback_func(gi); GeoIP_delete(gi); - - if (NULL == country_code) { - return Variant(false); - } - - return Variant(String(country_code)); + return retval; } -static Variant HHVM_FUNCTION(geoip_country_code3_by_name, const String& hostname) { - Lock lock(filename_mutex); - GeoIP *gi; - const char *country_code3; - - if ( ! GeoIP_db_avail(GEOIP_COUNTRY_EDITION)) { - if (NULL != GeoIPDBFileName[GEOIP_COUNTRY_EDITION]) { - raise_warning("geoip_country_code3_by_name(): Required database not available at %s.", GeoIPDBFileName[GEOIP_COUNTRY_EDITION]); - } else { - raise_warning("geoip_country_code3_by_name(): Required database not available."); +// Generic pattern for most string-return functions: Call geoip_func, maybe free +static Variant geoip_generic_string( + int db_type, + int db_type_fallback, + int use_fallback, + char* (*geoip_func)(GeoIP* gi, const char* host), + const String& hostname, + int do_free +) { + return geoip_generic(db_type, db_type_fallback, use_fallback, [&] (GeoIP* gi) -> Variant { + char* str = geoip_func(gi, hostname.c_str()); + if (!str) { + return Variant(false); } - - return null_variant; - } - - gi = GeoIP_open_type(GEOIP_COUNTRY_EDITION, GEOIP_STANDARD); - - if (NULL == gi) { - if (NULL != GeoIPDBFileName[GEOIP_COUNTRY_EDITION]) { - raise_warning("geoip_country_code3_by_name(): Unable to open database %s.", GeoIPDBFileName[GEOIP_COUNTRY_EDITION]); - } else { - raise_warning("geoip_country_code3_by_name(): Unable to open database."); - } - - return null_variant; - } - - country_code3 = GeoIP_country_code3_by_name(gi, hostname.c_str()); - GeoIP_delete(gi); - - if (NULL == country_code3) { - return Variant(false); - } - - return Variant(String(country_code3)); + Variant retval = Variant(String(str)); + if (do_free) free(str); + return retval; + }); } -static Variant HHVM_FUNCTION(geoip_country_name_by_name, const String& hostname) { - Lock lock(filename_mutex); - GeoIP *gi; - const char *country_name; - - if ( ! GeoIP_db_avail(GEOIP_COUNTRY_EDITION)) { - if (NULL != GeoIPDBFileName[GEOIP_COUNTRY_EDITION]) { - raise_warning("geoip_country_name_by_name(): Required database not available at %s.", GeoIPDBFileName[GEOIP_COUNTRY_EDITION]); - } else { - raise_warning("geoip_country_name_by_name(): Required database not available."); +// Generic pattern for record-return functions: Call geoip_func, build array, +// free +static Variant geoip_generic_record( + int db_type, + int db_type_fallback, + int use_fallback, + GeoIPRecord* (*geoip_func)(GeoIP* gi, const char* host), + const String& hostname +) { + return geoip_generic(db_type, db_type_fallback, use_fallback, [&] (GeoIP* gi) -> Variant { + GeoIPRecord* gi_record = geoip_func(gi, hostname.c_str()); + if (!gi_record) { + return Variant(false); } - - return null_variant; - } - - gi = GeoIP_open_type(GEOIP_COUNTRY_EDITION, GEOIP_STANDARD); - - if (NULL == gi) { - if (NULL != GeoIPDBFileName[GEOIP_COUNTRY_EDITION]) { - raise_warning("geoip_country_name_by_name(): Unable to open database %s.", GeoIPDBFileName[GEOIP_COUNTRY_EDITION]); - } else { - raise_warning("geoip_country_name_by_name(): Unable to open database."); - } - - return null_variant; - } - - country_name = GeoIP_country_name_by_name(gi, hostname.c_str()); - GeoIP_delete(gi); - - if (NULL == country_name) { - return Variant(false); - } - - return Variant(String(country_name)); + Array record = Array::Create(); +#if LIBGEOIP_VERSION >= 1004003 + record.add(String("continent_code"), Variant(String((NULL == gi_record->continent_code) ? "" : gi_record->continent_code))); +#endif + record.add(String("country_code"), Variant(String((NULL == gi_record->country_code) ? "" : gi_record->country_code))); + record.add(String("country_code3"), Variant(String((NULL == gi_record->country_code3) ? "" : gi_record->country_code3))); + record.add(String("country_name"), Variant(String((NULL == gi_record->country_name) ? "" : gi_record->country_name))); + record.add(String("region"), Variant(String((NULL == gi_record->region) ? "" : gi_record->region))); + record.add(String("city"), Variant(String((NULL == gi_record->city) ? "" : gi_record->city))); + record.add(String("postal_code"), Variant(String((NULL == gi_record->postal_code) ? "" : gi_record->postal_code))); + record.add(String("latitude"), Variant((double) gi_record->latitude)); + record.add(String("longitude"), Variant((double) gi_record->longitude)); +#if LIBGEOIP_VERSION >= 1004005 + record.add(String("dma_code"), Variant((int64_t) gi_record->metro_code)); +#else + record.add(String("dma_code"), Variant((int64_t) gi_record->dma_code)); +#endif + record.add(String("area_code"), Variant((int64_t) gi_record->area_code)); + GeoIPRecord_delete(gi_record); + return Variant(record); + }); } -static Variant HHVM_FUNCTION(geoip_database_info, int64_t database /* = GEOIP_COUNTRY_EDITION */) { - Lock lock(filename_mutex); - GeoIP *gi; - char *db_info; - - if (database < 0 || database >= NUM_DB_TYPES) { - raise_warning("geoip_database_info(): Database type given is out of bound."); - - return null_variant; - } - - if ( ! GeoIP_db_avail(database)) { - if (NULL != GeoIPDBFileName[database]) { - raise_warning("geoip_database_info(): Required database not available at %s.", GeoIPDBFileName[database]); - } else { - raise_warning("geoip_database_info(): Required database not available."); - } - - return null_variant; - } - - gi = GeoIP_open_type(database, GEOIP_STANDARD); - - if (NULL == gi) { - if (NULL != GeoIPDBFileName[database]) { - raise_warning("geoip_database_info(): Unable to open database %s.", GeoIPDBFileName[database]); - } else { - raise_warning("geoip_database_info(): Unable to open database."); +// Generic pattern for region-return functions: Call geoip_func, build array, +// free +static Variant geoip_generic_region( + int db_type, + int db_type_fallback, + int use_fallback, + GeoIPRegion* (*geoip_func)(GeoIP* gi, const char* host), + const String& hostname +) { + return geoip_generic(db_type, db_type_fallback, use_fallback, [&] (GeoIP* gi) -> Variant { + GeoIPRegion* gi_region = geoip_func(gi, hostname.c_str()); + if (!gi_region) { + return Variant(false); } - - return null_variant; - } - - db_info = GeoIP_database_info(gi); - GeoIP_delete(gi); - - Variant value = Variant(String(db_info)); - - free(db_info); - - return value; + Array region = Array::Create(); + region.add(String("country_code"), Variant(String((NULL == gi_region->country_code) ? "" : gi_region->country_code))); + region.add(String("region"), Variant(String((NULL == gi_region->region) ? "" : gi_region->region))); + GeoIPRegion_delete(gi_region); + return Variant(region); + }); } -static Variant HHVM_FUNCTION(geoip_db_avail, int64_t database) { - Lock lock(filename_mutex); - - if (database < 0 || database >= NUM_DB_TYPES) { - raise_warning("geoip_db_avail(): Database type given is out of bound."); +// ===== HHVM_FUNCTIONs ======================================================== - return null_variant; - } - - return Variant((bool) GeoIP_db_avail(database)); +static Variant HHVM_FUNCTION(geoip_asnum_by_name, const String& hostname) { + return geoip_generic_string(GEOIP_ASNUM_EDITION, 0, 0, GeoIP_name_by_name, hostname, 1); } -static Variant HHVM_FUNCTION(geoip_db_filename, int64_t database) { - Lock lock(filename_mutex); - const char *filename; - - if (database < 0 || database >= NUM_DB_TYPES) { - raise_warning("geoip_db_filename(): Database type given is out of bound."); - - return null_variant; - } - - filename = GeoIPDBFileName[database]; - - if (NULL == filename) { - return null_variant; - } - - return Variant(String(filename)); +static Variant HHVM_FUNCTION(geoip_country_code_by_name, const String& hostname) { + return geoip_generic_string(GEOIP_COUNTRY_EDITION, 0, 0, (char* (*)(GeoIP*, const char*))GeoIP_country_code_by_name, hostname, 0); } -static Array HHVM_FUNCTION(geoip_db_get_all_info) { - Lock lock(filename_mutex); - Array info = Array::Create(); - - for (int i = 0; i < NUM_DB_TYPES; i++) { - if (NULL != GeoIPDBDescription[i]) { - Array row = Array::Create(); - - row.add(String("available"), Variant((bool) GeoIP_db_avail(i))); - - if (GeoIPDBDescription[i]) { - row.add(String("description"), Variant(String(GeoIPDBDescription[i]))); - } - - if (GeoIPDBFileName[i]) { - row.add(String("filename"), Variant(String(GeoIPDBFileName[i]))); - } - - info.set(i, Variant(row)); - } - } - - return info; +static Variant HHVM_FUNCTION(geoip_country_code3_by_name, const String& hostname) { + return geoip_generic_string(GEOIP_COUNTRY_EDITION, 0, 0, (char* (*)(GeoIP*, const char*))GeoIP_country_code3_by_name, hostname, 0); } -static Variant HHVM_FUNCTION(geoip_domain_by_name, const String& hostname) { - Lock lock(filename_mutex); - GeoIP *gi; - char *domain; - - if ( ! GeoIP_db_avail(GEOIP_DOMAIN_EDITION)) { - if (NULL != GeoIPDBFileName[GEOIP_DOMAIN_EDITION]) { - raise_warning("geoip_domain_by_name(): Required database not available at %s.", GeoIPDBFileName[GEOIP_DOMAIN_EDITION]); - } else { - raise_warning("geoip_domain_by_name(): Required database not available."); - } - - return null_variant; - } - - gi = GeoIP_open_type(GEOIP_DOMAIN_EDITION, GEOIP_STANDARD); +static Variant HHVM_FUNCTION(geoip_country_name_by_name, const String& hostname) { + return geoip_generic_string(GEOIP_COUNTRY_EDITION, 0, 0, (char* (*)(GeoIP*, const char*))GeoIP_country_name_by_name, hostname, 0); +} - if (NULL == gi) { - if (NULL != GeoIPDBFileName[GEOIP_DOMAIN_EDITION]) { - raise_warning("geoip_domain_by_name(): Unable to open database %s.", GeoIPDBFileName[GEOIP_DOMAIN_EDITION]); - } else { - raise_warning("geoip_domain_by_name(): Unable to open database."); +static Variant HHVM_FUNCTION(geoip_continent_code_by_name, const String& hostname) { + return geoip_generic(GEOIP_COUNTRY_EDITION, 0, 0, [&] (GeoIP* gi) -> Variant { + int id = GeoIP_id_by_name(gi, hostname.c_str()); + if (!id) { + return Variant(false); } - - return null_variant; - } - - domain = GeoIP_name_by_name(gi, hostname.c_str()); - - GeoIP_delete(gi); - - if (NULL == domain) { - return Variant(false); - } - - Variant value = Variant(String(domain)); - - free(domain); - - return value; + return Variant(String(GeoIP_country_continent[id])); + }); } static Variant HHVM_FUNCTION(geoip_id_by_name, const String& hostname) { - Lock lock(filename_mutex); - GeoIP *gi; - int netspeed; - - if ( ! GeoIP_db_avail(GEOIP_NETSPEED_EDITION)) { - if (NULL != GeoIPDBFileName[GEOIP_NETSPEED_EDITION]) { - raise_warning("geoip_id_by_name(): Required database not available at %s.", GeoIPDBFileName[GEOIP_NETSPEED_EDITION]); - } else { - raise_warning("geoip_id_by_name(): Required database not available."); - } - - return null_variant; - } - - gi = GeoIP_open_type(GEOIP_NETSPEED_EDITION, GEOIP_STANDARD); - - if (NULL == gi) { - if (NULL != GeoIPDBFileName[GEOIP_NETSPEED_EDITION]) { - raise_warning("geoip_id_by_name(): Unable to open database %s.", GeoIPDBFileName[GEOIP_NETSPEED_EDITION]); - } else { - raise_warning("geoip_id_by_name(): Unable to open database."); - } - - return null_variant; - } - - netspeed = GeoIP_id_by_name(gi, hostname.c_str()); - - GeoIP_delete(gi); - - return Variant((uint64_t) netspeed); + return geoip_generic(GEOIP_NETSPEED_EDITION, 0, 0, [&] (GeoIP* gi) -> Variant { + return Variant((uint64_t)GeoIP_id_by_name(gi, hostname.c_str())); + }); } -static Variant HHVM_FUNCTION(geoip_isp_by_name, const String& hostname) { - Lock lock(filename_mutex); - GeoIP *gi; - char *isp; - - if ( ! GeoIP_db_avail(GEOIP_ISP_EDITION)) { - if (NULL != GeoIPDBFileName[GEOIP_ISP_EDITION]) { - raise_warning("geoip_isp_by_name(): Required database not available at %s.", GeoIPDBFileName[GEOIP_ISP_EDITION]); - } else { - raise_warning("geoip_isp_by_name(): Required database not available."); - } - - return null_variant; - } - - gi = GeoIP_open_type(GEOIP_ISP_EDITION, GEOIP_STANDARD); - - if (NULL == gi) { - if (NULL != GeoIPDBFileName[GEOIP_ISP_EDITION]) { - raise_warning("geoip_isp_by_name(): Unable to open database %s.", GeoIPDBFileName[GEOIP_ISP_EDITION]); - } else { - raise_warning("geoip_isp_by_name(): Unable to open database."); - } - - return null_variant; - } - - isp = GeoIP_name_by_name(gi, hostname.c_str()); - - GeoIP_delete(gi); - - if (NULL == isp) { - return Variant(false); - } - - Variant value = Variant(String(isp)); +static Variant HHVM_FUNCTION(geoip_domain_by_name, const String& hostname) { + return geoip_generic_string(GEOIP_DOMAIN_EDITION, 0, 0, GeoIP_name_by_name, hostname, 1); +} - free(isp); - return value; +static Variant HHVM_FUNCTION(geoip_isp_by_name, const String& hostname) { + return geoip_generic_string(GEOIP_ISP_EDITION, 0, 0, GeoIP_name_by_name, hostname, 1); } #if LIBGEOIP_VERSION >= 1004008 static Variant HHVM_FUNCTION(geoip_netspeedcell_by_name, const String& hostname) { - Lock lock(filename_mutex); - GeoIP *gi; - char *netspeedcell; - - if ( ! GeoIP_db_avail(GEOIP_NETSPEED_EDITION_REV1)) { - if (NULL != GeoIPDBFileName[GEOIP_NETSPEED_EDITION_REV1]) { - raise_warning("geoip_netspeedcell_by_name(): Required database not available at %s.", GeoIPDBFileName[GEOIP_NETSPEED_EDITION_REV1]); - } else { - raise_warning("geoip_netspeedcell_by_name(): Required database not available."); - } - - return null_variant; - } - - gi = GeoIP_open_type(GEOIP_NETSPEED_EDITION_REV1, GEOIP_STANDARD); - - if (NULL == gi) { - if (NULL != GeoIPDBFileName[GEOIP_NETSPEED_EDITION_REV1]) { - raise_warning("geoip_netspeedcell_by_name(): Unable to open database %s.", GeoIPDBFileName[GEOIP_NETSPEED_EDITION_REV1]); - } else { - raise_warning("geoip_netspeedcell_by_name(): Unable to open database."); - } - - return null_variant; - } - - netspeedcell = GeoIP_name_by_name(gi, hostname.c_str()); - - GeoIP_delete(gi); - - if (NULL == netspeedcell) { - return Variant(false); - } - - Variant value = Variant(String(netspeedcell)); - - free(netspeedcell); - - return value; + return geoip_generic_string(GEOIP_NETSPEED_EDITION_REV1, 0, 0, GeoIP_name_by_name, hostname, 1); } #endif static Variant HHVM_FUNCTION(geoip_org_by_name, const String& hostname) { - Lock lock(filename_mutex); - GeoIP *gi; - char *org; - - if ( ! GeoIP_db_avail(GEOIP_ORG_EDITION)) { - if (NULL != GeoIPDBFileName[GEOIP_ORG_EDITION]) { - raise_warning("geoip_org_by_name(): Required database not available at %s.", GeoIPDBFileName[GEOIP_ORG_EDITION]); - } else { - raise_warning("geoip_org_by_name(): Required database not available."); - } - - return null_variant; - } - - gi = GeoIP_open_type(GEOIP_ORG_EDITION, GEOIP_STANDARD); - - if (NULL == gi) { - if (NULL != GeoIPDBFileName[GEOIP_ORG_EDITION]) { - raise_warning("geoip_org_by_name(): Unable to open database %s.", GeoIPDBFileName[GEOIP_ORG_EDITION]); - } else { - raise_warning("geoip_org_by_name(): Unable to open database."); - } - - return null_variant; - } - - org = GeoIP_name_by_name(gi, hostname.c_str()); - - GeoIP_delete(gi); - - if (NULL == org) { - return Variant(false); - } - - Variant value = Variant(String(org)); - - free(org); - - return value; + return geoip_generic_string(GEOIP_ORG_EDITION, 0, 0, GeoIP_name_by_name, hostname, 1); } static Variant HHVM_FUNCTION(geoip_record_by_name, const String& hostname) { - Lock lock(filename_mutex); - GeoIP *gi; - GeoIPRecord *gi_record; - - if ( ! GeoIP_db_avail(GEOIP_CITY_EDITION_REV0) && ! GeoIP_db_avail(GEOIP_CITY_EDITION_REV1)) { - if (NULL != GeoIPDBFileName[GEOIP_CITY_EDITION_REV0]) { - raise_warning("geoip_record_by_name(): Required database not available at %s.", GeoIPDBFileName[GEOIP_CITY_EDITION_REV0]); - } else { - raise_warning("geoip_record_by_name(): Required database not available."); - } - - return null_variant; - } - - gi = GeoIP_open_type(GEOIP_CITY_EDITION_REV1, GEOIP_STANDARD); - - if (NULL == gi) { - gi = GeoIP_open_type(GEOIP_CITY_EDITION_REV0, GEOIP_STANDARD); - } - - if (NULL == gi) { - if (NULL != GeoIPDBFileName[GEOIP_CITY_EDITION_REV0]) { - raise_warning("geoip_record_by_name(): Unable to open database %s.", GeoIPDBFileName[GEOIP_CITY_EDITION_REV0]); - } else { - raise_warning("geoip_record_by_name(): Unable to open database."); - } - - return null_variant; - } - - gi_record = GeoIP_record_by_name(gi, hostname.c_str()); - - GeoIP_delete(gi); - - if (NULL == gi_record) { - return Variant(false); - } - - Array record = Array::Create(); - -#if LIBGEOIP_VERSION >= 1004003 - record.add(String("continent_code"), Variant(String((NULL == gi_record->continent_code) ? "" : gi_record->continent_code))); -#endif - record.add(String("country_code"), Variant(String((NULL == gi_record->country_code) ? "" : gi_record->country_code))); - record.add(String("country_code3"), Variant(String((NULL == gi_record->country_code3) ? "" : gi_record->country_code3))); - record.add(String("country_name"), Variant(String((NULL == gi_record->country_name) ? "" : gi_record->country_name))); - record.add(String("region"), Variant(String((NULL == gi_record->region) ? "" : gi_record->region))); - record.add(String("city"), Variant(String((NULL == gi_record->city) ? "" : gi_record->city))); - record.add(String("postal_code"), Variant(String((NULL == gi_record->postal_code) ? "" : gi_record->postal_code))); - record.add(String("latitude"), Variant((double) gi_record->latitude)); - record.add(String("longitude"), Variant((double) gi_record->longitude)); -#if LIBGEOIP_VERSION >= 1004005 - record.add(String("dma_code"), Variant((int64_t) gi_record->metro_code)); -#else - record.add(String("dma_code"), Variant((int64_t) gi_record->dma_code)); -#endif - record.add(String("area_code"), Variant((int64_t) gi_record->area_code)); - - GeoIPRecord_delete(gi_record); - - return Variant(record); + return geoip_generic_record(GEOIP_CITY_EDITION_REV1, GEOIP_CITY_EDITION_REV0, 1, GeoIP_record_by_name, hostname); } static Variant HHVM_FUNCTION(geoip_region_by_name, const String& hostname) { - Lock lock(filename_mutex); - GeoIP *gi; - GeoIPRegion *gi_region; + return geoip_generic_region(GEOIP_REGION_EDITION_REV1, GEOIP_REGION_EDITION_REV0, 1, GeoIP_region_by_name, hostname); +} - if ( ! GeoIP_db_avail(GEOIP_REGION_EDITION_REV0) && ! GeoIP_db_avail(GEOIP_REGION_EDITION_REV1)) { - if (NULL != GeoIPDBFileName[GEOIP_REGION_EDITION_REV0]) { - raise_warning("geoip_region_by_name(): Required database not available at %s.", GeoIPDBFileName[GEOIP_REGION_EDITION_REV0]); - } else { - raise_warning("geoip_region_by_name(): Required database not available."); - } +#if LIBGEOIP_VERSION >= 1004005 +static Variant HHVM_FUNCTION(geoip_asnum_by_name_v6, const String& hostname) { + return geoip_generic_string(GEOIP_ASNUM_EDITION_V6, 0, 0, GeoIP_name_by_name_v6, hostname, 1); +} - return null_variant; - } +static Variant HHVM_FUNCTION(geoip_country_code_by_name_v6, const String& hostname) { + return geoip_generic_string(GEOIP_COUNTRY_EDITION_V6, 0, 0, (char* (*)(GeoIP*, const char*))GeoIP_country_code_by_name_v6, hostname, 0); +} - gi = GeoIP_open_type(GEOIP_REGION_EDITION_REV1, GEOIP_STANDARD); +static Variant HHVM_FUNCTION(geoip_country_code3_by_name_v6, const String& hostname) { + return geoip_generic_string(GEOIP_COUNTRY_EDITION_V6, 0, 0, (char* (*)(GeoIP*, const char*))GeoIP_country_code3_by_name_v6, hostname, 0); +} - if (NULL == gi) { - gi = GeoIP_open_type(GEOIP_REGION_EDITION_REV0, GEOIP_STANDARD); - } +static Variant HHVM_FUNCTION(geoip_country_name_by_name_v6, const String& hostname) { + return geoip_generic_string(GEOIP_COUNTRY_EDITION_V6, 0, 0, (char* (*)(GeoIP*, const char*))GeoIP_country_name_by_name_v6, hostname, 0); +} - if (NULL == gi) { - if (NULL != GeoIPDBFileName[GEOIP_REGION_EDITION_REV0]) { - raise_warning("geoip_region_by_name(): Unable to open database %s.", GeoIPDBFileName[GEOIP_REGION_EDITION_REV0]); - } else { - raise_warning("geoip_region_by_name(): Unable to open database."); +static Variant HHVM_FUNCTION(geoip_continent_code_by_name_v6, const String& hostname) { + return geoip_generic(GEOIP_COUNTRY_EDITION_V6, 0, 0, [&] (GeoIP* gi) -> Variant { + int id = GeoIP_id_by_name_v6(gi, hostname.c_str()); + if (!id) { + return Variant(false); } + return Variant(String(GeoIP_country_continent[id])); + }); +} - return null_variant; - } +static Variant HHVM_FUNCTION(geoip_id_by_name_v6, const String& hostname) { + return geoip_generic(GEOIP_NETSPEED_EDITION_REV1_V6, 0, 0, [&] (GeoIP* gi) -> Variant { + return Variant((uint64_t)GeoIP_id_by_name_v6(gi, hostname.c_str())); + }); +} - gi_region = GeoIP_region_by_name(gi, hostname.c_str()); +static Variant HHVM_FUNCTION(geoip_domain_by_name_v6, const String& hostname) { + return geoip_generic_string(GEOIP_DOMAIN_EDITION_V6, 0, 0, GeoIP_name_by_name_v6, hostname, 1); +} - GeoIP_delete(gi); - if (NULL == gi_region) { - return Variant(false); - } +static Variant HHVM_FUNCTION(geoip_isp_by_name_v6, const String& hostname) { + return geoip_generic_string(GEOIP_ISP_EDITION_V6, 0, 0, GeoIP_name_by_name_v6, hostname, 1); +} - Array region = Array::Create(); +#if LIBGEOIP_VERSION >= 1004008 +static Variant HHVM_FUNCTION(geoip_netspeedcell_by_name_v6, const String& hostname) { + return geoip_generic_string(GEOIP_NETSPEED_EDITION_REV1_V6, 0, 0, GeoIP_name_by_name_v6, hostname, 1); +} +#endif - region.add(String("country_code"), Variant(String((NULL == gi_region->country_code) ? "" : gi_region->country_code))); - region.add(String("region"), Variant(String((NULL == gi_region->region) ? "" : gi_region->region))); +static Variant HHVM_FUNCTION(geoip_org_by_name_v6, const String& hostname) { + return geoip_generic_string(GEOIP_ORG_EDITION_V6, 0, 0, GeoIP_name_by_name_v6, hostname, 1); +} - GeoIPRegion_delete(gi_region); +static Variant HHVM_FUNCTION(geoip_record_by_name_v6, const String& hostname) { + return geoip_generic_record(GEOIP_CITY_EDITION_REV1_V6, GEOIP_CITY_EDITION_REV0_V6, 1, GeoIP_record_by_name_v6, hostname); +} - return Variant(region); +static Variant HHVM_FUNCTION(geoip_region_by_name_v6, const String& hostname) { + return geoip_generic_region(GEOIP_REGION_EDITION_REV1, GEOIP_REGION_EDITION_REV0, 1, GeoIP_region_by_name_v6, hostname); } +#endif + #if LIBGEOIP_VERSION >= 1004001 static Variant HHVM_FUNCTION(geoip_region_name_by_code, const String& country_code, const String& region_code) { - const char *region_name; - - if ( ! country_code.length() || ! region_code.length()) { + const char* region_name; + if (!country_code.length() || !region_code.length()) { raise_warning("geoip_region_name_by_code(): You need to specify the country and region codes."); - return Variant(false); } - region_name = GeoIP_region_name_by_code(country_code.c_str(), region_code.c_str()); - - if (NULL == region_name) { + if (!region_name) { return Variant(false); } - return Variant(String(region_name)); } #endif @@ -694,61 +309,101 @@ static Variant HHVM_FUNCTION(geoip_region_name_by_code, const String& country_co static Variant HHVM_FUNCTION(geoip_setup_custom_directory, const String& directory) { Lock lock(filename_mutex); char *custom_directory = (char *) directory.c_str(); - #if LIBGEOIP_VERSION >= 1004007 GeoIP_cleanup(); #else if (GeoIPDBFileName != NULL) { int i; - for (i = 0; i < NUM_DB_TYPES; i++) { if (GeoIPDBFileName[i]) { free(GeoIPDBFileName[i]); } } - free(GeoIPDBFileName); GeoIPDBFileName = NULL; } #endif GeoIP_setup_custom_directory(*custom_directory ? custom_directory : NULL); GeoIP_db_avail(GEOIP_COUNTRY_EDITION); - return null_variant; } #endif #if LIBGEOIP_VERSION >= 1004001 static Variant HHVM_FUNCTION(geoip_time_zone_by_country_and_region, const String& country_code, const Variant& region_code) { - const char *timezone; - const char *region; - - if ( ! country_code.length()) { + const char* timezone; + const char* region; + if (!country_code.length()) { raise_warning("geoip_time_zone_by_country_and_region(): You need to specify at least the country code."); - return Variant(false); } - if (region_code.isNull()) { region = NULL; } else if (region_code.isString()) { region = region_code.toString().c_str(); } else { raise_param_type_warning("geoip_time_zone_by_country_and_region", 2, KindOfString, region_code.getType()); - return null_variant; } - timezone = GeoIP_time_zone_by_country_and_region(country_code.c_str(), region); - - if (NULL == timezone) { + if (!timezone) { return Variant(false); } - return Variant(String(timezone)); } #endif +static Variant HHVM_FUNCTION(geoip_database_info, int64_t database /* = GEOIP_COUNTRY_EDITION */) { + return geoip_generic(database, 0, 0, [&] (GeoIP* gi) -> Variant { + char* db_info = GeoIP_database_info(gi); + Variant retval = Variant(String(db_info)); + free(db_info); + return retval; + }); +} + +static Variant HHVM_FUNCTION(geoip_db_avail, int64_t database) { + Lock lock(filename_mutex); + if (!geoip_is_db_valid(database)) { + raise_warning("geoip_db_avail(): Database type given is out of bound."); + return null_variant; + } + return Variant((bool) GeoIP_db_avail(database)); +} + +static Variant HHVM_FUNCTION(geoip_db_filename, int64_t database) { + Lock lock(filename_mutex); + const char* filename; + if (!geoip_is_db_valid(database)) { + raise_warning("geoip_db_filename(): Database type given is out of bound."); + return null_variant; + } + filename = GeoIPDBFileName[database]; + if (!filename) { + return null_variant; + } + return Variant(String(filename)); +} + +static Array HHVM_FUNCTION(geoip_db_get_all_info) { + Lock lock(filename_mutex); + Array info = Array::Create(); + for (int i = 0; i < NUM_DB_TYPES; i++) { + if (NULL != GeoIPDBDescription[i]) { + Array row = Array::Create(); + row.add(String("available"), Variant((bool) GeoIP_db_avail(i))); + if (GeoIPDBDescription[i]) { + row.add(String("description"), Variant(String(GeoIPDBDescription[i]))); + } + if (GeoIPDBFileName[i]) { + row.add(String("filename"), Variant(String(GeoIPDBFileName[i]))); + } + info.set(i, Variant(row)); + } + } + return info; +} + //////////////////////////////////////////////////////////////////////////////// struct geoipGlobals { @@ -780,46 +435,48 @@ class geoipExtension: public Extension { } virtual void moduleInit() override { - Native::registerConstant(s_GEOIP_COUNTRY_EDITION.get(), k_GEOIP_COUNTRY_EDITION); - Native::registerConstant(s_GEOIP_REGION_EDITION_REV0.get(), k_GEOIP_REGION_EDITION_REV0); - Native::registerConstant(s_GEOIP_CITY_EDITION_REV0.get(), k_GEOIP_CITY_EDITION_REV0); - Native::registerConstant(s_GEOIP_ORG_EDITION.get(), k_GEOIP_ORG_EDITION); - Native::registerConstant(s_GEOIP_ISP_EDITION.get(), k_GEOIP_ISP_EDITION); - Native::registerConstant(s_GEOIP_CITY_EDITION_REV1.get(), k_GEOIP_CITY_EDITION_REV1); - Native::registerConstant(s_GEOIP_REGION_EDITION_REV1.get(), k_GEOIP_REGION_EDITION_REV1); - Native::registerConstant(s_GEOIP_PROXY_EDITION.get(), k_GEOIP_PROXY_EDITION); - Native::registerConstant(s_GEOIP_ASNUM_EDITION.get(), k_GEOIP_ASNUM_EDITION); - Native::registerConstant(s_GEOIP_NETSPEED_EDITION.get(), k_GEOIP_NETSPEED_EDITION); - Native::registerConstant(s_GEOIP_NETSPEED_EDITION_REV1.get(), k_GEOIP_NETSPEED_EDITION_REV1); - Native::registerConstant(s_GEOIP_DOMAIN_EDITION.get(), k_GEOIP_DOMAIN_EDITION); - Native::registerConstant(s_GEOIP_UNKNOWN_SPEED.get(), k_GEOIP_UNKNOWN_SPEED); - Native::registerConstant(s_GEOIP_DIALUP_SPEED.get(), k_GEOIP_DIALUP_SPEED); - Native::registerConstant(s_GEOIP_CABLEDSL_SPEED.get(), k_GEOIP_CABLEDSL_SPEED); - Native::registerConstant(s_GEOIP_CORPORATE_SPEED.get(), k_GEOIP_CORPORATE_SPEED); +#define GEOIP_CONST(c) \ + Native::registerConstant((s_ ## c).get(), k_ ## c); +#include "constants.h" +#undef GEOIP_CONST HHVM_FE(geoip_asnum_by_name); HHVM_FE(geoip_continent_code_by_name); HHVM_FE(geoip_country_code_by_name); HHVM_FE(geoip_country_code3_by_name); HHVM_FE(geoip_country_name_by_name); - HHVM_FE(geoip_database_info); - HHVM_FE(geoip_db_avail); - HHVM_FE(geoip_db_filename); - HHVM_FE(geoip_db_get_all_info); HHVM_FE(geoip_domain_by_name); HHVM_FE(geoip_id_by_name); HHVM_FE(geoip_isp_by_name); -#if LIBGEOIP_VERSION >= 1004008 - HHVM_FE(geoip_netspeedcell_by_name); -#endif HHVM_FE(geoip_org_by_name); HHVM_FE(geoip_record_by_name); HHVM_FE(geoip_region_by_name); +#if LIBGEOIP_VERSION >= 1004005 + HHVM_FE(geoip_asnum_by_name_v6); + HHVM_FE(geoip_continent_code_by_name_v6); + HHVM_FE(geoip_country_code_by_name_v6); + HHVM_FE(geoip_country_code3_by_name_v6); + HHVM_FE(geoip_country_name_by_name_v6); + HHVM_FE(geoip_domain_by_name_v6); + HHVM_FE(geoip_id_by_name_v6); + HHVM_FE(geoip_isp_by_name_v6); + HHVM_FE(geoip_org_by_name_v6); + HHVM_FE(geoip_record_by_name_v6); + HHVM_FE(geoip_region_by_name_v6); +#endif + HHVM_FE(geoip_database_info); + HHVM_FE(geoip_db_avail); + HHVM_FE(geoip_db_filename); + HHVM_FE(geoip_db_get_all_info); #if LIBGEOIP_VERSION >= 1004001 HHVM_FE(geoip_region_name_by_code); HHVM_FE(geoip_setup_custom_directory); HHVM_FE(geoip_time_zone_by_country_and_region); #endif +#if LIBGEOIP_VERSION >= 1004008 + HHVM_FE(geoip_netspeedcell_by_name); + HHVM_FE(geoip_netspeedcell_by_name_v6); +#endif loadSystemlib(); diff --git a/ext_geoip.php b/ext_geoip.php index cb51eef..861e85f 100644 --- a/ext_geoip.php +++ b/ext_geoip.php @@ -11,6 +11,17 @@ */ <<__Native>> function geoip_asnum_by_name(string $hostname): mixed; +/** + * geoip_asnum_by_name_v6() - Returns the Autonomous System Number found in the GeoIP Database. + * + * @param string $hostname + * + * @return mixed Returns the ASN on success. + * Returns FALSE if the address cannot be found in the database. + * Returns NULL on error. + */ +<<__Native>> function geoip_asnum_by_name_v6(string $hostname): mixed; + /** * geoip_continent_code_by_name() - Get the two letter continent code * @@ -22,6 +33,17 @@ */ <<__Native>> function geoip_continent_code_by_name(string $hostname): mixed; +/** + * geoip_continent_code_by_name() - Get the two letter continent code + * + * @param string $hostname + * + * @return mixed Returns the two letter continent code on success. + * Returns FALSE if the address cannot be found in the database. + * Returns NULL on error. + */ +<<__Native>> function geoip_continent_code_by_name_v6(string $hostname): mixed; + /** * geoip_country_code_by_name() - Get the two letter country code * @@ -33,6 +55,17 @@ */ <<__Native>> function geoip_country_code_by_name(string $hostname): mixed; +/** + * geoip_country_code_by_name() - Get the two letter country code + * + * @param string $hostname + * + * @return mixed Returns the two letter ISO country code on success. + * Returns FALSE if the address cannot be found in the database. + * Returns NULL on error. + */ +<<__Native>> function geoip_country_code_by_name_v6(string $hostname): mixed; + /** * geoip_country_code3_by_name() - Get the three letter country code * @@ -44,6 +77,17 @@ */ <<__Native>> function geoip_country_code3_by_name(string $hostname): mixed; +/** + * geoip_country_code3_by_name() - Get the three letter country code + * + * @param string $hostname + * + * @return mixed Returns the three letter country code on success. + * Returns FALSE if the address cannot be found in the database. + * Returns NULL on error. + */ +<<__Native>> function geoip_country_code3_by_name_v6(string $hostname): mixed; + /** * geoip_country_name_by_name() - Get the full country name * @@ -55,6 +99,17 @@ */ <<__Native>> function geoip_country_name_by_name(string $hostname): mixed; +/** + * geoip_country_name_by_name() - Get the full country name + * + * @param string $hostname + * + * @return mixed Returns the country name on success. + * Returns FALSE if the address cannot be found in the database. + * Returns NULL on error. + */ +<<__Native>> function geoip_country_name_by_name_v6(string $hostname): mixed; + /** * geoip_database_info() - Get GeoIP Database information * @@ -107,6 +162,17 @@ */ <<__Native>> function geoip_domain_by_name(string $hostname): mixed; +/** + * geoip_domain_by_name() - Returns the Domain Name found in the GeoIP Database + * + * @param string $hostname + * + * @return mixed Returns the domain name on success. + * Returns FALSE if the address cannot be found in the database. + * Returns NULL on error. + */ +<<__Native>> function geoip_domain_by_name_v6(string $hostname): mixed; + /** * geoip_id_by_name() - Get the Internet connection type * @@ -118,6 +184,17 @@ */ <<__Native>> function geoip_id_by_name(string $hostname): mixed; +/** + * geoip_id_by_name() - Get the Internet connection type + * + * @param string $hostname + * + * @return mixed Returns one of GEOIP_UNKNOWN_SPEED, GEOIP_DIALUP_SPEED, + * GEOIP_CABLEDSL_SPEED, or GEOIP_CORPORATE_SPEED on success. + * Returns NULL on error. + */ +<<__Native>> function geoip_id_by_name_v6(string $hostname): mixed; + /** * geoip_isp_by_name() - Get the Internet Service Provider (ISP) name * @@ -129,6 +206,17 @@ */ <<__Native>> function geoip_isp_by_name(string $hostname): mixed; +/** + * geoip_isp_by_name() - Get the Internet Service Provider (ISP) name + * + * @param string $hostname + * + * @return mixed Returns the ISP name on success. + * Returns FALSE if the address cannot be found in the database. + * Returns NULL on error. + */ +<<__Native>> function geoip_isp_by_name_v6(string $hostname): mixed; + /** * geoip_netspeedcell_by_name() - Get the estimated connection speed * @@ -141,6 +229,18 @@ */ <<__Native>> function geoip_netspeedcell_by_name(string $hostname): mixed; +/** + * geoip_netspeedcell_by_name() - Get the estimated connection speed + * + * @param string $hostname + * + * @return mixed Returns the connection speed as a string on success, i.e., + * one of: "Cable/DSL", "Cellular", "Corporate", or "Dialup". + * Returns FALSE if the address cannot be found in the database. + * Returns NULL on error. + */ +<<__Native>> function geoip_netspeedcell_by_name_v6(string $hostname): mixed; + /** * geoip_org_by_name() - Get the organization name * @@ -152,6 +252,17 @@ */ <<__Native>> function geoip_org_by_name(string $hostname): mixed; +/** + * geoip_org_by_name() - Get the organization name + * + * @param string $hostname + * + * @return mixed Returns the organization name on success. + * Returns FALSE if the address cannot be found in the database. + * Returns NULL on error. + */ +<<__Native>> function geoip_org_by_name_v6(string $hostname): mixed; + /** * geoip_record_by_name() - Returns the detailed City information found in the GeoIP City Database * @@ -174,6 +285,28 @@ */ <<__Native>> function geoip_record_by_name(string $hostname): mixed; +/** + * geoip_record_by_name() - Returns the detailed City information found in the GeoIP City Database + * + * @param string $hostname + * + * @return mixed Returns an associative array with the keys: + * "continent_code" - two letter continent code + * "country_code" - two letter ISO country code + * "country_code3" - three letter country code + * "country_name" - country name + * "region" - region code + * "city" - city + * "postal_code" - postal code, FSA, or zip code + * "latitude" - latitude + * "longitude" - longitude + * "dma_code" - Designated Market Area + * "area_code" - PSTN area code + * Returns FALSE if host not found. + * Returns NULL on error. + */ +<<__Native>> function geoip_record_by_name_v6(string $hostname): mixed; + /** * geoip_region_by_name() - Get the country code and region * @@ -187,6 +320,19 @@ */ <<__Native>> function geoip_region_by_name(string $hostname): mixed; +/** + * geoip_region_by_name() - Get the country code and region + * + * @param string $hostname + * + * @return mixed Returns an associative array with the keys: + * "country_code" - two letter ISO country code + * "region" - region code. + * Returns FALSE if host not found. + * Returns NULL on error. + */ +<<__Native>> function geoip_region_by_name_v6(string $hostname): mixed; + /** * geoip_region_name_by_code() - Returns the region name for some country and region code combo * diff --git a/tests/010.phpt b/tests/010.phpt index c268c5d..ef9f852 100644 --- a/tests/010.phpt +++ b/tests/010.phpt @@ -10,7 +10,7 @@ geoip_database_info(1000); ?> --EXPECTF-- -Warning: geoip_database_info(): Database type given is out of bound. in %s on line %d +Warning: Database type given is out of bound. in %s on line %d -Warning: geoip_database_info(): Database type given is out of bound. in %s on line %d +Warning: Database type given is out of bound. in %s on line %d diff --git a/tests/011.phpt b/tests/011.phpt index 131de5d..8694fb7 100644 --- a/tests/011.phpt +++ b/tests/011.phpt @@ -9,4 +9,4 @@ geoip_database_info(0); ?> --EXPECTF-- -Warning: geoip_database_info(): Required database not available. in %s on line %d +Warning: Required database not available. in %s on line %d diff --git a/tests/020.phpt b/tests/020.phpt new file mode 100644 index 0000000..551563c --- /dev/null +++ b/tests/020.phpt @@ -0,0 +1,35 @@ +--TEST-- +Checking geoip_record_by_name_v6 +--SKIPIF-- + +--FILE-- + +--EXPECTF-- +array(11) { + ["continent_code"]=> + string(2) "NA" + ["country_code"]=> + string(2) "US" + ["country_code3"]=> + string(3) "USA" + ["country_name"]=> + string(13) "United States" + ["region"]=> + string(0) "%S" + ["city"]=> + string(0) "%S" + ["postal_code"]=> + string(0) "%S" + ["latitude"]=> + float(%f) + ["longitude"]=> + float(%f) + ["dma_code"]=> + int(%i) + ["area_code"]=> + int(%i) +}