From 99b75396ad4d14b4e12a033ae245369b3e2c4dcd Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 22 Jul 2025 10:06:15 +0200 Subject: [PATCH] ejabberd_listener: Log error when cannot set definitive unix socket (#4422) --- src/ejabberd_listener.erl | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/ejabberd_listener.erl b/src/ejabberd_listener.erl index 05e1c1661..8a69e9124 100644 --- a/src/ejabberd_listener.erl +++ b/src/ejabberd_listener.erl @@ -113,11 +113,12 @@ init({Port, _, udp} = EndPoint, Module, Opts, SockOpts) -> {Port, SockOpts} end, ExtraOpts2 = lists:keydelete(send_timeout, 1, ExtraOpts), - case gen_udp:open(Port2, [binary, + case {gen_udp:open(Port2, [binary, {active, false}, {reuseaddr, true} | - ExtraOpts2]) of - {ok, Socket} -> + ExtraOpts2]), + set_definitive_udsocket(Port, Opts)} of + {{ok, Socket}, ok} -> set_definitive_udsocket(Port, Opts), misc:set_proc_label({?MODULE, udp, Port}), case inet:sockname(Socket) of @@ -143,14 +144,17 @@ init({Port, _, udp} = EndPoint, Module, Opts, SockOpts) -> report_socket_error(Reason, EndPoint, Module), proc_lib:init_ack(Err) end; - {error, Reason} = Err -> + {{error, Reason}, _} = Err -> + report_socket_error(Reason, EndPoint, Module), + proc_lib:init_ack(Err); + {_, {error, Reason}} = Err -> report_socket_error(Reason, EndPoint, Module), proc_lib:init_ack(Err) end; init({Port, _, tcp} = EndPoint, Module, Opts, SockOpts) -> - case listen_tcp(Port, SockOpts) of - {ok, ListenSocket} -> - set_definitive_udsocket(Port, Opts), + case {listen_tcp(Port, SockOpts), + set_definitive_udsocket(Port, Opts)} of + {{ok, ListenSocket}, ok} -> case inet:sockname(ListenSocket) of {ok, {Addr, Port1}} -> proc_lib:init_ack({ok, self()}), @@ -178,7 +182,10 @@ init({Port, _, tcp} = EndPoint, Module, Opts, SockOpts) -> report_socket_error(Reason, EndPoint, Module), proc_lib:init_ack(Err) end; - {error, Reason} = Err -> + {{error, Reason}, _} = Err -> + report_socket_error(Reason, EndPoint, Module), + proc_lib:init_ack(Err); + {_, {error, Reason}} = Err -> report_socket_error(Reason, EndPoint, Module), proc_lib:init_ack(Err) end. @@ -216,7 +223,7 @@ listen_tcp(Port, SockOpts) -> setup_provisional_udsocket_dir(DefinitivePath) -> ProvisionalPath = get_provisional_udsocket_path(DefinitivePath), - ?DEBUG("Creating a Unix Domain Socket provisional file at ~ts for the definitive path ~s", + ?INFO_MSG("Creating a Unix Domain Socket provisional file at ~ts for the definitive path ~s", [ProvisionalPath, DefinitivePath]), ProvisionalPath. @@ -233,6 +240,8 @@ get_definitive_udsocket_path(ProvisionalPath) -> {term, Path} = misc:base64_to_term(PathBase64), relative_socket_to_mnesia(Path). +-spec set_definitive_udsocket(binary(), opts()) -> ok | {error, file:posix() | badarg}. + set_definitive_udsocket(<<"unix:", Path/binary>>, Opts) -> Prov = get_provisional_udsocket_path(Path), Usd = maps:get(unix_socket, Opts),