here is a revised patch that uses "additional_ini" keyword instead of
"include".

dave

========= BEGIN PATCH ===============
Index: configure.in
===================================================================
RCS file: /repository/php4/configure.in,v
retrieving revision 1.372
diff -u -r1.372 configure.in
--- configure.in        6 Sep 2002 17:18:16 -0000       1.372
+++ configure.in        27 Sep 2002 16:55:38 -0000
@@ -1044,6 +1044,10 @@

 PHP_ADD_SOURCES(TSRM, TSRM.c tsrm_strtok_r.c tsrm_virtual_cwd.c)

+dnl need the ini scanner before the main for include capabilities.
+PHP_ADD_SOURCES(/Zend,  zend_language_parser.c zend_language_scanner.c \
+    zend_ini_parser.c zend_ini_scanner.c)
+
 PHP_ADD_SOURCES(main, main.c snprintf.c spprintf.c php_sprintf.c \
        safe_mode.c fopen_wrappers.c alloca.c \
        php_ini.c SAPI.c rfc1867.c php_content_types.c strlcpy.c \
@@ -1052,9 +1056,6 @@
        output.c memory_streams.c user_streams.c)
 PHP_ADD_SOURCES(/main, internal_functions.c,, sapi)
 PHP_ADD_SOURCES(/main, internal_functions_cli.c,, cli)
-
-PHP_ADD_SOURCES(/Zend,  zend_language_parser.c zend_language_scanner.c \
-    zend_ini_parser.c zend_ini_scanner.c)

 PHP_ADD_SOURCES(Zend, \
     zend_alloc.c zend_compile.c zend_constants.c zend_dynamic_array.c \
Index: Zend/zend_ini_scanner.h
===================================================================
RCS file: /repository/Zend/zend_ini_scanner.h,v
retrieving revision 1.10
diff -u -r1.10 zend_ini_scanner.h
--- Zend/zend_ini_scanner.h     9 Sep 2001 23:49:26 -0000       1.10
+++ Zend/zend_ini_scanner.h     27 Sep 2002 16:55:38 -0000
@@ -7,6 +7,10 @@
 int zend_ini_open_file_for_scanning(zend_file_handle *fh TSRMLS_DC);
 void zend_ini_close_file(zend_file_handle *fh TSRMLS_DC);
 int ini_lex(zval *ini_lval TSRMLS_DC);
+
+int zend_ini_initialize_lexer_state(FILE *fp, char *filename TSRMLS_DC);
+int zend_ini_save_lexer_state(TSRMLS_D);
+
 END_EXTERN_C()

 #endif /* _ZEND_INI_SCANNER_H */
Index: Zend/zend_ini_scanner.l
===================================================================
RCS file: /repository/Zend/zend_ini_scanner.l,v
retrieving revision 1.25
diff -u -r1.25 zend_ini_scanner.l
--- Zend/zend_ini_scanner.l     4 Jun 2002 22:03:25 -0000       1.25
+++ Zend/zend_ini_scanner.l     27 Sep 2002 16:55:38 -0000
@@ -27,6 +27,11 @@
 #define yy_more_flag SCNG(_yy_more_flag)
 #define yy_more_len SCNG(_yy_more_len)

+/*
+ * define DEBUG_CFG_LEXER to have the lexer print out information as it
finds it
+ */
+#undef DEBUG_CFG_LEXER
+
 #include <errno.h>
 #include "zend.h"
 #include "zend_globals.h"
@@ -47,6 +52,27 @@
 #endif


+/* the include information */
+#define MAX_INCLUDE_DEPTH 10
+
+/* how many levels into an include we are currently */
+int include_stack_ptr = 0;
+
+/*
+ * the file_stack array will keep info about where
+ * we are when we switch files being parsed
+ */
+struct {
+       YY_BUFFER_STATE buffer;
+       int lineno;
+       char *filename;
+} include_stack[MAX_INCLUDE_DEPTH];
+
+
+/* forward declarations of useful functions */
+int zend_ini_handle_eof(TSRMLS_D);
+
+
 static char *ini_filename;

 void init_ini_scanner()
@@ -66,46 +92,12 @@
        return ini_filename;
 }

