]> granicus.if.org Git - php/commitdiff
MFH: Fixed mess with CGI/CLI -d command line option (now it works with cgi; constants...
authorDmitry Stogov <dmitry@php.net>
Tue, 19 Sep 2006 20:33:12 +0000 (20:33 +0000)
committerDmitry Stogov <dmitry@php.net>
Tue, 19 Sep 2006 20:33:12 +0000 (20:33 +0000)
NEWS
Zend/zend_ini.h
Zend/zend_ini_parser.y
Zend/zend_ini_scanner.h
Zend/zend_ini_scanner.l
main/SAPI.c
main/SAPI.h
main/php_ini.c
sapi/cgi/cgi_main.c
sapi/cli/php_cli.c

diff --git a/NEWS b/NEWS
index 6f2be7ae6b56fa9b4a7c7ce56de159d9583e8178..d401e9ec4c8e90be11d7048f2c5367dbb42f535b 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,9 @@
 PHP                                                                        NEWS
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 ?? Sep 2006, PHP 5.2.0
+- Fixed mess with CGI/CLI -d option (now it works with cgi; constants are
+  working exactly like in php.ini; with FastCGI -d affects all requests).
+  (Dmitry)
 - Fixed bug #38844 (curl_easy_strerror() is defined only since cURL 7.12.0).
   (Tony)
 - Fixed bug #38574 (missing curl constants and improper constant detection).
index ca424f5ac4890f67beff84b11e31f5b452358411..d0f1321b94512c66ab421b4c5c3d903175ac4e8f 100644 (file)
@@ -193,6 +193,7 @@ END_EXTERN_C()
 typedef void (*zend_ini_parser_cb_t)(zval *arg1, zval *arg2, int callback_type, void *arg);
 BEGIN_EXTERN_C()
 ZEND_API int zend_parse_ini_file(zend_file_handle *fh, zend_bool unbuffered_errors, zend_ini_parser_cb_t ini_parser_cb, void *arg);
+ZEND_API int zend_parse_ini_string(char *str, zend_bool unbuffered_errors, zend_ini_parser_cb_t ini_parser_cb, void *arg);
 END_EXTERN_C()
 
 #define ZEND_INI_PARSER_ENTRY  1
index 244673dba6de037ae922ac594a0632349833cb41..9346acfda7a057c68ceba399936253615b7636bb 100644 (file)
@@ -157,10 +157,14 @@ static void ini_error(char *str)
        TSRMLS_FETCH();
 
        currently_parsed_filename = zend_ini_scanner_get_filename(TSRMLS_C);
-       error_buf_len = 128+strlen(currently_parsed_filename); /* should be more than enough */
-       error_buf = (char *) emalloc(error_buf_len);
+       if (currently_parsed_filename) {
+               error_buf_len = 128+strlen(currently_parsed_filename); /* should be more than enough */
+               error_buf = (char *) emalloc(error_buf_len);
 
-       sprintf(error_buf, "Error parsing %s on line %d\n", currently_parsed_filename, zend_ini_scanner_get_lineno(TSRMLS_C));
+               sprintf(error_buf, "Error parsing %s on line %d\n", currently_parsed_filename, zend_ini_scanner_get_lineno(TSRMLS_C));
+       } else {
+               error_buf = estrdup("Invalid configuration directive\n");
+       }
 
        if (CG(ini_parser_unbuffered_errors)) {
 #ifdef PHP_WIN32
@@ -202,6 +206,29 @@ ZEND_API int zend_parse_ini_file(zend_file_handle *fh, zend_bool unbuffered_erro
 }
 
 
+ZEND_API int zend_parse_ini_string(char *str, zend_bool unbuffered_errors, zend_ini_parser_cb_t ini_parser_cb, void *arg)
+{
+       zend_ini_parser_param ini_parser_param;
+       TSRMLS_FETCH();
+
+       ini_parser_param.ini_parser_cb = ini_parser_cb;
+       ini_parser_param.arg = arg;
+
+       CG(ini_parser_param) = &ini_parser_param;
+       if (zend_ini_prepare_string_for_scanning(str TSRMLS_CC)==FAILURE) {
+               return FAILURE;
+       }
+
+       CG(ini_parser_unbuffered_errors) = unbuffered_errors;
+
+       if (ini_parse(TSRMLS_C)) {
+               return SUCCESS;
+       } else {
+               return FAILURE;
+       }
+}
+
+
 %}
 
 %pure_parser
index e5cc41d583dc0c9d0c7109a5911294451f089598..95499f07225c38add5f0599bde8525400caa152f 100644 (file)
@@ -26,6 +26,7 @@ BEGIN_EXTERN_C()
 int zend_ini_scanner_get_lineno(TSRMLS_D);
 char *zend_ini_scanner_get_filename(TSRMLS_D);
 int zend_ini_open_file_for_scanning(zend_file_handle *fh TSRMLS_DC);
+int zend_ini_prepare_string_for_scanning(char *str TSRMLS_DC);
 void zend_ini_close_file(zend_file_handle *fh TSRMLS_DC);
 int ini_lex(zval *ini_lval TSRMLS_DC);
 END_EXTERN_C()
index 2495c603607747c669f41802842930a6bdaa3cd1..e2740261d66bdd573ef1e2ac63399cc7d4c113aa 100644 (file)
@@ -83,6 +83,17 @@ int zend_ini_open_file_for_scanning(zend_file_handle *fh TSRMLS_DC)
 }
 
 
