diff options
Diffstat (limited to 'src/gns/gnunet-service-gns_resolver.c')
-rw-r--r-- | src/gns/gnunet-service-gns_resolver.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/src/gns/gnunet-service-gns_resolver.c b/src/gns/gnunet-service-gns_resolver.c index 66029a21c..75a49a575 100644 --- a/src/gns/gnunet-service-gns_resolver.c +++ b/src/gns/gnunet-service-gns_resolver.c | |||
@@ -752,6 +752,7 @@ dns_result_parser (void *cls, | |||
752 | unsigned int skip; | 752 | unsigned int skip; |
753 | char buf[UINT16_MAX]; | 753 | char buf[UINT16_MAX]; |
754 | size_t buf_off; | 754 | size_t buf_off; |
755 | size_t buf_start; | ||
755 | 756 | ||
756 | buf_off = 0; | 757 | buf_off = 0; |
757 | skip = 0; | 758 | skip = 0; |
@@ -804,6 +805,7 @@ dns_result_parser (void *cls, | |||
804 | case GNUNET_DNSPARSER_TYPE_CNAME: | 805 | case GNUNET_DNSPARSER_TYPE_CNAME: |
805 | case GNUNET_DNSPARSER_TYPE_PTR: | 806 | case GNUNET_DNSPARSER_TYPE_PTR: |
806 | case GNUNET_DNSPARSER_TYPE_NS: | 807 | case GNUNET_DNSPARSER_TYPE_NS: |
808 | buf_start = buf_off; | ||
807 | if (GNUNET_OK != | 809 | if (GNUNET_OK != |
808 | GNUNET_DNSPARSER_builder_add_name (buf, | 810 | GNUNET_DNSPARSER_builder_add_name (buf, |
809 | sizeof (buf), | 811 | sizeof (buf), |
@@ -814,8 +816,11 @@ dns_result_parser (void *cls, | |||
814 | skip++; | 816 | skip++; |
815 | continue; | 817 | continue; |
816 | } | 818 | } |
819 | rd[i - skip].data_size = buf_off - buf_start; | ||
820 | rd[i - skip].data = &buf[buf_start]; | ||
817 | break; | 821 | break; |
818 | case GNUNET_DNSPARSER_TYPE_SOA: | 822 | case GNUNET_DNSPARSER_TYPE_SOA: |
823 | buf_start = buf_off; | ||
819 | if (GNUNET_OK != | 824 | if (GNUNET_OK != |
820 | GNUNET_DNSPARSER_builder_add_soa (buf, | 825 | GNUNET_DNSPARSER_builder_add_soa (buf, |
821 | sizeof (buf), | 826 | sizeof (buf), |
@@ -826,8 +831,11 @@ dns_result_parser (void *cls, | |||
826 | skip++; | 831 | skip++; |
827 | continue; | 832 | continue; |
828 | } | 833 | } |
834 | rd[i - skip].data_size = buf_off - buf_start; | ||
835 | rd[i - skip].data = &buf[buf_start]; | ||
829 | break; | 836 | break; |
830 | case GNUNET_DNSPARSER_TYPE_MX: | 837 | case GNUNET_DNSPARSER_TYPE_MX: |
838 | buf_start = buf_off; | ||
831 | if (GNUNET_OK != | 839 | if (GNUNET_OK != |
832 | GNUNET_DNSPARSER_builder_add_mx (buf, | 840 | GNUNET_DNSPARSER_builder_add_mx (buf, |
833 | sizeof (buf), | 841 | sizeof (buf), |
@@ -838,8 +846,11 @@ dns_result_parser (void *cls, | |||
838 | skip++; | 846 | skip++; |
839 | continue; | 847 | continue; |
840 | } | 848 | } |
849 | rd[i - skip].data_size = buf_off - buf_start; | ||
850 | rd[i - skip].data = &buf[buf_start]; | ||
841 | break; | 851 | break; |
842 | case GNUNET_DNSPARSER_TYPE_SRV: | 852 | case GNUNET_DNSPARSER_TYPE_SRV: |
853 | buf_start = buf_off; | ||
843 | if (GNUNET_OK != | 854 | if (GNUNET_OK != |
844 | GNUNET_DNSPARSER_builder_add_srv (buf, | 855 | GNUNET_DNSPARSER_builder_add_srv (buf, |
845 | sizeof (buf), | 856 | sizeof (buf), |
@@ -850,6 +861,8 @@ dns_result_parser (void *cls, | |||
850 | skip++; | 861 | skip++; |
851 | continue; | 862 | continue; |
852 | } | 863 | } |
864 | rd[i - skip].data_size = buf_off - buf_start; | ||
865 | rd[i - skip].data = &buf[buf_start]; | ||
853 | break; | 866 | break; |
854 | default: | 867 | default: |
855 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | 868 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
@@ -1197,6 +1210,11 @@ handle_gns_resolution_result (void *cls, | |||
1197 | rh); | 1210 | rh); |
1198 | return; | 1211 | return; |
1199 | } | 1212 | } |
1213 | case GNUNET_NAMESTORE_TYPE_GNS2DNS: | ||
1214 | { | ||
1215 | /* delegation to DNS */ | ||
1216 | goto do_recurse; | ||
1217 | } | ||
1200 | default: | 1218 | default: |
1201 | break; | 1219 | break; |
1202 | } | 1220 | } |
@@ -1392,6 +1410,7 @@ handle_gns_resolution_result (void *cls, | |||
1392 | GNS_resolver_lookup_cancel (rh); | 1410 | GNS_resolver_lookup_cancel (rh); |
1393 | return; | 1411 | return; |
1394 | } | 1412 | } |
1413 | do_recurse: | ||
1395 | /* need to recurse, check if we can */ | 1414 | /* need to recurse, check if we can */ |
1396 | for (i=0;i<rd_count;i++) | 1415 | for (i=0;i<rd_count;i++) |
1397 | { | 1416 | { |
@@ -1428,7 +1447,7 @@ handle_gns_resolution_result (void *cls, | |||
1428 | rh->task_id = GNUNET_SCHEDULER_add_now (&recursive_resolution, | 1447 | rh->task_id = GNUNET_SCHEDULER_add_now (&recursive_resolution, |
1429 | rh); | 1448 | rh); |
1430 | return; | 1449 | return; |
1431 | case GNUNET_DNSPARSER_TYPE_NS: | 1450 | case GNUNET_NAMESTORE_TYPE_GNS2DNS: |
1432 | { | 1451 | { |
1433 | char *ns; | 1452 | char *ns; |
1434 | /* resolution continues within DNS */ | 1453 | /* resolution continues within DNS */ |
@@ -1527,9 +1546,10 @@ handle_gns_resolution_result (void *cls, | |||
1527 | created from the remainder of the GNS name and the | 1546 | created from the remainder of the GNS name and the |
1528 | name in the NS record */ | 1547 | name in the NS record */ |
1529 | GNUNET_asprintf (&ac->label, | 1548 | GNUNET_asprintf (&ac->label, |
1530 | "%.*s.%s", | 1549 | "%.*s%s%s", |
1531 | (int) rh->name_resolution_pos, | 1550 | (int) rh->name_resolution_pos, |
1532 | rh->name, | 1551 | rh->name, |
1552 | (0 != rh->name_resolution_pos) ? "." : "", | ||
1533 | ns); | 1553 | ns); |
1534 | GNUNET_free (ns); | 1554 | GNUNET_free (ns); |
1535 | GNUNET_CONTAINER_DLL_insert_tail (rh->ac_head, | 1555 | GNUNET_CONTAINER_DLL_insert_tail (rh->ac_head, |