WiP
[oweals/gnunet.git] / src / util / resolver_api.c
index f4844a490ef8aec20bd0ca0506033cbb529a4018..7daaaf1ccea47a1e41897f1fb16e58a270cf33f5 100644 (file)
@@ -79,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.
    */
@@ -189,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:
@@ -225,7 +230,6 @@ 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,
@@ -392,7 +396,6 @@ loopback_resolution (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 /**
  * 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"
@@ -402,8 +405,7 @@ loopback_resolution (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
  * @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,
@@ -417,18 +419,16 @@ 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->domain = domain;
   rh->addr_callback = callback;
   rh->cls = callback_cls;
@@ -446,8 +446,7 @@ GNUNET_RESOLVER_ip_get (struct GNUNET_SCHEDULER_Handle *sched,
                         &v6)) &&
        ((domain == AF_INET6) || (domain == AF_UNSPEC))))
     {
-      rh->task = GNUNET_SCHEDULER_add_now (sched,
-                                          &numeric_resolution, rh);
+      rh->task = GNUNET_SCHEDULER_add_now (&numeric_resolution, rh);
       return rh;
     }
   /* then, check if this is a loopback address */
@@ -455,12 +454,11 @@ GNUNET_RESOLVER_ip_get (struct GNUNET_SCHEDULER_Handle *sched,
   while (loopback[i] != NULL)
     if (0 == strcasecmp (loopback[i++], hostname))
       {
-        rh->task = GNUNET_SCHEDULER_add_now (sched,
-                                            &loopback_resolution, 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);
@@ -587,7 +585,6 @@ numeric_reverse (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 /**
  * 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
@@ -598,8 +595,7 @@ numeric_reverse (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
  * @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,
@@ -610,31 +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_now (sched,
-                                          &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);
@@ -669,13 +662,13 @@ GNUNET_RESOLVER_hostname_get (struct GNUNET_SCHEDULER_Handle *sched,
 
 
 /**
- * Get local hostname
- * @return hostname
+ * Get local fully qualified domain name
+ * @return fqdn
  */
 char *
-GNUNET_RESOLVER_local_hostname_get ( )
+GNUNET_RESOLVER_local_fqdn_get ( void )
 {
-
+  struct hostent *host;
   char hostname[GNUNET_OS_get_hostname_max_length() + 1];
 
 
@@ -687,15 +680,22 @@ GNUNET_RESOLVER_local_hostname_get ( )
     }
 #if DEBUG_RESOLVER
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              _("Resolving our hostname `%s'\n"), hostname);
+              _("Resolving our FQDN `%s'\n"), hostname);
 #endif
-  return GNUNET_strdup (hostname);
+  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
@@ -704,8 +704,7 @@ GNUNET_RESOLVER_local_hostname_get ( )
  * @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
+GNUNET_RESOLVER_hostname_resolve (const struct GNUNET_CONFIGURATION_Handle
                                   *cfg, int domain,
                                   struct GNUNET_TIME_Relative timeout,
                                   GNUNET_RESOLVER_AddressCallback callback,
@@ -724,8 +723,7 @@ 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,
+  return GNUNET_RESOLVER_ip_get (cfg, hostname, domain, timeout, callback,
                                  cls);
 }
 
@@ -744,7 +742,7 @@ GNUNET_RESOLVER_request_cancel (struct GNUNET_RESOLVER_RequestHandle *h)
   if (h->client != NULL)
     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);
 }