diff options
author | Thomas Flueeli <tflueeli@gmail.com> | 2011-02-02 22:59:56 +0100 |
---|---|---|
committer | Will Thompson <will.thompson@collabora.co.uk> | 2011-07-06 20:13:59 +0100 |
commit | 5c06d57058f169401449039b7148470ca1784699 (patch) | |
tree | dc0ed6a13f9b1b147673ec5307452b4e7ad60991 | |
parent | 9086cd4c9be315aa91a6284ffecb65178c89c8c1 (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.c | 9 | ||||
-rw-r--r-- | lib/gibber/gibber-sockets.h | 2 | ||||
-rw-r--r-- | lib/gibber/gibber-tcp-transport.c | 14 |
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; |