+
+ read_pos = 0;
+ while (read_pos < (size_t) size_total)
+ {
+ hello = (const struct GNUNET_HELLO_Message *) &buffer[read_pos];
+ size_hello = GNUNET_HELLO_size (hello);
+ if ( (0 == size_hello) ||
+ (((size_t) size_total) - read_pos < size_hello) )
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ _("Failed to parse HELLO in file `%s'\n"),
+ fn);
+ if (0 == read_pos)
+ {
+ if ((GNUNET_YES == unlink_garbage) &&
+ (0 != UNLINK (fn)) &&
+ (ENOENT != errno) )
+ GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING,
+ "unlink",
+ fn);
+ }
+ else
+ {
+ if ( (GNUNET_YES == unlink_garbage) &&
+ (0 != TRUNCATE (fn, read_pos)) &&
+ (ENOENT != errno) )
+ GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING,
+ "truncate",
+ 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 (0 == left)
+ {
+ GNUNET_free (hello_clean);
+ break;
+ }
+
+ 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;
+ }
+
+ 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);
+ }
+ 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");