diff options
author | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2010-05-07 15:49:00 +0100 |
---|---|---|
committer | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2010-05-07 16:04:56 +0100 |
commit | 68ee3ccf3cae7c3054b6f972632bc89beadfdcf1 (patch) | |
tree | 4cdc199df146fad3d843ba460c4a14bc0fc335c1 /lib | |
parent | 50d6f3d9a86d6512ce6e1b558827b82888cdffad (diff) | |
download | telepathy-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.c | 19 | ||||
-rw-r--r-- | lib/gibber/gibber-fd-transport.h | 3 | ||||
-rw-r--r-- | lib/gibber/gibber-linklocal-transport.c | 4 | ||||
-rw-r--r-- | lib/gibber/gibber-listener.c | 2 | ||||
-rw-r--r-- | lib/gibber/gibber-tcp-transport.c | 2 | ||||
-rw-r--r-- | lib/gibber/gibber-unix-transport.c | 4 |
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; } |