mirror of
https://github.com/php/php-src.git
synced 2025-01-23 12:13:37 +08:00
Revert to the old php_ini.c, and reimplement the binary-path searching.
Should now also work under UNIX (CLI/CGI)
This commit is contained in:
parent
ce20564d1e
commit
5af649efbd
@ -186,6 +186,7 @@ struct _sapi_module_struct {
|
||||
void (*unblock_interruptions)(void);
|
||||
|
||||
void (*default_post_reader)(TSRMLS_D);
|
||||
char *executable_location;
|
||||
};
|
||||
|
||||
|
||||
@ -216,7 +217,7 @@ struct _sapi_post_entry {
|
||||
SAPI_API SAPI_POST_READER_FUNC(sapi_read_standard_form_data);
|
||||
SAPI_API SAPI_POST_READER_FUNC(php_default_post_reader);
|
||||
|
||||
#define STANDARD_SAPI_MODULE_PROPERTIES NULL
|
||||
#define STANDARD_SAPI_MODULE_PROPERTIES NULL, NULL
|
||||
|
||||
#endif /* SAPI_H */
|
||||
|
||||
|
@ -959,7 +959,7 @@ int php_module_startup(sapi_module_struct *sf)
|
||||
/* this will read in php.ini, set up the configuration parameters,
|
||||
load zend extensions and register php function extensions
|
||||
to be loaded later */
|
||||
if (php_init_config(sf->php_ini_path_override) == FAILURE) {
|
||||
if (php_init_config() == FAILURE) {
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
|
180
main/php_ini.c
180
main/php_ini.c
@ -18,6 +18,9 @@
|
||||
|
||||
/* $Id$ */
|
||||
|
||||
/* Check CWD for php.ini */
|
||||
#define INI_CHECK_CWD
|
||||
|
||||
#include "php.h"
|
||||
#ifndef PHP_WIN32
|
||||
#include "build-defs.h"
|
||||
@ -108,7 +111,7 @@ PHPAPI void display_ini_entries(zend_module_entry *module)
|
||||
|
||||
if (module) {
|
||||
module_number = module->module_number;
|
||||
} else {
|
||||
} else {
|
||||
module_number = 0;
|
||||
}
|
||||
php_info_print_table_start();
|
||||
@ -122,25 +125,25 @@ PHPAPI void display_ini_entries(zend_module_entry *module)
|
||||
|
||||
#ifdef ZTS
|
||||
# if (ZEND_DEBUG)
|
||||
# define ZEND_EXTENSION_TOKEN "zend_extension_debug_ts"
|
||||
# define ZEND_EXTENSION_TOKEN "zend_extension_debug_ts"
|
||||
# else
|
||||
# define ZEND_EXTENSION_TOKEN "zend_extension_ts"
|
||||
# define ZEND_EXTENSION_TOKEN "zend_extension_ts"
|
||||
# endif
|
||||
#else
|
||||
# if (ZEND_DEBUG)
|
||||
# define ZEND_EXTENSION_TOKEN "zend_extension_debug"
|
||||
# define ZEND_EXTENSION_TOKEN "zend_extension_debug"
|
||||
# else
|
||||
# define ZEND_EXTENSION_TOKEN "zend_extension"
|
||||
# define ZEND_EXTENSION_TOKEN "zend_extension"
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* {{{ pvalue_config_destructor
|
||||
*/
|
||||
static void pvalue_config_destructor(zval *pvalue)
|
||||
{
|
||||
if (Z_TYPE_P(pvalue) == IS_STRING && Z_STRVAL_P(pvalue) != empty_string) {
|
||||
free(Z_STRVAL_P(pvalue));
|
||||
}
|
||||
{
|
||||
if (Z_TYPE_P(pvalue) == IS_STRING && Z_STRVAL_P(pvalue) != empty_string) {
|
||||
free(Z_STRVAL_P(pvalue));
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@ -157,14 +160,14 @@ static void php_config_ini_parser_cb(zval *arg1, zval *arg2, int callback_type,
|
||||
}
|
||||
if (!strcasecmp(Z_STRVAL_P(arg1), "extension")) { /* load function module */
|
||||
zval copy;
|
||||
|
||||
|
||||
copy = *arg2;
|
||||
zval_copy_ctor(©);
|
||||
copy.refcount = 0;
|
||||
zend_llist_add_element(&extension_lists.functions, ©);
|
||||
zend_llist_add_element(&extension_lists.functions, ©);
|
||||
} else if (!strcasecmp(Z_STRVAL_P(arg1), ZEND_EXTENSION_TOKEN)) { /* load Zend extension */
|
||||
char *extension_name = estrndup(Z_STRVAL_P(arg2), Z_STRLEN_P(arg2));
|
||||
|
||||
|
||||
zend_llist_add_element(&extension_lists.engine, &extension_name);
|
||||
} else {
|
||||
zend_hash_update(&configuration_hash, Z_STRVAL_P(arg1), Z_STRLEN_P(arg1)+1, arg2, sizeof(zval), (void **) &entry);
|
||||
@ -199,10 +202,13 @@ static void php_load_zend_extension_cb(void *arg TSRMLS_DC)
|
||||
|
||||
/* {{{ php_init_config
|
||||
*/
|
||||
int php_init_config(char *php_ini_path_override)
|
||||
int php_init_config()
|
||||
{
|
||||
char *env_location, *php_ini_search_path;
|
||||
char *binary_location;
|
||||
int safe_mode_state;
|
||||
char *open_basedir;
|
||||
int free_ini_search_path=0;
|
||||
zend_file_handle fh;
|
||||
TSRMLS_FETCH();
|
||||
|
||||
@ -212,68 +218,103 @@ int php_init_config(char *php_ini_path_override)
|
||||
|
||||
zend_llist_init(&extension_lists.engine, sizeof(char *), (llist_dtor_func_t) free_estring, 1);
|
||||
zend_llist_init(&extension_lists.functions, sizeof(zval), (llist_dtor_func_t) ZVAL_DESTRUCTOR, 1);
|
||||
|
||||
|
||||
safe_mode_state = PG(safe_mode);
|
||||
open_basedir = PG(open_basedir);
|
||||
|
||||
env_location = getenv("PHPRC");
|
||||
if (!env_location) {
|
||||
env_location="";
|
||||
}
|
||||
if (sapi_module.php_ini_path_override) {
|
||||
php_ini_search_path = sapi_module.php_ini_path_override;
|
||||
free_ini_search_path = 0;
|
||||
} else {
|
||||
char *default_location;
|
||||
char paths_separator[] = { ZEND_PATHS_SEPARATOR, 0 };
|
||||
|
||||
php_ini_search_path = (char *) emalloc(MAX_PATH*3+strlen(env_location)+3+1);
|
||||
free_ini_search_path = 1;
|
||||
php_ini_search_path[0] = 0;
|
||||
|
||||
/*
|
||||
* Prepare search path
|
||||
*/
|
||||
|
||||
/* Add cwd */
|
||||
#ifdef INI_CHECK_CWD
|
||||
if (strcmp(sapi_module.name, "cli")!=0) {
|
||||
strcat(php_ini_search_path, ".");
|
||||
strcat(php_ini_search_path, paths_separator);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Add binary directory */
|
||||
#ifdef PHP_WIN32
|
||||
binary_location = (char *) emalloc(MAX_PATH);
|
||||
if (GetModuleFileName(0, binary_location, MAX_PATH)==0) {
|
||||
efree(binary_location);
|
||||
binary_location = NULL;
|
||||
}
|
||||
#else
|
||||
if (sapi_module.executable_location) {
|
||||
binary_location = estrdup(sapi_module.executable_location);
|
||||
} else {
|
||||
binary_location = NULL;
|
||||
}
|
||||
#endif
|
||||
if (binary_location) {
|
||||
char *separator_location = strrchr(binary_location, DEFAULT_SLASH);
|
||||
|
||||
if (separator_location) {
|
||||
*(separator_location+1) = 0;
|
||||
}
|
||||
strcat(php_ini_search_path, binary_location);
|
||||
strcat(php_ini_search_path, paths_separator);
|
||||
efree(binary_location);
|
||||
}
|
||||
|
||||
/* Add environment location */
|
||||
if (env_location[0]) {
|
||||
strcat(php_ini_search_path, env_location);
|
||||
strcat(php_ini_search_path, paths_separator);
|
||||
}
|
||||
|
||||
/* Add default location */
|
||||
#ifdef PHP_WIN32
|
||||
default_location = (char *) emalloc(MAX_PATH+1);
|
||||
|
||||
if (!GetWindowsDirectory(default_location, MAX_PATH)) {
|
||||
default_location[0]=0;
|
||||
}
|
||||
strcat(php_ini_search_path, default_location);
|
||||
efree(default_location);
|
||||
#else
|
||||
default_location = PHP_CONFIG_FILE_PATH;
|
||||
strcat(php_ini_search_path, default_location);
|
||||
#endif
|
||||
}
|
||||
|
||||
PG(safe_mode) = 0;
|
||||
PG(open_basedir) = NULL;
|
||||
|
||||
fh.handle.fp = NULL;
|
||||
/* Check if php_ini_path_override is a file */
|
||||
if (sapi_module.php_ini_path_override && sapi_module.php_ini_path_override[0]) {
|
||||
struct stat statbuf;
|
||||
|
||||
/* If no override given (usually from the command line) then check the environment. */
|
||||
if (!php_ini_path_override) {
|
||||
php_ini_path_override = getenv("PHPRC");
|
||||
}
|
||||
if (php_ini_path_override && *php_ini_path_override) {
|
||||
|
||||
/* Try to open php_ini_path_override if not a directory. */
|
||||
struct stat st;
|
||||
if ((0 == VCWD_STAT(php_ini_path_override, &st)) && (S_IFDIR != (st.st_mode & S_IFMT))) {
|
||||
fh.handle.fp = VCWD_FOPEN(php_ini_path_override, "r");
|
||||
if (fh.handle.fp) {
|
||||
php_ini_opened_path = estrdup(php_ini_path_override);
|
||||
if (!VCWD_STAT(sapi_module.php_ini_path_override, &statbuf)) {
|
||||
if (!((statbuf.st_mode & S_IFMT) == S_IFDIR)) {
|
||||
fh.handle.fp = VCWD_FOPEN(sapi_module.php_ini_path_override, "r");
|
||||
}
|
||||
}
|
||||
|
||||
/* If we did not manage to open php_ini_path_override then search it as a directory. */
|
||||
if (!fh.handle.fp) {
|
||||
fh.handle.fp = php_fopen_with_path("php.ini", "r", php_ini_path_override, &php_ini_opened_path TSRMLS_CC);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#define INI_CHECK_CWD
|
||||
#ifdef INI_CHECK_CWD
|
||||
if (!fh.handle.fp && (0 != strcmp(sapi_module.name, "cli"))) {
|
||||
/* Search the current directory - possible security risk? */
|
||||
fh.handle.fp = php_fopen_with_path("php.ini", "r", ".", &php_ini_opened_path TSRMLS_CC);
|
||||
/* Search php.ini file in search path */
|
||||
if (!fh.handle.fp)
|
||||
fh.handle.fp = php_fopen_with_path("php.ini", "r", php_ini_search_path, &php_ini_opened_path TSRMLS_CC);
|
||||
if (free_ini_search_path) {
|
||||
efree(php_ini_search_path);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef PHP_WIN32
|
||||
if (!fh.handle.fp) {
|
||||
/* Search for php.ini in the same directory as the executable. */
|
||||
char search_path[MAX_PATH];
|
||||
if (GetModuleFileName(0,search_path,sizeof(search_path))) {
|
||||
char* p = strrchr(search_path,'\\');
|
||||
if (p) *++p = 0;
|
||||
fh.handle.fp = php_fopen_with_path("php.ini", "r", search_path, &php_ini_opened_path TSRMLS_CC);
|
||||
}
|
||||
}
|
||||
if (!fh.handle.fp) {
|
||||
/* Search for php.ini in the Windows base directory. */
|
||||
char search_path[MAX_PATH];
|
||||
if (GetWindowsDirectory(search_path,sizeof(search_path))) {
|
||||
fh.handle.fp = php_fopen_with_path("php.ini", "r", search_path, &php_ini_opened_path TSRMLS_CC);
|
||||
}
|
||||
}
|
||||
#else
|
||||
if (!fh.handle.fp) {
|
||||
/* Search for php.ini in the (platform-specific) default places. */
|
||||
fh.handle.fp = php_fopen_with_path("php.ini", "r", PHP_CONFIG_FILE_PATH, &php_ini_opened_path TSRMLS_CC);
|
||||
}
|
||||
#endif
|
||||
|
||||
PG(safe_mode) = safe_mode_state;
|
||||
PG(open_basedir) = open_basedir;
|
||||
|
||||
@ -284,11 +325,10 @@ int php_init_config(char *php_ini_path_override)
|
||||
fh.filename = php_ini_opened_path;
|
||||
|
||||
zend_parse_ini_file(&fh, 1, php_config_ini_parser_cb, &extension_lists);
|
||||
|
||||
/* If we succeeded in opening an INI file, preserve the name of the file opened. */
|
||||
|
||||
if (php_ini_opened_path) {
|
||||
zval tmp;
|
||||
|
||||
|
||||
Z_STRLEN(tmp) = strlen(php_ini_opened_path);
|
||||
Z_STRVAL(tmp) = zend_strndup(php_ini_opened_path, Z_STRLEN(tmp));
|
||||
Z_TYPE(tmp) = IS_STRING;
|
||||
@ -296,7 +336,7 @@ int php_init_config(char *php_ini_path_override)
|
||||
efree(php_ini_opened_path);
|
||||
php_ini_opened_path = zend_strndup(Z_STRVAL(tmp), Z_STRLEN(tmp));
|
||||
}
|
||||
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
/* }}} */
|
||||
@ -344,7 +384,7 @@ zval *cfg_get_entry(char *name, uint name_length)
|
||||
PHPAPI int cfg_get_long(char *varname, long *result)
|
||||
{
|
||||
zval *tmp, var;
|
||||
|
||||
|
||||
if (zend_hash_find(&configuration_hash, varname, strlen(varname)+1, (void **) &tmp)==FAILURE) {
|
||||
*result=(long)NULL;
|
||||
return FAILURE;
|
||||
@ -362,7 +402,7 @@ PHPAPI int cfg_get_long(char *varname, long *result)
|
||||
PHPAPI int cfg_get_double(char *varname, double *result)
|
||||
{
|
||||
zval *tmp, var;
|
||||
|
||||
|
||||
if (zend_hash_find(&configuration_hash, varname, strlen(varname)+1, (void **) &tmp)==FAILURE) {
|
||||
*result=(double)0;
|
||||
return FAILURE;
|
||||
|
@ -21,7 +21,7 @@
|
||||
|
||||
#include "zend_ini.h"
|
||||
|
||||
int php_init_config(char *php_ini_path_override);
|
||||
int php_init_config();
|
||||
int php_shutdown_config(void);
|
||||
void php_ini_delayed_modules_startup(TSRMLS_D);
|
||||
zval *cfg_get_entry(char *name, uint name_length);
|
||||
|
@ -565,6 +565,8 @@ int main(int argc, char *argv[])
|
||||
tsrm_ls = ts_resource(0);
|
||||
#endif
|
||||
|
||||
cgi_sapi_module.executable_location = argv[0];
|
||||
|
||||
/* startup after we get the above ini override se we get things right */
|
||||
if (php_module_startup(&cgi_sapi_module)==FAILURE) {
|
||||
#ifdef ZTS
|
||||
|
@ -361,6 +361,8 @@ int main(int argc, char *argv[])
|
||||
ap_php_optind = orig_optind;
|
||||
ap_php_optarg = orig_optarg;
|
||||
|
||||
cli_sapi_module.executable_location = argv[0];
|
||||
|
||||
/* startup after we get the above ini override se we get things right */
|
||||
if (php_module_startup(&cli_sapi_module)==FAILURE) {
|
||||
return FAILURE;
|
||||
|
Loading…
Reference in New Issue
Block a user