/*
This file is part of GNUnet.
Copyright (C) 2001, 2002, 2004, 2005, 2006, 2007, 2009 GNUnet e.V.
GNUnet is free software: you can redistribute it and/or modify it
under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License,
or (at your option) any later version.
GNUnet is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
*/
/**
* @file dht/gnunet-dht-get.c
* @brief search for data in DHT
* @author Christian Grothoff
* @author Nathan Evans
*/
#include "platform.h"
#include "gnunet_dht_service.h"
#define LOG(kind,...) GNUNET_log_from (kind, "dht-clients",__VA_ARGS__)
/**
* The type of the query
*/
static unsigned int query_type;
/**
* Desired replication level
*/
static unsigned int replication = 5;
/**
* The key for the query
*/
static char *query_key;
/**
* User supplied timeout value
*/
static struct GNUNET_TIME_Relative timeout_request = { 60000 };
/**
* Be verbose
*/
static unsigned int verbose;
/**
* Use DHT demultixplex_everywhere
*/
static int demultixplex_everywhere;
/**
* Handle to the DHT
*/
static struct GNUNET_DHT_Handle *dht_handle;
/**
* Global handle of the configuration
*/
static const struct GNUNET_CONFIGURATION_Handle *cfg;
/**
* Handle for the get request
*/
static struct GNUNET_DHT_GetHandle *get_handle;
/**
* Count of results found
*/
static unsigned int result_count;
/**
* Global status value
*/
static int ret;
/**
* Task scheduled to handle timeout.
*/
static struct GNUNET_SCHEDULER_Task *tt;
/**
* Task run to clean up on shutdown.
*
* @param cls unused
*/
static void
cleanup_task (void *cls)
{
if (NULL != get_handle)
{
GNUNET_DHT_get_stop (get_handle);
get_handle = NULL;
}
if (NULL != dht_handle)
{
GNUNET_DHT_disconnect (dht_handle);
dht_handle = NULL;
}
if (NULL != tt)
{
GNUNET_SCHEDULER_cancel (tt);
tt = NULL;
}
}
/**
* Task run on timeout. Triggers shutdown.
*
* @param cls unused
*/
static void
timeout_task (void *cls)
{
tt = NULL;
GNUNET_SCHEDULER_shutdown ();
}
/**
* Iterator called on each result obtained for a DHT
* operation that expects a reply
*
* @param cls closure
* @param exp when will this value expire
* @param key key of the result
* @param get_path peers on reply path (or NULL if not recorded)
* @param get_path_length number of entries in get_path
* @param put_path peers on the PUT path (or NULL if not recorded)
* @param put_path_length number of entries in get_path
* @param type type of the result
* @param size number of bytes in data
* @param data pointer to the result data
*/
static void
get_result_iterator (void *cls, struct GNUNET_TIME_Absolute exp,
const struct GNUNET_HashCode * key,
const struct GNUNET_PeerIdentity *get_path,
unsigned int get_path_length,
const struct GNUNET_PeerIdentity *put_path,
unsigned int put_path_length,
enum GNUNET_BLOCK_Type type,
size_t size,
const void *data)
{
FPRINTF (stdout,
(GNUNET_BLOCK_TYPE_TEST == type)
? _("Result %d, type %d:\n%.*s\n")
: _("Result %d, type %d:\n"),
result_count,
type,
(unsigned int) size,
(char *) data);
if (verbose)
{
FPRINTF (stdout,
" GET path: ");
for (unsigned int i=0;i