File 4474-kernel-Add-inet_sockopt_SUITE-windows_reuseaddr.patch of Package erlang
From 0f2fc929d7667ef84a73ab98ca9054372ff2a662 Mon Sep 17 00:00:00 2001
From: Rickard Green <rickard@erlang.org>
Date: Tue, 28 Feb 2023 17:53:39 +0100
Subject: [PATCH 4/4] [kernel] Add inet_sockopt_SUITE:windows_reuseaddr
---
lib/kernel/test/inet_sockopt_SUITE.erl | 55 +++++++++++++++++++++++++-
1 file changed, 53 insertions(+), 2 deletions(-)
diff --git a/lib/kernel/test/inet_sockopt_SUITE.erl b/lib/kernel/test/inet_sockopt_SUITE.erl
index 139e7d7b92..5c95781066 100644
--- a/lib/kernel/test/inet_sockopt_SUITE.erl
+++ b/lib/kernel/test/inet_sockopt_SUITE.erl
@@ -59,7 +59,7 @@
large_raw/1,large_raw_getbin/1,combined/1,combined_getbin/1,
ipv6_v6only_udp/1, ipv6_v6only_tcp/1, ipv6_v6only_sctp/1,
use_ipv6_v6only_udp/1,
- type_errors/1]).
+ type_errors/1, windows_reuseaddr/1]).
-export([init_per_testcase/2, end_per_testcase/2]).
@@ -75,7 +75,7 @@ all() ->
large_raw_getbin, combined, combined_getbin,
ipv6_v6only_udp, ipv6_v6only_tcp, ipv6_v6only_sctp,
use_ipv6_v6only_udp,
- type_errors].
+ type_errors, windows_reuseaddr].
groups() ->
[].
@@ -805,6 +805,57 @@ type_errors(Config) when is_list(Config) ->
gen_tcp:close(Sock2),
ok.
+windows_reuseaddr(Config) when is_list(Config) ->
+ %% Check that emulation of reuseaddr and reuseport on Windows
+ %% works as expected. That is, only set SO_REUSEADDR if both
+ %% reuseaddr and reuseport are set.
+ case os:type() of
+ {win32, _} ->
+ Port = start_helper(Config),
+ Def = {ask_helper(Port,?C_GET_SOL_SOCKET),
+ ask_helper(Port,?C_GET_SO_REUSEADDR)},
+ stop_helper(Port),
+ {false, false} = windows_reuseaddr_test(Def,
+ [{reuseaddr,false},{reuseport,false}],
+ [{reuseaddr,false},{reuseport,false}]),
+ {false, false} = windows_reuseaddr_test(Def,
+ [{reuseaddr,true},{reuseport,false}],
+ [{reuseaddr,true},{reuseport,false}]),
+ {false, false} = windows_reuseaddr_test(Def,
+ [{reuseaddr,false},{reuseport,true}],
+ [{reuseaddr,false},{reuseport,true}]),
+ {true, true} = windows_reuseaddr_test(Def,
+ [{reuseaddr,true},{reuseport,true}],
+ [{reuseaddr,true},{reuseport,true}]),
+ ok;
+ _ ->
+ {skipped, "Test for Windows only"}
+ end.
+
+windows_reuseaddr_test({SolSocket, SoReuseaddr}, LOpts, COpts) ->
+ OptNames = fun (Opts) ->
+ lists:map(fun ({Name,_}) -> Name end, Opts)
+ end,
+ {L,A,C} = create_socketpair_init(LOpts, COpts),
+ {ok, LOpts} = inet:getopts(L, OptNames(LOpts)),
+ {ok, COpts} = inet:getopts(L, OptNames(COpts)),
+ RawOpts = [{raw, SolSocket, SoReuseaddr, 4}],
+ {ok,[{raw,SolSocket,SoReuseaddr,LRes}]} = inet:getopts(L, RawOpts),
+ LReuseaddr = case nintbin2int(LRes) of
+ 0 -> false;
+ _ -> true
+ end,
+ {ok,[{raw,SolSocket,SoReuseaddr,CRes}]} = inet:getopts(L, RawOpts),
+ CReuseaddr = case nintbin2int(CRes) of
+ 0 -> false;
+ _ -> true
+ end,
+ gen_tcp:close(L),
+ gen_tcp:close(A),
+ gen_tcp:close(C),
+ {LReuseaddr, CReuseaddr}.
+
+
all_ok([]) ->
true;
all_ok([H|T]) when H >= 0 ->
--
2.35.3