commit:     860259d2dc4b2e1016887d6ed65453d71fd9d427
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Sat Dec 13 13:30:35 2025 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Sat Dec 13 13:30:35 2025 +0000
URL:        https://gitweb.gentoo.org/proj/steve.git/commit/?id=860259d2

Refactor adding signal handlers into a helper function

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

 steve.cxx | 37 +++++++++++++++++++++----------------
 1 file changed, 21 insertions(+), 16 deletions(-)

diff --git a/steve.cxx b/steve.cxx
index d2a20da..089d442 100644
--- a/steve.cxx
+++ b/steve.cxx
@@ -75,11 +75,13 @@ struct steve_waiter {
        }
 };
 
+typedef std::unique_ptr<struct event, std::function<void(struct event*)>> 
event_ptr;
+
 struct steve_process {
        int pid_fd{-1};
        ssize_t tokens_held{0};
        bool token_reserved{false};
-       std::unique_ptr<struct event, std::function<void(struct event*)>> event;
+       event_ptr event;
 
        ~steve_process() {
                if (pid_fd != -1)
@@ -103,7 +105,7 @@ struct steve_state {
        int loadavg_fd{-2};
        struct timeval recheck_timeout{0, 500000};
        bool recheck_triggered{false};
-       std::unique_ptr<struct event, std::function<void(struct event*)>> 
recheck_event{nullptr, event_free};
+       event_ptr recheck_event{nullptr, event_free};
 
        /* to workaround lack of fuse_buf_free(), keep a global buffer */
        /* https://github.com/libfuse/libfuse/issues/1373 */
@@ -405,8 +407,7 @@ static void steve_open(fuse_req_t req, struct 
fuse_file_info *fi)
                        return;
                }
 
-               std::unique_ptr<struct event, std::function<void(struct 
event*)>>
-                       pidfd_event{event_new(state->evb, pid_fd, 
EV_READ|EV_PERSIST, steve_handle_pidfd, state), event_free};
+               event_ptr pidfd_event{event_new(state->evb, pid_fd, 
EV_READ|EV_PERSIST, steve_handle_pidfd, state), event_free};
                if (!pidfd_event) {
                        std::print(stderr, "unable to allocate event for 
pidfd");
                        close(pid_fd);
@@ -741,6 +742,20 @@ static void steve_handle_recheck(evutil_socket_t, short, 
void *userdata) {
        steve_wake_waiters(state);
 }
 
+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};
+       if (!ret) {
+               std::print(stderr, "failed to initialize SIG{} handler", 
sigabbrev_np(signum));
+               return nullptr;
+       }
+       if (event_add(ret.get(), nullptr) == -1) {
+               std::print(stderr, "failed to enable SIG{} handler", 
sigabbrev_np(signum));
+               return nullptr;
+       }
+       return ret;
+}
+
 static bool steve_drop_privileges(const char *user) {
        errno = 0;
        struct passwd *pw = getpwnam(user);
@@ -939,8 +954,7 @@ int main(int argc, char **argv)
        }
        state.session = session.get();
 
-       std::unique_ptr<struct event, std::function<void(struct event*)>>
-               cuse_event{event_new(evb.get(), cuse_fd, EV_READ|EV_PERSIST, 
steve_handle_cuse, &state), event_free};
+       event_ptr cuse_event{event_new(evb.get(), cuse_fd, EV_READ|EV_PERSIST, 
steve_handle_cuse, &state), event_free};
        if (!cuse_event) {
                std::print(stderr, "failed to initialize CUSE handler");
                return 1;
@@ -950,16 +964,7 @@ int main(int argc, char **argv)
                return 1;
        }
 
-       std::unique_ptr<struct event, std::function<void(struct event*)>>
-               sigusr1_event{evsignal_new(evb.get(), SIGUSR1, 
steve_handle_sigusr1, &state), event_free};
-       if (!sigusr1_event) {
-               std::print(stderr, "failed to initialize SIGUSR1 handler");
-               return 1;
-       }
-       if (event_add(sigusr1_event.get(), nullptr) == -1) {
-               std::print(stderr, "failed to enable SIGUSR1 handler");
-               return 1;
-       }
+       event_ptr sigusr1_event = steve_new_signal_handler(&state, SIGUSR1, 
steve_handle_sigusr1);
 
        std::string mountpoint = std::format("/dev/fd/{}", cuse_fd);
        if (fuse_session_mount(session.get(), mountpoint.c_str()) == -1) {

Reply via email to