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) {