The blocking dns resolver now works as expected.
authorMikael Hallendal <micke@imendio.com>
Thu, 17 Jul 2008 14:29:19 +0200
changeset 467 943afa7cfac5
parent 466 220e3fb83034
child 470 6b001fde3e85
The blocking dns resolver now works as expected. Fixed up the last bits and and use the blocking dns lookup in the simple test. Next step will be to make a second one that uses asyncns to do the job.
loudmouth/lm-blocking-resolver.c
loudmouth/lm-resolver.c
loudmouth/lm-resolver.h
loudmouth/loudmouth.sym
loudmouth/test-dns-blocking.c
--- a/loudmouth/lm-blocking-resolver.c	Thu Jul 17 00:36:48 2008 +0200
+++ b/loudmouth/lm-blocking-resolver.c	Thu Jul 17 14:29:19 2008 +0200
@@ -125,6 +125,9 @@
 
         g_print ("Found result for %s\n", host);
 
+        _lm_resolver_set_result (LM_RESOLVER (resolver), LM_RESOLVER_RESULT_OK,
+                                 ans);
+
         g_free (host);
 }
 
--- a/loudmouth/lm-resolver.c	Thu Jul 17 00:36:48 2008 +0200
+++ b/loudmouth/lm-resolver.c	Thu Jul 17 14:29:19 2008 +0200
@@ -20,6 +20,7 @@
 
 #include <config.h>
 
+#include "lm-blocking-resolver.h"
 #include "lm-internals.h"
 #include "lm-marshal.h"
 #include "lm-resolver.h"
@@ -42,6 +43,11 @@
         gchar              *domain;
         gchar              *service;
         gchar              *protocol;
+
+        /* The results */
+        LmResolverResult    result;
+        struct addrinfo    *results;
+        struct addrinfo    *current_result;
 };
 
 static void     resolver_finalize            (GObject           *object);
@@ -255,13 +261,23 @@
                           LmResolverCallback  callback,
                           gpointer            user_data)
 {
+        LmResolver     *resolver;
+        LmResolverPriv *priv;
+
         g_return_val_if_fail (host != NULL, NULL);
         g_return_val_if_fail (callback != NULL, NULL);
 
-        return g_object_new (LM_TYPE_RESOLVER,
-                             "type", LM_RESOLVER_HOST,
-                             "host", host,
-                             NULL);
+        resolver =  g_object_new (LM_TYPE_BLOCKING_RESOLVER,
+                                  "type", LM_RESOLVER_HOST,
+                                  "host", host,
+                                  NULL);
+
+        priv = GET_PRIV (resolver);
+
+        priv->callback = callback;
+        priv->user_data = user_data;
+
+        return resolver;
 }
 
 LmResolver *
@@ -271,17 +287,27 @@
                              LmResolverCallback  callback,
                              gpointer            user_data)
 {
+        LmResolver     *resolver;
+        LmResolverPriv *priv;
+
         g_return_val_if_fail (domain != NULL, NULL);
         g_return_val_if_fail (service != NULL, NULL);
         g_return_val_if_fail (protocol != NULL, NULL);
         g_return_val_if_fail (callback != NULL, NULL);
 
-        return g_object_new (LM_TYPE_RESOLVER, 
-                             "type", LM_RESOLVER_SRV,
-                             "domain", domain,
-                             "service", service,
-                             "protocol", protocol,
-                             NULL);
+        resolver = g_object_new (LM_TYPE_BLOCKING_RESOLVER, 
+                                 "type", LM_RESOLVER_SRV,
+                                 "domain", domain,
+                                 "service", service,
+                                 "protocol", protocol,
+                                 NULL);
+        
+        priv = GET_PRIV (resolver);
+
+        priv->callback = callback;
+        priv->user_data = user_data;
+
+        return resolver;
 }
 
 void
@@ -306,8 +332,8 @@
 
 gchar *
 lm_resolver_create_srv_string (const gchar *domain, 
-                               const gchar *service, 
-                               const gchar *protocol) 
+                               const gchar *service,
+                               const gchar *protocol)
 {
         g_return_val_if_fail (domain != NULL, NULL);
         g_return_val_if_fail (service != NULL, NULL);
@@ -316,3 +342,55 @@
         return g_strdup_printf ("_%s._%s.%s", service, protocol, domain);
 }
 
+/* To iterate through the results */ 
+struct addrinfo *
+lm_resolver_results_get_next (LmResolver *resolver)
+{
+        LmResolverPriv  *priv;
+        struct addrinfo *ret_val;
+
+        g_return_val_if_fail (LM_IS_RESOLVER (resolver), NULL);
+
+        priv = GET_PRIV (resolver);
+
+        if (!priv->current_result) {
+                return NULL;
+        }
+
+        ret_val = priv->current_result;
+        priv->current_result = priv->current_result->ai_next;
+
+        return ret_val;
+}
+
+void
+lm_resolver_results_reset (LmResolver *resolver)
+{
+        LmResolverPriv *priv;
+
+        g_return_if_fail (LM_IS_RESOLVER (resolver));
+
+        priv = GET_PRIV (resolver);
+
+        priv->current_result = priv->results;
+}
+
+void 
+_lm_resolver_set_result (LmResolver       *resolver,
+                         LmResolverResult  result,
+                         struct addrinfo  *results)
+{
+        LmResolverPriv *priv;
+
+        g_return_if_fail (LM_IS_RESOLVER (resolver));
+
+        priv = GET_PRIV (resolver);
+
+        priv->result = result;
+        priv->results = priv->current_result = results;
+
+        g_print ("Calling resolver callback\n");
+
+        priv->callback (resolver, result, priv->user_data);
+}
+
--- a/loudmouth/lm-resolver.h	Thu Jul 17 00:36:48 2008 +0200
+++ b/loudmouth/lm-resolver.h	Thu Jul 17 14:29:19 2008 +0200
@@ -52,23 +52,37 @@
         LM_RESOLVER_SRV
 } LmResolverType;
 
