$NetBSD: patch-ad,v 1.1.1.1 2008/03/10 08:58:32 martti Exp $ Patch from Fabrice Colliot: support for multiple listeners on same port number (eg IPv4 and IPv6 simultaneously). --- src/ejabberd_listener.erl.orig 2008-01-16 12:33:27.000000000 +0200 +++ src/ejabberd_listener.erl 2008-02-14 15:25:12.000000000 +0200 @@ -27,12 +27,12 @@ -module(ejabberd_listener). -author('alexey@process-one.net'). --export([start_link/0, init/1, start/3, - init/3, - init_ssl/4, - start_listener/3, +-export([start_link/0, init/1, start/4, + init/4, + init_ssl/5, + start_listener/4, stop_listener/1, - add_listener/3, + add_listener/4, delete_listener/1 ]). @@ -49,9 +49,9 @@ Ls -> {ok, {{one_for_one, 10, 1}, lists:map( - fun({Port, Module, Opts}) -> - {Port, - {?MODULE, start, [Port, Module, Opts]}, + fun({ListenerID, Port, Module, Opts}) -> + {ListenerID, + {?MODULE, start, [ListenerID, Port, Module, Opts]}, transient, brutal_kill, worker, @@ -60,7 +60,7 @@ end. -start(Port, Module, Opts) -> +start(ListenerID, Port, Module, Opts) -> SSLError = "There is a problem with your ejabberd configuration file: the option 'ssl' for listening sockets is no longer available. To get SSL encryption use the option 'tls'.", case lists:keysearch(ssl, 1, Opts) of {value, {ssl, _SSLOpts}} -> @@ -77,11 +77,11 @@ {error, SSLError}; false -> {ok, proc_lib:spawn_link(?MODULE, init, - [Port, Module, Opts])} + [ListenerID, Port, Module, Opts])} end end. -init(Port, Module, Opts) -> +init(ListenerID, Port, Module, Opts) -> SockOpts = lists:filter(fun({ip, _}) -> true; (inet6) -> true; (inet) -> true; @@ -100,7 +100,7 @@ accept(ListenSocket, Module, Opts); {error, Reason} -> ?ERROR_MSG("Failed to open socket for ~p: ~p", - [{Port, Module, Opts}, Reason]), + [{ListenerID, Port, Module, Opts}, Reason]), error end. @@ -128,7 +128,7 @@ end. -init_ssl(Port, Module, Opts, SSLOpts) -> +init_ssl(ListenerID, Port, Module, Opts, SSLOpts) -> SockOpts = lists:filter(fun({ip, _}) -> true; (inet6) -> true; (inet) -> true; @@ -151,7 +151,7 @@ accept_ssl(ListenSocket, Module, Opts); {error, Reason} -> ?ERROR_MSG("Failed to open socket for ~p: ~p", - [{Port, Module, Opts}, Reason]), + [{ListenerID, Port, Module, Opts}, Reason]), error end. @@ -178,8 +178,8 @@ end. -start_listener(Port, Module, Opts) -> - ChildSpec = {Port, +start_listener(ListenerID, Port, Module, Opts) -> + ChildSpec = {ListenerID, {?MODULE, start, [Port, Module, Opts]}, transient, brutal_kill, @@ -187,30 +187,30 @@ [?MODULE]}, supervisor:start_child(ejabberd_listeners, ChildSpec). -stop_listener(Port) -> - supervisor:terminate_child(ejabberd_listeners, Port), - supervisor:delete_child(ejabberd_listeners, Port). +stop_listener(ListenerID) -> + supervisor:terminate_child(ejabberd_listeners, ListenerID), + supervisor:delete_child(ejabberd_listeners, ListenerID). -add_listener(Port, Module, Opts) -> +add_listener(ListenerID, Port, Module, Opts) -> Ports = case ejabberd_config:get_local_option(listen) of undefined -> []; Ls -> Ls end, - Ports1 = lists:keydelete(Port, 1, Ports), - Ports2 = [{Port, Module, Opts} | Ports1], + Ports1 = lists:keydelete(ListenerID, 1, Ports), + Ports2 = [{ListenerID, Port, Module, Opts} | Ports1], ejabberd_config:add_local_option(listen, Ports2), - start_listener(Port, Module, Opts). + start_listener(ListenerID, Port, Module, Opts). -delete_listener(Port) -> +delete_listener(ListenerID) -> Ports = case ejabberd_config:get_local_option(listen) of undefined -> []; Ls -> Ls end, - Ports1 = lists:keydelete(Port, 1, Ports), + Ports1 = lists:keydelete(ListenerID, 1, Ports), ejabberd_config:add_local_option(listen, Ports1), - stop_listener(Port). + stop_listener(ListenerID).