%% Copyright (c) 2019 EMQ Technologies Co., Ltd. All Rights Reserved. %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. -module(esockd_net). -include_lib("kernel/include/inet.hrl"). -export([hostname/1, hostname/0]). -export([format/2, format/1]). -export([ntoa/1, ntoab/1]). hostname({0,0,0,0}) -> hostname(); hostname({0,0,0,0,0,0,0,0}) -> hostname(); hostname(IPAddress) -> case inet:gethostbyaddr(IPAddress) of {ok, #hostent{h_name = Name}} -> Name; {error, _Reason} -> ntoa(IPAddress) end. hostname() -> {ok, Hostname} = inet:gethostname(), case inet:gethostbyname(Hostname) of {ok, #hostent{h_name = Name}} -> Name; {error, _Reason} -> Hostname end. format(sockname, Sockname) -> format(Sockname); format(peername, Peername) -> format(Peername). format({Addr, Port}) -> lists:flatten(io_lib:format("~s:~p", [maybe_ntoab(Addr), Port])). maybe_ntoab(Addr) when is_tuple(Addr) -> ntoab(Addr); maybe_ntoab(Host) -> Host. ntoa({0,0,0,0,0,16#ffff,AB,CD}) -> inet_parse:ntoa({AB bsr 8, AB rem 256, CD bsr 8, CD rem 256}); ntoa(IP) -> inet_parse:ntoa(IP). ntoab(IP) -> Str = ntoa(IP), case string:str(Str, ":") of 0 -> Str; _ -> "[" ++ Str ++ "]" end.