From 2173bd49888d210eabcdbb0a7552789a5ad26507 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Sat, 19 May 2018 20:05:49 +0100 Subject: [PATCH] server/tripe.c, server/admin.c: Add a way to end the main loop. 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 | 23 +++-------------------- server/test.c | 2 ++ server/tripe.c | 18 ++++++++++++++++++ server/tripe.h | 22 +++++++++++----------- 4 files changed, 34 insertions(+), 31 deletions(-) diff --git a/server/admin.c b/server/admin.c index 05cd168b..0432b8a0 100644 --- a/server/admin.c +++ b/server/admin.c @@ -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 --- */ diff --git a/server/test.c b/server/test.c index 989bfd39..db98e37e 100644 --- a/server/test.c +++ b/server/test.c @@ -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"; diff --git a/server/tripe.c b/server/tripe.c index bf217b37..0252aa69 100644 --- a/server/tripe.c +++ b/server/tripe.c @@ -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); } diff --git a/server/tripe.h b/server/tripe.h index f8e7bb6c..720da1b5 100644 --- a/server/tripe.h +++ b/server/tripe.h @@ -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: --- -- 2.11.0