# HG changeset patch # User Mikael Hallendal # Date 1181491418 -7200 # Node ID 730617b8c6823cc22f156a6c0fcafb414e0def51 # Parent ebfc8419758d3585db18a9673bc586d1b7cfb99a Added support for Gossip filetransfer patch. Added lm_connection_get_full_jid and lm_connection_get_client_host. diff -r ebfc8419758d -r 730617b8c682 loudmouth/lm-connection.c --- a/loudmouth/lm-connection.c Sun Apr 29 22:09:44 2007 +0200 +++ b/loudmouth/lm-connection.c Sun Jun 10 18:03:38 2007 +0200 @@ -54,6 +54,7 @@ GMainContext *context; gchar *server; gchar *jid; + gchar *resource; guint port; LmSSL *ssl; @@ -210,6 +211,7 @@ g_free (connection->server); g_free (connection->jid); g_free (connection->stream_id); + g_free (connection->resource); if (connection->parser) { lm_parser_free (connection->parser); @@ -1617,6 +1619,7 @@ connection->context = NULL; connection->port = LM_CONNECTION_DEFAULT_PORT; connection->jid = NULL; + connection->resource = NULL; connection->ssl = NULL; connection->proxy = NULL; connection->disconnect_cb = NULL; @@ -1863,6 +1866,8 @@ data->password = g_strdup (password); data->resource = g_strdup (resource); + /* assume that this is our visible resource. */ + connection->resource = g_strdup (resource); handler = lm_message_handler_new (connection_auth_req_reply, data, (GDestroyNotify) auth_req_data_free); @@ -2075,6 +2080,23 @@ } /** + * lm_connection_get_full_jid: + * @connection: an #LmConnection + * + * Creates a full jid for @connection out of the connection jid and the + * resource used for authentication. + * + * Return value: A newly created string representing the full jid. + **/ +gchar * +lm_connection_get_full_jid (LmConnection *connection) +{ + g_return_val_if_fail (connection != NULL, NULL); + + return g_strconcat(connection->jid, "/", connection->resource, NULL); +} + +/** * lm_connection_set_jid: * @connection: an #LmConnection * @jid: JID to be used for @connection @@ -2483,6 +2505,21 @@ return connection_send (connection, str, -1, error); } + +/** + * lm_connection_get_client_host: + * @connection: An #LmConnection + * + * Returns the local host name of the connection. + * + * Return value: A newly allocated string representing the local host name. + **/ +gchar * +lm_connection_get_local_host (LmConnection *connection) +{ + return _lm_sock_get_local_host (connection->fd); +} + /** * lm_connection_get_state: * @connection: Connection to get state on diff -r ebfc8419758d -r 730617b8c682 loudmouth/lm-connection.h --- a/loudmouth/lm-connection.h Sun Apr 29 22:09:44 2007 +0200 +++ b/loudmouth/lm-connection.h Sun Jun 10 18:03:38 2007 +0200 @@ -118,7 +118,7 @@ void lm_connection_set_jid (LmConnection *connection, const gchar *jid); const gchar * lm_connection_get_jid (LmConnection *connection); - +gchar * lm_connection_get_full_jid (LmConnection *connection); guint lm_connection_get_port (LmConnection *connection); void lm_connection_set_port (LmConnection *connection, guint port); @@ -159,6 +159,7 @@ const gchar *str, GError **error); LmConnectionState lm_connection_get_state (LmConnection *connection); +gchar * lm_connection_get_local_host (LmConnection *connection); LmConnection* lm_connection_ref (LmConnection *connection); void lm_connection_unref (LmConnection *connection); diff -r ebfc8419758d -r 730617b8c682 loudmouth/lm-internals.h --- a/loudmouth/lm-internals.h Sun Apr 29 22:09:44 2007 +0200 +++ b/loudmouth/lm-internals.h Sun Jun 10 18:03:38 2007 +0200 @@ -94,6 +94,7 @@ int _lm_sock_connect (LmSocket sock, const struct sockaddr *name, int namelen); +gchar * _lm_sock_get_local_host (LmSocket socket); gboolean _lm_sock_is_blocking_error (int err); gboolean _lm_sock_is_blocking_success (int err); int _lm_sock_get_last_error (void); diff -r ebfc8419758d -r 730617b8c682 loudmouth/lm-sock.c --- a/loudmouth/lm-sock.c Sun Apr 29 22:09:44 2007 +0200 +++ b/loudmouth/lm-sock.c Sun Jun 10 18:03:38 2007 +0200 @@ -28,6 +28,7 @@ #include #include #include +#include #include #define LM_SHUTDOWN SHUT_RDWR @@ -43,6 +44,8 @@ #include "lm-sock.h" #include "lm-debug.h" +#define IPV6_MAX_ADDRESS_LEN 46 /* 45 + '\0' */ + static gboolean initialised = FALSE; gboolean @@ -161,6 +164,40 @@ return connect (sock, name, namelen); } +gchar * +_lm_sock_get_local_host (LmSocket sock) +{ + struct sockaddr addr_info; + void *sock_addr; + socklen_t namelen; + char addrbuf[IPV6_MAX_ADDRESS_LEN]; + const char *host; + + namelen = sizeof (struct sockaddr); + if (getsockname (sock, &addr_info, &namelen)) { + return NULL; + } + + switch (addr_info.sa_family) { + case AF_INET: + + sock_addr = & (((struct sockaddr_in *) &addr_info)->sin_addr); + break; + case AF_INET6: + sock_addr = & (((struct sockaddr_in6 *) &addr_info)->sin6_addr); + break; + default: + return NULL; + } + /* inet_ntoa has been obsoleted in favour of inet_ntop */ + host = inet_ntop (addr_info.sa_family, + sock_addr, + addrbuf, + IPV6_MAX_ADDRESS_LEN); + + return g_strdup (host); +} + gboolean _lm_sock_is_blocking_error (int err) {