--- sockets.c.orig 2011-03-05 16:06:40.000000000 +0100 +++ sockets.c 2011-03-05 16:07:37.000000000 +0100 @@ -1729,6 +1729,7 @@ #endif socklen_t optlen; php_socket *php_sock; + php_stream *stream; int other_val; long level, optname; @@ -1736,7 +1737,19 @@ return; } - ZEND_FETCH_RESOURCE(php_sock, php_socket *, &arg1, -1, le_socket_name, le_socket); + if (!strcmp(zend_rsrc_list_get_rsrc_type(Z_RESVAL_P(arg1)), "stream")) { + php_stream_from_zval(stream, &arg1); + php_sock = emalloc(sizeof(php_socket)); + if (php_stream_cast(stream, PHP_STREAM_AS_FD | PHP_STREAM_CAST_INTERNAL, (void*)&php_sock->bsd_socket, 1) == FAILURE) { + efree(php_sock); + } else { + php_sock->error = 0; + } + } + + if (!php_sock) { + ZEND_FETCH_RESOURCE(php_sock, php_socket *, &arg1, -1, le_socket_name, le_socket); + } switch(optname) { case SO_LINGER: @@ -1800,6 +1813,7 @@ zval *arg1, **arg4; struct linger lv; php_socket *php_sock; + php_stream *stream; int ov, optlen, retval; #ifdef PHP_WIN32 int timeout; @@ -1821,8 +1835,20 @@ return; } - ZEND_FETCH_RESOURCE(php_sock, php_socket *, &arg1, -1, le_socket_name, le_socket); + if (!strcmp(zend_rsrc_list_get_rsrc_type(Z_RESVAL_P(arg1)), "stream")) { + php_stream_from_zval(stream, &arg1); + php_sock = emalloc(sizeof(php_socket)); + if (php_stream_cast(stream, PHP_STREAM_AS_FD | PHP_STREAM_CAST_INTERNAL, (void*)&php_sock->bsd_socket, 1) == FAILURE) { + efree(php_sock); + } else { + php_sock->error = 0; + } + } + if (!php_sock) { + ZEND_FETCH_RESOURCE(php_sock, php_socket *, &arg1, -1, le_socket_name, le_socket); + } + set_errno(0); switch (optname) {