summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--main/network.c15
-rw-r--r--main/php_network.h11
2 files changed, 25 insertions, 1 deletions
diff --git a/main/network.c b/main/network.c
index 983d77b0ef..f973462b08 100644
--- a/main/network.c
+++ b/main/network.c
@@ -849,6 +849,8 @@ static size_t php_sockop_read(php_stream *stream, char *buf, size_t count TSRMLS
static int php_sockop_close(php_stream *stream, int close_handle TSRMLS_DC)
{
php_netstream_data_t *sock = (php_netstream_data_t*)stream->abstract;
+ fd_set wrfds, efds;
+ int n;
if (close_handle) {
#if HAVE_OPENSSL_EXT
@@ -862,7 +864,18 @@ static int php_sockop_close(php_stream *stream, int close_handle TSRMLS_DC)
}
#endif
- /* shutdown(sock->socket, 0); */
+ /* prevent more data from coming in */
+ shutdown(sock->socket, SHUT_RD);
+
+ /* make sure that the OS sends all data before we close the connection */
+ do {
+ FD_ZERO(&wrfds);
+ FD_SET(sock->socket, &wrfds);
+ efds = wrfds;
+
+ n = select(sock->socket + 1, NULL, &wrfds, &efds, NULL);
+ } while (n == -1 && php_socket_errno() == EINTR);
+
closesocket(sock->socket);
}
diff --git a/main/php_network.h b/main/php_network.h
index 4e6ae61ad8..05fcdead79 100644
--- a/main/php_network.h
+++ b/main/php_network.h
@@ -27,6 +27,9 @@
# undef FD_SETSIZE
# include "arpa/inet.h"
# define socklen_t unsigned int
+# define SHUT_RD SD_RECEIVE
+# define SHUT_WR SD_SEND
+# define SHUT_RDWR SD_BOTH
#else
# undef closesocket
# define closesocket close
@@ -62,6 +65,14 @@ PHPAPI char *php_socket_strerror(long err, char *buf, size_t bufsize);
#include <sys/socket.h>
#endif
+/* These are here, rather than with the win32 counterparts above,
+ * since <sys/socket.h> defines them. */
+#ifndef SHUT_RD
+# define SHUT_RD 0
+# define SHUT_WR 1
+# define SHUT_RDWR 2
+#endif
+
#ifdef HAVE_SYS_TIME_H
#include <sys/time.h>
#endif