File 3452-net_kernel-get_state.patch of Package erlang

From 53b170249170fdc80243301a927504f0a6748529 Mon Sep 17 00:00:00 2001
From: Sverker Eriksson <sverker@erlang.org>
Date: Tue, 21 Dec 2021 17:50:03 +0100
Subject: [PATCH 2/2] net_kernel:get_state

---
 lib/kernel/src/net_kernel.erl              | 37 ++++++++++++++++++++++
 lib/kernel/test/erl_distribution_SUITE.erl | 24 ++++++++++++--
 2 files changed, 58 insertions(+), 3 deletions(-)

diff --git a/lib/kernel/src/net_kernel.erl b/lib/kernel/src/net_kernel.erl
index f7839b07a6..8d172dbccd 100644
--- a/lib/kernel/src/net_kernel.erl
+++ b/lib/kernel/src/net_kernel.erl
@@ -71,6 +71,7 @@
 	 protocol_childspecs/0,
 	 epmd_module/0,
          is_alive/0,
+         get_state/0,
          dist_listen/0]).
 
 -export([disconnect/1, async_disconnect/1, passive_cnct/1]).
@@ -194,6 +195,18 @@ nodename() ->                  request(nodename).
 is_alive() ->
     whereis(net_kernel) =/= undefined.
 
+get_state() ->
+    case whereis(net_kernel) of
+        undefined ->
+            case retry_request_maybe(get_state) of
+                ignored ->
+                    #{started => no};
+                Reply ->
+                    Reply
+            end;
+        _ ->
+            request(get_state)
+    end.
 
 -spec stop() -> ok | {error, Reason} when
       Reason :: not_allowed | not_found.
@@ -708,6 +721,30 @@ handle_call({setopts, Node, Opts}, From, State) ->
 handle_call({getopts, Node, Opts}, From, State) ->
     opts_node(getopts, Node, Opts, From, State);
 
+
+handle_call(get_state, From, State) ->
+    Started = case State#state.supervisor of
+                  net_sup -> static;
+                  _ -> dynamic
+              end,
+    {NameType,Name} = case {persistent_term:get(net_kernel, undefined), node()} of
+                          {undefined, Node} ->
+                              {static, Node};
+                          {dynamic_node_name, nonode@nohost} ->
+                              {dynamic, undefined};
+                          {dynamic_node_name, Node} ->
+                              {dynamic, Node}
+                      end,
+    DomainType = case get(longnames) of
+                     true -> long;
+                     false -> short
+                 end,
+    Return = #{started => Started,
+               name_type => NameType,
+               name => Name,
+               domain_type => DomainType},
+    async_reply({reply, Return, State}, From);
+
 handle_call(_Msg, _From, State) ->
     {noreply, State}.
 
diff --git a/lib/kernel/test/erl_distribution_SUITE.erl b/lib/kernel/test/erl_distribution_SUITE.erl
index 238f4d3365..3442503f4e 100644
--- a/lib/kernel/test/erl_distribution_SUITE.erl
+++ b/lib/kernel/test/erl_distribution_SUITE.erl
@@ -540,21 +540,33 @@ dyn_node_name(Config) when is_list(Config) ->
     dyn_node_name("", Config).
 
 dyn_node_name(DCfg, _Config) ->
+    DomainType = case net_kernel:get_state() of
+                     #{domain_type := short} -> "short";
+                     #{domain_type := long} -> "long"
+                 end,
     {_N1F,Port1} = start_node_unconnected(DCfg ++ " -dist_listen false",
                                           undefined, ?MODULE, run_remote_test,
-                                          ["dyn_node_name_do", atom_to_list(node())]),
+                                          ["dyn_node_name_do", atom_to_list(node()),
+                                           DomainType]),
     0 = wait_for_port_exit(Port1),
     ok.
 
-dyn_node_name_do(TestNode, _Args) ->
+dyn_node_name_do(TestNode, [DomainTypeStr]) ->
     nonode@nohost = node(),
     [] = nodes(),
     [] = nodes(hidden),
+    DomainType = list_to_atom(DomainTypeStr),
+    #{started := static, name_type := dynamic, name := undefined,
+     domain_type := DomainType} = net_kernel:get_state(),
     net_kernel:monitor_nodes(true, [{node_type,all}]),
     net_kernel:connect_node(TestNode),
     [] = nodes(),
     [TestNode] = nodes(hidden),
     MyName = node(),
+    false = (MyName =:= undefined),
+    false = (MyName =:= nonode@nohost),
+    #{started := static, name_type := dynamic, name := MyName}
+        = net_kernel:get_state(),
     check([MyName], rpc:call(TestNode, erlang, nodes, [hidden])),
 
     {nodeup, MyName, [{node_type, visible}]} = receive_any(0),
@@ -567,11 +579,16 @@ dyn_node_name_do(TestNode, _Args) ->
     {nodedown, MyName, [{node_type, visible}]} = receive_any(1000),
 
     nonode@nohost = node(),
+    #{started := static, name_type := dynamic, name := undefined}
+        = net_kernel:get_state(),
 
     net_kernel:connect_node(TestNode),
     [] = nodes(),
     [TestNode] = nodes(hidden),
     MyName = node(),
+    #{started := static, name_type := dynamic, name := MyName}
+        = net_kernel:get_state(),
+
     check([MyName], rpc:call(TestNode, erlang, nodes, [hidden])),
 
     {nodeup, MyName, [{node_type, visible}]} = receive_any(0),
@@ -583,7 +600,8 @@ dyn_node_name_do(TestNode, _Args) ->
     [] = nodes(hidden),
     {nodedown, MyName, [{node_type, visible}]} = receive_any(1000),
     nonode@nohost = node(),
-
+    #{started := static, name_type := dynamic, name := undefined}
+        = net_kernel:get_state(),
     ok.
 
 check(X, X) -> ok.
-- 
2.34.1

openSUSE Build Service is sponsored by