X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=bluesky%2Fcloudlog.c;h=4d52d54aa6c3b1e9f348b8ce5ac2c810cf9b5721;hb=772058dfc33fbe4857864b4bdb8ba947eca19303;hp=e868d99ad6c1472a49bdbafc9846679e575225f7;hpb=d9bdc90da5c143d76cf3efd3c39b9bd190fb3741;p=bluesky.git diff --git a/bluesky/cloudlog.c b/bluesky/cloudlog.c index e868d99..4d52d54 100644 --- a/bluesky/cloudlog.c +++ b/bluesky/cloudlog.c @@ -517,12 +517,15 @@ void bluesky_cloudlog_encrypt(GString *segment, BlueSkyCryptKeys *keys) } /* 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; @@ -533,10 +536,21 @@ void bluesky_cloudlog_decrypt(char *segment, size_t len, BlueSkyCryptKeys *keys) 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; } }