]> pd.if.org Git - zpackage/blobdiff - zpm-packagehash.c
improve contents and packagehash
[zpackage] / zpm-packagehash.c
index 534f6ad7de7b4eb4d958f48a6436ccb0a25d2587..6ca53af3c57274fda0b22c2d8ee272ad70387bc4 100644 (file)
@@ -8,8 +8,6 @@
 
 #include "zpm.h"
 
-static int found = 0;
-
 void usage(void) {
        fprintf(stderr, "zpm-findpkg [-I] [-s <status> ...] [-S <status>] [package]\n");
 }
@@ -19,7 +17,7 @@ int main(int ac, char **av){
        struct zpm pkg;
        char *dbfile;
 
-       int set = 0;
+       int set = 0, clear = 0, showcurrent = 0;
        int check = 0;
        int quiet = 0;
 
@@ -28,12 +26,19 @@ int main(int ac, char **av){
                dbfile = "/var/lib/zpm/local.db";
        }
 
-       while ((opt = getopt(ac, av, "f:scq")) != -1) {
+       /* set -s
+        * clear -S
+        * show current -e
+        * check -c
+        */ 
+       while ((opt = getopt(ac, av, "f:sScqe")) != -1) {
                switch (opt) {
                        case 'f': dbfile = optarg; break;
                        case 's': set = 1; break;
+                       case 'S': clear = 1; break;
                        case 'c': check = 1; break;
                        case 'q': quiet = 1; break;
+                       case 'e': showcurrent = 1; break;
                        default:
                                  usage();
                                  exit(EXIT_FAILURE);
@@ -49,25 +54,39 @@ int main(int ac, char **av){
 
        char *pkgid = av[argn];
        char hash[ZPM_HASH_STRLEN+1];
+       char *current = 0, *display = hash;
+       int checkfail = 0;
 
        if (zpm_open(&pkg, dbfile)) {
+               if (check || showcurrent) {
+                       current = zpm_db_string(&pkg, "select hash from packages_pkgid where pkgid = %Q", pkgid);
+               }
+
                if (check) {
-                       found = zpm_package_hash(&pkg, pkgid, hash);
-                       char *ehash = zpm_db_string(&pkg, "select hash from packages_pkgid where pkgid = %Q", pkgid);
-                       if (ehash && found && !strcmp(ehash, hash)) {
-                               found = 1;
-                       } else {
-                               found = 0;
+                       checkfail = 1;
+                       if (current) {
+                               zpm_package_hash(&pkg, pkgid, hash);
+                               checkfail = strcmp(current, hash);
                        }
                } else if (set) {
-                       found = zpm_package_sethash(&pkg, pkgid, hash);
+                       zpm_package_sethash(&pkg, pkgid, hash);
+               } else if (clear) {
+                       zpm_package_sethash(&pkg, pkgid, NULL);
+                       display = NULL;
+               } else if (showcurrent) {
+                       display = current;
                } else {
-                       found = zpm_package_hash(&pkg, pkgid, hash);
+                       zpm_package_hash(&pkg, pkgid, hash);
+               }
+
+               zpm_close(&pkg);
+               if (current) {
+                       free(current);
+               }
+               if (display && !quiet) {
+                       printf("%s\n", display);
                }
        }
-       zpm_close(&pkg);
-       if (found && !quiet) {
-               printf("%s\n", hash);
-       }
-       return found ? 0 : 1;
+
+       return checkfail ? EXIT_FAILURE : 0;
 }