5c0d0d2474a8c4b31f50b1899244d9195380547c
[prosody.git] / net / server.lua
1 -- Prosody IM
2 -- Copyright (C) 2008-2010 Matthew Wild
3 -- Copyright (C) 2008-2010 Waqas Hussain
4 --
5 -- This project is MIT/X11 licensed. Please see the
6 -- COPYING file in the source package for more information.
7 --
8
9 local server_type = prosody and require "core.configmanager".get("*", "server") or "select";
10 if prosody and require "core.configmanager".get("*", "use_libevent") then
11         server_type = "event";
12 end
13
14 if server_type == "event" then
15         if not pcall(require, "luaevent.core") then
16                 print(log)
17                 log("error", "libevent not found, falling back to select()");
18                 server_type = "select"
19         end
20 end
21
22 local server;
23 local set_config;
24 if server_type == "event" then
25         server = require "net.server_event";
26
27         local defaults = {};
28         for k,v in pairs(server.cfg) do
29                 defaults[k] = v;
30         end
31         function set_config(settings)
32                 local event_settings = {
33                         ACCEPT_DELAY = settings.event_accept_retry_interval;
34                         ACCEPT_QUEUE = settings.tcp_backlog;
35                         CLEAR_DELAY = settings.event_clear_interval;
36                         CONNECT_TIMEOUT = settings.connect_timeout;
37                         DEBUG = settings.debug;
38                         HANDSHAKE_TIMEOUT = settings.ssl_handshake_timeout;
39                         MAX_CONNECTIONS = settings.max_connections;
40                         MAX_HANDSHAKE_ATTEMPTS = settings.max_ssl_handshake_roundtrips;
41                         MAX_READ_LENGTH = settings.max_receive_buffer_size;
42                         MAX_SEND_LENGTH = settings.max_send_buffer_size;
43                         READ_TIMEOUT = settings.read_timeout;
44                         WRITE_TIMEOUT = settings.send_timeout;
45                 };
46
47                 for k,default in pairs(defaults) do
48                         server.cfg[k] = event_settings[k] or default;
49                 end
50         end
51 elseif server_type == "select" then
52         server = require "net.server_select";
53
54         local defaults = {};
55         for k,v in pairs(server.getsettings()) do
56                 defaults[k] = v;
57         end
58         function set_config(settings)
59                 local select_settings = {};
60                 for k,default in pairs(defaults) do
61                         select_settings[k] = settings[k] or default;
62                 end
63                 server.changesettings(select_settings);
64         end
65 else
66         error("Unsupported server type")
67 end
68
69 -- If server.hook_signal exists, replace signal.signal()
70 local ok, signal = pcall(require, "util.signal");
71 if server.hook_signal then
72         if ok then
73                 function signal.signal(signal_id, handler)
74                         if type(signal_id) == "string" then
75                                 signal_id = signal[signal_id:upper()];
76                         end
77                         if type(signal_id) ~= "number" then
78                                 return false, "invalid-signal";
79                         end
80                         return server.hook_signal(signal_id, handler);
81                 end
82         end
83 else
84         server.hook_signal = signal.signal;
85 end
86
87 if prosody then
88         local config_get = require "core.configmanager".get;
89         local function load_config()
90                 local settings = config_get("*", "network_settings") or {};
91                 return set_config(settings);
92         end
93         load_config();
94         prosody.events.add_handler("config-reloaded", load_config);
95 end
96
97 -- require "net.server" shall now forever return this,
98 -- ie. server_select or server_event as chosen above.
99 return server;