+int zend_ini_prepare_string_for_scanning(char *str TSRMLS_DC)
+{
+       int len = strlen(str);
+
+       yyin = NULL;
+       yy_scan_buffer(str, len + 2 TSRMLS_CC);
+       ini_filename = NULL;
+       return SUCCESS;
+}
+
+
 void zend_ini_close_file(zend_file_handle *fh TSRMLS_DC)
 {
        zend_stream_close(fh);
index 5bd12b13e96a608eac7bcb14ec105822ef0d7a73..c23357c65d971afc8bdb1e923c2fddb40f41056a 100644 (file)
@@ -76,6 +76,7 @@ SAPI_API sapi_module_struct sapi_module;
 
 SAPI_API void sapi_startup(sapi_module_struct *sf)
 {
+       sf->ini_entries = NULL;
        sapi_module = *sf;
 
 #ifdef ZTS
index 281a8e3f5dca01b609ad63caa7a59355ce917943..7a4da0528e10655a2ea74e656412c6436558b0db 100644 (file)
@@ -257,6 +257,8 @@ struct _sapi_module_struct {
        
        void (*ini_defaults)(HashTable *configuration_hash);
        int phpinfo_as_text;
+
+       char *ini_entries;
 };
 
 
index 92f2a4dda07ea216680e2e81806263ec7d7181a9..d88c87dbabab64563bd09ed0690bc39f5bddb113 100644 (file)
@@ -529,6 +529,11 @@ int php_init_config(TSRMLS_D)
                        zend_llist_destroy(&scanned_ini_list);
                }
        }
+
+       if (sapi_module.ini_entries) {
+               zend_parse_ini_string(sapi_module.ini_entries, 1, php_config_ini_parser_cb, &extension_lists);
+       }
+
        return SUCCESS;
 }
 /* }}} */
index dfe04c82d74cf494df26b8c0f1398b8622815ef4..bd7887b788439e85815106226862aee0ce7ae39e 100644 (file)
@@ -919,21 +919,6 @@ static void init_request_info(TSRMLS_D)
 }
 /* }}} */
 
