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.
--- 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;
}