net/server: Split up different backends in a nicer way. Add global config option...
[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         -- Overwrite signal.signal() because we need to ask libevent to
28         -- handle them instead
29         local ok, signal = pcall(require, "util.signal");
30         if ok and signal then
31                 local _signal_signal = signal.signal;
32                 function signal.signal(signal_id, handler)
33                         if type(signal_id) == "string" then
34                                 signal_id = signal[signal_id:upper()];
35                         end
36                         if type(signal_id) ~= "number" then
37                                 return false, "invalid-signal";
38                         end
39                         return server.hook_signal(signal_id, handler);
40                 end
41         end
42
43         local defaults = {};
44         for k,v in pairs(server.cfg) do
45                 defaults[k] = v;
46         end
47         function set_config(settings)
48                 local event_settings = {
49                         ACCEPT_DELAY = settings.event_accept_retry_interval;
50                         ACCEPT_QUEUE = settings.tcp_backlog;
51                         CLEAR_DELAY = settings.event_clear_interval;
52                         CONNECT_TIMEOUT = settings.connect_timeout;
53                         DEBUG = settings.debug;
54                         HANDSHAKE_TIMEOUT = settings.ssl_handshake_timeout;
55                         MAX_CONNECTIONS = settings.max_connections;
56                         MAX_HANDSHAKE_ATTEMPTS = settings.max_ssl_handshake_roundtrips;
57                         MAX_READ_LENGTH = settings.max_receive_buffer_size;
58                         MAX_SEND_LENGTH = settings.max_send_buffer_size;
59                         READ_TIMEOUT = settings.read_timeout;
60                         WRITE_TIMEOUT = settings.send_timeout;
61                 };
62
63                 for k,default in pairs(defaults) do
64                         server.cfg[k] = event_settings[k] or default;
65                 end
66         end
67 elseif server_type == "select" then
68         server = require "net.server_select";
69
70         local defaults = {};
71         for k,v in pairs(server.getsettings()) do
72                 defaults[k] = v;
73         end
74         function set_config(settings)
75                 local select_settings = {};
76                 for k,default in pairs(defaults) do
77                         select_settings[k] = settings[k] or default;
78                 end
79                 server.changesettings(select_settings);
80         end
81 else
82         error("Unsupported server type")
83 end
84
85 if prosody then
86         local config_get = require "core.configmanager".get;
87         local function load_config()
88                 local settings = config_get("*", "network_settings") or {};
89                 return set_config(settings);
90         end
91         load_config();
92         prosody.events.add_handler("config-reloaded", load_config);
93 end
94
95 -- require "net.server" shall now forever return this,
96 -- ie. server_select or server_event as chosen above.
97 return server;