summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/gns/gnunet-service-gns_interceptor.c21
-rw-r--r--src/gns/gnunet-service-gns_resolver.c36
-rw-r--r--src/gns/test_gns_simple_mx_lookup.c21
3 files changed, 66 insertions, 12 deletions
diff --git a/src/gns/gnunet-service-gns_interceptor.c b/src/gns/gnunet-service-gns_interceptor.c
index 25cad7ead..4160893ad 100644
--- a/src/gns/gnunet-service-gns_interceptor.c
+++ b/src/gns/gnunet-service-gns_interceptor.c
@@ -114,8 +114,25 @@ reply_to_dns(void* cls, uint32_t rd_count,
114 { 114 {
115 answer_records[i].name = ilh->query->name; 115 answer_records[i].name = ilh->query->name;
116 answer_records[i].type = rd[i].record_type; 116 answer_records[i].type = rd[i].record_type;
117 answer_records[i].data.raw.data_len = rd[i].data_size; 117 switch(rd[i].record_type)
118 answer_records[i].data.raw.data = (char*)rd[i].data; 118 {
119 case GNUNET_GNS_RECORD_TYPE_NS:
120 case GNUNET_GNS_RECORD_TYPE_CNAME:
121 case GNUNET_GNS_RECORD_TYPE_PTR:
122 answer_records[i].data.hostname = (char*)rd[i].data;
123 break;
124 case GNUNET_GNS_RECORD_TYPE_SOA:
125 answer_records[i].data.soa =
126 (struct GNUNET_DNSPARSER_SoaRecord *)rd[i].data;
127 break;
128 case GNUNET_GNS_RECORD_MX:
129 answer_records[i].data.mx =
130 (struct GNUNET_DNSPARSER_MxRecord *)rd[i].data;
131 break;
132 default:
133 answer_records[i].data.raw.data_len = rd[i].data_size;
134 answer_records[i].data.raw.data = (char*)rd[i].data;
135 }
119 answer_records[i].expiration_time = rd[i].expiration; 136 answer_records[i].expiration_time = rd[i].expiration;
120 answer_records[i].class = GNUNET_DNSPARSER_CLASS_INTERNET;//hmmn 137 answer_records[i].class = GNUNET_DNSPARSER_CLASS_INTERNET;//hmmn
121 } 138 }
diff --git a/src/gns/gnunet-service-gns_resolver.c b/src/gns/gnunet-service-gns_resolver.c
index f30f67b57..077dca039 100644
--- a/src/gns/gnunet-service-gns_resolver.c
+++ b/src/gns/gnunet-service-gns_resolver.c
@@ -954,10 +954,12 @@ finish_lookup(struct ResolverHandle *rh,
954 int i; 954 int i;
955 char* s_value; 955 char* s_value;
956 char new_s_value[256]; 956 char new_s_value[256];
957 char new_mx_value[sizeof(struct GNUNET_DNSPARSER_MxRecord)+256];
957 int s_len; 958 int s_len;
958 struct GNUNET_NAMESTORE_RecordData p_rd[rd_count]; 959 struct GNUNET_NAMESTORE_RecordData p_rd[rd_count];
959 char* pos; 960 char* pos;
960 char* trailer; 961 char* trailer;
962 struct GNUNET_DNSPARSER_MxRecord *mx;
961 963
962 if (rd_count > 0) 964 if (rd_count > 0)
963 memcpy(p_rd, rd, rd_count*sizeof(struct GNUNET_NAMESTORE_RecordData)); 965 memcpy(p_rd, rd, rd_count*sizeof(struct GNUNET_NAMESTORE_RecordData));
@@ -978,11 +980,21 @@ finish_lookup(struct ResolverHandle *rh,
978 * also try to resolve the A/AAAA records (RFC1035) 980 * also try to resolve the A/AAAA records (RFC1035)
979 * FIXME 981 * FIXME
980 */ 982 */
981 s_value = (char*)rd[i].data; 983 if (rd[i].record_type == GNUNET_GNS_RECORD_MX)
982 s_len = rd[i].data_size; 984 {
985 mx = (struct GNUNET_DNSPARSER_MxRecord*)rd[i].data;
986 s_value = (char*)&mx[1];
987 }
988 else
989 {
990 s_value = (char*)rd[i].data;
991 }
992
993 s_len = strlen(s_value)+1;
983 994
984 if (s_len < 3) 995 if (s_len < 3)
985 { 996 {
997 /* no postprocessing */
986 p_rd[i].data = rd[i].data; 998 p_rd[i].data = rd[i].data;
987 continue; 999 continue;
988 } 1000 }
@@ -1007,8 +1019,24 @@ finish_lookup(struct ResolverHandle *rh,
1007 pos = new_s_value+s_len-2; 1019 pos = new_s_value+s_len-2;
1008 strcpy(pos, trailer); 1020 strcpy(pos, trailer);
1009 pos += strlen(trailer); 1021 pos += strlen(trailer);
1010 p_rd[i].data = new_s_value; 1022 if (rd[i].record_type == GNUNET_GNS_RECORD_MX)
1011 p_rd[i].data_size = strlen(new_s_value)+1; 1023 {
1024
1025 p_rd[i].data_size = sizeof(struct GNUNET_DNSPARSER_MxRecord)
1026 +strlen(new_s_value)+1;
1027
1028 p_rd[i].data = new_mx_value;
1029 mx = (struct GNUNET_DNSPARSER_MxRecord*)p_rd[i].data;
1030 mx->preference =
1031 ((struct GNUNET_DNSPARSER_MxRecord*)rd[i].data)->preference;
1032 memcpy((char*)&mx[1], new_s_value, strlen(new_s_value)+1);
1033 mx->mxhost = (char*)&mx[1];
1034 }
1035 else
1036 {
1037 p_rd[i].data = new_s_value;
1038 p_rd[i].data_size = strlen(new_s_value)+1;
1039 }
1012 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, 1040 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
1013 "Expanded to %s\n", new_s_value); 1041 "Expanded to %s\n", new_s_value);
1014 } 1042 }
diff --git a/src/gns/test_gns_simple_mx_lookup.c b/src/gns/test_gns_simple_mx_lookup.c
index 1f39b175f..7f854c6f3 100644
--- a/src/gns/test_gns_simple_mx_lookup.c
+++ b/src/gns/test_gns_simple_mx_lookup.c
@@ -97,7 +97,7 @@ on_lookup_result(void *cls, uint32_t rd_count,
97 char* addr; 97 char* addr;
98 int mx_found = 0; 98 int mx_found = 0;
99 int ip_found = 0; 99 int ip_found = 0;
100 char* mx; 100 struct GNUNET_DNSPARSER_MxRecord *mx;
101 101
102 if (rd_count == 0) 102 if (rd_count == 0)
103 { 103 {
@@ -126,8 +126,11 @@ on_lookup_result(void *cls, uint32_t rd_count,
126 } 126 }
127 else if (rd[i].record_type == GNUNET_GNS_RECORD_MX) 127 else if (rd[i].record_type == GNUNET_GNS_RECORD_MX)
128 { 128 {
129 mx = (char*)rd[i].data; 129 mx = (struct GNUNET_DNSPARSER_MxRecord*)rd[i].data;
130 if (0 == strcmp(mx, TEST_EXPECTED_MX)) 130 mx->mxhost = (char*)&mx[1];
131 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
132 "Got MX %s\n", mx->mxhost);
133 if (0 == strcmp(mx->mxhost, TEST_EXPECTED_MX))
131 { 134 {
132 GNUNET_log (GNUNET_ERROR_TYPE_INFO, 135 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
133 "%s correctly resolved to %s!\n", TEST_DOMAIN, 136 "%s correctly resolved to %s!\n", TEST_DOMAIN,
@@ -250,6 +253,7 @@ do_lookup(void *cls, const struct GNUNET_PeerIdentity *id,
250 struct GNUNET_NAMESTORE_RecordData rd; 253 struct GNUNET_NAMESTORE_RecordData rd;
251 char* ip = TEST_IP; 254 char* ip = TEST_IP;
252 struct in_addr *mail = GNUNET_malloc(sizeof(struct in_addr)); 255 struct in_addr *mail = GNUNET_malloc(sizeof(struct in_addr));
256 struct GNUNET_DNSPARSER_MxRecord *mx_record;
253 rd.expiration = GNUNET_TIME_absolute_get_forever (); 257 rd.expiration = GNUNET_TIME_absolute_get_forever ();
254 GNUNET_assert(1 == inet_pton (AF_INET, ip, mail)); 258 GNUNET_assert(1 == inet_pton (AF_INET, ip, mail));
255 259
@@ -283,9 +287,13 @@ do_lookup(void *cls, const struct GNUNET_PeerIdentity *id,
283 sig, 287 sig,
284 NULL, 288 NULL,
285 NULL); 289 NULL);
286 290
287 rd.data_size = strlen(TEST_MX_NAME)+1; 291 rd.data_size = sizeof(struct GNUNET_DNSPARSER_MxRecord)+strlen(TEST_MX_NAME)+1;
288 rd.data = TEST_MX_NAME; 292 mx_record = GNUNET_malloc(rd.data_size);
293 mx_record->preference = 1;
294 mx_record->mxhost = (char*)&mx_record[1];
295 strcpy(mx_record->mxhost, TEST_MX_NAME);
296 rd.data = mx_record;
289 rd.record_type = GNUNET_GNS_RECORD_MX; 297 rd.record_type = GNUNET_GNS_RECORD_MX;
290 sig = GNUNET_NAMESTORE_create_signature(bob_key, 298 sig = GNUNET_NAMESTORE_create_signature(bob_key,
291 GNUNET_TIME_absolute_get_forever(), 299 GNUNET_TIME_absolute_get_forever(),
@@ -300,6 +308,7 @@ do_lookup(void *cls, const struct GNUNET_PeerIdentity *id,
300 sig, 308 sig,
301 &commence_testing, 309 &commence_testing,
302 NULL); 310 NULL);
311 GNUNET_free(mx_record);
303 GNUNET_free(mail); 312 GNUNET_free(mail);
304 GNUNET_free(sig); 313 GNUNET_free(sig);
305 GNUNET_CRYPTO_rsa_key_free(bob_key); 314 GNUNET_CRYPTO_rsa_key_free(bob_key);