WiP
[oweals/gnunet.git] / src / util / resolver_api.c
index c32fc58facf0216089bb20b5f6cc53116f2babc1..7daaaf1ccea47a1e41897f1fb16e58a270cf33f5 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"
@@ -78,11 +79,6 @@ struct GNUNET_RESOLVER_RequestHandle
    */
   struct GNUNET_CLIENT_Connection *client;
 
-  /**
-   * Our scheduler.
-   */
-  struct GNUNET_SCHEDULER_Handle *sched;
-
   /**
    * Name of the host that we are resolving.
    */
@@ -100,7 +96,7 @@ struct GNUNET_RESOLVER_RequestHandle
 
   /**
    * Desired address family.
-   */ 
+   */
   int domain;
 
   /**
@@ -123,35 +119,30 @@ check_config (const struct GNUNET_CONFIGURATION_Handle *cfg)
   struct sockaddr_in v4;
   struct sockaddr_in6 v6;
 
-  memset (&v4, 0, sizeof(v4));
-  v4.sin_addr.s_addr = htonl (INADDR_LOOPBACK);  
+  memset (&v4, 0, sizeof (v4));
+  v4.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
   v4.sin_family = AF_INET;
 #if HAVE_SOCKADDR_IN_SIN_LEN
-  v4.sin_len = sizeof(v4);
+  v4.sin_len = sizeof (v4);
 #endif
-  memset (&v6, 0, sizeof(v6)); 
+  memset (&v6, 0, sizeof (v6));
   v6.sin6_family = AF_INET6;
 #if HAVE_SOCKADDR_IN_SIN_LEN
-  v6.sin6_len = sizeof(v6);
+  v6.sin6_len = sizeof (v6);
 #endif
   if (GNUNET_OK !=
       GNUNET_CONFIGURATION_get_value_string (cfg,
-                                            "resolver",
-                                            "HOSTNAME",
-                                            &hostname))
+                                             "resolver",
+                                             "HOSTNAME", &hostname))
     {
       GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                 _("Must specify `%s' for `%s' in configuration!\n"),
-                 "HOSTNAME",
-                 "resolver");
+                  _("Must specify `%s' for `%s' in configuration!\n"),
+                  "HOSTNAME", "resolver");
       GNUNET_assert (0);
     }
-  if ( (1 != inet_pton (AF_INET,
-                       hostname,
-                       &v4)) ||
-       (1 != inet_pton (AF_INET6,
-                       hostname,
-                       &v6)) )
+  if ((1 != inet_pton (AF_INET,
+                       hostname,
+                       &v4)) || (1 != inet_pton (AF_INET6, hostname, &v6)))
     {
       GNUNET_free (hostname);
       return;
@@ -160,16 +151,15 @@ check_config (const struct GNUNET_CONFIGURATION_Handle *cfg)
   while (loopback[i] != NULL)
     if (0 == strcasecmp (loopback[i++], hostname))
       {
-       GNUNET_free (hostname); 
-       return;
+        GNUNET_free (hostname);
+        return;
       }
   GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-             _("Must specify `%s' or numeric IP address for `%s' of `%s' in configuration!\n"),
-             "localhost",
-             "HOSTNAME",
-             "resolver");
-  GNUNET_free (hostname); 
-  GNUNET_assert (0); 
+              _
+              ("Must specify `%s' or numeric IP address for `%s' of `%s' in configuration!\n"),
+              "localhost", "HOSTNAME", "resolver");
+  GNUNET_free (hostname);
+  GNUNET_assert (0);
 }
 
 
@@ -194,17 +184,27 @@ no_resolve (const struct sockaddr *sa, socklen_t salen)
     case AF_INET:
       if (salen != sizeof (struct sockaddr_in))
         return NULL;
-      inet_ntop (AF_INET,
-                 &((struct sockaddr_in *) sa)->sin_addr,
-                 inet4, INET_ADDRSTRLEN);
+      if (NULL == 
+         inet_ntop (AF_INET,
+                    &((struct sockaddr_in *) sa)->sin_addr,
+                    inet4, INET_ADDRSTRLEN))
+       {
+         GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "inet_ntop");
+         return NULL;
+       }
       ret = GNUNET_strdup (inet4);
       break;
     case AF_INET6:
       if (salen != sizeof (struct sockaddr_in6))
         return NULL;
-      inet_ntop (AF_INET6,
-                 &((struct sockaddr_in6 *) sa)->sin6_addr,
-                 inet6, INET6_ADDRSTRLEN);
+      if (NULL == 
+         inet_ntop (AF_INET6,
+                    &((struct sockaddr_in6 *) sa)->sin6_addr,
+                    inet6, INET6_ADDRSTRLEN))
+       {
+         GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "inet_ntop");
+         return NULL;
+       }
       ret = GNUNET_strdup (inet6);
       break;
     default:
@@ -230,13 +230,13 @@ handle_address_response (void *cls, const struct GNUNET_MessageHeader *msg)
   const struct sockaddr *sa;
   socklen_t salen;
 
-
   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;
     }
@@ -244,7 +244,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;
     }
@@ -254,10 +254,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;
     }
@@ -267,16 +268,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
@@ -297,54 +298,42 @@ handle_address_response (void *cls, const struct GNUNET_MessageHeader *msg)
  * @param tc unused scheduler context
  */
 static void
