do not autostart nse
[oweals/gnunet.git] / src / hostlist / hostlist-client.c
index b4d86e052d8ae12db91bde90e1b768bf4ed4e196..049e78c52f10131fc068d549bbb690550812478f 100644 (file)
@@ -108,11 +108,6 @@ struct Hostlist
  */
 static const struct GNUNET_CONFIGURATION_Handle *cfg;
 
-/**
- * Our scheduler.
- */
-static struct GNUNET_SCHEDULER_Handle *sched;
-
 /**
  * Statistics handle.
  */
@@ -149,7 +144,7 @@ static CURL *curl;
 static CURLM *multi;
 
 /**
- *
+ * How many bytes did we download from the current hostlist URL?
  */
 static uint32_t stat_bytes_downloaded;
 /**
@@ -340,7 +335,7 @@ callback_download (void *ptr,
                                    1, 
                                    GNUNET_NO);
          stat_hellos_obtained++;
-         GNUNET_TRANSPORT_offer_hello (transport, msg);
+         GNUNET_TRANSPORT_offer_hello (transport, msg, NULL, NULL);
        }
       else
        {
@@ -574,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
-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_free (lowest_quality);
-
   stat_testing_hostlist = GNUNET_NO;
-  return;
 }
 
 
@@ -776,8 +764,7 @@ download_prepare ()
               "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,
@@ -817,7 +804,7 @@ task_download (void *cls,
       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"),
@@ -1043,8 +1030,7 @@ task_download_dispatcher (void *cls,
    {
      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);
    }
@@ -1068,8 +1054,7 @@ task_check (void *cls,
 
   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);
   }
 
@@ -1079,16 +1064,16 @@ task_check (void *cls,
     return; /* in shutdown */
   }
   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);
-  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,
-                         gettext_noop("# seconds between hostlist downloads"),
-                         hostlist_delay.value,
+                         gettext_noop("# milliseconds between hostlist downloads"),
+                         hostlist_delay.rel_value,
                          GNUNET_YES);
   if (0 == once)
     {
@@ -1099,9 +1084,8 @@ task_check (void *cls,
               _("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);
 }
@@ -1142,9 +1126,8 @@ task_hostlist_saving (void *cls,
 
   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);
 }
@@ -1154,27 +1137,20 @@ task_hostlist_saving (void *cls,
  *
  * @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,
-                struct GNUNET_TIME_Relative latency,
-                uint32_t distance)
+                const struct GNUNET_TRANSPORT_ATS_Information *atsi)
 {
-  unsigned int max = 0 ;
-  max --;
-
-  if (stat_connection_count < max)
-  {
+  GNUNET_assert (stat_connection_count < UINT_MAX);
   stat_connection_count++;
   GNUNET_STATISTICS_update (stats, 
                            gettext_noop ("# active connections"), 
                            1, 
                            GNUNET_NO);
-  }
 }
 
 
@@ -1192,9 +1168,9 @@ handler_disconnect (void *cls,
   GNUNET_assert (stat_connection_count > 0);
   stat_connection_count--;
   GNUNET_STATISTICS_update (stats,
-                            gettext_noop ("# active connections"),
-                            -1,
-                            GNUNET_NO);
+                           gettext_noop ("# active connections"),
+                           -1,
+                           GNUNET_NO);
 }
 
 /**
@@ -1203,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 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,
-    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;
@@ -1271,17 +1245,15 @@ handler_advertisement (void *cls,
 
   stat_testing_hostlist = GNUNET_YES;
   stat_testing_allowed = GNUNET_NO;
-  ti_testing_intervall_task = GNUNET_SCHEDULER_add_delayed (sched,
-                                                         TESTING_INTERVAL,
+  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",
-            TESTING_INTERVAL.value);
+            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;
@@ -1306,8 +1278,7 @@ primary_task (void *cls, int success)
   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);
 }
 
@@ -1322,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);
-  hostlist_delay.value = value;
+  hostlist_delay.rel_value = value;
   return GNUNET_OK;
 }
 
@@ -1345,10 +1316,10 @@ load_hostlist_file ()
   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"),
@@ -1379,6 +1350,7 @@ load_hostlist_file ()
 
   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)) &&
@@ -1390,8 +1362,8 @@ load_hostlist_file ()
       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,
@@ -1435,7 +1407,7 @@ static void save_hostlist_file ( int shutdown )
   uint32_t counter;
 
   if (GNUNET_OK !=
-      GNUNET_CONFIGURATION_get_value_string (cfg,
+      GNUNET_CONFIGURATION_get_value_filename (cfg,
                                              "HOSTLIST",
                                              "HOSTLISTFILE",
                                              &filename))
@@ -1445,6 +1417,11 @@ static void save_hostlist_file ( int shutdown )
                   "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)
     {
@@ -1458,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);
-
   /* add code to write hostlists to file using bio */
   ok = GNUNET_YES;
   counter = 0;
@@ -1478,9 +1454,9 @@ static void save_hostlist_file ( int shutdown )
               (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_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)))
            {
@@ -1513,7 +1489,6 @@ static void save_hostlist_file ( int shutdown )
  */
 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,
@@ -1528,14 +1503,13 @@ GNUNET_HOSTLIST_client_start (const struct GNUNET_CONFIGURATION_Handle *c,
       GNUNET_break (0);
       return GNUNET_SYSERR;
     }
-  transport = GNUNET_TRANSPORT_connect (s, c, NULL, 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;
-  sched = s;
   stats = st;
   if (GNUNET_OK !=
       GNUNET_CONFIGURATION_get_value_string (cfg,
@@ -1560,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"),
-              (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);
   }
@@ -1571,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;
-    if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_string (cfg,
+    if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_filename (cfg,
                                                             "HOSTLIST",
                                                             "HOSTLISTFILE",
                                                             &filename))
@@ -1591,7 +1564,7 @@ GNUNET_HOSTLIST_client_start (const struct GNUNET_CONFIGURATION_Handle *c,
   }
   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,
@@ -1617,29 +1590,24 @@ GNUNET_HOSTLIST_client_stop ()
 
   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)
     {
-      GNUNET_SCHEDULER_cancel (sched,
-          ti_download_dispatcher_task);
+      GNUNET_SCHEDULER_cancel (ti_download_dispatcher_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)
     {
-      GNUNET_SCHEDULER_cancel (sched,
-                               ti_download);
+      GNUNET_SCHEDULER_cancel (ti_download);
     }
   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)
@@ -1651,7 +1619,6 @@ GNUNET_HOSTLIST_client_stop ()
   GNUNET_free_non_null (proxy);
   proxy = NULL;
   cfg = NULL;
-  sched = NULL;
 }
 
 /* end of hostlist-client.c */