do not autostart nse
[oweals/gnunet.git] / src / hostlist / hostlist-client.c
index 82f4b78acfefedf3d10478c5c49357cae619cc70..049e78c52f10131fc068d549bbb690550812478f 100644 (file)
@@ -4,7 +4,7 @@
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
-     by the Free Software Foundation; either version 2, or (at your
+     by the Free Software Foundation; either version 3, or (at your
      option) any later version.
 
      GNUnet is distributed in the hope that it will be useful, but
      option) any later version.
 
      GNUnet is distributed in the hope that it will be useful, but
@@ -36,7 +36,7 @@
 #include "gnunet_common.h"
 #include "gnunet_bio_lib.h"
 
 #include "gnunet_common.h"
 #include "gnunet_bio_lib.h"
 
-#define DEBUG_HOSTLIST_CLIENT GNUNET_YES
+#define DEBUG_HOSTLIST_CLIENT GNUNET_NO
 
 
 /**
 
 
 /**
  */
 #define MIN_CONNECTIONS 4
 
  */
 #define MIN_CONNECTIONS 4
 
+/**
+ * Interval between two advertised hostlist tests
+ */
+#define TESTING_INTERVAL GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 5)
+
 /**
  * A single hostlist obtained by hostlist advertisements
  */
 /**
  * A single hostlist obtained by hostlist advertisements
  */
@@ -103,31 +108,21 @@ struct Hostlist
  */
 static const struct GNUNET_CONFIGURATION_Handle *cfg;
 
  */
 static const struct GNUNET_CONFIGURATION_Handle *cfg;
 
-/**
- * Our scheduler.
- */
-static struct GNUNET_SCHEDULER_Handle *sched;
-
 /**
  * Statistics handle.
  */
 /**
  * Statistics handle.
  */
-struct GNUNET_STATISTICS_Handle *stats; 
+static struct GNUNET_STATISTICS_Handle *stats; 
 
 /**
  * Transport handle.
  */
 
 /**
  * Transport handle.
  */
-struct GNUNET_TRANSPORT_Handle *transport;
+static struct GNUNET_TRANSPORT_Handle *transport;
                        
 /**
  * Proxy that we are using (can be NULL).
  */
 static char *proxy;
 
                        
 /**
  * Proxy that we are using (can be NULL).
  */
 static char *proxy;
 
-/**
- * Buffer for data downloaded via HTTP.
- */
-static char download_buffer[GNUNET_SERVER_MAX_MESSAGE_SIZE];
-
 /**
  * Number of bytes valid in 'download_buffer'.
  */
 /**
  * Number of bytes valid in 'download_buffer'.
  */
@@ -149,9 +144,9 @@ static CURL *curl;
 static CURLM *multi;
 
 /**
 static CURLM *multi;
 
 /**
- *
+ * How many bytes did we download from the current hostlist URL?
  */
  */
-static uint32_t bytes_downloaded;
+static uint32_t stat_bytes_downloaded;
 /**
  * Amount of time we wait between hostlist downloads.
  */
 /**
  * Amount of time we wait between hostlist downloads.
  */