-numeric_resolution (void *cls,
-                   const struct GNUNET_SCHEDULER_TaskContext *tc)
+numeric_resolution (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
   struct GNUNET_RESOLVER_RequestHandle *rh = cls;
   struct sockaddr_in v4;
   struct sockaddr_in6 v6;
 
-  memset (&v4, 0, sizeof(v4));
+  memset (&v4, 0, sizeof (v4));
   v4.sin_family = AF_INET;
 #if HAVE_SOCKADDR_IN_SIN_LEN
-  v4.sin_len = sizeof(v4);
+  v4.sin_len = sizeof (v4);
 #endif
-  memset (&v6, 0, sizeof(v6)); 
+  memset (&v6, 0, sizeof (v6));
   v6.sin6_family = AF_INET6;
 #if HAVE_SOCKADDR_IN_SIN_LEN
-  v6.sin6_len = sizeof(v6);
+  v6.sin6_len = sizeof (v6);
 #endif
 
-  if ( ( (rh->domain == AF_UNSPEC) || (rh->domain == AF_INET) ) && 
-       (1 == inet_pton (AF_INET,
-                       rh->hostname,
-                       &v4.sin_addr)) )
+  if (((rh->domain == AF_UNSPEC) || (rh->domain == AF_INET)) &&
+      (1 == inet_pton (AF_INET, rh->hostname, &v4.sin_addr)))
     {
-      rh->addr_callback (rh->cls,
-                          (const struct sockaddr*) &v4,
-                          sizeof(v4));
-      if ( (rh->domain == AF_UNSPEC) && 
-          (1 == inet_pton (AF_INET6,
-                           rh->hostname,
-                           &v6.sin6_addr)) )
-       {
-         /* this can happen on some systems IF "hostname" is "localhost" */
-         rh->addr_callback (rh->cls,
-                              (const struct sockaddr*) &v6,
-                              sizeof(v6));
-       }
-      rh->addr_callback (rh->cls, NULL, 0);      
+      rh->addr_callback (rh->cls, (const struct sockaddr *) &v4, sizeof (v4));
+      if ((rh->domain == AF_UNSPEC) &&
+          (1 == inet_pton (AF_INET6, rh->hostname, &v6.sin6_addr)))
+        {
+          /* this can happen on some systems IF "hostname" is "localhost" */
+          rh->addr_callback (rh->cls,
+                             (const struct sockaddr *) &v6, sizeof (v6));
+        }
+      rh->addr_callback (rh->cls, NULL, 0);
       GNUNET_free (rh);
       return;
     }
-  if ( ( (rh->domain == AF_UNSPEC) || (rh->domain == AF_INET6) ) && 
-       (1 == inet_pton (AF_INET6,
-                       rh->hostname,
-                       &v6.sin6_addr)) )
+  if (((rh->domain == AF_UNSPEC) || (rh->domain == AF_INET6)) &&
+      (1 == inet_pton (AF_INET6, rh->hostname, &v6.sin6_addr)))
     {
-      rh->addr_callback (rh->cls,
-                          (const struct sockaddr*) &v6,
-                          sizeof(v6));
+      rh->addr_callback (rh->cls, (const struct sockaddr *) &v6, sizeof (v6));
       rh->addr_callback (rh->cls, NULL, 0);
       GNUNET_free (rh);
       return;
@@ -365,44 +354,35 @@ numeric_resolution (void *cls,
  * @param tc unused scheduler context
  */
 static void
-loopback_resolution (void *cls,
-                    const struct GNUNET_SCHEDULER_TaskContext *tc)
+loopback_resolution (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
   struct GNUNET_RESOLVER_RequestHandle *rh = cls;
   struct sockaddr_in v4;
   struct sockaddr_in6 v6;
 
-  memset (&v4, 0, sizeof(v4));
-  v4.sin_addr.s_addr = htonl (INADDR_LOOPBACK);  
+  memset (&v4, 0, sizeof (v4));
+  v4.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
   v4.sin_family = AF_INET;
 #if HAVE_SOCKADDR_IN_SIN_LEN
-  v4.sin_len = sizeof(v4);
+  v4.sin_len = sizeof (v4);
 #endif
-  memset (&v6, 0, sizeof(v6)); 
+  memset (&v6, 0, sizeof (v6));
   v6.sin6_family = AF_INET6;
 #if HAVE_SOCKADDR_IN_SIN_LEN
-  v6.sin6_len = sizeof(v6);
+  v6.sin6_len = sizeof (v6);
 #endif
   v6.sin6_addr = in6addr_loopback;
   switch (rh->domain)
     {
     case AF_INET:
-      rh->addr_callback (rh->cls, 
-                          (const struct sockaddr*) &v4,
-                          sizeof(v4));
+      rh->addr_callback (rh->cls, (const struct sockaddr *) &v4, sizeof (v4));
       break;
     case AF_INET6:
-      rh->addr_callback (rh->cls, 
-                          (const struct sockaddr*) &v6,
-                          sizeof(v6));
+      rh->addr_callback (rh->cls, (const struct sockaddr *) &v6, sizeof (v6));
       break;
     case AF_UNSPEC:
-      rh->addr_callback (rh->cls, 
-                          (const struct sockaddr*) &v6,
-                          sizeof(v6));
-      rh->addr_callback (rh->cls, 
-                          (const struct sockaddr*) &v4,
-                          sizeof(v4));
+      rh->addr_callback (rh->cls, (const struct sockaddr *) &v6, sizeof (v6));
+      rh->addr_callback (rh->cls, (const struct sockaddr *) &v4, sizeof (v4));
       break;
     default:
       GNUNET_break (0);
@@ -416,7 +396,6 @@ loopback_resolution (void *cls,
 /**
  * Convert a string to one or more IP addresses.
  *
- * @param sched scheduler to use
  * @param cfg configuration to use
  * @param hostname the hostname to resolve
  * @param domain AF_INET or AF_INET6; use AF_UNSPEC for "any"
@@ -426,13 +405,12 @@ loopback_resolution (void *cls,
  * @return handle that can be used to cancel the request, NULL on error
  */
 struct GNUNET_RESOLVER_RequestHandle *
-GNUNET_RESOLVER_ip_get (struct GNUNET_SCHEDULER_Handle *sched,
-                        const struct GNUNET_CONFIGURATION_Handle *cfg,
+GNUNET_RESOLVER_ip_get (const struct GNUNET_CONFIGURATION_Handle *cfg,
                         const char *hostname,
                         int domain,
                         struct GNUNET_TIME_Relative timeout,
-                        GNUNET_RESOLVER_AddressCallback callback, 
-                       void *callback_cls)
+                        GNUNET_RESOLVER_AddressCallback callback,
+                        void *callback_cls)
 {
   struct GNUNET_CLIENT_Connection *client;
   struct GNUNET_RESOLVER_GetMessage *msg;
@@ -441,42 +419,34 @@ GNUNET_RESOLVER_ip_get (struct GNUNET_SCHEDULER_Handle *sched,
   unsigned int i;
   struct in_addr v4;
   struct in6_addr v6;
-  char buf[GNUNET_SERVER_MAX_MESSAGE_SIZE];
+  char buf[GNUNET_SERVER_MAX_MESSAGE_SIZE - 1];
 
   check_config (cfg);
   slen = strlen (hostname) + 1;
-  if (slen + sizeof (struct GNUNET_RESOLVER_GetMessage) >
-      GNUNET_SERVER_MAX_MESSAGE_SIZE)
+  if (slen + sizeof (struct GNUNET_RESOLVER_GetMessage) >= GNUNET_SERVER_MAX_MESSAGE_SIZE)
     {
       GNUNET_break (0);
       return NULL;
     }
-  rh = GNUNET_malloc (sizeof(struct GNUNET_RESOLVER_RequestHandle) + slen);
-  rh->sched = sched;
+  rh = GNUNET_malloc (sizeof (struct GNUNET_RESOLVER_RequestHandle) + slen);
   rh->domain = domain;
   rh->addr_callback = callback;
   rh->cls = callback_cls;
   memcpy (&rh[1], hostname, slen);
-  rh->hostname = (const char*) &rh[1];
+  rh->hostname = (const char *) &rh[1];
   rh->timeout = GNUNET_TIME_relative_to_absolute (timeout);
 
   /* first, check if this is a numeric address */
-  if ( ( (1 == inet_pton (AF_INET,
-                         hostname,
-                         &v4)) &&
-        ( (domain == AF_INET) || (domain == AF_UNSPEC)) ) ||
-       ( (1 == inet_pton (AF_INET6,
-                         hostname,
-                         &v6)) &&
-        ( (domain == AF_INET6) || (domain == AF_UNSPEC)) ) )
+  if (((1 == inet_pton (AF_INET,
+                        hostname,
+                        &v4)) &&
+       ((domain == AF_INET) || (domain == AF_UNSPEC))) ||
+      ((1 == inet_pton (AF_INET6,
+                        hostname,
+                        &v6)) &&
+       ((domain == AF_INET6) || (domain == AF_UNSPEC))))
     {
-      rh->task = GNUNET_SCHEDULER_add_delayed (sched,
-                                              GNUNET_NO,
-                                              GNUNET_SCHEDULER_PRIORITY_KEEP,
-                                              GNUNET_SCHEDULER_NO_TASK,
-                                              GNUNET_TIME_UNIT_ZERO,
-                                              &numeric_resolution,
-                                              rh);
+      rh->task = GNUNET_SCHEDULER_add_now (&numeric_resolution, rh);
       return rh;
     }
   /* then, check if this is a loopback address */
@@ -484,25 +454,19 @@ 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_NO,
-                                                GNUNET_SCHEDULER_PRIORITY_KEEP,
-                                                GNUNET_SCHEDULER_NO_TASK,
-                                                GNUNET_TIME_UNIT_ZERO,
-                                                &loopback_resolution,
-                                                rh);
-       return rh;
+        rh->task = GNUNET_SCHEDULER_add_now (&loopback_resolution, rh);
+        return rh;
       }
 
-  client = GNUNET_CLIENT_connect (sched, "resolver", cfg);
+  client = GNUNET_CLIENT_connect ("resolver", cfg);
   if (client == NULL)
     {
       GNUNET_free (rh);
-      return NULL;    
+      return NULL;
     }
   rh->client = client;
 
-  msg = (struct GNUNET_RESOLVER_GetMessage*) buf;
+  msg = (struct GNUNET_RESOLVER_GetMessage *) buf;
   msg->header.size =
     htons (sizeof (struct GNUNET_RESOLVER_GetMessage) + slen);
   msg->header.type = htons (GNUNET_MESSAGE_TYPE_RESOLVER_REQUEST);
@@ -517,14 +481,13 @@ GNUNET_RESOLVER_ip_get (struct GNUNET_SCHEDULER_Handle *sched,
 #endif
   if (GNUNET_OK !=
       GNUNET_CLIENT_transmit_and_get_response (client,
-                                              &msg->header,
-                                              timeout,
-                                              GNUNET_YES,
-                                              &handle_address_response,
-                                              rh))
+                                               &msg->header,
+                                               timeout,
+                                               GNUNET_YES,
+                                               &handle_address_response, rh))
     {
       GNUNET_free (rh);
-      GNUNET_CLIENT_disconnect (client);
+      GNUNET_CLIENT_disconnect (client, GNUNET_NO);
       return NULL;
     }
   return rh;
@@ -538,8 +501,7 @@ GNUNET_RESOLVER_ip_get (struct GNUNET_SCHEDULER_Handle *sched,
  * @param msg message with the hostname, NULL on error
  */
 static void
-handle_hostname_response (void *cls,
-                         const struct GNUNET_MessageHeader *msg)
+handle_hostname_response (void *cls, const struct GNUNET_MessageHeader *msg)
 {
   struct GNUNET_RESOLVER_RequestHandle *rh = cls;
   uint16_t size;
@@ -548,9 +510,10 @@ handle_hostname_response (void *cls,
   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;
     }
@@ -559,10 +522,11 @@ handle_hostname_response (void *cls,
     {
 #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;
     }
@@ -571,13 +535,15 @@ handle_hostname_response (void *cls,
     {
       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,
@@ -596,17 +562,14 @@ handle_hostname_response (void *cls,
  * @param tc unused scheduler context
  */
 static void
-numeric_reverse (void *cls,
-                const struct GNUNET_SCHEDULER_TaskContext *tc)
+numeric_reverse (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
   struct GNUNET_RESOLVER_RequestHandle *rh = cls;
   char *result;
 
-  result = no_resolve ((const struct sockaddr*) &rh[1], 
-                      rh->salen);
+  result = no_resolve ((const struct sockaddr *) &rh[1], rh->salen);
 #if DEBUG_RESOLVER
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-             _("Resolver returns `%s'.\n"), result);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, _("Resolver returns `%s'.\n"), result);
 #endif
   if (result != NULL)
     {
@@ -622,7 +585,6 @@ numeric_reverse (void *cls,
 /**
  * Get an IP address as a string.
  *
- * @param sched scheduler to use
  * @param cfg configuration to use
  * @param sa host address
  * @param salen length of host address
@@ -633,8 +595,7 @@ numeric_reverse (void *cls,
  * @return handle that can be used to cancel the request
  */
 struct GNUNET_RESOLVER_RequestHandle *
-GNUNET_RESOLVER_hostname_get (struct GNUNET_SCHEDULER_Handle *sched,
-                              const struct GNUNET_CONFIGURATION_Handle *cfg,
+GNUNET_RESOLVER_hostname_get (const struct GNUNET_CONFIGURATION_Handle *cfg,
                               const struct sockaddr *sa,
                               socklen_t salen,
                               int do_resolve,
@@ -645,36 +606,28 @@ GNUNET_RESOLVER_hostname_get (struct GNUNET_SCHEDULER_Handle *sched,
   struct GNUNET_CLIENT_Connection *client;
   struct GNUNET_RESOLVER_GetMessage *msg;
   struct GNUNET_RESOLVER_RequestHandle *rh;
-  char buf[GNUNET_SERVER_MAX_MESSAGE_SIZE];
+  char buf[GNUNET_SERVER_MAX_MESSAGE_SIZE - 1];
 
   check_config (cfg);
   rh = GNUNET_malloc (sizeof (struct GNUNET_RESOLVER_RequestHandle) + salen);
   rh->name_callback = callback;
   rh->cls = cls;
   rh->timeout = GNUNET_TIME_relative_to_absolute (timeout);
-  rh->sched = sched;
   rh->salen = salen;
   memcpy (&rh[1], sa, salen);
 
   if (GNUNET_NO == do_resolve)
     {
-      rh->task = GNUNET_SCHEDULER_add_delayed (sched,
-                                              GNUNET_NO,
-                                              GNUNET_SCHEDULER_PRIORITY_KEEP,
-                                              GNUNET_SCHEDULER_NO_TASK,
-                                              GNUNET_TIME_UNIT_ZERO,
-                                              &numeric_reverse,
-                                              rh);      
+      rh->task = GNUNET_SCHEDULER_add_now (&numeric_reverse, rh);
       return rh;
     }
-  if (salen + sizeof (struct GNUNET_RESOLVER_GetMessage) >
-      GNUNET_SERVER_MAX_MESSAGE_SIZE)
+  if (salen + sizeof (struct GNUNET_RESOLVER_GetMessage) >= GNUNET_SERVER_MAX_MESSAGE_SIZE)
     {
       GNUNET_break (0);
       GNUNET_free (rh);
       return NULL;
     }
-  client = GNUNET_CLIENT_connect (sched, "resolver", cfg);
+  client = GNUNET_CLIENT_connect ("resolver", cfg);
   if (client == NULL)
     {
       GNUNET_free (rh);
@@ -682,7 +635,7 @@ GNUNET_RESOLVER_hostname_get (struct GNUNET_SCHEDULER_Handle *sched,
     }
   rh->client = client;
 
-  msg = (struct GNUNET_RESOLVER_GetMessage*) buf;
+  msg = (struct GNUNET_RESOLVER_GetMessage *) buf;
   msg->header.size =
     htons (sizeof (struct GNUNET_RESOLVER_GetMessage) + salen);
   msg->header.type = htons (GNUNET_MESSAGE_TYPE_RESOLVER_REQUEST);
@@ -695,13 +648,12 @@ GNUNET_RESOLVER_hostname_get (struct GNUNET_SCHEDULER_Handle *sched,
 #endif
   if (GNUNET_OK !=
       GNUNET_CLIENT_transmit_and_get_response (client,
-                                              &msg->header,
-                                              timeout,
-                                              GNUNET_YES,
-                                              &handle_hostname_response,
-                                              rh))
+                                               &msg->header,
+                                               timeout,
+                                               GNUNET_YES,
+                                               &handle_hostname_response, rh))
     {
-      GNUNET_CLIENT_disconnect (client);
+      GNUNET_CLIENT_disconnect (client, GNUNET_NO);
       GNUNET_free (rh);
       return NULL;
     }
@@ -710,9 +662,40 @@ 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
  * @param domain AF_INET or AF_INET6; use AF_UNSPEC for "any"
  * @param callback function to call with addresses
@@ -721,14 +704,13 @@ GNUNET_RESOLVER_hostname_get (struct GNUNET_SCHEDULER_Handle *sched,
  * @return handle that can be used to cancel the request, NULL on error
  */
 struct GNUNET_RESOLVER_RequestHandle *
-GNUNET_RESOLVER_hostname_resolve (struct GNUNET_SCHEDULER_Handle *sched,
-                                  const struct GNUNET_CONFIGURATION_Handle *cfg,
-                                  int domain,
+GNUNET_RESOLVER_hostname_resolve (const struct GNUNET_CONFIGURATION_Handle
+                                  *cfg, int domain,
                                   struct GNUNET_TIME_Relative timeout,
                                   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))
@@ -741,8 +723,8 @@ GNUNET_RESOLVER_hostname_resolve (struct GNUNET_SCHEDULER_Handle *sched,
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               _("Resolving our hostname `%s'\n"), hostname);
 #endif
-  return GNUNET_RESOLVER_ip_get (sched,
-                                cfg, hostname, domain, timeout, callback, cls);
+  return GNUNET_RESOLVER_ip_get (cfg, hostname, domain, timeout, callback,
+                                 cls);
 }
 
 
@@ -758,10 +740,9 @@ 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_SCHEDULER_cancel (h->task);
   GNUNET_free (h);
 }