summaryrefslogtreecommitdiff
path: root/lib/kernel/src/gen_tcp_socket.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/kernel/src/gen_tcp_socket.erl')
-rw-r--r--lib/kernel/src/gen_tcp_socket.erl47
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
%%