Created
December 14, 2015 20:51
-
-
Save adsr/160039d2f0775c40f83f to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| diff --git a/sapi/apache2handler/apache_config.c b/sapi/apache2handler/apache_config.c | |
| index 76d3ee2..b4f2097 100644 | |
| --- a/sapi/apache2handler/apache_config.c | |
| +++ b/sapi/apache2handler/apache_config.c | |
| @@ -1,15 +1,15 @@ | |
| /* | |
| +----------------------------------------------------------------------+ | |
| - | PHP Version 5 | | |
| + | PHP Version 7 | | |
| +----------------------------------------------------------------------+ | |
| - | Copyright (c) 1997-2014 The PHP Group | | |
| + | Copyright (c) 1997-2015 The PHP Group | | |
| +----------------------------------------------------------------------+ | |
| | This source file is subject to version 3.01 of the PHP license, | | |
| | that is bundled with this package in the file LICENSE, and is | | |
| | available through the world-wide-web at the following url: | | |
| | http://www.php.net/license/3_01.txt | | |
| | If you did not receive a copy of the PHP license and are unable to | | |
| | obtain it through the world-wide-web, please send a note to | | |
| | [email protected] so we can mail you a copy immediately. | | |
| +----------------------------------------------------------------------+ | |
| | Author: Sascha Schumann <[email protected]> | | |
| @@ -53,31 +53,31 @@ typedef struct { | |
| char status; | |
| char htaccess; | |
| } php_dir_entry; | |
| static const char *real_value_hnd(cmd_parms *cmd, void *dummy, const char *name, const char *value, int status) | |
| { | |
| php_conf_rec *d = dummy; | |
| php_dir_entry e; | |
| phpapdebug((stderr, "Getting %s=%s for %p (%d)\n", name, value, dummy, zend_hash_num_elements(&d->config))); | |
| - | |
| + | |
| if (!strncasecmp(value, "none", sizeof("none"))) { | |
| value = ""; | |
| } | |
| - | |
| + | |
| e.value = apr_pstrdup(cmd->pool, value); | |
| e.value_len = strlen(value); | |
| e.status = status; | |
| e.htaccess = ((cmd->override & (RSRC_CONF|ACCESS_CONF)) == 0); | |
| - zend_hash_update(&d->config, (char *) name, strlen(name) + 1, &e, sizeof(e), NULL); | |
| + zend_hash_str_update_mem(&d->config, (char *) name, strlen(name), &e, sizeof(e)); | |
| return NULL; | |
| } | |
| static const char *php_apache_value_handler(cmd_parms *cmd, void *dummy, const char *name, const char *value) | |
| { | |
| return real_value_hnd(cmd, dummy, name, value, PHP_INI_PERDIR); | |
| } | |
| static const char *php_apache_admin_value_handler(cmd_parms *cmd, void *dummy, const char *name, const char *value) | |
| { | |
| @@ -110,130 +110,117 @@ static const char *php_apache_admin_flag_handler(cmd_parms *cmd, void *dummy, co | |
| static const char *php_apache_phpini_set(cmd_parms *cmd, void *mconfig, const char *arg) | |
| { | |
| if (apache2_php_ini_path_override) { | |
| return "Only first PHPINIDir directive honored per configuration tree - subsequent ones ignored"; | |
| } | |
| apache2_php_ini_path_override = ap_server_root_relative(cmd->pool, arg); | |
| return NULL; | |
| } | |
| -static zend_bool should_overwrite_per_dir_entry(HashTable *target_ht, php_dir_entry *new_per_dir_entry, zend_hash_key *hash_key, void *pData) | |
| +static zend_bool should_overwrite_per_dir_entry(HashTable *target_ht, zval *zv, zend_hash_key *hash_key, void *pData) | |
| { | |
| + php_dir_entry *new_per_dir_entry = Z_PTR_P(zv); | |
| php_dir_entry *orig_per_dir_entry; | |
| - if (zend_hash_find(target_ht, hash_key->arKey, hash_key->nKeyLength, (void **) &orig_per_dir_entry)==FAILURE) { | |
| + if ((orig_per_dir_entry = zend_hash_find_ptr(target_ht, hash_key->key)) == NULL) { | |
| return 1; /* does not exist in dest, copy from source */ | |
| } | |
| if (new_per_dir_entry->status >= orig_per_dir_entry->status) { | |
| /* use new entry */ | |
| phpapdebug((stderr, "ADDING/OVERWRITING %s (%d vs. %d)\n", hash_key->arKey, new_per_dir_entry->status, orig_per_dir_entry->status)); | |
| return 1; | |
| } else { | |
| return 0; | |
| } | |
| } | |
| +void config_entry_ctor(zval *zv) | |
| +{ | |
| + php_dir_entry *pe = (php_dir_entry*)Z_PTR_P(zv); | |
| + php_dir_entry *npe = malloc(sizeof(php_dir_entry)); | |
| + | |
| + memcpy(npe, pe, sizeof(php_dir_entry)); | |
| + ZVAL_PTR(zv, npe); | |
| +} | |
| void *merge_php_config(apr_pool_t *p, void *base_conf, void *new_conf) | |
| { | |
| php_conf_rec *d = base_conf, *e = new_conf, *n = NULL; | |
| -#if STAS_0 | |
| - php_dir_entry *pe; | |
| - php_dir_entry *data; | |
| - char *str; | |
| - uint str_len; | |
| - ulong num_index; | |
| -#endif | |
| n = create_php_config(p, "merge_php_config"); | |
| /* copy old config */ | |
| - zend_hash_copy(&n->config, &d->config, NULL, NULL, sizeof(php_dir_entry)); | |
| + zend_hash_copy(&n->config, &d->config, config_entry_ctor); | |
| /* merge new config */ | |
| phpapdebug((stderr, "Merge dir (%p)+(%p)=(%p)\n", base_conf, new_conf, n)); | |
| - zend_hash_merge_ex(&n->config, &e->config, NULL, sizeof(php_dir_entry), (merge_checker_func_t) should_overwrite_per_dir_entry, NULL); | |
| -#if STAS_0 | |
| - for (zend_hash_internal_pointer_reset(&d->config); | |
| - zend_hash_get_current_key_ex(&d->config, &str, &str_len, | |
| - &num_index, 0, NULL) == HASH_KEY_IS_STRING; | |
| - zend_hash_move_forward(&d->config)) { | |
| - pe = NULL; | |
| - zend_hash_get_current_data(&d->config, (void **) &data); | |
| - if (zend_hash_find(&n->config, str, str_len, (void **) &pe) == SUCCESS) { | |
| - if (pe->status >= data->status) continue; | |
| - } | |
| - phpapdebug((stderr, "ADDING/OVERWRITING %s (%d vs. %d)\n", str, data->status, pe?pe->status:-1)); | |
| - zend_hash_update(&n->config, str, str_len, data, sizeof(*data), NULL); | |
| - } | |
| -#endif | |
| + zend_hash_merge_ex(&n->config, &e->config, config_entry_ctor, should_overwrite_per_dir_entry, NULL); | |
| return n; | |
| } | |
| char *get_php_config(void *conf, char *name, size_t name_len) | |
| { | |
| php_conf_rec *d = conf; | |
| php_dir_entry *pe; | |
| - | |
| - if (zend_hash_find(&d->config, name, name_len, (void **) &pe) == SUCCESS) { | |
| + | |
| + if ((pe = zend_hash_str_find_ptr(&d->config, name, name_len)) != NULL) { | |
| return pe->value; | |
| } | |
| return ""; | |
| } | |
| void apply_config(void *dummy) | |
| { | |
| php_conf_rec *d = dummy; | |
| - char *str; | |
| - uint str_len; | |
| + zend_string *str; | |
| php_dir_entry *data; | |
| - | |
| - for (zend_hash_internal_pointer_reset(&d->config); | |
| - zend_hash_get_current_key_ex(&d->config, &str, &str_len, NULL, 0, | |
| - NULL) == HASH_KEY_IS_STRING; | |
| - zend_hash_move_forward(&d->config)) { | |
| - if (zend_hash_get_current_data(&d->config, (void **) &data) == SUCCESS) { | |
| - phpapdebug((stderr, "APPLYING (%s)(%s)\n", str, data->value)); | |
| - if (zend_alter_ini_entry(str, str_len, data->value, data->value_len, data->status, data->htaccess?PHP_INI_STAGE_HTACCESS:PHP_INI_STAGE_ACTIVATE) == FAILURE) { | |
| - phpapdebug((stderr, "..FAILED\n")); | |
| - } | |
| + | |
| + ZEND_HASH_FOREACH_STR_KEY_PTR(&d->config, str, data) { | |
| + phpapdebug((stderr, "APPLYING (%s)(%s)\n", str, data->value)); | |
| + if (zend_alter_ini_entry_chars(str, data->value, data->value_len, data->status, data->htaccess?PHP_INI_STAGE_HTACCESS:PHP_INI_STAGE_ACTIVATE) == FAILURE) { | |
| + phpapdebug((stderr, "..FAILED\n")); | |
| } | |
| - } | |
| + } ZEND_HASH_FOREACH_END(); | |
| } | |
| const command_rec php_dir_cmds[] = | |
| { | |
| AP_INIT_TAKE2("php_value", php_apache_value_handler, NULL, OR_OPTIONS, "PHP Value Modifier"), | |
| AP_INIT_TAKE2("php_flag", php_apache_flag_handler, NULL, OR_OPTIONS, "PHP Flag Modifier"), | |
| AP_INIT_TAKE2("php_admin_value", php_apache_admin_value_handler, NULL, ACCESS_CONF|RSRC_CONF, "PHP Value Modifier (Admin)"), | |
| AP_INIT_TAKE2("php_admin_flag", php_apache_admin_flag_handler, NULL, ACCESS_CONF|RSRC_CONF, "PHP Flag Modifier (Admin)"), | |
| AP_INIT_TAKE1("PHPINIDir", php_apache_phpini_set, NULL, RSRC_CONF, "Directory containing the php.ini file"), | |
| {NULL} | |
| }; | |
| static apr_status_t destroy_php_config(void *data) | |
| { | |
| php_conf_rec *d = data; | |
| - phpapdebug((stderr, "Destroying config %p\n", data)); | |
| + phpapdebug((stderr, "Destroying config %p\n", data)); | |
| zend_hash_destroy(&d->config); | |
| return APR_SUCCESS; | |
| } | |
| +static void config_entry_dtor(zval *zv) | |
| +{ | |
| + free((php_dir_entry*)Z_PTR_P(zv)); | |
| +} | |
| + | |
| void *create_php_config(apr_pool_t *p, char *dummy) | |
| { | |
| php_conf_rec *newx = (php_conf_rec *) apr_pcalloc(p, sizeof(*newx)); | |
| phpapdebug((stderr, "Creating new config (%p) for %s\n", newx, dummy)); | |
| - zend_hash_init(&newx->config, 0, NULL, NULL, 1); | |
| + zend_hash_init(&newx->config, 0, NULL, config_entry_dtor, 1); | |
| apr_pool_cleanup_register(p, newx, destroy_php_config, apr_pool_cleanup_null); | |
| return (void *) newx; | |
| } | |
| /* | |
| * Local variables: | |
| * tab-width: 4 | |
| * c-basic-offset: 4 | |
| * End: | |
| * vim600: sw=4 ts=4 fdm=marker | |
| diff --git a/sapi/apache2handler/config.m4 b/sapi/apache2handler/config.m4 | |
| index 02f8a0b..2e64b21 100644 | |
| --- a/sapi/apache2handler/config.m4 | |
| +++ b/sapi/apache2handler/config.m4 | |
| @@ -49,76 +49,76 @@ if test "$PHP_APXS2" != "no"; then | |
| APR_CFLAGS="`$APR_CONFIG --cppflags --includes`" | |
| APU_CFLAGS="`$APU_CONFIG --includes`" | |
| for flag in $APXS_CFLAGS; do | |
| case $flag in | |
| -D*) APACHE_CPPFLAGS="$APACHE_CPPFLAGS $flag";; | |
| esac | |
| done | |
| - APACHE_CFLAGS="$APACHE_CPPFLAGS -I$APXS_INCLUDEDIR $APR_CFLAGS $APU_CFLAGS" | |
| + APACHE_CFLAGS="$APACHE_CPPFLAGS -I$APXS_INCLUDEDIR $APR_CFLAGS $APU_CFLAGS -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1" | |
| # Test that we're trying to configure with apache 2.x | |
| PHP_AP_EXTRACT_VERSION($APXS_HTTPD) | |
| if test "$APACHE_VERSION" -le 2000000; then | |
| AC_MSG_ERROR([You have enabled Apache 2 support while your server is Apache 1.3. Please use the appropriate switch --with-apxs (without the 2)]) | |
| elif test "$APACHE_VERSION" -lt 2000044; then | |
| AC_MSG_ERROR([Please note that Apache version >= 2.0.44 is required]) | |
| fi | |
| APXS_LIBEXECDIR='$(INSTALL_ROOT)'`$APXS -q LIBEXECDIR` | |
| if test -z `$APXS -q SYSCONFDIR`; then | |
| INSTALL_IT="\$(mkinstalldirs) '$APXS_LIBEXECDIR' && \ | |
| $APXS -S LIBEXECDIR='$APXS_LIBEXECDIR' \ | |
| - -i -n php5" | |
| + -i -n php7" | |
| else | |
| APXS_SYSCONFDIR='$(INSTALL_ROOT)'`$APXS -q SYSCONFDIR` | |
| INSTALL_IT="\$(mkinstalldirs) '$APXS_LIBEXECDIR' && \ | |
| \$(mkinstalldirs) '$APXS_SYSCONFDIR' && \ | |
| $APXS -S LIBEXECDIR='$APXS_LIBEXECDIR' \ | |
| -S SYSCONFDIR='$APXS_SYSCONFDIR' \ | |
| - -i -a -n php5" | |
| + -i -a -n php7" | |
| fi | |
| case $host_alias in | |
| *aix*) | |
| EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-brtl -Wl,-bI:$APXS_LIBEXECDIR/httpd.exp" | |
| - PHP_SELECT_SAPI(apache2handler, shared, mod_php5.c sapi_apache2.c apache_config.c php_functions.c, $APACHE_CFLAGS) | |
| + PHP_SELECT_SAPI(apache2handler, shared, mod_php7.c sapi_apache2.c apache_config.c php_functions.c, $APACHE_CFLAGS) | |
| INSTALL_IT="$INSTALL_IT $SAPI_LIBTOOL" | |
| ;; | |
| *darwin*) | |
| dnl When using bundles on Darwin, we must resolve all symbols. However, | |
| dnl the linker does not recursively look at the bundle loader and | |
| dnl pull in its dependencies. Therefore, we must pull in the APR | |
| dnl and APR-util libraries. | |
| if test -x "$APR_CONFIG"; then | |
| MH_BUNDLE_FLAGS="`$APR_CONFIG --ldflags --link-ld --libs`" | |
| fi | |
| if test -x "$APU_CONFIG"; then | |
| MH_BUNDLE_FLAGS="`$APU_CONFIG --ldflags --link-ld --libs` $MH_BUNDLE_FLAGS" | |
| fi | |
| MH_BUNDLE_FLAGS="-bundle -bundle_loader $APXS_HTTPD $MH_BUNDLE_FLAGS" | |
| PHP_SUBST(MH_BUNDLE_FLAGS) | |
| - PHP_SELECT_SAPI(apache2handler, bundle, mod_php5.c sapi_apache2.c apache_config.c php_functions.c, $APACHE_CFLAGS) | |
| - SAPI_SHARED=libs/libphp5.so | |
| + PHP_SELECT_SAPI(apache2handler, bundle, mod_php7.c sapi_apache2.c apache_config.c php_functions.c, $APACHE_CFLAGS) | |
| + SAPI_SHARED=libs/libphp7.so | |
| INSTALL_IT="$INSTALL_IT $SAPI_SHARED" | |
| ;; | |
| *beos*) | |
| if test -f _APP_; then `rm _APP_`; fi | |
| `ln -s $APXS_BINDIR/httpd _APP_` | |
| EXTRA_LIBS="$EXTRA_LIBS _APP_" | |
| - PHP_SELECT_SAPI(apache2handler, shared, mod_php5.c sapi_apache2.c apache_config.c php_functions.c, $APACHE_CFLAGS) | |
| + PHP_SELECT_SAPI(apache2handler, shared, mod_php7.c sapi_apache2.c apache_config.c php_functions.c, $APACHE_CFLAGS) | |
| INSTALL_IT="$INSTALL_IT $SAPI_LIBTOOL" | |
| ;; | |
| *) | |
| - PHP_SELECT_SAPI(apache2handler, shared, mod_php5.c sapi_apache2.c apache_config.c php_functions.c, $APACHE_CFLAGS) | |
| + PHP_SELECT_SAPI(apache2handler, shared, mod_php7.c sapi_apache2.c apache_config.c php_functions.c, $APACHE_CFLAGS) | |
| INSTALL_IT="$INSTALL_IT $SAPI_LIBTOOL" | |
| ;; | |
| esac | |
| if test "$APACHE_VERSION" -lt 2004001; then | |
| APXS_MPM=`$APXS -q MPM_NAME` | |
| if test "$APXS_MPM" != "prefork" && test "$APXS_MPM" != "peruser" && test "$APXS_MPM" != "itk"; then | |
| PHP_BUILD_THREAD_SAFE | |
| fi | |
| else | |
| diff --git a/sapi/apache2handler/config.w32 b/sapi/apache2handler/config.w32 | |
| index a754751..8ea1305 100644 | |
| --- a/sapi/apache2handler/config.w32 | |
| +++ b/sapi/apache2handler/config.w32 | |
| @@ -4,55 +4,55 @@ | |
| ARG_ENABLE('apache2handler', 'Build Apache 2.x handler', 'no'); | |
| if (PHP_APACHE2HANDLER != "no") { | |
| if (PHP_ZTS == "no") { | |
| WARNING("Apache 2.0 module requires an --enable-zts build of PHP on windows"); | |
| } else if (CHECK_HEADER_ADD_INCLUDE("httpd.h", "CFLAGS_APACHE2HANDLER", PHP_PHP_BUILD + "\\include\\apache2") && | |
| CHECK_LIB("libhttpd.lib", "apache2handler", PHP_PHP_BUILD + "\\lib\\apache2") && | |
| CHECK_LIB("libapr.lib", "apache2handler", PHP_PHP_BUILD + "\\lib\\apache2") && | |
| CHECK_LIB("libaprutil.lib", "apache2handler", PHP_PHP_BUILD + "\\lib\\apache2") | |
| ) { | |
| - SAPI('apache2handler', 'mod_php5.c sapi_apache2.c apache_config.c php_functions.c', | |
| + SAPI('apache2handler', 'mod_php7.c sapi_apache2.c apache_config.c php_functions.c', | |
| 'php' + PHP_VERSION + 'apache2.dll', | |
| - '/D PHP_APACHE2_EXPORTS /I win32'); | |
| + '/D PHP_APACHE2_EXPORTS /I win32 /DZEND_ENABLE_STATIC_TSRMLS_CACHE=1'); | |
| } else { | |
| WARNING("Could not find apache2 libraries/headers"); | |
| } | |
| } | |
| ARG_ENABLE('apache2-2handler', 'Build Apache 2.2.x handler', 'no'); | |
| if (PHP_APACHE2_2HANDLER != "no") { | |
| if (PHP_ZTS == "no") { | |
| WARNING("Apache 2.2 module requires an --enable-zts build of PHP on windows"); | |
| } else if (CHECK_HEADER_ADD_INCLUDE("httpd.h", "CFLAGS_APACHE2_2HANDLER", PHP_PHP_BUILD + "\\include\\apache2_2") && | |
| CHECK_LIB("libhttpd.lib", "apache2_2handler", PHP_PHP_BUILD + "\\lib\\apache2_2") && | |
| CHECK_LIB("libapr-1.lib", "apache2_2handler", PHP_PHP_BUILD + "\\lib\\apache2_2") && | |
| CHECK_LIB("libaprutil-1.lib", "apache2_2handler", PHP_PHP_BUILD + "\\lib\\apache2_2") | |
| ) { | |
| - SAPI('apache2_2handler', 'mod_php5.c sapi_apache2.c apache_config.c php_functions.c', | |
| + SAPI('apache2_2handler', 'mod_php7.c sapi_apache2.c apache_config.c php_functions.c', | |
| 'php' + PHP_VERSION + 'apache2_2.dll', | |
| - '/D PHP_APACHE2_EXPORTS /I win32', | |
| + '/D PHP_APACHE2_EXPORTS /I win32 /DZEND_ENABLE_STATIC_TSRMLS_CACHE=1', | |
| 'sapi\\apache2_2handler'); | |
| } else { | |
| WARNING("Could not find apache2.2 libraries/headers"); | |
| } | |
| } | |
| ARG_ENABLE('apache2-4handler', 'Build Apache 2.4.x handler', 'no'); | |
| if (PHP_APACHE2_4HANDLER != "no") { | |
| if (PHP_ZTS == "no") { | |
| WARNING("Apache 2.4 module requires an --enable-zts build of PHP on windows"); | |
| } else if (CHECK_HEADER_ADD_INCLUDE("httpd.h", "CFLAGS_APACHE2_4HANDLER", PHP_PHP_BUILD + "\\include\\apache2_4") && | |
| CHECK_LIB("libhttpd.lib", "apache2_4handler", PHP_PHP_BUILD + "\\lib\\apache2_4") && | |
| CHECK_LIB("libapr-1.lib", "apache2_4handler", PHP_PHP_BUILD + "\\lib\\apache2_4") && | |
| CHECK_LIB("libaprutil-1.lib", "apache2_4handler", PHP_PHP_BUILD + "\\lib\\apache2_4") | |
| ) { | |
| - SAPI('apache2_4handler', 'mod_php5.c sapi_apache2.c apache_config.c php_functions.c', | |
| + SAPI('apache2_4handler', 'mod_php7.c sapi_apache2.c apache_config.c php_functions.c', | |
| 'php' + PHP_VERSION + 'apache2_4.dll', | |
| - '/D PHP_APACHE2_EXPORTS /I win32', | |
| + '/D PHP_APACHE2_EXPORTS /I win32 /DZEND_ENABLE_STATIC_TSRMLS_CACHE=1', | |
| 'sapi\\apache2handler'); | |
| } else { | |
| WARNING("Could not find apache 2.4 libraries/headers"); | |
| } | |
| } | |
| diff --git a/sapi/apache2handler/mod_php5.c b/sapi/apache2handler/mod_php5.c | |
| deleted file mode 100644 | |
| index 4a01ebf..0000000 | |
| --- a/sapi/apache2handler/mod_php5.c | |
| +++ /dev/null | |
| @@ -1,45 +0,0 @@ | |
| -/* | |
| - +----------------------------------------------------------------------+ | |
| - | PHP Version 5 | | |
| - +----------------------------------------------------------------------+ | |
| - | Copyright (c) 1997-2014 The PHP Group | | |
| - +----------------------------------------------------------------------+ | |
| - | This source file is subject to version 3.01 of the PHP license, | | |
| - | that is bundled with this package in the file LICENSE, and is | | |
| - | available through the world-wide-web at the following url: | | |
| - | http://www.php.net/license/3_01.txt | | |
| - | If you did not receive a copy of the PHP license and are unable to | | |
| - | obtain it through the world-wide-web, please send a note to | | |
| - | [email protected] so we can mail you a copy immediately. | | |
| - +----------------------------------------------------------------------+ | |
| - | Authors: Sascha Schumann <[email protected]> | | |
| - | Parts based on Apache 1.3 SAPI module by | | |
| - | Rasmus Lerdorf and Zeev Suraski | | |
| - +----------------------------------------------------------------------+ | |
| - */ | |
| - | |
| -/* $Id$ */ | |
| - | |
| -#define ZEND_INCLUDE_FULL_WINDOWS_HEADERS | |
| - | |
| -#include "php.h" | |
| -#include "php_apache.h" | |
| - | |
| -AP_MODULE_DECLARE_DATA module php5_module = { | |
| - STANDARD20_MODULE_STUFF, | |
| - create_php_config, /* create per-directory config structure */ | |
| - merge_php_config, /* merge per-directory config structures */ | |
| - NULL, /* create per-server config structure */ | |
| - NULL, /* merge per-server config structures */ | |
| - php_dir_cmds, /* command apr_table_t */ | |
| - php_ap2_register_hook /* register hooks */ | |
| -}; | |
| - | |
| -/* | |
| - * Local variables: | |
| - * tab-width: 4 | |
| - * c-basic-offset: 4 | |
| - * End: | |
| - * vim600: sw=4 ts=4 fdm=marker | |
| - * vim<600: sw=4 ts=4 | |
| - */ | |
| diff --git a/sapi/apache2handler/mod_php7.c b/sapi/apache2handler/mod_php7.c | |
| new file mode 100644 | |
| index 0000000..cf6fdaa | |
| --- /dev/null | |
| +++ b/sapi/apache2handler/mod_php7.c | |
| @@ -0,0 +1,45 @@ | |
| +/* | |
| + +----------------------------------------------------------------------+ | |
| + | PHP Version 7 | | |
| + +----------------------------------------------------------------------+ | |
| + | Copyright (c) 1997-2015 The PHP Group | | |
| + +----------------------------------------------------------------------+ | |
| + | This source file is subject to version 3.01 of the PHP license, | | |
| + | that is bundled with this package in the file LICENSE, and is | | |
| + | available through the world-wide-web at the following url: | | |
| + | http://www.php.net/license/3_01.txt | | |
| + | If you did not receive a copy of the PHP license and are unable to | | |
| + | obtain it through the world-wide-web, please send a note to | | |
| + | [email protected] so we can mail you a copy immediately. | | |
| + +----------------------------------------------------------------------+ | |
| + | Authors: Sascha Schumann <[email protected]> | | |
| + | Parts based on Apache 1.3 SAPI module by | | |
| + | Rasmus Lerdorf and Zeev Suraski | | |
| + +----------------------------------------------------------------------+ | |
| + */ | |
| + | |
| +/* $Id$ */ | |
| + | |
| +#define ZEND_INCLUDE_FULL_WINDOWS_HEADERS | |
| + | |
| +#include "php.h" | |
| +#include "php_apache.h" | |
| + | |
| +AP_MODULE_DECLARE_DATA module php7_module = { | |
| + STANDARD20_MODULE_STUFF, | |
| + create_php_config, /* create per-directory config structure */ | |
| + merge_php_config, /* merge per-directory config structures */ | |
| + NULL, /* create per-server config structure */ | |
| + NULL, /* merge per-server config structures */ | |
| + php_dir_cmds, /* command apr_table_t */ | |
| + php_ap2_register_hook /* register hooks */ | |
| +}; | |
| + | |
| +/* | |
| + * Local variables: | |
| + * tab-width: 4 | |
| + * c-basic-offset: 4 | |
| + * End: | |
| + * vim600: sw=4 ts=4 fdm=marker | |
| + * vim<600: sw=4 ts=4 | |
| + */ | |
| diff --git a/sapi/apache2handler/php.sym b/sapi/apache2handler/php.sym | |
| index 9ad0f0a..1469b03 100644 | |
| --- a/sapi/apache2handler/php.sym | |
| +++ b/sapi/apache2handler/php.sym | |
| @@ -1 +1 @@ | |
| -php5_module | |
| +php7_module | |
| diff --git a/sapi/apache2handler/php5apache2.dsp b/sapi/apache2handler/php5apache2.dsp | |
| deleted file mode 100644 | |
| index 40cd58c..0000000 | |
| --- a/sapi/apache2handler/php5apache2.dsp | |
| +++ /dev/null | |
| @@ -1,146 +0,0 @@ | |
| -# Microsoft Developer Studio Project File - Name="php5apache2" - Package Owner=<4> | |
| -# Microsoft Developer Studio Generated Build File, Format Version 6.00 | |
| -# ** DO NOT EDIT ** | |
| - | |
| -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 | |
| - | |
| -CFG=php5apache2 - Win32 Debug_TS | |
| -!MESSAGE This is not a valid makefile. To build this project using NMAKE, | |
| -!MESSAGE use the Export Makefile command and run | |
| -!MESSAGE | |
| -!MESSAGE NMAKE /f "php5apache2.mak". | |
| -!MESSAGE | |
| -!MESSAGE You can specify a configuration when running NMAKE | |
| -!MESSAGE by defining the macro CFG on the command line. For example: | |
| -!MESSAGE | |
| -!MESSAGE NMAKE /f "php5apache2.mak" CFG="php5apache2 - Win32 Debug_TS" | |
| -!MESSAGE | |
| -!MESSAGE Possible choices for configuration are: | |
| -!MESSAGE | |
| -!MESSAGE "php5apache2 - Win32 Release_TS" (based on "Win32 (x86) Dynamic-Link Library") | |
| -!MESSAGE "php5apache2 - Win32 Release_TS_inline" (based on "Win32 (x86) Dynamic-Link Library") | |
| -!MESSAGE "php5apache2 - Win32 Debug_TS" (based on "Win32 (x86) Dynamic-Link Library") | |
| -!MESSAGE | |
| - | |
| -# Begin Project | |
| -# PROP AllowPerConfigDependencies 0 | |
| -# PROP Scc_ProjName "" | |
| -# PROP Scc_LocalPath "" | |
| -CPP=cl.exe | |
| -MTL=midl.exe | |
| -RSC=rc.exe | |
| - | |
| -!IF "$(CFG)" == "php5apache2 - Win32 Release_TS" | |
| - | |
| -# PROP BASE Use_MFC 0 | |
| -# PROP BASE Use_Debug_Libraries 0 | |
| -# PROP BASE Output_Dir "Release_TS" | |
| -# PROP BASE Intermediate_Dir "Release_TS" | |
| -# PROP BASE Target_Dir "" | |
| -# PROP Use_MFC 0 | |
| -# PROP Use_Debug_Libraries 0 | |
| -# PROP Output_Dir "..\..\Release_TS" | |
| -# PROP Intermediate_Dir "Release_TS" | |
| -# PROP Ignore_Export_Lib 0 | |
| -# PROP Target_Dir "" | |
| -# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PHP_APACHE2_EXPORTS" /YX /FD /c | |
| -# ADD CPP /nologo /MD /W3 /GX /O2 /I "...\..\include" /I "..\..\win32" /I "..\..\Zend" /I "..\.." /I "..\..\..\bindlib_w32" /I "..\..\main" /I "..\..\TSRM" /D ZEND_DEBUG=0 /D "NDEBUG" /D "ZTS" /D "ZEND_WIN32" /D "PHP_WIN32" /D "_WINDOWS" /D "_USRDLL" /D "WIN32" /D "_MBCS" /YX /FD /c | |
| -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 | |
| -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 | |
| -# ADD BASE RSC /l 0x407 /d "NDEBUG" | |
| -# ADD RSC /l 0x407 /d "NDEBUG" | |
| -BSC32=bscmake.exe | |
| -# ADD BASE BSC32 /nologo | |
| -# ADD BSC32 /nologo | |
| -LINK32=link.exe | |
| -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 | |
| -# ADD LINK32 php5ts.lib libhttpd.lib libapr.lib libaprutil.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /libpath:"..\..\Release_TS" /libpath:"..\..\TSRM\Release_TS" /libpath:"..\..\Zend\Release_TS" | |
| - | |
| -!ELSEIF "$(CFG)" == "php5apache2 - Win32 Release_TS_inline" | |
| - | |
| -# PROP BASE Use_MFC 0 | |
| -# PROP BASE Use_Debug_Libraries 0 | |
| -# PROP BASE Output_Dir "Release_TS_inline" | |
| -# PROP BASE Intermediate_Dir "Release_TS_inline" | |
| -# PROP BASE Target_Dir "" | |
| -# PROP Use_MFC 0 | |
| -# PROP Use_Debug_Libraries 0 | |
| -# PROP Output_Dir "..\..\Release_TS_inline" | |
| -# PROP Intermediate_Dir "Release_TS_inline" | |
| -# PROP Ignore_Export_Lib 0 | |
| -# PROP Target_Dir "" | |
| -# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PHP_APACHE2_EXPORTS" /YX /FD /c | |
| -# ADD CPP /nologo /MD /W3 /GX /O2 /I "...\..\include" /I "..\..\win32" /I "..\..\Zend" /I "..\.." /I "..\..\..\bindlib_w32" /I "..\..\main" /I "..\..\TSRM" /D ZEND_DEBUG=0 /D "ZEND_WIN32_FORCE_INLINE" /D "NDEBUG" /D "ZTS" /D "ZEND_WIN32" /D "PHP_WIN32" /D "_WINDOWS" /D "_USRDLL" /D "WIN32" /D "_MBCS" /YX /FD /c | |
| -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 | |
| -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 | |
| -# ADD BASE RSC /l 0x407 /d "NDEBUG" | |
| -# ADD RSC /l 0x407 /d "NDEBUG" | |
| -BSC32=bscmake.exe | |
| -# ADD BASE BSC32 /nologo | |
| -# ADD BSC32 /nologo | |
| -LINK32=link.exe | |
| -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 | |
| -# ADD LINK32 php5ts.lib libhttpd.lib libapr.lib libaprutil.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"..\..\Release_TS_inline/php5apache2.dll" /libpath:"..\..\Release_TS_inline" /libpath:"..\..\TSRM\Release_TS_inline" /libpath:"..\..\Zend\Release_TS_inline" | |
| - | |
| -!ELSEIF "$(CFG)" == "php5apache2 - Win32 Debug_TS" | |
| - | |
| -# PROP BASE Use_MFC 0 | |
| -# PROP BASE Use_Debug_Libraries 1 | |
| -# PROP BASE Output_Dir "Debug_TS" | |
| -# PROP BASE Intermediate_Dir "Debug_TS" | |
| -# PROP BASE Target_Dir "" | |
| -# PROP Use_MFC 0 | |
| -# PROP Use_Debug_Libraries 1 | |
| -# PROP Output_Dir "..\..\Debug_TS" | |
| -# PROP Intermediate_Dir "Debug_TS" | |
| -# PROP Target_Dir "" | |
| -# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PHP_APACHE2_EXPORTS" /YX /FD /GZ /c | |
| -# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "...\..\include" /I "..\..\win32" /I "..\..\Zend" /I "..\.." /I "..\..\..\bindlib_w32" /I "..\..\main" /I "..\..\TSRM" /D "_DEBUG" /D ZEND_DEBUG=1 /D "ZTS" /D "ZEND_WIN32" /D "PHP_WIN32" /D "_WINDOWS" /D "_USRDLL" /D "WIN32" /D "_MBCS" /YX /FD /GZ /c | |
| -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 | |
| -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 | |
| -# ADD BASE RSC /l 0x407 /d "_DEBUG" | |
| -# ADD RSC /l 0x407 /d "_DEBUG" | |
| -BSC32=bscmake.exe | |
| -# ADD BASE BSC32 /nologo | |
| -# ADD BSC32 /nologo | |
| -LINK32=link.exe | |
| -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept | |
| -# ADD LINK32 php5ts_debug.lib libhttpd.lib libapr.lib libaprutil.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"..\..\Debug_TS" /libpath:"..\..\TSRM\Debug_TS" /libpath:"..\..\Zend\Debug_TS" | |
| - | |
| -!ENDIF | |
| - | |
| -# Begin Target | |
| - | |
| -# Name "php5apache2 - Win32 Release_TS" | |
| -# Name "php5apache2 - Win32 Release_TS_inline" | |
| -# Name "php5apache2 - Win32 Debug_TS" | |
| -# Begin Group "Source Files" | |
| - | |
| -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" | |
| -# Begin Source File | |
| - | |
| -SOURCE=.\apache_config.c | |
| -# End Source File | |
| -# Begin Source File | |
| - | |
| -SOURCE=.\mod_php5.c | |
| -# End Source File | |
| -# Begin Source File | |
| - | |
| -SOURCE=.\php_functions.c | |
| -# End Source File | |
| -# Begin Source File | |
| - | |
| -SOURCE=.\sapi_apache2.c | |
| -# End Source File | |
| -# End Group | |
| -# Begin Group "Header Files" | |
| - | |
| -# PROP Default_Filter "h;hpp;hxx;hm;inl" | |
| -# Begin Source File | |
| - | |
| -SOURCE=.\php_apache.h | |
| -# End Source File | |
| -# End Group | |
| -# End Target | |
| -# End Project | |
| diff --git a/sapi/apache2handler/php_apache.h b/sapi/apache2handler/php_apache.h | |
| index 3484604..489892c 100644 | |
| --- a/sapi/apache2handler/php_apache.h | |
| +++ b/sapi/apache2handler/php_apache.h | |
| @@ -1,15 +1,15 @@ | |
| /* | |
| +----------------------------------------------------------------------+ | |
| - | PHP Version 5 | | |
| + | PHP Version 7 | | |
| +----------------------------------------------------------------------+ | |
| - | Copyright (c) 1997-2014 The PHP Group | | |
| + | Copyright (c) 1997-2015 The PHP Group | | |
| +----------------------------------------------------------------------+ | |
| | This source file is subject to version 3.01 of the PHP license, | | |
| | that is bundled with this package in the file LICENSE, and is | | |
| | available through the world-wide-web at the following url: | | |
| | http://www.php.net/license/3_01.txt | | |
| | If you did not receive a copy of the PHP license and are unable to | | |
| | obtain it through the world-wide-web, please send a note to | | |
| | [email protected] so we can mail you a copy immediately. | | |
| +----------------------------------------------------------------------+ | |
| | Author: Sascha Schumann <[email protected]> | | |
| @@ -18,36 +18,39 @@ | |
| /* $Id$ */ | |
| #ifndef PHP_APACHE_H | |
| #define PHP_APACHE_H | |
| #include "httpd.h" | |
| #include "http_config.h" | |
| #include "http_core.h" | |
| +#include "php.h" | |
| +#include "main/php_streams.h" | |
| + | |
| /* Declare this so we can get to it from outside the sapi_apache2.c file */ | |
| -extern module AP_MODULE_DECLARE_DATA php5_module; | |
| +extern module AP_MODULE_DECLARE_DATA php7_module; | |
| /* A way to specify the location of the php.ini dir in an apache directive */ | |
| extern char *apache2_php_ini_path_override; | |
| /* The server_context used by PHP */ | |
| typedef struct php_struct { | |
| int state; | |
| request_rec *r; | |
| apr_bucket_brigade *brigade; | |
| /* stat structure of the current file */ | |
| #if defined(NETWARE) && defined(CLIB_STAT_PATCH) | |
| struct stat_libc finfo; | |
| #else | |
| - struct stat finfo; | |
| + zend_stat_t finfo; | |
| #endif | |
| /* Whether or not we've processed PHP in the output filters yet. */ | |
| int request_processed; | |
| /* final content type */ | |
| char *content_type; | |
| } php_struct; | |
| void *merge_php_config(apr_pool_t *p, void *base_conf, void *new_conf); | |
| void *create_php_config(apr_pool_t *p, char *dummy); | |
| char *get_php_config(void *conf, char *name, size_t name_len); | |
| @@ -60,30 +63,31 @@ void php_ap2_register_hook(apr_pool_t *p); | |
| apr_table_entry_t *elts; \ | |
| int i; \ | |
| elts = (apr_table_entry_t *) arr->elts; \ | |
| for (i = 0; i < arr->nelts; i++) { \ | |
| key = elts[i].key; \ | |
| val = elts[i].val; | |
| #define APR_ARRAY_FOREACH_CLOSE() }} | |
| typedef struct { | |
| - long engine; | |
| - long xbithack; | |
| - long last_modified; | |
| + zend_bool engine; | |
| + zend_bool xbithack; | |
| + zend_bool last_modified; | |
| } php_apache2_info_struct; | |
| extern zend_module_entry apache2_module_entry; | |
| #ifdef ZTS | |
| extern int php_apache2_info_id; | |
| -#define AP2(v) TSRMG(php_apache2_info_id, php_apache2_info_struct *, v) | |
| +#define AP2(v) ZEND_TSRMG(php_apache2_info_id, php_apache2_info_struct *, v) | |
| +ZEND_TSRMLS_CACHE_EXTERN(); | |
| #else | |
| extern php_apache2_info_struct php_apache2_info; | |
| #define AP2(v) (php_apache2_info.v) | |
| #endif | |
| /* fix for gcc4 visibility patch */ | |
| #ifndef PHP_WIN32 | |
| # undef AP_MODULE_DECLARE_DATA | |
| # define AP_MODULE_DECLARE_DATA PHPAPI | |
| #endif | |
| diff --git a/sapi/apache2handler/php_functions.c b/sapi/apache2handler/php_functions.c | |
| index 2c57300..3c4cbd9 100644 | |
| --- a/sapi/apache2handler/php_functions.c | |
| +++ b/sapi/apache2handler/php_functions.c | |
| @@ -1,34 +1,34 @@ | |
| /* | |
| +----------------------------------------------------------------------+ | |
| - | PHP Version 5 | | |
| + | PHP Version 7 | | |
| +----------------------------------------------------------------------+ | |
| - | Copyright (c) 1997-2014 The PHP Group | | |
| + | Copyright (c) 1997-2015 The PHP Group | | |
| +----------------------------------------------------------------------+ | |
| | This source file is subject to version 3.01 of the PHP license, | | |
| | that is bundled with this package in the file LICENSE, and is | | |
| | available through the world-wide-web at the following url: | | |
| | http://www.php.net/license/3_01.txt | | |
| | If you did not receive a copy of the PHP license and are unable to | | |
| | obtain it through the world-wide-web, please send a note to | | |
| | [email protected] so we can mail you a copy immediately. | | |
| +----------------------------------------------------------------------+ | |
| | Author: Sascha Schumann <[email protected]> | | |
| +----------------------------------------------------------------------+ | |
| */ | |
| /* $Id$ */ | |
| #define ZEND_INCLUDE_FULL_WINDOWS_HEADERS | |
| #include "php.h" | |
| -#include "ext/standard/php_smart_str.h" | |
| +#include "zend_smart_str.h" | |
| #include "ext/standard/info.h" | |
| #include "ext/standard/head.h" | |
| #include "php_ini.h" | |
| #include "SAPI.h" | |
| #define CORE_PRIVATE | |
| #include "apr_strings.h" | |
| #include "apr_time.h" | |
| #include "ap_config.h" | |
| #include "util_filter.h" | |
| @@ -49,94 +49,94 @@ | |
| #include "php_apache.h" | |
| #ifdef ZTS | |
| int php_apache2_info_id; | |
| #else | |
| php_apache2_info_struct php_apache2_info; | |
| #endif | |
| #define SECTION(name) PUTS("<h2>" name "</h2>\n") | |
| -static request_rec *php_apache_lookup_uri(char *filename TSRMLS_DC) | |
| +static request_rec *php_apache_lookup_uri(char *filename) | |
| { | |
| php_struct *ctx = SG(server_context); | |
| - | |
| + | |
| if (!filename || !ctx || !ctx->r) { | |
| return NULL; | |
| } | |
| return ap_sub_req_lookup_uri(filename, ctx->r, ctx->r->output_filters); | |
| } | |
| /* {{{ proto bool virtual(string uri) | |
| Perform an apache sub-request */ | |
| PHP_FUNCTION(virtual) | |
| { | |
| char *filename; | |
| - int filename_len; | |
| + size_t filename_len; | |
| request_rec *rr; | |
| - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p", &filename, &filename_len) == FAILURE) { | |
| + if (zend_parse_parameters(ZEND_NUM_ARGS(), "p", &filename, &filename_len) == FAILURE) { | |
| return; | |
| } | |
| - if (!(rr = php_apache_lookup_uri(filename TSRMLS_CC))) { | |
| - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to include '%s' - URI lookup failed", filename); | |
| + if (!(rr = php_apache_lookup_uri(filename))) { | |
| + php_error_docref(NULL, E_WARNING, "Unable to include '%s' - URI lookup failed", filename); | |
| RETURN_FALSE; | |
| } | |
| if (rr->status != HTTP_OK) { | |
| - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to include '%s' - error finding URI", filename); | |
| + php_error_docref(NULL, E_WARNING, "Unable to include '%s' - error finding URI", filename); | |
| ap_destroy_sub_req(rr); | |
| RETURN_FALSE; | |
| } | |
| /* Flush everything. */ | |
| - php_output_end_all(TSRMLS_C); | |
| - php_header(TSRMLS_C); | |
| + php_output_end_all(); | |
| + php_header(); | |
| /* Ensure that the ap_r* layer for the main request is flushed, to | |
| * work around http://issues.apache.org/bugzilla/show_bug.cgi?id=17629 */ | |
| ap_rflush(rr->main); | |
| if (ap_run_sub_req(rr)) { | |
| - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to include '%s' - request execution failed", filename); | |
| + php_error_docref(NULL, E_WARNING, "Unable to include '%s' - request execution failed", filename); | |
| ap_destroy_sub_req(rr); | |
| RETURN_FALSE; | |
| } | |
| ap_destroy_sub_req(rr); | |
| RETURN_TRUE; | |
| } | |
| /* }}} */ | |
| #define ADD_LONG(name) \ | |
| add_property_long(return_value, #name, rr->name) | |
| #define ADD_TIME(name) \ | |
| add_property_long(return_value, #name, apr_time_sec(rr->name)); | |
| #define ADD_STRING(name) \ | |
| - if (rr->name) add_property_string(return_value, #name, (char *) rr->name, 1) | |
| + if (rr->name) add_property_string(return_value, #name, (char *) rr->name) | |
| PHP_FUNCTION(apache_lookup_uri) | |
| { | |
| request_rec *rr; | |
| char *filename; | |
| - int filename_len; | |
| + size_t filename_len; | |
| - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p", &filename, &filename_len) == FAILURE) { | |
| + if (zend_parse_parameters(ZEND_NUM_ARGS(), "p", &filename, &filename_len) == FAILURE) { | |
| return; | |
| } | |
| - if (!(rr = php_apache_lookup_uri(filename TSRMLS_CC))) { | |
| - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to include '%s' - URI lookup failed", filename); | |
| + if (!(rr = php_apache_lookup_uri(filename))) { | |
| + php_error_docref(NULL, E_WARNING, "Unable to include '%s' - URI lookup failed", filename); | |
| RETURN_FALSE; | |
| } | |
| - | |
| + | |
| if (rr->status == HTTP_OK) { | |
| object_init(return_value); | |
| ADD_LONG(status); | |
| ADD_STRING(the_request); | |
| ADD_STRING(status_line); | |
| ADD_STRING(method); | |
| ADD_TIME(mtime); | |
| ADD_LONG(clength); | |
| #if MODULE_MAGIC_NUMBER < 20020506 | |
| @@ -155,118 +155,118 @@ PHP_FUNCTION(apache_lookup_uri) | |
| ADD_STRING(args); | |
| ADD_LONG(allowed); | |
| ADD_LONG(sent_bodyct); | |
| ADD_LONG(bytes_sent); | |
| ADD_LONG(mtime); | |
| ADD_TIME(request_time); | |
| ap_destroy_sub_req(rr); | |
| return; | |
| } | |
| - | |
| - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to include '%s' - error finding URI", filename); | |
| + | |
| + php_error_docref(NULL, E_WARNING, "Unable to include '%s' - error finding URI", filename); | |
| ap_destroy_sub_req(rr); | |
| RETURN_FALSE; | |
| } | |
| /* {{{ proto array getallheaders(void) | |
| Fetch all HTTP request headers */ | |
| PHP_FUNCTION(apache_request_headers) | |
| { | |
| php_struct *ctx; | |
| const apr_array_header_t *arr; | |
| char *key, *val; | |
| if (zend_parse_parameters_none() == FAILURE) { | |
| return; | |
| } | |
| array_init(return_value); | |
| - | |
| + | |
| ctx = SG(server_context); | |
| arr = apr_table_elts(ctx->r->headers_in); | |
| APR_ARRAY_FOREACH_OPEN(arr, key, val) | |
| if (!val) val = ""; | |
| - add_assoc_string(return_value, key, val, 1); | |
| + add_assoc_string(return_value, key, val); | |
| APR_ARRAY_FOREACH_CLOSE() | |
| } | |
| /* }}} */ | |
| /* {{{ proto array apache_response_headers(void) | |
| Fetch all HTTP response headers */ | |
| PHP_FUNCTION(apache_response_headers) | |
| { | |
| php_struct *ctx; | |
| const apr_array_header_t *arr; | |
| char *key, *val; | |
| if (zend_parse_parameters_none() == FAILURE) { | |
| return; | |
| } | |
| array_init(return_value); | |
| - | |
| + | |
| ctx = SG(server_context); | |
| arr = apr_table_elts(ctx->r->headers_out); | |
| APR_ARRAY_FOREACH_OPEN(arr, key, val) | |
| if (!val) val = ""; | |
| - add_assoc_string(return_value, key, val, 1); | |
| + add_assoc_string(return_value, key, val); | |
| APR_ARRAY_FOREACH_CLOSE() | |
| } | |
| /* }}} */ | |
| /* {{{ proto string apache_note(string note_name [, string note_value]) | |
| Get and set Apache request notes */ | |
| PHP_FUNCTION(apache_note) | |
| { | |
| php_struct *ctx; | |
| char *note_name, *note_val = NULL; | |
| - int note_name_len, note_val_len; | |
| + size_t note_name_len, note_val_len; | |
| char *old_note_val=NULL; | |
| - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s", ¬e_name, ¬e_name_len, ¬e_val, ¬e_val_len) == FAILURE) { | |
| + if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|s", ¬e_name, ¬e_name_len, ¬e_val, ¬e_val_len) == FAILURE) { | |
| return; | |
| } | |
| ctx = SG(server_context); | |
| old_note_val = (char *) apr_table_get(ctx->r->notes, note_name); | |
| if (note_val) { | |
| apr_table_set(ctx->r->notes, note_name, note_val); | |
| } | |
| if (old_note_val) { | |
| - RETURN_STRING(old_note_val, 1); | |
| + RETURN_STRING(old_note_val); | |
| } | |
| RETURN_FALSE; | |
| } | |
| /* }}} */ | |
| /* {{{ proto bool apache_setenv(string variable, string value [, bool walk_to_top]) | |
| Set an Apache subprocess_env variable */ | |
| /* | |
| * XXX this doesn't look right. shouldn't it be the parent ?*/ | |
| PHP_FUNCTION(apache_setenv) | |
| { | |
| php_struct *ctx; | |
| char *variable=NULL, *string_val=NULL; | |
| - int variable_len, string_val_len; | |
| + size_t variable_len, string_val_len; | |
| zend_bool walk_to_top = 0; | |
| int arg_count = ZEND_NUM_ARGS(); | |
| request_rec *r; | |
| - if (zend_parse_parameters(arg_count TSRMLS_CC, "ss|b", &variable, &variable_len, &string_val, &string_val_len, &walk_to_top) == FAILURE) { | |
| + if (zend_parse_parameters(arg_count, "ss|b", &variable, &variable_len, &string_val, &string_val_len, &walk_to_top) == FAILURE) { | |
| return; | |
| } | |
| ctx = SG(server_context); | |
| r = ctx->r; | |
| if (arg_count == 3) { | |
| if (walk_to_top) { | |
| while(r->prev) { | |
| r = r->prev; | |
| @@ -281,46 +281,46 @@ PHP_FUNCTION(apache_setenv) | |
| /* }}} */ | |
| /* {{{ proto bool apache_getenv(string variable [, bool walk_to_top]) | |
| Get an Apache subprocess_env variable */ | |
| /* | |
| * XXX: shouldn't this be the parent not the 'prev' | |
| */ | |
| PHP_FUNCTION(apache_getenv) | |
| { | |
| php_struct *ctx; | |
| - char *variable=NULL; | |
| - int variable_len; | |
| + char *variable; | |
| + size_t variable_len; | |
| zend_bool walk_to_top = 0; | |
| int arg_count = ZEND_NUM_ARGS(); | |
| char *env_val=NULL; | |
| request_rec *r; | |
| - if (zend_parse_parameters(arg_count TSRMLS_CC, "s|b", &variable, &variable_len, &walk_to_top) == FAILURE) { | |
| + if (zend_parse_parameters(arg_count, "s|b", &variable, &variable_len, &walk_to_top) == FAILURE) { | |
| return; | |
| } | |
| ctx = SG(server_context); | |
| r = ctx->r; | |
| if (arg_count == 2) { | |
| if (walk_to_top) { | |
| while(r->prev) { | |
| r = r->prev; | |
| } | |
| } | |
| } | |
| env_val = (char*) apr_table_get(r->subprocess_env, variable); | |
| if (env_val != NULL) { | |
| - RETURN_STRING(env_val, 1); | |
| + RETURN_STRING(env_val); | |
| } | |
| RETURN_FALSE; | |
| } | |
| /* }}} */ | |
| static char *php_apache_get_version() | |
| { | |
| #if MODULE_MAGIC_NUMBER_MAJOR >= 20060905 | |
| return (char *) ap_get_server_banner(); | |
| @@ -329,155 +329,159 @@ static char *php_apache_get_version() | |
| #endif | |
| } | |
| /* {{{ proto string apache_get_version(void) | |
| Fetch Apache version */ | |
| PHP_FUNCTION(apache_get_version) | |
| { | |
| char *apv = php_apache_get_version(); | |
| if (apv && *apv) { | |
| - RETURN_STRING(apv, 1); | |
| + RETURN_STRING(apv); | |
| } else { | |
| RETURN_FALSE; | |
| } | |
| } | |
| /* }}} */ | |
| /* {{{ proto array apache_get_modules(void) | |
| Get a list of loaded Apache modules */ | |
| PHP_FUNCTION(apache_get_modules) | |
| { | |
| int n; | |
| char *p; | |
| - | |
| + | |
| array_init(return_value); | |
| - | |
| + | |
| for (n = 0; ap_loaded_modules[n]; ++n) { | |
| char *s = (char *) ap_loaded_modules[n]->name; | |
| if ((p = strchr(s, '.'))) { | |
| - add_next_index_stringl(return_value, s, (p - s), 1); | |
| + add_next_index_stringl(return_value, s, (p - s)); | |
| } else { | |
| - add_next_index_string(return_value, s, 1); | |
| + add_next_index_string(return_value, s); | |
| } | |
| } | |
| } | |
| /* }}} */ | |
| PHP_MINFO_FUNCTION(apache) | |
| { | |
| char *apv = php_apache_get_version(); | |
| smart_str tmp1 = {0}; | |
| char tmp[1024]; | |
| int n, max_requests; | |
| char *p; | |
| server_rec *serv = ((php_struct *) SG(server_context))->r->server; | |
| #if !defined(WIN32) && !defined(WINNT) && !defined(NETWARE) | |
| #if MODULE_MAGIC_NUMBER_MAJOR >= 20081201 | |
| AP_DECLARE_DATA extern unixd_config_rec ap_unixd_config; | |
| #else | |
| AP_DECLARE_DATA extern unixd_config_rec unixd_config; | |
| #endif | |
| #endif | |
| - | |
| + | |
| for (n = 0; ap_loaded_modules[n]; ++n) { | |
| char *s = (char *) ap_loaded_modules[n]->name; | |
| if ((p = strchr(s, '.'))) { | |
| smart_str_appendl(&tmp1, s, (p - s)); | |
| } else { | |
| smart_str_appends(&tmp1, s); | |
| } | |
| smart_str_appendc(&tmp1, ' '); | |
| } | |
| - if ((tmp1.len - 1) >= 0) { | |
| - tmp1.c[tmp1.len - 1] = '\0'; | |
| + if (tmp1.s) { | |
| + if (tmp1.s->len > 0) { | |
| + tmp1.s->val[tmp1.s->len - 1] = '\0'; | |
| + } else { | |
| + tmp1.s->val[0] = '\0'; | |
| + } | |
| } | |
| - | |
| + | |
| php_info_print_table_start(); | |
| if (apv && *apv) { | |
| php_info_print_table_row(2, "Apache Version", apv); | |
| } | |
| snprintf(tmp, sizeof(tmp), "%d", MODULE_MAGIC_NUMBER); | |
| php_info_print_table_row(2, "Apache API Version", tmp); | |
| - | |
| + | |
| if (serv->server_admin && *(serv->server_admin)) { | |
| php_info_print_table_row(2, "Server Administrator", serv->server_admin); | |
| } | |
| - | |
| + | |
| snprintf(tmp, sizeof(tmp), "%s:%u", serv->server_hostname, serv->port); | |
| php_info_print_table_row(2, "Hostname:Port", tmp); | |
| - | |
| + | |
| #if !defined(WIN32) && !defined(WINNT) && !defined(NETWARE) | |
| #if MODULE_MAGIC_NUMBER_MAJOR >= 20081201 | |
| snprintf(tmp, sizeof(tmp), "%s(%d)/%d", ap_unixd_config.user_name, ap_unixd_config.user_id, ap_unixd_config.group_id); | |
| #else | |
| snprintf(tmp, sizeof(tmp), "%s(%d)/%d", unixd_config.user_name, unixd_config.user_id, unixd_config.group_id); | |
| #endif | |
| php_info_print_table_row(2, "User/Group", tmp); | |
| #endif | |
| ap_mpm_query(AP_MPMQ_MAX_REQUESTS_DAEMON, &max_requests); | |
| snprintf(tmp, sizeof(tmp), "Per Child: %d - Keep Alive: %s - Max Per Connection: %d", max_requests, (serv->keep_alive ? "on":"off"), serv->keep_alive_max); | |
| php_info_print_table_row(2, "Max Requests", tmp); | |
| apr_snprintf(tmp, sizeof tmp, | |
| - "Connection: %" APR_TIME_T_FMT " - Keep-Alive: %" APR_TIME_T_FMT, | |
| + "Connection: %" APR_TIME_T_FMT " - Keep-Alive: %" APR_TIME_T_FMT, | |
| apr_time_sec(serv->timeout), apr_time_sec(serv->keep_alive_timeout)); | |
| php_info_print_table_row(2, "Timeouts", tmp); | |
| - | |
| + | |
| php_info_print_table_row(2, "Virtual Server", (serv->is_virtual ? "Yes" : "No")); | |
| php_info_print_table_row(2, "Server Root", ap_server_root); | |
| - php_info_print_table_row(2, "Loaded Modules", tmp1.c); | |
| + php_info_print_table_row(2, "Loaded Modules", tmp1.s->val); | |
| smart_str_free(&tmp1); | |
| php_info_print_table_end(); | |
| - | |
| + | |
| DISPLAY_INI_ENTRIES(); | |
| { | |
| const apr_array_header_t *arr = apr_table_elts(((php_struct *) SG(server_context))->r->subprocess_env); | |
| char *key, *val; | |
| - | |
| + | |
| SECTION("Apache Environment"); | |
| - php_info_print_table_start(); | |
| + php_info_print_table_start(); | |
| php_info_print_table_header(2, "Variable", "Value"); | |
| APR_ARRAY_FOREACH_OPEN(arr, key, val) | |
| if (!val) { | |
| val = ""; | |
| } | |
| php_info_print_table_row(2, key, val); | |
| APR_ARRAY_FOREACH_CLOSE() | |
| - | |
| - php_info_print_table_end(); | |
| - | |
| + | |
| + php_info_print_table_end(); | |
| + | |
| SECTION("HTTP Headers Information"); | |
| php_info_print_table_start(); | |
| php_info_print_table_colspan_header(2, "HTTP Request Headers"); | |
| php_info_print_table_row(2, "HTTP Request", ((php_struct *) SG(server_context))->r->the_request); | |
| - | |
| + | |
| arr = apr_table_elts(((php_struct *) SG(server_context))->r->headers_in); | |
| APR_ARRAY_FOREACH_OPEN(arr, key, val) | |
| if (!val) { | |
| val = ""; | |
| } | |
| php_info_print_table_row(2, key, val); | |
| APR_ARRAY_FOREACH_CLOSE() | |
| php_info_print_table_colspan_header(2, "HTTP Response Headers"); | |
| arr = apr_table_elts(((php_struct *) SG(server_context))->r->headers_out); | |
| APR_ARRAY_FOREACH_OPEN(arr, key, val) | |
| if (!val) { | |
| val = ""; | |
| } | |
| php_info_print_table_row(2, key, val); | |
| APR_ARRAY_FOREACH_CLOSE() | |
| - | |
| + | |
| php_info_print_table_end(); | |
| } | |
| } | |
| /* {{{ arginfo */ | |
| ZEND_BEGIN_ARG_INFO_EX(arginfo_apache2handler_lookup_uri, 0, 0, 1) | |
| ZEND_ARG_INFO(0, filename) | |
| ZEND_END_ARG_INFO() | |
| ZEND_BEGIN_ARG_INFO_EX(arginfo_apache2handler_virtual, 0, 0, 1) | |
| @@ -508,36 +512,36 @@ ZEND_END_ARG_INFO() | |
| ZEND_BEGIN_ARG_INFO(arginfo_apache2handler_get_version, 0) | |
| ZEND_END_ARG_INFO() | |
| ZEND_BEGIN_ARG_INFO(arginfo_apache2handler_get_modules, 0) | |
| ZEND_END_ARG_INFO() | |
| /* }}} */ | |
| static const zend_function_entry apache_functions[] = { | |
| PHP_FE(apache_lookup_uri, arginfo_apache2handler_lookup_uri) | |
| - PHP_FE(virtual, arginfo_apache2handler_virtual) | |
| + PHP_FE(virtual, arginfo_apache2handler_virtual) | |
| PHP_FE(apache_request_headers, arginfo_apache2handler_getallheaders) | |
| PHP_FE(apache_response_headers, arginfo_apache2handler_response_headers) | |
| PHP_FE(apache_setenv, arginfo_apache2handler_setenv) | |
| PHP_FE(apache_getenv, arginfo_apache2handler_getenv) | |
| PHP_FE(apache_note, arginfo_apache2handler_note) | |
| PHP_FE(apache_get_version, arginfo_apache2handler_get_version) | |
| PHP_FE(apache_get_modules, arginfo_apache2handler_get_modules) | |
| PHP_FALIAS(getallheaders, apache_request_headers, arginfo_apache2handler_getallheaders) | |
| {NULL, NULL, NULL} | |
| }; | |
| PHP_INI_BEGIN() | |
| - STD_PHP_INI_ENTRY("xbithack", "0", PHP_INI_ALL, OnUpdateLong, xbithack, php_apache2_info_struct, php_apache2_info) | |
| - STD_PHP_INI_ENTRY("engine", "1", PHP_INI_ALL, OnUpdateLong, engine, php_apache2_info_struct, php_apache2_info) | |
| - STD_PHP_INI_ENTRY("last_modified", "0", PHP_INI_ALL, OnUpdateLong, last_modified, php_apache2_info_struct, php_apache2_info) | |
| + STD_PHP_INI_ENTRY("xbithack", "0", PHP_INI_ALL, OnUpdateBool, xbithack, php_apache2_info_struct, php_apache2_info) | |
| + STD_PHP_INI_ENTRY("engine", "1", PHP_INI_ALL, OnUpdateBool, engine, php_apache2_info_struct, php_apache2_info) | |
| + STD_PHP_INI_ENTRY("last_modified", "0", PHP_INI_ALL, OnUpdateBool, last_modified, php_apache2_info_struct, php_apache2_info) | |
| PHP_INI_END() | |
| static PHP_MINIT_FUNCTION(apache) | |
| { | |
| #ifdef ZTS | |
| ts_allocate_id(&php_apache2_info_id, sizeof(php_apache2_info_struct), (ts_allocate_ctor) NULL, NULL); | |
| #endif | |
| REGISTER_INI_ENTRIES(); | |
| return SUCCESS; | |
| } | |
| @@ -548,21 +552,21 @@ static PHP_MSHUTDOWN_FUNCTION(apache) | |
| return SUCCESS; | |
| } | |
| zend_module_entry php_apache_module = { | |
| STANDARD_MODULE_HEADER, | |
| "apache2handler", | |
| apache_functions, | |
| PHP_MINIT(apache), | |
| PHP_MSHUTDOWN(apache), | |
| NULL, | |
| - NULL, | |
| + NULL, | |
| PHP_MINFO(apache), | |
| NULL, | |
| STANDARD_MODULE_PROPERTIES | |
| }; | |
| /* | |
| * Local variables: | |
| * tab-width: 4 | |
| * c-basic-offset: 4 | |
| * End: | |
| diff --git a/sapi/apache2handler/sapi_apache2.c b/sapi/apache2handler/sapi_apache2.c | |
| index e97f11c..3791120 100644 | |
| --- a/sapi/apache2handler/sapi_apache2.c | |
| +++ b/sapi/apache2handler/sapi_apache2.c | |
| @@ -1,15 +1,15 @@ | |
| /* | |
| +----------------------------------------------------------------------+ | |
| - | PHP Version 5 | | |
| + | PHP Version 7 | | |
| +----------------------------------------------------------------------+ | |
| - | Copyright (c) 1997-2014 The PHP Group | | |
| + | Copyright (c) 1997-2015 The PHP Group | | |
| +----------------------------------------------------------------------+ | |
| | This source file is subject to version 3.01 of the PHP license, | | |
| | that is bundled with this package in the file LICENSE, and is | | |
| | available through the world-wide-web at the following url: | | |
| | http://www.php.net/license/3_01.txt | | |
| | If you did not receive a copy of the PHP license and are unable to | | |
| | obtain it through the world-wide-web, please send a note to | | |
| | [email protected] so we can mail you a copy immediately. | | |
| +----------------------------------------------------------------------+ | |
| | Authors: Sascha Schumann <[email protected]> | | |
| @@ -23,21 +23,21 @@ | |
| #define ZEND_INCLUDE_FULL_WINDOWS_HEADERS | |
| #include "php.h" | |
| #include "php_main.h" | |
| #include "php_ini.h" | |
| #include "php_variables.h" | |
| #include "SAPI.h" | |
| #include <fcntl.h> | |
| -#include "ext/standard/php_smart_str.h" | |
| +#include "zend_smart_str.h" | |
| #ifndef NETWARE | |
| #include "ext/standard/php_standard.h" | |
| #else | |
| #include "ext/standard/basic_functions.h" | |
| #endif | |
| #include "apr_strings.h" | |
| #include "ap_config.h" | |
| #include "util_filter.h" | |
| #include "httpd.h" | |
| @@ -46,57 +46,54 @@ | |
| #include "http_core.h" | |
| #include "http_protocol.h" | |
| #include "http_log.h" | |
| #include "http_main.h" | |
| #include "util_script.h" | |
| #include "http_core.h" | |
| #include "ap_mpm.h" | |
| #include "php_apache.h" | |
| -#ifdef PHP_WIN32 | |
| -# if _MSC_VER <= 1300 | |
| -# include "win32/php_strtoi64.h" | |
| -# endif | |
| -#endif | |
| - | |
| /* UnixWare and Netware define shutdown to _shutdown, which causes problems later | |
| * on when using a structure member named shutdown. Since this source | |
| * file does not use the system call shutdown, it is safe to #undef it.K | |
| */ | |
| #undef shutdown | |
| #define PHP_MAGIC_TYPE "application/x-httpd-php" | |
| #define PHP_SOURCE_MAGIC_TYPE "application/x-httpd-php-source" | |
| -#define PHP_SCRIPT "php5-script" | |
| +#define PHP_SCRIPT "php7-script" | |
| /* A way to specify the location of the php.ini dir in an apache directive */ | |
| char *apache2_php_ini_path_override = NULL; | |
| +#if defined(PHP_WIN32) && defined(ZTS) | |
| +ZEND_TSRMLS_CACHE_DEFINE(); | |
| +#endif | |
| -static int | |
| -php_apache_sapi_ub_write(const char *str, uint str_length TSRMLS_DC) | |
| +static size_t | |
| +php_apache_sapi_ub_write(const char *str, size_t str_length) | |
| { | |
| request_rec *r; | |
| php_struct *ctx; | |
| ctx = SG(server_context); | |
| r = ctx->r; | |
| if (ap_rwrite(str, str_length, r) < 0) { | |
| php_handle_aborted_connection(); | |
| } | |
| return str_length; /* we always consume all the data passed to us. */ | |
| } | |
| static int | |
| -php_apache_sapi_header_handler(sapi_header_struct *sapi_header, sapi_header_op_enum op, sapi_headers_struct *sapi_headers TSRMLS_DC) | |
| +php_apache_sapi_header_handler(sapi_header_struct *sapi_header, sapi_header_op_enum op, sapi_headers_struct *sapi_headers) | |
| { | |
| php_struct *ctx; | |
| char *val, *ptr; | |
| ctx = SG(server_context); | |
| switch (op) { | |
| case SAPI_HEADER_DELETE: | |
| apr_table_unset(ctx->r->headers_out, sapi_header->header); | |
| return 0; | |
| @@ -144,51 +141,51 @@ php_apache_sapi_header_handler(sapi_header_struct *sapi_header, sapi_header_op_e | |
| *ptr = ':'; | |
| return SAPI_HEADER_ADD; | |
| default: | |
| return 0; | |
| } | |
| } | |
| static int | |
| -php_apache_sapi_send_headers(sapi_headers_struct *sapi_headers TSRMLS_DC) | |
| +php_apache_sapi_send_headers(sapi_headers_struct *sapi_headers) | |
| { | |
| php_struct *ctx = SG(server_context); | |
| const char *sline = SG(sapi_headers).http_status_line; | |
| ctx->r->status = SG(sapi_headers).http_response_code; | |
| /* httpd requires that r->status_line is set to the first digit of | |
| * the status-code: */ | |
| if (sline && strlen(sline) > 12 && strncmp(sline, "HTTP/1.", 7) == 0 && sline[8] == ' ') { | |
| ctx->r->status_line = apr_pstrdup(ctx->r->pool, sline + 9); | |
| ctx->r->proto_num = 1000 + (sline[7]-'0'); | |
| if ((sline[7]-'0') == 0) { | |
| apr_table_set(ctx->r->subprocess_env, "force-response-1.0", "true"); | |
| } | |
| } | |
| /* call ap_set_content_type only once, else each time we call it, | |
| configured output filters for that content type will be added */ | |
| if (!ctx->content_type) { | |
| - ctx->content_type = sapi_get_default_content_type(TSRMLS_C); | |
| + ctx->content_type = sapi_get_default_content_type(); | |
| } | |
| ap_set_content_type(ctx->r, apr_pstrdup(ctx->r->pool, ctx->content_type)); | |
| efree(ctx->content_type); | |
| ctx->content_type = NULL; | |
| return SAPI_HEADER_SENT_SUCCESSFULLY; | |
| } | |
| -static int | |
| -php_apache_sapi_read_post(char *buf, uint count_bytes TSRMLS_DC) | |
| +static apr_size_t | |
| +php_apache_sapi_read_post(char *buf, size_t count_bytes) | |
| { | |
| apr_size_t len, tlen=0; | |
| php_struct *ctx = SG(server_context); | |
| request_rec *r; | |
| apr_bucket_brigade *brigade; | |
| r = ctx->r; | |
| brigade = ctx->brigade; | |
| len = count_bytes; | |
| @@ -205,144 +202,148 @@ php_apache_sapi_read_post(char *buf, uint count_bytes TSRMLS_DC) | |
| if (tlen == count_bytes || !len) { | |
| break; | |
| } | |
| buf += len; | |
| len = count_bytes - tlen; | |
| } | |
| return tlen; | |
| } | |
| -static struct stat* | |
| -php_apache_sapi_get_stat(TSRMLS_D) | |
| +static zend_stat_t* | |
| +php_apache_sapi_get_stat(void) | |
| { | |
| php_struct *ctx = SG(server_context); | |
| +#ifdef PHP_WIN32 | |
| + ctx->finfo.st_uid = 0; | |
| + ctx->finfo.st_gid = 0; | |
| +#else | |
| ctx->finfo.st_uid = ctx->r->finfo.user; | |
| ctx->finfo.st_gid = ctx->r->finfo.group; | |
| +#endif | |
| ctx->finfo.st_dev = ctx->r->finfo.device; | |
| ctx->finfo.st_ino = ctx->r->finfo.inode; | |
| #if defined(NETWARE) && defined(CLIB_STAT_PATCH) | |
| ctx->finfo.st_atime.tv_sec = apr_time_sec(ctx->r->finfo.atime); | |
| ctx->finfo.st_mtime.tv_sec = apr_time_sec(ctx->r->finfo.mtime); | |
| ctx->finfo.st_ctime.tv_sec = apr_time_sec(ctx->r->finfo.ctime); | |
| #else | |
| ctx->finfo.st_atime = apr_time_sec(ctx->r->finfo.atime); | |
| ctx->finfo.st_mtime = apr_time_sec(ctx->r->finfo.mtime); | |
| ctx->finfo.st_ctime = apr_time_sec(ctx->r->finfo.ctime); | |
| #endif | |
| ctx->finfo.st_size = ctx->r->finfo.size; | |
| ctx->finfo.st_nlink = ctx->r->finfo.nlink; | |
| return &ctx->finfo; | |
| } | |
| static char * | |
| -php_apache_sapi_read_cookies(TSRMLS_D) | |
| +php_apache_sapi_read_cookies(void) | |
| { | |
| php_struct *ctx = SG(server_context); | |
| const char *http_cookie; | |
| http_cookie = apr_table_get(ctx->r->headers_in, "cookie"); | |
| /* The SAPI interface should use 'const char *' */ | |
| return (char *) http_cookie; | |
| } | |
| static char * | |
| -php_apache_sapi_getenv(char *name, size_t name_len TSRMLS_DC) | |
| +php_apache_sapi_getenv(char *name, size_t name_len) | |
| { | |
| php_struct *ctx = SG(server_context); | |
| const char *env_var; | |
| if (ctx == NULL) { | |
| return NULL; | |
| } | |
| env_var = apr_table_get(ctx->r->subprocess_env, name); | |
| return (char *) env_var; | |
| } | |
| static void | |
| -php_apache_sapi_register_variables(zval *track_vars_array TSRMLS_DC) | |
| +php_apache_sapi_register_variables(zval *track_vars_array) | |
| { | |
| php_struct *ctx = SG(server_context); | |
| const apr_array_header_t *arr = apr_table_elts(ctx->r->subprocess_env); | |
| char *key, *val; | |
| - int new_val_len; | |
| + size_t new_val_len; | |
| APR_ARRAY_FOREACH_OPEN(arr, key, val) | |
| if (!val) { | |
| val = ""; | |
| } | |
| - if (sapi_module.input_filter(PARSE_SERVER, key, &val, strlen(val), &new_val_len TSRMLS_CC)) { | |
| - php_register_variable_safe(key, val, new_val_len, track_vars_array TSRMLS_CC); | |
| + if (sapi_module.input_filter(PARSE_SERVER, key, &val, strlen(val), &new_val_len)) { | |
| + php_register_variable_safe(key, val, new_val_len, track_vars_array); | |
| } | |
| APR_ARRAY_FOREACH_CLOSE() | |
| - if (sapi_module.input_filter(PARSE_SERVER, "PHP_SELF", &ctx->r->uri, strlen(ctx->r->uri), &new_val_len TSRMLS_CC)) { | |
| - php_register_variable_safe("PHP_SELF", ctx->r->uri, new_val_len, track_vars_array TSRMLS_CC); | |
| + if (sapi_module.input_filter(PARSE_SERVER, "PHP_SELF", &ctx->r->uri, strlen(ctx->r->uri), &new_val_len)) { | |
| + php_register_variable_safe("PHP_SELF", ctx->r->uri, new_val_len, track_vars_array); | |
| } | |
| } | |
| static void | |
| php_apache_sapi_flush(void *server_context) | |
| { | |
| php_struct *ctx; | |
| request_rec *r; | |
| - TSRMLS_FETCH(); | |
| ctx = server_context; | |
| /* If we haven't registered a server_context yet, | |
| * then don't bother flushing. */ | |
| if (!server_context) { | |
| return; | |
| } | |
| r = ctx->r; | |
| - sapi_send_headers(TSRMLS_C); | |
| + sapi_send_headers(); | |
| r->status = SG(sapi_headers).http_response_code; | |
| SG(headers_sent) = 1; | |
| if (ap_rflush(r) < 0 || r->connection->aborted) { | |
| php_handle_aborted_connection(); | |
| } | |
| } | |
| -static void php_apache_sapi_log_message(char *msg TSRMLS_DC) | |
| +static void php_apache_sapi_log_message(char *msg) | |
| { | |
| php_struct *ctx; | |
| ctx = SG(server_context); | |
| if (ctx == NULL) { /* we haven't initialized our ctx yet, oh well */ | |
| ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_STARTUP, 0, NULL, "%s", msg); | |
| } else { | |
| ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, ctx->r, "%s", msg); | |
| } | |
| } | |
| -static void php_apache_sapi_log_message_ex(char *msg, request_rec *r TSRMLS_DC) | |
| +static void php_apache_sapi_log_message_ex(char *msg, request_rec *r) | |
| { | |
| if (r) { | |
| ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, msg, r->filename); | |
| } else { | |
| - php_apache_sapi_log_message(msg TSRMLS_CC); | |
| + php_apache_sapi_log_message(msg); | |
| } | |
| } | |
| -static double php_apache_sapi_get_request_time(TSRMLS_D) | |
| +static double php_apache_sapi_get_request_time(void) | |
| { | |
| php_struct *ctx = SG(server_context); | |
| return ((double) apr_time_as_msec(ctx->r->request_time)) / 1000.0; | |
| } | |
| extern zend_module_entry php_apache_module; | |
| static int php_apache2_startup(sapi_module_struct *sapi_module) | |
| { | |
| if (php_module_startup(sapi_module, &php_apache_module, 1)==FAILURE) { | |
| @@ -397,21 +398,20 @@ static apr_status_t php_apache_child_shutdown(void *tmp) | |
| { | |
| apache2_sapi_module.shutdown(&apache2_sapi_module); | |
| #if defined(ZTS) && !defined(PHP_WIN32) | |
| tsrm_shutdown(); | |
| #endif | |
| return APR_SUCCESS; | |
| } | |
| static void php_apache_add_version(apr_pool_t *p) | |
| { | |
| - TSRMLS_FETCH(); | |
| if (PG(expose_php)) { | |
| ap_add_version_component(p, "PHP/" PHP_VERSION); | |
| } | |
| } | |
| static int php_pre_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp) | |
| { | |
| #ifndef ZTS | |
| int threaded_mpm; | |
| @@ -445,114 +445,125 @@ php_apache_server_startup(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp | |
| apr_pool_userdata_set((const void *)1, userdata_key, apr_pool_cleanup_null, s->process->pool); | |
| return OK; | |
| } | |
| /* Set up our overridden path. */ | |
| if (apache2_php_ini_path_override) { | |
| apache2_sapi_module.php_ini_path_override = apache2_php_ini_path_override; | |
| } | |
| #ifdef ZTS | |
| tsrm_startup(1, 1, 0, NULL); | |
| + (void)ts_resource(0); | |
| + ZEND_TSRMLS_CACHE_UPDATE(); | |
| #endif | |
| + | |
| +#ifdef ZEND_SIGNALS | |
| + zend_signal_startup(); | |
| +#endif | |
| + | |
| sapi_startup(&apache2_sapi_module); | |
| apache2_sapi_module.startup(&apache2_sapi_module); | |
| apr_pool_cleanup_register(pconf, NULL, php_apache_server_shutdown, apr_pool_cleanup_null); | |
| php_apache_add_version(pconf); | |
| return OK; | |
| } | |
| static apr_status_t php_server_context_cleanup(void *data_) | |
| { | |
| void **data = data_; | |
| *data = NULL; | |
| return APR_SUCCESS; | |
| } | |
| -static int php_apache_request_ctor(request_rec *r, php_struct *ctx TSRMLS_DC) | |
| +static int php_apache_request_ctor(request_rec *r, php_struct *ctx) | |
| { | |
| char *content_length; | |
| const char *auth; | |
| SG(sapi_headers).http_response_code = !r->status ? HTTP_OK : r->status; | |
| SG(request_info).content_type = apr_table_get(r->headers_in, "Content-Type"); | |
| SG(request_info).query_string = apr_pstrdup(r->pool, r->args); | |
| SG(request_info).request_method = r->method; | |
| SG(request_info).proto_num = r->proto_num; | |
| SG(request_info).request_uri = apr_pstrdup(r->pool, r->uri); | |
| SG(request_info).path_translated = apr_pstrdup(r->pool, r->filename); | |
| r->no_local_copy = 1; | |
| content_length = (char *) apr_table_get(r->headers_in, "Content-Length"); | |
| - SG(request_info).content_length = (content_length ? atol(content_length) : 0); | |
| + if (content_length) { | |
| + ZEND_ATOL(SG(request_info).content_length, content_length); | |
| + } else { | |
| + SG(request_info).content_length = 0; | |
| + } | |
| apr_table_unset(r->headers_out, "Content-Length"); | |
| apr_table_unset(r->headers_out, "Last-Modified"); | |
| apr_table_unset(r->headers_out, "Expires"); | |
| apr_table_unset(r->headers_out, "ETag"); | |
| auth = apr_table_get(r->headers_in, "Authorization"); | |
| - php_handle_auth_data(auth TSRMLS_CC); | |
| + php_handle_auth_data(auth); | |
| if (SG(request_info).auth_user == NULL && r->user) { | |
| SG(request_info).auth_user = estrdup(r->user); | |
| } | |
| ctx->r->user = apr_pstrdup(ctx->r->pool, SG(request_info).auth_user); | |
| - return php_request_startup(TSRMLS_C); | |
| + return php_request_startup(); | |
| } | |
| -static void php_apache_request_dtor(request_rec *r TSRMLS_DC) | |
| +static void php_apache_request_dtor(request_rec *r) | |
| { | |
| php_request_shutdown(NULL); | |
| } | |
| -static void php_apache_ini_dtor(request_rec *r, request_rec *p TSRMLS_DC) | |
| +static void php_apache_ini_dtor(request_rec *r, request_rec *p) | |
| { | |
| if (strcmp(r->protocol, "INCLUDED")) { | |
| - zend_try { zend_ini_deactivate(TSRMLS_C); } zend_end_try(); | |
| + zend_try { zend_ini_deactivate(); } zend_end_try(); | |
| } else { | |
| typedef struct { | |
| HashTable config; | |
| } php_conf_rec; | |
| - char *str; | |
| - uint str_len; | |
| - php_conf_rec *c = ap_get_module_config(r->per_dir_config, &php5_module); | |
| - | |
| - for (zend_hash_internal_pointer_reset(&c->config); | |
| - zend_hash_get_current_key_ex(&c->config, &str, &str_len, NULL, 0, NULL) == HASH_KEY_IS_STRING; | |
| - zend_hash_move_forward(&c->config) | |
| - ) { | |
| - zend_restore_ini_entry(str, str_len, ZEND_INI_STAGE_SHUTDOWN); | |
| - } | |
| + zend_string *str; | |
| + php_conf_rec *c = ap_get_module_config(r->per_dir_config, &php7_module); | |
| + | |
| + ZEND_HASH_FOREACH_STR_KEY(&c->config, str) { | |
| + zend_restore_ini_entry(str, ZEND_INI_STAGE_SHUTDOWN); | |
| + } ZEND_HASH_FOREACH_END(); | |
| } | |
| if (p) { | |
| ((php_struct *)SG(server_context))->r = p; | |
| } else { | |
| apr_pool_cleanup_run(r->pool, (void *)&SG(server_context), php_server_context_cleanup); | |
| } | |
| } | |
| static int php_handler(request_rec *r) | |
| { | |
| php_struct * volatile ctx; | |
| void *conf; | |
| apr_bucket_brigade * volatile brigade; | |
| apr_bucket *bucket; | |
| apr_status_t rv; | |
| request_rec * volatile parent_req = NULL; | |
| - TSRMLS_FETCH(); | |
| +#ifdef ZTS | |
| + /* initial resource fetch */ | |
| + (void)ts_resource(0); | |
| + ZEND_TSRMLS_CACHE_UPDATE(); | |
| +#endif | |
| -#define PHPAP_INI_OFF php_apache_ini_dtor(r, parent_req TSRMLS_CC); | |
| +#define PHPAP_INI_OFF php_apache_ini_dtor(r, parent_req); | |
| - conf = ap_get_module_config(r->per_dir_config, &php5_module); | |
| + conf = ap_get_module_config(r->per_dir_config, &php7_module); | |
| /* apply_config() needs r in some cases, so allocate server_context early */ | |
| ctx = SG(server_context); | |
| if (ctx == NULL || (ctx && ctx->request_processed && !strcmp(r->protocol, "INCLUDED"))) { | |
| normal: | |
| ctx = SG(server_context) = apr_pcalloc(r->pool, sizeof(*ctx)); | |
| /* register a cleanup so we clear out the SG(server_context) | |
| * after each request. Note: We pass in the pointer to the | |
| * server_context in case this is handled by a different thread. | |
| */ | |
| @@ -581,26 +592,26 @@ normal: | |
| return HTTP_NOT_FOUND; | |
| } | |
| /* handle situations where user turns the engine off */ | |
| if (!AP2(engine)) { | |
| PHPAP_INI_OFF; | |
| return DECLINED; | |
| } | |
| if (r->finfo.filetype == 0) { | |
| - php_apache_sapi_log_message_ex("script '%s' not found or unable to stat", r TSRMLS_CC); | |
| + php_apache_sapi_log_message_ex("script '%s' not found or unable to stat", r); | |
| PHPAP_INI_OFF; | |
| return HTTP_NOT_FOUND; | |
| } | |
| if (r->finfo.filetype == APR_DIR) { | |
| - php_apache_sapi_log_message_ex("attempt to invoke directory '%s' as script", r TSRMLS_CC); | |
| + php_apache_sapi_log_message_ex("attempt to invoke directory '%s' as script", r); | |
| PHPAP_INI_OFF; | |
| return HTTP_FORBIDDEN; | |
| } | |
| /* Setup the CGI variables if this is the main request */ | |
| if (r->main == NULL || | |
| /* .. or if the sub-request environment differs from the main-request. */ | |
| r->subprocess_env != r->main->subprocess_env | |
| ) { | |
| /* setup standard CGI variables */ | |
| @@ -608,32 +619,32 @@ normal: | |
| ap_add_cgi_vars(r); | |
| } | |
| zend_first_try { | |
| if (ctx == NULL) { | |
| brigade = apr_brigade_create(r->pool, r->connection->bucket_alloc); | |
| ctx = SG(server_context); | |
| ctx->brigade = brigade; | |
| - if (php_apache_request_ctor(r, ctx TSRMLS_CC)!=SUCCESS) { | |
| + if (php_apache_request_ctor(r, ctx)!=SUCCESS) { | |
| zend_bailout(); | |
| } | |
| } else { | |
| if (!parent_req) { | |
| parent_req = ctx->r; | |
| } | |
| if (parent_req && parent_req->handler && | |
| strcmp(parent_req->handler, PHP_MAGIC_TYPE) && | |
| strcmp(parent_req->handler, PHP_SOURCE_MAGIC_TYPE) && | |
| strcmp(parent_req->handler, PHP_SCRIPT)) { | |
| - if (php_apache_request_ctor(r, ctx TSRMLS_CC)!=SUCCESS) { | |
| + if (php_apache_request_ctor(r, ctx)!=SUCCESS) { | |
| zend_bailout(); | |
| } | |
| } | |
| /* | |
| * check if coming due to ErrorDocument | |
| * We make a special exception of 413 (Invalid POST request) as the invalidity of the request occurs | |
| * during processing of the request by PHP during POST processing. Therefor we need to re-use the exiting | |
| * PHP instance to handle the request rather then creating a new one. | |
| */ | |
| @@ -647,71 +658,75 @@ zend_first_try { | |
| if (AP2(last_modified)) { | |
| ap_update_mtime(r, r->finfo.mtime); | |
| ap_set_last_modified(r); | |
| } | |
| /* Determine if we need to parse the file or show the source */ | |
| if (strncmp(r->handler, PHP_SOURCE_MAGIC_TYPE, sizeof(PHP_SOURCE_MAGIC_TYPE) - 1) == 0) { | |
| zend_syntax_highlighter_ini syntax_highlighter_ini; | |
| php_get_highlight_struct(&syntax_highlighter_ini); | |
| - highlight_file((char *)r->filename, &syntax_highlighter_ini TSRMLS_CC); | |
| + highlight_file((char *)r->filename, &syntax_highlighter_ini); | |
| } else { | |
| zend_file_handle zfd; | |
| zfd.type = ZEND_HANDLE_FILENAME; | |
| zfd.filename = (char *) r->filename; | |
| zfd.free_filename = 0; | |
| zfd.opened_path = NULL; | |
| if (!parent_req) { | |
| - php_execute_script(&zfd TSRMLS_CC); | |
| + php_execute_script(&zfd); | |
| } else { | |
| - zend_execute_scripts(ZEND_INCLUDE TSRMLS_CC, NULL, 1, &zfd); | |
| + zend_execute_scripts(ZEND_INCLUDE, NULL, 1, &zfd); | |
| } | |
| apr_table_set(r->notes, "mod_php_memory_usage", | |
| - apr_psprintf(ctx->r->pool, "%" APR_SIZE_T_FMT, zend_memory_peak_usage(1 TSRMLS_CC))); | |
| + apr_psprintf(ctx->r->pool, "%" APR_SIZE_T_FMT, zend_memory_peak_usage(1))); | |
| } | |
| } zend_end_try(); | |
| if (!parent_req) { | |
| - php_apache_request_dtor(r TSRMLS_CC); | |
| + php_apache_request_dtor(r); | |
| ctx->request_processed = 1; | |
| bucket = apr_bucket_eos_create(r->connection->bucket_alloc); | |
| APR_BRIGADE_INSERT_TAIL(brigade, bucket); | |
| rv = ap_pass_brigade(r->output_filters, brigade); | |
| if (rv != APR_SUCCESS || r->connection->aborted) { | |
| zend_first_try { | |
| php_handle_aborted_connection(); | |
| } zend_end_try(); | |
| } | |
| apr_brigade_cleanup(brigade); | |
| + apr_pool_cleanup_run(r->pool, (void *)&SG(server_context), php_server_context_cleanup); | |
| } else { | |
| ctx->r = parent_req; | |
| } | |
| return OK; | |
| } | |
| static void php_apache_child_init(apr_pool_t *pchild, server_rec *s) | |
| { | |
| apr_pool_cleanup_register(pchild, NULL, php_apache_child_shutdown, apr_pool_cleanup_null); | |
| } | |
| void php_ap2_register_hook(apr_pool_t *p) | |
| { | |
| ap_hook_pre_config(php_pre_config, NULL, NULL, APR_HOOK_MIDDLE); | |
| ap_hook_post_config(php_apache_server_startup, NULL, NULL, APR_HOOK_MIDDLE); | |
| ap_hook_handler(php_handler, NULL, NULL, APR_HOOK_MIDDLE); | |
| +#ifdef ZEND_SIGNALS | |
| + ap_hook_child_init(zend_signal_init, NULL, NULL, APR_HOOK_MIDDLE); | |
| +#endif | |
| ap_hook_child_init(php_apache_child_init, NULL, NULL, APR_HOOK_MIDDLE); | |
| } | |
| /* | |
| * Local variables: | |
| * tab-width: 4 | |
| * c-basic-offset: 4 | |
| * End: | |
| * vim600: sw=4 ts=4 fdm=marker | |
| * vim<600: sw=4 ts=4 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment