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_ssl.erl | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) (limited to 'src/ranch_ssl.erl') 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. -- cgit v1.2.3