Add extra data to zck_read_header
authorJonathan Dieter <jdieter@gmail.com>
Sat, 5 Feb 2022 16:09:31 +0000 (16:09 +0000)
committerJonathan Dieter <jdieter@gmail.com>
Sat, 5 Feb 2022 17:05:46 +0000 (17:05 +0000)
Signed-off-by: Jonathan Dieter <jdieter@gmail.com>
include/zck.h.in
src/lib/header.c
src/zck_read_header.c

index 0f9d03c2994fb11e9a8aeecdf67e01424eb5ba67..7bf320b5b790e5762368b5a3660ab430ccf61700 100644 (file)
@@ -87,6 +87,9 @@ bool ZCK_PUBLIC_API zck_init_read (zckCtx *zck, int src_fd)
 /* Decompress dst_size bytes from zchunk file to dst, while verifying hashes */
 ssize_t ZCK_PUBLIC_API zck_read(zckCtx *zck, char *dst, size_t dst_size)
     ZCK_WARN_UNUSED;
+/* Get zchunk flags */
+ssize_t ZCK_PUBLIC_API zck_get_flags (zckCtx *zck)
+    ZCK_WARN_UNUSED;
 
 
 /*******************************************************************
index 5b8393bd465a10d30c443a278d6e163c92cc78cf..730e663e30242de7f75b131a7c9062a73dc5b28f 100644 (file)
@@ -56,6 +56,17 @@ static bool check_flags(zckCtx *zck, size_t flags) {
     return true;
 }
 
+static ssize_t get_flags(zckCtx *zck) {
+    size_t flags = 0;
+    if(zck->has_streams)
+        flags |= 1;
+    if(zck->has_optional_elems)
+        flags |= 2;
+    if(zck->has_uncompressed_source)
+        flags |= 4;
+    return flags;
+}
+
 static bool read_optional_element(zckCtx *zck, size_t id, size_t data_size,
                                   char *data) {
     zck_log(ZCK_LOG_WARNING, "Unknown optional element id %i set", id);
@@ -257,12 +268,7 @@ static bool preface_create(zckCtx *zck) {
     length += zck->hash_type.digest_size;
 
     /* Write out flags */
-    size_t flags = 0;
-    if(zck->has_streams)
-        flags &= 1;
-    if(zck->has_uncompressed_source)
-        flags |= 4;
-    compint_from_size(header+length, flags, &length);
+    compint_from_size(header+length, get_flags(zck), &length);
 
     /* Write out compression type and index size */
     if(!compint_from_int(zck, header+length, zck->comp.type, &length)) {
@@ -641,3 +647,8 @@ ssize_t ZCK_PUBLIC_API zck_get_length(zckCtx *zck) {
     VALIDATE_INT(zck);
     return zck_get_header_length(zck) + zck_get_data_length(zck);
 }
+
+ssize_t ZCK_PUBLIC_API zck_get_flags(zckCtx *zck) {
+    VALIDATE_INT(zck);
+    return get_flags(zck);
+}
index 8654af1cb67a5b651c72f52ac7902b11f6117fea..fe7bf62e620213d4f189b2f7a955430de3f54d80 100644 (file)
@@ -153,18 +153,38 @@ int main (int argc, char *argv[]) {
     close(src_fd);
 
     if(!arguments.quiet) {
+        zckChunk *dict = zck_get_first_chunk(zck);
+        char *dict_digest = zck_get_chunk_digest(dict);
+        if(dict_digest == NULL) {
+            LOG_ERROR("%s", zck_get_error(zck));
+            exit(1);
+        }
         printf("Overall checksum type: %s\n",
                zck_hash_name_from_type(zck_get_full_hash_type(zck)));
         printf("Header size: %llu\n", (long long unsigned) zck_get_header_length(zck));
         char *digest = zck_get_header_digest(zck);
         printf("Header checksum: %s\n", digest);
-        free(digest); 
+        free(digest);
+        ssize_t flags = zck_get_flags(zck);
+        if(flags > 0) {
+            printf("Flags:\n");
+            if(flags & 1)
+                printf("    Has streams\n");
+            if(flags & 2)
+                printf("    Has optional header elements\n");
+            if(flags & 4)
+                printf("    Has uncompressed checksums\n");
+        }
         printf("Data size: %llu\n", (long long unsigned) zck_get_data_length(zck));
         digest = zck_get_data_digest(zck);
         printf("Data checksum: %s\n", digest);
         free(digest);
         printf("Chunk count: %llu\n", (long long unsigned) zck_get_chunk_count(zck));
         printf("Chunk checksum type: %s\n", zck_hash_name_from_type(zck_get_chunk_hash_type(zck)));
+        if(zck_get_chunk_size(dict) == 0)
+            printf("No dictionary\n");
+        else
+            printf("Dictionary: %s\n", dict_digest);
     }
     if(!arguments.quiet && arguments.show_chunks)
         printf("\n");
@@ -183,7 +203,7 @@ int main (int argc, char *argv[]) {
             if (chk == zck_get_first_chunk(zck)) {
                 bool has_uncompressed = (strlen(digest_uncompressed) > 0);
                 if (has_uncompressed)
-                        printf("       Chunk Checksum %*cChecksum uncompressed %*c       Start    Comp size         Size\n",
+                        printf("       Chunk Checksum %*cUncompressed Checksum %*c       Start    Comp size         Size\n",
                            (((int)zck_get_chunk_digest_size(zck) * 2) - (int)strlen("Checksum")), ' ',
                            ((int)zck_get_chunk_digest_size(zck) * 2) - (int)strlen("Uncompressed Checksum"), ' ');
                     else