commit:     6e0f64cb72a3e2948fdb8b6a59aac9bb57223dc2
Author:     Fabian Groffen <grobian <AT> gentoo <DOT> org>
AuthorDate: Sun Jul 14 13:07:42 2019 +0000
Commit:     Fabian Groffen <grobian <AT> gentoo <DOT> org>
CommitDate: Sun Jul 14 13:07:42 2019 +0000
URL:        https://gitweb.gentoo.org/proj/portage-utils.git/commit/?id=6e0f64cb

qtegrity: use libq/hash iso shelling out to shaXsum

Use libq/hash functionality (as used by qmanifest) in qtegrity to obtain
hashes for files.  This adds a dep on openssl currently, so allow
disabling this applet.

Signed-off-by: Fabian Groffen <grobian <AT> gentoo.org>

 Makefile.am       | 13 ++++++++++-
 configure.ac      | 33 ++++++++++++++++++++++++++--
 qtegrity.c        | 65 ++++++++++++-------------------------------------------
 tests/Makefile.am |  4 +++-
 4 files changed, 60 insertions(+), 55 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index fc0619c..e8b11f8 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -64,7 +64,6 @@ q_SOURCES = \
        qsearch.c \
        qsize.c \
        qtbz2.c \
-       qtegrity.c \
        quse.c \
        qxpak.c \
        $(NULL)
@@ -95,6 +94,18 @@ q_LDADD += \
 dist_man_MANS += man/qmanifest.1
 APPLETS += qmanifest
 endif
+if QTEGRITY_ENABLED
+q_SOURCES += qtegrity.c
+if !QMANIFEST_ENABLED
+q_CPPFLAGS += \
+       $(OPENMP_CFLAGS)
+q_LDADD += \
+       $(OPENMP_CFLAGS)
+endif
+dist_man_MANS += man/qtegrity.1
+APPLETS += qtegrity
+endif
+
 
 install-exec-hook:
        cd $(DESTDIR)$(bindir); \

diff --git a/configure.ac b/configure.ac
index bda5a84..0577d07 100644
--- a/configure.ac
+++ b/configure.ac
@@ -35,11 +35,15 @@ AC_SUBST([CONFIG_EPREFIX], ["$with_eprefix"])
 AC_ARG_ENABLE([qmanifest], [AS_HELP_STRING([--enable-qmanifest],
                          [support qmanifest applet])],
                          [], [enable_qmanifest=auto])
+AC_ARG_ENABLE([qtegrity], [AS_HELP_STRING([--enable-qtegrity],
+                         [support qtegrity applet])],
+                         [], [enable_qtegrity=auto])
 LIBSSL=
 LIBBL2=
 LIBZ=
 HASGPGME=
