diff options
Diffstat (limited to 'src/gns/gnunet-service-gns_resolver.c')
-rw-r--r-- | src/gns/gnunet-service-gns_resolver.c | 43 |
1 files changed, 40 insertions, 3 deletions
diff --git a/src/gns/gnunet-service-gns_resolver.c b/src/gns/gnunet-service-gns_resolver.c index 8639a239b..4b2641818 100644 --- a/src/gns/gnunet-service-gns_resolver.c +++ b/src/gns/gnunet-service-gns_resolver.c | |||
@@ -1232,13 +1232,14 @@ handle_gns_cname_result (struct GNS_ResolverHandle *rh, | |||
1232 | { | 1232 | { |
1233 | size_t nlen; | 1233 | size_t nlen; |
1234 | char *res; | 1234 | char *res; |
1235 | const char *tld; | ||
1235 | struct AuthorityChain *ac; | 1236 | struct AuthorityChain *ac; |
1236 | int af; | 1237 | int af; |
1238 | struct GNUNET_CRYPTO_EcdsaPublicKey zone; | ||
1237 | 1239 | ||
1238 | nlen = strlen (cname); | 1240 | nlen = strlen (cname); |
1239 | if ((nlen > 2) && | 1241 | tld = GNS_get_tld (cname); |
1240 | (0 == strcmp (".+", | 1242 | if (0 == strcmp ("+", tld)) |
1241 | &cname[nlen - 2]))) | ||
1242 | { | 1243 | { |
1243 | /* CNAME resolution continues relative to current domain */ | 1244 | /* CNAME resolution continues relative to current domain */ |
1244 | if (0 == rh->name_resolution_pos) | 1245 | if (0 == rh->name_resolution_pos) |
@@ -1272,6 +1273,42 @@ handle_gns_cname_result (struct GNS_ResolverHandle *rh, | |||
1272 | rh); | 1273 | rh); |
1273 | return; | 1274 | return; |
1274 | } | 1275 | } |
1276 | if (GNUNET_OK == GNUNET_GNSRECORD_zkey_to_pkey (tld, &zone)) | ||
1277 | { | ||
1278 | /* CNAME resolution continues relative to current domain */ | ||
1279 | if (0 == rh->name_resolution_pos) | ||
1280 | { | ||
1281 | GNUNET_asprintf (&res, | ||
1282 | "%.*s", | ||
1283 | strlen (cname) - (strlen (tld) + 1), | ||
1284 | cname); | ||
1285 | } | ||
1286 | else | ||
1287 | { | ||
1288 | GNUNET_asprintf (&res, | ||
1289 | "%.*s.%.*s", | ||
1290 | (int) rh->name_resolution_pos, | ||
1291 | rh->name, | ||
1292 | (int) strlen (cname) - (strlen(tld)+1), | ||
1293 | cname); | ||
1294 | } | ||
1295 | rh->name_resolution_pos = strlen (res); | ||
1296 | GNUNET_free (rh->name); | ||
1297 | rh->name = res; | ||
1298 | ac = GNUNET_new (struct AuthorityChain); | ||
1299 | ac->rh = rh; | ||
1300 | ac->gns_authority = GNUNET_YES; | ||
1301 | ac->authority_info.gns_authority = zone; | ||
1302 | ac->label = resolver_lookup_get_next_label (rh); | ||
1303 | /* add AC to tail */ | ||
1304 | GNUNET_CONTAINER_DLL_insert_tail (rh->ac_head, | ||
1305 | rh->ac_tail, | ||
1306 | ac); | ||
1307 | rh->task_id = GNUNET_SCHEDULER_add_now (&recursive_resolution, | ||
1308 | rh); | ||
1309 | return; | ||
1310 | } | ||
1311 | |||
1275 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | 1312 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
1276 | "Got CNAME `%s' from GNS for `%s'\n", | 1313 | "Got CNAME `%s' from GNS for `%s'\n", |
1277 | cname, | 1314 | cname, |