summaryrefslogtreecommitdiffstats
path: root/php-5.4.16-iniscan.patch
blob: 237c09fdebf21764ca3a873224b207bff246e15a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
From da84f3af751aa9bbf76bc22924a488f981d47088 Mon Sep 17 00:00:00 2001
From: Remi Collet <remi@php.net>
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