#include "zpm.h"
#include "t/ctap/ctap.h"
+#include "lib/jsw/jsw_atree.h"
struct config {
char *dbfile;
+ char *pkgid;
int plan;
int ran;
int failed;
int quiet;
+ int skipuninstalled;
int failed_only;
int tap;
int check_owner;
if (rv == -1) {
switch (errno) {
case ENOENT: ok(0, "%s does not exist", path);
+ conf->failed++;
break;
- default: ok(0, "cannot stat %s: %s", path, strerror(errno));
+ default: ok(0, "%s%scannot stat %s: %s",
+ conf->pkgid ? conf->pkgid : "",
+ conf->pkgid ? " " : "",
+ path, strerror(errno));
conf->failed++;
break;
}
return 0;
}
- ok(1, "%s exists", path);
+ if (!conf->failed_only) {
+ ok(1, "%s%s%s exists",
+ conf->pkgid ? conf->pkgid : "",
+ conf->pkgid ? " " : "",
+ path);
+ }
+
+ if (ftype != 'r') {
+ return 0;
+ }
if (ftype == 'r' && !configfile) {
zpm_hash(path, ehash, 0);
- if (!is_string(ehash, hash, "hash %s", path)) {
+ rv = strcmp(ehash, hash);
+ if (rv != 0) {
conf->failed++;
}
+ if (rv != 0 || !conf->failed_only) {
+ is_string(ehash, hash, "%s%shash %s",
+ conf->pkgid ? conf->pkgid : "",
+ conf->pkgid ? " " : "",
+ path);
+ }
}
return 0;
}
+static int afind_strcmp(const void *a, const void *b) {
+ return strcmp(a, b);
+}
+
int main(int ac, char **av) {
struct zpm pkg;
char *s;
int opt;
char *pkgid;
-
+ jsw_atree_t *pkglist;
+ jsw_atrav_t *list;
+ int i, errors = 0;
+
+ pkglist = jsw_anew(afind_strcmp, (dup_f)strdup, (rel_f)free);
struct config conf = { 0 };
+
conf.dbfile = "/var/lib/zpm/local.db";
if ((s = getenv("ZPMDB"))) {
conf.dbfile = s;
}
- while ((opt = getopt(ac, av, "f:")) != -1) {
+ while ((opt = getopt(ac, av, "f:eF")) != -1) {
switch (opt) {
- case 'f': conf.dbfile = optarg;
- break;
+ case 'f': conf.dbfile = optarg; break;
+ case 'e': conf.skipuninstalled = 1; break;
+ case 'F': conf.failed_only = 1; break;
default:
usage();
exit(EXIT_FAILURE);
char *errmsg = 0;
if (argn < ac) {
- pkgid = av[argn];
- argn++;
} else {
fprintf(stderr, "must specify pkgid\n");
usage();
exit(EXIT_FAILURE);
}
- /* TODO lookup pkgid via zpm-findpkg equivalent */
+ for (i = argn; i < ac; i++) {
+ pkgid = zpm_findpkg(&pkg, av[i], "status = 'installed'");
+ if (!pkgid) {
+ if (conf.skipuninstalled) {
+ continue;
+ }
+ fprintf(stderr, "no installed package: %s\n", av[i]);
+ errors++;
+ free(pkgid);
+ pkgid = 0;
+ continue;
+ }
- if (!zpm_foreach_path(&pkg, pkgid, 0, count_plan, &conf, &errmsg)) {
- if (errmsg) {
- fprintf(stderr, "database error: %s\n", errmsg);
+ if (!zpm_foreach_path(&pkg, pkgid, 0, count_plan, &conf, &errmsg)) {
+ if (errmsg) {
+ fprintf(stderr, "database error: %s\n", errmsg);
+ exit(EXIT_FAILURE);
+ }
+ if (pkg.error == 1) {
+ fprintf(stderr, "unable to allocate memory\n");
+ }
+ fprintf(stderr, "unable to plan\n");
exit(EXIT_FAILURE);
}
- if (pkg.error == 1) {
- fprintf(stderr, "unable to allocate memory\n");
+ if (!jsw_ainsert(pkglist, pkgid)) {
+ fprintf(stderr, "pkglist insert failed\n");
+ exit(EXIT_FAILURE);
}
- fprintf(stderr, "unable to plan\n");
+ free(pkgid);
+ }
+ if (errors) {
exit(EXIT_FAILURE);
}
plan(conf.plan);
- if (!zpm_foreach_path(&pkg, pkgid, 0, verify, &conf, &errmsg)) {
- if (errmsg) {
- fprintf(stderr, "database error: %s\n", errmsg);
+ list = jsw_atnew();
+
+ for (pkgid = jsw_atfirst(list, pkglist); pkgid; pkgid = jsw_atnext(list)) {
+ conf.pkgid = pkgid;
+
+ if (!zpm_foreach_path(&pkg, pkgid, 0, verify, &conf, &errmsg)) {
+ if (errmsg) {
+ fprintf(stderr, "database error: %s\n", errmsg);
+ exit(EXIT_FAILURE);
+ }
+ if (pkg.error == 1) {
+ fprintf(stderr, "unable to allocate memory\n");
+ }
exit(EXIT_FAILURE);
}
- if (pkg.error == 1) {
- fprintf(stderr, "unable to allocate memory\n");
- }
- exit(EXIT_FAILURE);
}
+ if (pkglist) jsw_adelete(pkglist);
+
zpm_close(&pkg);
return conf.failed ? 1 : 0;
}