]> pd.if.org Git - zpackage/blobdiff - src/packagehash.c
move C source files into src
[zpackage] / src / packagehash.c
diff --git a/src/packagehash.c b/src/packagehash.c
new file mode 100644 (file)
index 0000000..6d5b912
--- /dev/null
@@ -0,0 +1,90 @@
+#define _POSIX_C_SOURCE 2 
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <unistd.h>
+#include <string.h>
+
+#include "zpm.h"
+
+void usage(void) {
+       fprintf(stderr, "zpm-findpkg [-I] [-s <status> ...] [-S <status>] [package]\n");
+}
+
+int main(int ac, char **av){
+       int opt;
+       struct zpm pkg;
+       char *dbfile;
+
+       int set = 0, clear = 0, showcurrent = 0;
+       int check = 0;
+       int quiet = 0;
+
+       dbfile = getenv("ZPMDB");
+       if (!dbfile) {
+               dbfile = "/var/lib/zpm/local.db";
+       }
+
+       /* 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);
+                                 break;
+               }
+       }
+       int argn = optind;
+
+       if (!dbfile) {
+               fprintf(stderr, "must specify db\n");
+               return 1;
+       }
+
+       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) {
+                       checkfail = 1;
+                       if (current) {
+                               zpm_package_hash(&pkg, pkgid, hash);
+                               checkfail = strcmp(current, hash);
+                       }
+               } else if (set) {
+                       zpm_package_sethash(&pkg, pkgid, hash);
+               } else if (clear) {
+                       zpm_package_sethash(&pkg, pkgid, NULL);
+                       display = NULL;
+               } else if (showcurrent) {
+                       display = current;
+               } else {
+                       zpm_package_hash(&pkg, pkgid, hash);
+               }
+
+               zpm_close(&pkg);
+               if (display && !quiet) {
+                       printf("%s\n", display);
+               }
+               free(current);
+       }
+
+       return checkfail ? EXIT_FAILURE : 0;
+}