summaryrefslogtreecommitdiff
path: root/main/streams/xp_socket.c
diff options
context:
space:
mode:
authorSriram Natarajan <srinatar@php.net>2009-09-04 07:59:48 +0000
committerSriram Natarajan <srinatar@php.net>2009-09-04 07:59:48 +0000
commitac2d3990f24cd3d628b6d3ddbd0e957bbb62d974 (patch)
tree977573089df2b6fcf58e92889f9cddd0afed4d75 /main/streams/xp_socket.c
parent542c087a865329dca7ed354a8a8e7523418c1fa7 (diff)
downloadphp-git-ac2d3990f24cd3d628b6d3ddbd0e957bbb62d974.tar.gz
- Fixed bug #49447 (php engine need to correctly check for socket API
return status on windows). (Sriram Natarajan)
Diffstat (limited to 'main/streams/xp_socket.c')
-rw-r--r--main/streams/xp_socket.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/main/streams/xp_socket.c b/main/streams/xp_socket.c
index 295eb2a11f..244d3c37e1 100644
--- a/main/streams/xp_socket.c
+++ b/main/streams/xp_socket.c
@@ -181,6 +181,10 @@ static int php_sockop_close(php_stream *stream, int close_handle TSRMLS_DC)
if (close_handle) {
+#ifdef PHP_WIN32
+ if (sock->socket == -1)
+ sock->socket = SOCK_ERR;
+#endif
if (sock->socket != SOCK_ERR) {
#ifdef PHP_WIN32
/* prevent more data from coming in */
@@ -226,10 +230,12 @@ static inline int sock_sendto(php_netstream_data_t *sock, char *buf, size_t bufl
struct sockaddr *addr, socklen_t addrlen
TSRMLS_DC)
{
+ int ret;
if (addr) {
- return sendto(sock->socket, buf, buflen, flags, addr, addrlen);
+ ret = sendto(sock->socket, buf, buflen, flags, addr, addrlen);
+ return (ret == SOCK_CONN_ERR) ? -1 : ret;
}
- return send(sock->socket, buf, buflen, flags);
+ return ((ret = send(sock->socket, buf, buflen, flags)) == SOCK_CONN_ERR) ? -1 : ret;
}
static inline int sock_recvfrom(php_netstream_data_t *sock, char *buf, size_t buflen, int flags,
@@ -244,10 +250,12 @@ static inline int sock_recvfrom(php_netstream_data_t *sock, char *buf, size_t bu
if (want_addr) {
ret = recvfrom(sock->socket, buf, buflen, flags, (struct sockaddr*)&sa, &sl);
+ ret = (ret == SOCK_CONN_ERR) ? -1 : ret;
php_network_populate_name_from_sockaddr((struct sockaddr*)&sa, sl,
textaddr, textaddrlen, addr, addrlen TSRMLS_CC);
} else {
ret = recv(sock->socket, buf, buflen, flags);
+ ret = (ret == SOCK_CONN_ERR) ? -1 : ret;
}
return ret;
@@ -281,7 +289,7 @@ static int php_sockop_set_option(php_stream *stream, int option, int value, void
if (sock->socket == -1) {
alive = 0;
} else if (php_pollfd_for(sock->socket, PHP_POLLREADABLE|POLLPRI, &tv) > 0) {
- if (0 >= recv(sock->socket, &buf, sizeof(buf), MSG_PEEK) && php_socket_errno() != EWOULDBLOCK) {
+ if (recv(sock->socket, &buf, sizeof(buf), MSG_PEEK) != SOCK_CONN_ERR && php_socket_errno() != EWOULDBLOCK) {
alive = 0;
}
}
@@ -312,7 +320,7 @@ static int php_sockop_set_option(php_stream *stream, int option, int value, void
switch (xparam->op) {
case STREAM_XPORT_OP_LISTEN:
- xparam->outputs.returncode = listen(sock->socket, 5);
+ xparam->outputs.returncode = (listen(sock->socket, 5) == 0) ? 0: -1;
return PHP_STREAM_OPTION_RETURN_OK;
case STREAM_XPORT_OP_GET_NAME: