chiark / gitweb /
server/keymgmt.c, server/tripe.c: Add `km_clear' to shut down keyrings.
authorMark Wooding <mdw@distorted.org.uk>
Sat, 19 May 2018 20:12:10 +0000 (21:12 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Fri, 25 Jan 2019 12:10:32 +0000 (12:10 +0000)
A bit more fiddly than our previous efforts, but this completes the job
of unwinding all of the configurable components of the server.  The main
thing that doesn't get reset is the set of extant admin connections, and
I intend to leave those running until we have no choice.

server/keymgmt.c
server/tripe.c
server/tripe.h

index e181d0ef290b7f767f4c9cd7d1e2952a591e5f86..a72164e5e806d24e801415f8d9698e40786014f7 100644 (file)
@@ -528,6 +528,28 @@ static int kh_refresh(keyhalf *kh)
   return (changep);
 }
 
+/* --- @kh_clear@ --- *
+ *
+ * Arguments:  @keyhalf *kh@ = pointer to keyhalf structure
+ *
+ * Returns:    ---
+ *
+ * Use:                Clears out the keyhalf's keyring and flushes the cache.
+ */
+
+static void kh_clear(keyhalf *kh)
+{
+  sym_iter i;
+  knode *kn;
+
+  if (!kh->kf) return;
+  for (sym_mkiter(&i, &kh->tab); (kn = sym_next(&i)) != 0; )
+    if (kn->kd) km_unref(kn->kd);
+  sym_destroy(&kh->tab);
+  key_close(kh->kf);
+  kh->kf = 0;
+}
+
 /*----- Main code ---------------------------------------------------------*/
 
 const char *tag_priv;
@@ -593,6 +615,25 @@ int km_reload(void)
   return (changep);
 }
 
+/* --- @km_clear@ --- *
+ *
+ * Arguments:  ---
+ *
+ * Returns:    ---
+ *
+ * Use:                Forget the currently loaded keyrings.  The @master@ key will
+ *             be cleared, but other keys already loaded will continue to
+ *             exist until their reference count drops to zero.  Call
+ *             @km_init@ to make everything work again.
+ */
+
+void km_clear(void)
+{
+  kh_clear(&priv);
+  kh_clear(&pub);
+  if (master) { km_unref(master); master = 0; }
+}
+
 /* --- @km_findpub@, @km_findpriv@ --- *
  *
  * Arguments:  @const char *tag@ = key tag to load
index 931c0fca2a304296fb022dd4937d9d87348c2423..fb1d337581d7ce709ff438d1518abcb41be02e26 100644 (file)
@@ -437,6 +437,7 @@ int main(int argc, char *argv[])
   p_destroyall();
   p_unbind();
   a_unlisten();
+  km_clear();
   ps_quit();
   return (0);
 }
index ba47232bd898cfa7ae7b0f0695718d861358ca2c..b062b36602c8a3aed263908253d2cbf7db4b8271 100644 (file)
@@ -859,6 +859,20 @@ extern void km_init(const char */*privkr*/, const char */*pubkr*/,
 
 extern int km_reload(void);
 
+/* --- @km_clear@ --- *
+ *
+ * Arguments:  ---
+ *
+ * Returns:    ---
+ *
+ * Use:                Forget the currently loaded keyrings.  The @master@ key will
+ *             be cleared, but other keys already loaded will continue to
+ *             exist until their reference count drops to zero.  Call
+ *             @km_init@ to make everything work again.
+ */
+
+extern void km_clear(void);
+
 /* --- @km_findpub@, @km_findpriv@ --- *
  *
  * Arguments:  @const char *tag@ = key tag to load