asserts
[oweals/gnunet.git] / src / util / resolver_api.c
index 812cdc84eda0eb4a0f79243793f61a82a74d237b..94844289e261c2141cca2a199671ec1ca6144a37 100644 (file)
@@ -25,6 +25,7 @@
  */
 #include "platform.h"
 #include "gnunet_getopt_lib.h"
+#include "gnunet_os_lib.h"
 #include "gnunet_client_lib.h"
 #include "gnunet_protocols.h"
 #include "gnunet_resolver_service.h"
@@ -228,9 +229,10 @@ handle_address_response (void *cls, const struct GNUNET_MessageHeader *msg)
   if (msg == NULL)
     {
       GNUNET_log (GNUNET_ERROR_TYPE_INFO,
-                  _("Timeout trying to resolve hostname.\n"));
+                  _("Timeout trying to resolve hostname `%s'.\n"),
+                 rh->hostname);
       rh->addr_callback (rh->cls, NULL, 0);
-      GNUNET_CLIENT_disconnect (rh->client);
+      GNUNET_CLIENT_disconnect (rh->client, GNUNET_NO);
       GNUNET_free (rh);
       return;
     }
@@ -238,7 +240,7 @@ handle_address_response (void *cls, const struct GNUNET_MessageHeader *msg)
     {
       GNUNET_break (0);
       rh->addr_callback (rh->cls, NULL, 0);
-      GNUNET_CLIENT_disconnect (rh->client);
+      GNUNET_CLIENT_disconnect (rh->client, GNUNET_NO);
       GNUNET_free (rh);
       return;
     }
@@ -248,10 +250,11 @@ handle_address_response (void *cls, const struct GNUNET_MessageHeader *msg)
     {
 #if DEBUG_RESOLVER
       GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                  _("Received end message resolving hostname.\n"));
+                  _("Received end message resolving hostname `%s'.\n"),
+                 rh->hostname);
 #endif
       rh->addr_callback (rh->cls, NULL, 0);
-      GNUNET_CLIENT_disconnect (rh->client);
+      GNUNET_CLIENT_disconnect (rh->client, GNUNET_NO);
       GNUNET_free (rh);
       return;
     }
@@ -261,14 +264,16 @@ handle_address_response (void *cls, const struct GNUNET_MessageHeader *msg)
     {
       GNUNET_break (0);
       rh->addr_callback (rh->cls, NULL, 0);
-      GNUNET_CLIENT_disconnect (rh->client);
+      GNUNET_CLIENT_disconnect (rh->client, GNUNET_NO);
       GNUNET_free (rh);
       return;
     }
 #if DEBUG_RESOLVER
   {
     char *ips = no_resolve (sa, salen);
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Resolver returns `%s'.\n", ips);
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+               "Resolver returns `%s' for `%s'.\n", ips,
+               rh->hostname);
     GNUNET_free (ips);
   }
 #endif
@@ -441,9 +446,8 @@ GNUNET_RESOLVER_ip_get (struct GNUNET_SCHEDULER_Handle *sched,
                         &v6)) &&
        ((domain == AF_INET6) || (domain == AF_UNSPEC))))
     {
-      rh->task = GNUNET_SCHEDULER_add_delayed (sched,
-                                               GNUNET_TIME_UNIT_ZERO,
-                                               &numeric_resolution, rh);
+      rh->task = GNUNET_SCHEDULER_add_now (sched,
+                                          &numeric_resolution, rh);
       return rh;
     }
   /* then, check if this is a loopback address */
@@ -451,9 +455,8 @@ GNUNET_RESOLVER_ip_get (struct GNUNET_SCHEDULER_Handle *sched,
   while (loopback[i] != NULL)
     if (0 == strcasecmp (loopback[i++], hostname))
       {
-        rh->task = GNUNET_SCHEDULER_add_delayed (sched,
-                                                 GNUNET_TIME_UNIT_ZERO,
-                                                 &loopback_resolution, rh);
+        rh->task = GNUNET_SCHEDULER_add_now (sched,
+                                            &loopback_resolution, rh);
         return rh;
       }
 
@@ -486,7 +489,7 @@ GNUNET_RESOLVER_ip_get (struct GNUNET_SCHEDULER_Handle *sched,
                                                &handle_address_response, rh))
     {
       GNUNET_free (rh);
-      GNUNET_CLIENT_disconnect (client);
+      GNUNET_CLIENT_disconnect (client, GNUNET_NO);
       return NULL;
     }
   return rh;
@@ -509,9 +512,10 @@ handle_hostname_response (void *cls, const struct GNUNET_MessageHeader *msg)
   if (msg == NULL)
     {
       GNUNET_log (GNUNET_ERROR_TYPE_INFO,
-                  _("Timeout trying to resolve IP address.\n"));
+                  _("Timeout trying to resolve IP address `%s'.\n"),
+                 GNUNET_a2s ((const void*) &rh[1], rh->salen));
       rh->name_callback (rh->cls, NULL);
-      GNUNET_CLIENT_disconnect (rh->client);
+      GNUNET_CLIENT_disconnect (rh->client, GNUNET_NO);
       GNUNET_free (rh);
       return;
     }
@@ -520,10 +524,11 @@ handle_hostname_response (void *cls, const struct GNUNET_MessageHeader *msg)
     {
 #if DEBUG_RESOLVER
       GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                  _("Received end message resolving IP address.\n"));
+                  _("Received end message resolving IP address `%s'.\n"),
+                 GNUNET_a2s ((const void*) &rh[1], rh->salen));
 #endif
       rh->name_callback (rh->cls, NULL);
-      GNUNET_CLIENT_disconnect (rh->client);
+      GNUNET_CLIENT_disconnect (rh->client, GNUNET_NO);
       GNUNET_free (rh);
       return;
     }
@@ -532,13 +537,15 @@ handle_hostname_response (void *cls, const struct GNUNET_MessageHeader *msg)
     {
       GNUNET_break (0);
       rh->name_callback (rh->cls, NULL);
-      GNUNET_CLIENT_disconnect (rh->client);
+      GNUNET_CLIENT_disconnect (rh->client, GNUNET_NO);
       GNUNET_free (rh);
       return;
     }
 #if DEBUG_RESOLVER
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              _("Resolver returns `%s'.\n"), hostname);
+              _("Resolver returns `%s' for IP `%s'.\n"), 
+             hostname,
+             GNUNET_a2s ((const void*) &rh[1], rh->salen));
 #endif
   rh->name_callback (rh->cls, hostname);
   GNUNET_CLIENT_receive (rh->client,
@@ -616,9 +623,8 @@ GNUNET_RESOLVER_hostname_get (struct GNUNET_SCHEDULER_Handle *sched,
 
   if (GNUNET_NO == do_resolve)
     {
-      rh->task = GNUNET_SCHEDULER_add_delayed (sched,
-                                               GNUNET_TIME_UNIT_ZERO,
-                                               &numeric_reverse, rh);
+      rh->task = GNUNET_SCHEDULER_add_now (sched,
+                                          &numeric_reverse, rh);
       return rh;
     }
   if (salen + sizeof (struct GNUNET_RESOLVER_GetMessage) >
@@ -654,7 +660,7 @@ GNUNET_RESOLVER_hostname_get (struct GNUNET_SCHEDULER_Handle *sched,
                                                GNUNET_YES,
                                                &handle_hostname_response, rh))
     {
-      GNUNET_CLIENT_disconnect (client);
+      GNUNET_CLIENT_disconnect (client, GNUNET_NO);
       GNUNET_free (rh);
       return NULL;
     }
@@ -663,7 +669,39 @@ GNUNET_RESOLVER_hostname_get (struct GNUNET_SCHEDULER_Handle *sched,
 
 
 /**
- * Perform a reverse DNS lookup.
+ * Get local fully qualified domain name
+ * @return fqdn
+ */
+char *
+GNUNET_RESOLVER_local_fqdn_get ( void )
+{
+  struct hostent *host;
+  char hostname[GNUNET_OS_get_hostname_max_length() + 1];
+
+
+  if (0 != gethostname (hostname, sizeof (hostname) - 1))
+    {
+      GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR |
+                           GNUNET_ERROR_TYPE_BULK, "gethostname");
+      return NULL;
+    }
+#if DEBUG_RESOLVER
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              _("Resolving our FQDN `%s'\n"), hostname);
+#endif
+  host = gethostbyname ( hostname );
+  if ( NULL == host)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                _("Could not resolve our FQDN : %s\n"),
+                hstrerror (h_errno));
+    return NULL;
+  }
+  return GNUNET_strdup (host->h_name);
+}
+
+/**
+ * Looking our own hostname.
  *
  * @param sched scheduler to use
  * @param cfg configuration to use
@@ -681,7 +719,7 @@ GNUNET_RESOLVER_hostname_resolve (struct GNUNET_SCHEDULER_Handle *sched,
                                   GNUNET_RESOLVER_AddressCallback callback,
                                   void *cls)
 {
-  char hostname[MAX_HOSTNAME];
+  char hostname[GNUNET_OS_get_hostname_max_length() + 1];
 
   check_config (cfg);
   if (0 != gethostname (hostname, sizeof (hostname) - 1))
@@ -712,7 +750,7 @@ void
 GNUNET_RESOLVER_request_cancel (struct GNUNET_RESOLVER_RequestHandle *h)
 {
   if (h->client != NULL)
-    GNUNET_CLIENT_disconnect (h->client);
+    GNUNET_CLIENT_disconnect (h->client, GNUNET_NO);
   if (h->task != GNUNET_SCHEDULER_NO_TASK)
     GNUNET_SCHEDULER_cancel (h->sched, h->task);
   GNUNET_free (h);