From 7035aac91076e660526f01f7051c2665dcf484d3 Mon Sep 17 00:00:00 2001 From: Jonathan Dieter Date: Sat, 5 Feb 2022 16:09:31 +0000 Subject: [PATCH] Add extra data to zck_read_header Signed-off-by: Jonathan Dieter --- include/zck.h.in | 3 +++ src/lib/header.c | 23 +++++++++++++++++------ src/zck_read_header.c | 24 ++++++++++++++++++++++-- 3 files changed, 42 insertions(+), 8 deletions(-) diff --git a/include/zck.h.in b/include/zck.h.in index 0f9d03c..7bf320b 100644 --- a/include/zck.h.in +++ b/include/zck.h.in @@ -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; /******************************************************************* diff --git a/src/lib/header.c b/src/lib/header.c index 5b8393b..730e663 100644 --- a/src/lib/header.c +++ b/src/lib/header.c @@ -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); +} diff --git a/src/zck_read_header.c b/src/zck_read_header.c index 8654af1..fe7bf62 100644 --- a/src/zck_read_header.c +++ b/src/zck_read_header.c @@ -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 -- 2.30.2