|
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.event_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; |