summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMicael Karlberg <bmk@erlang.org>2019-11-19 11:57:07 +0100
committerMicael Karlberg <bmk@erlang.org>2019-11-25 18:28:27 +0100
commitd1c6ba0ab9e9379cf5e3aa058e6b9893d0d06307 (patch)
treecfb6a221c13991b03091c728a5068384fa63af5b
parent0e70e47ddc56c3dfe7a277b27008fde6ab3a3dd0 (diff)
downloaderlang-d1c6ba0ab9e9379cf5e3aa058e6b9893d0d06307.tar.gz
[enet] Add getifaddrs to the net module
Add getifaddrs to the net module. OTP-16212
-rw-r--r--lib/kernel/src/net.erl56
1 files changed, 56 insertions, 0 deletions
diff --git a/lib/kernel/src/net.erl b/lib/kernel/src/net.erl
index 2c090e7631..e2ccbdc9c5 100644
--- a/lib/kernel/src/net.erl
+++ b/lib/kernel/src/net.erl
@@ -37,6 +37,7 @@
gethostname/0,
getnameinfo/1, getnameinfo/2,
getaddrinfo/1, getaddrinfo/2,
+ getifaddrs/0, getifaddrs/1,
if_name2index/1,
if_index2name/1,
@@ -54,8 +55,12 @@
%% Should we define these here or refer to the prim_net module
-export_type([
address_info/0,
+ ifaddrs/0,
name_info/0,
+ ifaddrs_flag/0,
+ ifaddrs_flags/0,
+
name_info_flags/0,
name_info_flag/0,
name_info_flag_ext/0,
@@ -73,6 +78,22 @@
-deprecated({sleep, 1, eventually}).
+-type ifaddrs_flag() :: up | broadcast | debug | loopback | pointopoint |
+ notrailers | running | noarp | promisc | master | slave |
+ multicast | portsel | automedia | dynamic.
+-type ifaddrs_flags() :: [ifaddrs_flag()].
+
+%% Note that not all of these fields are mandatory.
+%% Actually there are (error) cases when only the name will be included.
+%% And broadaddr and dstaddr are mutually exclusive!
+
+-type ifaddrs() :: #{name := string(),
+ flags := ifaddrs_flags(),
+ addr := socket:sockaddr(),
+ netmask := socket:sockaddr(),
+ broadaddr := socket:sockaddr(),
+ dstaddr := socket:sockaddr()}.
+
-type name_info_flags() :: [name_info_flag()|name_info_flag_ext()].
-type name_info_flag() :: namereqd |
dgram |
@@ -257,6 +278,41 @@ getaddrinfo(Host, Service)
%% ===========================================================================
%%
+%% getifaddrs - Get interface addresses
+%%
+
+-spec getifaddrs() -> {ok, IfAddrs} | {error, Reason} when
+ IfAddrs :: [ifaddrs()],
+ Reason :: term().
+
+-ifdef(USE_ESOCK).
+getifaddrs() ->
+ prim_net:getifaddrs(#{}).
+-else.
+getifaddrs() ->
+ erlang:error(notsup).
+-endif.
+
+
+-spec getifaddrs(Namespace) -> {ok, IfAddrs} | {error, Reason} when
+ Namespace :: file:filename_all(),
+ IfAddrs :: [ifaddrs()],
+ Reason :: term().
+
+-ifdef(USE_ESOCK).
+getifaddrs(Namespace) when is_list(Namespace) ->
+ prim_net:getifaddrs(#{netns => Namespace}).
+-else.
+-dialyzer({nowarn_function, getifaddrs/1}).
+getifaddrs(Namespace) when is_list(Namespace) ->
+ erlang:error(notsup).
+-endif.
+
+
+
+
+%% ===========================================================================
+%%
%% if_name2index - Mappings between network interface names and indexes:
%% name -> idx
%%