-
-int zend_ini_open_file_for_scanning(zend_file_handle *fh TSRMLS_DC)
-{
-       FILE *fp;
-
-       switch (fh->type) {
-               case ZEND_HANDLE_FP:
-                       fp = fh->handle.fp;
-                       break;
-               case ZEND_HANDLE_FILENAME:
-                       fp = zend_fopen(fh->filename, NULL);
-                       fh->type = ZEND_HANDLE_FP;
-                       break;
-               default:
-                       return FAILURE;
-       }
-
-       init_ini_scanner();
-       yyin = fp;
-       yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE TSRMLS_CC)
TSRMLS_CC);
-       ini_filename = fh->filename;
-       return SUCCESS;
-}
-
-
-void zend_ini_close_file(zend_file_handle *fh TSRMLS_DC)
-{
-       switch (fh->type) {
-               case ZEND_HANDLE_FP:
-                       fclose(fh->handle.fp);
-                       break;
-       }
-}
-
 %}

 NEWLINE ("\r"|"\n"|"\r\n")

-%option noyywrap
 %option yylineno
+%option noyywrap

 %%

@@ -191,6 +183,9 @@
                ini_lval->value.str.val = zend_strndup(yytext, yyleng);
                ini_lval->value.str.len = yyleng;
                ini_lval->type = IS_STRING;
