Blame SOURCES/php-5.5.6-iniscan.patch

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