server/tripe.c, server/admin.c: Add a way to end the main loop.
[tripe] / server / tripe.c
index bf217b3..0252aa6 100644 (file)
@@ -38,6 +38,7 @@ static sel_timer it;
 
 static unsigned iv_nreasons = 0;
 static struct timeval iv_next = { 0, 0 };
+static int lpdone = 0;
 
 /*----- The interval timer ------------------------------------------------*/
 
@@ -121,6 +122,17 @@ void lp_init(void)
   sig_init(&sel);
 }
 
+/* --- @lp_end@ --- *
+ *
+ * Arguments:  ---
+ *
+ * Returns:    ---
+ *
+ * Use:                Requests an exit from the main loop.
+ */
+
+void lp_end(void) { lpdone = 1; }
+
 /* --- @lp_run@ --- *
  *
  * Arguments:  ---
@@ -136,6 +148,7 @@ int lp_run(void)
 
   for (;;) {
     a_preselect();
+    if (lpdone) break;
     if (!sel_select(&sel)) nerr = 0;
     else if (errno != EINTR && errno != EAGAIN) {
       a_warn("SERVER", "select-error", "?ERRNO", A_END);
@@ -146,6 +159,7 @@ int lp_run(void)
       }
     }
   }
+  lpdone = 0;
   return (0);
 }
 
@@ -419,6 +433,10 @@ int main(int argc, char *argv[])
   }
 
   lp_run();
+
+  p_destroyall();
+  a_unlisten();
+  ps_quit();
   return (0);
 }