More preliminaries for non-md5 file checksums
authorPanu Matilainen <pmatilai@redhat.com>
Thu, 29 May 2008 12:04:46 +0000 (15:04 +0300)
committerPanu Matilainen <pmatilai@redhat.com>
Mon, 2 Jun 2008 06:50:48 +0000 (09:50 +0300)
- add rpmfiDigest() method (similar to one in rpm5.org) for retrieving
  file digest, algorithm and digest size
- make rpmfiMD5() just a special case of rpmfiDigest()

lib/rpmfi.c
lib/rpmfi.h
lib/rpmfi_internal.h

index 3350b0b..8535d8a 100644 (file)
@@ -173,13 +173,27 @@ rpmfileState rpmfiFState(rpmfi fi)
 
 const unsigned char * rpmfiMD5(rpmfi fi)
 {
-    unsigned char * MD5 = NULL;
+    const unsigned char *digest;
+    pgpHashAlgo algo = 0;
+
+    digest = rpmfiDigest(fi, &algo, NULL);
+    return (algo == PGPHASHALGO_MD5) ? digest : NULL;
+}
+
+const unsigned char * rpmfiDigest(rpmfi fi, pgpHashAlgo *algo, size_t *len)
+{
+    const unsigned char *digest = NULL;
 
     if (fi != NULL && fi->i >= 0 && fi->i < fi->fc) {
+       size_t diglen = rpmDigestLength(fi->digestalgo);
        if (fi->digests != NULL)
-           MD5 = fi->digests + (16 * fi->i);
+           digest = fi->digests + (diglen * fi->i);
+       if (len) 
+           *len = diglen;
+       if (algo) 
+           *algo = fi->digestalgo;
     }
-    return MD5;
+    return digest;
 }
 
 const char * rpmfiFLink(rpmfi fi)
@@ -1242,6 +1256,8 @@ if (fi->actions == NULL)
     xx = hge(h, RPMTAG_FILELINKTOS, NULL, (rpm_data_t *) &fi->flinks, NULL);
     xx = hge(h, RPMTAG_FILELANGS, NULL, (rpm_data_t *) &fi->flangs, NULL);
 
+    /* digest algorithm hardwired to MD5 for now */
+    fi->digestalgo = PGPHASHALGO_MD5;
     fi->fdigests = NULL;
     xx = hge(h, RPMTAG_FILEMD5S, NULL, (rpm_data_t *) &fi->fdigests, NULL);
 
index 21748c8..12c7125 100644 (file)
@@ -8,6 +8,7 @@
 
 #include <rpm/rpmtypes.h>
 #include <rpm/rpmvf.h>
+#include <rpm/rpmpgp.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -206,6 +207,15 @@ rpm_mode_t rpmfiFMode(rpmfi fi);
 rpmfileState rpmfiFState(rpmfi fi);
 
 /** \ingroup rpmfi
+ * Return current file (binary) digest of file info set.
+ * @param fi           file info set
+ * @retval algo                digest hash algoritm used (pass NULL to ignore)
+ * @retval diglen      digest hash length (pass NULL to ignore)
+ * @return             current file digest, NULL on invalid
+ */
+const unsigned char * rpmfiDigest(rpmfi fi, pgpHashAlgo *algo, size_t *diglen);
+
+/** \ingroup rpmfi
  * Return current file (binary) md5 digest from file info set.
  * @param fi           file info set
  * @return             current file md5 digest, NULL on invalid
index 13edca3..b70aa0f 100644 (file)
@@ -96,6 +96,7 @@ struct rpmfi_s {
     const char ** odnl;                /*!< Original dirname(s) (from header) */
     int32_t * odil;            /*!< Original dirindex(s) (from header) */
 
+    pgpHashAlgo digestalgo;    /*!< File checksum algorithm */
     unsigned char * digests;   /*!< File checksums in binary. */
 
     char * pretrans;