From 506952068f4d79a3eb20e0f176bf34b16cafe8e1 Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Mon, 22 Dec 2014 14:50:26 +0100 Subject: php54-php: allow multiple paths in ini_scan_dir --- php-5.4.16-iniscan.patch | 159 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100644 php-5.4.16-iniscan.patch (limited to 'php-5.4.16-iniscan.patch') diff --git a/php-5.4.16-iniscan.patch b/php-5.4.16-iniscan.patch new file mode 100644 index 0000000..237c09f --- /dev/null +++ b/php-5.4.16-iniscan.patch @@ -0,0 +1,159 @@ +From da84f3af751aa9bbf76bc22924a488f981d47088 Mon Sep 17 00:00:00 2001 +From: Remi Collet +Date: Wed, 29 Jan 2014 09:53:22 +0100 +Subject: [PATCH] Fixed Request #66574 Allow multiple paths in + php_ini_scanned_path + +php_ini_scanned_path, from --with-config-file-scan-dir option or +from PHP_INI_SCAN_DIR environment variable allow a single path. + +In some case it could be useful to allow multiple. + +In the proposed patch, multiple paths are allow, using syntax inspired +from Unix MANPATH (: separated list, empty string for builtin value). + +For example, this allow to use: +PHP_INI_SCAN_DIR=/foo/php.d:/bar/php.d php +PHP_INI_SCAN_DIR=:/myproject/php.d php +PHP_INI_SCAN_DIR=/myproject/php.d: php + +Real use case: in SCL for dependent collections where each collection +provides a separate tree for extensions, libraries and ini files. +--- + NEWS | 3 ++ + main/php_ini.c | 106 +++++++++++++++++++++++++++++++++------------------------ + 2 files changed, 65 insertions(+), 44 deletions(-) + +diff --git a/main/php_ini.c b/main/php_ini.c +index 1faec68..e20ba4b 100644 +--- a/main/php_ini.c ++++ b/main/php_ini.c +@@ -613,63 +613,81 @@ int php_init_config(TSRMLS_D) + zend_llist scanned_ini_list; + zend_llist_element *element; + int l, total_l = 0; ++ char *bufpath, *debpath, *endpath; ++ int lenpath; + +- if ((ndir = php_scandir(php_ini_scanned_path, &namelist, 0, php_alphasort)) > 0) { +- zend_llist_init(&scanned_ini_list, sizeof(char *), (llist_dtor_func_t) free_estring, 1); +- memset(&fh2, 0, sizeof(fh2)); ++ zend_llist_init(&scanned_ini_list, sizeof(char *), (llist_dtor_func_t) free_estring, 1); ++ memset(&fh2, 0, sizeof(fh2)); + +- for (i = 0; i < ndir; i++) { ++ bufpath = estrdup(php_ini_scanned_path); ++ for (debpath = bufpath ; debpath ; debpath=endpath) { ++ endpath = strchr(debpath, DEFAULT_DIR_SEPARATOR); ++ if (endpath) { ++ *(endpath++) = 0; ++ } ++ if (!debpath[0]) { ++ /* empty string means default builtin value ++ to allow "/foo/phd.d:" or ":/foo/php.d" */ ++ debpath = PHP_CONFIG_FILE_SCAN_DIR; ++ } ++ lenpath = strlen(debpath); + +- /* check for any file with .ini extension */ +- if (!(p = strrchr(namelist[i]->d_name, '.')) || (p && strcmp(p, ".ini"))) { +- free(namelist[i]); +- continue; +- } +- /* Reset active ini section */ +- RESET_ACTIVE_INI_HASH(); ++ if (lenpath > 0 && (ndir = php_scandir(debpath, &namelist, 0, php_alphasort)) > 0) { + +- if (IS_SLASH(php_ini_scanned_path[php_ini_scanned_path_len - 1])) { +- snprintf(ini_file, MAXPATHLEN, "%s%s", php_ini_scanned_path, namelist[i]->d_name); +- } else { +- snprintf(ini_file, MAXPATHLEN, "%s%c%s", php_ini_scanned_path, DEFAULT_SLASH, namelist[i]->d_name); +- } +- if (VCWD_STAT(ini_file, &sb) == 0) { +- if (S_ISREG(sb.st_mode)) { +- if ((fh2.handle.fp = VCWD_FOPEN(ini_file, "r"))) { +- fh2.filename = ini_file; +- fh2.type = ZEND_HANDLE_FP; +- +- if (zend_parse_ini_file(&fh2, 1, ZEND_INI_SCANNER_NORMAL, (zend_ini_parser_cb_t) php_ini_parser_cb, &configuration_hash TSRMLS_CC) == SUCCESS) { +- /* Here, add it to the list of ini files read */ +- l = strlen(ini_file); +- total_l += l + 2; +- p = estrndup(ini_file, l); +- zend_llist_add_element(&scanned_ini_list, &p); ++ for (i = 0; i < ndir; i++) { ++ ++ /* check for any file with .ini extension */ ++ if (!(p = strrchr(namelist[i]->d_name, '.')) || (p && strcmp(p, ".ini"))) { ++ free(namelist[i]); ++ continue; ++ } ++ /* Reset active ini section */ ++ RESET_ACTIVE_INI_HASH(); ++ ++ if (IS_SLASH(debpath[lenpath - 1])) { ++ snprintf(ini_file, MAXPATHLEN, "%s%s", debpath, namelist[i]->d_name); ++ } else { ++ snprintf(ini_file, MAXPATHLEN, "%s%c%s", debpath, DEFAULT_SLASH, namelist[i]->d_name); ++ } ++ if (VCWD_STAT(ini_file, &sb) == 0) { ++ if (S_ISREG(sb.st_mode)) { ++ if ((fh2.handle.fp = VCWD_FOPEN(ini_file, "r"))) { ++ fh2.filename = ini_file; ++ fh2.type = ZEND_HANDLE_FP; ++ ++ if (zend_parse_ini_file(&fh2, 1, ZEND_INI_SCANNER_NORMAL, (zend_ini_parser_cb_t) php_ini_parser_cb, &configuration_hash TSRMLS_CC) == SUCCESS) { ++ /* Here, add it to the list of ini files read */ ++ l = strlen(ini_file); ++ total_l += l + 2; ++ p = estrndup(ini_file, l); ++ zend_llist_add_element(&scanned_ini_list, &p); ++ } + } + } + } ++ free(namelist[i]); + } +- free(namelist[i]); ++ free(namelist); + } +- free(namelist); ++ } ++ efree(bufpath); + +- if (total_l) { +- int php_ini_scanned_files_len = (php_ini_scanned_files) ? strlen(php_ini_scanned_files) + 1 : 0; +- php_ini_scanned_files = (char *) realloc(php_ini_scanned_files, php_ini_scanned_files_len + total_l + 1); +- if (!php_ini_scanned_files_len) { +- *php_ini_scanned_files = '\0'; +- } +- total_l += php_ini_scanned_files_len; +- for (element = scanned_ini_list.head; element; element = element->next) { +- if (php_ini_scanned_files_len) { +- strlcat(php_ini_scanned_files, ",\n", total_l); +- } +- strlcat(php_ini_scanned_files, *(char **)element->data, total_l); +- strlcat(php_ini_scanned_files, element->next ? ",\n" : "\n", total_l); ++ if (total_l) { ++ int php_ini_scanned_files_len = (php_ini_scanned_files) ? strlen(php_ini_scanned_files) + 1 : 0; ++ php_ini_scanned_files = (char *) realloc(php_ini_scanned_files, php_ini_scanned_files_len + total_l + 1); ++ if (!php_ini_scanned_files_len) { ++ *php_ini_scanned_files = '\0'; ++ } ++ total_l += php_ini_scanned_files_len; ++ for (element = scanned_ini_list.head; element; element = element->next) { ++ if (php_ini_scanned_files_len) { ++ strlcat(php_ini_scanned_files, ",\n", total_l); + } ++ strlcat(php_ini_scanned_files, *(char **)element->data, total_l); ++ strlcat(php_ini_scanned_files, element->next ? ",\n" : "\n", total_l); + } +- zend_llist_destroy(&scanned_ini_list); + } ++ zend_llist_destroy(&scanned_ini_list); + } else { + /* Make sure an empty php_ini_scanned_path ends up as NULL */ + php_ini_scanned_path = NULL; +-- +1.8.4.3 + -- cgit