Added support for Gossip filetransfer patch.
Added lm_connection_get_full_jid and lm_connection_get_client_host.
--- 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
--- 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);
--- 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);
--- 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 <string.h>
#include <unistd.h>
#include <sys/socket.h>
+#include <arpa/inet.h>
#include <fcntl.h>
#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)
{