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 e181d0e..a72164e 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 931c0fc..fb1d337 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 ba47232..b062b36 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