@@ -272,6 +267,7 @@ callback_download (void *ptr,
                             size_t nmemb, 
                             void *ctx)
 {
                             size_t nmemb, 
                             void *ctx)
 {
+  static char download_buffer[GNUNET_SERVER_MAX_MESSAGE_SIZE - 1];
   const char * cbuf = ptr;
   const struct GNUNET_MessageHeader *msg;
   size_t total;
   const char * cbuf = ptr;
   const struct GNUNET_MessageHeader *msg;
   size_t total;
@@ -280,16 +276,12 @@ callback_download (void *ptr,
   uint16_t msize;
 
   total = size * nmemb;
   uint16_t msize;
 
   total = size * nmemb;
-  bytes_downloaded = total;
+  stat_bytes_downloaded += total;
   if ( (total == 0) || (stat_bogus_url) )
     {
       return total;  /* ok, no data or bogus data */
     }
 
   if ( (total == 0) || (stat_bogus_url) )
     {
       return total;  /* ok, no data or bogus data */
     }
 
-  GNUNET_log (GNUNET_ERROR_TYPE_INFO,
-                _("Total: %u, nmeb: %u, size %u \n"),
-                    total, nmemb, size);
-
   GNUNET_STATISTICS_update (stats, 
                            gettext_noop ("# bytes downloaded from hostlist servers"), 
                            (int64_t) total, 
   GNUNET_STATISTICS_update (stats, 
                            gettext_noop ("# bytes downloaded from hostlist servers"), 
                            (int64_t) total, 
@@ -298,7 +290,7 @@ callback_download (void *ptr,
   while ( (left > 0) ||
          (download_pos > 0) )
     {
   while ( (left > 0) ||
          (download_pos > 0) )
     {
-      cpy = GNUNET_MIN (left, GNUNET_SERVER_MAX_MESSAGE_SIZE - download_pos);
+      cpy = GNUNET_MIN (left, GNUNET_SERVER_MAX_MESSAGE_SIZE - 1 - download_pos);
       memcpy (&download_buffer[download_pos],
              cbuf,
              cpy);      
       memcpy (&download_buffer[download_pos],
              cbuf,
              cpy);      
@@ -343,7 +335,7 @@ callback_download (void *ptr,
                                    1, 
                                    GNUNET_NO);
          stat_hellos_obtained++;
                                    1, 
                                    GNUNET_NO);
          stat_hellos_obtained++;
-         GNUNET_TRANSPORT_offer_hello (transport, msg);
+         GNUNET_TRANSPORT_offer_hello (transport, msg, NULL, NULL);
        }
       else
        {
        }
       else
        {
@@ -485,7 +477,7 @@ download_get_url ()
 }
 
 
 }
 
 
-#define CURL_EASY_SETOPT(c, a, b) do { ret = curl_easy_setopt(c, a, b); if (ret != CURLE_OK) GNUNET_log(GNUNET_ERROR_TYPE_WARNING, _("%s failed at %s:%d: `%s'\n"), "curl_easy_setopt", __FILE__, __LINE__, curl_easy_strerror(ret)); } while (0);
+#define CURL_EASY_SETOPT(c, a, b) do { ret = curl_easy_setopt(c, a, b); if (ret != CURLE_OK) GNUNET_log(GNUNET_ERROR_TYPE_WARNING, _("%s failed at %s:%d: `%s'\n"), "curl_easy_setopt", __FILE__, __LINE__, curl_easy_strerror(ret)); } while (0)
 
 /**
  * Method to save hostlist to a file during hostlist client shutdown
 
 /**
  * Method to save hostlist to a file during hostlist client shutdown
@@ -577,39 +569,32 @@ linked_list_get_lowest_quality ( )
  * Method to insert a hostlist into the datastore. If datastore contains maximum number of elements, the elements with lowest quality is dismissed
  */
 static void
  * Method to insert a hostlist into the datastore. If datastore contains maximum number of elements, the elements with lowest quality is dismissed
  */
 static void
-insert_hostlist ( void )
+insert_hostlist ( )
 {
 {
-  GNUNET_CONTAINER_DLL_insert(linked_list_head, linked_list_tail, hostlist_to_test);
-  linked_list_size++;
-
-  GNUNET_STATISTICS_set (stats,
-                         gettext_noop("# advertised hostlist URIs"),
-                         linked_list_size,
-                         GNUNET_NO);
-
-  if (MAX_NUMBER_HOSTLISTS >= linked_list_size)
-    return;
-
-  /* No free entries available, replace existing entry  */
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Removing lowest quality entry\n" );
-  struct Hostlist * lowest_quality = linked_list_get_lowest_quality();
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Hostlist with URI `%s' has the worst quality of all with value %llu\n",
-              lowest_quality->hostlist_uri,
-              (unsigned long long) lowest_quality->quality);
-  GNUNET_CONTAINER_DLL_remove (linked_list_head, linked_list_tail, lowest_quality);
-  linked_list_size--;
+  struct Hostlist * lowest_quality;
 
 
+  if (MAX_NUMBER_HOSTLISTS <= linked_list_size)
+    {
+      /* No free entries available, replace existing entry  */
+      lowest_quality = linked_list_get_lowest_quality();
+      GNUNET_assert (lowest_quality != NULL);
+      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                 "Removing hostlist with URI `%s' which has the worst quality of all (%llu)\n",
+                 lowest_quality->hostlist_uri,
+                 (unsigned long long) lowest_quality->quality);
+      GNUNET_CONTAINER_DLL_remove (linked_list_head, linked_list_tail, lowest_quality);
+      linked_list_size--;
+      GNUNET_free (lowest_quality);
+    }
+  GNUNET_CONTAINER_DLL_insert(linked_list_head,
+                             linked_list_tail,
+                             hostlist_to_test);
+  linked_list_size++;
   GNUNET_STATISTICS_set (stats,
                          gettext_noop("# advertised hostlist URIs"),
                          linked_list_size,
                          GNUNET_NO);
   GNUNET_STATISTICS_set (stats,
                          gettext_noop("# advertised hostlist URIs"),
                          linked_list_size,
                          GNUNET_NO);
-
-  GNUNET_free (lowest_quality);
-
   stat_testing_hostlist = GNUNET_NO;
   stat_testing_hostlist = GNUNET_NO;
-  return;
 }
 
 
 }
 
 
@@ -711,7 +696,7 @@ clean_up ()
     }  
   GNUNET_free_non_null (current_url);
   current_url = NULL;
     }  
   GNUNET_free_non_null (current_url);
   current_url = NULL;
