I have created a patch for two new .ini directives:
include_ini = <filename> ; relative or full path
include_ini_dir = <full directory path>
The patch is only in php_ini.c and does the following:
Added 2 new static zend_llist: include_ini_list & include_ini_dir_list
Add a case for include_ini and include_ini_dir in function
php_config_ini_parser_cb.
This new cases just add items to the static lists.
Added three new functions:
php_include_ini_load
- Loads a .ini file from a passed in name (may be full path)
php_include_ini_function_cb
- callback loop over include_ini_list, which calls php_include_ini_load
php_include_ini_dir_function_cb
- callback loop over include_ini_dir_list, which calls
php_include_ini_load on each file in a directory.
In function php_init_config the new llist are init'ed and after
zend_parse_ini_file is called, a loop is started until both
include_ini_list and include_ini_dir_list are empty:
loop over each item in include_ini_list calling php_include_ini_function_cb
empting include_ini_list
loop over each item in include_ini_dir_list calling
php_include_ini_dir_function_cb
empting include_ini_dir_list
I am assumming that in the middle of a zend_llist_apply call if
something is added to the llist, that item get the function applied
to it? Right?
Problems:
I don't know how well this will work on Windows machines.
The new php_include_ini_load is a hacked version of php_init_config
and doesn't rely on paths from the commend line for searching. I
would like some help to fix up this functions.
include_ini_dir has to be the full path. I didn't know the best
way to find the directory from the search path like how the
php_fopen_with_path does it (so I just make it work with full paths).
Please tell me how to do this so I can use the search paths and
relative directories names.
Yes, it is based off of the 4.2.3 release, but I am looking for
more input on fixing current problems then getting into the next
release.
Cheers,
Brian
--- php-4.2.3.org/main/php_ini.c Mon Mar 4 16:21:28 2002
+++ php-4.2.3/main/php_ini.c Wed Sep 11 17:10:42 2002
@@ -41,6 +41,8 @@
static HashTable configuration_hash;
PHPAPI char *php_ini_opened_path=NULL;
static php_extension_lists extension_lists;
+static zend_llist include_ini_list;
+static zend_llist include_ini_dir_list;
/* {{{ php_ini_displayer_cb
*/
@@ -166,6 +168,14 @@
char *extension_name =
estrndup(Z_STRVAL_P(arg2), Z_STRLEN_P(arg2));
zend_llist_add_element(&extension_lists.engine,
&extension_name);
+ } else if
(!strcasecmp(Z_STRVAL_P(arg1), "include_ini")) {
+ char *ini_name =
estrndup(Z_STRVAL_P(arg2), Z_STRLEN_P(arg2));
+ zend_llist_add_element(
&include_ini_list, &ini_name );
+ fprintf(stderr, "got
include_ini = %s\n", Z_STRVAL_P(arg2) );
+ } else if
(!strcasecmp(Z_STRVAL_P(arg1), "include_ini_dir")) {
+ char *ini_name =
estrndup(Z_STRVAL_P(arg2), Z_STRLEN_P(arg2));
+ zend_llist_add_element(
&include_ini_dir_list, &ini_name );
+ fprintf(stderr, "got
include_ini_dir = %s\n", Z_STRVAL_P(arg2) );
} else {
zend_hash_update(&configuration_hash, Z_STRVAL_P(arg1),
Z_STRLEN_P(arg1)+1, arg2, sizeof(zval), (void **) &entry);
Z_STRVAL_P(entry) =
zend_strndup(Z_STRVAL_P(entry), Z_STRLEN_P(entry));
@@ -178,6 +188,147 @@
}
/* }}} */
+
+static void php_include_ini_load( char *ini_file )
+{
+ char *env_location, *php_ini_search_path;
+ int safe_mode_state;
+ char *open_basedir;
+ char *php_include_ini_opened_path = NULL;
+ int free_ini_search_path=0;
+ zend_file_handle fh;
+ TSRMLS_FETCH();
+
+ fprintf( stderr, "php_include_ini_function_cb: %s\n", ini_file );
+
+ safe_mode_state = PG(safe_mode);
+ open_basedir = PG(open_basedir);
+
+ env_location = getenv("PHPRC");
+ if (!env_location) {
+ env_location="";
+ }
+ if (0) {
+ //php_ini_search_path = php_ini_path_override;
+ // free_ini_search_path = 0;
+ } else {
+ char *default_location;
+ int free_default_location;
+
+#ifdef PHP_WIN32
+ default_location = (char *) emalloc(512);
+
+ if (!GetWindowsDirectory(default_location, 255)) {
+ default_location[0]=0;
+ }
+ free_default_location=1;
+#else
+ default_location = PHP_CONFIG_FILE_PATH;
+ free_default_location=0;
+#endif
+ php_ini_search_path = (char *)
emalloc(sizeof(".")+strlen(env_location)+strlen(default_location)+2+1);
+ free_ini_search_path = 1;
+ if (strcmp(sapi_module.name, "cli")==0) {
+ if(env_location && env_location[0]) {
+ sprintf(php_ini_search_path,
"%s%c%s", env_location, ZEND_PATHS_SEPARATOR, default_location);
+ } else {
+ sprintf(php_ini_search_path, "%s",
default_location);
+ }
+ } else {
+ if(env_location && env_location[0]) {
+ sprintf(php_ini_search_path,
".%c%s%c%s", ZEND_PATHS_SEPARATOR, env_location,
ZEND_PATHS_SEPARATOR, default_location);
+ } else {
+ sprintf(php_ini_search_path, ".%c%s",
ZEND_PATHS_SEPARATOR, default_location);
+ }
+ }
+ if (free_default_location) {
+ efree(default_location);
+ }
+ }
+
+ PG(safe_mode) = 0;
+ PG(open_basedir) = NULL;
+
+ fh.handle.fp = php_fopen_with_path(ini_file, "r",
php_ini_search_path, &php_include_ini_opened_path TSRMLS_CC);
+ if (free_ini_search_path) {
+ efree(php_ini_search_path);
+ }
+ PG(safe_mode) = safe_mode_state;
+ PG(open_basedir) = open_basedir;
+
+ if (!fh.handle.fp) {
+ return;
+ }
+ fh.type = ZEND_HANDLE_FP;
+ fh.filename = php_include_ini_opened_path;
+
+ zend_parse_ini_file(&fh, 1, php_config_ini_parser_cb,
&extension_lists);
+
+ if (php_ini_opened_path) {
+ efree(php_include_ini_opened_path);
+ }
+}
+
+/* {{{
+ */
+static void php_include_ini_function_cb(void *arg TSRMLS_DC)
+{
+ char *ini_file = Z_STRVAL_P( (zval *)arg );
+ php_include_ini_load( ini_file );
+}
+/* }}} */
+
+/* {{{
+ */
+static void php_include_ini_dir_function_cb(void *arg TSRMLS_DC)
+{
+ char *ini_dir = Z_STRVAL_P( (zval *)arg );
+
+ DIR *dirp;
+ struct dirent *dir_entry;
+ zval *entry;
+ zend_llist file_list;
+ fprintf( stderr, "php_include_ini_dir_function_cb : %s\n", ini_dir );
+
+ /*
+ * first course of business is to grok all the directory
+ * entries here and store 'em away. Recall we need full pathnames
+ * for this.
+ */
+ dirp = opendir( ini_dir );
+
+ if (dirp == NULL) {
+ fprintf(stderr, "%s: could not open config directory
%s\n", ini_dir );
+ return;
+ }
+
+ zend_llist_init(&file_list, sizeof(char *),
(llist_dtor_func_t) free_estring, 1);
+
+ while ( (dir_entry = readdir(dirp)) != NULL) {
+
+ if (strcmp(dir_entry->d_name, ".") &&
strcmp(dir_entry->d_name, "..")) {
+
+ char *file_name = (char *)emalloc(
strlen(ini_dir) + dir_entry->d_name + 3);
+
+ /*** ZEND_PATHS_SEPARATOR is defined, but not
no ZEND_DIR_SEPARATOR ***/
+ sprintf(file_name, "%s%c%s", ini_dir, '/',
dir_entry->d_name);
+
+ zend_llist_add_element(&file_list, &file_name);
+ }
+ }
+ closedir(dirp);
+
+ entry = zend_llist_get_first(&file_list);
+ while (entry != NULL ) {
+ php_include_ini_load( Z_STRVAL_P( entry ) );
+ entry = zend_llist_get_next(&file_list);
+ }
+
+ /** do I need to do a clean? **/
+ zend_llist_clean( &file_list );
+}
+/* }}} */
+
/* {{{ php_load_function_extension_cb
*/
static void php_load_function_extension_cb(void *arg TSRMLS_DC)
@@ -214,6 +365,9 @@
zend_llist_init(&extension_lists.engine, sizeof(char *),
(llist_dtor_func_t) free_estring, 1);
zend_llist_init(&extension_lists.functions, sizeof(zval),
(llist_dtor_func_t) ZVAL_DESTRUCTOR, 1);
+
+ zend_llist_init(&include_ini_list, sizeof(char *),
(llist_dtor_func_t)free_estring, 1);
+ zend_llist_init(&include_ini_dir_list, sizeof(char *),
(llist_dtor_func_t)free_estring, 1);
safe_mode_state = PG(safe_mode);
open_basedir = PG(open_basedir);
@@ -277,6 +431,14 @@
fh.filename = php_ini_opened_path;
zend_parse_ini_file(&fh, 1, php_config_ini_parser_cb,
&extension_lists);
+
+ while ( zend_llist_count( &include_ini_list ) ||
zend_llist_count( &include_ini_dir_list ) ) {
+ zend_llist_apply(&include_ini_list,
php_include_ini_function_cb TSRMLS_CC);
+ zend_llist_clean(&include_ini_list );
+
+ zend_llist_apply(&include_ini_dir_list,
php_include_ini_dir_function_cb TSRMLS_CC);
+ zend_llist_clean(&include_ini_dir_list );
+ }
if (php_ini_opened_path) {
zval tmp;
--
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php