aboutsummaryrefslogtreecommitdiff
path: root/src/ejabberd_listener.erl
diff options
context:
space:
mode:
authorBadlop <badlop@process-one.net>2013-03-14 10:33:02 +0100
committerBadlop <badlop@process-one.net>2013-03-14 10:33:02 +0100
commit9deb294328bb3f9eb6bd2c0e7cd500732e9b5830 (patch)
tree7e1066c130250627ee0abab44a135f583a28d07f /src/ejabberd_listener.erl
parentlist_to_integer/2 only works in OTP R14 and newer (diff)
Accumulated patch to binarize and indent code
Diffstat (limited to 'src/ejabberd_listener.erl')
-rw-r--r--src/ejabberd_listener.erl80
1 files changed, 65 insertions, 15 deletions
diff --git a/src/ejabberd_listener.erl b/src/ejabberd_listener.erl
index 78f1691e1..9df8678b0 100644
--- a/src/ejabberd_listener.erl
+++ b/src/ejabberd_listener.erl
@@ -35,7 +35,8 @@
stop_listener/2,
parse_listener_portip/2,
add_listener/3,
- delete_listener/2
+ delete_listener/2,
+ validate_cfg/1
]).
-include("ejabberd.hrl").
@@ -53,7 +54,7 @@ init(_) ->
{ok, {{one_for_one, 10, 1}, []}}.
bind_tcp_ports() ->
- case ejabberd_config:get_local_option(listen) of
+ case ejabberd_config:get_local_option(listen, fun validate_cfg/1) of
undefined ->
ignore;
Ls ->
@@ -77,7 +78,8 @@ bind_tcp_port(PortIP, Module, RawOpts) ->
udp -> ok;
_ ->
ListenSocket = listen_tcp(PortIP, Module, SockOpts, Port, IPS),
- ets:insert(listen_sockets, {PortIP, ListenSocket})
+ ets:insert(listen_sockets, {PortIP, ListenSocket}),
+ ok
end
catch
throw:{error, Error} ->
@@ -85,7 +87,7 @@ bind_tcp_port(PortIP, Module, RawOpts) ->
end.
start_listeners() ->
- case ejabberd_config:get_local_option(listen) of
+ case ejabberd_config:get_local_option(listen, fun validate_cfg/1) of
undefined ->
ignore;
Ls ->
@@ -215,17 +217,17 @@ parse_listener_portip(PortIP, Opts) ->
case add_proto(PortIP, Opts) of
{P, Prot} ->
T = get_ip_tuple(IPOpt, IPVOpt),
- S = inet_parse:ntoa(T),
+ S = jlib:ip_to_list(T),
{P, T, S, Prot};
{P, T, Prot} when is_integer(P) and is_tuple(T) ->
- S = inet_parse:ntoa(T),
+ S = jlib:ip_to_list(T),
{P, T, S, Prot};
- {P, S, Prot} when is_integer(P) and is_list(S) ->
- [S | _] = string:tokens(S, "/"),
- {ok, T} = inet_parse:address(S),
+ {P, S, Prot} when is_integer(P) and is_binary(S) ->
+ [S | _] = str:tokens(S, <<"/">>),
+ {ok, T} = inet_parse:address(binary_to_list(S)),
{P, T, S, Prot}
end,
- IPV = case size(IPT) of
+ IPV = case tuple_size(IPT) of
4 -> inet;
8 -> inet6
end,
@@ -337,7 +339,7 @@ start_listener2(Port, Module, Opts) ->
start_listener_sup(Port, Module, Opts).
start_module_sup(_Port, Module) ->
- Proc1 = gen_mod:get_module_proc("sup", Module),
+ Proc1 = gen_mod:get_module_proc(<<"sup">>, Module),
ChildSpec1 =
{Proc1,
{ejabberd_tmp_sup, start_link, [Proc1, strip_frontend(Module)]},
@@ -357,7 +359,7 @@ start_listener_sup(Port, Module, Opts) ->
supervisor:start_child(ejabberd_listeners, ChildSpec).
stop_listeners() ->
- Ports = ejabberd_config:get_local_option(listen),
+ Ports = ejabberd_config:get_local_option(listen, fun validate_cfg/1),
lists:foreach(
fun({PortIpNetp, Module, _Opts}) ->
delete_listener(PortIpNetp, Module)
@@ -390,7 +392,8 @@ add_listener(PortIP, Module, Opts) ->
PortIP1 = {Port, IPT, Proto},
case start_listener(PortIP1, Module, Opts) of
{ok, _Pid} ->
- Ports = case ejabberd_config:get_local_option(listen) of
+ Ports = case ejabberd_config:get_local_option(
+ listen, fun validate_cfg/1) of
undefined ->
[];
Ls ->
@@ -420,7 +423,8 @@ delete_listener(PortIP, Module) ->
delete_listener(PortIP, Module, Opts) ->
{Port, IPT, _, _, Proto, _} = parse_listener_portip(PortIP, Opts),
PortIP1 = {Port, IPT, Proto},
- Ports = case ejabberd_config:get_local_option(listen) of
+ Ports = case ejabberd_config:get_local_option(
+ listen, fun validate_cfg/1) of
undefined ->
[];
Ls ->
@@ -430,11 +434,16 @@ delete_listener(PortIP, Module, Opts) ->
ejabberd_config:add_local_option(listen, Ports1),
stop_listener(PortIP1, Module).
+
+-spec is_frontend({frontend, module} | module()) -> boolean().
+
is_frontend({frontend, _Module}) -> true;
is_frontend(_) -> false.
%% @doc(FrontMod) -> atom()
%% where FrontMod = atom() | {frontend, atom()}
+-spec strip_frontend({frontend, module()} | module()) -> module().
+
strip_frontend({frontend, Module}) -> Module;
strip_frontend(Module) when is_atom(Module) -> Module.
@@ -505,7 +514,7 @@ socket_error(Reason, PortIP, Module, SockOpts, Port, IPS) ->
"IP address not available: " ++ IPS;
eaddrinuse ->
"IP address and port number already used: "
- ++IPS++" "++integer_to_list(Port);
+ ++binary_to_list(IPS)++" "++integer_to_list(Port);
_ ->
format_error(Reason)
end,
@@ -520,3 +529,44 @@ format_error(Reason) ->
ReasonStr ->
ReasonStr
end.
+
+-define(IS_CHAR(C), (is_integer(C) and (C >= 0) and (C =< 255))).
+-define(IS_UINT(U), (is_integer(U) and (U >= 0) and (U =< 65535))).
+-define(IS_PORT(P), (is_integer(P) and (P > 0) and (P =< 65535))).
+-define(IS_TRANSPORT(T), ((T == tcp) or (T == udp))).
+
+-type transport() :: udp | tcp.
+-type port_ip_transport() :: inet:port_number() |
+ {inet:port_number(), transport()} |
+ {inet:port_number(), inet:ip_address()} |
+ {inet:port_number(), inet:ip_address(),
+ transport()}.
+-spec validate_cfg(list()) -> [{port_ip_transport(), module(), list()}].
+
+validate_cfg(L) ->
+ lists:map(
+ fun({PortIPTransport, Mod, Opts}) when is_atom(Mod), is_list(Opts) ->
+ case PortIPTransport of
+ Port when ?IS_PORT(Port) ->
+ {Port, Mod, Opts};
+ {Port, Trans} when ?IS_PORT(Port) and ?IS_TRANSPORT(Trans) ->
+ {{Port, Trans}, Mod, Opts};
+ {Port, IP} when ?IS_PORT(Port) ->
+ {{Port, prepare_ip(IP)}, Mod, Opts};
+ {Port, IP, Trans} when ?IS_PORT(Port) and ?IS_TRANSPORT(Trans) ->
+ {{Port, prepare_ip(IP), Trans}, Mod, Opts}
+ end
+ end, L).
+
+prepare_ip({A, B, C, D} = IP)
+ when ?IS_CHAR(A) and ?IS_CHAR(B) and ?IS_CHAR(C) and ?IS_CHAR(D) ->
+ IP;
+prepare_ip({A, B, C, D, E, F, G, H} = IP)
+ when ?IS_UINT(A) and ?IS_UINT(B) and ?IS_UINT(C) and ?IS_UINT(D)
+ and ?IS_UINT(E) and ?IS_UINT(F) and ?IS_UINT(G) and ?IS_UINT(H) ->
+ IP;
+prepare_ip(IP) when is_list(IP) ->
+ {ok, Addr} = inet_parse:address(IP),
+ Addr;
+prepare_ip(IP) when is_binary(IP) ->
+ prepare_ip(binary_to_list(IP)).