diff options
-rw-r--r-- | lib/kernel/src/net.erl | 56 |
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 %% |