summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorSimon McVittie <simon.mcvittie@collabora.co.uk>2010-05-07 15:49:00 +0100
committerSimon McVittie <simon.mcvittie@collabora.co.uk>2010-05-07 16:04:56 +0100
commit68ee3ccf3cae7c3054b6f972632bc89beadfdcf1 (patch)
tree4cdc199df146fad3d843ba460c4a14bc0fc335c1 /lib
parent50d6f3d9a86d6512ce6e1b558827b82888cdffad (diff)
downloadtelepathy-salut-68ee3ccf3cae7c3054b6f972632bc89beadfdcf1.tar.gz
gibber_fd_transport_set_fd: take an is_socket parameter, and call Winsock-compatible functions if true
For the moment I'm just skipping the "non-blocking I/O" fcntl for non-sockets on Windows. In practice, this code path is never taken... (Taken from Gabble)
Diffstat (limited to 'lib')
-rw-r--r--lib/gibber/gibber-fd-transport.c19
-rw-r--r--lib/gibber/gibber-fd-transport.h3
-rw-r--r--lib/gibber/gibber-linklocal-transport.c4
-rw-r--r--lib/gibber/gibber-listener.c2
-rw-r--r--lib/gibber/gibber-tcp-transport.c2
-rw-r--r--lib/gibber/gibber-unix-transport.c4
6 files changed, 24 insertions, 10 deletions
diff --git a/lib/gibber/gibber-fd-transport.c b/lib/gibber/gibber-fd-transport.c
index bab129d4..e23f1bc4 100644
--- a/lib/gibber/gibber-fd-transport.c
+++ b/lib/gibber/gibber-fd-transport.c
@@ -422,15 +422,28 @@ gibber_fd_transport_read (GibberFdTransport *transport,
void
-gibber_fd_transport_set_fd (GibberFdTransport *self, int fd)
+gibber_fd_transport_set_fd (GibberFdTransport *self, int fd,
+ gboolean is_socket)
{
GibberFdTransportPrivate *priv = GIBBER_FD_TRANSPORT_GET_PRIVATE (self);
g_assert (self->fd == -1 && fd >= 0);
self->fd = fd;
- fcntl (fd, F_SETFL, O_NONBLOCK);
- priv->channel = g_io_channel_unix_new (fd);
+
+ if (is_socket)
+ {
+ gibber_socket_set_nonblocking (fd);
+ priv->channel = gibber_io_channel_new_from_socket (fd);
+ }
+ else
+ {
+#ifndef G_OS_WIN32
+ fcntl (fd, F_SETFL, O_NONBLOCK);
+#endif
+ priv->channel = g_io_channel_unix_new (fd);
+ }
+
g_io_channel_set_close_on_unref (priv->channel, TRUE);
g_io_channel_set_encoding (priv->channel, NULL, NULL);
g_io_channel_set_buffered (priv->channel, FALSE);
diff --git a/lib/gibber/gibber-fd-transport.h b/lib/gibber/gibber-fd-transport.h
index 852fc39d..545e00a3 100644
--- a/lib/gibber/gibber-fd-transport.h
+++ b/lib/gibber/gibber-fd-transport.h
@@ -84,7 +84,8 @@ GType gibber_fd_transport_get_type (void);
GibberFdTransportClass))
void
-gibber_fd_transport_set_fd (GibberFdTransport *fd_transport, int fd);
+gibber_fd_transport_set_fd (GibberFdTransport *fd_transport, int fd,
+ gboolean is_socket);
GibberFdIOResult gibber_fd_transport_read (GibberFdTransport *transport,
GIOChannel *channel,
diff --git a/lib/gibber/gibber-linklocal-transport.c b/lib/gibber/gibber-linklocal-transport.c
index 2dc87aa5..164af89c 100644
--- a/lib/gibber/gibber-linklocal-transport.c
+++ b/lib/gibber/gibber-linklocal-transport.c
@@ -121,7 +121,7 @@ gibber_ll_transport_open_fd (GibberLLTransport *transport, int fd)
gibber_transport_set_state (GIBBER_TRANSPORT (transport),
GIBBER_TRANSPORT_CONNECTING);
- gibber_fd_transport_set_fd (GIBBER_FD_TRANSPORT (transport), fd);
+ gibber_fd_transport_set_fd (GIBBER_FD_TRANSPORT (transport), fd, TRUE);
}
gboolean
@@ -168,7 +168,7 @@ gibber_ll_transport_open_sockaddr (GibberLLTransport *transport,
goto failed;
}
- gibber_fd_transport_set_fd (GIBBER_FD_TRANSPORT (transport), fd);
+ gibber_fd_transport_set_fd (GIBBER_FD_TRANSPORT (transport), fd, TRUE);
return TRUE;
failed:
diff --git a/lib/gibber/gibber-listener.c b/lib/gibber/gibber-listener.c
index 964dca34..40d4610d 100644
--- a/lib/gibber/gibber-listener.c
+++ b/lib/gibber/gibber-listener.c
@@ -206,7 +206,7 @@ listener_io_in_cb (GIOChannel *source,
#endif
{
transport = g_object_new (GIBBER_TYPE_FD_TRANSPORT, NULL);
- gibber_fd_transport_set_fd (transport, nfd);
+ gibber_fd_transport_set_fd (transport, nfd, TRUE);
ret = getnameinfo ((struct sockaddr *) &addr, addrlen,
host, NI_MAXHOST, port, NI_MAXSERV,
diff --git a/lib/gibber/gibber-tcp-transport.c b/lib/gibber/gibber-tcp-transport.c
index 53ca02b7..efe2fc8a 100644
--- a/lib/gibber/gibber-tcp-transport.c
+++ b/lib/gibber/gibber-tcp-transport.c
@@ -176,7 +176,7 @@ try_to_connect (GibberTCPTransport *self)
DEBUG ("connect succeeded");
clean_all_connect_attempts (self);
- gibber_fd_transport_set_fd (GIBBER_FD_TRANSPORT (self), fd);
+ gibber_fd_transport_set_fd (GIBBER_FD_TRANSPORT (self), fd, TRUE);
return FALSE;
}
diff --git a/lib/gibber/gibber-unix-transport.c b/lib/gibber/gibber-unix-transport.c
index 3be56bac..884bac6d 100644
--- a/lib/gibber/gibber-unix-transport.c
+++ b/lib/gibber/gibber-unix-transport.c
@@ -177,7 +177,7 @@ gibber_unix_transport_connect (GibberUnixTransport *transport,
}
DEBUG ("Connected to socket");
- gibber_fd_transport_set_fd (GIBBER_FD_TRANSPORT (transport), fd);
+ gibber_fd_transport_set_fd (GIBBER_FD_TRANSPORT (transport), fd, TRUE);
return TRUE;
@@ -196,7 +196,7 @@ gibber_unix_transport_new_from_fd (int fd)
GibberUnixTransport *transport;
transport = gibber_unix_transport_new ();
- gibber_fd_transport_set_fd (GIBBER_FD_TRANSPORT (transport), fd);
+ gibber_fd_transport_set_fd (GIBBER_FD_TRANSPORT (transport), fd, TRUE);
return transport;
}