-  bytes_downloaded = 0;
+  stat_bytes_downloaded = 0;
   stat_download_in_progress = GNUNET_NO;
 }
 
   stat_download_in_progress = GNUNET_NO;
 }
 
@@ -779,8 +764,7 @@ download_prepare ()
               "Scheduling task for hostlist download using cURL\n");
 #endif
   ti_download
               "Scheduling task for hostlist download using cURL\n");
 #endif
   ti_download
-    = GNUNET_SCHEDULER_add_select (sched,
-                                   GNUNET_SCHEDULER_PRIORITY_DEFAULT,
+    = GNUNET_SCHEDULER_add_select (GNUNET_SCHEDULER_PRIORITY_DEFAULT,
                                    GNUNET_SCHEDULER_NO_TASK,
                                    rtime,
                                    grs,
                                    GNUNET_SCHEDULER_NO_TASK,
                                    rtime,
                                    grs,
@@ -808,7 +792,6 @@ task_download (void *cls,
   struct CURLMsg *msg;
   CURLMcode mret;
   
   struct CURLMsg *msg;
   CURLMcode mret;
   
-  bytes_downloaded = 0;
   ti_download = GNUNET_SCHEDULER_NO_TASK;
   if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN))
     {
   ti_download = GNUNET_SCHEDULER_NO_TASK;
   if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN))
     {
@@ -821,7 +804,7 @@ task_download (void *cls,
       clean_up ();
       return;
     }
       clean_up ();
       return;
     }
