+ /* FIXME: might want to check that type matches */
+ meta_length =
+ sizeof (struct GNUNET_PeerIdentity) * (get_path_length + put_path_length);
+ data_length = msize - meta_length;
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Giving %u byte reply for %s to application\n",
+ (unsigned int) data_length,
+ GNUNET_h2s (key));
+ put_path = (const struct GNUNET_PeerIdentity *) &crm[1];
+ get_path = &put_path[put_path_length];
+ data = &get_path[get_path_length];
+ /* remember that we've seen this result */
+ GNUNET_CRYPTO_hash (data,
+ data_length,
+ &hc);
+ if (get_handle->seen_results_size == get_handle->seen_results_end)
+ GNUNET_array_grow (get_handle->seen_results,
+ get_handle->seen_results_size,
+ get_handle->seen_results_size * 2 + 1);
+ get_handle->seen_results[get_handle->seen_results_end++] = hc;
+ /* no need to block it explicitly, service already knows about it! */
+ get_handle->iter (get_handle->iter_cls,
+ GNUNET_TIME_absolute_ntoh (crm->expiration),
+ key,
+ get_path,
+ get_path_length,
+ put_path,
+ put_path_length,
+ ntohl (crm->type),
+ data_length,
+ data);
+ return GNUNET_YES;
+}
+
+
+/**
+ * Process a client result message received from the service.
+ *
+ * @param cls The DHT handle.
+ * @param msg Monitor put message from the service.
+ */
+static void
+handle_client_result (void *cls,
+ const struct GNUNET_DHT_ClientResultMessage *msg)
+{
+ struct GNUNET_DHT_Handle *handle = cls;
+
+ GNUNET_CONTAINER_multihashmap_get_multiple (handle->active_requests,
+ &msg->key,
+ &process_client_result,
+ (void *) msg);