packet->num_additional_records = 0;
packet->additional_records = NULL;
GNUNET_DNSPARSER_free_packet(packet);
- //FIXME free resolver handle in resp functions in resolver!
- //GNUNET_free((struct RecordLookupHandle*)rh->proc_cls);
- //free_resolver_handle(rh);
GNUNET_free(ilh);
}
const char *request)
{
struct GNUNET_DNSPARSER_Packet *p;
- int i;
- char *tldoffset;
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Hijacked a DNS request...processing\n");
p = GNUNET_DNSPARSER_parse (request, request_length);
/**
- * Check for .gnunet
+ * Check for .gnunet/.zkey
*/
- tldoffset = p->queries[0].name + strlen(p->queries[0].name) - 1;
-
- for (i=0; i<strlen(p->queries[0].name); i++)
- {
- if (*(tldoffset-i) == '.')
- break;
- }
-
- i--;
- if ((i==strlen(GNUNET_GNS_TLD)-1)
- && (0 == strcmp(tldoffset-i, GNUNET_GNS_TLD)))
+ if ((is_gnunet_tld(p->queries[0].name) == GNUNET_YES) ||
+ (is_zkey_tld(p->queries[0].name) == GNUNET_YES))
{
start_resolution_for_dns(rh, p, p->queries);
}
}
/**
- * Checks if name is in .zkey TLD
+ * Checks if name is in tld
*
* @param name the name to check
* @return GNUNET_YES or GNUNET_NO
*/
int
-is_zkey_tld(const char* name)
+is_tld(const char* name, const char* tld)
{
int offset = 0;
- if (strlen(name) <= strlen(GNUNET_GNS_TLD_ZKEY))
+ if (strlen(name) <= strlen(tld))
{
return GNUNET_NO;
}
- offset = strlen(name)-strlen(GNUNET_GNS_TLD_ZKEY);
- if (strcmp(name+offset, GNUNET_GNS_TLD_ZKEY) != 0)
+ offset = strlen(name)-strlen(tld);
+ if (strcmp(name+offset, tld) != 0)
{
GNUNET_log(GNUNET_ERROR_TYPE_INFO,
- "%s is not in zkey TLD\n", name);
+ "%s is not in .%s TLD\n", name, tld);
return GNUNET_NO;
}
return GNUNET_YES;
{
struct ResolverHandle *rh;
struct NameShortenHandle *nsh;
+ char string_hash[MAX_DNS_NAME_LENGTH]; //FIXME LABEL length when shorthash
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Starting shorten for %s!\n", name);
rh = GNUNET_malloc(sizeof (struct ResolverHandle));
rh->authority = zone;
- memset(rh->name, 0,
- strlen(name)-strlen(GNUNET_GNS_TLD));
- memcpy(rh->name, name,
- strlen(name)-strlen(GNUNET_GNS_TLD)-1);
+
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Checking for TLD...\n");
+ if (is_zkey_tld(name) == GNUNET_YES)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "TLD is zkey\n");
+ /**
+ * This is a zkey tld
+ * build hash and use as initial authority
+ */
+ memset(rh->name, 0,
+ strlen(name)-strlen(GNUNET_GNS_TLD_ZKEY));
+ memcpy(rh->name, name,
+ strlen(name)-strlen(GNUNET_GNS_TLD_ZKEY) - 1);
+ pop_tld(rh->name, string_hash);
+
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "ZKEY is %s!\n", string_hash);
+
+ if (GNUNET_OK != GNUNET_CRYPTO_hash_from_string(string_hash,
+ &rh->authority))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Cannot convert ZKEY %s to hash!\n", string_hash);
+ GNUNET_free(rh);
+ GNUNET_free(nsh);
+ proc(cls, name);
+ return;
+ }
+
+ }
+ else
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "TLD is gnunet\n");
+ /**
+ * Presumably GNUNET tld
+ */
+ memset(rh->name, 0,
+ strlen(name)-strlen(GNUNET_GNS_TLD));
+ memcpy(rh->name, name,
+ strlen(name)-strlen(GNUNET_GNS_TLD) - 1);
+ }
rh->authority_chain_head = GNUNET_malloc(sizeof(struct AuthorityChain));
rh->authority_chain_tail = rh->authority_chain_head;
GetAuthorityResultProcessor proc,
void* cls);
+/**
+ * Generic function to check for TLDs
+ *
+ * @param name the name to check
+ * @param tld the tld to check
+ * @return GNUNET_YES or GNUNET_NO
+ */
+int
+is_tld(const char* name, const char* tld);
+
+/**
+ * Checks for gnunet/zkey
+ */
+#define is_gnunet_tld(name) is_tld(name, GNUNET_GNS_TLD)
+#define is_zkey_tld(name) is_tld(name, GNUNET_GNS_TLD_ZKEY)
+
+
#endif