{
answer_records[i].name = ilh->query->name;
answer_records[i].type = rd[i].record_type;
- answer_records[i].data.raw.data_len = rd[i].data_size;
- answer_records[i].data.raw.data = (char*)rd[i].data;
+ switch(rd[i].record_type)
+ {
+ case GNUNET_GNS_RECORD_TYPE_NS:
+ case GNUNET_GNS_RECORD_TYPE_CNAME:
+ case GNUNET_GNS_RECORD_TYPE_PTR:
+ answer_records[i].data.hostname = (char*)rd[i].data;
+ break;
+ case GNUNET_GNS_RECORD_TYPE_SOA:
+ answer_records[i].data.soa =
+ (struct GNUNET_DNSPARSER_SoaRecord *)rd[i].data;
+ break;
+ case GNUNET_GNS_RECORD_MX:
+ answer_records[i].data.mx =
+ (struct GNUNET_DNSPARSER_MxRecord *)rd[i].data;
+ break;
+ default:
+ answer_records[i].data.raw.data_len = rd[i].data_size;
+ answer_records[i].data.raw.data = (char*)rd[i].data;
+ }
answer_records[i].expiration_time = rd[i].expiration;
answer_records[i].class = GNUNET_DNSPARSER_CLASS_INTERNET;//hmmn
}
int i;
char* s_value;
char new_s_value[256];
+ char new_mx_value[sizeof(struct GNUNET_DNSPARSER_MxRecord)+256];
int s_len;
struct GNUNET_NAMESTORE_RecordData p_rd[rd_count];
char* pos;
char* trailer;
+ struct GNUNET_DNSPARSER_MxRecord *mx;
if (rd_count > 0)
memcpy(p_rd, rd, rd_count*sizeof(struct GNUNET_NAMESTORE_RecordData));
* also try to resolve the A/AAAA records (RFC1035)
* FIXME
*/
- s_value = (char*)rd[i].data;
- s_len = rd[i].data_size;
+ if (rd[i].record_type == GNUNET_GNS_RECORD_MX)
+ {
+ mx = (struct GNUNET_DNSPARSER_MxRecord*)rd[i].data;
+ s_value = (char*)&mx[1];
+ }
+ else
+ {
+ s_value = (char*)rd[i].data;
+ }
+
+ s_len = strlen(s_value)+1;
if (s_len < 3)
{
+ /* no postprocessing */
p_rd[i].data = rd[i].data;
continue;
}
pos = new_s_value+s_len-2;
strcpy(pos, trailer);
pos += strlen(trailer);
- p_rd[i].data = new_s_value;
- p_rd[i].data_size = strlen(new_s_value)+1;
+ if (rd[i].record_type == GNUNET_GNS_RECORD_MX)
+ {
+
+ p_rd[i].data_size = sizeof(struct GNUNET_DNSPARSER_MxRecord)
+ +strlen(new_s_value)+1;
+
+ p_rd[i].data = new_mx_value;
+ mx = (struct GNUNET_DNSPARSER_MxRecord*)p_rd[i].data;
+ mx->preference =
+ ((struct GNUNET_DNSPARSER_MxRecord*)rd[i].data)->preference;
+ memcpy((char*)&mx[1], new_s_value, strlen(new_s_value)+1);
+ mx->mxhost = (char*)&mx[1];
+ }
+ else
+ {
+ p_rd[i].data = new_s_value;
+ p_rd[i].data_size = strlen(new_s_value)+1;
+ }
GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
"Expanded to %s\n", new_s_value);
}
char* addr;
int mx_found = 0;
int ip_found = 0;
- char* mx;
+ struct GNUNET_DNSPARSER_MxRecord *mx;
if (rd_count == 0)
{
}
else if (rd[i].record_type == GNUNET_GNS_RECORD_MX)
{
- mx = (char*)rd[i].data;
- if (0 == strcmp(mx, TEST_EXPECTED_MX))
+ mx = (struct GNUNET_DNSPARSER_MxRecord*)rd[i].data;
+ mx->mxhost = (char*)&mx[1];
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ "Got MX %s\n", mx->mxhost);
+ if (0 == strcmp(mx->mxhost, TEST_EXPECTED_MX))
{
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
"%s correctly resolved to %s!\n", TEST_DOMAIN,
struct GNUNET_NAMESTORE_RecordData rd;
char* ip = TEST_IP;
struct in_addr *mail = GNUNET_malloc(sizeof(struct in_addr));
+ struct GNUNET_DNSPARSER_MxRecord *mx_record;
rd.expiration = GNUNET_TIME_absolute_get_forever ();
GNUNET_assert(1 == inet_pton (AF_INET, ip, mail));
sig,
NULL,
NULL);
-
- rd.data_size = strlen(TEST_MX_NAME)+1;
- rd.data = TEST_MX_NAME;
+
+ rd.data_size = sizeof(struct GNUNET_DNSPARSER_MxRecord)+strlen(TEST_MX_NAME)+1;
+ mx_record = GNUNET_malloc(rd.data_size);
+ mx_record->preference = 1;
+ mx_record->mxhost = (char*)&mx_record[1];
+ strcpy(mx_record->mxhost, TEST_MX_NAME);
+ rd.data = mx_record;
rd.record_type = GNUNET_GNS_RECORD_MX;
sig = GNUNET_NAMESTORE_create_signature(bob_key,
GNUNET_TIME_absolute_get_forever(),
sig,
&commence_testing,
NULL);
+ GNUNET_free(mx_record);
GNUNET_free(mail);
GNUNET_free(sig);
GNUNET_CRYPTO_rsa_key_free(bob_key);