]> granicus.if.org Git - php/commitdiff
Implemented FR #54514 (Get php binary path during script execution).
authorXinchen Hui <laruence@php.net>
Wed, 7 Dec 2011 10:33:13 +0000 (10:33 +0000)
committerXinchen Hui <laruence@php.net>
Wed, 7 Dec 2011 10:33:13 +0000 (10:33 +0000)
NEWS
main/main.c
main/php_globals.h
main/php_ini.c
tests/basic/bug54514.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 4056bbb77e4b2cf7ee4616eb244bf422bae1a814..71d070823b09c8a44f55fae78e7b5a180662f33e 100644 (file)
--- a/NEWS
+++ b/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)
index 0ba60716a3849a5c96c439cc014f838fdfe7c80e..b92e2d70468c83376e200f5a782cca7066325786 100644 (file)
@@ -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);
 
index 6e5611ec5c35dcd46e9a88226ec3f5789ee55b99..bfd1c6025f8b2052ce98c32f0718ddb5dce206a9 100644 (file)
@@ -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;
index 1ffc08b1871a850c4504e4dcfe8cd2e060694b6b..dd7435bb32a413273493e2fef035559a5df2b6bf 100644 (file)
@@ -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;
diff --git a/tests/basic/bug54514.phpt b/tests/basic/bug54514.phpt
new file mode 100644 (file)
index 0000000..f53a318
--- /dev/null
@@ -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