+#ifdef DEBUG_CFG_LEXER
+               fprintf(stderr,"Lexer found string %s\n",ini_lval->value.str.val);
+#endif
                return TC_STRING;
        } else {
                /* whitespace */
@@ -223,6 +218,135 @@
 }

 <<EOF>> {
-       yy_delete_buffer(YY_CURRENT_BUFFER TSRMLS_CC);
+       return zend_ini_handle_eof(TSRMLS_C);
+}
+
+%%
+
+
+/* this is the user defined section of the lexer */
+
+/*
+ * zend_ini_save_current_state will just store the current
+ * lexer information into the include_stack structure
+ * returns 1 for failure, 0 for success
+ */
+int zend_ini_save_lexer_state(TSRMLS_D)
+{
+
+#ifdef DEBUG_INI_INCLUDE
+       fprintf(stderr,"zend_ini_save_lexer_state: saving state from file %s
lineno %i\n",
+
zend_ini_scanner_get_filename(TSRMLS_C),zend_ini_scanner_get_lineno(TSRMLS_C
)
+                       );
+#endif
+        if (include_stack_ptr >= MAX_INCLUDE_DEPTH)
+        {
+            fprintf(stderr,"Warning: too many include levels (file: %s,
number of levels supported %i)",zend_ini_scanner_get_filename(TSRMLS_C),
MAX_INCLUDE_DEPTH);
+            return 1;
+        }
+       include_stack[include_stack_ptr].buffer = YY_CURRENT_BUFFER;
+       include_stack[include_stack_ptr].lineno =
zend_ini_scanner_get_lineno(TSRMLS_C);
+       include_stack[include_stack_ptr].filename =
zend_ini_scanner_get_filename(TSRMLS_C);
+       include_stack_ptr++;
+        return 0;
+}
+
+
+/*
+ * zend_ini_initialize_lexer_state will set up the lexer to read from the
given
+ * file handle and filename
+ */
+int zend_ini_initialize_lexer_state(FILE *fp, char *filename TSRMLS_DC)
+{
+       init_ini_scanner();
+       ini_filename = filename;
+       /* yyin = fp; */
+       yy_switch_to_buffer(yy_create_buffer(fp, YY_BUF_SIZE TSRMLS_CC)
TSRMLS_CC);
+       BEGIN(INITIAL);
+       return SUCCESS;
+}
+
+/*
+ * zend_ini_handle_eof is called when the lexer reaches the end of a file
+ * if zend_ini_handle_eof returns 0, then the lexer will assume that it
needs to continue
+ * analyze.  If it returns 1, then the lexer will assume that there is
nothing
+ * left to analyze.
+ *
+ */
+int zend_ini_handle_eof(TSRMLS_D)
+{
+
+       if ( --include_stack_ptr < 0)
+       {
+#ifdef DEBUG_CFG_LEXER
+               fprintf(stderr,"Flex lexer is at the EOF for all include files\n");
+#endif
        yyterminate();
+               return 1;
+       }
+       else
+       {
+               /* this means that we've reached the end of an include file... */
+#ifdef DEBUG_CFG_LEXER
+               fprintf(stderr,"Flex lexer is at the EOF, but more includes to 
+read\n");
+#endif
+               /* delete the current buffer */
+               yy_delete_buffer(YY_CURRENT_BUFFER TSRMLS_CC);
+
+               /* now switch to the previous buffer */
+               yy_switch_to_buffer(include_stack[include_stack_ptr].buffer TSRMLS_CC);
+
+#ifdef DEBUG_INI_INCLUDE
+               fprintf(stderr,"zend_ini_handle_eof: Switching back to filename %s 
+lineno
%i\n",include_stack[include_stack_ptr].filename,include_stack[include_stack_
ptr].lineno);
+#endif
+
+               /* now reset the current line number and filename */
+               ini_lineno = include_stack[include_stack_ptr].lineno;
+               ini_filename = include_stack[include_stack_ptr].filename;
+               return 0;
+       }
+
+}
+
+int zend_ini_open_file_for_scanning(zend_file_handle *fh TSRMLS_DC)
+{
+       FILE *fp = NULL;
+
+       switch (fh->type)
+       {
+               case ZEND_HANDLE_FP:
+                       fp = fh->handle.fp;
+                       break;
+               case ZEND_HANDLE_FILENAME:
+                       fp = zend_fopen(fh->filename, NULL);
+                       fh->type = ZEND_HANDLE_FP;
+                       break;
+               default:
+                       return FAILURE;
+       }
+
+       /* initialize the lexer */
+       return zend_ini_initialize_lexer_state(fp, fh->filename TSRMLS_CC);
+
+}
+
+/*
+ * zend_ini_close_file will take a zend file handle, and just close the
open file pointer
+ */
+void zend_ini_close_file(zend_file_handle *fh TSRMLS_DC)
+{
+       switch (fh->type) {
+               case ZEND_HANDLE_FP:
+                       if (fh->handle.fp != NULL) {
+#ifdef DEBUG_CFG_LEXER
+                               fprintf(stderr,"zend_ini_scanner: freeing filehandle to
%s\n",fh->filename);
+#endif
+                               fclose(fh->handle.fp);
+#ifdef DEBUG_CFG_LEXER
+                       } else {
+                               fprintf(stderr,"zend_ini_scanner: no filehandle to 
+free\n");
+#endif
+                       }
+                       break;
+       }
 }
Index: main/php_ini.c
===================================================================
RCS file: /repository/php4/main/php_ini.c,v
retrieving revision 1.103
diff -u -r1.103 php_ini.c
--- main/php_ini.c      26 Sep 2002 17:54:53 -0000      1.103
+++ main/php_ini.c      27 Sep 2002 16:55:42 -0000
@@ -27,6 +27,11 @@
 #endif
 #include "ext/standard/info.h"
 #include "zend_ini.h"
+
+/* to parse includes */
+#include "zend_ini_scanner.h"
+#include "zend_ini_parser.h"
+
 #include "php_ini.h"
 #include "ext/standard/dl.h"
 #include "zend_extensions.h"
@@ -34,12 +39,27 @@
 #include "SAPI.h"
 #include "php_main.h"

+/*
+ * DEBUG_INI_INCLUDE will print out all the actions that are taken as a
result
+ * of discovering includes in the ini file
+ */
+/* #define DEBUG_INI_INCLUDE showme */
+
+
 typedef struct _php_extension_lists {
        zend_llist engine;
        zend_llist functions;
 } php_extension_lists;


+#ifndef S_ISDIR
+#define S_ISDIR(mode)  (((mode) & S_IFMT) == S_IFDIR)
+#endif
+
+#ifndef S_ISREG
+#define S_ISREG(mode)  (((mode) & S_IFMT) == S_IFREG)
+#endif
+
 /* True globals */
 static HashTable configuration_hash;
 PHPAPI char *php_ini_opened_path=NULL;
@@ -155,6 +175,9 @@
 # endif
 #endif

+/* forward declarations */
+static void php_handle_include_ini(zval *path);
+
 /* {{{ pvalue_config_destructor
  */
 static void pvalue_config_destructor(zval *pvalue)
@@ -165,6 +188,108 @@
 }
 /* }}} */

+
+/* {{{ php_prepare_ini_search_path
+*/
+int php_prepare_ini_search_path(char **php_ini_search_path)
+{
+       char *env_location;
+       int free_ini_search_path;
+       char *binary_location;
+
+       /*
+        * this just prepares the search path for searching for php.ini or an
+        * include file.
+        */
+       env_location = getenv("PHPRC");
+       if (!env_location) {
+               env_location="";
+       }
+       if (sapi_module.php_ini_path_override) {
+               (*php_ini_search_path) = sapi_module.php_ini_path_override;
+               free_ini_search_path = 0;
+       } else {
+               char *default_location;
+               static const char paths_separator[] = { ZEND_PATHS_SEPARATOR, 0 };
+
+               (*php_ini_search_path) = (char *)
emalloc(MAXPATHLEN*3+strlen(env_location)+3+1);
+               free_ini_search_path = 1;
+               (*php_ini_search_path)[0] = 0;
+
+               /*
+                * Prepare search path
+                */
+
+               /* Add cwd */
+#ifdef INI_CHECK_CWD
+               if (strcmp(sapi_module.name, "cli")!=0) {
+                       if (**php_ini_search_path) {
+                               strcat((*php_ini_search_path), paths_separator);
+                       }
+                       strcat((*php_ini_search_path), ".");
+               }
+#endif
+
+               /* Add binary directory */
+#ifdef PHP_WIN32
+               binary_location = (char *) emalloc(MAXPATHLEN);
+               if (GetModuleFileName(0, binary_location, MAXPATHLEN)==0) {
+                       efree(binary_location);
+                       binary_location = NULL;
+               }
+#else
+               if (sapi_module.executable_location) {
+                       binary_location = estrdup(sapi_module.executable_location);
+               } else {
+                       binary_location = NULL;
+               }
+#endif
+               if (binary_location) {
+                       char *separator_location = strrchr(binary_location, 
+DEFAULT_SLASH);
+
+                       if (separator_location) {
+                               *(separator_location+1) = 0;
+                       }
+                       if (**php_ini_search_path) {
+                               strcat((*php_ini_search_path), paths_separator);
+                       }
+                       strcat((*php_ini_search_path), binary_location);
+                       efree(binary_location);
+               }
+
+               /* Add environment location */
+               if (env_location[0]) {
+                       if (**php_ini_search_path) {
+                               strcat((*php_ini_search_path), paths_separator);
+                       }
+                       strcat((*php_ini_search_path), env_location);
+               }
+
+               /* Add default location */
+#ifdef PHP_WIN32
+               default_location = (char *) emalloc(MAXPATHLEN+1);
+
+               if (0 < GetWindowsDirectory(default_location, MAXPATHLEN)) {
+                       if (**php_ini_search_path) {
+                               strcat((*php_ini_search_path), paths_separator);
+                       }
+                       strcat((*php_ini_search_path), default_location);
+               }
+               efree(default_location);
+#else
+               default_location = PHP_CONFIG_FILE_PATH;
+               if (**php_ini_search_path) {
+                       strcat((*php_ini_search_path), paths_separator);
+               }
+               strcat((*php_ini_search_path), default_location);
+#endif
+       }
+
+       return free_ini_search_path;
+}
+/* }}} */
+
+
 /* {{{ php_config_ini_parser_cb
  */
 static void php_config_ini_parser_cb(zval *arg1, zval *arg2, int
callback_type, void *arg)
@@ -187,6 +312,11 @@
                                        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), 
