From b6ace6eda12140c29ee58ec9178b9212b21fa538 Mon Sep 17 00:00:00 2001 From: Wojtek Kosior Date: Thu, 22 Jul 2021 14:42:58 +0200 Subject: add option to wait for termination by SIGTERM instead of by stdin input --- main.c | 5 +++-- serve.c | 16 ++++++++++++++-- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/main.c b/main.c index 99769f2..b5619fe 100644 --- a/main.c +++ b/main.c @@ -13,6 +13,7 @@ #include #include #include +#include #include @@ -155,7 +156,7 @@ static void print_component_name(const void *key, void *val, void *arg) unfilled ? " (referenced only)" : ""); } -int serve_scriptbase(struct scriptbase *base); +int serve_scriptbase(struct scriptbase *base, bool); int main(int argc, char *argv[]) { @@ -174,7 +175,7 @@ int main(int argc, char *argv[]) puts("## LOADED PAGES:"); ht_map(&base.pages, (void*) 'p', print_component_name); - if (serve_scriptbase(&base)) + if (serve_scriptbase(&base, !!getenv("HYDRILLA_WAIT_SIGTERM"))) fprintf(stderr, "Error serving scriptbase.\n"); scriptbase_destroy(&base); diff --git a/serve.c b/serve.c index dd61da1..8ef0ce3 100644 --- a/serve.c +++ b/serve.c @@ -9,10 +9,13 @@ * `doc/examples/logging.c' in libmicrohttpd source tree. */ +#define _POSIX_C_SOURCE 199506L /* sigwait() */ + #include #include #include #include +#include #include #include @@ -160,10 +163,12 @@ static int answer(void *data, int getchar(void); -int serve_scriptbase(struct scriptbase *base) +int serve_scriptbase(struct scriptbase *base, bool wait_for_sigterm) { int i; struct MHD_Daemon *daemon; + sigset_t sigterm_set; + int signal_number; /* only written, not read */ int retval = -1; if (init_url_lookup_regex()) @@ -185,7 +190,14 @@ int serve_scriptbase(struct scriptbase *base) if (!daemon) goto free_resources; - getchar(); + if (wait_for_sigterm) { + sigemptyset(&sigterm_set); + sigaddset(&sigterm_set, SIGTERM); + sigwait(&sigterm_set, &signal_number); + } else { + getchar(); + } + MHD_stop_daemon(daemon); retval = 0; -- cgit v1.2.3