Improved the resolvers a bit.
authorMikael Hallendal <micke@imendio.com>
Sat, 25 Oct 2008 20:09:25 +0200
changeset 547 692c7753f64e
parent 546 590cf5cd6ea1
child 548 60c1d6cbde10
Improved the resolvers a bit. LmOldSocket currently creates a new resolver when doing a host lookup after a successful srv lookup.
loudmouth/lm-asyncns-resolver.c
loudmouth/lm-blocking-resolver.c
loudmouth/lm-old-socket.c
loudmouth/lm-resolver.c
loudmouth/lm-resolver.h
--- a/loudmouth/lm-asyncns-resolver.c	Sat Oct 25 16:37:41 2008 +0200
+++ b/loudmouth/lm-asyncns-resolver.c	Sat Oct 25 20:09:25 2008 +0200
@@ -229,7 +229,7 @@
 {
     LmAsyncnsResolverPriv *priv = GET_PRIV (resolver);
     unsigned char         *srv_ans;
-    int                srv_len;
+    int                    srv_len;
     gboolean               result = FALSE;
 
     g_print ("srv_done callback\n");
@@ -266,9 +266,11 @@
     }
 
     asyncns_resolver_cleanup (resolver);
-
+    
     if (result == TRUE) {
-        asyncns_resolver_lookup_host (resolver);
+        g_object_ref (resolver);
+        _lm_resolver_set_result (LM_RESOLVER (resolver), LM_RESOLVER_RESULT_OK, NULL);
+        g_object_unref (resolver);
     }
 }
 
@@ -281,7 +283,6 @@
     gchar                 *protocol;
     gchar                 *srv;
 
-
     g_object_get (resolver,
                   "domain", &domain,
                   "service", &service,
@@ -290,7 +291,7 @@
         
     srv = _lm_resolver_create_srv_string (domain, service, protocol);
         
-    g_print ("Looking up service: %s %s %s\n[%s]", domain, service, protocol, srv);
+    g_print ("ASYNCNS: Looking up service: %s %s %s\n[%s]", domain, service, protocol, srv);
 
     if (!asyncns_resolver_prep (resolver, /* Use GError? */ NULL)) {
         g_warning ("Failed to initiate the asyncns library");
--- a/loudmouth/lm-blocking-resolver.c	Sat Oct 25 16:37:41 2008 +0200
+++ b/loudmouth/lm-blocking-resolver.c	Sat Oct 25 20:09:25 2008 +0200
@@ -110,6 +110,10 @@
     if (err != 0) {
         /* FIXME: Report error */
         g_print ("ERROR: %d in %s\n", err, G_STRFUNC);
+        
+        _lm_resolver_set_result (LM_RESOLVER (resolver), LM_RESOLVER_RESULT_FAILED,
+                                 NULL);
+        
         return;
     }
 
@@ -117,6 +121,11 @@
         /* Couldn't find any results */
         /* FIXME: Report no results  */
         g_print ("No results in %s\n", G_STRFUNC);
+        
+        _lm_resolver_set_result (LM_RESOLVER (resolver), LM_RESOLVER_RESULT_FAILED,
+                                 NULL);
+
+        return;
     }
 
     /* FIXME: How to set and iterate the results */
@@ -173,8 +182,12 @@
                   "port", new_port,
                   NULL);
 
+    g_object_ref (resolver);
+    _lm_resolver_set_result (LM_RESOLVER (resolver), LM_RESOLVER_RESULT_OK, NULL);
+    g_object_unref (resolver);
+
     /* Lookup the new server and the new port */
-    blocking_resolver_lookup_host (resolver);
+   /* blocking_resolver_lookup_host (resolver); */
 
     g_free (new_server);
     g_free (srv);
--- a/loudmouth/lm-old-socket.c	Sat Oct 25 16:37:41 2008 +0200
+++ b/loudmouth/lm-old-socket.c	Sat Oct 25 20:09:25 2008 +0200
@@ -49,11 +49,6 @@
 #include "lm-sock.h"
 #include "lm-old-socket.h"
 
-#ifdef HAVE_ASYNCNS
-#include <asyncns.h>
-#define freeaddrinfo(x) asyncns_freeaddrinfo(x)
-#endif
-
 #define IN_BUFFER_SIZE 1024
 #define SRV_LEN 8192
 
@@ -93,13 +88,6 @@
     guint              ref_count;
 
     LmResolver        *resolver;
-
-#ifdef HAVE_ASYNCNS
-    GSource           *watch_resolv;
-    asyncns_query_t   *resolv_query;
-    asyncns_t         *asyncns_ctx;
-    GIOChannel        *resolv_channel;
-#endif
 }; 
 
 static void         socket_free                    (LmOldSocket    *socket);
@@ -764,6 +752,32 @@
     _lm_sock_close (fd);
 }
 
