From 9765f305e1f55f758a683bd95665fd0ab84a52c3 Mon Sep 17 00:00:00 2001 From: juhlig Date: Mon, 20 Apr 2020 17:03:17 +0200 Subject: Delete local socket file when a listener closes --- src/ranch.erl | 5 ++++- src/ranch_ssl.erl | 23 ++++++++++++++--------- src/ranch_tcp.erl | 23 ++++++++++++++--------- src/ranch_transport.erl | 1 + 4 files changed, 33 insertions(+), 19 deletions(-) (limited to 'src') diff --git a/src/ranch.erl b/src/ranch.erl index a400798..7a03ef2 100644 --- a/src/ranch.erl +++ b/src/ranch.erl @@ -155,10 +155,13 @@ start_error(_, Error) -> Error. -spec stop_listener(ref()) -> ok | {error, not_found}. stop_listener(Ref) -> + [_, Transport, _, _, _] = ranch_server:get_listener_start_args(Ref), + TransOpts = get_transport_options(Ref), case supervisor:terminate_child(ranch_sup, {ranch_listener_sup, Ref}) of ok -> _ = supervisor:delete_child(ranch_sup, {ranch_listener_sup, Ref}), - ranch_server:cleanup_listener_opts(Ref); + ranch_server:cleanup_listener_opts(Ref), + Transport:cleanup(TransOpts); {error, Reason} -> {error, Reason} end. diff --git a/src/ranch_ssl.erl b/src/ranch_ssl.erl index cc51012..2c35c97 100644 --- a/src/ranch_ssl.erl +++ b/src/ranch_ssl.erl @@ -43,6 +43,7 @@ -export([sockname/1]). -export([shutdown/2]). -export([close/1]). +-export([cleanup/1]). -type ssl_opt() :: {alpn_preferred_protocols, [binary()]} | {beast_mitigation, one_n_minus_one | zero_n | disabled} @@ -107,6 +108,7 @@ messages() -> {ssl, ssl_closed, ssl_error, ssl_passive}. -spec listen(ranch:transport_opts(opts())) -> {ok, ssl:sslsocket()} | {error, atom()}. listen(TransOpts) -> + ok = cleanup(TransOpts), SocketOpts = maps:get(socket_opts, TransOpts, []), case lists:keymember(cert, 1, SocketOpts) orelse lists:keymember(certfile, 1, SocketOpts) @@ -124,15 +126,6 @@ do_listen(SocketOpts0, Logger) -> SocketOpts2 = ranch:set_option_default(SocketOpts1, nodelay, true), SocketOpts3 = ranch:set_option_default(SocketOpts2, send_timeout, 30000), SocketOpts = ranch:set_option_default(SocketOpts3, send_timeout_close, true), - %% In case of a local socket, we remove the socket file first. - %% It is possible to have multiple ip tuples in the socket options, - %% and the last one will be used (undocumented). - _ = case lists:keyfind(ip, 1, lists:reverse(SocketOpts0)) of - {ip, {local, SockFile}} -> - file:delete(SockFile); - _ -> - ok - end, %% We set the port to 0 because it is given in the Opts directly. %% The port in the options takes precedence over the one in the %% first argument. @@ -287,3 +280,15 @@ shutdown(Socket, How) -> -spec close(ssl:sslsocket()) -> ok. close(Socket) -> ssl:close(Socket). + +-spec cleanup(ranch:transport_opts(opts())) -> ok. +cleanup(#{socket_opts:=SocketOpts}) -> + case lists:keyfind(ip, 1, lists:reverse(SocketOpts)) of + {ip, {local, SockFile}} -> + _ = file:delete(SockFile), + ok; + _ -> + ok + end; +cleanup(_) -> + ok. diff --git a/src/ranch_tcp.erl b/src/ranch_tcp.erl index 4abd088..28d221c 100644 --- a/src/ranch_tcp.erl +++ b/src/ranch_tcp.erl @@ -43,6 +43,7 @@ -export([sockname/1]). -export([shutdown/2]). -export([close/1]). +-export([cleanup/1]). -type opt() :: {backlog, non_neg_integer()} | {buffer, non_neg_integer()} @@ -86,21 +87,13 @@ messages() -> {tcp, tcp_closed, tcp_error, tcp_passive}. -spec listen(ranch:transport_opts(opts())) -> {ok, inet:socket()} | {error, atom()}. listen(TransOpts) -> + ok = cleanup(TransOpts), Logger = maps:get(logger, TransOpts, logger), SocketOpts0 = maps:get(socket_opts, TransOpts, []), SocketOpts1 = ranch:set_option_default(SocketOpts0, backlog, 1024), SocketOpts2 = ranch:set_option_default(SocketOpts1, nodelay, true), SocketOpts3 = ranch:set_option_default(SocketOpts2, send_timeout, 30000), SocketOpts4 = ranch:set_option_default(SocketOpts3, send_timeout_close, true), - %% In case of a local socket, we remove the socket file first. - %% It is possible to have multiple ip tuples in the socket options, - %% and the last one will be used (undocumented). - _ = case lists:keyfind(ip, 1, lists:reverse(SocketOpts0)) of - {ip, {local, SockFile}} -> - file:delete(SockFile); - _ -> - ok - end, %% We set the port to 0 because it is given in the Opts directly. %% The port in the options takes precedence over the one in the %% first argument. @@ -271,3 +264,15 @@ shutdown(Socket, How) -> -spec close(inet:socket()) -> ok. close(Socket) -> gen_tcp:close(Socket). + +-spec cleanup(ranch:transport_opts(opts())) -> ok. +cleanup(#{socket_opts:=SocketOpts}) -> + case lists:keyfind(ip, 1, lists:reverse(SocketOpts)) of + {ip, {local, SockFile}} -> + _ = file:delete(SockFile), + ok; + _ -> + ok + end; +cleanup(_) -> + ok. diff --git a/src/ranch_transport.erl b/src/ranch_transport.erl index 5fd6242..23d9d5c 100644 --- a/src/ranch_transport.erl +++ b/src/ranch_transport.erl @@ -66,6 +66,7 @@ -callback shutdown(socket(), read | write | read_write) -> ok | {error, atom()}. -callback close(socket()) -> ok. +-callback cleanup(ranch:transport_opts(any())) -> ok. %% A fallback for transports that don't have a native sendfile implementation. %% Note that the ordering of arguments is different from file:sendfile/5 and -- cgit v1.2.3