aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMartin Schanzenbach <mschanzenbach@posteo.de>2012-03-21 15:41:47 +0000
committerMartin Schanzenbach <mschanzenbach@posteo.de>2012-03-21 15:41:47 +0000
commit4851f02b771d731feed878352fcd03bd4d037185 (patch)
tree2945c1876f733f99359cbd55c4a165875d6f3164 /src
parent6064b3d40f03db919544bae5ef2834e89ce4af10 (diff)
downloadgnunet-4851f02b771d731feed878352fcd03bd4d037185.tar.gz
gnunet-4851f02b771d731feed878352fcd03bd4d037185.zip
-fix soa
Diffstat (limited to 'src')
-rw-r--r--src/gns/gnunet-service-gns_resolver.c140
1 files changed, 83 insertions, 57 deletions
diff --git a/src/gns/gnunet-service-gns_resolver.c b/src/gns/gnunet-service-gns_resolver.c
index cd4b0f1fe..df4ba670f 100644
--- a/src/gns/gnunet-service-gns_resolver.c
+++ b/src/gns/gnunet-service-gns_resolver.c
@@ -931,6 +931,44 @@ process_delegation_result_dht(void* cls,
931 rh->proc(rh->proc_cls, rh, 0, NULL); 931 rh->proc(rh->proc_cls, rh, 0, NULL);
932} 932}
933 933
934#define MAX_SOA_LENGTH sizeof(uint32_t)+sizeof(uint32_t)+sizeof(uint32_t)+sizeof(uint32_t)\
935 +(MAX_DNS_NAME_LENGTH*2)
936#define MAX_MX_LENGTH sizeof(uint16_t)+MAX_DNS_NAME_LENGTH
937
938
939static void
940expand_plus(char** dest, char* src, char* repl)
941{
942 char* pos;
943 unsigned int s_len = strlen(src)+1;
944
945 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
946 "Got %s to expand with %s\n", src, repl);
947
948 if (s_len < 3)
949 {
950 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
951 "%s to short\n", src);
952
953 /* no postprocessing */
954 memcpy(*dest, src, s_len+1);
955 return;
956 }
957
958 if (0 == strcmp(src+s_len-3, ".+"))
959 {
960 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
961 "Expanding .+ in %s\n", src);
962 memset(*dest, 0, s_len+strlen(repl)+strlen(GNUNET_GNS_TLD));
963 strcpy(*dest, src);
964 pos = *dest+s_len-2;
965 strcpy(pos, repl);
966 pos += strlen(repl);
967 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
968 "Expanded to %s\n", *dest);
969 }
970}
971
934/** 972/**
935 * finish lookup 973 * finish lookup
936 */ 974 */
@@ -941,13 +979,13 @@ finish_lookup(struct ResolverHandle *rh,
941 const struct GNUNET_NAMESTORE_RecordData *rd) 979 const struct GNUNET_NAMESTORE_RecordData *rd)
942{ 980{
943 int i; 981 int i;
944 char* s_value; 982 char new_rr_data[MAX_DNS_NAME_LENGTH];
945 char new_s_value[256]; 983 char new_mx_data[MAX_MX_LENGTH];
946 char new_mx_value[sizeof(uint16_t)+256]; 984 char new_soa_data[MAX_SOA_LENGTH];
947 int s_len;
948 struct GNUNET_NAMESTORE_RecordData p_rd[rd_count]; 985 struct GNUNET_NAMESTORE_RecordData p_rd[rd_count];
986 char* repl_string;
949 char* pos; 987 char* pos;
950 char* trailer; 988 unsigned int offset;
951 989
952 if (rd_count > 0) 990 if (rd_count > 0)
953 memcpy(p_rd, rd, rd_count*sizeof(struct GNUNET_NAMESTORE_RecordData)); 991 memcpy(p_rd, rd, rd_count*sizeof(struct GNUNET_NAMESTORE_RecordData));
@@ -957,7 +995,8 @@ finish_lookup(struct ResolverHandle *rh,
957 995
958 if (rd[i].record_type != GNUNET_GNS_RECORD_TYPE_NS && 996 if (rd[i].record_type != GNUNET_GNS_RECORD_TYPE_NS &&
959 rd[i].record_type != GNUNET_GNS_RECORD_TYPE_CNAME && 997 rd[i].record_type != GNUNET_GNS_RECORD_TYPE_CNAME &&
960 rd[i].record_type != GNUNET_GNS_RECORD_MX) 998 rd[i].record_type != GNUNET_GNS_RECORD_MX &&
999 rd[i].record_type != GNUNET_GNS_RECORD_TYPE_SOA)
961 { 1000 {
962 p_rd[i].data = rd[i].data; 1001 p_rd[i].data = rd[i].data;
963 continue; 1002 continue;
@@ -966,65 +1005,52 @@ finish_lookup(struct ResolverHandle *rh,
966 /** 1005 /**
967 * for all those records we 'should' 1006 * for all those records we 'should'
968 * also try to resolve the A/AAAA records (RFC1035) 1007 * also try to resolve the A/AAAA records (RFC1035)
969 * FIXME 1008 * This is a feature and not important
970 */ 1009 */
971 if (rd[i].record_type == GNUNET_GNS_RECORD_MX) 1010
972 { 1011 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
973 s_value = (char*)rd[i].data+sizeof(uint16_t); 1012 "Postprocessing\n");
974 } 1013
1014 if (strcmp(rh->name, "+") == 0)
1015 repl_string = rlh->name;
975 else 1016 else
1017 repl_string = rlh->name+strlen(rh->name)+1;
1018
1019 offset = 0;
1020 if (rd[i].record_type == GNUNET_GNS_RECORD_MX)
976 { 1021 {
977 s_value = (char*)rd[i].data; 1022 memcpy(new_mx_data, (char*)rd[i].data, sizeof(uint16_t));
1023 offset = sizeof(uint16_t);
1024 pos = new_mx_data+offset;
1025 expand_plus(&pos, (char*)rd[i].data+sizeof(uint16_t),
1026 repl_string);
1027 offset += strlen(new_mx_data+sizeof(uint16_t))+1;
1028 p_rd[i].data = new_mx_data;
1029 p_rd[i].data_size = offset;
978 } 1030 }
979 1031 else if (rd[i].record_type == GNUNET_GNS_RECORD_TYPE_SOA)
980 s_len = strlen(s_value)+1;
981
982 if (s_len < 3)
983 { 1032 {
984 /* no postprocessing */ 1033 /* expand mname and rname */
985 p_rd[i].data = rd[i].data; 1034 pos = new_soa_data;
986 continue; 1035 expand_plus(&pos, (char*)rd[i].data, repl_string);
1036 offset = strlen(new_soa_data)+1;
1037 pos = new_soa_data+offset;
1038 expand_plus(&pos, (char*)rd[i].data+offset, repl_string);
1039 offset += strlen(new_soa_data+offset)+1;
1040 /* cpy the 4 numbers serial refresh retry and expire */
1041 memcpy(new_soa_data+offset, (char*)rd[i].data+offset, sizeof(uint32_t)*4);
1042 offset += sizeof(uint32_t)*4;
1043 p_rd[i].data_size = offset;
1044 p_rd[i].data = new_soa_data;
987 } 1045 }
988 1046 else
989 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
990 "Postprocessing %s\n", s_value);
991
992 if (0 == strcmp(s_value+s_len-3, ".+"))
993 { 1047 {
994 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, 1048 pos = new_rr_data;
995 "Expanding .+ in %s\n", s_value); 1049 expand_plus(&pos, (char*)rd[i].data, repl_string);
996 if (strcmp(rh->name, "+") == 0) 1050 p_rd[i].data_size = strlen(new_rr_data)+1;
997 { 1051 p_rd[i].data = new_rr_data;
998 trailer = rlh->name;
999 }
1000 else
1001 {
1002 trailer = rlh->name+strlen(rh->name)+1;
1003 }
1004 memset(new_s_value, 0, s_len+strlen(trailer)+strlen(GNUNET_GNS_TLD));
1005 strcpy(new_s_value, s_value);
1006 pos = new_s_value+s_len-2;
1007 strcpy(pos, trailer);
1008 pos += strlen(trailer);
1009 if (rd[i].record_type == GNUNET_GNS_RECORD_MX)
1010 {
1011
1012 p_rd[i].data_size = sizeof(uint16_t)+strlen(new_s_value)+1;
1013
1014 p_rd[i].data = new_mx_value;
1015 /* cpy preference */
1016 memcpy(new_mx_value, (char*)rd[i].data, sizeof(uint16_t));
1017 /* cpy string */
1018 memcpy(new_mx_value+sizeof(uint16_t), new_s_value, strlen(new_s_value)+1);
1019 }
1020 else
1021 {
1022 p_rd[i].data = new_s_value;
1023 p_rd[i].data_size = strlen(new_s_value)+1;
1024 }
1025 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
1026 "Expanded to %s\n", new_s_value);
1027 } 1052 }
1053
1028 } 1054 }
1029 1055
1030 rlh->proc(rlh->proc_cls, rd_count, p_rd); 1056 rlh->proc(rlh->proc_cls, rd_count, p_rd);