[Telepathy-commits] [telepathy-gabble/master] GabbleJingleFactory: Resolve STUN server hostname to address

Simon McVittie simon.mcvittie at collabora.co.uk
Wed Feb 25 11:08:42 PST 2009


Based on code from Sjoerd Simons.
---
 src/jingle-factory.c |   81 +++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 77 insertions(+), 4 deletions(-)

diff --git a/src/jingle-factory.c b/src/jingle-factory.c
index 18c1804..dc4e1f3 100644
--- a/src/jingle-factory.c
+++ b/src/jingle-factory.c
@@ -25,6 +25,7 @@
 #include <string.h>
 #include <glib.h>
 
+#include <lib/gibber/gibber-resolver.h>
 #include <loudmouth/loudmouth.h>
 
 #define DEBUG_FLAG GABBLE_DEBUG_MEDIA
@@ -64,6 +65,7 @@ struct _GabbleJingleFactoryPrivate
   GHashTable *content_types;
   GHashTable *transports;
   GHashTable *sessions;
+  GibberResolver *resolver;
 
   gchar *stun_server;
   guint16 stun_port;
@@ -106,6 +108,67 @@ gabble_jingle_factory_init (GabbleJingleFactory *obj)
 
   priv->conn = NULL;
   priv->dispose_has_run = FALSE;
+  priv->resolver = gibber_resolver_get_resolver ();
+}
+
+typedef struct {
+    gchar *stun_server;
+    guint16 stun_port;
+} PendingStunServer;
+
+static void
+pending_stun_server_free (gpointer p)
+{
+  PendingStunServer *data = p;
+
+  g_free (data->stun_server);
+  g_slice_free (PendingStunServer, p);
+}
+
+static void
+stun_server_resolved_cb (GibberResolver *resolver,
+                         GList *entries,
+                         GError *error,
+                         gpointer user_data,
+                         GObject *object)
+{
+  GabbleJingleFactory *self = GABBLE_JINGLE_FACTORY (object);
+  PendingStunServer *data = user_data;
+  GibberResolverAddrInfo *info;
+  GError *e = NULL;
+  gchar *stun_server;
+
+  if (error != NULL)
+    {
+      DEBUG ("Failed to resolve STUN server %s:%u: %s",
+          data->stun_server, data->stun_port, error->message);
+      return;
+    }
+
+  if (entries == NULL)
+    {
+      DEBUG ("No results for STUN server %s:%u",
+          data->stun_server, data->stun_port);
+      return;
+    }
+
+  info = entries->data;
+
+  if (!gibber_resolver_sockaddr_to_str ((struct sockaddr *) &(info->sockaddr),
+        info->sockaddr_len, &stun_server, NULL, &e))
+    {
+      DEBUG ("Couldn't convert resolved address of %s to string: %s",
+          data->stun_server, e->message);
+      g_error_free (e);
+      return;
+    }
+
+  DEBUG ("Resolved STUN server %s:%u to %s:%u", data->stun_server,
+      data->stun_port, stun_server, data->stun_port);
+
+  g_free (self->priv->stun_server);
+  self->priv->stun_server = stun_server;
+  self->priv->stun_port = data->stun_port;
 }
 
 static void
@@ -113,9 +176,19 @@ take_stun_server (GabbleJingleFactory *self,
                   gchar *stun_server,
                   guint16 stun_port)
 {
-  g_free (self->priv->stun_server);
-  self->priv->stun_server = stun_server;
-  self->priv->stun_port = stun_port;
+  PendingStunServer *data = g_slice_new0 (PendingStunServer);
+
+  if (stun_server == NULL)
+    return;
+
+  DEBUG ("Resolving STUN server %s:%u", stun_server, stun_port);
+  data->stun_server = stun_server;
+  data->stun_port = stun_port;
+
+  gibber_resolver_addrinfo (self->priv->resolver, stun_server, NULL,
+      AF_INET, SOCK_DGRAM, IPPROTO_UDP, 0,
+      stun_server_resolved_cb, data, pending_stun_server_free,
+      G_OBJECT (self));
 }
 
 /*
@@ -191,7 +264,7 @@ jingle_info_cb (LmMessageHandler *handler,
             {
               DEBUG ("jingle info: got stun server %s, port %u", server,
                   port);
-              take_stun_server (fac, server, port);
+              take_stun_server (fac, g_strdup (server), port);
             }
         }
     }
-- 
1.5.6.5




More information about the telepathy-commits mailing list