} zck_soption;
typedef enum zck_log_type {
+ ZCK_LOG_DDEBUG = -1,
ZCK_LOG_DEBUG,
ZCK_LOG_INFO,
ZCK_LOG_WARNING,
VALIDATE(dl);
VALIDATE(dl->priv);
- int retval = validate_chunk(dl->zck, dl->priv->tgt_check, ZCK_LOG_WARNING);
+ int retval = validate_chunk(dl->zck, dl->priv->tgt_check, ZCK_LOG_WARNING,
+ dl->priv->tgt_number);
if(retval < 1) {
if(!zero_chunk(dl->zck, dl->priv->tgt_check))
return False;
for(zckIndexItem *idx = dl->range->index.first; idx; idx = idx->next) {
if(dl->priv->dl_chunk_data == idx->start) {
+ int count = 0;
for(zckIndexItem *tgt_idx = dl->zck->index.first; tgt_idx;
- tgt_idx = tgt_idx->next) {
+ tgt_idx = tgt_idx->next, count++) {
if(tgt_idx->valid == 1)
continue;
if(idx->comp_length == tgt_idx->comp_length &&
memcmp(idx->digest, tgt_idx->digest,
idx->digest_size) == 0) {
dl->priv->tgt_check = tgt_idx;
+ dl->priv->tgt_number = count;
if(!hash_init(&(dl->zck->check_chunk_hash),
&(dl->zck->chunk_hash_type)))
return 0;
/* Check each chunk checksum */
int all_good = True;
- for(zckIndexItem *idx = zck->index.first; idx; idx = idx->next) {
+ int count = 0;
+ for(zckIndexItem *idx = zck->index.first; idx; idx = idx->next, count++) {
if(idx == zck->index.first && idx->length == 0) {
idx->valid = 1;
continue;
return 0;
rlen += rsize;
}
- int valid_chunk = validate_chunk(zck, idx, bad_checksums);
+ int valid_chunk = validate_chunk(zck, idx, bad_checksums, count);
if(!valid_chunk)
return 0;
idx->valid = valid_chunk;
memset(ht, 0, sizeof(zckHashType));
ht->type = ZCK_HASH_SHA1;
ht->digest_size = SHA1_DIGEST_LENGTH;
+ zck_log(ZCK_LOG_DEBUG, "Setting up hash type %s\n",
+ zck_hash_name_from_type(ht->type));
return True;
}else if(h == ZCK_HASH_SHA256) {
memset(ht, 0, sizeof(zckHashType));
ht->type = ZCK_HASH_SHA256;
ht->digest_size = SHA256_DIGEST_SIZE;
+ zck_log(ZCK_LOG_DEBUG, "Setting up hash type %s\n",
+ zck_hash_name_from_type(ht->type));
return True;
}
zck_log(ZCK_LOG_ERROR, "Unsupported hash type: %s\n",
int hash_init(zckHash *hash, zckHashType *hash_type) {
if(hash && hash_type) {
if(hash_type->type == ZCK_HASH_SHA1) {
- zck_log(ZCK_LOG_DEBUG, "Initializing SHA-1 hash\n");
+ zck_log(ZCK_LOG_DDEBUG, "Initializing SHA-1 hash\n");
hash->ctx = zmalloc(sizeof(SHA_CTX));
hash->type = hash_type;
if(hash->ctx == NULL)
SHA1_Init((SHA_CTX *) hash->ctx);
return True;
}else if(hash_type->type == ZCK_HASH_SHA256) {
- zck_log(ZCK_LOG_DEBUG, "Initializing SHA-256 hash\n");
+ zck_log(ZCK_LOG_DDEBUG, "Initializing SHA-256 hash\n");
hash->ctx = zmalloc(sizeof(sha256_ctx));
hash->type = hash_type;
if(hash->ctx == NULL)
/* Validate chunk, returning -1 if checksum fails, 1 if good, 0 if error */
int validate_chunk(zckCtx *zck, zckIndexItem *idx,
- zck_log_type bad_checksum) {
+ zck_log_type bad_checksum, int chunk_number) {
VALIDATE(zck);
if(idx == NULL) {
zck_log(ZCK_LOG_ERROR, "Index not initialized\n");
}
if(idx->comp_length == 0)
memset(digest, 0, idx->digest_size);
- zck_log(ZCK_LOG_DEBUG, "Checking chunk checksum\n");
char *pdigest = zck_get_chunk_digest(idx);
- zck_log(ZCK_LOG_DEBUG, "Expected chunk checksum: %s\n", pdigest);
+ zck_log(ZCK_LOG_DDEBUG, "Expected chunk checksum: %s\n", pdigest);
free(pdigest);
pdigest = get_digest_string(digest, idx->digest_size);
- zck_log(ZCK_LOG_DEBUG, "Calculated chunk checksum: %s\n", pdigest);
+ zck_log(ZCK_LOG_DDEBUG, "Calculated chunk checksum: %s\n", pdigest);
free(pdigest);
if(memcmp(digest, idx->digest, idx->digest_size) != 0) {
free(digest);
- zck_log(bad_checksum, "Chunk checksum failed!\n");
+ if(chunk_number == -1)
+ zck_log(bad_checksum, "Chunk checksum: FAILED!\n");
+ else
+ zck_log(bad_checksum, "Chunk %i's checksum: FAILED\n",
+ chunk_number);
return -1;
}
- zck_log(ZCK_LOG_DEBUG, "Chunk checksum valid\n");
+ if(chunk_number == -1)
+ zck_log(ZCK_LOG_DEBUG, "Chunk checksum: valid\n");
+ else
+ zck_log(ZCK_LOG_DEBUG, "Chunk %i's checksum: valid\n", chunk_number);
free(digest);
return 1;
}
int validate_current_chunk(zckCtx *zck) {
VALIDATE(zck);
- return validate_chunk(zck, zck->comp.data_idx, ZCK_LOG_ERROR);
+ return validate_chunk(zck, zck->comp.data_idx, ZCK_LOG_ERROR, -1);
}
int validate_file(zckCtx *zck, zck_log_type bad_checksums) {
log_level = ll;
}
-void zck_log(zck_log_type lt, const char *format, ...) {
+void zck_log_wf(const char *function, zck_log_type lt, const char *format, ...) {
if(lt >= log_level) {
va_list args;
va_start(args, format);
+ dprintf(STDERR_FILENO, "%s: ", function);
vdprintf(STDERR_FILENO, format, args);
va_end(args);
}
#define PUBLIC __attribute__((visibility("default")))
+#define zck_log(...) zck_log_wf(__func__, __VA_ARGS__)
+
struct zckComp;
typedef int (*finit)(struct zckComp *comp);
regex_t *end_regex;
regex_t *hdr_regex;
zckIndexItem *tgt_check;
+ int tgt_number;
} zckDLPriv;
typedef struct zckComp {
char *hash_finalize(zckHash *hash)
__attribute__ ((warn_unused_result));
void hash_close(zckHash *hash);
-int validate_chunk(zckCtx *zck, zckIndexItem *idx, zck_log_type bad_checksum)
+int validate_chunk(zckCtx *zck, zckIndexItem *idx, zck_log_type bad_checksum,
+ int chunk_number)
__attribute__ ((warn_unused_result));
int validate_file(zckCtx *zck, zck_log_type bad_checksums)
__attribute__ ((warn_unused_result));
/* log.c */
-void zck_log(zck_log_type lt, const char *format, ...);
+void zck_log_wf(const char *function, zck_log_type lt, const char *format, ...);
#endif
switch (key) {
case 'v':
- arguments->log_level -= 1;
- if(arguments->log_level < ZCK_LOG_DEBUG)
- arguments->log_level = ZCK_LOG_DEBUG;
+ arguments->log_level--;
+ if(arguments->log_level < ZCK_LOG_DDEBUG)
+ arguments->log_level = ZCK_LOG_DDEBUG;
break;
case 'q':
arguments->log_level = ZCK_LOG_ERROR;
switch (key) {
case 'v':
- arguments->log_level -= 1;
- if(arguments->log_level < ZCK_LOG_DEBUG)
- arguments->log_level = ZCK_LOG_DEBUG;
+ arguments->log_level--;
+ if(arguments->log_level < ZCK_LOG_DDEBUG)
+ arguments->log_level = ZCK_LOG_DDEBUG;
break;
case 'q':
arguments->log_level = ZCK_LOG_ERROR;
switch (key) {
case 'v':
- arguments->log_level -= 1;
- if(arguments->log_level < ZCK_LOG_DEBUG)
- arguments->log_level = ZCK_LOG_DEBUG;
+ arguments->log_level--;
+ if(arguments->log_level < ZCK_LOG_DDEBUG)
+ arguments->log_level = ZCK_LOG_DDEBUG;
break;
case 'q':
arguments->log_level = ZCK_LOG_ERROR;
switch (key) {
case 'v':
- arguments->log_level = ZCK_LOG_DEBUG;
+ if(arguments->log_level > ZCK_LOG_INFO)
+ arguments->log_level = ZCK_LOG_INFO;
+ arguments->log_level--;
+ if(arguments->log_level < ZCK_LOG_DDEBUG)
+ arguments->log_level = ZCK_LOG_DDEBUG;
break;
case 'q':
if(arguments->log_level < ZCK_LOG_INFO)
switch (key) {
case 'v':
- arguments->log_level -= 1;
- if(arguments->log_level < ZCK_LOG_DEBUG)
- arguments->log_level = ZCK_LOG_DEBUG;
+ arguments->log_level--;
+ if(arguments->log_level < ZCK_LOG_DDEBUG)
+ arguments->log_level = ZCK_LOG_DDEBUG;
break;
case 'q':
arguments->log_level = ZCK_LOG_ERROR;
}
zckCtx *zck = zck_init_read(src_fd);
if(zck == NULL) {
- printf("Unable to read header\n");
+ printf("Unable to read zchunk header\n");
exit(1);
}
int valid_cks = 1;
if(arguments.verify) {
valid_cks = zck_validate_checksums(zck);
- if(valid_cks < 0)
+ if(!valid_cks)
exit(1);
}
close(src_fd);
- printf("Overall checksum type: %s\n", zck_hash_name_from_type(zck_get_full_hash_type(zck)));
- char *digest = zck_get_header_digest(zck);
- printf("Header checksum: %s\n", digest);
- free(digest);
- digest = zck_get_data_digest(zck);
- printf("Data checksum: %s\n", digest);
- free(digest);
- printf("Index count: %lu\n", (long unsigned)zck_get_index_count(zck));
- printf("Chunk checksum type: %s\n", zck_hash_name_from_type(zck_get_chunk_hash_type(zck)));
-
- zckIndex *idxi = zck_get_index(zck);
- if(idxi == NULL)
- exit(1);
- zckIndexItem *idx = idxi->first;
- while(idx) {
- char *digest = zck_get_chunk_digest(idx);
- if(digest == NULL)
+ if(arguments.log_level <= ZCK_LOG_WARNING) {
+ printf("Overall checksum type: %s\n",
+ zck_hash_name_from_type(zck_get_full_hash_type(zck)));
+ char *digest = zck_get_header_digest(zck);
+ printf("Header checksum: %s\n", digest);
+ free(digest);
+ digest = zck_get_data_digest(zck);
+ printf("Data checksum: %s\n", digest);
+ free(digest);
+ printf("Index count: %lu\n", (long unsigned)zck_get_index_count(zck));
+ printf("Chunk checksum type: %s\n", zck_hash_name_from_type(zck_get_chunk_hash_type(zck)));
+ }
+
+ if(arguments.log_level <= ZCK_LOG_INFO) {
+ zckIndex *idxi = zck_get_index(zck);
+ if(idxi == NULL)
exit(1);
- printf("%s %12lu %12lu %12lu", digest,
- (long unsigned)(idx->start + zck_get_header_length(zck)),
- (long unsigned)idx->comp_length, (long unsigned)idx->length);
- if(arguments.verify) {
- if(idx->valid)
- printf(" +");
- else
- printf(" !");
+ for(zckIndexItem *idx = idxi->first; idx; idx=idx->next) {
+ char *digest = zck_get_chunk_digest(idx);
+ if(digest == NULL)
+ exit(1);
+ printf("%s %12lu %12lu %12lu", digest,
+ (long unsigned)(idx->start + zck_get_header_length(zck)),
+ (long unsigned)idx->comp_length, (long unsigned)idx->length);
+ if(arguments.verify) {
+ if(idx->valid)
+ printf(" +");
+ else
+ printf(" !");
+ }
+ printf("\n");
+ free(digest);
}
- printf("\n");
- free(digest);
- idx = idx->next;
+ }
+ if(arguments.verify) {
+ if(valid_cks == 1 && arguments.log_level <= ZCK_LOG_WARNING)
+ printf("All checksums are valid\n");
+ else if(valid_cks == -1)
+ printf("Some checksums failed\n");
}
zck_free(&zck);
return 1-valid_cks;