aboutsummaryrefslogtreecommitdiff
path: root/src/namestore
diff options
context:
space:
mode:
authorMatthias Wachs <wachs@net.in.tum.de>2013-12-04 10:48:17 +0000
committerMatthias Wachs <wachs@net.in.tum.de>2013-12-04 10:48:17 +0000
commitfa6e145f9a526315ef563833eb0b0ab8b5296179 (patch)
tree51713a7176960f990a16724aac8c2ae1fc2a41ed /src/namestore
parentf4613de3ba9fc7851dfd6933596690d0ada6b74b (diff)
downloadgnunet-fa6e145f9a526315ef563833eb0b0ab8b5296179.tar.gz
gnunet-fa6e145f9a526315ef563833eb0b0ab8b5296179.zip
expiration
Diffstat (limited to 'src/namestore')
-rw-r--r--src/namestore/gnunet-service-namestore.c46
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
455static void 455static void
456merge_records (unsigned int rdc1, 456merge_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);