851
862
%% gethostbyname with option search
853
gethostbyname_tm(Name, Type, Timer, [dns | Opts]) ->
854
Res = inet_res:gethostbyname_tm(Name, Type, Timer),
857
{error,timeout} -> Res;
858
{error,formerr} -> {error,einval};
859
{error,_} -> gethostbyname_tm(Name,Type,Timer,Opts)
861
gethostbyname_tm(Name, Type, Timer, [file | Opts]) ->
862
case inet_hosts:gethostbyname(Name, Type) of
863
{error,formerr} -> {error,einval};
864
{error,_} -> gethostbyname_tm(Name,Type,Timer,Opts);
867
gethostbyname_tm(Name, Type, Timer, [yp | Opts]) ->
868
gethostbyname_tm_native(Name, Type, Timer, Opts);
869
gethostbyname_tm(Name, Type, Timer, [nis | Opts]) ->
870
gethostbyname_tm_native(Name, Type, Timer, Opts);
871
gethostbyname_tm(Name, Type, Timer, [nisplus | Opts]) ->
872
gethostbyname_tm_native(Name, Type, Timer, Opts);
873
gethostbyname_tm(Name, Type, Timer, [wins | Opts]) ->
874
gethostbyname_tm_native(Name, Type, Timer, Opts);
875
gethostbyname_tm(Name, Type, Timer, [native | Opts]) ->
876
gethostbyname_tm_native(Name, Type, Timer, Opts);
877
gethostbyname_tm(_, _, _, [no_default|_]) ->
878
%% If the native resolver has failed, we should not bother
879
%% to try to be smarter and parse the IP address here.
881
gethostbyname_tm(Name, Type, Timer, [_ | Opts]) ->
864
gethostbyname_tm(Name, Type, Timer, [string|_]=Opts) ->
865
Result = gethostbyname_string(Name, Type),
866
gethostbyname_tm(Name, Type, Timer, Opts, Result);
867
gethostbyname_tm(Name, Type, Timer, [dns|_]=Opts) ->
868
Result = inet_res:gethostbyname_tm(Name, Type, Timer),
869
gethostbyname_tm(Name, Type, Timer, Opts, Result);
870
gethostbyname_tm(Name, Type, Timer, [file|_]=Opts) ->
871
Result = inet_hosts:gethostbyname(Name, Type),
872
gethostbyname_tm(Name, Type, Timer, Opts, Result);
873
gethostbyname_tm(Name, Type, Timer, [yp|_]=Opts) ->
874
gethostbyname_tm_native(Name, Type, Timer, Opts);
875
gethostbyname_tm(Name, Type, Timer, [nis|_]=Opts) ->
876
gethostbyname_tm_native(Name, Type, Timer, Opts);
877
gethostbyname_tm(Name, Type, Timer, [nisplus|_]=Opts) ->
878
gethostbyname_tm_native(Name, Type, Timer, Opts);
879
gethostbyname_tm(Name, Type, Timer, [wins|_]=Opts) ->
880
gethostbyname_tm_native(Name, Type, Timer, Opts);
881
gethostbyname_tm(Name, Type, Timer, [native|_]=Opts) ->
882
gethostbyname_tm_native(Name, Type, Timer, Opts);
883
gethostbyname_tm(Name, Type, Timer, [_|_]=Opts) ->
882
884
gethostbyname_tm(Name, Type, Timer, Opts);
883
%% Last resort - parse the hostname as address
884
gethostbyname_tm(Name, inet, _Timer, []) ->
885
case inet_parse:ipv4_address(Name) of
887
{ok,make_hostent(Name, [IP4], [], inet)};
889
gethostbyname_self(Name)
891
gethostbyname_tm(Name, inet6, _Timer, []) ->
892
case inet_parse:ipv6_address(Name) of
894
{ok,make_hostent(Name, [IP6], [], inet6)};
896
%% Even if Name is a valid IPv4 address, we can't
897
%% assume it's correct to return it on a IPv6
898
%% format ( {0,0,0,0,0,16#ffff,?u16(A,B),?u16(C,D)} ).
899
%% This host might not support IPv6.
900
gethostbyname_self(Name)
885
%% Make sure we always can look up our own hostname.
886
gethostbyname_tm(Name, Type, Timer, []) ->
887
Result = gethostbyname_self(Name, Type),
888
gethostbyname_tm(Name, Type, Timer, [], Result).
890
gethostbyname_tm(Name, Type, Timer, Opts, Result) ->
896
{error,_} when Opts =:= [] ->
899
gethostbyname_tm(Name, Type, Timer, tl(Opts))
903
902
gethostbyname_tm_native(Name, Type, Timer, Opts) ->
904
903
%% Fixme: add (global) timeout to gethost_native
905
case inet_gethost_native:gethostbyname(Name, Type) of
906
{error,formerr} -> {error,einval};
907
{error,timeout} -> {error,timeout};
908
{error,_} -> gethostbyname_tm(Name, Type, Timer, Opts++[no_default]);
912
%% Make sure we always can look up our own hostname.
913
gethostbyname_self(Name) ->
914
Type = case inet_db:res_option(inet6) of
904
Result = inet_gethost_native:gethostbyname(Name, Type),
905
gethostbyname_tm(Name, Type, Timer, Opts, Result).
909
gethostbyname_self(Name, Type) when is_atom(Name) ->
910
gethostbyname_self(atom_to_list(Name), Type);
911
gethostbyname_self(Name, Type)
912
when is_list(Name), Type =:= inet;
913
is_list(Name), Type =:= inet6 ->
918
914
case inet_db:gethostname() of
920
{ok,make_hostent(Name, [translate_ip(loopback, Type)],
916
{ok,make_hostent(Name,
917
[translate_ip(loopback, Type)],
923
920
case inet_db:res_option(domain) of
924
921
"" -> {error,nxdomain};