Add functions to get chunk number and get chunk by number
authorJonathan Dieter <jdieter@gmail.com>
Sun, 2 Dec 2018 17:38:17 +0000 (17:38 +0000)
committerJonathan Dieter <jdieter@gmail.com>
Sun, 2 Dec 2018 17:38:17 +0000 (17:38 +0000)
Signed-off-by: Jonathan Dieter <jdieter@gmail.com>
include/zck.h.in
src/lib/index/index_read.c
src/zck_read_header.c
test/read_single_chunk.c

index 065dba188bbbe7487559b0c952f26a47010538b6..91d25578099dc5fc8aa1c97dead9226e61171fd9 100644 (file)
@@ -232,6 +232,9 @@ bool zck_validate_lead(zckCtx *zck)
 /* Get chunk count */
 ssize_t zck_get_chunk_count(zckCtx *zck)
     __attribute__ ((warn_unused_result));
+/* Get chunk by number */
+zckChunk *zck_get_chunk(zckCtx *zck, size_t number)
+    __attribute__ ((warn_unused_result));
 /* Get first chunk */
 zckChunk *zck_get_first_chunk(zckCtx *zck)
     __attribute__ ((warn_unused_result));
@@ -247,6 +250,9 @@ ssize_t zck_get_chunk_size(zckChunk *idx)
 /* Get compressed chunk size */
 ssize_t zck_get_chunk_comp_size(zckChunk *idx)
     __attribute__ ((warn_unused_result));
+/* Get chunk number */
+ssize_t zck_get_chunk_number(zckChunk *idx)
+    __attribute__ ((warn_unused_result));
 /* Get validity of current chunk - 1 = valid, 0 = missing, -1 = invalid */
 int zck_get_chunk_valid(zckChunk *idx)
     __attribute__ ((warn_unused_result));
index 5f8c7cb144756405a238f8dbc6474cb8fb4fb52d..65466da0c9dc3f4ea2491a31c136f2aa31464e2d 100644 (file)
@@ -118,6 +118,17 @@ ssize_t PUBLIC zck_get_chunk_count(zckCtx *zck) {
     return zck->index.count;
 }
 
+zckChunk PUBLIC *zck_get_chunk(zckCtx *zck, size_t number) {
+    VALIDATE_PTR(zck);
+
+    for(zckChunk *idx=zck->index.first; idx!=NULL; idx=idx->next) {
+        if(idx->number == number)
+            return idx;
+    }
+    zck_log(ZCK_LOG_WARNING, "Chunk %lu not found", number);
+    return NULL;
+}
+
 zckChunk PUBLIC *zck_get_first_chunk(zckCtx *zck) {
     VALIDATE_PTR(zck);
 
@@ -171,6 +182,17 @@ ssize_t PUBLIC zck_get_chunk_comp_size(zckChunk *idx) {
     return idx->comp_length;
 }
 
+ssize_t PUBLIC zck_get_chunk_number(zckChunk *idx) {
+    if(idx && idx->zck) {
+        VALIDATE_INT(idx->zck);
+        ALLOCD_INT(idx->zck, idx);
+    } else {
+        ALLOCD_INT(NULL, idx);
+    }
+
+    return idx->number;
+}
+
 int PUBLIC zck_get_chunk_valid(zckChunk *idx) {
     if(idx && idx->zck) {
         VALIDATE_INT(idx->zck);
index b77c9b9ce9d7705e24c2b5cf06f339e6a8762b8d..a159ea5c2bccf012893bea9a18804e5dd54047b2 100644 (file)
@@ -169,15 +169,16 @@ int main (int argc, char *argv[]) {
     if(arguments.show_chunks) {
         printf("       Chunk Checksum %*c        Start    Comp size         Size\n",
                (((int)zck_get_chunk_digest_size(zck)*2)-9), ' ');
-        ssize_t count=0;
-        for(zckChunk *chk = zck_get_first_chunk(zck); chk;
-            chk=zck_get_next_chunk(chk), count++) {
+        for(zckChunk *chk=zck_get_first_chunk(zck); chk;
+            chk=zck_get_next_chunk(chk)) {
             char *digest = zck_get_chunk_digest(chk);
             if(digest == NULL) {
                 dprintf(STDERR_FILENO, "%s", zck_get_error(zck));
                 exit(1);
             }
-            printf("%12lu %s %12lu %12lu %12lu", count, digest,
+            printf("%12lu %s %12lu %12lu %12lu",
+                   (long unsigned)zck_get_chunk_number(chk),
+                   digest,
                    (long unsigned)zck_get_chunk_start(chk),
                    (long unsigned)zck_get_chunk_comp_size(chk),
                    (long unsigned)zck_get_chunk_size(chk));
index d2e85a94fd6bf4368b47ad5620e0044134a5f90e..3e83971731de075dfb3135ce339a8c234c6fcfbb 100644 (file)
@@ -68,6 +68,17 @@ int main (int argc, char *argv[]) {
         zck_free(&zck);
         exit(1);
     }
+    zckChunk *chunk1 = zck_get_chunk(zck, 1);
+    if(chunk == NULL) {
+        printf("%s", zck_get_error(zck));
+        zck_free(&zck);
+        exit(1);
+    }
+    if(chunk != chunk1) {
+        printf("Chunk first->next != chunk 1\n");
+        zck_free(&zck);
+        exit(1);
+    }
     ssize_t chunk_size = zck_get_chunk_size(chunk);
     if(chunk_size < 0) {
         printf("%s", zck_get_error(zck));