net.server_epoll: Add support for systemd socket activation
Allows creating listening sockets and accepting client connections
before Prosody starts.
This is unlike normal Prosody dynamic resource management, where ports
may added and removed at any time, and the ports defined by the config.
Weird things happen if these are closed (e.g. due to reload) so here we
prevent closing and ensure sockets are reused when opened again.
-- Prosody IM
-- Copyright (C) 2014 Daurnimator
--
-- This project is MIT/X11 licensed. Please see the
-- COPYING file in the source package for more information.
--
-- This module allows you to use cqueues with a net.server mainloop
--
local server = require "prosody.net.server";
local cqueues = require "cqueues";
local timer = require "prosody.util.timer";
assert(cqueues.VERSION >= 20150113, "cqueues newer than 20150113 required")
-- Create a single top level cqueue
local cq;
if server.cq then -- server provides cqueues object
cq = server.cq;
elseif server.watchfd then
cq = cqueues.new();
local timeout = timer.add_task(cq:timeout() or 0, function ()
-- FIXME It should be enough to reschedule this timeout instead of replacing it, but this does not work. See https://issues.prosody.im/1572
assert(cq:loop(0));
return cq:timeout();
end);
server.watchfd(cq:pollfd(), function ()
assert(cq:loop(0));
local t = cq:timeout();
if t then
timer.stop(timeout);
timeout = timer.add_task(cq:timeout(), function ()
assert(cq:loop(0));
return cq:timeout();
end);
end
end);
else
error "NYI"
end
return {
cq = cq;
}