diff options
Diffstat (limited to 'lib/kernel/src/gen_tcp_socket.erl')
-rw-r--r-- | lib/kernel/src/gen_tcp_socket.erl | 47 |
1 files changed, 38 insertions, 9 deletions
diff --git a/lib/kernel/src/gen_tcp_socket.erl b/lib/kernel/src/gen_tcp_socket.erl index 7f37e8414d..fb0f807cc1 100644 --- a/lib/kernel/src/gen_tcp_socket.erl +++ b/lib/kernel/src/gen_tcp_socket.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2019-2022. All Rights Reserved. +%% Copyright Ericsson AB 2019-2023. All Rights Reserved. %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. @@ -43,6 +43,7 @@ %% Undocumented or unsupported -export([unrecv/2]). -export([fdopen/2]). +-export([socket_setopts/2]). %% gen_statem callbacks @@ -728,8 +729,10 @@ socket_close(Socket) -> -compile({inline, [socket_cancel/2]}). socket_cancel(Socket, SelectInfo) -> case socket:cancel(Socket, SelectInfo) of - ok -> ok; - {error, closed} -> ok + ok -> ok; + {error, closed} -> ok; + {error, _} = ERROR -> ERROR + end. %%% ======================================================================== @@ -1009,6 +1012,7 @@ ignore_optname(Tag) -> high_msgq_watermark -> true; high_watermark -> true; low_msgq_watermark -> true; + low_watermark -> true; nopush -> true; _ -> false end. @@ -1029,7 +1033,6 @@ socket_opts() -> dontroute => {socket, dontroute}, keepalive => {socket, keepalive}, linger => {socket, linger}, - low_watermark => {socket, rcvlowat}, priority => {socket, priority}, recbuf => {socket, rcvbuf}, reuseaddr => {socket, reuseaddr}, @@ -1574,7 +1577,7 @@ handle_event( info = SelectInfo, from = From, listen_socket = ListenSocket}, {P, D}) -> - socket_cancel(ListenSocket, SelectInfo), + _ = socket_cancel(ListenSocket, SelectInfo), {next_state, 'closed', {P, D}, [{reply, From, {error, timeout}}]}; handle_event(Type, Content, #accept{} = State, P_D) -> @@ -1660,7 +1663,7 @@ handle_event( {timeout, connect}, connect, #connect{info = SelectInfo, from = From}, {#params{socket = Socket} = _P, _D} = P_D) -> - socket_cancel(Socket, SelectInfo), + _ = socket_cancel(Socket, SelectInfo), _ = socket_close(Socket), {next_state, 'closed', P_D, [{reply, From, {error, timeout}}]}; @@ -2267,11 +2270,11 @@ cleanup_close_read(P, D, State, Reason) -> case State of #accept{ info = SelectInfo, from = From, listen_socket = ListenSocket} -> - socket_cancel(ListenSocket, SelectInfo), + _ = socket_cancel(ListenSocket, SelectInfo), {D, [{reply, From, {error, Reason}}]}; #connect{info = SelectInfo, from = From} -> - socket_cancel(P#params.socket, SelectInfo), + _ = socket_cancel(P#params.socket, SelectInfo), {D, [{reply, From, {error, Reason}}]}; _ -> @@ -2282,7 +2285,7 @@ cleanup_recv(P, D, State, Reason) -> %% ?DBG({P#params.socket, State, Reason}), case State of #recv{info = SelectInfo} -> - socket_cancel(P#params.socket, SelectInfo), + _ = socket_cancel(P#params.socket, SelectInfo), cleanup_recv_reply(P, D, [], Reason); _ -> cleanup_recv_reply(P, D, [], Reason) @@ -2498,6 +2501,32 @@ tag(Packet) -> tcp end. + +%% ------- +%% Exported socket option translation +%% +socket_setopts(Socket, Opts) -> + socket_setopts( + Socket, + [Opt || + Opt <- internalize_setopts(Opts), + element(1, Opt) =/= tcp_module], + socket_opts()). +%% +socket_setopts(_Socket, [], _SocketOpts) -> + ok; +socket_setopts(Socket, [{Tag,Val} | Opts], SocketOpts) -> + case SocketOpts of + #{ Tag := Name } -> + %% Ignore all errors as an approximation for + %% inet_drv ignoring most errors + _ = socket_setopt(Socket, Name, Val), + socket_setopts(Socket, Opts, SocketOpts); + #{} -> % Ignore + socket_setopts(Socket, Opts, SocketOpts) + end. + + %% ------- %% setopts in server %% |