IMPORTANT: due to a drive failure, as of 13-Mar-2021, the Mercurial repository had to be re-mirrored, which changed every commit SHA. The old SHAs and trees are backed up in the vault branches. Please migrate to the new branches as soon as you can.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
prosody/net/server.lua

123 lines
3.5 KiB

16 years ago
-- Prosody IM
-- Copyright (C) 2008-2010 Matthew Wild
-- Copyright (C) 2008-2010 Waqas Hussain
--
16 years ago
-- This project is MIT/X11 licensed. Please see the
-- COPYING file in the source package for more information.
--
if not (prosody and prosody.config_loaded) then
-- This module only supports loading inside Prosody, outside Prosody
-- you should directly require net.server_select or server_event, etc.
error(debug.traceback("Loading outside Prosody or Prosody not yet initialized"), 0);
end
local log = require "util.logger".init("net.server");
local have_util_poll = pcall(require, "util.poll");
local default_backend = have_util_poll and "epoll" or "select";
local server_type = require "core.configmanager".get("*", "network_backend") or default_backend;
if require "core.configmanager".get("*", "use_libevent") then
server_type = "event";
end
if server_type == "event" then
if not pcall(require, "luaevent.core") then
log("error", "libevent not found, falling back to select()");
server_type = "select"
end
end
local server;
local set_config;
if server_type == "event" then
server = require "net.server_event";
local defaults = {};
for k,v in pairs(server.cfg) do
defaults[k] = v;
end
function set_config(settings)
local event_settings = {
ACCEPT_DELAY = settings.accept_retry_interval;
ACCEPT_QUEUE = settings.tcp_backlog;
CLEAR_DELAY = settings.event_clear_interval;
CONNECT_TIMEOUT = settings.connect_timeout;
DEBUG = settings.debug;
HANDSHAKE_TIMEOUT = settings.ssl_handshake_timeout;
MAX_CONNECTIONS = settings.max_connections;
MAX_HANDSHAKE_ATTEMPTS = settings.max_ssl_handshake_roundtrips;
MAX_READ_LENGTH = settings.max_receive_buffer_size;
MAX_SEND_LENGTH = settings.max_send_buffer_size;
READ_TIMEOUT = settings.read_timeout;
WRITE_TIMEOUT = settings.send_timeout;
};
for k,default in pairs(defaults) do
server.cfg[k] = event_settings[k] or default;
end
end
elseif server_type == "select" then
server = require "net.server_select";
local defaults = {};
for k,v in pairs(server.getsettings()) do
defaults[k] = v;
end
function set_config(settings)
local select_settings = {};
for k,default in pairs(defaults) do
select_settings[k] = settings[k] or default;
end
server.changesettings(select_settings);
end
else
server = require("net.server_"..server_type);
set_config = server.set_config;
if not server.get_backend then
function server.get_backend()
return server_type;
end
end
end
-- If server.hook_signal exists, replace signal.signal()
local has_signal, signal = pcall(require, "util.signal");
if has_signal then
if server.hook_signal then
function signal.signal(signal_id, handler)
if type(signal_id) == "string" then
signal_id = signal[signal_id:upper()];
end
if type(signal_id) ~= "number" then
return false, "invalid-signal";
end
return server.hook_signal(signal_id, handler);
end
else
server.hook_signal = signal.signal;
end
else
if not server.hook_signal then
server.hook_signal = function()
return false, "signal hooking not supported"
end
end
end
if prosody and set_config then
local config_get = require "core.configmanager".get;
local function load_config()
local settings = config_get("*", "network_settings") or {};
return set_config(settings);
end
load_config();
prosody.events.add_handler("config-reloaded", load_config);
end
-- require "net.server" shall now forever return this,
-- ie. server_select or server_event as chosen above.
return server;