mp-modsqrt: Always return the smaller possible square root.
[u/mdw/catacomb] / keyutil.c
index 1d4bbca..269a85d 100644 (file)
--- 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" },