Implement a rangeset data type and use it to track items in log segments.
[bluesky.git] / bluesky / cloudlog.c
index e868d99..4d52d54 100644 (file)
@@ -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;
     }
 }