+"additional_ini")) { /* handle
additional_ini directive */
+
+                                       php_handle_include_ini(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));
@@ -199,6 +329,237 @@
 }
 /* }}} */

+
+/* {{{ php_handle_include_ini_dir
+*/
+static void php_handle_include_ini_dir(char *dirpath)
+{
+       /*
+        * here, we know that dirpath contains the full path to a directory
+        * and each file in that directory needs to be read for inclusion into
+        * the configuration
+        */
+       DIR *dirp = NULL;
+       struct dirent *dir_entry;
+       struct stat sb;
+       char trypath[MAXPATHLEN];
+       TSRMLS_FETCH();
+
+       fprintf(stderr,"Processing PHP ini directory %s\n",dirpath);
+
+       dirp = VCWD_OPENDIR(dirpath);
+       if(dirp)
+       {
+               while ( (dir_entry = readdir(dirp)) != NULL)
+               {
+                       /* skip directory names */
+                       if ((strcmp(dir_entry->d_name,".") == 0) ||
(strcmp(dir_entry->d_name,"..") == 0))
+                               continue;
+
+                       /* look specifically for a file now  */
+
+                       snprintf(trypath, MAXPATHLEN, "%s%c%s", dirpath, DEFAULT_SLASH,
dir_entry->d_name);
+                       if (VCWD_STAT(trypath, &sb) == 0)
+                       {
+                               if (S_ISREG(sb.st_mode))
+                               {
+                                       zval tmp;
+
+                                       Z_STRLEN(tmp) = strlen(trypath);
+                                       Z_STRVAL(tmp) = zend_strndup(trypath, 
+Z_STRLEN(tmp));
+                                       Z_TYPE(tmp) = IS_STRING;
+
+                                       php_handle_include_ini(&tmp);
+                               }
+                       }
+
+               }
+               closedir(dirp);
+       }
+#ifdef DEBUG_INI_INCLUDE
+       fprintf(stderr,"    done handling include directory %s\n",dirpath);
+#endif
+}
+/* }}} */
+
+/* {{{ php_open_include_ini
+*/
+static void php_open_include_ini_file(char *path, zend_file_handle
**include_fh TSRMLS_DC)
+{
+       (*include_fh)->handle.fp = VCWD_FOPEN(path, "r");
+       (*include_fh)->filename = expand_filepath(path, NULL TSRMLS_CC);
+       fprintf(stderr,"Processing PHP ini file: %s\n",(*include_fh)->filename);
+}
+/* }}} */
+
+/* {{{ php_discover_include_ini
+*/
+static int php_discover_include_ini(zval *path, char *search_path,
zend_file_handle **include_fh TSRMLS_DC)
+{
+       /*
+        * this function needs to find a file or directory from path.
+        * if path is absolute and a directory, then we're done
+        * otherwise, look thru the search path to find a directory
+        */
+
+       if (IS_ABSOLUTE_PATH(Z_STRVAL_P(path),Z_STRLEN_P(path)))
+       {
+               /* the path is absolute, so see if the directory exists */
+               struct stat sb;
+               if (VCWD_STAT(Z_STRVAL_P(path), &sb) == 0)
+               {
+                       if (S_ISREG(sb.st_mode))
+                       {
+                               /* the path is just a file  so open it and return*/
+                               php_open_include_ini_file(Z_STRVAL_P(path), include_fh 
+TSRMLS_CC);
+                               return 1;
+                       }
+                       else
+                       {
+                               if (S_ISDIR(sb.st_mode))
+                               {
+                                       /* we have a directory! */
+                                       php_handle_include_ini_dir(Z_STRVAL_P(path));
+                                       return 1;
+                               }
+#ifdef DEBUG_INI_INCLUDE
+                               else
+                                       fprintf(stderr,"    requested include ini '%s' 
+is not a directory or a
file (absolute path)\n",Z_STRVAL_P(path));
+#endif
+                       }
+               }
+#ifdef DEBUG_INI_INCLUDE
+               else
+                       fprintf(stderr,"    requested include ini '%s' doesn't
exist\n",Z_STRVAL_P(path));
+#endif
+       }
+       else
+       {
+               /* the path is not absolute, so it must be a directory that
+                * we need to find the search path
+                * this code is the same from fopen_wrapper's php_fopen_with_path
+                */
+               char *end;
+               char trypath[MAXPATHLEN];
+               struct stat sb;
+
+               while (search_path && *search_path) {
+                       end = strchr(search_path, DEFAULT_DIR_SEPARATOR);
+                       if (end != NULL) {
+                               *end = '\0';
+                               end++;
+                       }
+                       snprintf(trypath, MAXPATHLEN, "%s%c%s", search_path,
DEFAULT_SLASH,Z_STRVAL_P(path));
+#ifdef DEBUG_INI_INCLUDE
+                       fprintf(stderr,"    searching for directory or file at path:
%s\n",trypath);
+#endif
+                       if (VCWD_STAT(trypath, &sb) == 0)
+                       {
+                               if (S_ISDIR(sb.st_mode))
+                               {
+                                       /* found a directory to read */
+                                       php_handle_include_ini_dir(trypath);
+                                       return 1;
+                               }
+                               else
+                               {
+                                       if (S_ISREG(sb.st_mode))
+                                       {
+                                               /* found a file to read */
+                                               php_open_include_ini_file(trypath, 
+include_fh TSRMLS_CC);
+                                               return 1;
+                                       }
+#ifdef DEBUG_INI_INCLUDE
+                                       else
+                                               fprintf(stderr,"    '%s' is not a 
+directory or a file (relative
path)\n",trypath);
+#endif
+                               }
+                       }
+                       search_path = end;
+               } /* end provided path */
+       }
+       return 0;
+}
+/* }}} */
+
+
+/* {{{ php_handle_include_ini
+*/
+static void php_handle_include_ini(zval *path)
+{
+       int free_ini_search_path = 0;
+       char *php_ini_search_path = NULL;
+       char *php_included_ini_opened_path = (char *) emalloc(MAXPATHLEN*3);
+       zend_file_handle *include_fh = (zend_file_handle
*)emalloc(sizeof(zend_file_handle));
+       int retval = 0;
+
+       TSRMLS_FETCH();
+
+
+       /* path is what is given on the include line in the ini file.
+       * so first, just try to open the file itself.
+       */
+
+       include_fh->handle.fp = NULL;
+
+       /* prepare the search path */
+       free_ini_search_path = php_prepare_ini_search_path(&php_ini_search_path);
+
+       /* now try to find the file or directory */
+       retval = php_discover_include_ini(path, php_ini_search_path, &include_fh
TSRMLS_CC);
+
+       if (free_ini_search_path) {
+               efree(php_ini_search_path);
+       }
+
+
+
+       if (include_fh->handle.fp) {
+#ifdef DEBUG_INI_INCLUDE
+               fprintf(stderr,"    parsing include file %s\n",include_fh->filename);
+#endif
+
+               /* first, save the lexer state so that we can return after parsing */
+               retval = zend_ini_save_lexer_state(TSRMLS_C);
+
+               /* make sure the lexer saved state properly.  there might be too many
+                * levels of includes.  If so, then zend_ini_save_lexer_state will 
+return
+                * non-zero
+                */
+               if (retval == 0)
+               {
+                       /* now re-initialize the lexer state */
+                       zend_ini_initialize_lexer_state(include_fh->handle.fp,
include_fh->filename TSRMLS_CC);
+
+                       /* now run the parser */
+                       retval = ini_parse(TSRMLS_C);
+
+                       /* now close the file we've opened */
+                       zend_ini_close_file(include_fh TSRMLS_CC);
+
+#ifdef DEBUG_INI_INCLUDE
+                       if (retval == 0) {
+                               fprintf(stderr,"    successfully parsed included ini 
+file
%s\n",include_fh->filename);
+                       } else {
+                               fprintf(stderr,"    failed parsing included ini file
%s\n",include_fh->filename);
+                       }
+#endif
+               }
+       }
+
+
+       /* now free the resources we allocated to handle this include */
+       if (php_included_ini_opened_path != NULL) {
+               efree(php_included_ini_opened_path);
+       }
+
+
+       if(include_fh != NULL) {
+               efree(include_fh);
+       }
+}
+/* }}} */
+
 /* {{{ php_load_function_extension_cb
  */
 static void php_load_function_extension_cb(void *arg TSRMLS_DC)
@@ -222,8 +583,7 @@
  */
 int php_init_config()
 {
-       char *env_location, *php_ini_search_path;
-       char *binary_location;
+       char *php_ini_search_path;
        int safe_mode_state;
        char *open_basedir;
        int free_ini_search_path=0;
@@ -240,89 +600,8 @@
        safe_mode_state = PG(safe_mode);
        open_basedir = PG(open_basedir);

-       env_location = getenv("PHPRC");
-       if (!env_location) {
-               env_location="";
-       }
-       if (sapi_module.php_ini_path_override) {
-               php_ini_search_path = sapi_module.php_ini_path_override;
-               free_ini_search_path = 0;
-       } else {
-               char *default_location;
-               static const char paths_separator[] = { ZEND_PATHS_SEPARATOR, 0 };
-
-               php_ini_search_path = (char *)
emalloc(MAXPATHLEN*3+strlen(env_location)+3+1);
-               free_ini_search_path = 1;
-               php_ini_search_path[0] = 0;
-
-               /*
-                * Prepare search path
-                */
-
-               /* Add cwd */
-#ifdef INI_CHECK_CWD
-               if (strcmp(sapi_module.name, "cli")!=0) {
-                       if (*php_ini_search_path) {
-                               strcat(php_ini_search_path, paths_separator);
-                       }
-                       strcat(php_ini_search_path, ".");
-               }
-#endif
-
-               /* Add binary directory */
-#ifdef PHP_WIN32
-               binary_location = (char *) emalloc(MAXPATHLEN);
-               if (GetModuleFileName(0, binary_location, MAXPATHLEN)==0) {
-                       efree(binary_location);
-                       binary_location = NULL;
-               }
-#else
-               if (sapi_module.executable_location) {
-                       binary_location = estrdup(sapi_module.executable_location);
-               } else {
-                       binary_location = NULL;
-               }
-#endif
-               if (binary_location) {
-                       char *separator_location = strrchr(binary_location, 
DEFAULT_SLASH);
-
-                       if (separator_location) {
-                               *(separator_location+1) = 0;
-                       }
-                       if (*php_ini_search_path) {
-                               strcat(php_ini_search_path, paths_separator);
-                       }
-                       strcat(php_ini_search_path, binary_location);
-                       efree(binary_location);
-               }
-
-               /* Add environment location */
-               if (env_location[0]) {
-                       if (*php_ini_search_path) {
-                               strcat(php_ini_search_path, paths_separator);
-                       }
-                       strcat(php_ini_search_path, env_location);
-               }
-
-               /* Add default location */
-#ifdef PHP_WIN32
-               default_location = (char *) emalloc(MAXPATHLEN+1);
-
-               if (0 < GetWindowsDirectory(default_location, MAXPATHLEN)) {
-                       if (*php_ini_search_path) {
-                               strcat(php_ini_search_path, paths_separator);
-                       }
-                       strcat(php_ini_search_path, default_location);
-               }
-               efree(default_location);
-#else
-               default_location = PHP_CONFIG_FILE_PATH;
-               if (*php_ini_search_path) {
-                       strcat(php_ini_search_path, paths_separator);
-               }
-               strcat(php_ini_search_path, default_location);
-#endif
-       }
+       /* build the search path */
+       free_ini_search_path = php_prepare_ini_search_path(&php_ini_search_path);

        PG(safe_mode) = 0;
        PG(open_basedir) = NULL;
@@ -333,7 +612,7 @@
                struct stat statbuf;

                if (!VCWD_STAT(sapi_module.php_ini_path_override, &statbuf)) {
-                       if (!((statbuf.st_mode & S_IFMT) == S_IFDIR)) {
+                       if (S_ISDIR(statbuf.st_mode) == 0) {
                                fh.handle.fp = 
VCWD_FOPEN(sapi_module.php_ini_path_override, "r");
                                fh.filename = sapi_module.php_ini_path_override;
                        }
========= END PATCH ===============

-----Original Message-----
From: Rasmus Lerdorf [mailto:[EMAIL PROTECTED]]
Sent: Friday, September 27, 2002 9:14 AM
To: Edin Kadribasic
Cc: David Viner; Php-Dev@lists. php. net
Subject: Re: [PHP-DEV] [PATCH] include statement in php.ini file


> > I'm not very concerned either way on the .ini extension
> restriction.
> > Let's go ahead and commit this with the "include" to
> "additional_ini" name
> > change.  Perhaps the commit will stir up more feedback since there
> has
> > been so little.
>
> Some feedback:
>
> +1 for additional_ini=/path/to/new/additional.ini
> -1 for including whole directories, since I think it has to great a
> WTF factor.

Without scanning a directory, you would have to automatically edit and
insert directives into files in order to add an extension automatically.
It is so much easier just to drop a single ext.ini file in a dedicated ini
dir and have it be read.  Scanning a file and trying to figure out where
to add stuff and making sure it isn't already there is a real PITA.  Like
the silly LoadModule stuff that apxs does.  You often end up with multiple
LoadModule lines for the same module.

-Rasmus



-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to