-  if (GNUNET_TIME_absolute_get_remaining (end_time).value == 0)
+  if (GNUNET_TIME_absolute_get_remaining (end_time).rel_value == 0)
     {
       GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
                  _("Timeout trying to download hostlist from `%s'\n"),
     {
       GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
                  _("Timeout trying to download hostlist from `%s'\n"),
@@ -838,7 +821,7 @@ task_download (void *cls,
   do 
     {
       running = 0;
   do 
     {
       running = 0;
-      if (bytes_downloaded > MAX_BYTES_PER_HOSTLISTS)
+      if (stat_bytes_downloaded > MAX_BYTES_PER_HOSTLISTS)
         {
         GNUNET_log (GNUNET_ERROR_TYPE_INFO,
                                   _("Download limit of %u bytes exceeded, stopping download\n"),MAX_BYTES_PER_HOSTLISTS);
         {
         GNUNET_log (GNUNET_ERROR_TYPE_INFO,
                                   _("Download limit of %u bytes exceeded, stopping download\n"),MAX_BYTES_PER_HOSTLISTS);
@@ -937,6 +920,7 @@ download_hostlist ()
   stat_download_in_progress = GNUNET_YES;
   stat_download_successful = GNUNET_NO;
   stat_hellos_obtained = 0;
   stat_download_in_progress = GNUNET_YES;
   stat_download_successful = GNUNET_NO;
   stat_hellos_obtained = 0;
+  stat_bytes_downloaded = 0;
 
   GNUNET_STATISTICS_update (stats, 
                            gettext_noop ("# hostlist downloads initiated"), 
 
   GNUNET_STATISTICS_update (stats, 
                            gettext_noop ("# hostlist downloads initiated"), 
@@ -1002,7 +986,7 @@ download_hostlist ()
   if (multi == NULL)
     {
       GNUNET_break (0);
   if (multi == NULL)
     {
       GNUNET_break (0);
-      clean_up ();
+      /* clean_up (); */
       return;
     }
   mret = curl_multi_add_handle (multi, curl);
       return;
     }
   mret = curl_multi_add_handle (multi, curl);
@@ -1046,8 +1030,7 @@ task_download_dispatcher (void *cls,
    {
      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                "Download in progess, have to wait...\n");
    {
      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                "Download in progess, have to wait...\n");
-     ti_download_dispatcher_task = GNUNET_SCHEDULER_add_delayed (sched,
-                                                              WAITING_INTERVALL,
+     ti_download_dispatcher_task = GNUNET_SCHEDULER_add_delayed (WAITING_INTERVALL,
                                                               &task_download_dispatcher,
                                                               NULL);
    }
                                                               &task_download_dispatcher,
                                                               NULL);
    }
@@ -1062,36 +1045,35 @@ static void
 task_check (void *cls,
            const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
 task_check (void *cls,
            const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
+  static int once;
+  struct GNUNET_TIME_Relative delay;
+
   ti_check_download = GNUNET_SCHEDULER_NO_TASK;
   if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN))
     return;
 
   if (stat_connection_count < MIN_CONNECTIONS)
   {
   ti_check_download = GNUNET_SCHEDULER_NO_TASK;
   if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN))
     return;
 
   if (stat_connection_count < MIN_CONNECTIONS)
   {
-    ti_download_dispatcher_task = GNUNET_SCHEDULER_add_now ( sched,
-                                                          &task_download_dispatcher,
+    ti_download_dispatcher_task = GNUNET_SCHEDULER_add_now (&task_download_dispatcher,
                                                           NULL);
   }
 
                                                           NULL);
   }
 
-  static int once;
-  struct GNUNET_TIME_Relative delay;
-
   if (stats == NULL)
   if (stats == NULL)
-    {
-      curl_global_cleanup ();
-      return; /* in shutdown */
-    }
+  {
+    curl_global_cleanup ();
+    return; /* in shutdown */
+  }
   delay = hostlist_delay;
   delay = hostlist_delay;
-  if (hostlist_delay.value == 0)
+  if (hostlist_delay.rel_value == 0)
     hostlist_delay = GNUNET_TIME_UNIT_SECONDS;
   else
     hostlist_delay = GNUNET_TIME_relative_multiply (hostlist_delay, 2);
     hostlist_delay = GNUNET_TIME_UNIT_SECONDS;
   else
     hostlist_delay = GNUNET_TIME_relative_multiply (hostlist_delay, 2);
-  if (hostlist_delay.value > GNUNET_TIME_UNIT_HOURS.value * (1 + stat_connection_count))
+  if (hostlist_delay.rel_value > GNUNET_TIME_UNIT_HOURS.rel_value * (1 + stat_connection_count))
     hostlist_delay = GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_HOURS,
                                                     (1 + stat_connection_count));
   GNUNET_STATISTICS_set (stats,
     hostlist_delay = GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_HOURS,
                                                     (1 + stat_connection_count));
   GNUNET_STATISTICS_set (stats,
-                         gettext_noop("# seconds between hostlist downloads"),
-                         hostlist_delay.value,
+                         gettext_noop("# milliseconds between hostlist downloads"),
+                         hostlist_delay.rel_value,
                          GNUNET_YES);
   if (0 == once)
     {
                          GNUNET_YES);
   if (0 == once)
     {
@@ -1102,9 +1084,8 @@ task_check (void *cls,
               _("Have %u/%u connections.  Will consider downloading hostlist in %llums\n"),
               stat_connection_count,
               MIN_CONNECTIONS,
               _("Have %u/%u connections.  Will consider downloading hostlist in %llums\n"),
               stat_connection_count,
               MIN_CONNECTIONS,
-              (unsigned long long) delay.value);
-  ti_check_download = GNUNET_SCHEDULER_add_delayed (sched,
-                                               delay,
+              (unsigned long long) delay.rel_value);
+  ti_check_download = GNUNET_SCHEDULER_add_delayed (delay,
                                                &task_check,
                                                NULL);
 }
                                                &task_check,
                                                NULL);
 }
@@ -1145,9 +1126,8 @@ task_hostlist_saving (void *cls,
 
   GNUNET_log (GNUNET_ERROR_TYPE_INFO,
               _("Hostlists will be saved to file again in %llums\n"),
 
   GNUNET_log (GNUNET_ERROR_TYPE_INFO,
               _("Hostlists will be saved to file again in %llums\n"),
-              (unsigned long long) SAVING_INTERVALL.value);
-  ti_saving_task = GNUNET_SCHEDULER_add_delayed (sched,
-                                               SAVING_INTERVALL,
+              (unsigned long long) SAVING_INTERVALL.rel_value);
+  ti_saving_task = GNUNET_SCHEDULER_add_delayed (SAVING_INTERVALL,
                                                &task_hostlist_saving,
                                                NULL);
 }
                                                &task_hostlist_saving,
                                                NULL);
 }
@@ -1157,21 +1137,20 @@ task_hostlist_saving (void *cls,
  *
  * @param cls closure
  * @param peer peer identity this notification is about
  *
  * @param cls closure
  * @param peer peer identity this notification is about
- * @param latency reported latency of the connection with 'other'
- * @param distance reported distance (DV) to 'other' 
+ * @param atsi performance data
  */
 static void
 handler_connect (void *cls,
                 const struct
                 GNUNET_PeerIdentity * peer,
  */
 static void
 handler_connect (void *cls,
                 const struct
                 GNUNET_PeerIdentity * peer,
-                struct GNUNET_TIME_Relative latency,
-                uint32_t distance)
+                const struct GNUNET_TRANSPORT_ATS_Information *atsi)
 {
 {
+  GNUNET_assert (stat_connection_count < UINT_MAX);
   stat_connection_count++;
   GNUNET_STATISTICS_update (stats, 
                            gettext_noop ("# active connections"), 
                            1, 
   stat_connection_count++;
   GNUNET_STATISTICS_update (stats, 
                            gettext_noop ("# active connections"), 
                            1, 
-                           GNUNET_NO);  
+                           GNUNET_NO);
 }
 
 
 }
 
 
@@ -1186,11 +1165,12 @@ handler_disconnect (void *cls,
                    const struct
                    GNUNET_PeerIdentity * peer)
 {
                    const struct
                    GNUNET_PeerIdentity * peer)
 {
+  GNUNET_assert (stat_connection_count > 0);
   stat_connection_count--;
   stat_connection_count--;
-  GNUNET_STATISTICS_update (stats, 
-                           gettext_noop ("# active connections"), 
-                           -1, 
-                           GNUNET_NO);  
+  GNUNET_STATISTICS_update (stats,
+                           gettext_noop ("# active connections"),
+                           -1,
+                           GNUNET_NO);
 }
 
 /**
 }
 
 /**
@@ -1199,17 +1179,15 @@ handler_disconnect (void *cls,
  * @param cls closure (always NULL)
  * @param peer the peer sending the message
  * @param message the actual message
  * @param cls closure (always NULL)
  * @param peer the peer sending the message
  * @param message the actual message
- * @param latency latency
- * @param distance distance
+ * @param atsi performance data
  * @return GNUNET_OK to keep the connection open,
  *         GNUNET_SYSERR to close it (signal serious error)
  */
 static int
 handler_advertisement (void *cls,
  * @return GNUNET_OK to keep the connection open,
  *         GNUNET_SYSERR to close it (signal serious error)
  */
 static int
 handler_advertisement (void *cls,
-    const struct GNUNET_PeerIdentity * peer,
-    const struct GNUNET_MessageHeader * message,
-    struct GNUNET_TIME_Relative latency,
-    uint32_t distance)
+                      const struct GNUNET_PeerIdentity * peer,
+                      const struct GNUNET_MessageHeader * message,
+                      const struct GNUNET_TRANSPORT_ATS_Information *atsi)
 {
   size_t size;
   size_t uri_size;
 {
   size_t size;
   size_t uri_size;
@@ -1267,17 +1245,15 @@ handler_advertisement (void *cls,
 
   stat_testing_hostlist = GNUNET_YES;
   stat_testing_allowed = GNUNET_NO;
 
   stat_testing_hostlist = GNUNET_YES;
   stat_testing_allowed = GNUNET_NO;
-  ti_testing_intervall_task = GNUNET_SCHEDULER_add_delayed (sched,
-                                                         TESTING_INTERVALL,
+  ti_testing_intervall_task = GNUNET_SCHEDULER_add_delayed (TESTING_INTERVAL,
                                                          &task_testing_intervall_reset,
                                                          NULL);
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
             "Testing new hostlist advertisements is locked for the next %u ms\n",
                                                          &task_testing_intervall_reset,
                                                          NULL);
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
             "Testing new hostlist advertisements is locked for the next %u ms\n",
-            TESTING_INTERVALL);
+            TESTING_INTERVAL.rel_value);
 
 
-  ti_download_dispatcher_task = GNUNET_SCHEDULER_add_now (sched,
-                                                     &task_download_dispatcher,
+  ti_download_dispatcher_task = GNUNET_SCHEDULER_add_now (&task_download_dispatcher,
                                                      NULL);
 
   return GNUNET_OK;
                                                      NULL);
 
   return GNUNET_OK;
@@ -1302,8 +1278,7 @@ primary_task (void *cls, int success)
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
              "Statistics request done, scheduling hostlist download\n");
 #endif
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
              "Statistics request done, scheduling hostlist download\n");
 #endif
-  ti_check_download = GNUNET_SCHEDULER_add_now (sched,
-                                           &task_check,
+  ti_check_download = GNUNET_SCHEDULER_add_now (&task_check,
                                            NULL);
 }
 
                                            NULL);
 }
 
