Skip to content

Commit

Permalink
Implemented FR #54514 (Get php binary path during script execution).
Browse files Browse the repository at this point in the history
  • Loading branch information
laruence committed Dec 7, 2011
1 parent 0420858 commit b5766cd
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 46 deletions.
61 changes: 61 additions & 0 deletions main/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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);

Expand Down
1 change: 1 addition & 0 deletions main/php_globals.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
51 changes: 5 additions & 46 deletions main/php_ini.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
9 changes: 9 additions & 0 deletions tests/basic/bug54514.phpt
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit b5766cd

Please sign in to comment.