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++;
                }
        }

Reply via email to