view misc/systemd/socket-activation.lua @ 6352:525655adfd3e

mod_report_affiliations: Fix traceback a non-user is sending a presence For now we won’t touch their presence instead of emiting this traceback: error Traceback[s2s]: /usr/lib/prosody/core/rostermanager.lua:275: attempt to concatenate a nil value (local 'username') stack traceback: /usr/lib/prosody/core/rostermanager.lua:275: in function 'prosody.core.rostermanager.is_user_subscribed' ...ules/mod_report_affiliations/mod_report_affiliations.lua:116: in field '?' /usr/lib/prosody/util/events.lua:81: in function </usr/lib/prosody/util/events.lua:77> (...tail calls...) /usr/lib/prosody/core/stanza_router.lua:184: in upvalue 'core_post_stanza' /usr/lib/prosody/modules/mod_presence.lua:244: in function </usr/lib/prosody/modules/mod_presence.lua:231> (...tail calls...) /usr/lib/prosody/util/events.lua:81: in function </usr/lib/prosody/util/events.lua:77> (...tail calls...) /usr/lib/prosody/core/stanza_router.lua:188: in upvalue 'core_post_stanza' /usr/lib/prosody/core/stanza_router.lua:128: in upvalue 'core_process_stanza' /usr/lib/prosody/modules/mod_s2s.lua:818: in upvalue 'func' /usr/lib/prosody/util/async.lua:149: in function </usr/lib/prosody/util/async.lua:147>
author Link Mauve <linkmauve@linkmauve.fr>
date Tue, 30 Dec 2025 13:19:43 +0100
parents 3296a09b4e57
children
line wrap: on
line source

-- Monkeypatch to support socket activation
--
-- Requires LuaSocket after "agnostic" changes merged
--
-- To enable:
-- RunScript "socket-activation.lua"

local socket = require"socket";
local tcp_serv_mt = debug.getregistry()["tcp{server}"];
local socket_bind = socket.bind;

local SD_LISTEN_FDS_START = 3;

local fds = tonumber(os.getenv"LISTEN_FDS") or 0;

if fds < SD_LISTEN_FDS_START then return; end

local servs = {};

for i = 1, fds do
	local serv = socket.tcp();
	if serv:getfd() >= 0 then
		return; -- This won't work, we will leak the old FD
	end
	debug.setmetatable(serv, tcp_serv_mt);
	serv:setfd(SD_LISTEN_FDS_START + i - 1);
	local ip, port = serv:getsockname();
	servs [ ip .. ":" .. port ] = serv;
end

function socket.bind( ip, port, backlog )
	local sock = servs [ ip .. ":" .. port ];
	if sock then
		servs [ ip .. ":" .. port ] = nil;
		return sock;
	end
	if next(servs) == nil then
		-- my work here is done
		socket.bind = socket_bind;
	end
	return socket_bind( ip, port, backlog );
end