diff options
author | Martin Schanzenbach <mschanzenbach@posteo.de> | 2012-03-19 12:20:30 +0000 |
---|---|---|
committer | Martin Schanzenbach <mschanzenbach@posteo.de> | 2012-03-19 12:20:30 +0000 |
commit | ab700c23613c8f1df85fe17134a93782d2bd42a2 (patch) | |
tree | 8afeeb73d4da9eba7898b02e0189c13af7fb7192 | |
parent | b3e1d0806fb274c62a5acf19c56369b71f992312 (diff) | |
download | gnunet-ab700c23613c8f1df85fe17134a93782d2bd42a2.tar.gz gnunet-ab700c23613c8f1df85fe17134a93782d2bd42a2.zip |
-fix mx records postprocessing
-rw-r--r-- | src/gns/gnunet-service-gns_interceptor.c | 21 | ||||
-rw-r--r-- | src/gns/gnunet-service-gns_resolver.c | 36 | ||||
-rw-r--r-- | src/gns/test_gns_simple_mx_lookup.c | 21 |
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); |