]> git.ipfire.org Git - thirdparty/FORT-validator.git/commitdiff
Add custom SIGTERM handler
authorAlberto Leiva Popper <ydahhrk@gmail.com>
Fri, 1 May 2026 23:31:04 +0000 (17:31 -0600)
committerAlberto Leiva Popper <ydahhrk@gmail.com>
Mon, 22 Jun 2026 18:38:13 +0000 (12:38 -0600)
Allows clean termination when killed via SIGTERM.

It's a temporal hack; not safe because of the multithreading.
It's meant to be enabled during the controlled environment of Rapport
tests, and nowhere else.
Compile with -DOVERRIDE_SIGTERM to enable.

src/log.c
src/log.h
src/main.c
src/rtr/rtr.c

index 0b12ce19af7f5402d096203756de03af1398e358..a67c0ca2e9afdba732f5e41c72c4e6dac9d5a105 100644 (file)
--- a/src/log.c
+++ b/src/log.c
@@ -156,6 +156,18 @@ sigusr1_handler(int signum)
         */
 }
 
+volatile bool fort_end = false;
+
+#ifdef OVERRIDE_SIGTERM
+
+static void
+sigterm_handler(int signum)
+{
+       fort_end = true;
+}
+
+#endif
+
 /*
  * Register better handlers for some signals.
  *
@@ -190,6 +202,16 @@ register_signal_handlers(void)
        }
 #endif
 
+#ifdef OVERRIDE_SIGTERM
+       /* SIGTERM handler */
+       memset(&action, 0, sizeof(action));
+       action.sa_handler = sigterm_handler;
+       sigemptyset(&action.sa_mask);
+       if (sigaction(SIGTERM, &action, NULL) == -1)
+               pr_op_err("SIGTERM handler registration failure: %s",
+                   strerror(errno));
+#endif
+
        /* SIGUSR1 handler */
        memset(&action, 0, sizeof(action));
        action.sa_handler = sigusr1_handler;
index a8ac304dcc527c0e72d3e51389f01f9864a14a62..57b4b0fa4e6703fc7df99a33e2182b0ad9aa05c7 100644 (file)
--- a/src/log.h
+++ b/src/log.h
@@ -39,6 +39,8 @@
 #define CHECK_FORMAT(str, args) /* Nothing */
 #endif
 
+extern volatile bool fort_end;
+
 /*
  * Only call this group of functions when you know there's only one thread.
  *
index 84cc2d58e3e2b0c39125ff49854f966b3970b26e..e4f458c3426129f70ed162b36a79ff826b971171 100644 (file)
@@ -42,9 +42,11 @@ fort_server(void)
                return error;
 
        error = vrps_update(NULL);
+       if (fort_end)
+               goto end;
        if (error) {
                pr_op_err("Main loop: Validation unsuccessful; results unusable.");
-               return error;
+               goto end;
        }
 
        rtr_notify();
@@ -56,10 +58,12 @@ fort_server(void)
        do {
                pr_op_info("Main loop: Sleeping.");
                sleep(config_get_validation_interval());
+               if (fort_end)
+                       goto end;
                pr_op_info("Main loop: Time to work!");
 
                error = vrps_update(&changed);
-               if (error == -EINTR)
+               if (fort_end || error == -EINTR)
                        break;
                if (error) {
                        pr_op_debug("Main loop: Error %d (%s)", error,
@@ -70,7 +74,7 @@ fort_server(void)
                        rtr_notify();
        } while (true);
 
-       rtr_stop();
+end:   rtr_stop();
        return error;
 }
 
index 2e6fdeefe863898921152a7422c181809eb6ffeb..79466850fcc23f62442831f1ebba2f80d139c90d 100644 (file)
@@ -32,7 +32,6 @@ struct server_init_ctx {
 };
 
 static pthread_t server_thread;
-static volatile bool stop_server_thread;
 
 STATIC_ARRAY_LIST(server_arraylist, struct rtr_server)
 STATIC_ARRAY_LIST(client_arraylist, struct pdu_stream *)
@@ -578,7 +577,7 @@ fddb_poll(void)
 
        error = poll(pollfds, servers.len + clients.len, 1000);
 
-       if (stop_server_thread)
+       if (fort_end)
                goto stop;
 
        if (error == 0)
@@ -713,7 +712,7 @@ void rtr_stop(void)
 {
        int error;
 
-       stop_server_thread = true;
+       fort_end = true;
        error = pthread_join(server_thread, NULL);
        if (error) {
                pr_op_err("pthread_join() returned error %d: %s", error,