summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSjoerd Simons <sjoerd@luon.net>2006-11-07 14:57:26 +0000
committerSjoerd Simons <sjoerd@luon.net>2006-11-07 14:57:26 +0000
commit34388a4e3754669aa82a3d91e1ba0d08490137bd (patch)
treefdfa8d56203f03f0d518ee47e8daace98992070a
parent472e80b86e23264b661d51cc1d8290df921fb2f8 (diff)
downloadtelepathy-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.c17
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