Software / code / prosody-modules
Comparison
misc/systemd/socket-activation.lua @ 2352:3296a09b4e57
misc/systemd: Experimental files for enabling socket activation
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Tue, 08 Nov 2016 00:09:56 +0100 |
comparison
equal
deleted
inserted
replaced
| 2351:f8ecb4b248b0 | 2352:3296a09b4e57 |
|---|---|
| 1 -- Monkeypatch to support socket activation | |
| 2 -- | |
| 3 -- Requires LuaSocket after "agnostic" changes merged | |
| 4 -- | |
| 5 -- To enable: | |
| 6 -- RunScript "socket-activation.lua" | |
| 7 | |
| 8 local socket = require"socket"; | |
| 9 local tcp_serv_mt = debug.getregistry()["tcp{server}"]; | |
| 10 local socket_bind = socket.bind; | |
| 11 | |
| 12 local SD_LISTEN_FDS_START = 3; | |
| 13 | |
| 14 local fds = tonumber(os.getenv"LISTEN_FDS") or 0; | |
| 15 | |
| 16 if fds < SD_LISTEN_FDS_START then return; end | |
| 17 | |
| 18 local servs = {}; | |
| 19 | |
| 20 for i = 1, fds do | |
| 21 local serv = socket.tcp(); | |
| 22 if serv:getfd() >= 0 then | |
| 23 return; -- This won't work, we will leak the old FD | |
| 24 end | |
| 25 debug.setmetatable(serv, tcp_serv_mt); | |
| 26 serv:setfd(SD_LISTEN_FDS_START + i - 1); | |
| 27 local ip, port = serv:getsockname(); | |
| 28 servs [ ip .. ":" .. port ] = serv; | |
| 29 end | |
| 30 | |
| 31 function socket.bind( ip, port, backlog ) | |
| 32 local sock = servs [ ip .. ":" .. port ]; | |
| 33 if sock then | |
| 34 servs [ ip .. ":" .. port ] = nil; | |
| 35 return sock; | |
| 36 end | |
| 37 if next(servs) == nil then | |
| 38 -- my work here is done | |
| 39 socket.bind = socket_bind; | |
| 40 end | |
| 41 return socket_bind( ip, port, backlog ); | |
| 42 end |