@@ -0,0 +1,227 @@
+diff -ruN geoip-1.0.8.orig/geoip.c geoip-1.0.8/geoip.c
+--- geoip-1.0.8.orig/geoip.c 1970-01-01 10:13:08.000000000 +0100
++++ geoip-1.0.8/geoip.c 2012-11-13 11:58:08.000000000 +0100
+@@ -42,8 +42,11 @@
+ PHP_FE(geoip_database_info, NULL)
+ #define GEOIPDEF(php_func, c_func, db_type) \
+ PHP_FE(php_func, NULL)
++#define GEOIPMULTIDEF(php_func, c_func, db_type, c_func_v6, db_type_v6) \
++ PHP_FE(php_func, NULL)
+ #include "geoip.def"
+ #undef GEOIPDEF
++#undef GEOIPMULTIDEF
+ PHP_FE(geoip_continent_code_by_name, NULL)
+ PHP_FE(geoip_org_by_name, NULL)
+ PHP_FE(geoip_record_by_name, NULL)
+@@ -119,11 +122,23 @@
+
+ /* For database type constants */
+ REGISTER_LONG_CONSTANT("GEOIP_COUNTRY_EDITION", GEOIP_COUNTRY_EDITION, CONST_CS | CONST_PERSISTENT);
++ REGISTER_LONG_CONSTANT("GEOIP_COUNTRY_EDITION_V4", GEOIP_COUNTRY_EDITION, CONST_CS | CONST_PERSISTENT);
++#if LIBGEOIP_VERSION >= 1004005
++ REGISTER_LONG_CONSTANT("GEOIP_COUNTRY_EDITION_V6", GEOIP_COUNTRY_EDITION_V6, CONST_CS | CONST_PERSISTENT);
++#endif
+ REGISTER_LONG_CONSTANT("GEOIP_REGION_EDITION_REV0", GEOIP_REGION_EDITION_REV0, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("GEOIP_CITY_EDITION_REV0", GEOIP_CITY_EDITION_REV0, CONST_CS | CONST_PERSISTENT);
++ REGISTER_LONG_CONSTANT("GEOIP_CITY_EDITION_REV0_V4", GEOIP_CITY_EDITION_REV0, CONST_CS | CONST_PERSISTENT);
++#if LIBGEOIP_VERSION >= 1004005
++ REGISTER_LONG_CONSTANT("GEOIP_CITY_EDITION_REV0_V6", GEOIP_CITY_EDITION_REV0_V6, CONST_CS | CONST_PERSISTENT);
++#endif
+ REGISTER_LONG_CONSTANT("GEOIP_ORG_EDITION", GEOIP_ORG_EDITION, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("GEOIP_ISP_EDITION", GEOIP_ISP_EDITION, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("GEOIP_CITY_EDITION_REV1", GEOIP_CITY_EDITION_REV1, CONST_CS | CONST_PERSISTENT);
++ REGISTER_LONG_CONSTANT("GEOIP_CITY_EDITION_REV1_V4", GEOIP_CITY_EDITION_REV1, CONST_CS | CONST_PERSISTENT);
++#if LIBGEOIP_VERSION >= 1004005
++ REGISTER_LONG_CONSTANT("GEOIP_CITY_EDITION_REV1_V6", GEOIP_CITY_EDITION_REV1_V6, CONST_CS | CONST_PERSISTENT);
++#endif
+ REGISTER_LONG_CONSTANT("GEOIP_REGION_EDITION_REV1", GEOIP_REGION_EDITION_REV1, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("GEOIP_PROXY_EDITION", GEOIP_PROXY_EDITION, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("GEOIP_ASNUM_EDITION", GEOIP_ASNUM_EDITION, CONST_CS | CONST_PERSISTENT);
+@@ -313,10 +328,50 @@
+ RETURN_STRING((char*)return_code, 1); \
+ \
+ }
++
++#define GEOIPMULTIDEF(php_func, c_func, db_type, c_func_v6, db_type_v6) \
++ PHP_FUNCTION(php_func) \
++ { \
++ GeoIP * gi; \
++ char * hostname = NULL; \
++ const char * return_code; \
++ int arglen; \
++ \
++ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &hostname, &arglen) == FAILURE) { \
++ return; \
++ } \
++ \
++ if (GeoIP_db_avail(db_type)) { \
++ gi = GeoIP_open_type(db_type, GEOIP_STANDARD); \
++ } else { \
++ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Required database not available at %s.", GeoIPDBFileName[db_type]); \
++ return; \
++ } \
++ \
++ return_code = c_func(gi, hostname); \
++ GeoIP_delete(gi); \
++ if (return_code != NULL) { \
++ RETURN_STRING((char*)return_code, 1); \
++ } \
++ if (GeoIP_db_avail(db_type_v6)) { \
++ gi = GeoIP_open_type(db_type_v6, GEOIP_STANDARD); \
++ return_code = c_func_v6(gi, hostname); \
++ GeoIP_delete(gi); \
++ if (return_code != NULL) { \
++ RETURN_STRING((char*)return_code, 1); \
++ } \
++ } \
++ php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Host %s not found", hostname); \
++ RETURN_FALSE; \
++ \
++ }
++
+ #include "geoip.def"
+ #undef GEOIPDEF
++#undef GEOIPMULTIDEF
+ /* }}} */
+
++
+ /* {{{ proto string geoip_continent_code_by_name( string hostname )
+ Returns the Continent name found in the GeoIP Database */
+ PHP_FUNCTION(geoip_continent_code_by_name)
+@@ -339,6 +394,13 @@
+
+ id = GeoIP_id_by_name(gi, hostname);
+ GeoIP_delete(gi);
++#if LIBGEOIP_VERSION >= 1004005
++ if (id == 0 && GeoIP_db_avail(GEOIP_COUNTRY_EDITION_V6)) {
++ gi = GeoIP_open_type(GEOIP_COUNTRY_EDITION_V6, GEOIP_STANDARD);
++ id = GeoIP_id_by_name_v6(gi, hostname);
++ GeoIP_delete(gi);
++ }
++#endif
+ if (id == 0) {
+ php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Host %s not found", hostname);
+ RETURN_FALSE;
+@@ -385,28 +447,66 @@
+ GeoIP * gi;
+ char * hostname = NULL;
+ int arglen;
+- GeoIPRecord * gir;
++ GeoIPRecord * gir = NULL;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &hostname, &arglen) == FAILURE) {
+ return;
+ }
+
+- if (GeoIP_db_avail(GEOIP_CITY_EDITION_REV1) || GeoIP_db_avail(GEOIP_CITY_EDITION_REV0)) {
+- if (GeoIP_db_avail(GEOIP_CITY_EDITION_REV1)) {
+- gi = GeoIP_open_type(GEOIP_CITY_EDITION_REV1, GEOIP_STANDARD);
++ int ipv4_db_available = 1;
++#if LIBGEOIP_VERSION >= 1004005
++ int ipv6_db_available = 1;
++#endif
++
++ if (GeoIP_db_avail(GEOIP_CITY_EDITION_REV1)) {
++ gi = GeoIP_open_type(GEOIP_CITY_EDITION_REV1, GEOIP_STANDARD);
++ } else if (GeoIP_db_avail(GEOIP_CITY_EDITION_REV0)) {
++ gi = GeoIP_open_type(GEOIP_CITY_EDITION_REV0, GEOIP_STANDARD);
++ } else {
++ ipv4_db_available = 9;
++ }
++
++ if (ipv4_db_available) {
++ gir = GeoIP_record_by_name(gi, hostname);
++ }
++
++ if (NULL != gi) {
++ GeoIP_delete(gi);
++ }
++
++#if LIBGEOIP_VERSION >= 1004005
++ if (NULL == gir) {
++ if (GeoIP_db_avail(GEOIP_CITY_EDITION_REV1_V6)) {
++ gi = GeoIP_open_type(GEOIP_CITY_EDITION_REV1_V6, GEOIP_STANDARD);
++ } else if (GeoIP_db_avail(GEOIP_CITY_EDITION_REV0_V6)) {
++ gi = GeoIP_open_type(GEOIP_CITY_EDITION_REV0_V6, GEOIP_STANDARD);
+ } else {
+- gi = GeoIP_open_type(GEOIP_CITY_EDITION_REV0, GEOIP_STANDARD);
++ ipv6_db_available = 0;
++ }
++
++ if (ipv6_db_available) {
++ gir = GeoIP_record_by_name_v6(gi, hostname);
++ }
++
++ if (NULL != gi) {
++ GeoIP_delete(gi);
+ }
+- } else {
+- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Required database not available at %s.", GeoIPDBFileName[GEOIP_CITY_EDITION_REV0]);
+- return;
+ }
+- gir = GeoIP_record_by_name(gi, hostname);
++#endif
+
+- GeoIP_delete(gi);
+-
+ if (NULL == gir) {
++ if (!ipv4_db_available) {
++ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Required IPv4 database not available at %s.", GeoIPDBFileName[GEOIP_CITY_EDITION_REV0]);
++ }
++
++#if LIBGEOIP_VERSION >= 1004005
++ if (!ipv6_db_available) {
++ php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Required IPv6 database not available at %s.", GeoIPDBFileName[GEOIP_CITY_EDITION_REV0_V6]);
++ }
++#endif
++
+ php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Host %s not found", hostname);
++
+ RETURN_FALSE;
+ }
+
+diff -ruN geoip-1.0.8.orig/geoip.def geoip-1.0.8/geoip.def
+--- geoip-1.0.8.orig/geoip.def 1970-01-01 10:13:08.000000000 +0100
++++ geoip-1.0.8/geoip.def 2012-11-13 12:19:51.000000000 +0100
+@@ -17,12 +17,20 @@
+ */
+
+ /* GEOIPDEF(php_func, c_func, db_type) */
+-GEOIPDEF(geoip_country_code_by_name, GeoIP_country_code_by_name, GEOIP_COUNTRY_EDITION)
+-GEOIPDEF(geoip_country_code3_by_name, GeoIP_country_code3_by_name, GEOIP_COUNTRY_EDITION)
+-GEOIPDEF(geoip_country_name_by_name, GeoIP_country_name_by_name, GEOIP_COUNTRY_EDITION)
++GEOIPDEF(geoip_country_code_by_name_v4, GeoIP_country_code_by_name, GEOIP_COUNTRY_EDITION)
++GEOIPDEF(geoip_country_code3_by_name_v4, GeoIP_country_code3_by_name, GEOIP_COUNTRY_EDITION)
++GEOIPDEF(geoip_country_name_by_name_v4, GeoIP_country_name_by_name, GEOIP_COUNTRY_EDITION)
+
+-#if LIBGEOIP_VERSION >= 1004005 && FALSE
++#if LIBGEOIP_VERSION >= 1004005
+ GEOIPDEF(geoip_country_code_by_name_v6, GeoIP_country_code_by_name_v6, GEOIP_COUNTRY_EDITION_V6)
|