diff options
author | Micael Karlberg <bmk@erlang.org> | 2022-03-02 19:01:54 +0100 |
---|---|---|
committer | Micael Karlberg <bmk@erlang.org> | 2022-03-24 12:47:23 +0100 |
commit | 2770009e8438be2323834a94b1b87d8dd6bfde69 (patch) | |
tree | db8f8cd76cd5af01cbdbc0c123c0394175251782 /lib/kernel/src/net.erl | |
parent | c0c27bd3bdf56a7c8e79e7b9c70267df85897dc4 (diff) | |
download | erlang-2770009e8438be2323834a94b1b87d8dd6bfde69.tar.gz |
[kernel|net] Windows versions of if_name2index and if_index2name
OTP-16464
Diffstat (limited to 'lib/kernel/src/net.erl')
-rw-r--r-- | lib/kernel/src/net.erl | 67 |
1 files changed, 64 insertions, 3 deletions
diff --git a/lib/kernel/src/net.erl b/lib/kernel/src/net.erl index 707c0bd023..5bc7aad40f 100644 --- a/lib/kernel/src/net.erl +++ b/lib/kernel/src/net.erl @@ -440,8 +440,20 @@ getifaddrs_filter_flags(FilterFlags, Flags) -> Reason :: term(). -ifdef(USE_ESOCK). -if_name2index(If) when is_list(If) -> - prim_net:if_name2index(If). +if_name2index(Name) when is_list(Name) -> + try prim_net:if_name2index(Name) of + Result -> + Result + catch + error : notsup : Stack -> + %% This is *most likely* Windows, so try that. + %% If not (another catch), raise the original catched error. + try win_gaa_name2index(Name) + catch + _:_:_ -> + erlang:raise(error, notsup, Stack) + end + end. -else. if_name2index(If) when is_list(If) -> erlang:error(notsup). @@ -463,7 +475,19 @@ if_name2index(If) when is_list(If) -> -ifdef(USE_ESOCK). if_index2name(Idx) when is_integer(Idx) -> - prim_net:if_index2name(Idx). + try prim_net:if_index2name(Idx) of + Result -> + Result + catch + error : notsup : Stack -> + %% This is *most likely* Windows, so try that. + %% If not (another catch), raise the original catched error. + try win_gaa_index2name(Idx) + catch + _:_:_ -> + erlang:raise(error, notsup, Stack) + end + end. -else. if_index2name(Idx) when is_integer(Idx) -> erlang:error(notsup). @@ -504,6 +528,8 @@ if_names() -> -endif. +%% -- Windows specific functions: + win_gaa_names() -> %% Flags = prim_net:get_adapters_addresses_flags_default(), %% Flags2 = Flags#{skip_unicast => true, @@ -517,3 +543,38 @@ win_gaa_names() -> {error, _} = ERROR -> ERROR end. + + +win_gaa_index2name(Idx) -> + case win_gaa_names() of + {ok, Names} -> + win_gaa_index2name(Idx, Names); + {error, _} = ERROR -> + ERROR + end. + +win_gaa_index2name(Idx, Names) -> + case lists:keysearch(Idx, 1, Names) of + {value, {Idx, Name}} -> + {ok, Name}; + false -> + {error, enxio} + end. + + +win_gaa_name2index(Name) -> + case win_gaa_names() of + {ok, Names} -> + win_gaa_name2index(Name, Names); + {error, _} = ERROR -> + ERROR + end. + +win_gaa_name2index(Name, Names) -> + case lists:keysearch(Name, 2, Names) of + {value, {Idx, Name}} -> + {ok, Idx}; + false -> + {error, enodev} + end. + |