From ff139b01eb28803e15307286127e444ed6d21ab4 Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Mon, 6 Apr 2015 08:59:13 +0200 Subject: php-pecl-geoip: add fix for PHP7 --- geoip-php7.patch | 446 ++++++++++++++++++++++++++++++++++++++++++++++++++++ php-pecl-geoip.spec | 63 +++++--- 2 files changed, 489 insertions(+), 20 deletions(-) create mode 100644 geoip-php7.patch diff --git a/geoip-php7.patch b/geoip-php7.patch new file mode 100644 index 0000000..6a2dfaa --- /dev/null +++ b/geoip-php7.patch @@ -0,0 +1,446 @@ +--- pecl/geoip/trunk/geoip.c 2015/02/15 15:08:09 335947 ++++ pecl/geoip/trunk/geoip.c 2015/02/15 17:56:49 335948 +@@ -129,11 +129,19 @@ + { + if (stage == PHP_INI_STAGE_RUNTIME || stage == PHP_INI_STAGE_HTACCESS) { + GEOIP_G(set_runtime_custom_directory) = 1; ++#if PHP_MAJOR_VERSION >= 7 ++ geoip_change_custom_directory(new_value->val); ++#else + geoip_change_custom_directory(new_value); ++#endif + return SUCCESS; + } + ++#if PHP_MAJOR_VERSION >= 7 ++ return OnUpdateString(entry, new_value, mh_arg1, mh_arg2, mh_arg3, stage TSRMLS_CC); ++#else + return OnUpdateString(entry, new_value, new_value_length, mh_arg1, mh_arg2, mh_arg3, stage TSRMLS_CC); ++#endif + } + /* }}} */ + #endif +@@ -250,7 +258,7 @@ + /* {{{ proto boolean geoip_db_avail( [ int database ] ) */ + PHP_FUNCTION(geoip_db_avail) + { +- long edition; ++ zend_long edition; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &edition) == FAILURE) { + return; +@@ -269,7 +277,7 @@ + /* {{{ proto string geoip_db_filename( [ int database ] ) */ + PHP_FUNCTION(geoip_db_filename) + { +- long edition; ++ zend_long edition; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &edition) == FAILURE) { + return; +@@ -282,7 +290,11 @@ + } + + if (NULL != GeoIPDBFileName[edition]) ++#if PHP_MAJOR_VERSION >= 7 ++ RETURN_STRING(GeoIPDBFileName[edition]); ++#else + RETURN_STRING(GeoIPDBFileName[edition], 1); ++#endif + } + /* }}} */ + +@@ -297,16 +309,31 @@ + { + if (NULL != GeoIPDBDescription[i]) + { ++#if PHP_MAJOR_VERSION >= 7 ++ zval real_row; ++ zval *row = &real_row; ++ ++ array_init(row); ++#else + zval *row; + ALLOC_INIT_ZVAL(row); + array_init(row); ++#endif + + add_assoc_bool(row, "available", GeoIP_db_avail(i)); + if (GeoIPDBDescription[i]) { ++#if PHP_MAJOR_VERSION >= 7 ++ add_assoc_string(row, "description", (char *)GeoIPDBDescription[i]); ++#else + add_assoc_string(row, "description", (char *)GeoIPDBDescription[i], 1); ++#endif + } + if (GeoIPDBFileName[i]) { ++#if PHP_MAJOR_VERSION >= 7 ++ add_assoc_string(row, "filename", GeoIPDBFileName[i]); ++#else + add_assoc_string(row, "filename", GeoIPDBFileName[i], 1); ++#endif + } + + add_index_zval(return_value, i, row); +@@ -321,7 +348,7 @@ + { + GeoIP * gi; + char * db_info; +- long edition = GEOIP_COUNTRY_EDITION; ++ zend_long edition = GEOIP_COUNTRY_EDITION; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &edition) == FAILURE) { + return; +@@ -346,12 +373,45 @@ + db_info = GeoIP_database_info(gi); + GeoIP_delete(gi); + ++#if PHP_MAJOR_VERSION >= 7 ++ RETVAL_STRING(db_info); ++#else + RETVAL_STRING(db_info, 1); ++#endif + free(db_info); + } + /* }}} */ + + /* {{{ */ ++#if PHP_MAJOR_VERSION >= 7 ++#define GEOIPDEF(php_func, c_func, db_type) \ ++ PHP_FUNCTION(php_func) \ ++ { \ ++ GeoIP * gi; \ ++ char * hostname = NULL; \ ++ const char * return_code; \ ++ size_t 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_FALSE; \ ++ } \ ++ RETURN_STRING((char*)return_code); \ ++ \ ++ } ++#else + #define GEOIPDEF(php_func, c_func, db_type) \ + PHP_FUNCTION(php_func) \ + { \ +@@ -379,6 +439,7 @@ + RETURN_STRING((char*)return_code, 1); \ + \ + } ++#endif + #include "geoip.def" + #undef GEOIPDEF + /* }}} */ +@@ -390,7 +451,11 @@ + GeoIP * gi; + char * hostname = NULL; + int id; ++#if PHP_MAJOR_VERSION >= 7 ++ size_t arglen; ++#else + int arglen; ++#endif + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &hostname, &arglen) == FAILURE) { + return; +@@ -408,7 +473,11 @@ + if (id == 0) { + RETURN_FALSE; + } ++#if PHP_MAJOR_VERSION >= 7 ++ RETURN_STRING((char *)GeoIP_country_continent[id]); ++#else + RETURN_STRING((char *)GeoIP_country_continent[id], 1); ++#endif + } + /* }}} */ + +@@ -419,7 +488,11 @@ + GeoIP * gi; + char * hostname = NULL; + char * org; ++#if PHP_MAJOR_VERSION >= 7 ++ size_t arglen; ++#else + int arglen; ++#endif + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &hostname, &arglen) == FAILURE) { + return; +@@ -437,7 +510,11 @@ + if (org == NULL) { + RETURN_FALSE; + } ++#if PHP_MAJOR_VERSION >= 7 ++ RETVAL_STRING(org); ++#else + RETVAL_STRING(org, 1); ++#endif + free(org); + } + /* }}} */ +@@ -449,7 +526,11 @@ + GeoIP * gi; + char * hostname = NULL; + char * org; ++#if PHP_MAJOR_VERSION >= 7 ++ size_t arglen; ++#else + int arglen; ++#endif + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &hostname, &arglen) == FAILURE) { + return; +@@ -467,7 +548,11 @@ + if (org == NULL) { + RETURN_FALSE; + } ++#if PHP_MAJOR_VERSION >= 7 ++ RETVAL_STRING(org); ++#else + RETVAL_STRING(org, 1); ++#endif + free(org); + } + /* }}} */ +@@ -479,7 +564,11 @@ + GeoIP * gi; + char * hostname = NULL; + char * org; ++#if PHP_MAJOR_VERSION >= 7 ++ size_t arglen; ++#else + int arglen; ++#endif + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &hostname, &arglen) == FAILURE) { + return; +@@ -497,7 +586,11 @@ + if (org == NULL) { + RETURN_FALSE; + } ++#if PHP_MAJOR_VERSION >= 7 ++ RETVAL_STRING(org); ++#else + RETVAL_STRING(org, 1); ++#endif + free(org); + } + /* }}} */ +@@ -510,7 +603,11 @@ + GeoIP * gi; + char * hostname = NULL; + char * org; ++#if PHP_MAJOR_VERSION >= 7 ++ size_t arglen; ++#else + int arglen; ++#endif + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &hostname, &arglen) == FAILURE) { + return; +@@ -528,7 +625,11 @@ + if (org == NULL) { + RETURN_FALSE; + } ++#if PHP_MAJOR_VERSION >= 7 ++ RETVAL_STRING(org); ++#else + RETVAL_STRING(org, 1); ++#endif + free(org); + } + /* }}} */ +@@ -540,7 +641,11 @@ + { + GeoIP * gi; + char * hostname = NULL; ++#if PHP_MAJOR_VERSION >= 7 ++ size_t arglen; ++#else + int arglen; ++#endif + GeoIPRecord * gir; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &hostname, &arglen) == FAILURE) { +@@ -566,15 +671,27 @@ + } + + array_init(return_value); +-#if LIBGEOIP_VERSION >= 1004003 ++#if PHP_MAJOR_VERSION >= 7 ++# if LIBGEOIP_VERSION >= 1004003 ++ add_assoc_string(return_value, "continent_code", (gir->continent_code == NULL) ? "" : gir->continent_code); ++# endif ++ add_assoc_string(return_value, "country_code", (gir->country_code == NULL) ? "" : gir->country_code); ++ add_assoc_string(return_value, "country_code3", (gir->country_code3 == NULL) ? "" : gir->country_code3); ++ add_assoc_string(return_value, "country_name", (gir->country_name == NULL) ? "" : gir->country_name); ++ add_assoc_string(return_value, "region", (gir->region == NULL) ? "" : gir->region); ++ add_assoc_string(return_value, "city", (gir->city == NULL) ? "" : gir->city); ++ add_assoc_string(return_value, "postal_code", (gir->postal_code == NULL) ? "" : gir->postal_code); ++#else ++# if LIBGEOIP_VERSION >= 1004003 + add_assoc_string(return_value, "continent_code", (gir->continent_code == NULL) ? "" : gir->continent_code, 1); +-#endif ++# endif + add_assoc_string(return_value, "country_code", (gir->country_code == NULL) ? "" : gir->country_code, 1); + add_assoc_string(return_value, "country_code3", (gir->country_code3 == NULL) ? "" : gir->country_code3, 1); + add_assoc_string(return_value, "country_name", (gir->country_name == NULL) ? "" : gir->country_name, 1); + add_assoc_string(return_value, "region", (gir->region == NULL) ? "" : gir->region, 1); + add_assoc_string(return_value, "city", (gir->city == NULL) ? "" : gir->city, 1); + add_assoc_string(return_value, "postal_code", (gir->postal_code == NULL) ? "" : gir->postal_code, 1); ++#endif + add_assoc_double(return_value, "latitude", gir->latitude); + add_assoc_double(return_value, "longitude", gir->longitude); + #if LIBGEOIP_VERSION >= 1004005 +@@ -594,7 +711,11 @@ + { + GeoIP * gi; + char * hostname = NULL; ++#if PHP_MAJOR_VERSION >= 7 ++ size_t arglen; ++#else + int arglen; ++#endif + int netspeed; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &hostname, &arglen) == FAILURE) { +@@ -620,7 +741,11 @@ + { + GeoIP * gi; + char * hostname = NULL; ++#if PHP_MAJOR_VERSION >= 7 ++ size_t arglen; ++#else + int arglen; ++#endif + GeoIPRegion * region; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &hostname, &arglen) == FAILURE) { +@@ -646,9 +771,14 @@ + } + + array_init(return_value); ++#if PHP_MAJOR_VERSION >= 7 ++ add_assoc_string(return_value, "country_code", region->country_code); ++ add_assoc_string(return_value, "region", region->region); ++#else + add_assoc_string(return_value, "country_code", region->country_code, 1); + add_assoc_string(return_value, "region", region->region, 1); +- ++#endif ++ + GeoIPRegion_delete(region); + } + /* }}} */ +@@ -660,7 +790,11 @@ + GeoIP * gi; + char * hostname = NULL; + char * isp; ++#if PHP_MAJOR_VERSION >= 7 ++ size_t arglen; ++#else + int arglen; ++#endif + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &hostname, &arglen) == FAILURE) { + return; +@@ -678,7 +812,11 @@ + if (isp == NULL) { + RETURN_FALSE; + } ++#if PHP_MAJOR_VERSION >= 7 ++ RETVAL_STRING(isp); ++#else + RETVAL_STRING(isp, 1); ++#endif + free(isp); + } + +@@ -690,7 +828,11 @@ + char * country_code = NULL; + char * region_code = NULL; + const char * region_name; ++#if PHP_MAJOR_VERSION >= 7 ++ size_t countrylen, regionlen; ++#else + int countrylen, regionlen; ++#endif + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &country_code, &countrylen, ®ion_code, ®ionlen) == FAILURE) { + return; +@@ -705,7 +847,11 @@ + if (region_name == NULL) { + RETURN_FALSE; + } ++#if PHP_MAJOR_VERSION >= 7 ++ RETURN_STRING((char*)region_name); ++#else + RETURN_STRING((char*)region_name, 1); ++#endif + } + /* }}} */ + #endif +@@ -718,7 +864,11 @@ + char * country = NULL; + char * region = NULL; + const char * timezone; ++#if PHP_MAJOR_VERSION >= 7 ++ size_t countrylen, arg2len; ++#else + int countrylen, arg2len; ++#endif + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s", &country, &countrylen, ®ion, &arg2len) == FAILURE) { + return; +@@ -733,7 +883,11 @@ + if (timezone == NULL) { + RETURN_FALSE; + } ++#if PHP_MAJOR_VERSION >= 7 ++ RETURN_STRING((char*)timezone); ++#else + RETURN_STRING((char*)timezone, 1); ++#endif + } + /* }}} */ + #endif +@@ -744,7 +898,11 @@ + PHP_FUNCTION(geoip_setup_custom_directory) + { + char * dir = NULL; ++#if PHP_MAJOR_VERSION >= 7 ++ size_t dirlen; ++#else + int dirlen; ++#endif + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &dir, &dirlen) == FAILURE) { + return; +--- pecl/geoip/trunk/php_geoip.h 2015/02/15 15:08:09 335947 ++++ pecl/geoip/trunk/php_geoip.h 2015/02/15 17:56:49 335948 +@@ -26,6 +26,10 @@ + + #define PHP_GEOIP_VERSION "1.1.0" + ++#if PHP_MAJOR_VERSION < 7 ++typedef long zend_long; ++#endif ++ + #ifdef PHP_WIN32 + #define PHP_GEOIP_API __declspec(dllexport) + #else diff --git a/php-pecl-geoip.spec b/php-pecl-geoip.spec index e85f85d..65f3776 100644 --- a/php-pecl-geoip.spec +++ b/php-pecl-geoip.spec @@ -14,7 +14,7 @@ Name: %{?scl_prefix}php-pecl-geoip Version: 1.1.0 -Release: 3%{?dist}%{!?nophptag:%(%{__php} -r 'echo ".".PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')} +Release: 4%{?dist}%{!?nophptag:%(%{__php} -r 'echo ".".PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')} Summary: Extension to map IP addresses to geographic places Group: Development/Languages License: PHP @@ -23,6 +23,8 @@ Source0: http://pecl.php.net/get/%{pecl_name}-%{version}.tgz # http://svn.php.net/viewvc?view=revision&revision=333464 Patch0: geoip-build.patch +# http://svn.php.net/viewvc?view=revision&revision=335948 +Patch1: geoip-php7.patch BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: GeoIP-devel @@ -31,8 +33,6 @@ BuildRequires: %{?scl_prefix}php-pear Requires: %{?scl_prefix}php(zend-abi) = %{php_zend_api} Requires: %{?scl_prefix}php(api) = %{php_core_api} -Requires(post): %{__pecl} -Requires(postun): %{__pecl} %{?_sclreq:Requires: %{?scl_prefix}runtime%{?_sclreq}%{?_isa}} Provides: %{?scl_prefix}php-%{pecl_name} = %{version} @@ -42,17 +42,21 @@ Provides: %{?scl_prefix}php-pecl(%{pecl_name})%{?_isa} = %{version} %if "%{?vendor}" == "Remi Collet" && 0%{!?scl:1} # Other third party repo stuff -Obsoletes: php53-pecl-%{pecl_name} -Obsoletes: php53u-pecl-%{pecl_name} -Obsoletes: php54-pecl-%{pecl_name} -Obsoletes: php54w-pecl-%{pecl_name} +Obsoletes: php53-pecl-%{pecl_name} <= %{version} +Obsoletes: php53u-pecl-%{pecl_name} <= %{version} +Obsoletes: php54-pecl-%{pecl_name} <= %{version} +Obsoletes: php54w-pecl-%{pecl_name} <= %{version} %if "%{php_version}" > "5.5" -Obsoletes: php55u-pecl-%{pecl_name} -Obsoletes: php55w-pecl-%{pecl_name} +Obsoletes: php55u-pecl-%{pecl_name} <= %{version} +Obsoletes: php55w-pecl-%{pecl_name} <= %{version} %endif %if "%{php_version}" > "5.6" -Obsoletes: php56u-pecl-%{pecl_name} -Obsoletes: php56w-pecl-%{pecl_name} +Obsoletes: php56u-pecl-%{pecl_name} <= %{version} +Obsoletes: php56w-pecl-%{pecl_name} <= %{version} +%endif +%if "%{php_version}" > "7.0" +Obsoletes: php70u-pecl-%{pecl_name} <= %{version} +Obsoletes: php70w-pecl-%{pecl_name} <= %{version} %endif %endif @@ -69,14 +73,20 @@ City, State, Country, Longitude, Latitude, and other information as all, such as ISP and connection type. It makes use of Maxminds geoip database +Package built for PHP %(%{__php} -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')%{?scl: as Software Collection}. + %prep %setup -c -q +# Don't install/register tests +sed -e 's/role="test"/role="src"/' -i package.xml + mv %{pecl_name}-%{version} NTS cd NTS %patch0 -p0 -b .svn +%patch1 -p3 -b .svn extver=$(sed -n '/#define PHP_GEOIP_VERSION/{s/.* "//;s/".*$//;p}' php_geoip.h) if test "x${extver}" != "x%{version}"; then @@ -125,10 +135,7 @@ install -Dpm 644 package.xml %{buildroot}%{pecl_xmldir}/%{name}.xml # install config file install -Dpm644 %{ini_name} %{buildroot}%{php_inidir}/%{ini_name} -# Test & Documentation -for i in $(grep 'role="test"' package.xml | sed -e 's/^.*name="//;s/".*$//') -do install -Dpm 644 NTS/$i %{buildroot}%{pecl_testdir}/%{pecl_name}/$i -done +# Documentation for i in $(grep 'role="doc"' package.xml | sed -e 's/^.*name="//;s/".*$//') do install -Dpm 644 NTS/$i %{buildroot}%{pecl_docdir}/%{pecl_name}/$i done @@ -167,22 +174,33 @@ NO_INTERACTION=1 \ rm -rf %{buildroot} -%post -%{pecl_install} %{pecl_xmldir}/%{name}.xml >/dev/null || : +# when pear installed alone, after us +%triggerin -- %{?scl_prefix}php-pear +if [ -x %{__pecl} ] ; then + %{pecl_install} %{pecl_xmldir}/%{name}.xml >/dev/null || : +fi +# posttrans as pear can be installed after us +%posttrans +if [ -x %{__pecl} ] ; then + %{pecl_install} %{pecl_xmldir}/%{name}.xml >/dev/null || : +fi %postun -if [ $1 -eq 0 ] ; then +if [ $1 -eq 0 -a -x %{__pecl} ] ; then %{pecl_uninstall} %{pecl_name} >/dev/null || : fi + %files %defattr(-,root,root,-) +%{?_licensedir:%license NTS/LICENSE} %doc %{pecl_docdir}/%{pecl_name} -%doc %{pecl_testdir}/%{pecl_name} +%{pecl_xmldir}/%{name}.xml + %config(noreplace) %{php_inidir}/%{ini_name} %{php_extdir}/%{pecl_name}.so -%{pecl_xmldir}/%{name}.xml + %if %{with_zts} %{php_ztsextdir}/%{pecl_name}.so %config(noreplace) %{php_ztsinidir}/%{ini_name} @@ -190,6 +208,11 @@ fi %changelog +* Mon Apr 6 2015 Remi Collet - 1.1.0-4 +- add fix for PHP 7 compatibility +- drop runtime dependency on pear, new scriptlets +- don't install/register tests + * Sat Feb 28 2015 Remi Collet - 1.1.0-3 - ignore 1 test on Fedora >= 22 -- cgit