commit: 65ffc8ca7cb62140e281ce80918d19e9cc64a43e Author: Fabian Groffen <grobian <AT> gentoo <DOT> org> AuthorDate: Sun May 17 12:34:16 2020 +0000 Commit: Fabian Groffen <grobian <AT> gentoo <DOT> org> CommitDate: Sun May 17 12:34:16 2020 +0000 URL: https://gitweb.gentoo.org/proj/portage-utils.git/commit/?id=65ffc8ca
qmerge: calculate MD5/SHA1 hashes possibly in parallel take advantage of libq/hash's interface to parallelise hash computation if possible Signed-off-by: Fabian Groffen <grobian <AT> gentoo.org> qmerge.c | 45 +++++++++++++++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/qmerge.c b/qmerge.c index e86ce00..087c5f2 100644 --- a/qmerge.c +++ b/qmerge.c @@ -1598,34 +1598,51 @@ unlink_empty(const char *buf) } static int -pkg_verify_checksums(char *fname, const struct pkg_t *pkg, const depend_atom *atom, - int strict, int display) +pkg_verify_checksums( + char *fname, + const struct pkg_t *pkg, + const depend_atom *atom, + int strict, + int display) { - char *hash = NULL; int ret = 0; + char md5[32+1]; + char sha1[40+1]; + size_t flen; + + if (hash_multiple_file(fname, md5, sha1, NULL, NULL, NULL, NULL, + &flen, HASH_MD5 | HASH_SHA1) == -1) + errf("failed to compute hashes for %s/%s: %s\n", + atom->CATEGORY, pkg->PF, strerror(errno)); + + if (flen != pkg->SIZE) { + warn("filesize %zu doesn't match requested size %zu for %s/%s\n", + flen, pkg->SIZE, atom->CATEGORY, pkg->PF); + ret++; + } if (pkg->MD5[0]) { - if ((hash = hash_file(fname, HASH_MD5)) == NULL) { - errf("hash is NULL for %s", fname); - } - if (strcmp(hash, pkg->MD5) == 0) { + if (md5 != NULL && strcmp(md5, pkg->MD5) == 0) { if (display) - printf("MD5: [%sOK%s] %s %s/%s\n", GREEN, NORM, hash, atom->CATEGORY, pkg->PF); + printf("MD5: [%sOK%s] %s %s/%s\n", + GREEN, NORM, md5, atom->CATEGORY, pkg->PF); } else { if (display) - warn("MD5: [%sER%s] (%s) != (%s) %s/%s", RED, NORM, hash, pkg->MD5, atom->CATEGORY, pkg->PF); + warn("MD5: [%sER%s] (%s) != (%s) %s/%s", + RED, NORM, md5, pkg->MD5, atom->CATEGORY, pkg->PF); ret++; } } - if (pkg->SHA1[0]) { - hash = hash_file(fname, HASH_SHA1); - if (strcmp(hash, pkg->SHA1) == 0) { + if (sha1 != NULL && pkg->SHA1[0]) { + if (strcmp(sha1, pkg->SHA1) == 0) { if (display) - qprintf("SHA1: [%sOK%s] %s %s/%s\n", GREEN, NORM, hash, atom->CATEGORY, pkg->PF); + qprintf("SHA1: [%sOK%s] %s %s/%s\n", + GREEN, NORM, sha1, atom->CATEGORY, pkg->PF); } else { if (display) - warn("SHA1: [%sER%s] (%s) != (%s) %s/%s", RED, NORM, hash, pkg->SHA1, atom->CATEGORY, pkg->PF); + warn("SHA1: [%sER%s] (%s) != (%s) %s/%s", + RED, NORM, sha1, pkg->SHA1, atom->CATEGORY, pkg->PF); ret++; } }