-AS_IF([test "x$enable_qmanifest" != xno],
+
+AS_IF([test "x${enable_qmanifest}x${enable_qtegrity}" != xnoxno],
          [AC_CHECK_HEADERS([openssl/err.h \
                             openssl/ssl.h], [], [LIBSSL=_missing_header])
           AC_CHECK_LIB([ssl${LIBSSL}], [SSL_connect],
@@ -55,9 +59,33 @@ AS_IF([test "x$enable_qmanifest" != xno],
                                         AC_MSG_FAILURE(
                                           [--enable-qmanifest was given, but 
test for ssl failed])
                                         fi
+                                        if test "x$enable_qtegrity" != xauto; 
then
+                                        AC_MSG_FAILURE(
+                                          [--enable-qtegrity was given, but 
test for ssl failed])
+                                        fi
                                         LIBSSL=
                                        ])
-          AC_CHECK_HEADERS([blake2.h], [], [LIBBL2=_missing_header])
+          AC_MSG_CHECKING([whether to enable qtegrity])
+          case "x${LIBSSL}" in
+                  "x-lssl"*)
+                               AC_MSG_RESULT([yes])
+                               ;;
+                  *)
+                          enable_qtegrity=no
+                          AC_MSG_RESULT([no: missing dependencies])
+                          ;;
+          esac
+          if test "x$enable_qtegrity" != xno ; then
+                  AC_DEFINE([ENABLE_QTEGRITY], [1],
+                                        [Define if qtegrity should be 
compiled])
+          fi
+       ],
+       [
+          AC_MSG_CHECKING([whether to enable qtegrity])
+          AC_MSG_RESULT([no: disabled by configure argument])
+       ])
+AS_IF([test "x$enable_qmanifest" != xno],
+         [AC_CHECK_HEADERS([blake2.h], [], [LIBBL2=_missing_header])
           AC_CHECK_LIB([b2${LIBBL2}], [blake2b_update],
                                        [LIBBL2="-lb2"
                                         AC_DEFINE([HAVE_BLAKE2B], [1],
@@ -104,6 +132,7 @@ AS_IF([test "x$enable_qmanifest" != xno],
           AC_MSG_RESULT([no: disabled by configure argument])
        ])
 AM_CONDITIONAL([QMANIFEST_ENABLED], [test "x$enable_qmanifest" != xno])
+AM_CONDITIONAL([QTEGRITY_ENABLED], [test "x$enable_qtegrity" != xno])
 
 AX_CFLAGS_WARN_ALL
 AC_DEFUN([PT_CHECK_CFLAG],[AX_CHECK_COMPILER_FLAGS([$1],[CFLAGS="$CFLAGS 
$1"])])

diff --git a/qtegrity.c b/qtegrity.c
index 70a99d5..0d23a7f 100644
--- a/qtegrity.c
+++ b/qtegrity.c
@@ -5,10 +5,12 @@
  * Copyright 2005-2010 Ned Ludd        - <so...@gentoo.org>
  * Copyright 2005-2014 Mike Frysinger  - <vap...@gentoo.org>
  * Copyright 2017-2018 Sam Besselink
+ * Copyright 2019-     Fabian Groffen  - <grob...@gentoo.org>
  */
 
 #include "main.h"
 #include "applets.h"
+#include "libq/hash.h"
 
 #include <stdio.h>
 #include <unistd.h>
@@ -60,63 +62,24 @@ struct qtegrity_opt_state {
 #define SHA256_LENGTH (SHA256_PREFIX_LENGTH + SHA256_DIGEST_LENGTH)
 #define SHA512_DIGEST_LENGTH 128
 
-static void external_check_sha(char * ret_digest, char * filepath, char * 
algo) {
-       size_t size_digest = 1;
-       char cmd[11];
-       int pipefd[2];
-       pid_t pid;
+static void
+check_sha(char *ret_digest, char *path, char *algo)
+{
+       int hashes = 0;
+       size_t flen = 0;
 
        if (strcmp(algo, "sha256") == 0) {
-               size_digest = 64;
+               hashes |= HASH_SHA256;
        } else if (strcmp(algo, "sha512") == 0) {
-               size_digest = 128;
-       }
-
-       if ((strcmp(algo, "sha256") != 0) && (strcmp(algo, "sha512") != 0)) {
+               hashes |= HASH_SHA512;
+       } else {
+               /* no matching hash? (we could support whirlpool and blake2b) */
                return;
        }
 
-       snprintf(cmd, 10, "%ssum", algo);
-
-       if (pipe(pipefd) == -1) {
-               perror("Couldn't create pipe to shasum\n");
-               exit(1);
-       }
-       if ((pid = fork()) == -1) {
-               perror("Couldn't fork to shasum\n");
-               exit(1);
-       }
-       if (pid == 0)
-       {
-               /* Child. Redirect stdout and stderr to pipe, replace execution
-                * environment */
-               close(pipefd[0]);
-               dup2(pipefd[1], STDOUT_FILENO);
-               dup2(pipefd[1], STDERR_FILENO);
-               execlp(cmd, cmd, filepath, (char *)NULL);
-               perror("Executing shasum failed\n");
-               exit(1);
-       }
-
-       /* Only parent gets here. Listen to pipe */
-       close(pipefd[1]);
-       FILE* output = fdopen(pipefd[0], "r");
-       if (output == NULL) {
-               printf("Failed to run command '%s'\n", cmd);
-               exit(1);
-       }
-
-       /* Read pipe line for line */
-       while (fgets(ret_digest, size_digest+1, output))
-       {
-               if (strlen(ret_digest) == 64) /* Found what we need, can stop */
-               {
-                       kill(pid, SIGKILL);
-                       break;
-               }
-       }
+       hash_compute_file(path, ret_digest, ret_digest, NULL, NULL, &flen, 
hashes);
+       (void)flen;  /* we don't use the file size */
 
-       pclose(output);
        return;
 }
 
@@ -458,7 +421,7 @@ int qtegrity_main(int argc, char **argv)
                char *file_digest;
                file_digest = xmalloc(SHA256_DIGEST_LENGTH+1);
                file_digest[0] = '\0';
-               external_check_sha(file_digest, state.add_file, hash_algo);
+               check_sha(file_digest, state.add_file, hash_algo);
 
                /* Iterate over lines; if fname matches, exit-loop */
                char *line, *fname;

diff --git a/tests/Makefile.am b/tests/Makefile.am
index 3a7a00b..447ed0f 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -1,12 +1,14 @@
 SUBDIRS = \
        atom_compare atom_explode copy_file mkdir rmspace \
        qatom qcheck qdepends qfile qlist qlop qmerge qtbz2 quse qxpak \
-       install profile source
+       install profile
 
 if QMANIFEST_ENABLED
 SUBDIRS += qmanifest
 endif
 
+SUBDIRS += source
+
 %_subdir:
        $(Q)cd $(@:_subdir=) || exit 1; \
        out=`$(MAKE) check 2>&1`; \

Reply via email to