aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKim Alvefur <zash@zash.se>2024-02-24 00:20:35 +0100
committerKim Alvefur <zash@zash.se>2024-02-24 00:20:35 +0100
commit49c296360d8314cabf2aef48907488c109926ae3 (patch)
tree08e468fe47a7027b065944b25e4641daee10da7d
parent54f76b97d21b1198916cc354a6a5f7300c2eadc1 (diff)
downloadprosody-49c296360d8314cabf2aef48907488c109926ae3.tar.gz
prosody-49c296360d8314cabf2aef48907488c109926ae3.zip
net.server_epoll: Support hooking signals via signalfd
Handling signal events the same way as all other events makes sense and seems safer than the signal handling just jumping around in C and messing with Lua states.
-rw-r--r--net/server_epoll.lua15
1 files changed, 15 insertions, 0 deletions
diff --git a/net/server_epoll.lua b/net/server_epoll.lua
index 18c18823..a064dcfa 100644
--- a/net/server_epoll.lua
+++ b/net/server_epoll.lua
@@ -29,6 +29,7 @@ local new_id = require "prosody.util.id".short;
local xpcall = require "prosody.util.xpcall".xpcall;
local sslconfig = require "prosody.util.sslconfig";
local tls_impl = require "prosody.net.tls_luasec";
+local have_signal, signal = pcall(require, "prosody.util.signal");
local poller = require "prosody.util.poll"
local EEXIST = poller.EEXIST;
@@ -1143,6 +1144,19 @@ local function loop(once)
return quitting;
end
+local hook_signal;
+if have_signal and signal.signalfd then
+ local function dispatch(self)
+ return self:on("signal", signal.signalfd_read(self:getfd()));
+ end
+
+ function hook_signal(signum, cb)
+ local watch = watchfd(signal.signalfd(signum), dispatch);
+ watch.listeners = { onsignal = cb };
+ return watch;
+ end
+end
+
return {
get_backend = function () return "epoll"; end;
addserver = addserver;
@@ -1168,6 +1182,7 @@ return {
set_config = function (newconfig)
cfg = setmetatable(newconfig, default_config);
end;
+ hook_signal = hook_signal;
tls_builder = function(basedir)
return sslconfig._new(tls_impl.new_context, basedir)