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;
* 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@ --- *
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@ --- *
*
* @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) {
}
}
- 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@ --- *
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@ --- *