andrei Fri Dec 15 23:28:10 2006 UTC
Modified files:
/php-src unicode-progress.txt
/php-src/ext/standard basic_functions.c
Log:
Unicode support in ini_*() functions.
http://cvs.php.net/viewvc.cgi/php-src/unicode-progress.txt?r1=1.66&r2=1.67&diff_format=u
Index: php-src/unicode-progress.txt
diff -u php-src/unicode-progress.txt:1.66 php-src/unicode-progress.txt:1.67
--- php-src/unicode-progress.txt:1.66 Tue Dec 12 19:25:47 2006
+++ php-src/unicode-progress.txt Fri Dec 15 23:28:09 2006
@@ -14,9 +14,6 @@
set_include_path(), get_include_path(), restore_include_path()
Params API, depends on INI mechanism
- ini_get(), ini_get_all(), ini_set(), ini_restore()
- Params API, Unicode support per discussion
-
get_cfg_var()
IS_UNICODE support for varname
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/basic_functions.c?r1=1.832&r2=1.833&diff_format=u
Index: php-src/ext/standard/basic_functions.c
diff -u php-src/ext/standard/basic_functions.c:1.832
php-src/ext/standard/basic_functions.c:1.833
--- php-src/ext/standard/basic_functions.c:1.832 Tue Dec 12 18:24:16 2006
+++ php-src/ext/standard/basic_functions.c Fri Dec 15 23:28:10 2006
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: basic_functions.c,v 1.832 2006/12/12 18:24:16 andrei Exp $ */
+/* $Id: basic_functions.c,v 1.833 2006/12/15 23:28:10 andrei Exp $ */
#include "php.h"
#include "php_streams.h"
@@ -5546,26 +5546,24 @@
}
/* }}} */
-/* {{{ proto string ini_get(string varname)
+/* {{{ proto string ini_get(string varname) U
Get a configuration option */
PHP_FUNCTION(ini_get)
{
- zval **varname;
- char *str;
+ char *varname, *str;
+ int varname_len;
- if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &varname) ==
FAILURE) {
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s&", &varname,
&varname_len, UG(utf8_conv)) == FAILURE) {
+ return;
}
- convert_to_string_ex(varname);
-
- str = zend_ini_string(Z_STRVAL_PP(varname), Z_STRLEN_PP(varname)+1, 0);
+ str = zend_ini_string(varname, varname_len+1, 0);
if (!str) {
RETURN_FALSE;
}
- RETURN_RT_STRING(str, 1);
+ RETURN_UTF8_STRING(str, ZSTR_DUPLICATE);
}
/* }}} */
@@ -5588,15 +5586,15 @@
array_init(option);
if (ini_entry->orig_value) {
- add_ascii_assoc_stringl(option, "global_value",
ini_entry->orig_value, ini_entry->orig_value_length, 1);
+ add_ascii_assoc_utf8_stringl(option, "global_value",
ini_entry->orig_value, ini_entry->orig_value_length, 1);
} else if (ini_entry->value) {
- add_ascii_assoc_stringl(option, "global_value",
ini_entry->value, ini_entry->value_length, 1);
+ add_ascii_assoc_utf8_stringl(option, "global_value",
ini_entry->value, ini_entry->value_length, 1);
} else {
add_ascii_assoc_null(option, "global_value");
}
if (ini_entry->value) {
- add_ascii_assoc_stringl(option, "local_value",
ini_entry->value, ini_entry->value_length, 1);
+ add_ascii_assoc_utf8_stringl(option, "local_value",
ini_entry->value, ini_entry->value_length, 1);
} else {
add_ascii_assoc_null(option, "local_value");
}
@@ -5608,7 +5606,7 @@
return 0;
}
-/* {{{ proto array ini_get_all([string extension])
+/* {{{ proto array ini_get_all([string extension]) U
Get all configuration options */
PHP_FUNCTION(ini_get_all)
{
@@ -5616,8 +5614,8 @@
int extname_len = 0, extnumber = 0;
zend_module_entry *module;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &extname,
&extname_len) == FAILURE) {
- RETURN_FALSE;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s&", &extname,
&extname_len, UG(ascii_conv)) == FAILURE) {
+ return;
}
zend_ini_sort_entries(TSRMLS_C);
@@ -5644,67 +5642,99 @@
return !strncmp(option_name, new_option_name, option_len);
}
-/* {{{ proto string ini_set(string varname, string newvalue)
+/* {{{ proto string ini_set(string varname, string newvalue) U
Set a configuration option, returns false on error and the old value of the
configuration option on success */
PHP_FUNCTION(ini_set)
{
- zval **varname, **new_value;
+ char *varname;
+ zstr new_value;
+ int varname_len, new_value_len;
+ zend_uchar type;
char *old_value;
- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &varname,
&new_value) == FAILURE) {
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s&t",
+ &varname,
&varname_len, UG(utf8_conv),
+ &new_value,
&new_value_len, &type) == FAILURE) {
+ return;
}
- convert_to_string_ex(varname);
- convert_to_string_ex(new_value);
-
- old_value = zend_ini_string(Z_STRVAL_PP(varname),
Z_STRLEN_PP(varname)+1, 0);
+ old_value = zend_ini_string(varname, varname_len+1, 0);
/* copy to return here, because alter might free it! */
if (old_value) {
- RETVAL_STRING(old_value, 1);
+ RETVAL_UTF8_STRING(old_value, ZSTR_DUPLICATE);
} else {
RETVAL_FALSE;
}
-#define _CHECK_PATH(var, ini) php_ini_check_path(Z_STRVAL_PP(var),
Z_STRLEN_PP(var), ini, sizeof(ini))
+#define _CHECK_PATH(var, var_len, ini) php_ini_check_path(var, var_len, ini,
sizeof(ini))
/* basedir check */
if (PG(open_basedir)) {
- if (_CHECK_PATH(varname, "error_log") ||
- _CHECK_PATH(varname, "java.class.path") ||
- _CHECK_PATH(varname, "java.home") ||
- _CHECK_PATH(varname, "java.library.path") ||
- _CHECK_PATH(varname, "vpopmail.directory")) {
+ char *path = NULL;
+ int path_len;
+
+ if (_CHECK_PATH(varname, varname_len, "error_log") ||
+ _CHECK_PATH(varname, varname_len, "java.class.path") ||
+ _CHECK_PATH(varname, varname_len, "java.home") ||
+ _CHECK_PATH(varname, varname_len, "java.library.path")
||
+ _CHECK_PATH(varname, varname_len,
"vpopmail.directory")) {
- if (php_check_open_basedir(Z_STRVAL_PP(new_value)
TSRMLS_CC)) {
+ /* convert to filesystem encoding to check against
open_basedir */
+ if (type == IS_UNICODE) {
+ if (FAILURE == php_stream_path_encode(NULL,
&path, &path_len, new_value.u, new_value_len, REPORT_ERRORS,
FG(default_context))) {
+ RETURN_FALSE;
+ }
+ } else {
+ path = new_value.s;
+ path_len = new_value_len;
+ }
+ if (php_check_open_basedir(path TSRMLS_CC)) {
+ if (type == IS_UNICODE) {
+ efree(path);
+ }
zval_dtor(return_value);
RETURN_FALSE;
}
+ if (type == IS_UNICODE) {
+ efree(path);
+ }
}
}
-
- if (zend_alter_ini_entry(Z_STRVAL_PP(varname), Z_STRLEN_PP(varname)+1,
Z_STRVAL_PP(new_value), Z_STRLEN_PP(new_value),
+
+ /* now convert to UTF-8 for the INI system */
+ if (type == IS_UNICODE) {
+ char *temp;
+ int temp_len;
+
+ zend_unicode_to_string(UG(utf8_conv), &temp, &temp_len,
new_value.u, new_value_len);
+ new_value.s = temp;
+ new_value_len = temp_len;
+ }
+
+ if (zend_alter_ini_entry(varname, varname_len+1, new_value.s,
new_value_len,
PHP_INI_USER,
PHP_INI_STAGE_RUNTIME) == FAILURE) {
zval_dtor(return_value);
- RETURN_FALSE;
+ RETVAL_FALSE;
+ }
+ if (type == IS_UNICODE) {
+ efree(new_value.s);
}
}
/* }}} */
-/* {{{ proto void ini_restore(string varname)
+/* {{{ proto void ini_restore(string varname) U
Restore the value of a configuration option specified by varname */
PHP_FUNCTION(ini_restore)
{
- zval **varname;
+ char *varname;
+ int varname_len;
- if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &varname) ==
FAILURE) {
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s&", &varname,
&varname_len, UG(utf8_conv)) == FAILURE) {
+ return;
}
- convert_to_string_ex(varname);
-
- zend_restore_ini_entry(Z_STRVAL_PP(varname), Z_STRLEN_PP(varname)+1,
PHP_INI_STAGE_RUNTIME);
+ zend_restore_ini_entry(varname, varname_len+1, PHP_INI_STAGE_RUNTIME);
}
/* }}} */
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php