cvs: php4 /ext/sockets sockets.c
| From: | Jason Greene | Date: | Thu, 06 Dec 2001 04:44:23 +0000 |
| Subject: | cvs: php4 /ext/sockets sockets.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-8455@lists.php.net to get a copy of this message | ||
jason Wed Dec 5 23:44:23 2001 EDT
Modified files:
/php4/ext/sockets sockets.c
Log:
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)
Index: php4/ext/sockets/sockets.c
diff -u php4/ext/sockets/sockets.c:1.80 php4/ext/sockets/sockets.c:1.81
--- php4/ext/sockets/sockets.c:1.80 Thu Nov 29 03:18:50 2001
+++ php4/ext/sockets/sockets.c Wed Dec 5 23:44:23 2001
@@ -19,7 +19,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: sockets.c,v 1.80 2001/11/29 08:18:50 thies Exp $ */
+/* $Id: sockets.c,v 1.81 2001/12/06 04:44:23 jason Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -1297,7 +1297,7 @@
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 @@
{
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 @@
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 @@
{
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 @@
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;