Hi again,
I have it working here now, but whether that's just because the test suite script's set to ISO-8859-1/UTF-8 I don't know...
Patch attached in case anyone wants to mess about with it (nb 'ware DOS). It's nothing like commit-able, I was just fiddling, since having a third of our tests failing in HEAD poses a major problem when trying to maintain cross-version compatibility.
I found a problem with running zend_hash_find() on the env vars resulting from this patch. I think this is probably because the returned keys are unicode but the data is binary?
Outside of that issue, which *might* not be related anyway, 'it works on my box'.
- Steph
Index: ext/standard/proc_open.c =================================================================== RCS file: /repository/php-src/ext/standard/proc_open.c,v retrieving revision 1.63 diff -u -r1.63 proc_open.c --- ext/standard/proc_open.c 23 Jul 2008 11:24:35 -0000 1.63 +++ ext/standard/proc_open.c 30 Jul 2008 19:02:53 -0000 @@ -75,13 +75,12 @@ { zval **element; php_process_env_t env; - zstr string_key; - char *data; + zstr zstr_key; + char *string_key, *data, *p; #ifndef PHP_WIN32 char **ep; #endif - char *p; - uint string_length, cnt, l, sizeenv=0, el_len; + uint zstr_length, cnt, l, sizeenv=0, el_len; ulong num_key; HashTable *target_hash; HashPosition pos; @@ -120,12 +119,20 @@ sizeenv += el_len+1; - switch (zend_hash_get_current_key_ex(target_hash, &string_key, &string_length, &num_key, 0, &pos)) { + switch (zend_hash_get_current_key_ex(target_hash, &zstr_key, &zstr_length, &num_key, 0, &pos)) { + case HASH_KEY_IS_UNICODE: + if (zstr_length == 0) { + continue; + } + spprintf(&string_key, 0, "%v", zstr_key); + sizeenv += strlen(string_key)+1; + break; case HASH_KEY_IS_STRING: - if (string_length == 0) { + if (zstr_length == 0) { continue; } - sizeenv += string_length+1; + string_key = zstr_key.s; + sizeenv += strlen(string_key)+1; break; } } @@ -138,8 +145,13 @@ for (zend_hash_internal_pointer_reset_ex(target_hash, &pos); zend_hash_get_current_data_ex(target_hash, (void **) &element, &pos) == SUCCESS; zend_hash_move_forward_ex(target_hash, &pos)) { - - convert_to_string_ex(element); + + if (Z_TYPE_PP(element) == IS_UNICODE) { + zval_unicode_to_string(*(element) TSRMLS_CC); + } else { + convert_to_string_ex(element); + } + el_len = Z_STRLEN_PP(element); if (el_len == 0) { @@ -147,16 +159,31 @@ } data = Z_STRVAL_PP(element); - switch (zend_hash_get_current_key_ex(target_hash, &string_key, &string_length, &num_key, 0, &pos)) { + + switch (zend_hash_get_current_key_ex(target_hash, &zstr_key, &zstr_length, &num_key, 0, &pos)) { + case HASH_KEY_IS_UNICODE: + if (zstr_length == 0) { + continue; + } + spprintf(&string_key, 0, "%v", zstr_key); + l = zstr_length + el_len + 1; + memcpy(p, string_key, zstr_length + 1); + strcat(p, "="); + strcat(p, data); +#ifndef PHP_WIN32 + *ep = p; + ++ep; +#endif + p += l; + break; case HASH_KEY_IS_STRING: - if (string_length == 0) { + if (zstr_length == 0) { continue; } - l = string_length + el_len + 1; - memcpy(p, string_key.s, string_length); + l = zstr_length + el_len + 1; + memcpy(p, zstr_key.s, zstr_length); strcat(p, "="); strcat(p, data); - #ifndef PHP_WIN32 *ep = p; ++ep; @@ -174,10 +201,9 @@ case HASH_KEY_NON_EXISTANT: break; } - } + } assert(p - env.envp <= sizeenv); - zend_hash_internal_pointer_reset_ex(target_hash, &pos); return env;
-- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php