Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

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