-static void define_command_line_ini_entry(char *arg)
-{
-       char *name, *value;
-
-       name = arg;
-       value = strchr(arg, '=');
-       if (value) {
-               *value = 0;
-               value++;
-       } else {
-               value = "1";
-       }
-       zend_alter_ini_entry(name, strlen(name) + 1, value, strlen(value), PHP_INI_SYSTEM, PHP_INI_STAGE_ACTIVATE);
-}
-
 #if PHP_FASTCGI
 /**
  * Clean up child processes upon exit
@@ -987,6 +972,7 @@ int main(int argc, char *argv[])
        int orig_optind = php_optind;
        char *orig_optarg = php_optarg;
        char *script_file = NULL;
+       int ini_entries_len = 0;
 #if FORCE_CGI_REDIRECT
        long force_redirect = 1;
        char *redirect_status_env = NULL;
@@ -1076,6 +1062,23 @@ int main(int argc, char *argv[])
                        case 'n':
                                cgi_sapi_module.php_ini_ignore = 1;
                                break;
+                       case 'd': { 
+                               /* define ini entries on command line */
+                               int len = strlen(php_optarg);
+
+                               if (strchr(php_optarg, '=')) {
+                                       cgi_sapi_module.ini_entries = realloc(cgi_sapi_module.ini_entries, ini_entries_len + len + sizeof("\n\0"));
+                                       memcpy(cgi_sapi_module.ini_entries + ini_entries_len, php_optarg, len);
+                                       memcpy(cgi_sapi_module.ini_entries + ini_entries_len + len, "\n\0", sizeof("\n\0"));
+                                       ini_entries_len += len + sizeof("\n\0") - 2;
+                               } else {
+                                       cgi_sapi_module.ini_entries = realloc(cgi_sapi_module.ini_entries, ini_entries_len + len + sizeof("=1\n\0"));
+                                       memcpy(cgi_sapi_module.ini_entries + ini_entries_len, php_optarg, len);
+                                       memcpy(cgi_sapi_module.ini_entries + ini_entries_len + len, "=1\n\0", sizeof("=1\n\0"));
+                                       ini_entries_len += len + sizeof("=1\n\0") - 2;
+                               }
+                               break;
+                       }
 #if PHP_FASTCGI
 #ifndef PHP_WIN32
                        /* if we're started on command line, check to see if
@@ -1378,9 +1381,6 @@ consult the installation file that came with this distribution, or visit \n\
                                case 'C': /* don't chdir to the script directory */
                                                SG(options) |= SAPI_OPTION_NO_CHDIR;
                                                break;
-                               case 'd': /* define ini entries on command line */
-                                               define_command_line_ini_entry(php_optarg);
-                                               break;
 
                                case 'e': /* enable extended info output */
                                                CG(extended_info) = 1;
@@ -1702,6 +1702,9 @@ fastcgi_request_done:
                if (cgi_sapi_module.php_ini_path_override) {
                        free(cgi_sapi_module.php_ini_path_override);
                }
+               if (cgi_sapi_module.ini_entries) {
+                       free(cgi_sapi_module.ini_entries);
+               }
        } zend_catch {
                exit_status = 255;
        } zend_end_try();
index 27d278cb5a596e03a5d35e32be7867ddc3c67dcc..bec69c8b4cd6ddc64fa926dfd7bc448dbba939b8 100644 (file)
 #define PHP_MODE_REFLECTION_CLASS       9
 #define PHP_MODE_REFLECTION_EXTENSION   10
 
+#define HARDCODED_INI                  \
+       "html_errors=0\n"                       \
+       "register_argc_argv=1\n"        \
+       "implicit_flush=1\n"            \
+       "output_buffering=0\n"          \
+       "max_execution_time=0\n"    \
+       "max_input_time=-1\n"
+
+
 static char *php_optarg = NULL;
 static int php_optind = 1;
 #if (HAVE_LIBREADLINE || HAVE_LIBEDIT) && !defined(COMPILE_DL_READLINE)
@@ -342,10 +351,6 @@ static int php_cli_startup(sapi_module_struct *sapi_module)
        zend_hash_update(configuration_hash, name, sizeof(name), tmp, sizeof(zval), (void**)&entry);\
        Z_STRVAL_P(entry) = zend_strndup(Z_STRVAL_P(entry), Z_STRLEN_P(entry))
 
-/* hard coded ini settings must be set in main() */
-#define INI_HARDCODED(name,value)\
-               zend_alter_ini_entry(name, sizeof(name), value, strlen(value), PHP_INI_SYSTEM, PHP_INI_STAGE_ACTIVATE);
-
 static void sapi_cli_ini_defaults(HashTable *configuration_hash)
 {
        zval *tmp, *entry;
@@ -451,29 +456,6 @@ static void php_cli_usage(char *argv0)
 }
 /* }}} */
 
-static void define_command_line_ini_entry(char *arg TSRMLS_DC)
-{
-       char *name, *value;
-
-       name = arg;
-       value = strchr(arg, '=');
-       if (value) {
-               *value = 0;
-               value++;
-       } else {
-               value = "1";
-       }
-
-       if (!strcasecmp(name, "extension")) { /* load function module */
-               zval extension, zval;
-               ZVAL_STRING(&extension, value, 0);
-               php_dl(&extension, MODULE_PERSISTENT, &zval, 1 TSRMLS_CC);
-       } else {
-               zend_alter_ini_entry(name, strlen(name)+1, value, strlen(value), PHP_INI_SYSTEM, PHP_INI_STAGE_ACTIVATE);
-       }
-}
-
-
 static php_stream *s_in_process = NULL;
 
 static void cli_register_file_handles(TSRMLS_D)
