]> pd.if.org Git - zpackage/blobdiff - src/findpkg.c
move C source files into src
[zpackage] / src / findpkg.c
diff --git a/src/findpkg.c b/src/findpkg.c
new file mode 100644 (file)
index 0000000..4ee3f12
--- /dev/null
@@ -0,0 +1,86 @@
+#define _POSIX_C_SOURCE 2 
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <unistd.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, argn;
+       struct zpm zpm;
+       char *dbfile = 0, *pkgstr = 0, *pkgid = 0;
+
+       char *sql;
+       sqlite3_str *include;
+       sqlite3_str *exclude;
+       sqlite3_str *query;
+
+       dbfile = getenv("ZPMDB");
+       if (!dbfile) {
+               dbfile = "/var/lib/zpm/local.db";
+       }
+
+       include = sqlite3_str_new(NULL);
+       exclude = sqlite3_str_new(NULL);
+
+       while ((opt = getopt(ac, av, "f:s:S:I")) != -1) {
+               switch (opt) {
+                       case 'f': dbfile = optarg; break;
+                       case 's': sqlite3_str_appendf(include,",%Q", optarg);
+                                 break;
+                       case 'S': sqlite3_str_appendf(exclude,",%Q", optarg);
+                                 break;
+                       case 'I': sqlite3_str_appendall(include,",'installed'");
+                                 break;
+                       default:
+                                 usage();
+                                 exit(EXIT_FAILURE);
+                                 break;
+               }
+       }
+       argn = optind;
+
+       if (!dbfile) {
+               fprintf(stderr, "must specify db\n");
+               return 1;
+       }
+
+       query = sqlite3_str_new(NULL);
+
+       if (zpm_open(&zpm, dbfile)) {
+               char *excludes, *includes;
+
+               excludes = sqlite3_str_value(exclude);
+               includes = sqlite3_str_value(include);
+
+               if (includes) {
+                       sqlite3_str_appendf(query, "status in (%s)", includes+1);
+               }
+               if (excludes) {
+                       sqlite3_str_appendf(query, "%sstatus not in (%s)",
+                                      includes ? " and " : "",
+                                      excludes+1);
+               }
+
+               if (ac >= argn) {
+                       pkgstr = av[argn];
+               }
+
+               sql = sqlite3_str_value(query);
+
+               pkgid = zpm_findpkg(&zpm, pkgstr, sql);
+
+               sqlite3_free(sql);
+               if (pkgid) {
+                       printf("%s\n", pkgid);
+               }
+               zpm_close(&zpm);
+       }
+       return pkgid ? 0 : 1;
+}