diff options
author | Sjoerd Simons <sjoerd@luon.net> | 2006-11-07 14:57:26 +0000 |
---|---|---|
committer | Sjoerd Simons <sjoerd@luon.net> | 2006-11-07 14:57:26 +0000 |
commit | 34388a4e3754669aa82a3d91e1ba0d08490137bd (patch) | |
tree | fdfa8d56203f03f0d518ee47e8daace98992070a | |
parent | 472e80b86e23264b661d51cc1d8290df921fb2f8 (diff) | |
download | telepathy-salut-34388a4e3754669aa82a3d91e1ba0d08490137bd.tar.gz |
[project @ ec090eaec6dcbf116761758af039e8622870d81a]
* Also close the connection's fd if dispose is being run before setting
up the channel
* Let get_address normalize an ipv4 in ipv6 address to a normal ipv4 address
20061107145726-93b9a-8a35b7082485e98fa76655729c2a1c005c38fe80.gz
-rw-r--r-- | src/salut-lm-connection.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/src/salut-lm-connection.c b/src/salut-lm-connection.c index 4037ed43..794621ea 100644 --- a/src/salut-lm-connection.c +++ b/src/salut-lm-connection.c @@ -170,7 +170,8 @@ static void _do_disconnect(SalutLmConnection *self) { SalutLmConnectionPrivate *priv = SALUT_LM_CONNECTION_GET_PRIVATE (self); - priv->fd = -1; + DEBUG("Closing the connection"); + if (priv->channel != NULL) { g_source_remove(priv->watch_in); if (priv->watch_out) @@ -179,7 +180,10 @@ _do_disconnect(SalutLmConnection *self) { g_io_channel_shutdown(priv->channel, FALSE, NULL); g_io_channel_unref(priv->channel); priv->channel = NULL; + } else { + close(priv->fd); } + priv->fd = -1; if (priv->output_buffer) { g_string_free(priv->output_buffer, TRUE); @@ -493,10 +497,19 @@ salut_lm_connection_get_address(SalutLmConnection *connection, struct sockaddr_storage *addr, socklen_t *len) { SalutLmConnectionPrivate *priv = SALUT_LM_CONNECTION_GET_PRIVATE (connection); + gboolean success = FALSE; + struct sockaddr_in *s4 = (struct sockaddr_in*) addr; + struct sockaddr_in6 *s6 = (struct sockaddr_in6*) addr; g_assert(priv->fd >= 0); g_assert(*len == sizeof(struct sockaddr_storage)); - return (getpeername(priv->fd, (struct sockaddr *) addr, len) == 0); + success = (getpeername(priv->fd, (struct sockaddr *) addr, len) == 0); + if (s6->sin6_family == AF_INET6 && IN6_IS_ADDR_V4MAPPED(&(s6->sin6_addr))) { + /* Normalize to ipv4 address */ + s4->sin_family = AF_INET; + s4->sin_addr.s_addr = s6->sin6_addr.s6_addr32[3]; + } + return success; } void |