mirror of
https://github.com/processone/ejabberd.git
synced 2024-11-20 16:15:59 +01:00
Report real address of a listener
This commit is contained in:
parent
e96bfbdbfa
commit
1866b56e3b
@ -104,57 +104,70 @@ init({Port, _, udp} = EndPoint, Module, Opts, SockOpts) ->
|
|||||||
{reuseaddr, true} |
|
{reuseaddr, true} |
|
||||||
SockOpts]) of
|
SockOpts]) of
|
||||||
{ok, Socket} ->
|
{ok, Socket} ->
|
||||||
proc_lib:init_ack({ok, self()}),
|
case inet:sockname(Socket) of
|
||||||
application:ensure_started(ejabberd),
|
{ok, {Addr, Port1}} ->
|
||||||
?INFO_MSG("Start accepting UDP connections at ~s for ~p",
|
proc_lib:init_ack({ok, self()}),
|
||||||
[format_endpoint(EndPoint), Module]),
|
application:ensure_started(ejabberd),
|
||||||
case erlang:function_exported(Module, udp_init, 2) of
|
?INFO_MSG("Start accepting UDP connections at ~s for ~p",
|
||||||
false ->
|
[format_endpoint({Port1, Addr, udp}), Module]),
|
||||||
udp_recv(Socket, Module, Opts);
|
case erlang:function_exported(Module, udp_init, 2) of
|
||||||
true ->
|
false ->
|
||||||
case catch Module:udp_init(Socket, Opts) of
|
|
||||||
{'EXIT', _} = Err ->
|
|
||||||
?ERROR_MSG("failed to process callback function "
|
|
||||||
"~p:~s(~p, ~p): ~p",
|
|
||||||
[Module, udp_init, Socket, Opts, Err]),
|
|
||||||
udp_recv(Socket, Module, Opts);
|
udp_recv(Socket, Module, Opts);
|
||||||
NewOpts ->
|
true ->
|
||||||
udp_recv(Socket, Module, NewOpts)
|
case catch Module:udp_init(Socket, Opts) of
|
||||||
end
|
{'EXIT', _} = Err ->
|
||||||
|
?ERROR_MSG("failed to process callback function "
|
||||||
|
"~p:~s(~p, ~p): ~p",
|
||||||
|
[Module, udp_init, Socket, Opts, Err]),
|
||||||
|
udp_recv(Socket, Module, Opts);
|
||||||
|
NewOpts ->
|
||||||
|
udp_recv(Socket, Module, NewOpts)
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
{error, Reason} = Err ->
|
||||||
|
report_socket_error(Reason, EndPoint, Module),
|
||||||
|
proc_lib:init_ack(Err)
|
||||||
end;
|
end;
|
||||||
{error, Reason} = Err ->
|
{error, Reason} = Err ->
|
||||||
report_socket_error(Reason, EndPoint, Module),
|
report_socket_error(Reason, EndPoint, Module),
|
||||||
proc_lib:init_ack(Err)
|
proc_lib:init_ack(Err)
|
||||||
end;
|
end;
|
||||||
init({_, _, tcp} = EndPoint, Module, Opts, SockOpts) ->
|
init({Port, _, tcp} = EndPoint, Module, Opts, SockOpts) ->
|
||||||
case listen_tcp(EndPoint, Module, SockOpts) of
|
case listen_tcp(Port, SockOpts) of
|
||||||
{ok, ListenSocket} ->
|
{ok, ListenSocket} ->
|
||||||
proc_lib:init_ack({ok, self()}),
|
case inet:sockname(ListenSocket) of
|
||||||
application:ensure_started(ejabberd),
|
{ok, {Addr, Port1}} ->
|
||||||
Sup = start_module_sup(Module, Opts),
|
proc_lib:init_ack({ok, self()}),
|
||||||
?INFO_MSG("Start accepting TCP connections at ~s for ~p",
|
application:ensure_started(ejabberd),
|
||||||
[format_endpoint(EndPoint), Module]),
|
Sup = start_module_sup(Module, Opts),
|
||||||
case erlang:function_exported(Module, tcp_init, 2) of
|
?INFO_MSG("Start accepting TCP connections at ~s for ~p",
|
||||||
false ->
|
[format_endpoint({Port1, Addr, tcp}), Module]),
|
||||||
accept(ListenSocket, Module, Opts, Sup);
|
case erlang:function_exported(Module, tcp_init, 2) of
|
||||||
true ->
|
false ->
|
||||||
case catch Module:tcp_init(ListenSocket, Opts) of
|
|
||||||
{'EXIT', _} = Err ->
|
|
||||||
?ERROR_MSG("failed to process callback function "
|
|
||||||
"~p:~s(~p, ~p): ~p",
|
|
||||||
[Module, tcp_init, ListenSocket, Opts, Err]),
|
|
||||||
accept(ListenSocket, Module, Opts, Sup);
|
accept(ListenSocket, Module, Opts, Sup);
|
||||||
NewOpts ->
|
true ->
|
||||||
accept(ListenSocket, Module, NewOpts, Sup)
|
case catch Module:tcp_init(ListenSocket, Opts) of
|
||||||
end
|
{'EXIT', _} = Err ->
|
||||||
|
?ERROR_MSG("failed to process callback function "
|
||||||
|
"~p:~s(~p, ~p): ~p",
|
||||||
|
[Module, tcp_init, ListenSocket, Opts, Err]),
|
||||||
|
accept(ListenSocket, Module, Opts, Sup);
|
||||||
|
NewOpts ->
|
||||||
|
accept(ListenSocket, Module, NewOpts, Sup)
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
{error, Reason} = Err ->
|
||||||
|
report_socket_error(Reason, EndPoint, Module),
|
||||||
|
Err
|
||||||
end;
|
end;
|
||||||
{error, _} = Err ->
|
{error, Reason} = Err ->
|
||||||
|
report_socket_error(Reason, EndPoint, Module),
|
||||||
proc_lib:init_ack(Err)
|
proc_lib:init_ack(Err)
|
||||||
end.
|
end.
|
||||||
|
|
||||||
-spec listen_tcp(endpoint(), module(), [gen_tcp:option()]) ->
|
-spec listen_tcp(inet:port_number(), [gen_tcp:option()]) ->
|
||||||
{ok, inet:socket()} | {error, system_limit | inet:posix()}.
|
{ok, inet:socket()} | {error, system_limit | inet:posix()}.
|
||||||
listen_tcp({Port, _, _} = EndPoint, Module, SockOpts) ->
|
listen_tcp(Port, SockOpts) ->
|
||||||
Res = gen_tcp:listen(Port, [binary,
|
Res = gen_tcp:listen(Port, [binary,
|
||||||
{packet, 0},
|
{packet, 0},
|
||||||
{active, false},
|
{active, false},
|
||||||
@ -167,8 +180,7 @@ listen_tcp({Port, _, _} = EndPoint, Module, SockOpts) ->
|
|||||||
case Res of
|
case Res of
|
||||||
{ok, ListenSocket} ->
|
{ok, ListenSocket} ->
|
||||||
{ok, ListenSocket};
|
{ok, ListenSocket};
|
||||||
{error, Reason} = Err ->
|
{error, _} = Err ->
|
||||||
report_socket_error(Reason, EndPoint, Module),
|
|
||||||
Err
|
Err
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
@ -115,8 +115,10 @@ code_change(_OldVsn, State, _Extra) -> {ok, State}.
|
|||||||
%%%------------------------
|
%%%------------------------
|
||||||
|
|
||||||
add_listener(Host, Opts) ->
|
add_listener(Host, Opts) ->
|
||||||
NewOpts = [{server_host, Host} | Opts],
|
{_, IP, _} = EndPoint = get_endpoint(Host),
|
||||||
ejabberd_listener:add_listener(get_endpoint(Host), mod_proxy65_stream, NewOpts).
|
Opts1 = [{server_host, Host} | Opts],
|
||||||
|
Opts2 = lists:keystore(ip, 1, Opts1, {ip, IP}),
|
||||||
|
ejabberd_listener:add_listener(EndPoint, mod_proxy65_stream, Opts2).
|
||||||
|
|
||||||
delete_listener(Host) ->
|
delete_listener(Host) ->
|
||||||
ejabberd_listener:delete_listener(get_endpoint(Host), mod_proxy65_stream).
|
ejabberd_listener:delete_listener(get_endpoint(Host), mod_proxy65_stream).
|
||||||
|
Loading…
Reference in New Issue
Block a user