X-Git-Url: https://git.distorted.org.uk/u/mdw/catacomb/blobdiff_plain/ef13e9a46baaa347014ac236f36a2536f055b108..222c8a436f09da82e2ee7c84c7aca47d11a2c843:/keyutil.c diff --git a/keyutil.c b/keyutil.c index 1d4bbca..269a85d 100644 --- a/keyutil.c +++ b/keyutil.c @@ -1015,7 +1015,7 @@ static int cmd_add(int argc, char *argv[]) /* --- Expiry dates get passed to @get_date@ for parsing --- */ case 'e': - if (strncmp(optarg, "forever", strlen(optarg)) == 0) + if (strcmp(optarg, "forever") == 0) exp = KEXP_FOREVER; else { exp = get_date(optarg, 0); @@ -1166,7 +1166,9 @@ static int cmd_add(int argc, char *argv[]) int err; key *kk; if (k.f & f_retag) { - if ((kk = key_bytag(&f, tag)) != 0 && strcmp(kk->tag, tag) == 0) + if ((kk = key_bytag(&f, tag)) != 0 && + kk->tag && + strcmp(kk->tag, tag) == 0) key_settag(&f, kk, 0); } if ((err = key_settag(&f, k.k, tag)) != 0) @@ -1609,6 +1611,29 @@ static int cmd_setattr(int argc, char *argv[]) return (0); } +/* --- @cmd_getattr@ --- */ + +static int cmd_getattr(int argc, char *argv[]) +{ + key_file f; + key *k; + dstr d = DSTR_INIT; + const char *p; + + if (argc != 3) + die(EXIT_FAILURE, "Usage: getattr TAG ATTR"); + doopen(&f, KOPEN_READ); + if ((k = key_bytag(&f, argv[1])) == 0) + die(EXIT_FAILURE, "key `%s' not found", argv[1]); + key_fulltag(k, &d); + if ((p = key_getattr(&f, k, argv[2])) == 0) + die(EXIT_FAILURE, "no attribute `%s' for key `%s'", argv[2], d.buf); + puts(p); + dstr_destroy(&d); + doclose(&f); + return (0); +} + /* --- @cmd_finger@ --- */ static void fingerprint(key *k, const gchash *ch, const key_filter *kf) @@ -1784,6 +1809,7 @@ static int cmd_verify(int argc, char *argv[]) fpr = GH_DONE(h, 0); if (memcmp(fpr, buf, ch->hashsz) != 0) die(EXIT_FAILURE, "key fingerprint mismatch"); + doclose(&f); return (0); } @@ -1905,6 +1931,8 @@ static int cmd_extract(int argc, char *argv[]) int i; int rc = 0; key_filter kf = { 0, 0 }; + dstr d = DSTR_INIT; + const char *outfile = 0; FILE *fp; for (;;) { @@ -1933,9 +1961,13 @@ static int cmd_extract(int argc, char *argv[]) die(EXIT_FAILURE, "Usage: extract [-f FILTER] FILE [TAG...]"); if (strcmp(*argv, "-") == 0) fp = stdout; - else if (!(fp = fopen(*argv, "w"))) { - die(EXIT_FAILURE, "couldn't open `%s' for writing: %s", - *argv, strerror(errno)); + else { + outfile = *argv; + dstr_putf(&d, "%s.new", outfile); + if (!(fp = fopen(d.buf, "w"))) { + die(EXIT_FAILURE, "couldn't open `%s' for writing: %s", + d.buf, strerror(errno)); + } } doopen(&f, KOPEN_READ); @@ -1954,8 +1986,9 @@ static int cmd_extract(int argc, char *argv[]) } } } - if (fclose(fp)) + if (fclose(fp) || (outfile && rename(d.buf, outfile))) die(EXIT_FAILURE, "error writing file: %s", strerror(errno)); + dstr_destroy(&d); doclose(&f); return (rc); } @@ -2057,6 +2090,7 @@ Options:\n\ { "expire", cmd_expire, "expire TAG..." }, { "delete", cmd_delete, "delete TAG..." }, { "setattr", cmd_setattr, "setattr TAG ATTR..." }, + { "getattr", cmd_getattr, "getattr TAG ATTR" }, { "comment", cmd_comment, "comment TAG [COMMENT]" }, { "lock", cmd_lock, "lock QTAG" }, { "unlock", cmd_unlock, "unlock QTAG" },