@@ -1318,7 +1293,7 @@ process_stat (void *cls,
   GNUNET_log (GNUNET_ERROR_TYPE_INFO,
              _("Initial time between hostlist downloads is %llums\n"),
              (unsigned long long) value);
   GNUNET_log (GNUNET_ERROR_TYPE_INFO,
              _("Initial time between hostlist downloads is %llums\n"),
              (unsigned long long) value);
-  hostlist_delay.value = value;
+  hostlist_delay.rel_value = value;
   return GNUNET_OK;
 }
 
   return GNUNET_OK;
 }
 
@@ -1341,10 +1316,10 @@ load_hostlist_file ()
   uint32_t counter;
 
   if (GNUNET_OK !=
   uint32_t counter;
 
   if (GNUNET_OK !=
-      GNUNET_CONFIGURATION_get_value_string (cfg,
-                                             "HOSTLIST",
-                                             "HOSTLISTFILE",
-                                             &filename))
+                 GNUNET_CONFIGURATION_get_value_filename (cfg,
+                                                   "HOSTLIST",
+                                                   "HOSTLISTFILE",
+                                                   &filename))
     {
       GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
                   _("No `%s' specified in `%s' configuration, cannot load hostlists from file.\n"),
     {
       GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
                   _("No `%s' specified in `%s' configuration, cannot load hostlists from file.\n"),
@@ -1375,6 +1350,7 @@ load_hostlist_file ()
 
   counter = 0;
   while ( (GNUNET_OK == GNUNET_BIO_read_string (rh, "url" , &uri, MAX_URL_LEN)) &&
 
   counter = 0;
   while ( (GNUNET_OK == GNUNET_BIO_read_string (rh, "url" , &uri, MAX_URL_LEN)) &&
+         (NULL != uri) &&
          (GNUNET_OK == GNUNET_BIO_read_int32 (rh, &times_used)) &&
          (GNUNET_OK == GNUNET_BIO_read_int64 (rh, &quality)) &&
          (GNUNET_OK == GNUNET_BIO_read_int64 (rh, &last_used)) &&
          (GNUNET_OK == GNUNET_BIO_read_int32 (rh, &times_used)) &&
          (GNUNET_OK == GNUNET_BIO_read_int64 (rh, &quality)) &&
          (GNUNET_OK == GNUNET_BIO_read_int64 (rh, &last_used)) &&
@@ -1386,8 +1362,8 @@ load_hostlist_file ()
       hostlist->hostlist_uri = (const char *) &hostlist[1];
       memcpy (&hostlist[1], uri, strlen(uri)+1);
       hostlist->quality = quality;
       hostlist->hostlist_uri = (const char *) &hostlist[1];
       memcpy (&hostlist[1], uri, strlen(uri)+1);
       hostlist->quality = quality;
-      hostlist->time_creation.value = created;
-      hostlist->time_last_usage.value = last_used;
+      hostlist->time_creation.abs_value = created;
+      hostlist->time_last_usage.abs_value = last_used;
       GNUNET_CONTAINER_DLL_insert(linked_list_head, linked_list_tail, hostlist);
       linked_list_size++;
       GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
       GNUNET_CONTAINER_DLL_insert(linked_list_head, linked_list_tail, hostlist);
       linked_list_size++;
       GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -1431,7 +1407,7 @@ static void save_hostlist_file ( int shutdown )
   uint32_t counter;
 
   if (GNUNET_OK !=
   uint32_t counter;
 
   if (GNUNET_OK !=
-      GNUNET_CONFIGURATION_get_value_string (cfg,
+      GNUNET_CONFIGURATION_get_value_filename (cfg,
                                              "HOSTLIST",
                                              "HOSTLISTFILE",
                                              &filename))
                                              "HOSTLIST",
                                              "HOSTLISTFILE",
                                              &filename))
@@ -1441,6 +1417,11 @@ static void save_hostlist_file ( int shutdown )
                   "HOSTLISTFILE", "HOSTLIST");
       return;
     }
                   "HOSTLISTFILE", "HOSTLIST");
       return;
     }
