BlueSkyRCStr *raw = NULL;
if ((log->location_flags | log->pending_write) & CLOUDLOG_JOURNAL) {
raw = bluesky_log_map_object(log->fs, -1, log->log_seq,
- log->log_offset, log->log_size);
+ log->log_offset, log->log_size, FALSE);
}
if (raw == NULL && (log->location_flags & CLOUDLOG_CLOUD)) {
log->location.directory,
log->location.sequence,
log->location.offset,
- log->location.size);
+ log->location.size,
+ FALSE);
}
g_assert(raw != NULL);
bluesky_cloudlog_stats_update(log, -1);
offset = log->log_offset + sizeof(struct log_header);
log->data = bluesky_log_map_object(log->fs, -1, log->log_seq,
- offset, log->data_size);
+ offset, log->data_size, TRUE);
bluesky_cloudlog_stats_update(log, 1);
}
offset = log->location.offset + sizeof(struct cloudlog_header);
log->data = bluesky_log_map_object(log->fs, log->location.directory,
log->location.sequence,
- offset, log->data_size);
+ offset, log->data_size, TRUE);
bluesky_cloudlog_stats_update(log, 1);
}
}
/* Make an decryption pass over a cloud log segment to decrypt items which were
- * encrypted. TODO: Also computes a list of all offsets which at which valid
- * cloud log items are found. */
-void bluesky_cloudlog_decrypt(char *segment, size_t len, BlueSkyCryptKeys *keys)
+ * encrypted. Also computes a list of all offsets which at which valid
+ * cloud log items are found and adds those offsets to items (if non-NULL). */
+void bluesky_cloudlog_decrypt(char *segment, size_t len,
+ BlueSkyCryptKeys *keys,
+ BlueSkyRangeset *items)
{
char *data = segment;
size_t remaining_size = len;
+ size_t offset = 0;
while (remaining_size >= sizeof(struct cloudlog_header)) {
struct cloudlog_header *header = (struct cloudlog_header *)data;
if (item_size > remaining_size)
break;
if (bluesky_crypt_block_decrypt(data, item_size, keys)) {
- /* TODO: Mark block as valid. */
+ if (items != NULL) {
+ g_print(" data item at %zx\n", offset);
+ bluesky_rangeset_insert(items, offset, item_size,
+ GINT_TO_POINTER(TRUE));
+ }
+ } else {
+ g_warning("Unauthenticated data at offset %zd", offset);
+ if (items != NULL) {
+ bluesky_rangeset_insert(items, offset, item_size,
+ GINT_TO_POINTER(TRUE));
+ }
}
data += item_size;
+ offset += item_size;
remaining_size -= item_size;
}
}