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