+  if (GNUNET_SYSERR == GNUNET_DISK_directory_create_for_file (filename))
+    {
+      GNUNET_free (filename);
+      return;
+    }
   wh = GNUNET_BIO_write_open (filename);
   if ( NULL == wh)
     {
   wh = GNUNET_BIO_write_open (filename);
   if ( NULL == wh)
     {
@@ -1454,7 +1435,6 @@ static void save_hostlist_file ( int shutdown )
   GNUNET_log (GNUNET_ERROR_TYPE_INFO,
               _("Writing %u hostlist URIs to `%s'\n" ),
               linked_list_size, filename);
   GNUNET_log (GNUNET_ERROR_TYPE_INFO,
               _("Writing %u hostlist URIs to `%s'\n" ),
               linked_list_size, filename);
-
   /* add code to write hostlists to file using bio */
   ok = GNUNET_YES;
   counter = 0;
   /* add code to write hostlists to file using bio */
   ok = GNUNET_YES;
   counter = 0;
@@ -1474,9 +1454,9 @@ static void save_hostlist_file ( int shutdown )
               (GNUNET_OK !=
                GNUNET_BIO_write_int64 (wh, pos->quality)) ||
                (GNUNET_OK !=
               (GNUNET_OK !=
                GNUNET_BIO_write_int64 (wh, pos->quality)) ||
                (GNUNET_OK !=
-                GNUNET_BIO_write_int64 (wh, pos->time_last_usage.value)) ||
+                GNUNET_BIO_write_int64 (wh, pos->time_last_usage.abs_value)) ||
                (GNUNET_OK !=
                (GNUNET_OK !=
-                GNUNET_BIO_write_int64 (wh, pos->time_creation.value)) ||
+                GNUNET_BIO_write_int64 (wh, pos->time_creation.abs_value)) ||
               (GNUNET_OK !=
                GNUNET_BIO_write_int32 (wh, pos->hello_count)))
            {
               (GNUNET_OK !=
                GNUNET_BIO_write_int32 (wh, pos->hello_count)))
            {
@@ -1509,7 +1489,6 @@ static void save_hostlist_file ( int shutdown )
  */
 int
 GNUNET_HOSTLIST_client_start (const struct GNUNET_CONFIGURATION_Handle *c,
  */
 int
 GNUNET_HOSTLIST_client_start (const struct GNUNET_CONFIGURATION_Handle *c,
-                             struct GNUNET_SCHEDULER_Handle *s,
                              struct GNUNET_STATISTICS_Handle *st,
                              GNUNET_CORE_ConnectEventHandler *ch,
                              GNUNET_CORE_DisconnectEventHandler *dh,
                              struct GNUNET_STATISTICS_Handle *st,
                              GNUNET_CORE_ConnectEventHandler *ch,
                              GNUNET_CORE_DisconnectEventHandler *dh,
@@ -1524,14 +1503,13 @@ GNUNET_HOSTLIST_client_start (const struct GNUNET_CONFIGURATION_Handle *c,
       GNUNET_break (0);
       return GNUNET_SYSERR;
     }
       GNUNET_break (0);
       return GNUNET_SYSERR;
     }
-  transport = GNUNET_TRANSPORT_connect (s, c, NULL, NULL, NULL, NULL);
+  transport = GNUNET_TRANSPORT_connect (c, NULL, NULL, NULL, NULL, NULL);
   if (NULL == transport)
     {
       curl_global_cleanup ();
       return GNUNET_SYSERR;
     }
   cfg = c;
   if (NULL == transport)
     {
       curl_global_cleanup ();
       return GNUNET_SYSERR;
     }
   cfg = c;
-  sched = s;
   stats = st;
   if (GNUNET_OK !=
       GNUNET_CONFIGURATION_get_value_string (cfg,
   stats = st;
   if (GNUNET_OK !=
       GNUNET_CONFIGURATION_get_value_string (cfg,
@@ -1556,9 +1534,8 @@ GNUNET_HOSTLIST_client_start (const struct GNUNET_CONFIGURATION_Handle *c,
     load_hostlist_file ();
     GNUNET_log (GNUNET_ERROR_TYPE_INFO,
               _("Hostlists will be saved to file again in  %llums\n"),
     load_hostlist_file ();
     GNUNET_log (GNUNET_ERROR_TYPE_INFO,
               _("Hostlists will be saved to file again in  %llums\n"),
-              (unsigned long long) SAVING_INTERVALL.value);
-    ti_saving_task = GNUNET_SCHEDULER_add_delayed (sched,
-                                               SAVING_INTERVALL,
+              (unsigned long long) SAVING_INTERVALL.rel_value);
+    ti_saving_task = GNUNET_SCHEDULER_add_delayed (SAVING_INTERVALL,
                                                &task_hostlist_saving,
                                                NULL);
   }
                                                &task_hostlist_saving,
                                                NULL);
   }
@@ -1567,7 +1544,7 @@ GNUNET_HOSTLIST_client_start (const struct GNUNET_CONFIGURATION_Handle *c,
     GNUNET_log (GNUNET_ERROR_TYPE_INFO,
               _("Learning is not enabled on this peer\n"));
     *msgh = NULL;
     GNUNET_log (GNUNET_ERROR_TYPE_INFO,
               _("Learning is not enabled on this peer\n"));
     *msgh = NULL;
-    if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_string (cfg,
+    if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_filename (cfg,
                                                             "HOSTLIST",
                                                             "HOSTLISTFILE",
                                                             &filename))
                                                             "HOSTLIST",
                                                             "HOSTLISTFILE",
                                                             &filename))
@@ -1587,7 +1564,7 @@ GNUNET_HOSTLIST_client_start (const struct GNUNET_CONFIGURATION_Handle *c,
   }
   GNUNET_STATISTICS_get (stats,
                         "hostlist",
   }
   GNUNET_STATISTICS_get (stats,
                         "hostlist",
-                        gettext_noop("# seconds between hostlist downloads"),
+                        gettext_noop("# milliseconds between hostlist downloads"),
                         GNUNET_TIME_UNIT_MINUTES,
                         &primary_task,
                         &process_stat,
                         GNUNET_TIME_UNIT_MINUTES,
                         &primary_task,
                         &process_stat,
@@ -1602,6 +1579,8 @@ GNUNET_HOSTLIST_client_start (const struct GNUNET_CONFIGURATION_Handle *c,
 void
 GNUNET_HOSTLIST_client_stop ()
 {
 void
 GNUNET_HOSTLIST_client_stop ()
 {
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Hostlist client shutdown\n");
 #if DEBUG_HOSTLIST_CLIENT
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
              "Hostlist client shutdown\n");
 #if DEBUG_HOSTLIST_CLIENT
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
              "Hostlist client shutdown\n");
@@ -1611,29 +1590,24 @@ GNUNET_HOSTLIST_client_stop ()
 
   if (ti_saving_task != GNUNET_SCHEDULER_NO_TASK)
     {
 
   if (ti_saving_task != GNUNET_SCHEDULER_NO_TASK)
     {
-      GNUNET_SCHEDULER_cancel (sched,
-          ti_saving_task);
+      GNUNET_SCHEDULER_cancel (ti_saving_task);
     }
 
   if (ti_download_dispatcher_task != GNUNET_SCHEDULER_NO_TASK)
     {
     }
 
   if (ti_download_dispatcher_task != GNUNET_SCHEDULER_NO_TASK)
     {
-      GNUNET_SCHEDULER_cancel (sched,
-          ti_download_dispatcher_task);
+      GNUNET_SCHEDULER_cancel (ti_download_dispatcher_task);
     }
   if (ti_testing_intervall_task != GNUNET_SCHEDULER_NO_TASK)
     {
     }
   if (ti_testing_intervall_task != GNUNET_SCHEDULER_NO_TASK)
     {
-      GNUNET_SCHEDULER_cancel (sched,
-          ti_testing_intervall_task);
+      GNUNET_SCHEDULER_cancel (ti_testing_intervall_task);
     }
   if (ti_download != GNUNET_SCHEDULER_NO_TASK)
     {
     }
   if (ti_download != GNUNET_SCHEDULER_NO_TASK)
     {
-      GNUNET_SCHEDULER_cancel (sched,
-                               ti_download);
+      GNUNET_SCHEDULER_cancel (ti_download);
     }
   if (ti_check_download != GNUNET_SCHEDULER_NO_TASK)
     {
     }
   if (ti_check_download != GNUNET_SCHEDULER_NO_TASK)
     {
-      GNUNET_SCHEDULER_cancel (sched,
-                              ti_check_download);
+      GNUNET_SCHEDULER_cancel (ti_check_download);
       curl_global_cleanup ();
     }
   if (transport != NULL)
       curl_global_cleanup ();
     }
   if (transport != NULL)
@@ -1645,7 +1619,6 @@ GNUNET_HOSTLIST_client_stop ()
   GNUNET_free_non_null (proxy);
   proxy = NULL;
   cfg = NULL;
   GNUNET_free_non_null (proxy);
   proxy = NULL;
   cfg = NULL;
-  sched = NULL;
 }
 
 /* end of hostlist-client.c */
 }
 
 /* end of hostlist-client.c */