server/tripe.c, server/admin.c: Add a way to end the main loop.
authorMark Wooding <mdw@distorted.org.uk>
Sat, 19 May 2018 19:05:49 +0000 (20:05 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Fri, 25 Jan 2019 12:10:32 +0000 (12:10 +0000)
This replaces the rather abrupt `a_quit' function.  Cleanup is handled
in `main', using the facilities added recently.

For now, there's a stub version of `lp_end' in `test.c', joining
`iv_...' from earlier.

server/admin.c
server/test.c
server/tripe.c
server/tripe.h

index 05cd168..0432b8a 100644 (file)
@@ -553,23 +553,6 @@ void a_notify(const char *fmt, ...)
   va_end(ap);
 }
 
-/* --- @a_quit@ --- *
- *
- * Arguments:  ---
- *
- * Returns:    ---
- *
- * Use:                Shuts things down nicely.
- */
-
-void a_quit(void)
-{
-  a_unlisten();
-  p_destroyall();
-  ps_quit();
-  exit(0);
-}
-
 /* --- @a_sigdie@ --- *
  *
  * Arguments:  @int sig@ = signal number
@@ -594,7 +577,7 @@ static void a_sigdie(int sig, void *v)
       break;
   }
   a_warn("SERVER", "quit", "signal", "%s", p, A_END);
-  a_quit();
+  lp_end();
 }
 
 /* --- @a_sighup@ --- *
@@ -2150,7 +2133,7 @@ static void acmd_quit(admin *a, unsigned ac, char *av[])
 {
   a_warn("SERVER", "quit", "admin-request", A_END);
   a_ok(a);
-  a_quit();
+  lp_end();
 }
 
 static void acmd_version(admin *a, unsigned ac, char *av[])
@@ -2278,7 +2261,7 @@ static void a_destroypending(void)
       if (a->f & AF_FOREGROUND) {
        T( trace(T_ADMIN, "admin: foreground client quit: shutting down"); )
        a_warn("SERVER", "quit", "foreground-eof", A_END);
-       a_quit();
+       lp_end();
       }
 
       /* --- Abort any background jobs in progress --- */
index 989bfd3..db98e37 100644 (file)
@@ -93,6 +93,8 @@ static void lastarg(void)
 void iv_addreason(void) { ; }
 void iv_rmreason(void) { ; }
 
+void lp_end(void) { ; }
+
 int main(int argc, char *argv[])
 {
   const char *kr = "keyring";
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);
 }
 
index f8e7bb6..720da1b 100644 (file)
@@ -1307,17 +1307,6 @@ extern void EXECL_LIKE(0) a_notify(const char */*fmt*/, ...);
 
 extern void a_create(int /*fd_in*/, int /*fd_out*/, unsigned /*f*/);
 
-/* --- @a_quit@ --- *
- *
- * Arguments:  ---
- *
- * Returns:    ---
- *
- * Use:                Shuts things down nicely.
- */
-
-extern void a_quit(void);
-
 /* --- @a_preselect@ --- *
  *
  * Arguments:  ---
@@ -1891,6 +1880,17 @@ extern void iv_rmreason(void);
 
 extern void lp_init(void);
 
+/* --- @lp_end@ --- *
+ *
+ * Arguments:  ---
+ *
+ * Returns:    ---
+ *
+ * Use:                Requests an exit from the main loop.
+ */
+
+extern void lp_end(void);
+
 /* --- @lp_run@ --- *
  *
  * Arguments:  ---