#define _POSIX_C_SOURCE 200809L #include #include #include #include #include #include "zpm.h" void usage(void) { fprintf(stderr, "zpm-note [-I] [-s ...] [-S ] [package]\n"); } void print_note(struct zpm_note *n) { printf("%" PRId64 " %s %s\n", n->id, n->pkgid ? n->pkgid : "-", n->note); } int main(int ac, char **av){ int opt; struct zpm pkg; char *dbfile; int fail, echo = 0; int select = 1; struct zpm_note n = { 0 }; n.pkgid = 0; n.hash = 0; n.path = 0; dbfile = getenv("ZPMDB"); if (!dbfile) { dbfile = "/var/lib/zpm/local.db"; } /* -l list * -p packageid * -A ack * -n note id * -D delete * -H hash * -a all * -m note message, otherwise EDITOR/vi to edit a text file * -e echo note after creating * zpm note -p pkgid -P path -H hash -m 'foo' * zpm note -l * zpm note -D * zpm note -A */ int list = 0, delete = 0, ack = 0; while ((opt = getopt(ac, av, "f:p:P:H:m:n:lDAae")) != -1) { switch (opt) { case 'f': dbfile = optarg; break; case 'p': n.pkgid = optarg; break; case 'P': n.path = optarg; break; case 'H': n.hash = optarg; break; case 'm': n.note = optarg; break; case 'n': n.id = strtoll(optarg, NULL, 10); break; case 'l': list = 1; break; case 'e': echo = 1; break; case 'D': delete = 1; break; case 'A': ack = 1; break; case 'a': select = 3; break; default: usage(); exit(EXIT_FAILURE); break; } } if (!dbfile) { fprintf(stderr, "must specify db\n"); return 1; } /* given a package name, get the packages */ /* no package name, get all */ if (zpm_open(&pkg, dbfile)) { if (list) { while (zpm_note(&pkg, &n, select)) { print_note(&n); zpm_note_free(&n); } } else if (n.note) { n.id = zpm_note_add(&pkg, n.pkgid, n.path, n.hash, "%s", n.note); if (n.id) { if (echo) { print_note(&n); } else { printf("%" PRId64 "\n", n.id); } } else { fprintf(stderr, "unable to create note\n"); pkg.error = 1; } } else if (delete) { zpm_note_del(&pkg, n.id); } else if (ack) { zpm_note_ack(&pkg, n.id); } } else { fprintf(stderr, "unable to open %s\n", dbfile); } fail = pkg.error; zpm_close(&pkg); if (n.id) { zpm_note_free(&n); } return fail ? EXIT_FAILURE : EXIT_SUCCESS; }