summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTatjana Azundris Nuernberg <tatjana.nuernberg@oracle.com>2012-02-22 16:18:12 +0100
committerTatjana Azundris Nuernberg <tatjana.nuernberg@oracle.com>2012-02-22 16:18:12 +0100
commiteca61722b0674be62a7265eb55e10d5c98515efd (patch)
treee79c837378ec12d7fcc9a89502df96e7860bd1c2
parent067f83e642f472ccae31b593fead20d7588f681a (diff)
parent108445549bf0f9428ae714cfe41266f34adf12f8 (diff)
downloadmariadb-git-eca61722b0674be62a7265eb55e10d5c98515efd.tar.gz
auto-merge
-rw-r--r--include/violite.h3
-rw-r--r--sql/mysqld.cc16
-rw-r--r--vio/viosocket.c40
3 files changed, 50 insertions, 9 deletions
diff --git a/include/violite.h b/include/violite.h
index 32354938e13..5facd0911b7 100644
--- a/include/violite.h
+++ b/include/violite.h
@@ -61,6 +61,9 @@ int vio_close_pipe(Vio * vio);
#define HANDLE void *
#endif /* __WIN__ */
+/* backport from 5.6 where it is part of PSI, not vio_*() */
+int mysql_socket_shutdown(my_socket mysql_socket, int how);
+
void vio_delete(Vio* vio);
int vio_close(Vio* vio);
void vio_reset(Vio* vio, enum enum_vio_type type,
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index c47d39721b9..a37479dc4b4 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -932,7 +932,7 @@ static void close_connections(void)
{
if (ip_sock != INVALID_SOCKET)
{
- (void) shutdown(ip_sock, SHUT_RDWR);
+ (void) mysql_socket_shutdown(ip_sock, SHUT_RDWR);
(void) closesocket(ip_sock);
ip_sock= INVALID_SOCKET;
}
@@ -964,7 +964,7 @@ static void close_connections(void)
#ifdef HAVE_SYS_UN_H
if (unix_sock != INVALID_SOCKET)
{
- (void) shutdown(unix_sock, SHUT_RDWR);
+ (void) mysql_socket_shutdown(unix_sock, SHUT_RDWR);
(void) closesocket(unix_sock);
(void) unlink(mysqld_unix_port);
unix_sock= INVALID_SOCKET;
@@ -1069,7 +1069,7 @@ static void close_server_sock()
{
ip_sock=INVALID_SOCKET;
DBUG_PRINT("info",("calling shutdown on TCP/IP socket"));
- VOID(shutdown(tmp_sock, SHUT_RDWR));
+ VOID(mysql_socket_shutdown(tmp_sock, SHUT_RDWR));
#if defined(__NETWARE__)
/*
The following code is disabled for normal systems as it causes MySQL
@@ -1084,7 +1084,7 @@ static void close_server_sock()
{
unix_sock=INVALID_SOCKET;
DBUG_PRINT("info",("calling shutdown on unix socket"));
- VOID(shutdown(tmp_sock, SHUT_RDWR));
+ VOID(mysql_socket_shutdown(tmp_sock, SHUT_RDWR));
#if defined(__NETWARE__)
/*
The following code is disabled for normal systems as it may cause MySQL
@@ -5091,7 +5091,7 @@ pthread_handler_t handle_connections_sockets(void *arg __attribute__((unused)))
if (req.sink)
((void (*)(int))req.sink)(req.fd);
- (void) shutdown(new_sock, SHUT_RDWR);
+ (void) mysql_socket_shutdown(new_sock, SHUT_RDWR);
(void) closesocket(new_sock);
continue;
}
@@ -5106,7 +5106,7 @@ pthread_handler_t handle_connections_sockets(void *arg __attribute__((unused)))
if (getsockname(new_sock,&dummy, &dummyLen) < 0)
{
sql_perror("Error on new connection socket");
- (void) shutdown(new_sock, SHUT_RDWR);
+ (void) mysql_socket_shutdown(new_sock, SHUT_RDWR);
(void) closesocket(new_sock);
continue;
}
@@ -5118,7 +5118,7 @@ pthread_handler_t handle_connections_sockets(void *arg __attribute__((unused)))
if (!(thd= new THD))
{
- (void) shutdown(new_sock, SHUT_RDWR);
+ (void) mysql_socket_shutdown(new_sock, SHUT_RDWR);
VOID(closesocket(new_sock));
continue;
}
@@ -5137,7 +5137,7 @@ pthread_handler_t handle_connections_sockets(void *arg __attribute__((unused)))
vio_delete(vio_tmp);
else
{
- (void) shutdown(new_sock, SHUT_RDWR);
+ (void) mysql_socket_shutdown(new_sock, SHUT_RDWR);
(void) closesocket(new_sock);
}
delete thd;
diff --git a/vio/viosocket.c b/vio/viosocket.c
index 024aacc5db2..9633a01f689 100644
--- a/vio/viosocket.c
+++ b/vio/viosocket.c
@@ -23,8 +23,15 @@
the file descriptior.
*/
+#ifdef __WIN__
+ #include <winsock2.h>
+ #include <MSWSock.h>
+ #pragma comment(lib, "ws2_32.lib")
+#endif
#include "vio_priv.h"
+
+
int vio_errno(Vio *vio __attribute__((unused)))
{
return socket_errno; /* On Win32 this mapped to WSAGetLastError() */
@@ -260,6 +267,37 @@ vio_was_interrupted(Vio *vio __attribute__((unused)))
}
+int
+mysql_socket_shutdown(my_socket mysql_socket, int how)
+{
+ int result;
+
+#ifdef __WIN__
+ static LPFN_DISCONNECTEX DisconnectEx = NULL;
+ if (DisconnectEx == NULL)
+ {
+ DWORD dwBytesReturned;
+ GUID guidDisconnectEx = WSAID_DISCONNECTEX;
+ WSAIoctl(mysql_socket, SIO_GET_EXTENSION_FUNCTION_POINTER,
+ &guidDisconnectEx, sizeof(GUID),
+ &DisconnectEx, sizeof(DisconnectEx),
+ &dwBytesReturned, NULL, NULL);
+ }
+#endif
+
+ /* Non instrumented code */
+#ifdef __WIN__
+ if (DisconnectEx)
+ result= (DisconnectEx(mysql_socket, (LPOVERLAPPED) NULL,
+ (DWORD) 0, (DWORD) 0) == TRUE) ? 0 : -1;
+ else
+#endif
+ result= shutdown(mysql_socket, how);
+
+ return result;
+}
+
+
int vio_close(Vio * vio)
{
int r=0;
@@ -272,7 +310,7 @@ int vio_close(Vio * vio)
vio->type == VIO_TYPE_SSL);
DBUG_ASSERT(vio->sd >= 0);
- if (shutdown(vio->sd, SHUT_RDWR))
+ if (mysql_socket_shutdown(vio->sd, SHUT_RDWR))
r= -1;
if (closesocket(vio->sd))
r= -1;