Initial revision
authormarc <devnull@localhost>
Tue, 20 Feb 1996 04:31:08 +0000 (04:31 +0000)
committermarc <devnull@localhost>
Tue, 20 Feb 1996 04:31:08 +0000 (04:31 +0000)
CVS patchset: 347
CVS date: 1996/02/20 04:31:08

verify.c [new file with mode: 0644]
verify.h [new file with mode: 0644]

diff --git a/verify.c b/verify.c
new file mode 100644 (file)
index 0000000..f306ba2
--- /dev/null
+++ b/verify.c
@@ -0,0 +1,188 @@
+#include <errno.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "lib/messages.h"
+#include "lib/package.h"
+#include "query.h"
+#include "rpmlib.h"
+#include "verify.h"
+
+static void verifyHeader(char * prefix, Header h);
+static void verifyMatches(char * prefix, rpmdb db, dbIndexSet matches);
+
+static void verifyHeader(char * prefix, Header h) {
+    char ** fileList;
+    int count, type;
+    int_32 verifyResult;
+    int i;
+    char * size, * md5, * link, * mtime, * mode;
+    char * group, * user, * rdev;
+
+    if (getEntry(h, RPMTAG_FILENAMES, &type, (void **) &fileList, &count)) {
+       for (i = 0; i < count; i++) {
+           rpmVerifyFile(prefix, h, i, &verifyResult);
+
+           size = md5 = link = mtime = mode = "";
+           user = group = rdev = "";
+
+           if (!verifyResult) continue;
+       
+           if (verifyResult & VERIFY_MD5)
+               md5 = " 5 ";
+           if (verifyResult & VERIFY_FILESIZE)
+               size = " S ";
+           if (verifyResult & VERIFY_LINKTO)
+               link = " L ";
+           if (verifyResult & VERIFY_MTIME)
+               mtime = " T ";
+           if (verifyResult & VERIFY_RDEV)
+               rdev = " D ";
+           if (verifyResult & VERIFY_USER)
+               user = " U ";
+           if (verifyResult & VERIFY_GROUP)
+               group = " G ";
+           if (verifyResult & VERIFY_MODE)
+               mode = " M ";
+
+           printf("%-38s %4s %4s %3s %3s %4s %4s %5s %4s\n", fileList[i],
+                  size, mode, md5, rdev, link, user, group, mtime);
+       }
+       
+       free(fileList);
+    }
+}
+
+static void verifyMatches(char * prefix, rpmdb db, dbIndexSet matches) {
+    int i;
+    Header h;
+
+    for (i = 0; i < matches.count; i++) {
+       if (matches.recs[i].recOffset) {
+           message(MESS_DEBUG, "verifying record number %d\n",
+                       matches.recs[i].recOffset);
+           
+           h = rpmdbGetRecord(db, matches.recs[i].recOffset);
+           if (!h) {
+               fprintf(stderr, "error: could not read database record\n");
+           } else {
+               verifyHeader(prefix, h);
+               freeHeader(h);
+           }
+       }
+    }
+}
+
+void doVerify(char * prefix, enum verifysources source, char ** argv) {
+    Header h;
+    int offset;
+    int fd;
+    int rc;
+    int isSource;
+    rpmdb db;
+    dbIndexSet matches;
+    char * arg;
+
+    printf("%-38s %4s %4s %3s %3s %4s %4s %5s %4s\n", 
+               "File", "Size", "Mode", "Md5", "Dev", "Link", "User", 
+               "Group", "Time");
+    printf("------------------------------------------------------------"
+          "------------------\n");
+
+    if (source != VERIFY_SRPM && source != VERIFY_RPM) {
+       if (rpmdbOpen(prefix, &db, O_RDONLY, 0644)) {
+           exit(1);
+       }
+    }
+
+    if (source != VERIFY_SRPM && source != VERIFY_RPM) {
+       if (rpmdbOpen(prefix, &db, O_RDONLY, 0644)) {
+           exit(1);
+       }
+    }
+
+    if (source == VERIFY_EVERY) {
+       offset = rpmdbFirstRecNum(db);
+       while (offset) {
+           h = rpmdbGetRecord(db, offset);
+           if (!h) {
+               fprintf(stderr, "could not read database record!\n");
+               exit(1);
+           }
+           verifyHeader(prefix, h);
+           freeHeader(h);
+           offset = rpmdbNextRecNum(db, offset);
+       }
+    } else {
+       while (*argv) {
+           arg = *argv++;
+
+           switch (source) {
+             case VERIFY_SRPM:
+             case VERIFY_RPM:
+               fd = open(arg, O_RDONLY);
+               if (fd < 0) {
+                   fprintf(stderr, "open of %s failed: %s\n", arg, 
+                           strerror(errno));
+               } else {
+                   rc = pkgReadHeader(fd, &h, &isSource);
+                   close(fd);
+                   switch (rc) {
+                       case 0:
+                           verifyHeader(prefix, h);
+                           freeHeader(h);
+                           break;
+                       case 1:
+                           fprintf(stderr, "%s is not an RPM\n", arg);
+                   }
+               }
+                       
+               break;
+
+             case VERIFY_SGROUP:
+             case VERIFY_GRP:
+               if (rpmdbFindByGroup(db, arg, &matches)) {
+                   fprintf(stderr, "group %s does not contain any pacakges\n", 
+                                    arg);
+               } else {
+                   verifyMatches(prefix, db, matches);
+                   freeDBIndexRecord(matches);
+               }
+               break;
+
+             case VERIFY_SPATH:
+             case VERIFY_PATH:
+               if (rpmdbFindByFile(db, arg, &matches)) {
+                   fprintf(stderr, "file %s is not owned by any package\n", 
+                               arg);
+               } else {
+                   verifyMatches(prefix, db, matches);
+                   freeDBIndexRecord(matches);
+               }
+               break;
+
+             case VERIFY_SPACKAGE:
+             case VERIFY_PACKAGE:
+               rc = findPackageByLabel(db, arg, &matches);
+               if (rc == 1) 
+                   fprintf(stderr, "package %s is not installed\n", arg);
+               else if (rc == 2) {
+                   fprintf(stderr, "error looking for package %s\n", arg);
+               } else {
+                   verifyMatches(prefix, db, matches);
+                   freeDBIndexRecord(matches);
+               }
+               break;
+
+               case VERIFY_EVERY:
+                   ; /* nop */
+           }
+       }
+    }
+   
+    if (source != VERIFY_SRPM && source != VERIFY_RPM) {
+       rpmdbClose(db);
+    }
+}
diff --git a/verify.h b/verify.h
new file mode 100644 (file)
index 0000000..427e94a
--- /dev/null
+++ b/verify.h
@@ -0,0 +1,12 @@
+#ifndef H_VERIFY
+#define H_VERIFY
+
+#include <rpmlib.h>
+
+enum verifysources { VERIFY_PATH, VERIFY_PACKAGE, VERIFY_EVERY, VERIFY_SPATH,
+                    VERIFY_SPACKAGE, VERIFY_RPM, VERIFY_SRPM, VERIFY_GRP,
+                    VERIFY_SGROUP };
+
+void doVerify(char * prefix, enum verifysources source, char ** argv);
+
+#endif