X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fpeerinfo%2Fgnunet-service-peerinfo.c;h=c93072de30895f36ebdf1be9a9a75050d8c7669f;hb=c1fe0ed0ba3d599f5b593ad863b69f73e7fd4625;hp=a2a66bd6272404d024d91d1652503e323bf334de;hpb=4465acf38d8cb43d06f45ac631586caa334a5fd8;p=oweals%2Fgnunet.git diff --git a/src/peerinfo/gnunet-service-peerinfo.c b/src/peerinfo/gnunet-service-peerinfo.c index a2a66bd62..c93072de3 100644 --- a/src/peerinfo/gnunet-service-peerinfo.c +++ b/src/peerinfo/gnunet-service-peerinfo.c @@ -1,6 +1,6 @@ /* This file is part of GNUnet. - (C) 2001, 2002, 2004, 2005, 2007, 2009, 2010, 2012 Christian Grothoff (and other contributing authors) + (C) 2001-2014 Christian Grothoff (and other contributing authors) GNUnet is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -26,9 +26,6 @@ * structure of data/hosts/). * * @author Christian Grothoff - * - * TODO: - * - notify clients when addresses in HELLO expire (#1933) */ #include "platform.h" @@ -77,17 +74,18 @@ struct HostEntry */ struct TransmitContext { - /** - * Server transmit context - */ - struct GNUNET_SERVER_TransmitContext *tc; - - /** - * Include friend only HELLOs GNUNET_YES or _NO - */ - int friend_only; + /** + * Server transmit context + */ + struct GNUNET_SERVER_TransmitContext *tc; + + /** + * Include friend only HELLOs #GNUNET_YES or #GNUNET_NO + */ + int friend_only; }; + /** * Result of reading a file */ @@ -110,25 +108,25 @@ struct ReadHostFileContext */ struct NotificationContext { - /** - * Next in DLL - */ - struct NotificationContext *prev; - - /** - * Previous in DLL - */ - struct NotificationContext *next; - - /** - * Server client - */ - struct GNUNET_SERVER_Client *client; - - /** - * Interested in friend only HELLO? - */ - int include_friend_only; + /** + * Next in DLL + */ + struct NotificationContext *prev; + + /** + * Previous in DLL + */ + struct NotificationContext *next; + + /** + * Server client + */ + struct GNUNET_SERVER_Client *client; + + /** + * Interested in friend only HELLO? + */ + int include_friend_only; }; @@ -136,7 +134,7 @@ struct NotificationContext * The in-memory list of known hosts, mapping of * host IDs to 'struct HostEntry*' values. */ -static struct GNUNET_CONTAINER_MultiHashMap *hostmap; +static struct GNUNET_CONTAINER_MultiPeerMap *hostmap; /** * Clients to immediately notify about all changes. @@ -169,10 +167,12 @@ static struct NotificationContext *nc_tail; * given host entry changing. * * @param he entry of the host for which we generate a notification + * @param include_friend_only create public of friend-only message * @return generated notification message */ static struct InfoMessage * -make_info_message (const struct HostEntry *he, int include_friend_only) +make_info_message (const struct HostEntry *he, + int include_friend_only) { struct InfoMessage *im; struct GNUNET_HELLO_Message *src; @@ -200,15 +200,16 @@ make_info_message (const struct HostEntry *he, int include_friend_only) * @param cls pointer to the current time * @param address the address * @param expiration expiration time for the address - * @return GNUNET_NO if expiration smaller than the current time + * @return #GNUNET_NO if expiration smaller than the current time */ static int -discard_expired (void *cls, const struct GNUNET_HELLO_Address *address, +discard_expired (void *cls, + const struct GNUNET_HELLO_Address *address, struct GNUNET_TIME_Absolute expiration) { const struct GNUNET_TIME_Absolute *now = cls; - if (now->abs_value > expiration.abs_value) + if (now->abs_value_us > expiration.abs_value_us) { GNUNET_log (GNUNET_ERROR_TYPE_INFO, _("Removing expired address of transport `%s'\n"), @@ -225,10 +226,11 @@ discard_expired (void *cls, const struct GNUNET_HELLO_Address *address, * @param cls pointer to the counter * @param address the address * @param expiration expiration time for the address - * @return GNUNET_OK (always) + * @return #GNUNET_OK (always) */ static int -count_addresses (void *cls, const struct GNUNET_HELLO_Address *address, +count_addresses (void *cls, + const struct GNUNET_HELLO_Address *address, struct GNUNET_TIME_Absolute expiration) { unsigned int *cnt = cls; @@ -248,13 +250,12 @@ count_addresses (void *cls, const struct GNUNET_HELLO_Address *address, static char * get_host_filename (const struct GNUNET_PeerIdentity *id) { - struct GNUNET_CRYPTO_HashAsciiEncoded fil; char *fn; if (NULL == networkIdDirectory) return NULL; - GNUNET_CRYPTO_hash_to_enc (&id->hashPubKey, &fil); - GNUNET_asprintf (&fn, "%s%s%s", networkIdDirectory, DIR_SEPARATOR_STR, &fil); + GNUNET_asprintf (&fn, "%s%s%s", networkIdDirectory, DIR_SEPARATOR_STR, + GNUNET_i2s_full (id)); return fn; } @@ -274,25 +275,26 @@ notify_all (struct HostEntry *entry) msg_pub = make_info_message (entry, GNUNET_NO); msg_friend = make_info_message (entry, GNUNET_YES); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Notifying all clients about peer `%s'\n", - GNUNET_i2s(&entry->identity)); - for (cur = nc_head; NULL != cur; cur = cur->next) - { - if (GNUNET_NO == cur->include_friend_only) - { - GNUNET_SERVER_notification_context_unicast (notify_list, - cur->client, - &msg_pub->header, - GNUNET_NO); - } - if (GNUNET_YES == cur->include_friend_only) - { - GNUNET_SERVER_notification_context_unicast (notify_list, - cur->client, - &msg_friend->header, - GNUNET_NO); - } - } + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Notifying all clients about peer `%s'\n", + GNUNET_i2s(&entry->identity)); + for (cur = nc_head; NULL != cur; cur = cur->next) + { + if (GNUNET_NO == cur->include_friend_only) + { + GNUNET_SERVER_notification_context_unicast (notify_list, + cur->client, + &msg_pub->header, + GNUNET_NO); + } + if (GNUNET_YES == cur->include_friend_only) + { + GNUNET_SERVER_notification_context_unicast (notify_list, + cur->client, + &msg_friend->header, + GNUNET_NO); + } + } GNUNET_free (msg_pub); GNUNET_free (msg_friend); } @@ -311,183 +313,136 @@ update_hello (const struct GNUNET_PeerIdentity *peer, /** * Try to read the HELLOs in the given filename and discard expired - * addresses. Removes the file if one the HELLO is mal-formed. If all + * addresses. Removes the file if one the HELLO is malformed. If all * addresses are expired, the HELLO is also removed (but the HELLO * with the public key is still returned if it was found and valid). - * - * The file can contain up to two HELLO messages, a public and a friend only - * HELLO + * The file can contain multiple HELLO messages. * * @param fn name of the file - * @param unlink_garbage if GNUNET_YES, try to remove useless files + * @param unlink_garbage if #GNUNET_YES, try to remove useless files + * @param r ReadHostFileContext to store the resutl */ static void -read_host_file (const char *fn, int unlink_garbage, struct ReadHostFileContext *r) +read_host_file (const char *fn, + int unlink_garbage, + struct ReadHostFileContext *r) { char buffer[GNUNET_SERVER_MAX_MESSAGE_SIZE - 1] GNUNET_ALIGN; - const struct GNUNET_HELLO_Message *hello_1st; - const struct GNUNET_HELLO_Message *hello_2nd; - struct GNUNET_HELLO_Message *hello_clean_1st; - struct GNUNET_HELLO_Message *hello_clean_2nd; - int size_1st; - int size_2nd; - int size_total; + unsigned int size_total; struct GNUNET_TIME_Absolute now; unsigned int left; + const struct GNUNET_HELLO_Message *hello; + struct GNUNET_HELLO_Message *hello_clean; + unsigned read_pos; + int size_hello; - hello_1st = NULL; - hello_2nd = NULL; - hello_clean_1st = NULL; - hello_clean_2nd = NULL; - size_1st = 0; - size_2nd = 0; - size_total = 0; r->friend_only_hello = NULL; r->hello = NULL; if (GNUNET_YES != GNUNET_DISK_file_test (fn)) - { return; - } - size_total = GNUNET_DISK_fn_read (fn, buffer, sizeof (buffer)); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Read %u bytes from `%s'\n", size_total, fn); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Read %u bytes from `%s'\n", + size_total, + fn); if (size_total < sizeof (struct GNUNET_MessageHeader)) { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _("Failed to parse HELLO in file `%s': %s\n"), - fn, "Fail has invalid size"); - if ( (GNUNET_YES == unlink_garbage) && (0 != UNLINK (fn)) ) - GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, "unlink", fn); + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + _("Failed to parse HELLO in file `%s': %s\n"), + fn, "Fail has invalid size"); + if ( (GNUNET_YES == unlink_garbage) && + (0 != UNLINK (fn)) && + (ENOENT != errno) ) + GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, + "unlink", + fn); return; } - hello_1st = (const struct GNUNET_HELLO_Message *) buffer; - size_1st = ntohs (((struct GNUNET_MessageHeader *) &buffer)->size); - if (size_1st < sizeof (struct GNUNET_MessageHeader)) + read_pos = 0; + while (read_pos < size_total) { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _("Failed to parse HELLO in file `%s': %s %u \n"), - fn, "1st HELLO has invalid size of ", size_1st); - if ((GNUNET_YES == unlink_garbage) && (0 != UNLINK (fn))) - GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, "unlink", fn); - return; - } - if (size_1st != GNUNET_HELLO_size (hello_1st)) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _("Failed to parse HELLO in file `%s': %s \n"), - fn, "1st HELLO is invalid"); - if ((GNUNET_YES == unlink_garbage) && (0 != UNLINK (fn))) - GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, "unlink", fn); - return; - } + hello = (const struct GNUNET_HELLO_Message *) &buffer[read_pos]; + size_hello = GNUNET_HELLO_size (hello); + if (0 == size_hello) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + _("Failed to parse HELLO in file `%s'\n"), + fn); + if ((GNUNET_YES == unlink_garbage) && + (0 != UNLINK (fn)) && + (ENOENT != errno) ) + GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, + "unlink", + fn); + return; + } + + now = GNUNET_TIME_absolute_get (); + hello_clean = GNUNET_HELLO_iterate_addresses (hello, GNUNET_YES, + &discard_expired, &now); + if (NULL == hello_clean) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + _("Failed to parse HELLO in file `%s'\n"), + fn); + if ((GNUNET_YES == unlink_garbage) && + (0 != UNLINK (fn)) && + (ENOENT != errno) ) + GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, + "unlink", + fn); + return; + } + left = 0; + (void) GNUNET_HELLO_iterate_addresses (hello_clean, GNUNET_NO, + &count_addresses, &left); - if (size_total > size_1st) - { - hello_2nd = (const struct GNUNET_HELLO_Message *) &buffer[size_1st]; - size_2nd = ntohs (((const struct GNUNET_MessageHeader *) hello_2nd)->size); - if ((size_2nd < sizeof (struct GNUNET_MessageHeader)) || - (size_2nd != GNUNET_HELLO_size (hello_2nd))) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _("Failed to parse HELLO in file `%s': %s\n"), - fn, "2nd HELLO has wrong size"); - if ((GNUNET_YES == unlink_garbage) && (0 != UNLINK (fn))) - GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, "unlink", fn); - return; - } - } + if (0 == left) + { + GNUNET_free (hello_clean); + break; + } - if (size_total != (size_1st + size_2nd)) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _("Failed to parse HELLO in file `%s': %s\n"), - fn, "Multiple HELLOs but total size is wrong"); - if ((GNUNET_YES == unlink_garbage) && (0 != UNLINK (fn))) - GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, "unlink", fn); - return; + if (GNUNET_NO == GNUNET_HELLO_is_friend_only (hello_clean)) + { + if (NULL == r->hello) + r->hello = hello_clean; + else + { + GNUNET_break (0); + GNUNET_free (r->hello); + r->hello = hello_clean; + } + } + else + { + if (NULL == r->friend_only_hello) + r->friend_only_hello = hello_clean; + else + { + GNUNET_break (0); + GNUNET_free (r->friend_only_hello); + r->friend_only_hello = hello_clean; + } + } + read_pos += size_hello; } - now = GNUNET_TIME_absolute_get (); - hello_clean_1st = GNUNET_HELLO_iterate_addresses (hello_1st, GNUNET_YES, - &discard_expired, &now); - left = 0; - (void) GNUNET_HELLO_iterate_addresses (hello_1st, GNUNET_NO, - &count_addresses, &left); if (0 == left) { /* no addresses left, remove from disk */ - if ((GNUNET_YES == unlink_garbage) && (0 != UNLINK (fn))) - GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, "unlink", fn); - } - - if (GNUNET_NO == GNUNET_HELLO_is_friend_only(hello_clean_1st)) - { - if (NULL == r->hello) - r->hello = hello_clean_1st; - else - { - GNUNET_break (0); - GNUNET_free (r->hello); - r->hello = hello_clean_1st; - } - } - else - { - if (NULL == r->friend_only_hello) - r->friend_only_hello = hello_clean_1st; - else - { - GNUNET_break (0); - GNUNET_free (r->friend_only_hello); - r->friend_only_hello = hello_clean_1st; - } - } - - if (NULL != hello_2nd) - { - hello_clean_2nd = GNUNET_HELLO_iterate_addresses (hello_2nd, GNUNET_YES, - &discard_expired, &now); - left = 0; - (void) GNUNET_HELLO_iterate_addresses (hello_clean_2nd, GNUNET_NO, - &count_addresses, &left); - if (0 == left) - { - /* no addresses left, remove from disk */ - if ((GNUNET_YES == unlink_garbage) && (0 != UNLINK (fn))) - GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, "unlink", fn); - } - - if (GNUNET_NO == GNUNET_HELLO_is_friend_only(hello_clean_2nd)) - { - if (NULL == r->hello) - r->hello = hello_clean_2nd; - else - { - GNUNET_break (0); - GNUNET_free (r->hello); - r->hello = hello_clean_2nd; - } - } - else - { - if (NULL == r->friend_only_hello) - r->friend_only_hello = hello_clean_2nd; - else - { - GNUNET_break (0); - GNUNET_free (r->friend_only_hello); - r->friend_only_hello = hello_clean_2nd; - } - } + if ( (GNUNET_YES == unlink_garbage) && + (0 != UNLINK (fn)) ) + GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, + "unlink", + fn); } - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Found `%s' and `%s' HELLO message in file\n", - (NULL != r->hello) ? "public" : "NO public", - (NULL != r->friend_only_hello) ? "friend only" : "NO friend only"); - - + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Found `%s' and `%s' HELLO message in file\n", + (NULL != r->hello) ? "public" : "NON-public", + (NULL != r->friend_only_hello) ? "friend only" : "NO friend only"); } @@ -504,16 +459,17 @@ add_host_to_known_hosts (const struct GNUNET_PeerIdentity *identity) struct ReadHostFileContext r; char *fn; - entry = GNUNET_CONTAINER_multihashmap_get (hostmap, &identity->hashPubKey); + entry = GNUNET_CONTAINER_multipeermap_get (hostmap, identity); if (NULL == entry) { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding new peer `%s'\n", GNUNET_i2s (identity)); - GNUNET_STATISTICS_update (stats, gettext_noop ("# peers known"), 1, - GNUNET_NO); - entry = GNUNET_malloc (sizeof (struct HostEntry)); - entry->identity = *identity; - GNUNET_CONTAINER_multihashmap_put (hostmap, &entry->identity.hashPubKey, entry, - GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding new peer `%s'\n", GNUNET_i2s (identity)); + GNUNET_STATISTICS_update (stats, gettext_noop ("# peers known"), 1, + GNUNET_NO); + entry = GNUNET_new (struct HostEntry); + entry->identity = *identity; + GNUNET_assert (GNUNET_OK == + GNUNET_CONTAINER_multipeermap_put (hostmap, &entry->identity, entry, + GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)); notify_all (entry); fn = get_host_filename (identity); if (NULL != fn) @@ -558,10 +514,10 @@ remove_garbage (const char *fullname) struct DirScanContext { /** - * GNUNET_YES if we should remove files that are broken, - * GNUNET_NO if the directory we are iterating over should + * #GNUNET_YES if we should remove files that are broken, + * #GNUNET_NO if the directory we are iterating over should * be treated as read-only by us. - */ + */ int remove_files; /** @@ -579,7 +535,7 @@ struct DirScanContext * @param cls pointer to 'unsigned int' to increment for each file, or NULL * if the file is from a read-only, read-once resource directory * @param fullname name of the file to parse - * @return GNUNET_OK (continue iteration) + * @return #GNUNET_OK (continue iteration) */ static int hosts_directory_scan_callback (void *cls, const char *fullname) @@ -597,79 +553,75 @@ hosts_directory_scan_callback (void *cls, const char *fullname) filename = strrchr (fullname, DIR_SEPARATOR); if ((NULL == filename) || (1 > strlen (filename))) - filename = fullname; + filename = fullname; else filename ++; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Reading %s `%s'\n", fullname, filename); read_host_file (fullname, dsc->remove_files, &r); + if ( (NULL == r.hello) && (NULL == r.friend_only_hello)) + return GNUNET_OK; + if (NULL != r.friend_only_hello) + { + if (GNUNET_OK != GNUNET_HELLO_get_id (r.friend_only_hello, &id_friend)) + if (GNUNET_YES == dsc->remove_files) + { + remove_garbage (fullname); + return GNUNET_OK; + } + id = id_friend; + } + if (NULL != r.hello) + { + if (GNUNET_OK != GNUNET_HELLO_get_id (r.hello, &id_public)) + if (GNUNET_YES == dsc->remove_files) + { + remove_garbage (fullname); + return GNUNET_OK; + } + id = id_public; + } - if ( (NULL == r.hello) && (NULL == r.friend_only_hello)) - { + if ( (NULL != r.hello) && (NULL != r.friend_only_hello) && + (0 != memcmp (&id_friend, &id_public, sizeof (id_friend))) ) + { + /* HELLOs are not for the same peer */ + GNUNET_break (0); if (GNUNET_YES == dsc->remove_files) remove_garbage (fullname); return GNUNET_OK; - } - - if (NULL != r.friend_only_hello) - { - if (GNUNET_OK != GNUNET_HELLO_get_id (r.friend_only_hello, &id_friend)) - if (GNUNET_YES == dsc->remove_files) - { - remove_garbage (fullname); - return GNUNET_OK; - } - id = id_friend; - } - if (NULL != r.hello) - { - if (GNUNET_OK != GNUNET_HELLO_get_id (r.hello, &id_public)) - if (GNUNET_YES == dsc->remove_files) - { - remove_garbage (fullname); - return GNUNET_OK; - } - id = id_public; - } - - if ( (NULL != r.hello) && (NULL != r.friend_only_hello) && - (0 != memcmp (&id_friend, &id_public, sizeof (id_friend))) ) - { - /* HELLOs are not for the same peer */ - GNUNET_break (0); - if (GNUNET_YES == dsc->remove_files) - remove_garbage (fullname); - return GNUNET_OK; - } - if (GNUNET_OK == GNUNET_CRYPTO_hash_from_string (filename, &identity.hashPubKey)) + } + if (GNUNET_OK == GNUNET_CRYPTO_eddsa_public_key_from_string (filename, + strlen (filename), + &identity.public_key)) { - if (0 != memcmp (&id, &identity, sizeof (id_friend))) - { - /* HELLOs are not for the same peer */ - GNUNET_break (0); - if (GNUNET_YES == dsc->remove_files) - remove_garbage (fullname); - return GNUNET_OK; - } + if (0 != memcmp (&id, &identity, sizeof (id_friend))) + { + /* HELLOs are not for the same peer */ + GNUNET_break (0); + if (GNUNET_YES == dsc->remove_files) + remove_garbage (fullname); + return GNUNET_OK; + } } - /* ok, found something valid, remember HELLO */ + + /* ok, found something valid, remember HELLO */ add_host_to_known_hosts (&id); if (NULL != r.hello) { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Updating peer `%s' public HELLO \n", - GNUNET_i2s (&id)); - update_hello (&id, r.hello); - GNUNET_free (r.hello); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Updating peer `%s' public HELLO \n", + GNUNET_i2s (&id)); + update_hello (&id, r.hello); + GNUNET_free (r.hello); } if (NULL != r.friend_only_hello) { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Updating peer `%s' friend only HELLO \n", - GNUNET_i2s (&id)); - update_hello (&id, r.friend_only_hello); - GNUNET_free (r.friend_only_hello); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Updating peer `%s' friend only HELLO \n", + GNUNET_i2s (&id)); + update_hello (&id, r.friend_only_hello); + GNUNET_free (r.friend_only_hello); } - dsc->matched++; - return GNUNET_OK; + dsc->matched++; + return GNUNET_OK; } @@ -704,7 +656,7 @@ cron_scan_directory_data_hosts (void *cls, if ((0 == dsc.matched) && (0 == (++retries & 31))) GNUNET_log (GNUNET_ERROR_TYPE_WARNING | GNUNET_ERROR_TYPE_BULK, _("Still no peers found in `%s'!\n"), networkIdDirectory); - GNUNET_SCHEDULER_add_delayed_with_priority (DATA_HOST_FREQ, + GNUNET_SCHEDULER_add_delayed_with_priority (DATA_HOST_FREQ, GNUNET_SCHEDULER_PRIORITY_IDLE, &cron_scan_directory_data_hosts, NULL); @@ -713,27 +665,31 @@ cron_scan_directory_data_hosts (void *cls, static struct GNUNET_HELLO_Message * update_friend_hello (const struct GNUNET_HELLO_Message *hello, - const struct GNUNET_HELLO_Message *friend_hello) + const struct GNUNET_HELLO_Message *friend_hello) { - struct GNUNET_HELLO_Message * res; - struct GNUNET_HELLO_Message * tmp; - struct GNUNET_CRYPTO_EccPublicKeyBinaryEncoded pk; - - if (NULL != friend_hello) - { - res = GNUNET_HELLO_merge (hello, friend_hello); - GNUNET_assert (GNUNET_YES == GNUNET_HELLO_is_friend_only (res)); - return res; - } - - GNUNET_HELLO_get_key (hello, &pk); - tmp = GNUNET_HELLO_create (&pk, NULL, NULL, GNUNET_YES); - res = GNUNET_HELLO_merge (hello, tmp); - GNUNET_free (tmp); - GNUNET_assert (GNUNET_YES == GNUNET_HELLO_is_friend_only (res)); - return res; -} + struct GNUNET_HELLO_Message * res; + struct GNUNET_HELLO_Message * tmp; + struct GNUNET_CRYPTO_EddsaPublicKey pk; + + if (NULL != friend_hello) + { + res = GNUNET_HELLO_merge (hello, friend_hello); + GNUNET_assert (GNUNET_YES == GNUNET_HELLO_is_friend_only (res)); + return res; + } + if (GNUNET_OK != + GNUNET_HELLO_get_key (hello, &pk)) + { + GNUNET_break (0); + return NULL; + } + tmp = GNUNET_HELLO_create (&pk, NULL, NULL, GNUNET_YES); + res = GNUNET_HELLO_merge (hello, tmp); + GNUNET_free (tmp); + GNUNET_assert (GNUNET_YES == GNUNET_HELLO_is_friend_only (res)); + return res; +} /** @@ -759,7 +715,7 @@ update_hello (const struct GNUNET_PeerIdentity *peer, int pos; char *buffer; - host = GNUNET_CONTAINER_multihashmap_get (hostmap, &peer->hashPubKey); + host = GNUNET_CONTAINER_multipeermap_get (hostmap, peer); GNUNET_assert (NULL != host); friend_hello_type = GNUNET_HELLO_is_friend_only (hello); @@ -770,23 +726,23 @@ update_hello (const struct GNUNET_PeerIdentity *peer, dest = NULL; if (GNUNET_YES == friend_hello_type) { - dest = &host->friend_only_hello; + dest = &host->friend_only_hello; } else { - dest = &host->hello; + dest = &host->hello; } if (NULL == (*dest)) { - (*dest) = GNUNET_malloc (GNUNET_HELLO_size (hello)); + (*dest) = GNUNET_malloc (GNUNET_HELLO_size (hello)); memcpy ((*dest), hello, GNUNET_HELLO_size (hello)); } else { mrg = GNUNET_HELLO_merge ((*dest), hello); delta = GNUNET_HELLO_equals (mrg, (*dest), GNUNET_TIME_absolute_get ()); - if (delta.abs_value == GNUNET_TIME_UNIT_FOREVER_ABS.abs_value) + if (delta.abs_value_us == GNUNET_TIME_UNIT_FOREVER_ABS.abs_value_us) { /* no differences, just ignore the update */ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "No change in %s HELLO for `%s'\n", @@ -801,84 +757,82 @@ update_hello (const struct GNUNET_PeerIdentity *peer, if ((NULL != (host->hello)) && (GNUNET_NO == friend_hello_type)) { - /* Update friend only hello */ - mrg = update_friend_hello (host->hello, host->friend_only_hello); - if (NULL != host->friend_only_hello) - GNUNET_free (host->friend_only_hello); - host->friend_only_hello = mrg; + /* Update friend only hello */ + mrg = update_friend_hello (host->hello, host->friend_only_hello); + if (NULL != host->friend_only_hello) + GNUNET_free (host->friend_only_hello); + host->friend_only_hello = mrg; } if (NULL != host->hello) - GNUNET_assert ((GNUNET_NO == GNUNET_HELLO_is_friend_only (host->hello))); + GNUNET_assert ((GNUNET_NO == GNUNET_HELLO_is_friend_only (host->hello))); if (NULL != host->friend_only_hello) - GNUNET_assert ((GNUNET_YES == GNUNET_HELLO_is_friend_only(host->friend_only_hello))); - - store_hello = GNUNET_NO; - store_friend_hello = GNUNET_NO; - fn = get_host_filename (peer); - if ( (NULL != fn) && - (GNUNET_OK == GNUNET_DISK_directory_create_for_file (fn)) ) - { - - store_hello = GNUNET_NO; - size = 0; - cnt = 0; - if (NULL != host->hello) - (void) GNUNET_HELLO_iterate_addresses (host->hello, - GNUNET_NO, &count_addresses, &cnt); - if (cnt > 0) - { - store_hello = GNUNET_YES; - size += GNUNET_HELLO_size (host->hello); - } - cnt = 0; - if (NULL != host->friend_only_hello) - (void) GNUNET_HELLO_iterate_addresses (host->friend_only_hello, GNUNET_NO, - &count_addresses, &cnt); - if (0 < cnt) - { - store_friend_hello = GNUNET_YES; - size += GNUNET_HELLO_size (host->friend_only_hello); - } - - if ((GNUNET_NO == store_hello) && (GNUNET_NO == store_friend_hello)) - { - /* no valid addresses, don't put HELLO on disk; in fact, - if one exists on disk, remove it */ - (void) UNLINK (fn); - } - else - { - buffer = GNUNET_malloc (size); - pos = 0; - - if (GNUNET_YES == store_hello) - { - memcpy (buffer, host->hello, GNUNET_HELLO_size (host->hello)); - pos += GNUNET_HELLO_size (host->hello); - } - if (GNUNET_YES == store_friend_hello) - { - memcpy (&buffer[pos], host->friend_only_hello, GNUNET_HELLO_size (host->friend_only_hello)); - pos += GNUNET_HELLO_size (host->friend_only_hello); - } - GNUNET_assert (pos == size); - - if (GNUNET_SYSERR == GNUNET_DISK_fn_write (fn, buffer, size, - GNUNET_DISK_PERM_USER_READ | - GNUNET_DISK_PERM_USER_WRITE | - GNUNET_DISK_PERM_GROUP_READ | - GNUNET_DISK_PERM_OTHER_READ)) - GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, "write", fn); - else - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Stored %s %s HELLO in %s with total size %u\n", - (GNUNET_YES == store_friend_hello) ? "friend-only": "", - (GNUNET_YES == store_hello) ? "public": "", - fn, size); - GNUNET_free (buffer); - } + GNUNET_assert ((GNUNET_YES == GNUNET_HELLO_is_friend_only(host->friend_only_hello))); + + fn = get_host_filename (peer); + if ( (NULL != fn) && + (GNUNET_OK == GNUNET_DISK_directory_create_for_file (fn)) ) + { + store_hello = GNUNET_NO; + size = 0; + cnt = 0; + if (NULL != host->hello) + (void) GNUNET_HELLO_iterate_addresses (host->hello, + GNUNET_NO, &count_addresses, &cnt); + if (cnt > 0) + { + store_hello = GNUNET_YES; + size += GNUNET_HELLO_size (host->hello); + } + cnt = 0; + if (NULL != host->friend_only_hello) + (void) GNUNET_HELLO_iterate_addresses (host->friend_only_hello, GNUNET_NO, + &count_addresses, &cnt); + store_friend_hello = GNUNET_NO; + if (0 < cnt) + { + store_friend_hello = GNUNET_YES; + size += GNUNET_HELLO_size (host->friend_only_hello); + } + + if ((GNUNET_NO == store_hello) && (GNUNET_NO == store_friend_hello)) + { + /* no valid addresses, don't put HELLO on disk; in fact, + if one exists on disk, remove it */ + (void) UNLINK (fn); + } + else + { + buffer = GNUNET_malloc (size); + pos = 0; + + if (GNUNET_YES == store_hello) + { + memcpy (buffer, host->hello, GNUNET_HELLO_size (host->hello)); + pos += GNUNET_HELLO_size (host->hello); + } + if (GNUNET_YES == store_friend_hello) + { + memcpy (&buffer[pos], host->friend_only_hello, GNUNET_HELLO_size (host->friend_only_hello)); + pos += GNUNET_HELLO_size (host->friend_only_hello); + } + GNUNET_assert (pos == size); + + if (GNUNET_SYSERR == GNUNET_DISK_fn_write (fn, buffer, size, + GNUNET_DISK_PERM_USER_READ | + GNUNET_DISK_PERM_USER_WRITE | + GNUNET_DISK_PERM_GROUP_READ | + GNUNET_DISK_PERM_OTHER_READ)) + GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, "write", fn); + else + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Stored %s %s HELLO in %s with total size %u\n", + (GNUNET_YES == store_friend_hello) ? "friend-only": "", + (GNUNET_YES == store_hello) ? "public": "", + fn, size); + GNUNET_free (buffer); + } } - GNUNET_free_non_null (fn); + GNUNET_free_non_null (fn); notify_all (host); } @@ -889,10 +843,10 @@ update_hello (const struct GNUNET_PeerIdentity *peer, * @param cls NULL to hit all hosts, otherwise specifies a particular target * @param key hostID * @param value information to transmit - * @return GNUNET_YES (continue to iterate) + * @return #GNUNET_YES (continue to iterate) */ static int -add_to_tc (void *cls, const struct GNUNET_HashCode * key, void *value) +add_to_tc (void *cls, const struct GNUNET_PeerIdentity *key, void *value) { struct TransmitContext *tc = cls; struct HostEntry *pos = value; @@ -910,8 +864,9 @@ add_to_tc (void *cls, const struct GNUNET_HashCode * key, void *value) GNUNET_assert (hs < GNUNET_SERVER_MAX_MESSAGE_SIZE - sizeof (struct InfoMessage)); memcpy (&im[1], pos->hello, hs); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending public HELLO with size %u for peer `%4s'\n", - hs, GNUNET_h2s (key)); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Sending public HELLO with size %u for peer `%4s'\n", + hs, GNUNET_i2s (key)); } else if ((pos->friend_only_hello != NULL) && (GNUNET_YES == tc->friend_only)) { @@ -920,13 +875,15 @@ add_to_tc (void *cls, const struct GNUNET_HashCode * key, void *value) GNUNET_assert (hs < GNUNET_SERVER_MAX_MESSAGE_SIZE - sizeof (struct InfoMessage)); memcpy (&im[1], pos->friend_only_hello, hs); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending friend-only HELLO with size %u for peer `%4s'\n", - hs, GNUNET_h2s (key)); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Sending friend-only HELLO with size %u for peer `%4s'\n", + hs, GNUNET_i2s (key)); } else { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding no HELLO for peer `%s'\n", - GNUNET_h2s (key)); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Adding no HELLO for peer `%s'\n", + GNUNET_i2s (key)); } im->header.type = htons (GNUNET_MESSAGE_TYPE_PEERINFO_INFO); @@ -943,7 +900,7 @@ add_to_tc (void *cls, const struct GNUNET_HashCode * key, void *value) * * @param cls pointer to current time (struct GNUNET_TIME_Absolute) * @param fn filename to test to see if the HELLO expired - * @return GNUNET_OK (continue iteration) + * @return #GNUNET_OK (continue iteration) */ static int discard_hosts_helper (void *cls, const char *fn) @@ -952,44 +909,74 @@ discard_hosts_helper (void *cls, const char *fn) char buffer[GNUNET_SERVER_MAX_MESSAGE_SIZE - 1] GNUNET_ALIGN; const struct GNUNET_HELLO_Message *hello; struct GNUNET_HELLO_Message *new_hello; - int size; + int read_size; + unsigned int cur_hello_size; + unsigned int new_hello_size; + int read_pos; + int write_pos; unsigned int cnt; + char *writebuffer; - size = GNUNET_DISK_fn_read (fn, buffer, sizeof (buffer)); - if (size < sizeof (struct GNUNET_MessageHeader)) + + read_size = GNUNET_DISK_fn_read (fn, buffer, sizeof (buffer)); + if (read_size < sizeof (struct GNUNET_MessageHeader)) { if (0 != UNLINK (fn)) GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING | GNUNET_ERROR_TYPE_BULK, "unlink", fn); return GNUNET_OK; } - hello = (const struct GNUNET_HELLO_Message *) buffer; - new_hello = - GNUNET_HELLO_iterate_addresses (hello, GNUNET_YES, &discard_expired, now); - cnt = 0; - if (NULL != new_hello) - (void) GNUNET_HELLO_iterate_addresses (hello, GNUNET_NO, &count_addresses, &cnt); - if ( (NULL != new_hello) && (0 < cnt) ) + + writebuffer = GNUNET_malloc (read_size); + read_pos = 0; + write_pos = 0; + while (read_pos < read_size) { - GNUNET_DISK_fn_write (fn, new_hello, GNUNET_HELLO_size (new_hello), - GNUNET_DISK_PERM_USER_READ | - GNUNET_DISK_PERM_USER_WRITE | - GNUNET_DISK_PERM_GROUP_READ | - GNUNET_DISK_PERM_OTHER_READ); + /* Check each HELLO */ + hello = (const struct GNUNET_HELLO_Message *) &buffer[read_pos]; + cur_hello_size = GNUNET_HELLO_size (hello); + if (0 == cur_hello_size) + { + /* Invalid data, discard */ + if (0 != UNLINK (fn)) + GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING | + GNUNET_ERROR_TYPE_BULK, "unlink", fn); + return GNUNET_OK; + } + new_hello = GNUNET_HELLO_iterate_addresses (hello, GNUNET_YES, &discard_expired, now); + cnt = 0; + if (NULL != new_hello) + (void) GNUNET_HELLO_iterate_addresses (hello, GNUNET_NO, &count_addresses, &cnt); + if ( (NULL != new_hello) && (0 < cnt) ) + { + /* Store new HELLO to write it when done */ + new_hello_size = GNUNET_HELLO_size (new_hello); + memcpy (&writebuffer[write_pos], new_hello, new_hello_size); + write_pos += new_hello_size; + } + read_pos += cur_hello_size; + GNUNET_free_non_null (new_hello); } - else + + if (0 < write_pos) { - if (0 != UNLINK (fn)) - GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING | - GNUNET_ERROR_TYPE_BULK, "unlink", fn); + GNUNET_DISK_fn_write (fn, writebuffer,write_pos, + GNUNET_DISK_PERM_USER_READ | + GNUNET_DISK_PERM_USER_WRITE | + GNUNET_DISK_PERM_GROUP_READ | + GNUNET_DISK_PERM_OTHER_READ); } - GNUNET_free_non_null (new_hello); + else if (0 != UNLINK (fn)) + GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING | + GNUNET_ERROR_TYPE_BULK, "unlink", fn); + + GNUNET_free (writebuffer); return GNUNET_OK; } /** - * Call this method periodically to scan data/hosts for ancient + * Call this method periodically to scan peerinfo/ for ancient * HELLOs to expire. * * @param cls unused @@ -1003,6 +990,8 @@ cron_clean_data_hosts (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN)) return; now = GNUNET_TIME_absolute_get (); + GNUNET_log (GNUNET_ERROR_TYPE_INFO | GNUNET_ERROR_TYPE_BULK, + _("Cleaning up directory `%s'\n"), networkIdDirectory); GNUNET_DISK_directory_scan (networkIdDirectory, &discard_hosts_helper, &now); GNUNET_SCHEDULER_add_delayed (DATA_HOST_CLEAN_FREQ, &cron_clean_data_hosts, NULL); @@ -1057,7 +1046,7 @@ handle_get (void *cls, struct GNUNET_SERVER_Client *client, "GET", GNUNET_i2s (&lpm->peer)); tcx.friend_only = ntohl (lpm->include_friend_only); tcx.tc = GNUNET_SERVER_transmit_context_create (client); - GNUNET_CONTAINER_multihashmap_get_multiple (hostmap, &lpm->peer.hashPubKey, + GNUNET_CONTAINER_multipeermap_get_multiple (hostmap, &lpm->peer, &add_to_tc, &tcx); GNUNET_SERVER_transmit_context_append_data (tcx.tc, NULL, 0, GNUNET_MESSAGE_TYPE_PEERINFO_INFO_END); @@ -1083,7 +1072,7 @@ handle_get_all (void *cls, struct GNUNET_SERVER_Client *client, tcx.friend_only = ntohl (lapm->include_friend_only); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "`%s' message received\n", "GET_ALL"); tcx.tc = GNUNET_SERVER_transmit_context_create (client); - GNUNET_CONTAINER_multihashmap_iterate (hostmap, &add_to_tc, &tcx); + GNUNET_CONTAINER_multipeermap_iterate (hostmap, &add_to_tc, &tcx); GNUNET_SERVER_transmit_context_append_data (tcx.tc, NULL, 0, GNUNET_MESSAGE_TYPE_PEERINFO_INFO_END); GNUNET_SERVER_transmit_context_run (tcx.tc, GNUNET_TIME_UNIT_FOREVER_REL); @@ -1095,36 +1084,36 @@ handle_get_all (void *cls, struct GNUNET_SERVER_Client *client, * Pass the given client the information we have in the respective * host entry; the client is already in the notification context. * - * @param cls the 'struct GNUNET_SERVER_Client' to notify + * @param cls the `struct GNUNET_SERVER_Client` to notify * @param key key for the value (unused) - * @param value the 'struct HostEntry' to notify the client about - * @return GNUNET_YES (always, continue to iterate) + * @param value the `struct HostEntry` to notify the client about + * @return #GNUNET_YES (always, continue to iterate) */ static int -do_notify_entry (void *cls, const struct GNUNET_HashCode * key, void *value) +do_notify_entry (void *cls, const struct GNUNET_PeerIdentity *key, void *value) { - struct NotificationContext *nc = cls; + struct NotificationContext *nc = cls; struct HostEntry *he = value; struct InfoMessage *msg; - if ((NULL == he->hello) && (GNUNET_NO == nc->include_friend_only)) - { - /* We have no public hello */ - return GNUNET_YES; - } - + if ((NULL == he->hello) && (GNUNET_NO == nc->include_friend_only)) + { + /* We have no public hello */ + return GNUNET_YES; + } - if ((NULL == he->friend_only_hello) && GNUNET_YES == nc->include_friend_only) - { - /* We have no friend hello */ - return GNUNET_YES; - } + if ( (NULL == he->friend_only_hello) && + (GNUNET_YES == nc->include_friend_only) ) + { + /* We have no friend hello */ + return GNUNET_YES; + } - msg = make_info_message (he, nc->include_friend_only); - GNUNET_SERVER_notification_context_unicast (notify_list, - nc->client, - &msg->header, - GNUNET_NO); + msg = make_info_message (he, nc->include_friend_only); + GNUNET_SERVER_notification_context_unicast (notify_list, + nc->client, + &msg->header, + GNUNET_NO); GNUNET_free (msg); return GNUNET_YES; } @@ -1144,16 +1133,17 @@ handle_notify (void *cls, struct GNUNET_SERVER_Client *client, struct NotifyMessage *nm = (struct NotifyMessage *) message; struct NotificationContext *nc; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "`%s' message received\n", "NOTIFY"); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "`%s' message received\n", + "NOTIFY"); + nc = GNUNET_new (struct NotificationContext); + nc->client = client; + nc->include_friend_only = ntohl (nm->include_friend_only); - nc = GNUNET_malloc (sizeof (struct NotificationContext)); - nc->client = client; - nc->include_friend_only = ntohl (nm->include_friend_only); - - GNUNET_CONTAINER_DLL_insert (nc_head, nc_tail, nc); + GNUNET_CONTAINER_DLL_insert (nc_head, nc_tail, nc); GNUNET_SERVER_client_mark_monitor (client); GNUNET_SERVER_notification_context_add (notify_list, client); - GNUNET_CONTAINER_multihashmap_iterate (hostmap, &do_notify_entry, nc); + GNUNET_CONTAINER_multipeermap_iterate (hostmap, &do_notify_entry, nc); GNUNET_SERVER_receive_done (client, GNUNET_OK); } @@ -1164,19 +1154,18 @@ handle_notify (void *cls, struct GNUNET_SERVER_Client *client, * @param cls unused * @param client server client */ -static void disconnect_cb (void *cls,struct GNUNET_SERVER_Client *client) +static void +disconnect_cb (void *cls,struct GNUNET_SERVER_Client *client) { - struct NotificationContext *cur; - - for (cur = nc_head; NULL != cur; cur = cur->next) - if (cur->client == client) - break; - - if (NULL == cur) - return; + struct NotificationContext *cur; - GNUNET_CONTAINER_DLL_remove (nc_head, nc_tail, cur); - GNUNET_free (cur); + for (cur = nc_head; NULL != cur; cur = cur->next) + if (cur->client == client) + break; + if (NULL == cur) + return; + GNUNET_CONTAINER_DLL_remove (nc_head, nc_tail, cur); + GNUNET_free (cur); } @@ -1185,11 +1174,13 @@ static void disconnect_cb (void *cls,struct GNUNET_SERVER_Client *client) * * @param cls NULL * @param key key of the host entry - * @param value the 'struct HostEntry' to free - * @return GNUNET_YES (continue to iterate) + * @param value the `struct HostEntry` to free + * @return #GNUNET_YES (continue to iterate) */ static int -free_host_entry (void *cls, const struct GNUNET_HashCode * key, void *value) +free_host_entry (void *cls, + const struct GNUNET_PeerIdentity *key, + void *value) { struct HostEntry *he = value; @@ -1207,22 +1198,23 @@ free_host_entry (void *cls, const struct GNUNET_HashCode * key, void *value) * @param tc scheduler task context, unused */ static void -shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) +shutdown_task (void *cls, + const struct GNUNET_SCHEDULER_TaskContext *tc) { - struct NotificationContext *cur; - struct NotificationContext *next; - GNUNET_SERVER_notification_context_destroy (notify_list); - notify_list = NULL; + struct NotificationContext *cur; + struct NotificationContext *next; - for (cur = nc_head; NULL != cur; cur = next) - { - next = cur->next; - GNUNET_CONTAINER_DLL_remove (nc_head, nc_tail, cur); - GNUNET_free (cur); - } + GNUNET_SERVER_notification_context_destroy (notify_list); + notify_list = NULL; - GNUNET_CONTAINER_multihashmap_iterate (hostmap, &free_host_entry, NULL); - GNUNET_CONTAINER_multihashmap_destroy (hostmap); + for (cur = nc_head; NULL != cur; cur = next) + { + next = cur->next; + GNUNET_CONTAINER_DLL_remove (nc_head, nc_tail, cur); + GNUNET_free (cur); + } + GNUNET_CONTAINER_multipeermap_iterate (hostmap, &free_host_entry, NULL); + GNUNET_CONTAINER_multipeermap_destroy (hostmap); if (NULL != stats) { GNUNET_STATISTICS_destroy (stats, GNUNET_NO); @@ -1256,47 +1248,55 @@ run (void *cls, struct GNUNET_SERVER_Handle *server, char *ip; struct DirScanContext dsc; int noio; + int use_included; - hostmap = GNUNET_CONTAINER_multihashmap_create (1024, GNUNET_YES); + hostmap = GNUNET_CONTAINER_multipeermap_create (1024, GNUNET_YES); stats = GNUNET_STATISTICS_create ("peerinfo", cfg); notify_list = GNUNET_SERVER_notification_context_create (server, 0); noio = GNUNET_CONFIGURATION_get_value_yesno (cfg, "peerinfo", "NO_IO"); + use_included = GNUNET_CONFIGURATION_get_value_yesno (cfg, "peerinfo", "USE_INCLUDED_HELLOS"); + GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &shutdown_task, + NULL); if (GNUNET_YES != noio) { GNUNET_assert (GNUNET_OK == GNUNET_CONFIGURATION_get_value_filename (cfg, "peerinfo", "HOSTS", &networkIdDirectory)); - GNUNET_DISK_directory_create (networkIdDirectory); + if (GNUNET_OK != + GNUNET_DISK_directory_create (networkIdDirectory)) + { + GNUNET_SCHEDULER_shutdown (); + return; + } GNUNET_SCHEDULER_add_with_priority (GNUNET_SCHEDULER_PRIORITY_IDLE, - &cron_scan_directory_data_hosts, NULL); /* CHECK */ + &cron_scan_directory_data_hosts, NULL); GNUNET_SCHEDULER_add_with_priority (GNUNET_SCHEDULER_PRIORITY_IDLE, - &cron_clean_data_hosts, NULL); /* CHECK */ - - ip = GNUNET_OS_installation_get_path (GNUNET_OS_IPK_DATADIR); - GNUNET_asprintf (&peerdir, + &cron_clean_data_hosts, NULL); + if (GNUNET_YES == use_included) + { + ip = GNUNET_OS_installation_get_path (GNUNET_OS_IPK_DATADIR); + GNUNET_asprintf (&peerdir, "%shellos", ip); - GNUNET_free (ip); + GNUNET_free (ip); - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - _("Importing HELLOs from `%s'\n"), - peerdir); - dsc.matched = 0; - dsc.remove_files = GNUNET_NO; + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + _("Importing HELLOs from `%s'\n"), + peerdir); + dsc.matched = 0; + dsc.remove_files = GNUNET_NO; - GNUNET_DISK_directory_scan (peerdir, - &hosts_directory_scan_callback, &dsc); + GNUNET_DISK_directory_scan (peerdir, + &hosts_directory_scan_callback, &dsc); - GNUNET_free (peerdir); + GNUNET_free (peerdir); + } } GNUNET_SERVER_add_handlers (server, handlers); GNUNET_SERVER_disconnect_notify (server, &disconnect_cb, NULL) ; - GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &shutdown_task, - NULL); - }