diff options
author | Alexey Shchepin <alexey@process-one.net> | 2003-02-06 19:09:22 +0000 |
---|---|---|
committer | Alexey Shchepin <alexey@process-one.net> | 2003-02-06 19:09:22 +0000 |
commit | a8a8e3b5a6cb872bbcf95b271515fc2aae9085d4 (patch) | |
tree | c4ee4a13df74090c1bae59014ef32d397fdc1bab /src/ejabberd_listener.erl | |
parent | *** empty log message *** (diff) |
*** empty log message ***
SVN Revision: 62
Diffstat (limited to 'src/ejabberd_listener.erl')
-rw-r--r-- | src/ejabberd_listener.erl | 46 |
1 files changed, 36 insertions, 10 deletions
diff --git a/src/ejabberd_listener.erl b/src/ejabberd_listener.erl index 3ed030c7b..004ddba38 100644 --- a/src/ejabberd_listener.erl +++ b/src/ejabberd_listener.erl @@ -10,7 +10,10 @@ -author('alexey@sevcom.net'). -vsn('$Revision$ '). --export([start_link/0, init/1, start/4, init/4]). +-export([start_link/0, init/1, start/4, + init/4, + init_ssl/5 + ]). start_link() -> supervisor:start_link({local, ejabberd_listeners}, ?MODULE, []). @@ -25,7 +28,7 @@ init(_) -> lists:map( fun({Port, Module, Fun, Opts}) -> {Port, - {?MODULE, start, [Port, Module, Fun, [Opts]]}, + {?MODULE, start, [Port, Module, Fun, Opts]}, permanent, brutal_kill, worker, @@ -34,22 +37,45 @@ init(_) -> end. -start(Port, Module, Fun, Args) -> - {ok, spawn_link(?MODULE, init, [Port, Module, Fun, Args])}. +start(Port, Module, Fun, Opts) -> + case lists:keysearch(ssl, 1, Opts) of + {value, {ssl, SSLOpts}} -> + {ok, spawn_link(?MODULE, init_ssl, + [Port, Module, Fun, Opts, SSLOpts])}; + _ -> + {ok, spawn_link(?MODULE, init, [Port, Module, Fun, Opts])} + end. -init(Port, Module, Fun, Args) -> +init(Port, Module, Fun, Opts) -> {ok, ListenSocket} = gen_tcp:listen(Port, [binary, {packet, 0}, {active, false}, {reuseaddr, true}]), - accept(ListenSocket, Module, Fun, Args). + accept(ListenSocket, Module, Fun, Opts). -accept(ListenSocket, Module, Fun, Args) -> +accept(ListenSocket, Module, Fun, Opts) -> case gen_tcp:accept(ListenSocket) of {ok,Socket} -> - apply(Module, Fun, [Socket] ++ Args), - %ejabberd_c2s:start(Socket), - accept(ListenSocket, Module, Fun, Args) + apply(Module, Fun, [{gen_tcp, Socket}, Opts]), + accept(ListenSocket, Module, Fun, Opts) + end. + + +init_ssl(Port, Module, Fun, Opts, SSLOpts) -> + {ok, ListenSocket} = ssl:listen(Port, [binary, + {packet, 0}, + {active, false}, + {nodelay, true}, + {backlog, 0}, + {cachetimout, 0} | + SSLOpts]), + accept_ssl(ListenSocket, Module, Fun, Opts). + +accept_ssl(ListenSocket, Module, Fun, Opts) -> + case ssl:accept(ListenSocket) of + {ok,Socket} -> + apply(Module, Fun, [{ssl, Socket}, Opts]), + accept_ssl(ListenSocket, Module, Fun, Opts) end. |