+static void
+old_socket_resolver_host_cb (LmResolver       *resolver,
+                             LmResolverResult  result,
+                             gpointer          user_data)
+{
+    LmOldSocket *socket = (LmOldSocket *) user_data;
+
+    if (result != LM_RESOLVER_RESULT_OK) {
+        lm_verbose ("error while resolving, bailing out\n");
+        if (socket->connect_func) {
+            (socket->connect_func) (socket, FALSE, socket->user_data);
+        }
+        g_object_unref (socket->resolver);
+        socket->resolver = NULL;
+        g_free (socket->connect_data);
+        socket->connect_data = NULL;
+
+        return;
+    }
+
+    socket->connect_data->current_addr = 
+        lm_resolver_results_get_next (resolver);
+
+    socket_do_connect (socket->connect_data);
+}
+
 /* FIXME: Need to have a way to only get srv reply and then decide if the 
  *        resolver should continue to look the host up. 
  *
@@ -791,40 +805,17 @@
     } else {
         remote_addr = socket->server;
     }
+    
+    g_object_unref (socket->resolver);
+    
+    socket->resolver = 
+            lm_resolver_new_for_host (remote_addr,
+                                      old_socket_resolver_host_cb,
+                                      socket);
        
-    g_object_set (resolver, 
-                  "host", remote_addr, 
-                  "type", LM_RESOLVER_HOST,
-                  NULL);
-       
-    lm_resolver_lookup (resolver);
+    lm_resolver_lookup (socket->resolver);
 }
 
-static void
-old_socket_resolver_host_cb (LmResolver       *resolver,
-                             LmResolverResult  result,
-                             gpointer          user_data)
-{
-    LmOldSocket *socket = (LmOldSocket *) user_data;
-
-    if (result != LM_RESOLVER_RESULT_OK) {
-        lm_verbose ("error while resolving, bailing out\n");
-        if (socket->connect_func) {
-            (socket->connect_func) (socket, FALSE, socket->user_data);
-        }
-        g_object_unref (socket->resolver);
-        socket->resolver = NULL;
-        g_free (socket->connect_data);
-        socket->connect_data = NULL;
-
-        return;
-    }
-
-    socket->connect_data->current_addr = 
-        lm_resolver_results_get_next (resolver);
-
-    socket_do_connect (socket->connect_data);
-}
 
 LmOldSocket *
 lm_old_socket_create (GMainContext      *context,
--- a/loudmouth/lm-resolver.c	Sat Oct 25 16:37:41 2008 +0200
+++ b/loudmouth/lm-resolver.c	Sat Oct 25 20:09:25 2008 +0200
@@ -276,7 +276,7 @@
 {
     LmResolver *resolver;
 
-#if HAVE_ASYNCNS
+#ifdef HAVE_ASYNCNS
     resolver = g_object_new (LM_TYPE_ASYNCNS_RESOLVER, NULL);
 #else
     resolver = g_object_new (LM_TYPE_BLOCKING_RESOLVER, NULL);
@@ -287,6 +287,16 @@
     return resolver;
 }
 
+static GType
+resolver_get_gtype (void)
+{
+#ifdef HAVE_ASYNCNS
+    return LM_TYPE_ASYNCNS_RESOLVER;
+#else
+    return LM_TYPE_BLOCKING_RESOLVER;
+#endif /* HAVE_ASYNCNS */
+}
+
 LmResolver *
 lm_resolver_new_for_host (const gchar        *host,
                           LmResolverCallback  callback,
@@ -298,7 +308,7 @@
     g_return_val_if_fail (host != NULL, NULL);
     g_return_val_if_fail (callback != NULL, NULL);
 
-    resolver =  g_object_new (LM_TYPE_ASYNCNS_RESOLVER,
+    resolver =  g_object_new (resolver_get_gtype (),
                               "type", LM_RESOLVER_HOST,
                               "host", host,
                               NULL);
@@ -326,7 +336,7 @@
     g_return_val_if_fail (protocol != NULL, NULL);
     g_return_val_if_fail (callback != NULL, NULL);
 
-    resolver = g_object_new (LM_TYPE_ASYNCNS_RESOLVER, 
+    resolver = g_object_new (resolver_get_gtype (),
                              "type", LM_RESOLVER_SRV,
                              "domain", domain,
                              "service", service,
@@ -352,14 +362,6 @@
 }
 
 void
-lm_resolver_lookup_host (LmResolver *resolver, const gchar *host)
-{}
-
-void
-lm_resolver_lookup_srv (LmResolver *resolver, const gchar *srv)
-{}
-
-void
 lm_resolver_cancel (LmResolver *resolver)
 {
     if (!LM_RESOLVER_GET_CLASS(resolver)->cancel) {
--- a/loudmouth/lm-resolver.h	Sat Oct 25 16:37:41 2008 +0200
+++ b/loudmouth/lm-resolver.h	Sat Oct 25 20:09:25 2008 +0200
@@ -65,13 +65,6 @@
 GType             lm_resolver_get_type          (void);
 LmResolver *      lm_resolver_new               (GMainContext       *context);
 
-
-void              lm_resolver_lookup_host       (LmResolver         *resolver,
-                                                 const gchar        *host);
-void              lm_resolver_lookup_srv        (LmResolver         *resolver,
-                                                 const gchar        *srv);
-
-
 LmResolver *      lm_resolver_new_for_host      (const gchar        *host,
                                                  LmResolverCallback  callback,
                                                  gpointer            user_data);