diff options
author | Martin Schanzenbach <mschanzenbach@posteo.de> | 2012-03-21 15:41:47 +0000 |
---|---|---|
committer | Martin Schanzenbach <mschanzenbach@posteo.de> | 2012-03-21 15:41:47 +0000 |
commit | 4851f02b771d731feed878352fcd03bd4d037185 (patch) | |
tree | 2945c1876f733f99359cbd55c4a165875d6f3164 /src | |
parent | 6064b3d40f03db919544bae5ef2834e89ce4af10 (diff) | |
download | gnunet-4851f02b771d731feed878352fcd03bd4d037185.tar.gz gnunet-4851f02b771d731feed878352fcd03bd4d037185.zip |
-fix soa
Diffstat (limited to 'src')
-rw-r--r-- | src/gns/gnunet-service-gns_resolver.c | 140 |
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 | |||
939 | static void | ||
940 | expand_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); |