Browse Source

Implemented FR #54514 (Get php binary path during script execution).

pull/271/head
Xinchen Hui 14 years ago
parent
commit
5aa1fb6074
  1. 2
      NEWS
  2. 61
      main/main.c
  3. 1
      main/php_globals.h
  4. 51
      main/php_ini.c
  5. 9
      tests/basic/bug54514.phpt

2
NEWS

@ -6,6 +6,8 @@ PHP NEWS
(php at mickweiss dot com)
. Fixed bug #60240 (invalid read/writes when unserializing specially crafted
strings). (Mike)
. Implement FR #54514 (Get php binary path during script execution).
(Laruence)
- CLI SAPI:
. Implement FR #60390 (Missing $_SERVER['SERVER_PORT']). (Pierre)

61
main/main.c

@ -255,6 +255,57 @@ static void php_disable_classes(TSRMLS_D)
}
/* }}} */
/* {{{ php_binary_init
*/
static void php_binary_init(TSRMLS_D)
{
char *binary_location;
#ifdef PHP_WIN32
binary_location = (char *)malloc(MAXPATHLEN);
if (GetModuleFileName(0, binary_location, MAXPATHLEN) == 0) {
free(binary_location);
PG(php_binary) = NULL;
}
#else
if (sapi_module.executable_location) {
binary_location = (char *)malloc(MAXPATHLEN);
if (!strchr(sapi_module.executable_location, '/')) {
char *envpath, *path;
int found = 0;
if ((envpath = getenv("PATH")) != NULL) {
char *search_dir, search_path[MAXPATHLEN];
char *last = NULL;
path = estrdup(envpath);
search_dir = php_strtok_r(path, ":", &last);
while (search_dir) {
snprintf(search_path, MAXPATHLEN, "%s/%s", search_dir, sapi_module.executable_location);
if (VCWD_REALPATH(search_path, binary_location) && !VCWD_ACCESS(binary_location, X_OK)) {
found = 1;
break;
}
search_dir = php_strtok_r(NULL, ":", &last);
}
efree(path);
}
if (!found) {
free(binary_location);
binary_location = NULL;
}
} else if (!VCWD_REALPATH(sapi_module.executable_location, binary_location) || VCWD_ACCESS(binary_location, X_OK)) {
free(binary_location);
binary_location = NULL;
}
} else {
binary_location = NULL;
}
#endif
PG(php_binary) = binary_location;
}
/* }}} */
/* {{{ PHP_INI_MH
*/
static PHP_INI_MH(OnUpdateTimeout)
@ -1819,6 +1870,9 @@ static void core_globals_dtor(php_core_globals *core_globals TSRMLS_DC)
if (core_globals->disable_classes) {
free(core_globals->disable_classes);
}
if (core_globals->php_binary) {
free(core_globals->php_binary);
}
php_shutdown_ticks(TSRMLS_C);
}
@ -2069,6 +2123,13 @@ int php_module_startup(sapi_module_struct *sf, zend_module_entry *additional_mod
REGISTER_MAIN_LONG_CONSTANT("PHP_WINDOWS_NT_WORKSTATION", VER_NT_WORKSTATION, CONST_PERSISTENT | CONST_CS);
#endif
php_binary_init(TSRMLS_C);
if (PG(php_binary)) {
REGISTER_MAIN_STRINGL_CONSTANT("PHP_BINARY", PG(php_binary), strlen(PG(php_binary)), CONST_PERSISTENT | CONST_CS);
} else {
REGISTER_MAIN_STRINGL_CONSTANT("PHP_BINARY", "", 0, CONST_PERSISTENT | CONST_CS);
}
php_output_register_constants(TSRMLS_C);
php_rfc1867_register_constants(TSRMLS_C);

1
main/php_globals.h

@ -84,6 +84,7 @@ struct _php_core_globals {
char *include_path;
char *open_basedir;
char *extension_dir;
char *php_binary;
char *upload_tmp_dir;
long upload_max_filesize;

51
main/php_ini.c

@ -393,7 +393,6 @@ int php_init_config(TSRMLS_D)
int search_path_size;
char *default_location;
char *env_location;
char *binary_location;
static const char paths_separator[] = { ZEND_PATHS_SEPARATOR, 0 };
#ifdef PHP_WIN32
char *reg_location;
@ -472,51 +471,11 @@ int php_init_config(TSRMLS_D)
strlcat(php_ini_search_path, ".", search_path_size);
}
/* Add binary directory */
#ifdef PHP_WIN32
binary_location = (char *) emalloc(MAXPATHLEN);
if (GetModuleFileName(0, binary_location, MAXPATHLEN) == 0) {
efree(binary_location);
binary_location = NULL;
}
#else
if (sapi_module.executable_location) {
binary_location = (char *)emalloc(MAXPATHLEN);
if (!strchr(sapi_module.executable_location, '/')) {
char *envpath, *path;
int found = 0;
if ((envpath = getenv("PATH")) != NULL) {
char *search_dir, search_path[MAXPATHLEN];
char *last = NULL;
path = estrdup(envpath);
search_dir = php_strtok_r(path, ":", &last);
while (search_dir) {
snprintf(search_path, MAXPATHLEN, "%s/%s", search_dir, sapi_module.executable_location);
if (VCWD_REALPATH(search_path, binary_location) && !VCWD_ACCESS(binary_location, X_OK)) {
found = 1;
break;
}
search_dir = php_strtok_r(NULL, ":", &last);
}
efree(path);
}
if (!found) {
efree(binary_location);
binary_location = NULL;
}
} else if (!VCWD_REALPATH(sapi_module.executable_location, binary_location) || VCWD_ACCESS(binary_location, X_OK)) {
efree(binary_location);
binary_location = NULL;
}
} else {
binary_location = NULL;
}
#endif
if (binary_location) {
char *separator_location = strrchr(binary_location, DEFAULT_SLASH);
if (PG(php_binary)) {
char *separator_location, *binary_location;
binary_location = estrdup(PG(php_binary));
separator_location = strrchr(binary_location, DEFAULT_SLASH);
if (separator_location && separator_location != binary_location) {
*(separator_location) = 0;

9
tests/basic/bug54514.phpt

@ -0,0 +1,9 @@
--TEST--
Req #54514 (Get php binary path during script execution)
--FILE--
<?php
if(getenv('TEST_PHP_EXECUTABLE') === PHP_BINARY) {
echo "done";
}
--EXPECT--
done
Loading…
Cancel
Save