Merge 0.10->trunk
[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("*", "network_backend") 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                 log("error", "libevent not found, falling back to select()");
17                 server_type = "select"
18         end
19 end
20
21 local server;
22 local set_config;
23 if server_type == "event" then
24         server = require "net.server_event";
25
26         local defaults = {};
27         for k,v in pairs(server.cfg) do
28                 defaults[k] = v;
29         end
30         function set_config(settings)
31                         local event_settings = {
32                                 ACCEPT_DELAY = settings.accept_retry_interval;
33                                 ACCEPT_QUEUE = settings.tcp_backlog;
34                                 CLEAR_DELAY = settings.event_clear_interval;
35                                 CONNECT_TIMEOUT = settings.connect_timeout;
36                                 DEBUG = settings.debug;
37                                 HANDSHAKE_TIMEOUT = settings.ssl_handshake_timeout;
38                                 MAX_CONNECTIONS = settings.max_connections;
39                                 MAX_HANDSHAKE_ATTEMPTS = settings.max_ssl_handshake_roundtrips;
40                                 MAX_READ_LENGTH = settings.max_receive_buffer_size;
41                                 MAX_SEND_LENGTH = settings.max_send_buffer_size;
42                                 READ_TIMEOUT = settings.read_timeout;
43                                 WRITE_TIMEOUT = settings.send_timeout;
44                         };
45
46                         for k,default in pairs(defaults) do
47                                 server.cfg[k] = event_settings[k] or default;
48                         end
49         end
50 elseif server_type == "select" then
51         server = require "net.server_select";
52
53         local defaults = {};
54         for k,v in pairs(server.getsettings()) do
55                 defaults[k] = v;
56         end
57         function set_config(settings)
58                         local select_settings = {};
59                         for k,default in pairs(defaults) do
60                                 select_settings[k] = settings[k] or default;
61                         end
62                         server.changesettings(select_settings);
63                 end
64 else
65         error("Unsupported server type")
66 end
67
68 -- If server.hook_signal exists, replace signal.signal()
69 local has_signal, signal = pcall(require, "util.signal");
70 if has_signal then
71         if server.hook_signal then
72                 function signal.signal(signal_id, handler)
73                         if type(signal_id) == "string" then
74                                 signal_id = signal[signal_id:upper()];
75                         end
76                         if type(signal_id) ~= "number" then
77                                 return false, "invalid-signal";
78                         end
79                         return server.hook_signal(signal_id, handler);
80                 end
81         else
82                 server.hook_signal = signal.signal;
83         end
84 else
85         if not server.hook_signal then
86                 server.hook_signal = function()
87                         return false, "signal hooking not supported"
88                 end
89         end
90 end
91
92 if prosody then
93         local config_get = require "core.configmanager".get;
94         local function load_config()
95                 local settings = config_get("*", "network_settings") or {};
96                 return set_config(settings);
97         end
98         load_config();
99         prosody.events.add_handler("config-reloaded", load_config);
100 end
101
102 -- require "net.server" shall now forever return this,
103 -- ie. server_select or server_event as chosen above.
104 return server;