#include "gnunet_dns_service.h"
#include "gnunet_resolver_service.h"
#include "gnunet_dnsparser_lib.h"
-#include "gns_records.h"
+#include "gns_protocol.h"
#include "gnunet_gns_service.h"
#include "block_gns.h"
#include "gns.h"
/**
* Determine if this name is canonical.
* i.e.
- * a.b.gnunet = not canonical
+ * a.b.gads = not canonical
* a = canonical
*
* @param name the name to test
GNUNET_assert (gph->get_handle == NULL);
gph->get_handle = GNUNET_DHT_get_start (dht_handle,
- GNUNET_BLOCK_TYPE_GNS_NAMERECORD,
- &lookup_key,
- DHT_GNS_REPLICATION_LEVEL,
- GNUNET_DHT_RO_NONE,
- &xquery,
- sizeof(xquery),
- &process_auth_discovery_dht_result,
- gph);
+ GNUNET_BLOCK_TYPE_GNS_NAMERECORD,
+ &lookup_key,
+ DHT_GNS_REPLICATION_LEVEL,
+ GNUNET_DHT_RO_DEMULTIPLEX_EVERYWHERE,
+ &xquery,
+ sizeof(xquery),
+ &process_auth_discovery_dht_result,
+ gph);
return;
}
"GNS_NS: Error putting records into namestore: %s\n", emsg);
}
+
static void
handle_lookup_timeout (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
{
struct ResolverHandle *rh = cls;
- if (rh->timeout_cont)
+ if (NULL != rh->timeout_cont)
rh->timeout_cont (rh->timeout_cont_cls, tc);
+ /* FIXME: does this leak memory? */
}
+
/**
* Processor for background lookups in the DHT
*
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"GNS_PHASE_REC-%llu: Starting background lookup for %s type %d\n",
rh->id, new_name, rlh->record_type);
-
+
gns_resolver_lookup_record (rh->authority,
rh->private_local_zone,
rlh->record_type,
GNUNET_NO,
&background_lookup_result_processor,
NULL);
+
rh->timeout_task = GNUNET_SCHEDULER_NO_TASK;
GNUNET_DHT_get_stop (rh->get_handle);
}
/* Save to namestore */
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "GNS_PHASE_REC-%llu: Caching record for %s\n",
+ rh->id, name);
namestore_bg_task = GNUNET_malloc (sizeof (struct NamestoreBGTask));
namestore_bg_task->qe = GNUNET_NAMESTORE_record_put (namestore_handle,
&nrb->public_key,
GNUNET_BLOCK_TYPE_GNS_NAMERECORD,
&lookup_key,
DHT_GNS_REPLICATION_LEVEL,
- GNUNET_DHT_RO_NONE,
+ GNUNET_DHT_RO_DEMULTIPLEX_EVERYWHERE,
&xquery,
sizeof (xquery),
&process_record_result_dht,
"Sending %dbyte DNS query\n",
rh->dns_raw_packet_size);
- GNUNET_NETWORK_socket_sendto (rh->dns_sock,
- rh->dns_raw_packet,
- rh->dns_raw_packet_size,
- (struct sockaddr*)&rh->dns_addr,
- sizeof (struct sockaddr_in));
+ if (GNUNET_SYSERR ==
+ GNUNET_NETWORK_socket_sendto (rh->dns_sock,
+ rh->dns_raw_packet,
+ rh->dns_raw_packet_size,
+ (struct sockaddr*)&rh->dns_addr,
+ sizeof (struct sockaddr_in)))
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+ _("Failed to send DNS request to %s\n"),
+ GNUNET_a2s ((const struct sockaddr *)&rh->dns_addr,
+ sizeof (struct sockaddr_in)));
rh->dns_read_task = GNUNET_SCHEDULER_add_select (GNUNET_SCHEDULER_PRIORITY_DEFAULT,
rh->timeout, //FIXME less?
}
/* The glue */
if (GNUNET_GNS_RECORD_A == rd[i].record_type)
- dnsip = *((struct in_addr*)rd[i].data);
+ /* need to use memcpy as .data may be unaligned */
+ memcpy (&dnsip, rd[i].data, sizeof (dnsip));
}
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"GNS_PHASE_DELEGATE_DHT-%llu: Starting background query for %s type %d\n",
rh->id, rh->name, rlh->record_type);
- gns_resolver_lookup_record(rh->authority,
- rh->private_local_zone,
- rlh->record_type,
- new_name,
- NULL,
- GNUNET_TIME_UNIT_FOREVER_REL,
- GNUNET_NO,
- &background_lookup_result_processor,
- NULL);
-
+ gns_resolver_lookup_record (rh->authority,
+ rh->private_local_zone,
+ rlh->record_type,
+ new_name,
+ NULL,
+ GNUNET_TIME_UNIT_FOREVER_REL,
+ GNUNET_NO,
+ &background_lookup_result_processor,
+ NULL);
rh->proc(rh->proc_cls, rh, 0, NULL);
}
{
GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
"GNS_PHASE_DELEGATE_REV-%llu: Starting background lookup for %s type %d\n",
- rh->id, "+.gnunet", GNUNET_GNS_RECORD_REV);
+ rh->id, "+.gads", GNUNET_GNS_RECORD_REV);
gns_resolver_lookup_record(rh->authority,
rh->private_local_zone,
GNUNET_CRYPTO_hash_xor(key, &name_hash_double, &zone_hash_double);
GNUNET_CRYPTO_short_hash_from_truncation (&zone_hash_double, &zone);
- /* Save to namestore */
- if (0 != GNUNET_CRYPTO_short_hash_cmp(&rh->authority_chain_tail->zone,
+ /* Save to namestore
+ if (0 != GNUNET_CRYPTO_short_hash_cmp(&rh->authority_chain_head->zone,
&zone))
- {
+ {*/
if (max_allowed_ns_tasks <=
GNUNET_CONTAINER_heap_get_size (ns_task_heap))
{
GNUNET_NAMESTORE_cancel (ns_heap_root->qe);
GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
- "GNS_PHASE_REC-%llu: Replacing oldest background ns task\n",
+ "GNS_PHASE_DELEGATE_DHT-%llu: Replacing oldest background ns task\n",
rh->id);
}
-
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "GNS_PHASE_DELEGATE_DHT-%llu: Caching record for %s\n",
+ rh->id, name);
namestore_bg_task = GNUNET_malloc (sizeof (struct NamestoreBGTask));
namestore_bg_task->node = GNUNET_CONTAINER_heap_insert (ns_task_heap,
&on_namestore_delegation_put_result, //cont
namestore_bg_task); //cls
}
- }
+ //}
if (0 != rh->answered)
{
if (0 == rd_count)
{
- GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"GNS_PHASE_REC-%llu: No records for %s found in DHT. Aborting\n",
rh->id, rh->name);
/* give up, cannot resolve */
- finish_lookup(rh, rlh, 0, NULL);
+ finish_lookup (rh, rlh, 0, NULL);
return;
}
/* results found yay */
- GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"GNS_PHASE_REC-%llu: Record resolved from DHT!", rh->id);
- finish_lookup(rh, rlh, rd_count, rd);
+ finish_lookup (rh, rlh, rd_count, rd);
}
if (0 != rd_count)
{
/* results found yay */
- GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"GNS_PHASE_REC-%llu: Record resolved from namestore!\n", rh->id);
- finish_lookup(rh, rlh, rd_count, rd);
+ finish_lookup (rh, rlh, rd_count, rd);
return;
}
- GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
- "GNS_PHASE_REC-%llu: NS returned no records. (status: %d)!\n",
- rh->id,
- rh->status);
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "GNS_PHASE_REC-%llu: NS returned no records. (status: %d)!\n",
+ rh->id,
+ rh->status);
/**
* There are 5 conditions that have to met for us to consult the DHT:
* 1. The entry in the DHT is RSL_RECORD_EXPIRED OR
*/
if ((0 != (rh->status & RSL_RECORD_EXPIRED)) &&
(0 == (rh->status & RSL_RECORD_EXISTS)) )
+ {
+
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "GNS_PHASE_REC-%llu: Not expired and exists!\n",
+ rh->id);
check_dht = GNUNET_NO;
+ }
- if (0 != GNUNET_CRYPTO_short_hash_cmp(&rh->authority_chain_head->zone,
+ if (0 == GNUNET_CRYPTO_short_hash_cmp(&rh->authority_chain_head->zone,
&rh->private_local_zone))
+ {
+
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "GNS_PHASE_REC-%llu: Our zone!\n",
+ rh->id);
check_dht = GNUNET_NO;
+ }
if ((0 != strcmp (rh->name, "+")) && (GNUNET_YES == is_srv (rh->name)))
check_dht = GNUNET_NO;
return;
}
/* give up, cannot resolve */
- finish_lookup(rh, rlh, 0, NULL);
+ finish_lookup (rh, rlh, 0, NULL);
}
GNUNET_BLOCK_TYPE_GNS_NAMERECORD,
&lookup_key,
DHT_GNS_REPLICATION_LEVEL,
- GNUNET_DHT_RO_NONE,
+ GNUNET_DHT_RO_DEMULTIPLEX_EVERYWHERE,
&xquery,
sizeof(xquery),
&process_delegation_result_dht,
&rh->authority))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Cannot convert ZKEY %s to hash!\n", string_hash);
+ "Cannot convert ZKEY `%s' to hash!\n", string_hash);
+ if (GNUNET_SCHEDULER_NO_TASK != rh->timeout_task)
+ GNUNET_SCHEDULER_cancel (rh->timeout_task);
GNUNET_CONTAINER_DLL_remove (rlh_head, rlh_tail, rh);
GNUNET_free (rh);
GNUNET_free (rlh);
nsh->shorten_zone) == 0)
{
/**
- * This is our zone append .gnunet unless name is empty
+ * This is our zone append .gads unless name is empty
* (it shouldn't be, usually FIXME what happens if we
* shorten to our zone to a "" record??)
*/
nsh->private_zone) == 0)
{
/**
- * This is our zone append .gnunet unless name is empty
+ * This is our zone append .gads unless name is empty
* (it shouldn't be, usually FIXME what happens if we
* shorten to our zone to a "" record??)
*/
nsh->root_zone) == 0)
{
/**
- * This is our zone append .gnunet unless name is empty
+ * This is our zone append .gads unless name is empty
* (it shouldn't be, usually FIXME what happens if we
* shorten to our zone to a "" record??)
*/
char result[MAX_DNS_NAME_LENGTH];
nsh = (struct NameShortenHandle *)cls;
-
+ rh->namestore_task = NULL;
/**
* At this point rh->name contains the part of the name
* that we do not have a PKEY in our namestore to resolve.
"PKEY resolved as far as possible in ns up to %s!\n", rh->name);
memset(result, 0, sizeof (result));
- if (GNUNET_CRYPTO_short_hash_cmp(&rh->authority_chain_head->zone,
- nsh->root_zone) == 0)
+ if (0 == GNUNET_CRYPTO_short_hash_cmp(&rh->authority_chain_head->zone,
+ nsh->root_zone))
{
/**
- * This is our zone append .gnunet unless name is empty
+ * This is our zone append .gads unless name is empty
* (it shouldn't be, usually FIXME what happens if we
* shorten to our zone to a "" record??)
*/
else if (NULL != nsh->private_zone)
{
/**
- * This is our zone append .gnunet unless name is empty
+ * This is our zone append .gads unless name is empty
* (it shouldn't be, usually FIXME what happens if we
* shorten to our zone to a "" record??)
*/
else if (NULL != nsh->shorten_zone)
{
/**
- * This is our zone append .gnunet unless name is empty
+ * This is our zone append .gads unless name is empty
* (it shouldn't be, usually FIXME what happens if we
* shorten to our zone to a "" record??)
*/
{
struct ResolverHandle *rh = cls;
struct NameShortenHandle *nsh = rh->proc_cls;
- struct GNUNET_CRYPTO_ShortHashAsciiEncoded enc;
char new_name[MAX_DNS_NAME_LENGTH];
+ rh->namestore_task = NULL;
+
/* zkey not in our zone */
if (name == NULL)
{
* because PKEY import will happen if the user follows the zkey
* link.
*/
- GNUNET_CRYPTO_short_hash_to_enc ((struct GNUNET_CRYPTO_ShortHashCode*)rd,
- &enc);
GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
- "No name found for zkey %s returning verbatim!\n", enc);
- if (strcmp(rh->name, "") != 0)
+ "No name found for zkey %s returning verbatim!\n", nsh->result);
+ /*if (strcmp(rh->name, "") != 0)
GNUNET_snprintf(new_name, MAX_DNS_NAME_LENGTH, "%s.%s.%s",
rh->name, enc, GNUNET_GNS_TLD_ZKEY);
else
GNUNET_snprintf(new_name, MAX_DNS_NAME_LENGTH, "%s.%s",
enc, GNUNET_GNS_TLD_ZKEY);
- strcpy (nsh->result, new_name);
+ strcpy (nsh->result, new_name);*/
finish_shorten (rh, nsh);
return;
GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
"Got authority result %s\n", nah->result);
- nah->proc(nah->proc_cls, nah->result);
+ nah->proc (nah->proc_cls, nah->result);
GNUNET_CONTAINER_DLL_remove (nah_head, nah_tail, rh);
- GNUNET_free(nah);
- free_resolver_handle(rh);
+ GNUNET_free (nah);
+ free_resolver_handle (rh);
}
/**
answer_len = strlen(nah->name) - strlen(rh->name)
+ strlen(GNUNET_GNS_TLD) + 1;
memset(nah->result, 0, answer_len);
- strcpy(nah->result, nah->name + strlen(rh->name) + 1);
+ if (0 != strcmp (rh->name, ""))
+ strcpy(nah->result, nah->name + strlen(rh->name) + 1);
+ else
+ strcpy(nah->result, nah->name);
finish_get_auth (rh, nah);
}