HashTable *args_hash, *envs_hash;
int argc = 0, argi = 0;
int envc = 0, envi = 0;
- int return_val = 0;
char **argv = NULL, **envp = NULL;
char **current_arg, **pair;
int pair_length;
argv = safe_emalloc((argc + 2), sizeof(char *), 0);
*argv = path;
- for ( zend_hash_internal_pointer_reset(args_hash), current_arg = argv+1;
- (argi < argc && ((element = zend_hash_get_current_data(args_hash)) != NULL));
- (argi++, current_arg++, zend_hash_move_forward(args_hash)) ) {
-
+ current_arg = argv+1;
+ ZEND_HASH_FOREACH_VAL(args_hash, element) {
+ if (argi >= argc) break;
convert_to_string_ex(element);
*current_arg = Z_STRVAL_P(element);
- }
+ argi++;
+ current_arg++;
+ } ZEND_HASH_FOREACH_END();
*(current_arg) = NULL;
} else {
argv = emalloc(2 * sizeof(char *));
envs_hash = HASH_OF(envs);
envc = zend_hash_num_elements(envs_hash);
- envp = safe_emalloc((envc + 1), sizeof(char *), 0);
- for ( zend_hash_internal_pointer_reset(envs_hash), pair = envp;
- (envi < envc && ((element = zend_hash_get_current_data(envs_hash)) != NULL));
- (envi++, pair++, zend_hash_move_forward(envs_hash)) ) {
- switch (return_val = zend_hash_get_current_key_ex(envs_hash, &key, &key_num, 0, &envs_hash->nInternalPointer)) {
- case HASH_KEY_IS_LONG:
- key = STR_ALLOC(101, 0);
- snprintf(key->val, 100, "%ld", key_num);
- key->len = strlen(key->val);
- break;
- case HASH_KEY_NON_EXISTENT:
- pair--;
- continue;
+ pair = envp = safe_emalloc((envc + 1), sizeof(char *), 0);
+ ZEND_HASH_FOREACH_KEY_VAL(envs_hash, key_num, key, element) {
+ if (envi >= envc) break;
+ if (!key) {
+ key = STR_ALLOC(101, 0);
+ snprintf(key->val, 100, "%ld", key_num);
+ key->len = strlen(key->val);
+ } else {
+ STR_ADDREF(key);
}
convert_to_string_ex(element);
strlcat(*pair, Z_STRVAL_P(element), pair_length);
/* Cleanup */
- if (return_val == HASH_KEY_IS_LONG) STR_RELEASE(key);
- }
+ STR_RELEASE(key);
+ envi++;
+ pair++;
+ } ZEND_HASH_FOREACH_END();
*(pair) = NULL;
if (execve(path, argv, envp) == -1) {
long how, signo;
zval *user_set, *user_oldset = NULL, *user_signo;
sigset_t set, oldset;
- HashPosition pos;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "la|z", &how, &user_set, &user_oldset) == FAILURE) {
return;
RETURN_FALSE;
}
- zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(user_set), &pos);
- while ((user_signo = zend_hash_get_current_data_ex(Z_ARRVAL_P(user_set), &pos)) != NULL) {
+ ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(user_set), user_signo) {
if (Z_TYPE_P(user_signo) != IS_LONG) {
SEPARATE_ZVAL(user_signo);
convert_to_long_ex(user_signo);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", strerror(errno));
RETURN_FALSE;
}
- zend_hash_move_forward_ex(Z_ARRVAL_P(user_set), &pos);
- }
+ } ZEND_HASH_FOREACH_END();
if (sigprocmask(how, &set, &oldset) != 0) {
PCNTL_G(last_error) = errno;
zval *user_set, *user_signo, *user_siginfo = NULL;
long tv_sec = 0, tv_nsec = 0;
sigset_t set;
- HashPosition pos;
int signo;
siginfo_t siginfo;
struct timespec timeout;
RETURN_FALSE;
}
- zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(user_set), &pos);
- while ((user_signo = zend_hash_get_current_data_ex(Z_ARRVAL_P(user_set), &pos)) != NULL) {
+ ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(user_set), user_signo) {
if (Z_TYPE_P(user_signo) != IS_LONG) {
SEPARATE_ZVAL(user_signo);
convert_to_long_ex(user_signo);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", strerror(errno));
RETURN_FALSE;
}
- zend_hash_move_forward_ex(Z_ARRVAL_P(user_set), &pos);
- }
+ } ZEND_HASH_FOREACH_END();
if (timedwait) {
timeout.tv_sec = (time_t) tv_sec;