@@ -602,6 +584,7 @@ int main(int argc, char *argv[])
        int argc = __argc;
        char **argv = __argv;
 #endif
+       int ini_entries_len = 0;
 
 #if defined(PHP_WIN32) && defined(_DEBUG) && defined(PHP_WIN32_DEBUG_HEAP)
        {
@@ -646,6 +629,10 @@ int main(int argc, char *argv[])
        setmode(_fileno(stderr), O_BINARY);             /* make the stdio mode be binary */
 #endif
 
+       ini_entries_len = strlen(HARDCODED_INI);
+       cli_sapi_module.ini_entries = malloc(ini_entries_len+2);
+       memcpy(cli_sapi_module.ini_entries, HARDCODED_INI, ini_entries_len+1);
+       cli_sapi_module.ini_entries[ini_entries_len+1] = 0;
 
        while ((c = php_getopt(argc, argv, OPTIONS, &php_optarg, &php_optind, 0))!=-1) {
                switch (c) {
@@ -655,6 +642,23 @@ int main(int argc, char *argv[])
                case 'n':
                        cli_sapi_module.php_ini_ignore = 1;
                        break;
+               case 'd': {
+                               /* define ini entries on command line */
+                               int len = strlen(php_optarg);
+
+                               if (strchr(php_optarg, '=')) {
+                                       cli_sapi_module.ini_entries = realloc(cli_sapi_module.ini_entries, ini_entries_len + len + sizeof("\n\0"));
+                                       memcpy(cli_sapi_module.ini_entries + ini_entries_len, php_optarg, len);
+                                       memcpy(cli_sapi_module.ini_entries + ini_entries_len + len, "\n\0", sizeof("\n\0"));
+                                       ini_entries_len += len + sizeof("\n\0") - 2;
+                               } else {
+                                       cli_sapi_module.ini_entries = realloc(cli_sapi_module.ini_entries, ini_entries_len + len + sizeof("=1\n\0"));
+                                       memcpy(cli_sapi_module.ini_entries + ini_entries_len, php_optarg, len);
+                                       memcpy(cli_sapi_module.ini_entries + ini_entries_len + len, "=1\n\0", sizeof("=1\n\0"));
+                                       ini_entries_len += len + sizeof("=1\n\0") - 2;
+                               }
+                               break;
+                       }
                }
        }
        php_optind = orig_optind;
@@ -683,7 +687,6 @@ int main(int argc, char *argv[])
        module_started = 1;
 
        zend_first_try {
-               zend_uv.html_errors = 0; /* tell the engine we're in non-html mode */
                CG(in_compilation) = 0; /* not initialized but needed for several options */
                EG(uninitialized_zval_ptr) = NULL;
 
@@ -693,21 +696,9 @@ int main(int argc, char *argv[])
                        goto out_err;
                }
 
-               /* here is the place for hard coded defaults which cannot be overwritten in the ini file */
-               INI_HARDCODED("register_argc_argv", "1");
-               INI_HARDCODED("html_errors", "0");
-               INI_HARDCODED("implicit_flush", "1");
-               INI_HARDCODED("output_buffering", "0");
-               INI_HARDCODED("max_execution_time", "0");
-               INI_HARDCODED("max_input_time", "-1");
-
                while ((c = php_getopt(argc, argv, OPTIONS, &php_optarg, &php_optind, 0)) != -1) {
                        switch (c) {
 
-                       case 'd': /* define ini entries on command line */
-                               define_command_line_ini_entry(php_optarg TSRMLS_CC);
-                               break;
-
                        case 'h': /* help & quit */
                        case '?':
                                if (php_request_startup(TSRMLS_C)==FAILURE) {
@@ -1260,6 +1251,10 @@ out_err:
        if (cli_sapi_module.php_ini_path_override) {
                free(cli_sapi_module.php_ini_path_override);
        }
+       if (cli_sapi_module.ini_entries) {
+               free(cli_sapi_module.ini_entries);
+       }
+
        if (module_started) {
                php_module_shutdown(TSRMLS_C);
        }