-typedef void (*LmResolverCallback) (LmResolver *resolver,
-                                    gpointer    user_data);
+typedef enum {
+        LM_RESOLVER_RESULT_OK
+} LmResolverResult;
+
+typedef void (*LmResolverCallback) (LmResolver       *resolver,
+                                    LmResolverResult  result,
+                                    gpointer          user_data);
 
-GType          lm_resolver_get_type          (void);
-LmResolver *   lm_resolver_new_for_host      (const gchar        *host,
-                                              LmResolverCallback  callback,
-                                              gpointer            user_data);
-LmResolver *   lm_resolver_new_for_service   (const gchar        *domain,
-                                              const gchar        *service,
-                                              const gchar        *protocol,
-                                              LmResolverCallback  callback,
-                                              gpointer            user_data);
-void           lm_resolver_lookup            (LmResolver         *resolver);
-void           lm_resolver_cancel            (LmResolver         *resolver);
-gchar *        lm_resolver_create_srv_string (const gchar *domain, 
-                                              const gchar *service, 
-                                              const gchar *protocol);
+GType             lm_resolver_get_type          (void);
+LmResolver *      lm_resolver_new_for_host      (const gchar        *host,
+                                                 LmResolverCallback  callback,
+                                                 gpointer            user_data);
+LmResolver *      lm_resolver_new_for_service   (const gchar        *domain,
+                                                 const gchar        *service,
+                                                 const gchar        *protocol,
+                                                 LmResolverCallback  callback,
+                                                 gpointer            user_data);
+void              lm_resolver_lookup            (LmResolver         *resolver);
+void              lm_resolver_cancel            (LmResolver         *resolver);
+gchar *           lm_resolver_create_srv_string (const gchar        *domain, 
+                                                 const gchar        *service,
+                                                 const gchar        *protocol);
+
+/* To iterate through the results */ 
+struct addrinfo * lm_resolver_results_get_next  (LmResolver         *resolver);
+void              lm_resolver_results_reset     (LmResolver         *resolver);
+
+/* Only for sub classes */
+void              _lm_resolver_set_result       (LmResolver         *resolver,
+                                                 LmResolverResult    result,
+                                                 struct addrinfo    *results);
 
 G_END_DECLS
 
--- a/loudmouth/loudmouth.sym	Thu Jul 17 00:36:48 2008 +0200
+++ b/loudmouth/loudmouth.sym	Thu Jul 17 14:29:19 2008 +0200
@@ -77,6 +77,10 @@
 lm_proxy_set_username
 lm_proxy_unref
 lm_resolver_lookup
+lm_resolver_new_for_host
+lm_resolver_new_for_service
+lm_resolver_results_get_next
+lm_resolver_results_reset
 lm_ssl_get_fingerprint
 lm_ssl_get_require_starttls
 lm_ssl_get_use_starttls
--- a/loudmouth/test-dns-blocking.c	Thu Jul 17 00:36:48 2008 +0200
+++ b/loudmouth/test-dns-blocking.c	Thu Jul 17 14:29:19 2008 +0200
@@ -1,33 +1,60 @@
 #include <loudmouth.h>
 #include "lm-blocking-resolver.h"
+        
+GMainLoop *main_loop;
+
+static void
+resolver_result_cb (LmResolver       *resolver,
+                    LmResolverResult  result,
+                    gpointer          user_data)
+{
+        gchar           *host;
+        struct addrinfo *addr;
+
+        g_object_get (resolver, "host", &host, NULL);
+
+        if (result != LM_RESOLVER_RESULT_OK) {
+                g_print ("Failed to lookup %s\n", host);
+                g_free (host);
+                return;
+        }
+
+        g_print ("In %s\n", G_STRFUNC);
+
+        while ((addr = lm_resolver_results_get_next (resolver))) {
+                g_print ("Result!\n");
+        }
+
+        g_free (host);
+
+        g_main_loop_quit (main_loop);
+}
 
 int
 main (int argc, char **argv)
 {
         LmResolver *resolver;
-        GMainLoop  *main_loop;
         LmResolver *srv_resolver;
 
         g_type_init ();
 
-        resolver = g_object_new (LM_TYPE_BLOCKING_RESOLVER,
-                                 "type", LM_RESOLVER_HOST,
-                                 "host", "kenny.imendio.com",
-                                 NULL);
-
+        resolver = lm_resolver_new_for_host ("kenny.imendio.com",
+                                             resolver_result_cb,
+                                             NULL);
         lm_resolver_lookup (resolver);
 
-        srv_resolver = g_object_new (LM_TYPE_BLOCKING_RESOLVER,
-                                     "type", LM_RESOLVER_SRV,
-                                     "domain", "jabber.org",
-                                     "protocol", "tcp",
-                                     "service", "xmpp-client",
-                                     NULL);
+        srv_resolver = lm_resolver_new_for_service ("jabber.org",
+                                                    "xmpp-client", "tcp",
+                                                    resolver_result_cb,
+                                                    NULL);
+        lm_resolver_lookup (srv_resolver);
 
-        lm_resolver_lookup (srv_resolver);
+        g_print ("Running main loop\n");
 
         main_loop = g_main_loop_new (NULL, FALSE);
         g_main_loop_run (main_loop);
 
+        g_print ("Finished\n");
+
         return 0;
 }