commit:     a3ac9929a6ab915476bb5d1c997a3595eb009ce0
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Sat Dec 13 13:43:08 2025 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Sat Dec 13 13:43:08 2025 +0000
URL:        https://gitweb.gentoo.org/proj/steve.git/commit/?id=a3ac9929

Add proper termination signal handlers

Signed-off-by: Michał Górny <mgorny <AT> gentoo.org>

 steve.cxx | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/steve.cxx b/steve.cxx
index 0addece..ecbf32e 100644
--- a/steve.cxx
+++ b/steve.cxx
@@ -742,6 +742,16 @@ static void steve_handle_recheck(evutil_socket_t, short, 
void *userdata) {
        steve_wake_waiters(state);
 }
 
+static void steve_handle_exit(evutil_socket_t signum, short, void *userdata) {
+       steve_state *state = static_cast<steve_state *>(userdata);
+
+       std::print("Exiting on SIG{}\n", sigabbrev_np(signum));
+       if (event_base_loopbreak(state->evb) == -1) {
+               std::print(stderr, "event_base_loopbreak() failed, forcing hard 
exit");
+               exit(1);
+       }
+}
+
 static event_ptr steve_new_signal_handler(steve_state *state, int signum, 
event_callback_fn handler)
 {
        event_ptr ret{evsignal_new(state->evb, signum, handler, state), 
event_free};
@@ -965,6 +975,10 @@ int main(int argc, char **argv)
        }
 
        event_ptr sigusr1_event = steve_new_signal_handler(&state, SIGUSR1, 
steve_handle_sigusr1);
+       std::vector<event_ptr> term_signal_handlers;
+       for (int signum : {SIGHUP, SIGINT, SIGTERM})
+               term_signal_handlers.push_back(
+                               steve_new_signal_handler(&state, signum, 
steve_handle_exit));
 
        std::string mountpoint = std::format("/dev/fd/{}", cuse_fd);
        if (fuse_session_mount(session.get(), mountpoint.c_str()) == -1) {

Reply via email to