Browse Source

Use new zend_hash API

pull/686/head
Dmitry Stogov 12 years ago
parent
commit
b675492054
  1. 54
      ext/pcntl/pcntl.c

54
ext/pcntl/pcntl.c

@ -747,7 +747,6 @@ PHP_FUNCTION(pcntl_exec)
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;
@ -767,13 +766,14 @@ PHP_FUNCTION(pcntl_exec)
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 *));
@ -786,19 +786,15 @@ PHP_FUNCTION(pcntl_exec)
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);
@ -811,8 +807,10 @@ PHP_FUNCTION(pcntl_exec)
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) {
@ -921,7 +919,6 @@ PHP_FUNCTION(pcntl_sigprocmask)
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;
@ -933,8 +930,7 @@ PHP_FUNCTION(pcntl_sigprocmask)
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);
@ -945,8 +941,7 @@ PHP_FUNCTION(pcntl_sigprocmask)
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;
@ -981,7 +976,6 @@ static void pcntl_sigwaitinfo(INTERNAL_FUNCTION_PARAMETERS, int timedwait) /* {{
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;
@ -1002,8 +996,7 @@ static void pcntl_sigwaitinfo(INTERNAL_FUNCTION_PARAMETERS, int timedwait) /* {{
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);
@ -1014,8 +1007,7 @@ static void pcntl_sigwaitinfo(INTERNAL_FUNCTION_PARAMETERS, int timedwait) /* {{
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;

Loading…
Cancel
Save