plugindir = $(libdir)/gnunet
-pkgcfg_DATA = \
- dns.conf
+#pkgcfg_DATA = \
+# dns.conf
lib_LTLIBRARIES = \
libgnunetgns.la
bin_PROGRAMS = \
- gnunet-service-gns $(HIJACKBIN)
+ gnunet-service-gns
noinst_PROGRAMS = \
gnunet-gns-lookup gnunet-gns-add
gnunet_dns_add_DEPENDENCIES = \
libgnunetgns.la
+gnunet_gns_lookup_SOURCES = \
+ gnunet-gns-lookup.c
+gnunet_gns_lookup_LDADD = \
+ $(top_builddir)/src/gns/libgnunetgns.la \
+ $(top_builddir)/src/util/libgnunetutil.la \
+ $(GN_LIBINTL)
+gnunet_dns_lookup_DEPENDENCIES = \
+ libgnunetgns.la
+
gnunet_service_gns_SOURCES = \
gnunet-service-gns.c
gnunet_service_gns_LDADD = \
$(top_builddir)/src/statistics/libgnunetstatistics.la \
$(top_builddir)/src/util/libgnunetutil.la \
$(top_builddir)/src/dns/libgnunetdns.la \
+ $(top_builddir)/src/dns/libgnunetdnsparser.la \
$(GN_LIBINTL)
libgnunetgns_la_SOURCES = \
*/
struct GNUNET_MessageHeader header;
+ /**
+ * A key. TODO some uid
+ */
+ GNUNET_HashCode key;
+
/**
* Unique identifier for this request (for key collisions).
*/
return GNUNET_YES;
}
+/**
+ * Add the request corresponding to the given handle
+ * to the pending queue (if it is not already in there).
+ *
+ * @param cls the 'struct GNUNET_GNS_Handle*'
+ * @param key key for the request (not used)
+ * @param value the 'struct GNUNET_GNS_LookupHandle*'
+ * @return GNUNET_YES (always)
+ */
+static int
+add_request_to_pending (void *cls, const GNUNET_HashCode * key, void *value)
+{
+ struct GNUNET_GNS_Handle *handle = cls;
+ struct GNUNET_GNS_LookupHandle *rh = value;
+
+ if (GNUNET_NO == rh->message->in_pending_queue)
+ {
+#if DEBUG_DHT
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Retransmitting request related to %s to GNS %p\n", GNUNET_h2s(key),
+ handle);
+#endif
+ GNUNET_CONTAINER_DLL_insert (handle->pending_head, handle->pending_tail,
+ rh->message);
+ rh->message->in_pending_queue = GNUNET_YES;
+ }
+ return GNUNET_YES;
+}
+
/**
* Try reconnecting to the GNS service.
*
handle->th = NULL;
if (buf == NULL)
{
-#if DEBUG_GNS
- LOG (GNUNET_ERROR_TYPE_DEBUG,
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Transmission to GNS service failed! Reconnecting!\n");
-#endif
do_disconnect (handle);
return 0;
}
/**
* Perform an asynchronous Lookup operation on the GNS.
+ * TODO: Still not sure what we query for... "names" it is for now
*
* @param handle handle to the GNS service
* @param timeout how long to wait for transmission of this request to the service
*/
struct GNUNET_GNS_LookupHandle *
GNUNET_GNS_lookup_start (struct GNUNET_GNS_Handle *handle,
- struct GNUNET_TIME_Relative timeout,
- const char * name,
- enum GNUNET_GNS_RecordType type,
- GNUNET_GNS_LookupIterator iter,
- void *iter_cls)
+ struct GNUNET_TIME_Relative timeout,
+ const char * name,
+ enum GNUNET_GNS_RecordType type,
+ GNUNET_GNS_LookupIterator iter,
+ void *iter_cls)
{
/* IPC to look for local entries, start dht lookup, return lookup_handle */
struct GNUNET_GNS_ClientLookupMessage *lookup_msg;
struct GNUNET_GNS_LookupHandle *lookup_handle;
+ GNUNET_HashCode key;
size_t msize;
struct PendingMessage *pending;
+ if (NULL == name)
+ {
+ return NULL;
+ }
+
+ GNUNET_CRYPTO_hash (name, strlen(name), &key);
+
msize = sizeof (struct GNUNET_GNS_ClientLookupMessage) + strlen(name);
#if DEBUG_GNS
LOG (GNUNET_ERROR_TYPE_DEBUG, "Starting lookup for %s in GNS %p\n",
lookup_msg->header.size = htons (msize);
lookup_msg->header.type = htons (GNUNET_MESSAGE_TYPE_GNS_CLIENT_LOOKUP);
lookup_msg->namelen = strlen(name);
+ lookup_msg->key = key;
memcpy(&lookup_msg[1], name, strlen(name));
handle->uid_gen++;
lookup_msg->unique_id = handle->uid_gen;
lookup_handle->iter_cls = iter_cls;
lookup_handle->message = pending;
lookup_handle->unique_id = lookup_msg->unique_id;
- GNUNET_CONTAINER_multihashmap_put (handle->active_requests, key, lookup_handle,
+ GNUNET_CONTAINER_multihashmap_put (handle->active_requests, &lookup_msg->key,
+ lookup_handle,
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
process_pending_messages (handle);
return lookup_handle;
if (verbose)
FPRINTF (stderr, _("Issuing add request for `%s' with data `%s'!\n"),
record_key, data);
- GNUNET_GNS_add_record (gns_handle, &record_key, record_type,
- strlen (data), data, expiration, timeout);
+ GNUNET_GNS_add_record (gns_handle, record_key,
+ 0/*RecordType*/,
+ strlen (data), data, expiration, timeout);
}
* @param data pointer to the result data
*/
static void
-get_result_iterator (void *cls, struct GNUNET_TIME_Absolute exp,
- const 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)
+lookup_result_iterator (void *cls,
+ const GNUNET_HashCode * key,
+ const struct GNUNET_GNS_Record *record,
+ unsigned int num_records)
{
- FPRINTF (stdout, "Result %d, type %d:\n%.*s\n", result_count, type,
- (unsigned int) size, (char *) data);
- result_count++;
+ FPRINTF (stdout, "Results %d\n", num_records);
}
const struct GNUNET_CONFIGURATION_Handle *c)
{
struct GNUNET_TIME_Relative timeout;
- GNUNET_HashCode key;
cfg = c;
return;
}
- lookup_handle = GNUNET_GNS_connect (cfg, 1);
+ gns_handle = GNUNET_GNS_connect (cfg, 1);
- if (lookup_handle == NULL)
+ if (gns_handle == NULL)
{
if (verbose)
FPRINTF (stderr, "%s", "Couldn't connect to GNS service!\n");
else if (verbose)
FPRINTF (stderr, "%s", "Connected to GNS service!\n");
- if (query_type == GNUNET_BLOCK_TYPE_ANY) /* Type of data not set */
- query_type = GNUNET_BLOCK_TYPE_TEST;
-
- GNUNET_CRYPTO_hash (query_key, strlen (query_key), &key);
-
timeout =
GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, timeout_request);
absolute_timeout = GNUNET_TIME_relative_to_absolute (timeout);
FPRINTF (stderr, "Issuing lookup request for %s!\n", query_key);
GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_absolute_get_remaining
(absolute_timeout), &cleanup_task, NULL);
- get_handle =
- GNUNET_GNS_lookup_start (lookup_handle, timeout, query_type, &key, replication,
- GNUNET_DHT_RO_NONE, NULL, 0, &get_result_iterator,
- NULL);
+ lookup_handle =
+ GNUNET_GNS_lookup_start (gns_handle, timeout, query_key,
+ 0/*GNS_RecordType*/,
+ &lookup_result_iterator,
+ NULL);
}
#include "gnunet_util_lib.h"
#include "gnunet_transport_service.h"
#include "gnunet_dns_service.h"
+#include "gnunet_dnsparser_lib.h"
#include "gnunet_gns_service.h"
-#include "gnunet-service-gns.h"
+#include "gns.h"
+/* TODO into gnunet_protocols */
+#define GNUNET_MESSAGE_TYPE_GNS_CLIENT_LOOKUP 23
+#define GNUNET_MESSAGE_TYPE_GNS_CLIENT_RESULT 24
+
/**
* Our handle to the DNS handler library
*/
-struct GNUNET_DNS_Handle *dns_handler;
+struct GNUNET_DNS_Handle *dns_handle;
/**
* The configuration the GNS service is running with
*/
const struct GNUNET_CONFIGURATION_Handle *GNS_cfg;
+/**
+ * Our notification context.
+ */
+static struct GNUNET_SERVER_NotificationContext *nc;
+
/**
* Task run during shutdown.
*
static void
shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
{
- GNUNET_DNS_disconnect(dns_handle);
+ GNUNET_DNS_disconnect(dns_handle);
}
/**
*/
void
handle_dns_request(void *cls,
- struct GNUNET_DNS_RequestHandle *rh,
- size_t request_length,
- const char *request)
+ struct GNUNET_DNS_RequestHandle *rh,
+ size_t request_length,
+ const char *request)
{
- /**
- * TODO: parse request for tld
- * Queue rh and gns handle (or use cls)
- * How should lookup behave:
- * - sync and return result or "NX"
- * - async like dht with iter
- * Maybe provide both, useful for cli app
- **/
+ /**
+ * TODO: parse request for tld
+ * Queue rh and gns handle (or use cls)
+ * How should lookup behave:
+ * - sync and return result or "NX"
+ * - async like dht with iter
+ * Maybe provide both, useful for cli app
+ **/
struct GNUNET_DNSPARSER_Packet *p;
- int namelen;
-
- p = GNUNET_DNSPARSER_parse (request, request_length);
- if (NULL == p)
- {
- fprintf (stderr, "Received malformed DNS packet, leaving it untouched\n");
- GNUNET_DNS_request_forward (rh);
- return;
- }
- /**
- * TODO factor out
- * Check tld and decide if we or
- * legacy dns is responsible
- **/
- for (i=0;i<p->num_queries;i++)
- {
- namelen = strlen(&p->queries[i]->name);
- if (namelen >= 7)
- {
- /**
- * TODO off by 1?
- * Move our tld/root to config file
- * Generate fake DNS reply that replaces .gnunet with .org
- **/
- if (0 == strcmp((&p->queries[i]->name)+(namelen-7), ".gnunet"))
- {
- GNUNET_DNS_request_answer(rh, 0 /*length*/, NULL/*reply*/);
- }
- else
- {
- GNUNET_DNS_request_forward (rh);
- }
- }
- }
+ int namelen;
+ int i;
+ char *tail;
+
+ p = GNUNET_DNSPARSER_parse (request, request_length);
+ if (NULL == p)
+ {
+ fprintf (stderr, "Received malformed DNS packet, leaving it untouched\n");
+ GNUNET_DNS_request_forward (rh);
+ return;
+ }
+ /**
+ * TODO factor out
+ * Check tld and decide if we or
+ * legacy dns is responsible
+ **/
+ for (i=0;i<p->num_queries;i++)
+ {
+ namelen = strlen(p->queries[i].name);
+ if (namelen >= 7)
+ {
+ /**
+ * TODO off by 1?
+ * Move our tld/root to config file
+ * Generate fake DNS reply that replaces .gnunet with .org
+ **/
+ tail = p->queries[i].name+(namelen-7);
+ if (0 == strcmp(tail, ".gnunet"))
+ {
+ /* Do db lookup here. Make dht lookup if necessary */
+ GNUNET_DNS_request_answer(rh, 0 /*length*/, NULL/*reply*/);
+ }
+ else
+ {
+ GNUNET_DNS_request_forward (rh);
+ }
+ }
+ }
}
+/*TODO*/
+static void
+handle_client_record_lookup(void *cls,
+ struct GNUNET_SERVER_Client *client,
+ const struct GNUNET_MessageHeader *message)
+{
+}
+
+/*TODO*/
+static void
+handle_client_record_add(void *cls,
+ struct GNUNET_SERVER_Client *client,
+ const struct GNUNET_MessageHeader *message)
+{
+}
/**
* Process GNS requests.
run (void *cls, struct GNUNET_SERVER_Handle *server,
const struct GNUNET_CONFIGURATION_Handle *c)
{
- /* The IPC message types */
- static const struct GNUNET_SERVER_MessageHandler handlers[] = {
- /* callback, cls, type, size */
- {&handle_client_record_lookup, NULL, GNUNET_MESSAGE_TYPE_GNS_RECORD_LOOKUP,
- sizeof (struct GNUNET_GNS_Lookup)},
- {&handle_client_record_add, NULL, GNUNET_MESSAGE_TYPE_GNS_RECORD_ADD,
- sizeof (struct GNUNET_GNS_Record)},
- {NULL, NULL, 0, 0}
- };
-
- nc = GNUNET_SERVER_notification_context_create (server, 1);
-
- /* TODO do some config parsing */
-
- GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &shutdown_task,
+ /* The IPC message types */
+ static const struct GNUNET_SERVER_MessageHandler handlers[] = {
+ /* callback, cls, type, size */
+ {&handle_client_record_lookup, NULL, GNUNET_MESSAGE_TYPE_GNS_CLIENT_LOOKUP,
+ 0},
+ /*{&handle_client_record_add, NULL, GNUNET_MESSAGE_TYPE_GNS_CLIENT_ADD,
+ 0},*/
+ {NULL, NULL, 0, 0}
+ };
+
+ nc = GNUNET_SERVER_notification_context_create (server, 1);
+
+ /* TODO do some config parsing */
+
+ GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &shutdown_task,
NULL);
- /**
- * Do gnunet dns init here
- * */
- dns_handle = GNUNET_DNS_connect(c,
- GNUNET_DNS_FLAG_PRE_RESOLUTION,
- &handle_dns_request, /* rh */
- NULL); /* Closure */
- GNUNET_SERVER_add_handlers (server, handlers);
- /**
- * Esp the lookup would require to keep track of the clients' context
- * See dht.
- * GNUNET_SERVER_disconnect_notify (server, &client_disconnect, NULL);
- **/
+ /**
+ * Do gnunet dns init here
+ * */
+ dns_handle = GNUNET_DNS_connect(c,
+ GNUNET_DNS_FLAG_PRE_RESOLUTION,
+ &handle_dns_request, /* rh */
+ NULL); /* Closure */
+ GNUNET_SERVER_add_handlers (server, handlers);
+ /**
+ * Esp the lookup would require to keep track of the clients' context
+ * See dht.
+ * GNUNET_SERVER_disconnect_notify (server, &client_disconnect, NULL);
+ **/
}
*
* @param handle The handle to the monitor request returned by monitor_start.
*
- * On return get_handle will no longer be valid, caller must not use again!!!
+ * On return handle will no longer be valid, caller must not use again!!!
*/
void
GNUNET_DHT_monitor_stop (struct GNUNET_DHT_MonitorHandle *handle);
* @return NULL on error
*/
struct GNUNET_GNS_Handle *
-GNUNET_GNS_connect (const struct GNUNET_CONFIGURATION_Handle *cfg
+GNUNET_GNS_connect (const struct GNUNET_CONFIGURATION_Handle *cfg,
unsigned int ht_len);