Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 922 lines (812 sloc) 27.469 kb
651e232 @zsuraski Testing 123
zsuraski authored
1 /*
2 +----------------------------------------------------------------------+
dbeb415 @andigutmans - A belated happy holidays and PHP 5
andigutmans authored
3 | PHP Version 5 |
651e232 @zsuraski Testing 123
zsuraski authored
4 +----------------------------------------------------------------------+
d1dded8 MFH: Bump copyright year, 2 of 2.
Sebastian Bergmann authored
5 | Copyright (c) 1997-2008 The PHP Group |
651e232 @zsuraski Testing 123
zsuraski authored
6 +----------------------------------------------------------------------+
5bd9322 bump year and license version
foobar authored
7 | This source file is subject to version 3.01 of the PHP license, |
9d1817e Fix bug: #10323. Every value outputted is now escaped.
foobar authored
8 | that is bundled with this package in the file LICENSE, and is |
f68c7ff updating license information in the headers.
James Cox authored
9 | available through the world-wide-web at the following url: |
5bd9322 bump year and license version
foobar authored
10 | http://www.php.net/license/3_01.txt |
c5724cb @zsuraski License update
zsuraski authored
11 | If you did not receive a copy of the PHP license and are unable to |
9d1817e Fix bug: #10323. Every value outputted is now escaped.
foobar authored
12 | obtain it through the world-wide-web, please send a note to |
13 | license@php.net so we can mail you a copy immediately. |
651e232 @zsuraski Testing 123
zsuraski authored
14 +----------------------------------------------------------------------+
9d1817e Fix bug: #10323. Every value outputted is now escaped.
foobar authored
15 | Author: Zeev Suraski <zeev@zend.com> |
651e232 @zsuraski Testing 123
zsuraski authored
16 +----------------------------------------------------------------------+
17 */
18
46a7b0c @fmk Killing compiler warning on Win32
fmk authored
19 /* $Id$ */
651e232 @zsuraski Testing 123
zsuraski authored
20
aceaabc @zsuraski PHP 4.0
zsuraski authored
21 #include "php.h"
bc415d5 @zsuraski * Finalizing the PHP version of SAPI. Support POST and cookies among ot...
zsuraski authored
22 #include "ext/standard/info.h"
1fd0913 @zsuraski Initial steps to move the INI mechanism to the Zend engine
zsuraski authored
23 #include "zend_ini.h"
09b6f37 MFH:
Jani Taskinen authored
24 #include "zend_ini_scanner.h"
78194a4 @zsuraski - Complete the move to the new INI parser. (Side effect: at last, peop...
zsuraski authored
25 #include "php_ini.h"
26 #include "ext/standard/dl.h"
27 #include "zend_extensions.h"
9d1817e Fix bug: #10323. Every value outputted is now escaped.
foobar authored
28 #include "zend_highlight.h"
ab25640 Removed CWD from php_ini_search_path when using CLI SAPI.
Edin Kadribasic authored
29 #include "SAPI.h"
46a7b0c @fmk Killing compiler warning on Win32
fmk authored
30 #include "php_main.h"
ec11fe0 Fix the possible conflicts with other libs (like libc-client)
foobar authored
31 #include "php_scandir.h"
06aae4b @smalyshev Enable setting php.ini path via the registry
smalyshev authored
32 #ifdef PHP_WIN32
33 #include "win32/php_registry.h"
34 #endif
78194a4 @zsuraski - Complete the move to the new INI parser. (Side effect: at last, peop...
zsuraski authored
35
ec11fe0 Fix the possible conflicts with other libs (like libc-client)
foobar authored
36 #if HAVE_SCANDIR && HAVE_ALPHASORT && HAVE_DIRENT_H
37 #include <dirent.h>
82f6cef Fix broken build by adding scandir and alphasort for win32
Shane Caraveo authored
38 #endif
8d352d2 Fixed bug #21625 (When scanning a directory for ini files, do so in
Ilia Alshanetsky authored
39
989a61e @rlerdorf As discussed, add --with-config-file-scan-dir compile-time switch defini...
rlerdorf authored
40 #ifndef S_ISREG
41 #define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG)
42 #endif
43
d294f46 @zsuraski - Remove the ini_extension_list global
zsuraski authored
44 typedef struct _php_extension_lists {
42c82bb Revert the last patches.
foobar authored
45 zend_llist engine;
46 zend_llist functions;
d294f46 @zsuraski - Remove the ini_extension_list global
zsuraski authored
47 } php_extension_lists;
58e24ac @zsuraski - Add PHP Modules workspace
zsuraski authored
48
9db5589 @zsuraski Recode delayed loading in a much simpler way (switched back to php_ini.c...
zsuraski authored
49 /* True globals */
02d966c MFH:- Added support for [HOST=www.example.com] special sections
Jani Taskinen authored
50 static int is_special_section = 0;
09b6f37 MFH:
Jani Taskinen authored
51 static HashTable *active_ini_hash;
9db5589 @zsuraski Recode delayed loading in a much simpler way (switched back to php_ini.c...
zsuraski authored
52 static HashTable configuration_hash;
ba8e317 Optimized request startup sequence for php.ini without per dir and per h...
Dmitry Stogov authored
53 static int has_per_dir_config = 0;
54 static int has_per_host_config = 0;
9db5589 @zsuraski Recode delayed loading in a much simpler way (switched back to php_ini.c...
zsuraski authored
55 PHPAPI char *php_ini_opened_path=NULL;
56 static php_extension_lists extension_lists;
e5e6f55 MFH
Jani Taskinen authored
57 PHPAPI char *php_ini_scanned_path=NULL;
989a61e @rlerdorf As discussed, add --with-config-file-scan-dir compile-time switch defini...
rlerdorf authored
58 PHPAPI char *php_ini_scanned_files=NULL;
9db5589 @zsuraski Recode delayed loading in a much simpler way (switched back to php_ini.c...
zsuraski authored
59
81e2cf0 @rlerdorf Fix folding and clean up some extensions
rlerdorf authored
60 /* {{{ php_ini_displayer_cb
61 */
09b6f37 MFH:
Jani Taskinen authored
62 static void php_ini_displayer_cb(zend_ini_entry *ini_entry, int type TSRMLS_DC)
bc415d5 @zsuraski * Finalizing the PHP version of SAPI. Support POST and cookies among ot...
zsuraski authored
63 {
42c82bb Revert the last patches.
foobar authored
64 if (ini_entry->displayer) {
65 ini_entry->displayer(ini_entry, type);
66 } else {
67 char *display_string;
68 uint display_string_length, esc_html=0;
69
7e3b508 ws/style fixes
foobar authored
70 if (type == ZEND_INI_DISPLAY_ORIG && ini_entry->modified) {
42c82bb Revert the last patches.
foobar authored
71 if (ini_entry->orig_value && ini_entry->orig_value[0]) {
72 display_string = ini_entry->orig_value;
73 display_string_length = ini_entry->orig_value_length;
b5c97d8 fix phpinfo() & php -i
Marcus Boerger authored
74 esc_html = !sapi_module.phpinfo_as_text;
42c82bb Revert the last patches.
foobar authored
75 } else {
b5c97d8 fix phpinfo() & php -i
Marcus Boerger authored
76 if (!sapi_module.phpinfo_as_text) {
d6497fc - reenable "no value" output. thanks to sebastian for pointing that out...
Jan Lehnardt authored
77 display_string = "<i>no value</i>";
7e3b508 ws/style fixes
foobar authored
78 display_string_length = sizeof("<i>no value</i>") - 1;
d6497fc - reenable "no value" output. thanks to sebastian for pointing that out...
Jan Lehnardt authored
79 } else {
80 display_string = "no value";
7e3b508 ws/style fixes
foobar authored
81 display_string_length = sizeof("no value") - 1;
9be89ed MFH: ws fixes
Jani Taskinen authored
82 }
42c82bb Revert the last patches.
foobar authored
83 }
84 } else if (ini_entry->value && ini_entry->value[0]) {
85 display_string = ini_entry->value;
86 display_string_length = ini_entry->value_length;
b5c97d8 fix phpinfo() & php -i
Marcus Boerger authored
87 esc_html = !sapi_module.phpinfo_as_text;
42c82bb Revert the last patches.
foobar authored
88 } else {
b5c97d8 fix phpinfo() & php -i
Marcus Boerger authored
89 if (!sapi_module.phpinfo_as_text) {
d6497fc - reenable "no value" output. thanks to sebastian for pointing that out...
Jan Lehnardt authored
90 display_string = "<i>no value</i>";
7e3b508 ws/style fixes
foobar authored
91 display_string_length = sizeof("<i>no value</i>") - 1;
d6497fc - reenable "no value" output. thanks to sebastian for pointing that out...
Jan Lehnardt authored
92 } else {
93 display_string = "no value";
7e3b508 ws/style fixes
foobar authored
94 display_string_length = sizeof("no value") - 1;
9be89ed MFH: ws fixes
Jani Taskinen authored
95 }
42c82bb Revert the last patches.
foobar authored
96 }
7e3b508 ws/style fixes
foobar authored
97
98 if (esc_html) {
a769454 reenable php_html_puts
Sascha Schumann authored
99 php_html_puts(display_string, display_string_length TSRMLS_CC);
42c82bb Revert the last patches.
foobar authored
100 } else {
101 PHPWRITE(display_string, display_string_length);
102 }
103 }
bc415d5 @zsuraski * Finalizing the PHP version of SAPI. Support POST and cookies among ot...
zsuraski authored
104 }
81e2cf0 @rlerdorf Fix folding and clean up some extensions
rlerdorf authored
105 /* }}} */
bc415d5 @zsuraski * Finalizing the PHP version of SAPI. Support POST and cookies among ot...
zsuraski authored
106
81e2cf0 @rlerdorf Fix folding and clean up some extensions
rlerdorf authored
107 /* {{{ php_ini_displayer
108 */
d76cf1d @zsuraski More TSRMLS_FETCH work
zsuraski authored
109 static int php_ini_displayer(zend_ini_entry *ini_entry, int module_number TSRMLS_DC)
bc415d5 @zsuraski * Finalizing the PHP version of SAPI. Support POST and cookies among ot...
zsuraski authored
110 {
42c82bb Revert the last patches.
foobar authored
111 if (ini_entry->module_number != module_number) {
112 return 0;
113 }
b5c97d8 fix phpinfo() & php -i
Marcus Boerger authored
114 if (!sapi_module.phpinfo_as_text) {
14a6cc8 Change phpinfo() to use CSS styling instead of HTML code.
Colin Viebrock authored
115 PUTS("<tr>");
c7c275b fix phpinfo() output for better browser BC
Colin Viebrock authored
116 PUTS("<td class=\"e\">");
7e3b508 ws/style fixes
foobar authored
117 PHPWRITE(ini_entry->name, ini_entry->name_length - 1);
c7c275b fix phpinfo() output for better browser BC
Colin Viebrock authored
118 PUTS("</td><td class=\"v\">");
09b6f37 MFH:
Jani Taskinen authored
119 php_ini_displayer_cb(ini_entry, ZEND_INI_DISPLAY_ACTIVE TSRMLS_CC);
c7c275b fix phpinfo() output for better browser BC
Colin Viebrock authored
120 PUTS("</td><td class=\"v\">");
09b6f37 MFH:
Jani Taskinen authored
121 php_ini_displayer_cb(ini_entry, ZEND_INI_DISPLAY_ORIG TSRMLS_CC);
6676617 - add phpinfo() support for CLI.
Jan Lehnardt authored
122 PUTS("</td></tr>\n");
123 } else {
7e3b508 ws/style fixes
foobar authored
124 PHPWRITE(ini_entry->name, ini_entry->name_length - 1);
6676617 - add phpinfo() support for CLI.
Jan Lehnardt authored
125 PUTS(" => ");
09b6f37 MFH:
Jani Taskinen authored
126 php_ini_displayer_cb(ini_entry, ZEND_INI_DISPLAY_ACTIVE TSRMLS_CC);
6676617 - add phpinfo() support for CLI.
Jan Lehnardt authored
127 PUTS(" => ");
09b6f37 MFH:
Jani Taskinen authored
128 php_ini_displayer_cb(ini_entry, ZEND_INI_DISPLAY_ORIG TSRMLS_CC);
6676617 - add phpinfo() support for CLI.
Jan Lehnardt authored
129 PUTS("\n");
9be89ed MFH: ws fixes
Jani Taskinen authored
130 }
42c82bb Revert the last patches.
foobar authored
131 return 0;
bc415d5 @zsuraski * Finalizing the PHP version of SAPI. Support POST and cookies among ot...
zsuraski authored
132 }
81e2cf0 @rlerdorf Fix folding and clean up some extensions
rlerdorf authored
133 /* }}} */
bc415d5 @zsuraski * Finalizing the PHP version of SAPI. Support POST and cookies among ot...
zsuraski authored
134
d6d4121 - MFH Do not show empty ini directive tables for modules without ini ent...
Marcus Boerger authored
135 /* {{{ php_ini_available
136 */
137 static int php_ini_available(zend_ini_entry *ini_entry, int *module_number_available TSRMLS_DC)
138 {
139 if (ini_entry->module_number == *module_number_available) {
140 *module_number_available = -1;
141 return ZEND_HASH_APPLY_STOP;
142 } else {
143 return ZEND_HASH_APPLY_KEEP;
144 }
145 }
146 /* }}} */
147
81e2cf0 @rlerdorf Fix folding and clean up some extensions
rlerdorf authored
148 /* {{{ display_ini_entries
149 */
bc415d5 @zsuraski * Finalizing the PHP version of SAPI. Support POST and cookies among ot...
zsuraski authored
150 PHPAPI void display_ini_entries(zend_module_entry *module)
151 {
d6d4121 - MFH Do not show empty ini directive tables for modules without ini ent...
Marcus Boerger authored
152 int module_number, module_number_available;
42c82bb Revert the last patches.
foobar authored
153 TSRMLS_FETCH();
154
155 if (module) {
156 module_number = module->module_number;
9be89ed MFH: ws fixes
Jani Taskinen authored
157 } else {
42c82bb Revert the last patches.
foobar authored
158 module_number = 0;
159 }
d6d4121 - MFH Do not show empty ini directive tables for modules without ini ent...
Marcus Boerger authored
160 module_number_available = module_number;
161 zend_hash_apply_with_argument(EG(ini_directives), (apply_func_arg_t) php_ini_available, &module_number_available TSRMLS_CC);
162 if (module_number_available == -1) {
163 php_info_print_table_start();
164 php_info_print_table_header(3, "Directive", "Local Value", "Master Value");
165 zend_hash_apply_with_argument(EG(ini_directives), (apply_func_arg_t) php_ini_displayer, (void *) (zend_intptr_t) module_number TSRMLS_CC);
166 php_info_print_table_end();
167 }
bc415d5 @zsuraski * Finalizing the PHP version of SAPI. Support POST and cookies among ot...
zsuraski authored
168 }
81e2cf0 @rlerdorf Fix folding and clean up some extensions
rlerdorf authored
169 /* }}} */
78194a4 @zsuraski - Complete the move to the new INI parser. (Side effect: at last, peop...
zsuraski authored
170
171 /* php.ini support */
02d966c MFH:- Added support for [HOST=www.example.com] special sections
Jani Taskinen authored
172 #define PHP_EXTENSION_TOKEN "extension"
78194a4 @zsuraski - Complete the move to the new INI parser. (Side effect: at last, peop...
zsuraski authored
173 #ifdef ZTS
174 # if (ZEND_DEBUG)
5af649e @zsuraski Revert to the old php_ini.c, and reimplement the binary-path searching.
zsuraski authored
175 # define ZEND_EXTENSION_TOKEN "zend_extension_debug_ts"
78194a4 @zsuraski - Complete the move to the new INI parser. (Side effect: at last, peop...
zsuraski authored
176 # else
5af649e @zsuraski Revert to the old php_ini.c, and reimplement the binary-path searching.
zsuraski authored
177 # define ZEND_EXTENSION_TOKEN "zend_extension_ts"
78194a4 @zsuraski - Complete the move to the new INI parser. (Side effect: at last, peop...
zsuraski authored
178 # endif
179 #else
180 # if (ZEND_DEBUG)
5af649e @zsuraski Revert to the old php_ini.c, and reimplement the binary-path searching.
zsuraski authored
181 # define ZEND_EXTENSION_TOKEN "zend_extension_debug"
78194a4 @zsuraski - Complete the move to the new INI parser. (Side effect: at last, peop...
zsuraski authored
182 # else
5af649e @zsuraski Revert to the old php_ini.c, and reimplement the binary-path searching.
zsuraski authored
183 # define ZEND_EXTENSION_TOKEN "zend_extension"
78194a4 @zsuraski - Complete the move to the new INI parser. (Side effect: at last, peop...
zsuraski authored
184 # endif
185 #endif
186
09b6f37 MFH:
Jani Taskinen authored
187 /* {{{ config_zval_dtor
81e2cf0 @rlerdorf Fix folding and clean up some extensions
rlerdorf authored
188 */
1674976 MFH: Fixed win32 build.
Jani Taskinen authored
189 PHPAPI void config_zval_dtor(zval *zvalue)
78194a4 @zsuraski - Complete the move to the new INI parser. (Side effect: at last, peop...
zsuraski authored
190 {
09b6f37 MFH:
Jani Taskinen authored
191 if (Z_TYPE_P(zvalue) == IS_ARRAY) {
192 zend_hash_destroy(Z_ARRVAL_P(zvalue));
193 free(Z_ARRVAL_P(zvalue));
194 } else if (Z_TYPE_P(zvalue) == IS_STRING) {
195 free(Z_STRVAL_P(zvalue));
196 }
197 }
198 /* Reset / free active_ini_sectin global */
199 #define RESET_ACTIVE_INI_HASH() do { \
200 active_ini_hash = NULL; \
201 } while (0)
202 /* }}} */
203
204 /* {{{ php_ini_parser_cb
205 */
206 static void php_ini_parser_cb(zval *arg1, zval *arg2, zval *arg3, int callback_type, HashTable *target_hash)
207 {
208 zval *entry;
209 HashTable *active_hash;
02d966c MFH:- Added support for [HOST=www.example.com] special sections
Jani Taskinen authored
210 char *extension_name;
09b6f37 MFH:
Jani Taskinen authored
211
212 if (active_ini_hash) {
213 active_hash = active_ini_hash;
214 } else {
215 active_hash = target_hash;
216 }
217
42c82bb Revert the last patches.
foobar authored
218 switch (callback_type) {
219 case ZEND_INI_PARSER_ENTRY: {
220 if (!arg2) {
09b6f37 MFH:
Jani Taskinen authored
221 /* bare string - nothing to do */
42c82bb Revert the last patches.
foobar authored
222 break;
223 }
09b6f37 MFH:
Jani Taskinen authored
224
225 /* PHP and Zend extensions are not added into configuration hash! */
02d966c MFH:- Added support for [HOST=www.example.com] special sections
Jani Taskinen authored
226 if (!is_special_section && !strcasecmp(Z_STRVAL_P(arg1), PHP_EXTENSION_TOKEN)) { /* load PHP extension */
227 extension_name = estrndup(Z_STRVAL_P(arg2), Z_STRLEN_P(arg2));
228 zend_llist_add_element(&extension_lists.functions, &extension_name);
229 } else if (!is_special_section && !strcasecmp(Z_STRVAL_P(arg1), ZEND_EXTENSION_TOKEN)) { /* load Zend extension */
230 extension_name = estrndup(Z_STRVAL_P(arg2), Z_STRLEN_P(arg2));
42c82bb Revert the last patches.
foobar authored
231 zend_llist_add_element(&extension_lists.engine, &extension_name);
09b6f37 MFH:
Jani Taskinen authored
232
233 /* All other entries are added into either configuration_hash or active ini section array */
42c82bb Revert the last patches.
foobar authored
234 } else {
09b6f37 MFH:
Jani Taskinen authored
235 /* Store in active hash */
236 zend_hash_update(active_hash, Z_STRVAL_P(arg1), Z_STRLEN_P(arg1) + 1, arg2, sizeof(zval), (void **) &entry);
42c82bb Revert the last patches.
foobar authored
237 Z_STRVAL_P(entry) = zend_strndup(Z_STRVAL_P(entry), Z_STRLEN_P(entry));
238 }
239 }
240 break;
b51b6f0 ini patch to allow 'entry[] = value' entries
Harald Radi authored
241
242 case ZEND_INI_PARSER_POP_ENTRY: {
09b6f37 MFH:
Jani Taskinen authored
243 zval *option_arr;
244 zval *find_arr;
b51b6f0 ini patch to allow 'entry[] = value' entries
Harald Radi authored
245
246 if (!arg2) {
247 /* bare string - nothing to do */
248 break;
249 }
250
09b6f37 MFH:
Jani Taskinen authored
251 /* fprintf(stdout, "ZEND_INI_PARSER_POP_ENTRY: %s[%s] = %s\n",Z_STRVAL_P(arg1), Z_STRVAL_P(arg3), Z_STRVAL_P(arg2)); */
252
253 /* If option not found in hash or is not an array -> create array, otherwise add to existing array */
254 if (zend_hash_find(active_hash, Z_STRVAL_P(arg1), Z_STRLEN_P(arg1) + 1, (void **) &find_arr) == FAILURE || Z_TYPE_P(find_arr) != IS_ARRAY) {
255 option_arr = (zval *) pemalloc(sizeof(zval), 1);
256 INIT_PZVAL(option_arr);
257 Z_TYPE_P(option_arr) = IS_ARRAY;
258 Z_ARRVAL_P(option_arr) = (HashTable *) pemalloc(sizeof(HashTable), 1);
259 zend_hash_init(Z_ARRVAL_P(option_arr), 0, NULL, (dtor_func_t) config_zval_dtor, 1);
260 zend_hash_update(active_hash, Z_STRVAL_P(arg1), Z_STRLEN_P(arg1) + 1, option_arr, sizeof(zval), (void **) &find_arr);
261 free(option_arr);
262 }
b51b6f0 ini patch to allow 'entry[] = value' entries
Harald Radi authored
263
09b6f37 MFH:
Jani Taskinen authored
264 /* arg3 is possible option offset name */
265 if (arg3 && Z_STRLEN_P(arg3) > 0) {
266 zend_symtable_update(Z_ARRVAL_P(find_arr), Z_STRVAL_P(arg3), Z_STRLEN_P(arg3) + 1, arg2, sizeof(zval), (void **) &entry);
b51b6f0 ini patch to allow 'entry[] = value' entries
Harald Radi authored
267 } else {
09b6f37 MFH:
Jani Taskinen authored
268 zend_hash_next_index_insert(Z_ARRVAL_P(find_arr), arg2, sizeof(zval), (void **) &entry);
b51b6f0 ini patch to allow 'entry[] = value' entries
Harald Radi authored
269 }
09b6f37 MFH:
Jani Taskinen authored
270 Z_STRVAL_P(entry) = zend_strndup(Z_STRVAL_P(entry), Z_STRLEN_P(entry));
b51b6f0 ini patch to allow 'entry[] = value' entries
Harald Radi authored
271 }
272 break;
273
09b6f37 MFH:
Jani Taskinen authored
274 case ZEND_INI_PARSER_SECTION: { /* Create an array of entries of each section */
275
276 /* fprintf(stdout, "ZEND_INI_PARSER_SECTION: %s\n",Z_STRVAL_P(arg1)); */
277
278 char *key = NULL;
279 uint key_len;
280
02d966c MFH:- Added support for [HOST=www.example.com] special sections
Jani Taskinen authored
281 /* PATH sections */
09b6f37 MFH:
Jani Taskinen authored
282 if (!strncasecmp(Z_STRVAL_P(arg1), "PATH", sizeof("PATH") - 1)) {
283 key = Z_STRVAL_P(arg1);
284 key = key + sizeof("PATH") - 1;
285 key_len = Z_STRLEN_P(arg1) - sizeof("PATH") + 1;
02d966c MFH:- Added support for [HOST=www.example.com] special sections
Jani Taskinen authored
286 is_special_section = 1;
ba8e317 Optimized request startup sequence for php.ini without per dir and per h...
Dmitry Stogov authored
287 has_per_dir_config = 1;
09b6f37 MFH:
Jani Taskinen authored
288
02d966c MFH:- Added support for [HOST=www.example.com] special sections
Jani Taskinen authored
289 /* HOST sections */
09b6f37 MFH:
Jani Taskinen authored
290 } else if (!strncasecmp(Z_STRVAL_P(arg1), "HOST", sizeof("HOST") - 1)) {
291 key = Z_STRVAL_P(arg1);
292 key = key + sizeof("HOST") - 1;
293 key_len = Z_STRLEN_P(arg1) - sizeof("HOST") + 1;
02d966c MFH:- Added support for [HOST=www.example.com] special sections
Jani Taskinen authored
294 is_special_section = 1;
ba8e317 Optimized request startup sequence for php.ini without per dir and per h...
Dmitry Stogov authored
295 has_per_host_config = 1;
296
02d966c MFH:- Added support for [HOST=www.example.com] special sections
Jani Taskinen authored
297 } else {
298 is_special_section = 0;
09b6f37 MFH:
Jani Taskinen authored
299 }
300
301 if (key && key_len > 0) {
302 /* Strip any trailing slashes */
303 while (key_len > 0 && (key[key_len - 1] == '/' || key[key_len - 1] == '\\')) {
304 key_len--;
305 key[key_len] = 0;
306 }
307
308 /* Strip any leading whitespace and '=' */
309 while (*key && (
310 *key == '=' ||
311 *key == ' ' ||
312 *key == '\t'
313 )) {
314 key++;
315 key_len--;
316 }
317
318 /* Search for existing entry and if it does not exist create one */
319 if (zend_hash_find(target_hash, key, key_len + 1, (void **) &entry) == FAILURE) {
320 zval *section_arr;
321
322 section_arr = (zval *) pemalloc(sizeof(zval), 1);
323 INIT_PZVAL(section_arr);
324 Z_TYPE_P(section_arr) = IS_ARRAY;
325 Z_ARRVAL_P(section_arr) = (HashTable *) pemalloc(sizeof(HashTable), 1);
326 zend_hash_init(Z_ARRVAL_P(section_arr), 0, NULL, (dtor_func_t) config_zval_dtor, 1);
327 zend_hash_update(target_hash, key, key_len + 1, section_arr, sizeof(zval), (void **) &entry);
328 free(section_arr);
329 }
330 active_ini_hash = Z_ARRVAL_P(entry);
331 }
332 }
42c82bb Revert the last patches.
foobar authored
333 break;
334 }
78194a4 @zsuraski - Complete the move to the new INI parser. (Side effect: at last, peop...
zsuraski authored
335 }
81e2cf0 @rlerdorf Fix folding and clean up some extensions
rlerdorf authored
336 /* }}} */
78194a4 @zsuraski - Complete the move to the new INI parser. (Side effect: at last, peop...
zsuraski authored
337
02d966c MFH:- Added support for [HOST=www.example.com] special sections
Jani Taskinen authored
338 /* {{{ php_load_php_extension_cb
81e2cf0 @rlerdorf Fix folding and clean up some extensions
rlerdorf authored
339 */
02d966c MFH:- Added support for [HOST=www.example.com] special sections
Jani Taskinen authored
340 static void php_load_php_extension_cb(void *arg TSRMLS_DC)
db0b8bc Defer loading of extensions until all configuration entries have been
Sascha Schumann authored
341 {
02d966c MFH:- Added support for [HOST=www.example.com] special sections
Jani Taskinen authored
342 php_load_extension(*((char **) arg), MODULE_PERSISTENT, 0 TSRMLS_CC);
d294f46 @zsuraski - Remove the ini_extension_list global
zsuraski authored
343 }
81e2cf0 @rlerdorf Fix folding and clean up some extensions
rlerdorf authored
344 /* }}} */
d294f46 @zsuraski - Remove the ini_extension_list global
zsuraski authored
345
81e2cf0 @rlerdorf Fix folding and clean up some extensions
rlerdorf authored
346 /* {{{ php_load_zend_extension_cb
347 */
d76cf1d @zsuraski More TSRMLS_FETCH work
zsuraski authored
348 static void php_load_zend_extension_cb(void *arg TSRMLS_DC)
d294f46 @zsuraski - Remove the ini_extension_list global
zsuraski authored
349 {
42c82bb Revert the last patches.
foobar authored
350 zend_load_extension(*((char **) arg));
db0b8bc Defer loading of extensions until all configuration entries have been
Sascha Schumann authored
351 }
81e2cf0 @rlerdorf Fix folding and clean up some extensions
rlerdorf authored
352 /* }}} */
db0b8bc Defer loading of extensions until all configuration entries have been
Sascha Schumann authored
353
81e2cf0 @rlerdorf Fix folding and clean up some extensions
rlerdorf authored
354 /* {{{ php_init_config
355 */
64cfbf5 MFH: - Fixed bug #34307 (OnUpdateStringUnempty INI options can be set em...
foobar authored
356 int php_init_config(TSRMLS_D)
78194a4 @zsuraski - Complete the move to the new INI parser. (Side effect: at last, peop...
zsuraski authored
357 {
c946b4d In addtion to path to php.ini, PHPRC now may specify full file name
Dmitry Stogov authored
358 char *php_ini_file_name = NULL;
f66d5f0 - Fixed few logic errors in php*.ini search path creation as documented ...
foobar authored
359 char *php_ini_search_path = NULL;
1463a82 @pierrejoye - move declaration on top and fix build error
pierrejoye authored
360 int php_ini_scanned_path_len;
42c82bb Revert the last patches.
foobar authored
361 int safe_mode_state;
362 char *open_basedir;
f66d5f0 - Fixed few logic errors in php*.ini search path creation as documented ...
foobar authored
363 int free_ini_search_path = 0;
42c82bb Revert the last patches.
foobar authored
364 zend_file_handle fh;
365
09b6f37 MFH:
Jani Taskinen authored
366 if (zend_hash_init(&configuration_hash, 0, NULL, (dtor_func_t) config_zval_dtor, 1) == FAILURE) {
1890173 Revert
foobar authored
367 return FAILURE;
368 }
369
63739c7 give sapi modules the possibility to overwrite default ini settings
Marcus Boerger authored
370 if (sapi_module.ini_defaults) {
371 sapi_module.ini_defaults(&configuration_hash);
372 }
373
42c82bb Revert the last patches.
foobar authored
374 zend_llist_init(&extension_lists.engine, sizeof(char *), (llist_dtor_func_t) free_estring, 1);
c75b887 MFH: No zval is stored here
Jani Taskinen authored
375 zend_llist_init(&extension_lists.functions, sizeof(char *), (llist_dtor_func_t) free_estring, 1);
9be89ed MFH: ws fixes
Jani Taskinen authored
376
42c82bb Revert the last patches.
foobar authored
377 safe_mode_state = PG(safe_mode);
378 open_basedir = PG(open_basedir);
379
5af649e @zsuraski Revert to the old php_ini.c, and reimplement the binary-path searching.
zsuraski authored
380 if (sapi_module.php_ini_path_override) {
c946b4d In addtion to path to php.ini, PHPRC now may specify full file name
Dmitry Stogov authored
381 php_ini_file_name = sapi_module.php_ini_path_override;
5af649e @zsuraski Revert to the old php_ini.c, and reimplement the binary-path searching.
zsuraski authored
382 php_ini_search_path = sapi_module.php_ini_path_override;
383 free_ini_search_path = 0;
f66d5f0 - Fixed few logic errors in php*.ini search path creation as documented ...
foobar authored
384 } else if (!sapi_module.php_ini_ignore) {
112462d @tony2001 MFH
tony2001 authored
385 int search_path_size;
5af649e @zsuraski Revert to the old php_ini.c, and reimplement the binary-path searching.
zsuraski authored
386 char *default_location;
f66d5f0 - Fixed few logic errors in php*.ini search path creation as documented ...
foobar authored
387 char *env_location;
388 char *binary_location;
e1658ed Minor cleanups to path building and php*.ini search logic.
Preston L. Bannister authored
389 static const char paths_separator[] = { ZEND_PATHS_SEPARATOR, 0 };
2479384 Fixed unused variable warning on *nix.
Ilia Alshanetsky authored
390 #ifdef PHP_WIN32
06aae4b @smalyshev Enable setting php.ini path via the registry
smalyshev authored
391 char *reg_location;
2479384 Fixed unused variable warning on *nix.
Ilia Alshanetsky authored
392 #endif
6de4f3a Add check for php.ini in same directory as php.exe (or equivalent execut...
Preston L. Bannister authored
393
f66d5f0 - Fixed few logic errors in php*.ini search path creation as documented ...
foobar authored
394 env_location = getenv("PHPRC");
395 if (!env_location) {
396 env_location = "";
397 }
398
399 /*
400 * Prepare search path
401 */
402
112462d @tony2001 MFH
tony2001 authored
403 search_path_size = MAXPATHLEN * 4 + strlen(env_location) + 3 + 1;
404 php_ini_search_path = (char *) emalloc(search_path_size);
5af649e @zsuraski Revert to the old php_ini.c, and reimplement the binary-path searching.
zsuraski authored
405 free_ini_search_path = 1;
406 php_ini_search_path[0] = 0;
6de4f3a Add check for php.ini in same directory as php.exe (or equivalent execut...
Preston L. Bannister authored
407
acb1e07 Changed priority of PHPRC environment variable on win32 to be higher the...
Dmitry Stogov authored
408 /* Add environment location */
409 if (env_location[0]) {
410 if (*php_ini_search_path) {
112462d @tony2001 MFH
tony2001 authored
411 strlcat(php_ini_search_path, paths_separator, search_path_size);
acb1e07 Changed priority of PHPRC environment variable on win32 to be higher the...
Dmitry Stogov authored
412 }
112462d @tony2001 MFH
tony2001 authored
413 strlcat(php_ini_search_path, env_location, search_path_size);
c946b4d In addtion to path to php.ini, PHPRC now may specify full file name
Dmitry Stogov authored
414 php_ini_file_name = env_location;
acb1e07 Changed priority of PHPRC environment variable on win32 to be higher the...
Dmitry Stogov authored
415 }
416
06aae4b @smalyshev Enable setting php.ini path via the registry
smalyshev authored
417 #ifdef PHP_WIN32
418 /* Add registry location */
419 reg_location = GetIniPathFromRegistry();
f66d5f0 - Fixed few logic errors in php*.ini search path creation as documented ...
foobar authored
420 if (reg_location != NULL) {
06aae4b @smalyshev Enable setting php.ini path via the registry
smalyshev authored
421 if (*php_ini_search_path) {
112462d @tony2001 MFH
tony2001 authored
422 strlcat(php_ini_search_path, paths_separator, search_path_size);
06aae4b @smalyshev Enable setting php.ini path via the registry
smalyshev authored
423 }
112462d @tony2001 MFH
tony2001 authored
424 strlcat(php_ini_search_path, reg_location, search_path_size);
06aae4b @smalyshev Enable setting php.ini path via the registry
smalyshev authored
425 efree(reg_location);
426 }
427 #endif
42c82bb Revert the last patches.
foobar authored
428
ef058cd Search for php.ini in CWD in all sapi's *but* CLI.
Edin Kadribasic authored
429 /* Add cwd (not with CLI) */
430 if (strcmp(sapi_module.name, "cli") != 0) {
e1658ed Minor cleanups to path building and php*.ini search logic.
Preston L. Bannister authored
431 if (*php_ini_search_path) {
112462d @tony2001 MFH
tony2001 authored
432 strlcat(php_ini_search_path, paths_separator, search_path_size);
e1658ed Minor cleanups to path building and php*.ini search logic.
Preston L. Bannister authored
433 }
112462d @tony2001 MFH
tony2001 authored
434 strlcat(php_ini_search_path, ".", search_path_size);
5af649e @zsuraski Revert to the old php_ini.c, and reimplement the binary-path searching.
zsuraski authored
435 }
42c82bb Revert the last patches.
foobar authored
436
5af649e @zsuraski Revert to the old php_ini.c, and reimplement the binary-path searching.
zsuraski authored
437 /* Add binary directory */
6de4f3a Add check for php.ini in same directory as php.exe (or equivalent execut...
Preston L. Bannister authored
438 #ifdef PHP_WIN32
b9fd107 @zsuraski Use portable #define
zsuraski authored
439 binary_location = (char *) emalloc(MAXPATHLEN);
7e3b508 ws/style fixes
foobar authored
440 if (GetModuleFileName(0, binary_location, MAXPATHLEN) == 0) {
5af649e @zsuraski Revert to the old php_ini.c, and reimplement the binary-path searching.
zsuraski authored
441 efree(binary_location);
442 binary_location = NULL;
42c82bb Revert the last patches.
foobar authored
443 }
5af649e @zsuraski Revert to the old php_ini.c, and reimplement the binary-path searching.
zsuraski authored
444 #else
445 if (sapi_module.executable_location) {
0db4f06 @tony2001 MFH
tony2001 authored
446 binary_location = (char *)emalloc(MAXPATHLEN);
448dbac @bjori MFH: Fixed PHP CLI to use the php.ini from the binary location
bjori authored
447 if (!strchr(sapi_module.executable_location, '/')) {
9098946 @bjori MFH: bug#41361 (shell_exec() does not find binaries)
bjori authored
448 char *envpath, *path;
448dbac @bjori MFH: Fixed PHP CLI to use the php.ini from the binary location
bjori authored
449 int found = 0;
450
9098946 @bjori MFH: bug#41361 (shell_exec() does not find binaries)
bjori authored
451 if ((envpath = getenv("PATH")) != NULL) {
448dbac @bjori MFH: Fixed PHP CLI to use the php.ini from the binary location
bjori authored
452 char *search_dir, search_path[MAXPATHLEN];
63c1173 @bjori use php_strtok_r() rather than strsep()
bjori authored
453 char *last;
448dbac @bjori MFH: Fixed PHP CLI to use the php.ini from the binary location
bjori authored
454
d85fc29 @tony2001 MFH
tony2001 authored
455 path = estrdup(envpath);
63c1173 @bjori use php_strtok_r() rather than strsep()
bjori authored
456 search_dir = php_strtok_r(path, ":", &last);
d85fc29 @tony2001 MFH
tony2001 authored
457
63c1173 @bjori use php_strtok_r() rather than strsep()
bjori authored
458 while (search_dir) {
448dbac @bjori MFH: Fixed PHP CLI to use the php.ini from the binary location
bjori authored
459 snprintf(search_path, MAXPATHLEN, "%s/%s", search_dir, sapi_module.executable_location);
460 if (VCWD_REALPATH(search_path, binary_location) && !VCWD_ACCESS(binary_location, X_OK)) {
461 found = 1;
462 break;
463 }
63c1173 @bjori use php_strtok_r() rather than strsep()
bjori authored
464 search_dir = php_strtok_r(NULL, ":", &last);
448dbac @bjori MFH: Fixed PHP CLI to use the php.ini from the binary location
bjori authored
465 }
d85fc29 @tony2001 MFH
tony2001 authored
466 efree(path);
448dbac @bjori MFH: Fixed PHP CLI to use the php.ini from the binary location
bjori authored
467 }
468 if (!found) {
469 efree(binary_location);
470 binary_location = NULL;
471 }
472 } else if (!VCWD_REALPATH(sapi_module.executable_location, binary_location) || VCWD_ACCESS(binary_location, X_OK)) {
7e071d9 php.ini search logic needs to use the absolute path of the running binar...
Hartmut Holzgraefe authored
473 efree(binary_location);
9be89ed MFH: ws fixes
Jani Taskinen authored
474 binary_location = NULL;
98694f9 @tony2001 ws fix
tony2001 authored
475 }
5af649e @zsuraski Revert to the old php_ini.c, and reimplement the binary-path searching.
zsuraski authored
476 } else {
477 binary_location = NULL;
6de4f3a Add check for php.ini in same directory as php.exe (or equivalent execut...
Preston L. Bannister authored
478 }
5af649e @zsuraski Revert to the old php_ini.c, and reimplement the binary-path searching.
zsuraski authored
479 #endif
480 if (binary_location) {
481 char *separator_location = strrchr(binary_location, DEFAULT_SLASH);
9be89ed MFH: ws fixes
Jani Taskinen authored
482
882cb20 edge case: do not remove trailing slash for root directory (Bug #33882)
Hartmut Holzgraefe authored
483 if (separator_location && separator_location != binary_location) {
7e071d9 php.ini search logic needs to use the absolute path of the running binar...
Hartmut Holzgraefe authored
484 *(separator_location) = 0;
5af649e @zsuraski Revert to the old php_ini.c, and reimplement the binary-path searching.
zsuraski authored
485 }
e1658ed Minor cleanups to path building and php*.ini search logic.
Preston L. Bannister authored
486 if (*php_ini_search_path) {
112462d @tony2001 MFH
tony2001 authored
487 strlcat(php_ini_search_path, paths_separator, search_path_size);
e1658ed Minor cleanups to path building and php*.ini search logic.
Preston L. Bannister authored
488 }
112462d @tony2001 MFH
tony2001 authored
489 strlcat(php_ini_search_path, binary_location, search_path_size);
5af649e @zsuraski Revert to the old php_ini.c, and reimplement the binary-path searching.
zsuraski authored
490 efree(binary_location);
491 }
492
493 /* Add default location */
494 #ifdef PHP_WIN32
7e3b508 ws/style fixes
foobar authored
495 default_location = (char *) emalloc(MAXPATHLEN + 1);
9be89ed MFH: ws fixes
Jani Taskinen authored
496
e1658ed Minor cleanups to path building and php*.ini search logic.
Preston L. Bannister authored
497 if (0 < GetWindowsDirectory(default_location, MAXPATHLEN)) {
498 if (*php_ini_search_path) {
112462d @tony2001 MFH
tony2001 authored
499 strlcat(php_ini_search_path, paths_separator, search_path_size);
e1658ed Minor cleanups to path building and php*.ini search logic.
Preston L. Bannister authored
500 }
112462d @tony2001 MFH
tony2001 authored
501 strlcat(php_ini_search_path, default_location, search_path_size);
5af649e @zsuraski Revert to the old php_ini.c, and reimplement the binary-path searching.
zsuraski authored
502 }
503 efree(default_location);
fcdda2e @wez Fix a problem resolving the php.ini path under win32 terminal services e...
wez authored
504
505 {
506 /* For people running under terminal services, GetWindowsDirectory will
507 * return their personal Windows directory, so lets add the system
508 * windows directory too */
509 typedef UINT (WINAPI *get_system_windows_directory_func)(char *buffer, UINT size);
510 static get_system_windows_directory_func get_system_windows_directory = NULL;
511 HMODULE kern;
512
513 if (get_system_windows_directory == NULL) {
514 kern = LoadLibrary("kernel32.dll");
515 if (kern) {
516 get_system_windows_directory = (get_system_windows_directory_func)GetProcAddress(kern, "GetSystemWindowsDirectoryA");
517 }
518 }
519 if (get_system_windows_directory != NULL) {
520 default_location = (char *) emalloc(MAXPATHLEN + 1);
521 if (0 < get_system_windows_directory(default_location, MAXPATHLEN)) {
522 if (*php_ini_search_path) {
112462d @tony2001 MFH
tony2001 authored
523 strlcat(php_ini_search_path, paths_separator, search_path_size);
fcdda2e @wez Fix a problem resolving the php.ini path under win32 terminal services e...
wez authored
524 }
112462d @tony2001 MFH
tony2001 authored
525 strlcat(php_ini_search_path, default_location, search_path_size);
fcdda2e @wez Fix a problem resolving the php.ini path under win32 terminal services e...
wez authored
526 }
527 efree(default_location);
528 }
529 }
6de4f3a Add check for php.ini in same directory as php.exe (or equivalent execut...
Preston L. Bannister authored
530 #else
5af649e @zsuraski Revert to the old php_ini.c, and reimplement the binary-path searching.
zsuraski authored
531 default_location = PHP_CONFIG_FILE_PATH;
e1658ed Minor cleanups to path building and php*.ini search logic.
Preston L. Bannister authored
532 if (*php_ini_search_path) {
112462d @tony2001 MFH
tony2001 authored
533 strlcat(php_ini_search_path, paths_separator, search_path_size);
e1658ed Minor cleanups to path building and php*.ini search logic.
Preston L. Bannister authored
534 }
112462d @tony2001 MFH
tony2001 authored
535 strlcat(php_ini_search_path, default_location, search_path_size);
6de4f3a Add check for php.ini in same directory as php.exe (or equivalent execut...
Preston L. Bannister authored
536 #endif
5af649e @zsuraski Revert to the old php_ini.c, and reimplement the binary-path searching.
zsuraski authored
537 }
6de4f3a Add check for php.ini in same directory as php.exe (or equivalent execut...
Preston L. Bannister authored
538
5af649e @zsuraski Revert to the old php_ini.c, and reimplement the binary-path searching.
zsuraski authored
539 PG(safe_mode) = 0;
540 PG(open_basedir) = NULL;
541
e5e6f55 MFH
Jani Taskinen authored
542 /*
543 * Find and open actual ini file
544 */
545
e52aac9 @wez Implement simple stream support in the ZE scanners.
wez authored
546 memset(&fh, 0, sizeof(fh));
e5e6f55 MFH
Jani Taskinen authored
547
548 /* If SAPI does not want to ignore all ini files OR an overriding file/path is given.
549 * This allows disabling scanning for ini files in the PHP_CONFIG_FILE_SCAN_DIR but still
550 * load an optional ini file. */
551 if (!sapi_module.php_ini_ignore || sapi_module.php_ini_path_override) {
552
553 /* Check if php_ini_file_name is a file and can be opened */
c946b4d In addtion to path to php.ini, PHPRC now may specify full file name
Dmitry Stogov authored
554 if (php_ini_file_name && php_ini_file_name[0]) {
cecb9df Implemented -n switch to skip parsing ini at startup as suggested by Wez...
Marcus Boerger authored
555 struct stat statbuf;
9be89ed MFH: ws fixes
Jani Taskinen authored
556
c946b4d In addtion to path to php.ini, PHPRC now may specify full file name
Dmitry Stogov authored
557 if (!VCWD_STAT(php_ini_file_name, &statbuf)) {
cecb9df Implemented -n switch to skip parsing ini at startup as suggested by Wez...
Marcus Boerger authored
558 if (!((statbuf.st_mode & S_IFMT) == S_IFDIR)) {
c946b4d In addtion to path to php.ini, PHPRC now may specify full file name
Dmitry Stogov authored
559 fh.handle.fp = VCWD_FOPEN(php_ini_file_name, "r");
560 if (fh.handle.fp) {
561 fh.filename = php_ini_opened_path = expand_filepath(php_ini_file_name, NULL TSRMLS_CC);
562 }
cecb9df Implemented -n switch to skip parsing ini at startup as suggested by Wez...
Marcus Boerger authored
563 }
5af649e @zsuraski Revert to the old php_ini.c, and reimplement the binary-path searching.
zsuraski authored
564 }
565 }
e5e6f55 MFH
Jani Taskinen authored
566
567 /* Otherwise search for php-%sapi-module-name%.ini file in search path */
cecb9df Implemented -n switch to skip parsing ini at startup as suggested by Wez...
Marcus Boerger authored
568 if (!fh.handle.fp) {
569 const char *fmt = "php-%s.ini";
50ea267 - Avoid sprintf, even when checked copy'n'paste or changes lead to error...
Marcus Boerger authored
570 char *ini_fname;
571 spprintf(&ini_fname, 0, fmt, sapi_module.name);
cecb9df Implemented -n switch to skip parsing ini at startup as suggested by Wez...
Marcus Boerger authored
572 fh.handle.fp = php_fopen_with_path(ini_fname, "r", php_ini_search_path, &php_ini_opened_path TSRMLS_CC);
573 efree(ini_fname);
574 if (fh.handle.fp) {
575 fh.filename = php_ini_opened_path;
576 }
e1658ed Minor cleanups to path building and php*.ini search logic.
Preston L. Bannister authored
577 }
e5e6f55 MFH
Jani Taskinen authored
578
579 /* If still no ini file found, search for php.ini file in search path */
cecb9df Implemented -n switch to skip parsing ini at startup as suggested by Wez...
Marcus Boerger authored
580 if (!fh.handle.fp) {
581 fh.handle.fp = php_fopen_with_path("php.ini", "r", php_ini_search_path, &php_ini_opened_path TSRMLS_CC);
582 if (fh.handle.fp) {
583 fh.filename = php_ini_opened_path;
584 }
8f94a8a First try to open php-SAPI.ini and if it fails fall back to regular
Edin Kadribasic authored
585 }
751cd67 get_cfg_var("get_file_path") didn't work correctly when an alternative
Sander Roobol authored
586 }
7e3b508 ws/style fixes
foobar authored
587
5af649e @zsuraski Revert to the old php_ini.c, and reimplement the binary-path searching.
zsuraski authored
588 if (free_ini_search_path) {
589 efree(php_ini_search_path);
590 }
7e3b508 ws/style fixes
foobar authored
591
42c82bb Revert the last patches.
foobar authored
592 PG(safe_mode) = safe_mode_state;
593 PG(open_basedir) = open_basedir;
594
989a61e @rlerdorf As discussed, add --with-config-file-scan-dir compile-time switch defini...
rlerdorf authored
595 if (fh.handle.fp) {
596 fh.type = ZEND_HANDLE_FP;
09b6f37 MFH:
Jani Taskinen authored
597 RESET_ACTIVE_INI_HASH();
42c82bb Revert the last patches.
foobar authored
598
09b6f37 MFH:
Jani Taskinen authored
599 zend_parse_ini_file(&fh, 1, ZEND_INI_SCANNER_NORMAL, (zend_ini_parser_cb_t) php_ini_parser_cb, &configuration_hash TSRMLS_CC);
9be89ed MFH: ws fixes
Jani Taskinen authored
600
989a61e @rlerdorf As discussed, add --with-config-file-scan-dir compile-time switch defini...
rlerdorf authored
601 {
602 zval tmp;
9be89ed MFH: ws fixes
Jani Taskinen authored
603
989a61e @rlerdorf As discussed, add --with-config-file-scan-dir compile-time switch defini...
rlerdorf authored
604 Z_STRLEN(tmp) = strlen(fh.filename);
605 Z_STRVAL(tmp) = zend_strndup(fh.filename, Z_STRLEN(tmp));
606 Z_TYPE(tmp) = IS_STRING;
4b4d634 MFH: Added macros for managing zval refcounts and is_ref statuses
Yiduo (David) Wang authored
607 Z_SET_REFCOUNT(tmp, 0);
09b6f37 MFH:
Jani Taskinen authored
608
989a61e @rlerdorf As discussed, add --with-config-file-scan-dir compile-time switch defini...
rlerdorf authored
609 zend_hash_update(&configuration_hash, "cfg_file_path", sizeof("cfg_file_path"), (void *) &tmp, sizeof(zval), NULL);
7e3b508 ws/style fixes
foobar authored
610 if (php_ini_opened_path) {
989a61e @rlerdorf As discussed, add --with-config-file-scan-dir compile-time switch defini...
rlerdorf authored
611 efree(php_ini_opened_path);
7e3b508 ws/style fixes
foobar authored
612 }
989a61e @rlerdorf As discussed, add --with-config-file-scan-dir compile-time switch defini...
rlerdorf authored
613 php_ini_opened_path = zend_strndup(Z_STRVAL(tmp), Z_STRLEN(tmp));
614 }
cecb9df Implemented -n switch to skip parsing ini at startup as suggested by Wez...
Marcus Boerger authored
615 }
989a61e @rlerdorf As discussed, add --with-config-file-scan-dir compile-time switch defini...
rlerdorf authored
616
e5e6f55 MFH
Jani Taskinen authored
617 /* Check for PHP_INI_SCAN_DIR environment variable to override/set config file scan directory */
618 php_ini_scanned_path = getenv("PHP_INI_SCAN_DIR");
619 if (!php_ini_scanned_path) {
620 /* Or fall back using possible --with-config-file-scan-dir setting (defaults to empty string!) */
621 php_ini_scanned_path = PHP_CONFIG_FILE_SCAN_DIR;
622 }
1463a82 @pierrejoye - move declaration on top and fix build error
pierrejoye authored
623 php_ini_scanned_path_len = strlen(php_ini_scanned_path);
e5e6f55 MFH
Jani Taskinen authored
624
625 /* Scan and parse any .ini files found in scan path if path not empty. */
626 if (!sapi_module.php_ini_ignore && php_ini_scanned_path_len) {
8d352d2 Fixed bug #21625 (When scanning a directory for ini files, do so in
Ilia Alshanetsky authored
627 struct dirent **namelist;
628 int ndir, i;
09b6f37 MFH:
Jani Taskinen authored
629 struct stat sb;
630 char ini_file[MAXPATHLEN];
631 char *p;
632 zend_file_handle fh;
633 zend_llist scanned_ini_list;
634 zend_llist_element *element;
635 int l, total_l = 0;
636
637 /* Reset active ini section */
638 RESET_ACTIVE_INI_HASH();
8d352d2 Fixed bug #21625 (When scanning a directory for ini files, do so in
Ilia Alshanetsky authored
639
e5e6f55 MFH
Jani Taskinen authored
640 if ((ndir = php_scandir(php_ini_scanned_path, &namelist, 0, php_alphasort)) > 0) {
09b6f37 MFH:
Jani Taskinen authored
641 zend_llist_init(&scanned_ini_list, sizeof(char *), (llist_dtor_func_t) free_estring, 1);
642 memset(&fh, 0, sizeof(fh));
643
8d352d2 Fixed bug #21625 (When scanning a directory for ini files, do so in
Ilia Alshanetsky authored
644 for (i = 0; i < ndir; i++) {
09b6f37 MFH:
Jani Taskinen authored
645
646 /* check for any file with .ini extension */
8d352d2 Fixed bug #21625 (When scanning a directory for ini files, do so in
Ilia Alshanetsky authored
647 if (!(p = strrchr(namelist[i]->d_name, '.')) || (p && strcmp(p, ".ini"))) {
648 free(namelist[i]);
d454bec - Whitespace
Derick Rethans authored
649 continue;
650 }
e5e6f55 MFH
Jani Taskinen authored
651 if (IS_SLASH(php_ini_scanned_path[php_ini_scanned_path_len - 1])) {
652 snprintf(ini_file, MAXPATHLEN, "%s%s", php_ini_scanned_path, namelist[i]->d_name);
653 } else {
654 snprintf(ini_file, MAXPATHLEN, "%s%c%s", php_ini_scanned_path, DEFAULT_SLASH, namelist[i]->d_name);
655 }
989a61e @rlerdorf As discussed, add --with-config-file-scan-dir compile-time switch defini...
rlerdorf authored
656 if (VCWD_STAT(ini_file, &sb) == 0) {
657 if (S_ISREG(sb.st_mode)) {
658 if ((fh.handle.fp = VCWD_FOPEN(ini_file, "r"))) {
659 fh.filename = ini_file;
1ad304c @rlerdorf MFB config-file-scan-dir crash fix
rlerdorf authored
660 fh.type = ZEND_HANDLE_FP;
09b6f37 MFH:
Jani Taskinen authored
661
662 if (zend_parse_ini_file(&fh, 1, ZEND_INI_SCANNER_NORMAL, (zend_ini_parser_cb_t) php_ini_parser_cb, &configuration_hash TSRMLS_CC) == SUCCESS) {
663 /* Here, add it to the list of ini files read */
664 l = strlen(ini_file);
665 total_l += l + 2;
666 p = estrndup(ini_file, l);
667 zend_llist_add_element(&scanned_ini_list, &p);
668 }
989a61e @rlerdorf As discussed, add --with-config-file-scan-dir compile-time switch defini...
rlerdorf authored
669 }
670 }
671 }
8d352d2 Fixed bug #21625 (When scanning a directory for ini files, do so in
Ilia Alshanetsky authored
672 free(namelist[i]);
989a61e @rlerdorf As discussed, add --with-config-file-scan-dir compile-time switch defini...
rlerdorf authored
673 }
8d352d2 Fixed bug #21625 (When scanning a directory for ini files, do so in
Ilia Alshanetsky authored
674 free(namelist);
675
3781af5 - Fixed zero bytes memory allocation when no extra ini files are found i...
Derick Rethans authored
676 if (total_l) {
09b6f37 MFH:
Jani Taskinen authored
677 int php_ini_scanned_files_len = (php_ini_scanned_files) ? strlen(php_ini_scanned_files) + 1 : 0;
678 php_ini_scanned_files = (char *) realloc(php_ini_scanned_files, php_ini_scanned_files_len + total_l + 1);
679 if (!php_ini_scanned_files_len) {
680 *php_ini_scanned_files = '\0';
681 }
682 total_l += php_ini_scanned_files_len;
3781af5 - Fixed zero bytes memory allocation when no extra ini files are found i...
Derick Rethans authored
683 for (element = scanned_ini_list.head; element; element = element->next) {
09b6f37 MFH:
Jani Taskinen authored
684 if (php_ini_scanned_files_len) {
685 strlcat(php_ini_scanned_files, ",\n", total_l);
686 }
112462d @tony2001 MFH
tony2001 authored
687 strlcat(php_ini_scanned_files, *(char **)element->data, total_l);
688 strlcat(php_ini_scanned_files, element->next ? ",\n" : "\n", total_l);
9be89ed MFH: ws fixes
Jani Taskinen authored
689 }
3781af5 - Fixed zero bytes memory allocation when no extra ini files are found i...
Derick Rethans authored
690 }
ac9f4cc - We always need to destroy the llist though.
Derick Rethans authored
691 zend_llist_destroy(&scanned_ini_list);
989a61e @rlerdorf As discussed, add --with-config-file-scan-dir compile-time switch defini...
rlerdorf authored
692 }
e5e6f55 MFH
Jani Taskinen authored
693 } else {
694 /* Make sure an empty php_ini_scanned_path ends up as NULL */
695 php_ini_scanned_path = NULL;
42c82bb Revert the last patches.
foobar authored
696 }
7d14dad MFH: Fixed mess with CGI/CLI -d command line option (now it works with c...
Dmitry Stogov authored
697
698 if (sapi_module.ini_entries) {
09b6f37 MFH:
Jani Taskinen authored
699 /* Reset active ini section */
700 RESET_ACTIVE_INI_HASH();
701 zend_parse_ini_string(sapi_module.ini_entries, 1, ZEND_INI_SCANNER_NORMAL, (zend_ini_parser_cb_t) php_ini_parser_cb, &configuration_hash TSRMLS_CC);
7d14dad MFH: Fixed mess with CGI/CLI -d command line option (now it works with c...
Dmitry Stogov authored
702 }
703
42c82bb Revert the last patches.
foobar authored
704 return SUCCESS;
78194a4 @zsuraski - Complete the move to the new INI parser. (Side effect: at last, peop...
zsuraski authored
705 }
81e2cf0 @rlerdorf Fix folding and clean up some extensions
rlerdorf authored
706 /* }}} */
78194a4 @zsuraski - Complete the move to the new INI parser. (Side effect: at last, peop...
zsuraski authored
707
81e2cf0 @rlerdorf Fix folding and clean up some extensions
rlerdorf authored
708 /* {{{ php_shutdown_config
709 */
78194a4 @zsuraski - Complete the move to the new INI parser. (Side effect: at last, peop...
zsuraski authored
710 int php_shutdown_config(void)
711 {
42c82bb Revert the last patches.
foobar authored
712 zend_hash_destroy(&configuration_hash);
713 if (php_ini_opened_path) {
714 free(php_ini_opened_path);
2a2d49b Fixed bug #30050 (Possible crash inside php_shutdown_config()).
Ilia Alshanetsky authored
715 php_ini_opened_path = NULL;
42c82bb Revert the last patches.
foobar authored
716 }
989a61e @rlerdorf As discussed, add --with-config-file-scan-dir compile-time switch defini...
rlerdorf authored
717 if (php_ini_scanned_files) {
718 free(php_ini_scanned_files);
2a2d49b Fixed bug #30050 (Possible crash inside php_shutdown_config()).
Ilia Alshanetsky authored
719 php_ini_scanned_files = NULL;
989a61e @rlerdorf As discussed, add --with-config-file-scan-dir compile-time switch defini...
rlerdorf authored
720 }
42c82bb Revert the last patches.
foobar authored
721 return SUCCESS;
78194a4 @zsuraski - Complete the move to the new INI parser. (Side effect: at last, peop...
zsuraski authored
722 }
81e2cf0 @rlerdorf Fix folding and clean up some extensions
rlerdorf authored
723 /* }}} */
78194a4 @zsuraski - Complete the move to the new INI parser. (Side effect: at last, peop...
zsuraski authored
724
f47c784 Improved PHP extension loading mechanism with support for module depende...
Dmitry Stogov authored
725 /* {{{ php_ini_register_extensions
81e2cf0 @rlerdorf Fix folding and clean up some extensions
rlerdorf authored
726 */
f47c784 Improved PHP extension loading mechanism with support for module depende...
Dmitry Stogov authored
727 void php_ini_register_extensions(TSRMLS_D)
9db5589 @zsuraski Recode delayed loading in a much simpler way (switched back to php_ini.c...
zsuraski authored
728 {
42c82bb Revert the last patches.
foobar authored
729 zend_llist_apply(&extension_lists.engine, php_load_zend_extension_cb TSRMLS_CC);
02d966c MFH:- Added support for [HOST=www.example.com] special sections
Jani Taskinen authored
730 zend_llist_apply(&extension_lists.functions, php_load_php_extension_cb TSRMLS_CC);
9db5589 @zsuraski Recode delayed loading in a much simpler way (switched back to php_ini.c...
zsuraski authored
731
42c82bb Revert the last patches.
foobar authored
732 zend_llist_destroy(&extension_lists.engine);
733 zend_llist_destroy(&extension_lists.functions);
9db5589 @zsuraski Recode delayed loading in a much simpler way (switched back to php_ini.c...
zsuraski authored
734 }
81e2cf0 @rlerdorf Fix folding and clean up some extensions
rlerdorf authored
735 /* }}} */
9db5589 @zsuraski Recode delayed loading in a much simpler way (switched back to php_ini.c...
zsuraski authored
736
09b6f37 MFH:
Jani Taskinen authored
737 /* {{{ php_parse_user_ini_file
738 */
cf7384a @felipensp - MFH: Constness (Added const qualifier to several function parameters)
felipensp authored
739 PHPAPI int php_parse_user_ini_file(const char *dirname, char *ini_filename, HashTable *target_hash TSRMLS_DC)
09b6f37 MFH:
Jani Taskinen authored
740 {
741 struct stat sb;
742 char ini_file[MAXPATHLEN];
743 zend_file_handle fh;
744
745 snprintf(ini_file, MAXPATHLEN, "%s%c%s", dirname, DEFAULT_SLASH, ini_filename);
746
747 if (VCWD_STAT(ini_file, &sb) == 0) {
748 if (S_ISREG(sb.st_mode)) {
749 memset(&fh, 0, sizeof(fh));
750 if ((fh.handle.fp = VCWD_FOPEN(ini_file, "r"))) {
751 fh.filename = ini_file;
752 fh.type = ZEND_HANDLE_FP;
753
754 /* Reset active ini section */
755 RESET_ACTIVE_INI_HASH();
756
757 if (zend_parse_ini_file(&fh, 1, ZEND_INI_SCANNER_NORMAL, (zend_ini_parser_cb_t) php_ini_parser_cb, target_hash TSRMLS_CC) == SUCCESS) {
758 /* FIXME: Add parsed file to the list of user files read? */
759 return SUCCESS;
760 }
761 return FAILURE;
762 }
763 }
764 }
765 return FAILURE;
766 }
767 /* }}} */
768
769 /* {{{ php_ini_activate_config
770 */
771 PHPAPI void php_ini_activate_config(HashTable *source_hash, int modify_type, int stage TSRMLS_DC)
772 {
773 char *str;
774 zval *data;
775 uint str_len;
776 ulong num_index;
777
778 /* Walk through config hash and alter matching ini entries using the values found in the hash */
779 for (zend_hash_internal_pointer_reset(source_hash);
780 zend_hash_get_current_key_ex(source_hash, &str, &str_len, &num_index, 0, NULL) == HASH_KEY_IS_STRING;
781 zend_hash_move_forward(source_hash)
782 ) {
783 zend_hash_get_current_data(source_hash, (void **) &data);
784 zend_alter_ini_entry_ex(str, str_len, Z_STRVAL_P(data), Z_STRLEN_P(data), modify_type, stage, 0 TSRMLS_CC);
785 }
786 }
787 /* }}} */
788
ba8e317 Optimized request startup sequence for php.ini without per dir and per h...
Dmitry Stogov authored
789 /* {{{ php_ini_has_per_dir_config
790 */
791 PHPAPI int php_ini_has_per_dir_config(void)
792 {
793 return has_per_dir_config;
794 }
795 /* }}} */
796
09b6f37 MFH:
Jani Taskinen authored
797 /* {{{ php_ini_activate_per_dir_config
798 */
799 PHPAPI void php_ini_activate_per_dir_config(char *path, uint path_len TSRMLS_DC)
800 {
801 zval *tmp;
802 char *ptr;
803
804 /* Walk through each directory in path and apply any found per-dir-system-configuration from configuration_hash */
ba8e317 Optimized request startup sequence for php.ini without per dir and per h...
Dmitry Stogov authored
805 if (has_per_dir_config && path && path_len) {
09b6f37 MFH:
Jani Taskinen authored
806 ptr = path + 1;
807 while ((ptr = strchr(ptr, DEFAULT_SLASH)) != NULL) {
808 *ptr = 0;
809 /* Search for source array matching the path from configuration_hash */
810 if (zend_hash_find(&configuration_hash, path, path_len, (void **) &tmp) == SUCCESS) {
811 php_ini_activate_config(Z_ARRVAL_P(tmp), PHP_INI_SYSTEM, PHP_INI_STAGE_ACTIVATE TSRMLS_CC);
812 }
813 *ptr = '/';
814 ptr++;
815 }
816 }
817 }
818 /* }}} */
819
ba8e317 Optimized request startup sequence for php.ini without per dir and per h...
Dmitry Stogov authored
820 /* {{{ php_ini_has_per_host_config
821 */
822 PHPAPI int php_ini_has_per_host_config(void)
823 {
824 return has_per_host_config;
825 }
826 /* }}} */
827
02d966c MFH:- Added support for [HOST=www.example.com] special sections
Jani Taskinen authored
828 /* {{{ php_ini_activate_per_host_config
829 */
cf7384a @felipensp - MFH: Constness (Added const qualifier to several function parameters)
felipensp authored
830 PHPAPI void php_ini_activate_per_host_config(const char *host, uint host_len TSRMLS_DC)
02d966c MFH:- Added support for [HOST=www.example.com] special sections
Jani Taskinen authored
831 {
832 zval *tmp;
833
ba8e317 Optimized request startup sequence for php.ini without per dir and per h...
Dmitry Stogov authored
834 if (has_per_host_config && host && host_len) {
02d966c MFH:- Added support for [HOST=www.example.com] special sections
Jani Taskinen authored
835 /* Search for source array matching the host from configuration_hash */
836 if (zend_hash_find(&configuration_hash, host, host_len, (void **) &tmp) == SUCCESS) {
837 php_ini_activate_config(Z_ARRVAL_P(tmp), PHP_INI_SYSTEM, PHP_INI_STAGE_ACTIVATE TSRMLS_CC);
838 }
839 }
840 }
841 /* }}} */
842
81e2cf0 @rlerdorf Fix folding and clean up some extensions
rlerdorf authored
843 /* {{{ cfg_get_entry
844 */
cf7384a @felipensp - MFH: Constness (Added const qualifier to several function parameters)
felipensp authored
845 PHPAPI zval *cfg_get_entry(const char *name, uint name_length)
78194a4 @zsuraski - Complete the move to the new INI parser. (Side effect: at last, peop...
zsuraski authored
846 {
42c82bb Revert the last patches.
foobar authored
847 zval *tmp;
78194a4 @zsuraski - Complete the move to the new INI parser. (Side effect: at last, peop...
zsuraski authored
848
7e3b508 ws/style fixes
foobar authored
849 if (zend_hash_find(&configuration_hash, name, name_length, (void **) &tmp) == SUCCESS) {
42c82bb Revert the last patches.
foobar authored
850 return tmp;
851 } else {
852 return NULL;
853 }
78194a4 @zsuraski - Complete the move to the new INI parser. (Side effect: at last, peop...
zsuraski authored
854 }
81e2cf0 @rlerdorf Fix folding and clean up some extensions
rlerdorf authored
855 /* }}} */
78194a4 @zsuraski - Complete the move to the new INI parser. (Side effect: at last, peop...
zsuraski authored
856
81e2cf0 @rlerdorf Fix folding and clean up some extensions
rlerdorf authored
857 /* {{{ cfg_get_long
858 */
cf7384a @felipensp - MFH: Constness (Added const qualifier to several function parameters)
felipensp authored
859 PHPAPI int cfg_get_long(const char *varname, long *result)
78194a4 @zsuraski - Complete the move to the new INI parser. (Side effect: at last, peop...
zsuraski authored
860 {
42c82bb Revert the last patches.
foobar authored
861 zval *tmp, var;
b9ddb5c MFH
Jani Taskinen authored
862
7e3b508 ws/style fixes
foobar authored
863 if (zend_hash_find(&configuration_hash, varname, strlen(varname) + 1, (void **) &tmp) == FAILURE) {
e1814f0 WIN64 support
Dmitry Stogov authored
864 *result = 0;
42c82bb Revert the last patches.
foobar authored
865 return FAILURE;
866 }
867 var = *tmp;
868 zval_copy_ctor(&var);
869 convert_to_long(&var);
870 *result = Z_LVAL(var);
871 return SUCCESS;
78194a4 @zsuraski - Complete the move to the new INI parser. (Side effect: at last, peop...
zsuraski authored
872 }
81e2cf0 @rlerdorf Fix folding and clean up some extensions
rlerdorf authored
873 /* }}} */
78194a4 @zsuraski - Complete the move to the new INI parser. (Side effect: at last, peop...
zsuraski authored
874
81e2cf0 @rlerdorf Fix folding and clean up some extensions
rlerdorf authored
875 /* {{{ cfg_get_double
876 */
cf7384a @felipensp - MFH: Constness (Added const qualifier to several function parameters)
felipensp authored
877 PHPAPI int cfg_get_double(const char *varname, double *result)
78194a4 @zsuraski - Complete the move to the new INI parser. (Side effect: at last, peop...
zsuraski authored
878 {
42c82bb Revert the last patches.
foobar authored
879 zval *tmp, var;
b9ddb5c MFH
Jani Taskinen authored
880
7e3b508 ws/style fixes
foobar authored
881 if (zend_hash_find(&configuration_hash, varname, strlen(varname) + 1, (void **) &tmp) == FAILURE) {
882 *result = (double) 0;
42c82bb Revert the last patches.
foobar authored
883 return FAILURE;
884 }
885 var = *tmp;
886 zval_copy_ctor(&var);
887 convert_to_double(&var);
888 *result = Z_DVAL(var);
889 return SUCCESS;
78194a4 @zsuraski - Complete the move to the new INI parser. (Side effect: at last, peop...
zsuraski authored
890 }
81e2cf0 @rlerdorf Fix folding and clean up some extensions
rlerdorf authored
891 /* }}} */
78194a4 @zsuraski - Complete the move to the new INI parser. (Side effect: at last, peop...
zsuraski authored
892
81e2cf0 @rlerdorf Fix folding and clean up some extensions
rlerdorf authored
893 /* {{{ cfg_get_string
894 */
cf7384a @felipensp - MFH: Constness (Added const qualifier to several function parameters)
felipensp authored
895 PHPAPI int cfg_get_string(const char *varname, char **result)
78194a4 @zsuraski - Complete the move to the new INI parser. (Side effect: at last, peop...
zsuraski authored
896 {
42c82bb Revert the last patches.
foobar authored
897 zval *tmp;
898
7e3b508 ws/style fixes
foobar authored
899 if (zend_hash_find(&configuration_hash, varname, strlen(varname)+1, (void **) &tmp) == FAILURE) {
900 *result = NULL;
42c82bb Revert the last patches.
foobar authored
901 return FAILURE;
902 }
903 *result = Z_STRVAL_P(tmp);
904 return SUCCESS;
78194a4 @zsuraski - Complete the move to the new INI parser. (Side effect: at last, peop...
zsuraski authored
905 }
81e2cf0 @rlerdorf Fix folding and clean up some extensions
rlerdorf authored
906 /* }}} */
2cf1b8d * expanded the following constants and made them available in PHP:
Stig Bakken authored
907
fa94dab - MFH Rename dump_config_hash() to get_config_hash() as it doesn't dump
Marcus Boerger authored
908 PHPAPI HashTable* php_ini_get_configuration_hash(void) /* {{{ */
09b6f37 MFH:
Jani Taskinen authored
909 {
fa94dab - MFH Rename dump_config_hash() to get_config_hash() as it doesn't dump
Marcus Boerger authored
910 return &configuration_hash;
911 } /* }}} */
09b6f37 MFH:
Jani Taskinen authored
912
2cf1b8d * expanded the following constants and made them available in PHP:
Stig Bakken authored
913 /*
914 * Local variables:
915 * tab-width: 4
916 * c-basic-offset: 4
917 * indent-tabs-mode: t
918 * End:
78747bd - Don't wrap lines... this is annoying while coding.
Derick Rethans authored
919 * vim600: sw=4 ts=4 fdm=marker
920 * vim<600: sw=4 ts=4
2cf1b8d * expanded the following constants and made them available in PHP:
Stig Bakken authored
921 */
Something went wrong with that request. Please try again.