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