rdc[i] = rd[i];
if (0 != (rd[i].flags & GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION))
{
+ struct GNUNET_TIME_Relative t;
+
/* encrypted blocks must never have relative expiration times, convert! */
- rdc[i].flags ^= GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION;
- rdc[i].expiration_time += now.abs_value_us;
+ rdc[i].flags &= ~GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION;
+ t.rel_value_us = rdc[i].expiration_time;
+ rdc[i].expiration_time = GNUNET_TIME_absolute_add (now, t).abs_value_us;
}
}
/* serialize */
rd_count_nbo = htonl (rd_count);
memcpy (payload, &rd_count_nbo, sizeof (uint32_t));
GNUNET_assert (payload_len ==
- GNUNET_GNSRECORD_records_serialize (rd_count, rd,
+ GNUNET_GNSRECORD_records_serialize (rd_count, rdc,
payload_len, &payload[sizeof (uint32_t)]));
block = GNUNET_malloc (sizeof (struct GNUNET_GNSRECORD_Block) +
sizeof (uint32_t) + payload_len);
struct GNUNET_GNSRECORD_Data rd[rd_count];
unsigned int i;
unsigned int j;
+ unsigned int k;
struct GNUNET_TIME_Absolute now;
if (GNUNET_OK !=
j = 0;
for (i=0;i<rd_count;i++)
{
+ if (0 != (rd[i].flags & GNUNET_GNSRECORD_RF_PENDING))
+ continue; /* PENDING should never be used */
if (0 != (rd[i].flags & GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION))
{
/* encrypted blocks must never have relative expiration times, skip! */
GNUNET_break_op (0);
continue;
}
- if (rd[i].expiration_time >= now.abs_value_us)
+
+ if (0 != (rd[i].flags & GNUNET_GNSRECORD_RF_SHADOW_RECORD))
+ {
+ int include_record = GNUNET_YES;
+ /* Shadow record, figure out if we have a not expired active record */
+ for (k=0;k<rd_count;k++)
+ {
+ if (k == i)
+ continue;
+ if (rd[i].expiration_time < now.abs_value_us)
+ include_record = GNUNET_NO; /* Shadow record is expired */
+ if ((rd[k].record_type == rd[i].record_type)
+ && (rd[k].expiration_time >= now.abs_value_us)
+ && (0 == (rd[k].flags & GNUNET_GNSRECORD_RF_SHADOW_RECORD)))
+ include_record = GNUNET_NO; /* We have a non-expired, non-shadow record of the same type */
+ }
+ if (GNUNET_YES == include_record)
+ {
+ rd[i].flags ^= GNUNET_GNSRECORD_RF_SHADOW_RECORD; /* Remove Flag */
+ if (j != i)
+ rd[j] = rd[i];
+ j++;
+ }
+ }
+ else if (rd[i].expiration_time >= now.abs_value_us)
{
+ /* Include this record */
if (j != i)
rd[j] = rd[i];
j++;