X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fhostlist%2Fhostlist-client.c;h=049e78c52f10131fc068d549bbb690550812478f;hb=3c82a48a3a22b65b5f0db85528c1979ac0c878ed;hp=7d8bbec21882e49b9fe50984fabe357a6cc43f0c;hpb=2d5d446cd83d7af7e7bbb8156f0a40b03a5ef366;p=oweals%2Fgnunet.git diff --git a/src/hostlist/hostlist-client.c b/src/hostlist/hostlist-client.c index 7d8bbec21..049e78c52 100644 --- a/src/hostlist/hostlist-client.c +++ b/src/hostlist/hostlist-client.c @@ -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 - 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 @@ -108,31 +108,21 @@ struct Hostlist */ static const struct GNUNET_CONFIGURATION_Handle *cfg; -/** - * Our scheduler. - */ -static struct GNUNET_SCHEDULER_Handle *sched; - /** * Statistics handle. */ -struct GNUNET_STATISTICS_Handle *stats; +static struct GNUNET_STATISTICS_Handle *stats; /** * Transport handle. */ -struct GNUNET_TRANSPORT_Handle *transport; +static struct GNUNET_TRANSPORT_Handle *transport; /** * 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'. */ @@ -154,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; /** @@ -277,6 +267,7 @@ callback_download (void *ptr, 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; @@ -299,7 +290,7 @@ callback_download (void *ptr, 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); @@ -344,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 { @@ -486,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 @@ -578,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; } @@ -780,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, @@ -821,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"), @@ -1047,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); } @@ -1063,36 +1045,35 @@ static void 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_download_dispatcher_task = GNUNET_SCHEDULER_add_now ( sched, - &task_download_dispatcher, + ti_download_dispatcher_task = GNUNET_SCHEDULER_add_now (&task_download_dispatcher, NULL); } - static int once; - struct GNUNET_TIME_Relative delay; - if (stats == NULL) - { - curl_global_cleanup (); - return; /* in shutdown */ - } + { + curl_global_cleanup (); + 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) { @@ -1103,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); } @@ -1146,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); } @@ -1158,21 +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) { + GNUNET_assert (stat_connection_count < UINT_MAX); stat_connection_count++; GNUNET_STATISTICS_update (stats, gettext_noop ("# active connections"), 1, - GNUNET_NO); + GNUNET_NO); } @@ -1187,11 +1165,12 @@ handler_disconnect (void *cls, const struct GNUNET_PeerIdentity * peer) { + GNUNET_assert (stat_connection_count > 0); 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); } /** @@ -1200,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; @@ -1268,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); + 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; @@ -1303,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); } @@ -1319,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; } @@ -1342,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"), @@ -1376,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, ×_used)) && (GNUNET_OK == GNUNET_BIO_read_int64 (rh, &quality)) && (GNUNET_OK == GNUNET_BIO_read_int64 (rh, &last_used)) && @@ -1387,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, @@ -1432,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)) @@ -1442,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) { @@ -1455,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; @@ -1475,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))) { @@ -1510,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, @@ -1525,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); + 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, @@ -1557,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); } @@ -1568,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)) @@ -1588,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, @@ -1614,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) @@ -1648,7 +1619,6 @@ GNUNET_HOSTLIST_client_stop () GNUNET_free_non_null (proxy); proxy = NULL; cfg = NULL; - sched = NULL; } /* end of hostlist-client.c */