diff options
author | Matthias Wachs <wachs@net.in.tum.de> | 2013-12-04 10:48:17 +0000 |
---|---|---|
committer | Matthias Wachs <wachs@net.in.tum.de> | 2013-12-04 10:48:17 +0000 |
commit | fa6e145f9a526315ef563833eb0b0ab8b5296179 (patch) | |
tree | 51713a7176960f990a16724aac8c2ae1fc2a41ed /src/namestore | |
parent | f4613de3ba9fc7851dfd6933596690d0ada6b74b (diff) | |
download | gnunet-fa6e145f9a526315ef563833eb0b0ab8b5296179.tar.gz gnunet-fa6e145f9a526315ef563833eb0b0ab8b5296179.zip |
expiration
Diffstat (limited to 'src/namestore')
-rw-r--r-- | src/namestore/gnunet-service-namestore.c | 46 |
1 files changed, 28 insertions, 18 deletions
diff --git a/src/namestore/gnunet-service-namestore.c b/src/namestore/gnunet-service-namestore.c index 43afe76dd..dba0b8235 100644 --- a/src/namestore/gnunet-service-namestore.c +++ b/src/namestore/gnunet-service-namestore.c | |||
@@ -453,48 +453,58 @@ get_nick_record (const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone) | |||
453 | 453 | ||
454 | 454 | ||
455 | static void | 455 | static void |
456 | merge_records (unsigned int rdc1, | 456 | merge_with_nick_records ( const struct GNUNET_GNSRECORD_Data *nick_rd, |
457 | const struct GNUNET_GNSRECORD_Data *rd1, | ||
458 | unsigned int rdc2, | 457 | unsigned int rdc2, |
459 | const struct GNUNET_GNSRECORD_Data *rd2, | 458 | const struct GNUNET_GNSRECORD_Data *rd2, |
460 | unsigned int *rdc_res, | 459 | unsigned int *rdc_res, |
461 | struct GNUNET_GNSRECORD_Data **rd_res) | 460 | struct GNUNET_GNSRECORD_Data **rd_res) |
462 | { | 461 | { |
462 | uint64_t latest_expiration; | ||
463 | int c; | 463 | int c; |
464 | size_t req; | 464 | size_t req; |
465 | char *data; | 465 | char *data; |
466 | int record_offset; | 466 | int record_offset; |
467 | size_t data_offset; | 467 | size_t data_offset; |
468 | (*rdc_res) = rdc1 + rdc2; | 468 | (*rdc_res) = 1 + rdc2; |
469 | 469 | ||
470 | if (0 == rdc1 + rdc2) | 470 | if (0 == 1 + rdc2) |
471 | { | 471 | { |
472 | (*rd_res) = NULL; | 472 | (*rd_res) = NULL; |
473 | return; | 473 | return; |
474 | } | 474 | } |
475 | 475 | ||
476 | req = 0; | 476 | req = 0; |
477 | for (c=0; c< rdc1; c++) | 477 | for (c=0; c< 1; c++) |
478 | req += sizeof (struct GNUNET_GNSRECORD_Data) + rd1[c].data_size; | 478 | req += sizeof (struct GNUNET_GNSRECORD_Data) + nick_rd[c].data_size; |
479 | for (c=0; c< rdc2; c++) | 479 | for (c=0; c< rdc2; c++) |
480 | req += sizeof (struct GNUNET_GNSRECORD_Data) + rd2[c].data_size; | 480 | req += sizeof (struct GNUNET_GNSRECORD_Data) + rd2[c].data_size; |
481 | (*rd_res) = GNUNET_malloc (req); | 481 | (*rd_res) = GNUNET_malloc (req); |
482 | data = (char *) &(*rd_res)[rdc1 + rdc2]; | 482 | data = (char *) &(*rd_res)[1 + rdc2]; |
483 | data_offset = 0; | 483 | data_offset = 0; |
484 | latest_expiration = 0; | ||
484 | 485 | ||
485 | for (c=0; c< rdc1; c++) | 486 | for (c=0; c< rdc2; c++) |
486 | { | 487 | { |
487 | (*rd_res)[c] = rd1[c]; | 488 | if (0 != (rd2[c].flags & GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION)) |
489 | { | ||
490 | if ((GNUNET_TIME_absolute_get().abs_value_us + rd2[c].expiration_time) > | ||
491 | latest_expiration) | ||
492 | latest_expiration = rd2[c].expiration_time; | ||
493 | } | ||
494 | else if (rd2[c].expiration_time > latest_expiration) | ||
495 | latest_expiration = rd2[c].expiration_time; | ||
496 | (*rd_res)[c] = rd2[c]; | ||
488 | (*rd_res)[c].data = (void *) &data[data_offset]; | 497 | (*rd_res)[c].data = (void *) &data[data_offset]; |
489 | memcpy ((void *) (*rd_res)[c].data, rd1[c].data, rd1[c].data_size); | 498 | memcpy ((void *) (*rd_res)[c].data, rd2[c].data, rd2[c].data_size); |
490 | data_offset += (*rd_res)[c].data_size; | 499 | data_offset += (*rd_res)[c].data_size; |
491 | } | 500 | } |
492 | record_offset = rdc1; | 501 | record_offset = rdc2; |
493 | for (c=0; c< rdc2; c++) | 502 | for (c=0; c< 1; c++) |
494 | { | 503 | { |
495 | (*rd_res)[c+record_offset] = rd2[c]; | 504 | (*rd_res)[c+record_offset] = nick_rd[c]; |
505 | (*rd_res)[c+record_offset].expiration_time = latest_expiration; | ||
496 | (*rd_res)[c+record_offset].data = (void *) &data[data_offset]; | 506 | (*rd_res)[c+record_offset].data = (void *) &data[data_offset]; |
497 | memcpy ((void *) (*rd_res)[c+record_offset].data, rd2[c].data, rd2[c].data_size); | 507 | memcpy ((void *) (*rd_res)[c+record_offset].data, nick_rd[c].data, nick_rd[c].data_size); |
498 | data_offset += (*rd_res)[c+record_offset].data_size; | 508 | data_offset += (*rd_res)[c+record_offset].data_size; |
499 | } | 509 | } |
500 | GNUNET_assert (req == (sizeof (struct GNUNET_GNSRECORD_Data)) * (*rdc_res) + data_offset); | 510 | GNUNET_assert (req == (sizeof (struct GNUNET_GNSRECORD_Data)) * (*rdc_res) + data_offset); |
@@ -536,7 +546,7 @@ send_lookup_response (struct GNUNET_SERVER_NotificationContext *nc, | |||
536 | if ((NULL != nick) && (0 != strcmp(name, GNUNET_GNS_MASTERZONE_STR))) | 546 | if ((NULL != nick) && (0 != strcmp(name, GNUNET_GNS_MASTERZONE_STR))) |
537 | { | 547 | { |
538 | nick->flags = (nick->flags | GNUNET_GNSRECORD_RF_PRIVATE) ^ GNUNET_GNSRECORD_RF_PRIVATE; | 548 | nick->flags = (nick->flags | GNUNET_GNSRECORD_RF_PRIVATE) ^ GNUNET_GNSRECORD_RF_PRIVATE; |
539 | merge_records (rd_count,rd, 1, nick, &res_count, &res); | 549 | merge_with_nick_records (nick, rd_count,rd, &res_count, &res); |
540 | //fprintf (stderr, "Merging %u records for `%s' with NICK records\n",rd_count, name); | 550 | //fprintf (stderr, "Merging %u records for `%s' with NICK records\n",rd_count, name); |
541 | GNUNET_free (nick); | 551 | GNUNET_free (nick); |
542 | } | 552 | } |
@@ -669,7 +679,7 @@ refresh_block (struct GNUNET_SERVER_Client *client, | |||
669 | if (NULL != nick) | 679 | if (NULL != nick) |
670 | { | 680 | { |
671 | nick->flags = (nick->flags | GNUNET_GNSRECORD_RF_PRIVATE) ^ GNUNET_GNSRECORD_RF_PRIVATE; | 681 | nick->flags = (nick->flags | GNUNET_GNSRECORD_RF_PRIVATE) ^ GNUNET_GNSRECORD_RF_PRIVATE; |
672 | merge_records (rd_count,rd, 1, nick, &res_count, &res); | 682 | merge_with_nick_records (nick, rd_count,rd, &res_count, &res); |
673 | GNUNET_free (nick); | 683 | GNUNET_free (nick); |
674 | } | 684 | } |
675 | 685 | ||
@@ -743,8 +753,8 @@ lookup_it (void *cls, const struct GNUNET_CRYPTO_EcdsaPrivateKey *private_key, | |||
743 | rd_res = NULL; | 753 | rd_res = NULL; |
744 | rdc_res = 0; | 754 | rdc_res = 0; |
745 | rlc->nick->flags = (rlc->nick->flags | GNUNET_GNSRECORD_RF_PRIVATE) ^ GNUNET_GNSRECORD_RF_PRIVATE; | 755 | rlc->nick->flags = (rlc->nick->flags | GNUNET_GNSRECORD_RF_PRIVATE) ^ GNUNET_GNSRECORD_RF_PRIVATE; |
746 | merge_records (rd_count, rd, | 756 | merge_with_nick_records ( rlc->nick, |
747 | 1, rlc->nick, | 757 | rd_count, rd, |
748 | &rdc_res, &rd_res); | 758 | &rdc_res, &rd_res); |
749 | 759 | ||
750 | rlc->rd_ser_len = GNUNET_GNSRECORD_records_get_size (rdc_res, rd_res); | 760 | rlc->rd_ser_len = GNUNET_GNSRECORD_records_get_size (rdc_res, rd_res); |