diff options
author | Jason Greene <jason@php.net> | 2001-12-06 04:44:23 +0000 |
---|---|---|
committer | Jason Greene <jason@php.net> | 2001-12-06 04:44:23 +0000 |
commit | 49c3d762ee9932e19905ab4187608e507f9815f5 (patch) | |
tree | b94a90ad05a6f2935f68e65563d6754f2df7a5b1 /ext/sockets/sockets.c | |
parent | 686380b824c73d31a203e202184d70b9e44b8c41 (diff) | |
download | php-git-49c3d762ee9932e19905ab4187608e507f9815f5.tar.gz |
Fix broken format string in socket_recv -> zend_parse_parameters
Rewrote socket_setopt and socket_getopt to be cleaner
@Added support for SO_RCVTIMEO and SO_SNDTIMEO to ext/sockets (Jason)
Diffstat (limited to 'ext/sockets/sockets.c')
-rw-r--r-- | ext/sockets/sockets.c | 149 |
1 files changed, 101 insertions, 48 deletions
diff --git a/ext/sockets/sockets.c b/ext/sockets/sockets.c index 11f6945b5f..df46a28480 100644 --- a/ext/sockets/sockets.c +++ b/ext/sockets/sockets.c @@ -1297,7 +1297,7 @@ PHP_FUNCTION(socket_recv) php_socket *php_sock; int retval, len, flags; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rr", &arg1, &len, &flags) == FAILURE) + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rll", &arg1, &len, &flags) == FAILURE) return; ZEND_FETCH_RESOURCE(php_sock, php_socket *, &arg1, -1, le_socket_name, le_socket); @@ -1700,6 +1700,7 @@ PHP_FUNCTION(socket_getopt) { zval *arg1; struct linger linger_val; + struct timeval tv; socklen_t optlen; php_socket *php_sock; int other_val, level, optname; @@ -1708,31 +1709,51 @@ PHP_FUNCTION(socket_getopt) return; ZEND_FETCH_RESOURCE(php_sock, php_socket *, &arg1, -1, le_socket_name, le_socket); - - if (optname == SO_LINGER) { - optlen = sizeof(struct linger); + + switch(optname) { + case SO_LINGER: + optlen = sizeof(linger_val); - if (getsockopt(php_sock->bsd_socket, level, optname, (char*)&linger_val, &optlen) != 0) { - PHP_SOCKET_ERROR(php_sock, "unable to retrieve socket option", errno); - RETURN_FALSE; - } + if (getsockopt(php_sock->bsd_socket, level, optname, (char*)&linger_val, &optlen) != 0) { + PHP_SOCKET_ERROR(php_sock, "unable to retrieve socket option", errno); + RETURN_FALSE; + } - if (array_init(return_value) == FAILURE) { - RETURN_FALSE; - } + if (array_init(return_value) == FAILURE) { + RETURN_FALSE; + } - add_assoc_long(return_value, "l_onoff", linger_val.l_onoff); - add_assoc_long(return_value, "l_linger", linger_val.l_linger); + add_assoc_long(return_value, "l_onoff", linger_val.l_onoff); + add_assoc_long(return_value, "l_linger", linger_val.l_linger); + + break; + case SO_RCVTIMEO: + case SO_SNDTIMEO: + optlen = sizeof(tv); - } else { - optlen = sizeof(other_val); + if (getsockopt(php_sock->bsd_socket, level, optname, (char*)&tv, &optlen) != 0) { + PHP_SOCKET_ERROR(php_sock, "unable to retrieve socket option", errno); + RETURN_FALSE; + } + + if (array_init(return_value) == FAILURE) { + RETURN_FALSE; + } + + add_assoc_long(return_value, "sec", tv.tv_sec); + add_assoc_long(return_value, "usec", tv.tv_usec); + + break; + default: + optlen = sizeof(other_val); - if (getsockopt(php_sock->bsd_socket, level, optname, (char*)&other_val, &optlen) != 0) { - PHP_SOCKET_ERROR(php_sock, "unable to retrieve socket option", errno); - RETURN_FALSE; - } + if (getsockopt(php_sock->bsd_socket, level, optname, (char*)&other_val, &optlen) != 0) { + PHP_SOCKET_ERROR(php_sock, "unable to retrieve socket option", errno); + RETURN_FALSE; + } - RETURN_LONG(other_val); + RETURN_LONG(other_val); + break; } } /* }}} */ @@ -1743,8 +1764,20 @@ PHP_FUNCTION(socket_setopt) { zval *arg1, *arg4; struct linger lv; + struct timeval tv; php_socket *php_sock; int ov, optlen, retval, level, optname; + void *opt_ptr; + + HashTable *opt_ht; + zval **l_onoff, **l_linger; + zval **sec, **usec; + + /* key name constants */ + char *l_onoff_key="l_onoff"; + char *l_linger_key="l_linger"; + char *sec_key="sec"; + char *usec_key="usec"; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rllz", &arg1, &level, &optname, &arg4) == FAILURE) return; @@ -1753,42 +1786,62 @@ PHP_FUNCTION(socket_setopt) set_errno(0); - if (optname == SO_LINGER) { - HashTable *ht; - zval **l_onoff; - zval **l_linger; + switch (optname) { + case SO_LINGER: + convert_to_array_ex(&arg4); + opt_ht = HASH_OF(arg4); - convert_to_array_ex(&arg4); - ht = HASH_OF(arg4); - - if (zend_hash_find(ht, "l_onoff", strlen("l_onoff") + 1, (void **)&l_onoff) == FAILURE) { - php_error(E_WARNING, "%s() no key \"l_onoff\" passed in optval", get_active_function_name(TSRMLS_C)); - RETURN_FALSE; - } - if (zend_hash_find(ht, "l_linger", strlen("l_linger") + 1, (void **)&l_linger) == FAILURE) { - php_error(E_WARNING, "%s() no key \"l_linger\" passed in optval", get_active_function_name(TSRMLS_C)); - RETURN_FALSE; - } - - convert_to_long_ex(l_onoff); - convert_to_long_ex(l_linger); + if (zend_hash_find(opt_ht, l_onoff_key, strlen(l_onoff_key) + 1, (void **)&l_onoff) == FAILURE) { + php_error(E_WARNING, "%s() no key \"%s\" passed in optval", get_active_function_name(TSRMLS_C), l_onoff_key); + RETURN_FALSE; + } + if (zend_hash_find(opt_ht, l_linger_key, strlen(l_linger_key) + 1, (void **)&l_linger) == FAILURE) { + php_error(E_WARNING, "%s() no key \"%s\" passed in optval", get_active_function_name(TSRMLS_C), l_linger_key); + RETURN_FALSE; + } - lv.l_onoff = (unsigned short)Z_LVAL_PP(l_onoff); - lv.l_linger = (unsigned short)Z_LVAL_PP(l_linger); + convert_to_long_ex(l_onoff); + convert_to_long_ex(l_linger); - optlen = sizeof(lv); - - retval = setsockopt(php_sock->bsd_socket, level, optname, (char*)&lv, optlen); + lv.l_onoff = (unsigned short)Z_LVAL_PP(l_onoff); + lv.l_linger = (unsigned short)Z_LVAL_PP(l_linger); - } else { - convert_to_long_ex(&arg4); + optlen = sizeof(lv); + opt_ptr=&lv; + break; + case SO_RCVTIMEO: + case SO_SNDTIMEO: + convert_to_array_ex(&arg4); + opt_ht = HASH_OF(arg4); - optlen = sizeof(ov); - ov = Z_LVAL_P(arg4); + if (zend_hash_find(opt_ht, sec_key, strlen(sec_key) + 1, (void **)&sec) == FAILURE) { + php_error(E_WARNING, "%s() no key \"%s\" passed in optval", get_active_function_name(TSRMLS_C), sec_key); + RETURN_FALSE; + } + if (zend_hash_find(opt_ht, usec_key, strlen(usec_key) + 1, (void **)&usec) == FAILURE) { + php_error(E_WARNING, "%s() no key \"%s\" passed in optval", get_active_function_name(TSRMLS_C), usec_key); + RETURN_FALSE; + } + + convert_to_long_ex(sec); + convert_to_long_ex(usec); + tv.tv_sec=Z_LVAL_PP(sec); + tv.tv_usec=Z_LVAL_PP(usec); - retval = setsockopt(php_sock->bsd_socket, level, optname, (char*)&ov, optlen); + optlen = sizeof(tv); + opt_ptr=&tv; + break; + default: + convert_to_long_ex(&arg4); + ov = Z_LVAL_P(arg4); + + optlen = sizeof(ov); + opt_ptr=&ov; + break; } + retval = setsockopt(php_sock->bsd_socket, level, optname, opt_ptr, optlen); + if (retval != 0) { PHP_SOCKET_ERROR(php_sock, "unable to set socket option", errno); RETURN_FALSE; |