diff options
author | Kim Alvefur <zash@zash.se> | 2024-02-24 00:20:35 +0100 |
---|---|---|
committer | Kim Alvefur <zash@zash.se> | 2024-02-24 00:20:35 +0100 |
commit | 49c296360d8314cabf2aef48907488c109926ae3 (patch) | |
tree | 08e468fe47a7027b065944b25e4641daee10da7d | |
parent | 54f76b97d21b1198916cc354a6a5f7300c2eadc1 (diff) | |
download | prosody-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.lua | 15 |
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) |