summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Flueeli <tflueeli@gmail.com>2011-02-02 22:59:56 +0100
committerWill Thompson <will.thompson@collabora.co.uk>2011-07-06 20:13:59 +0100
commit5c06d57058f169401449039b7148470ca1784699 (patch)
treedc0ed6a13f9b1b147673ec5307452b4e7ad60991
parent9086cd4c9be315aa91a6284ffecb65178c89c8c1 (diff)
gibber: fix TCP connection establishment on Windows
https://bugs.freedesktop.org/show_bug.cgi?id=31621 Reviewed-by: Will Thompson <will.thompson@collabora.co.uk>
-rw-r--r--lib/gibber/gibber-sockets.c9
-rw-r--r--lib/gibber/gibber-sockets.h2
-rw-r--r--lib/gibber/gibber-tcp-transport.c14
3 files changed, 17 insertions, 8 deletions
diff --git a/lib/gibber/gibber-sockets.c b/lib/gibber/gibber-sockets.c
index bcedeb53b..b926f9027 100644
--- a/lib/gibber/gibber-sockets.c
+++ b/lib/gibber/gibber-sockets.c
@@ -27,14 +27,13 @@
#include "gibber-debug.h"
gboolean
-gibber_connect_errno_requires_retry (void)
+gibber_connect_errno_requires_retry (int err)
{
#ifdef G_OS_WIN32
- int err = WSAGetLastError ();
-
- return (err == WSAEINPROGRESS || err == WSAEALREADY);
+ return (err == WSAEINPROGRESS || err == WSAEALREADY ||
+ err == WSAEWOULDBLOCK || err == WSAEINVAL);
#else
- return (errno == EINPROGRESS || errno == EALREADY);
+ return (err == EINPROGRESS || err == EALREADY);
#endif
}
diff --git a/lib/gibber/gibber-sockets.h b/lib/gibber/gibber-sockets.h
index 5cfb3c8b3..48ec43424 100644
--- a/lib/gibber/gibber-sockets.h
+++ b/lib/gibber/gibber-sockets.h
@@ -32,7 +32,7 @@
G_BEGIN_DECLS
-gboolean gibber_connect_errno_requires_retry (void);
+gboolean gibber_connect_errno_requires_retry (int err);
gboolean gibber_socket_errno_is_eafnosupport (void);
gboolean gibber_socket_errno_is_eaddrinuse (void);
void gibber_socket_set_error (GError **error, const gchar *context,
diff --git a/lib/gibber/gibber-tcp-transport.c b/lib/gibber/gibber-tcp-transport.c
index 3fb1723d5..a33601bad 100644
--- a/lib/gibber/gibber-tcp-transport.c
+++ b/lib/gibber/gibber-tcp-transport.c
@@ -165,6 +165,8 @@ try_to_connect (GibberTCPTransport *self)
gssize native_size;
gint fd;
int ret;
+ int err;
+ gboolean connected = FALSE;
g_assert (priv->channel != NULL);
@@ -182,9 +184,17 @@ try_to_connect (GibberTCPTransport *self)
g_socket_address_to_native (gaddr, &addr, sizeof (addr), NULL);
ret = connect (fd, (struct sockaddr *)&addr, (gsize) native_size);
+#ifdef G_OS_WIN32
+ err = WSAGetLastError ();
+ connected = (ret == 0 || err == WSAEISCONN);
+#else
+ err = errno;
+ connected = (ret == 0);
+#endif
+
g_object_unref (gaddr);
- if (ret == 0)
+ if (connected)
{
DEBUG ("connect succeeded");
@@ -193,7 +203,7 @@ try_to_connect (GibberTCPTransport *self)
return FALSE;
}
- if (gibber_connect_errno_requires_retry ())
+ if (gibber_connect_errno_requires_retry (err))
{
/* We have to wait longer */
return TRUE;