server/admin.c: Remove spurious `ping' in usage message.
[tripe] / server / keymgmt.c
index a72164e..33fa7e2 100644 (file)
@@ -145,7 +145,7 @@ typedef struct keyhalf {
   const char *kind;
   int (*load)(key_file *, key *, key_data *,
              const dhops *, kdata *, dstr *, dstr *);
-  const char *kr;
+  char *kr;
   key_file *kf;
   fwatch w;
   sym_table tab;
@@ -291,19 +291,21 @@ static int kh_reopen(keyhalf *kh)
  * Arguments:  @keyhalf *kh@ = pointer to keyhalf structure to set up
  *             @const char *kr@ = name of the keyring file
  *
- * Returns:    ---
+ * Returns:    Zero on success, @-1@ on error.
  *
  * Use:                Initialize a keyhalf structure, maintaining the private or
  *             public keys.  Intended to be called during initialization:
  *             exits if there's some kind of problem.
  */
 
-static void kh_init(keyhalf *kh, const char *kr)
+static int kh_init(keyhalf *kh, const char *kr)
 {
-  kh->kr = kr;
+  if (kh->kf) return (0);
+  kh->kr = xstrdup(kr);
+  if (kh_reopen(kh)) return (-1);
   fwatch_init(&kh->w, kr);
   sym_create(&kh->tab);
-  if (kh_reopen(kh)) exit(EXIT_FAILURE);
+  return (0);
 }
 
 /* --- @kh_load@ --- *
@@ -392,6 +394,8 @@ founddh:
       if (kd->k)
        trace(T_CRYPTO, "crypto: k = %s", g->ops->scstr(g, kd->k));
       trace(T_CRYPTO, "crypto: K = %s", g->ops->gestr(g, kd->K));
+      trace(T_CRYPTO, "crypto: bulk transform = %s",
+           kd->algs.bulk->ops->name);
       kd->algs.bulk->ops->tracealgs(kd->algs.bulk);
     })
   })
@@ -547,13 +551,14 @@ static void kh_clear(keyhalf *kh)
     if (kn->kd) km_unref(kn->kd);
   sym_destroy(&kh->tab);
   key_close(kh->kf);
+  xfree(kh->kr);
   kh->kf = 0;
 }
 
 /*----- Main code ---------------------------------------------------------*/
 
-const char *tag_priv;
-kdata *master;
+char *tag_priv = 0;
+kdata *master = 0;
 
 /* --- @km_init@ --- *
  *
@@ -561,15 +566,16 @@ kdata *master;
  *             @const char *pubkr@ = public keyring file
  *             @const char *ptag@ = default private-key tag
  *
- * Returns:    ---
+ * Returns:    Zero on success, @-1@ on failure.
  *
  * Use:                Initializes the key-management machinery, loading the
  *             keyrings and so on.
  */
 
-void km_init(const char *privkr, const char *pubkr, const char *ptag)
+int km_init(const char *privkr, const char *pubkr, const char *ptag)
 {
   const gchash *const *hh;
+  kdata *kd;
 
   for (hh = ghashtab; *hh; hh++) {
     if ((*hh)->hashsz > MAXHASHSZ) {
@@ -580,11 +586,17 @@ void km_init(const char *privkr, const char *pubkr, const char *ptag)
     }
   }
 
-  kh_init(&priv, privkr);
-  kh_init(&pub, pubkr);
+  if (kh_init(&priv, privkr) || kh_init(&pub, pubkr))
+    return (-1);
+
+  tag_priv = ptag ? xstrdup(ptag) : 0;
+  kh_refresh(&priv);
 
-  tag_priv = ptag;
-  if ((master = km_findpriv(ptag)) == 0) exit(EXIT_FAILURE);
+  if ((kd = km_findpriv(tag_priv)) == 0) return (-1);
+  if (master) km_unref(master);
+  master = kd;
+
+  return (0);
 }
 
 /* --- @km_reload@ --- *
@@ -632,6 +644,7 @@ void km_clear(void)
   kh_clear(&priv);
   kh_clear(&pub);
   if (master) { km_unref(master); master = 0; }
+  if (tag_priv) { xfree(tag_priv); tag_priv = 0; }
 }
 
 /* --- @km_findpub@, @km_findpriv@ --- *